From 73f4d6eba58ffb0bf1f1715ad355d258e868cea3 Mon Sep 17 00:00:00 2001 From: devhaozi Date: Fri, 23 Aug 2024 06:51:52 +0000 Subject: [PATCH 01/36] docs: Update CHANGELOG --- CHANGELOG.md | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index dfc8b8d..0f07db0 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -2,6 +2,13 @@ All notable changes to `WP-China-Yes` will be documented in this file. +## v3.6.4 - 2024-08-23 + +1. WP-CLI 下不运行 adminCDN 部分,防止影响缓冲区。 +2. 部分文案调整支持多语言。 + +**Full Changelog**: https://github.com/WenPai-org/wp-china-yes/compare/v3.6.3...v3.6.4 + ## v3.6.3 - 2024-08-23 1. 为自动监控功能添加开关 From 7f1b9a5672c4c0ca0093359aee7f777e8928d4ea Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E8=80=97=E5=AD=90?= Date: Fri, 23 Aug 2024 15:34:45 +0800 Subject: [PATCH 02/36] =?UTF-8?q?fix:=20cli=E5=88=A4=E6=96=AD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Service/Super.php | 18 +++++++++--------- wp-china-yes.php | 4 ++-- 2 files changed, 11 insertions(+), 11 deletions(-) diff --git a/Service/Super.php b/Service/Super.php index 38518cf..5506a35 100644 --- a/Service/Super.php +++ b/Service/Super.php @@ -147,7 +147,7 @@ class Super { global $concatenate_scripts; $concatenate_scripts = false; - $this->page_str_replace( 'preg_replace', [ + $this->page_str_replace( 'init', 'preg_replace', [ '~' . home_url( '/' ) . '(wp-admin|wp-includes)/(css|js)/~', sprintf( 'https://wpstatic.admincdn.com/%s/$1/$2/', $GLOBALS['wp_version'] ) ] ); @@ -159,7 +159,7 @@ class Super { * 前台静态加速 */ if ( ! empty( $this->settings['admincdn']['frontend'] ) ) { - $this->page_str_replace( 'preg_replace', [ + $this->page_str_replace( 'template_redirect', 'preg_replace', [ '#(?<=[(\"\'])(?:' . quotemeta( home_url() ) . ')?/(?:((?:wp-content|wp-includes)[^\"\')]+\.(css|js)[^\"\')]+))(?=[\"\')])#', 'https://public.admincdn.com/$0' ] ); @@ -169,7 +169,7 @@ class Super { * Google 字体替换 */ if ( ! empty( $this->settings['admincdn']['googlefonts'] ) ) { - $this->page_str_replace( 'str_replace', [ + $this->page_str_replace( 'init', 'str_replace', [ 'fonts.googleapis.com', 'googlefonts.admincdn.com' ] ); @@ -179,7 +179,7 @@ class Super { * Google 前端公共库替换 */ if ( ! empty( $this->settings['admincdn']['googleajax'] ) ) { - $this->page_str_replace( 'str_replace', [ + $this->page_str_replace( 'init', 'str_replace', [ 'ajax.googleapis.com', 'googleajax.admincdn.com' ] ); @@ -189,7 +189,7 @@ class Super { * CDNJS 前端公共库替换 */ if ( ! empty( $this->settings['admincdn']['cdnjs'] ) ) { - $this->page_str_replace( 'str_replace', [ + $this->page_str_replace( 'init', 'str_replace', [ 'cdnjs.cloudflare.com/ajax/libs', 'cdnjs.admincdn.com' ] ); @@ -199,7 +199,7 @@ class Super { * jsDelivr 前端公共库替换 */ if ( ! empty( $this->settings['admincdn']['jsdelivr'] ) ) { - $this->page_str_replace( 'str_replace', [ + $this->page_str_replace( 'init', 'str_replace', [ 'cdn.jsdelivr.net', 'jsd.admincdn.com' ] ); @@ -330,12 +330,12 @@ class Super { * @param $replace_func string 要调用的字符串关键字替换函数 * @param $param array 传递给字符串替换函数的参数 */ - private function page_str_replace( $replace_func, $param ) { + private function page_str_replace( $hook, $replace_func, $param ) { // CLI 下返回,防止影响缓冲区 - if ( class_exists( 'WP_CLI' ) ) { + if ( php_sapi_name() == 'cli' ) { return; } - add_action( 'template_redirect', function () use ( $replace_func, $param ) { + add_action( $hook, function () use ( $replace_func, $param ) { ob_start( function ( $buffer ) use ( $replace_func, $param ) { $param[] = $buffer; diff --git a/wp-china-yes.php b/wp-china-yes.php index be3c2fe..1fe9762 100644 --- a/wp-china-yes.php +++ b/wp-china-yes.php @@ -4,7 +4,7 @@ * Description: 文派叶子 🍃(WP-China-Yes)是中国 WordPress 生态基础设施软件,犹如落叶新芽,生生不息。 * Author: 文派开源 * Author URI: https://wp-china-yes.com - * Version: 3.6.4 + * Version: 3.6.5 * License: GPLv3 or later * Text Domain: wp-china-yes * Domain Path: /languages @@ -19,7 +19,7 @@ namespace WenPai\ChinaYes; defined( 'ABSPATH' ) || exit; -define( 'CHINA_YES_VERSION', '3.6.4' ); +define( 'CHINA_YES_VERSION', '3.6.5' ); define( 'CHINA_YES_PLUGIN_FILE', __FILE__ ); define( 'CHINA_YES_PLUGIN_URL', plugin_dir_url( CHINA_YES_PLUGIN_FILE ) ); define( 'CHINA_YES_PLUGIN_PATH', plugin_dir_path( CHINA_YES_PLUGIN_FILE ) ); From dd912a9e31cb89d221eb4a37cf0ac7e5047278a0 Mon Sep 17 00:00:00 2001 From: devhaozi Date: Fri, 23 Aug 2024 07:36:09 +0000 Subject: [PATCH 03/36] docs: Update CHANGELOG --- CHANGELOG.md | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index 0f07db0..1d10811 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -2,6 +2,13 @@ All notable changes to `WP-China-Yes` will be documented in this file. +## v3.6.5 - 2024-08-23 + +1. 优化 CLI 判断 +2. 回退替换钩子修改 + +**Full Changelog**: https://github.com/WenPai-org/wp-china-yes/compare/v3.6.4...v3.6.5 + ## v3.6.4 - 2024-08-23 1. WP-CLI 下不运行 adminCDN 部分,防止影响缓冲区。 From 2391c18baebb36ef6333f63159ed83572177b13d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E8=80=97=E5=AD=90?= Date: Mon, 23 Sep 2024 20:15:18 +0800 Subject: [PATCH 04/36] feat: v3.7.0 --- Service/Monitor.php | 26 +- Service/Setting.php | 488 +++-- Service/Super.php | 101 +- assets/css/setting.css | 241 +-- composer.json | 4 +- composer.lock | 46 +- framework/assets/css/style-rtl.min.css | 1 + framework/assets/css/style.min.css | 1 + framework/assets/images/checkerboard.png | Bin 0 -> 2340 bytes framework/assets/images/wp-logo.svg | 1 + framework/assets/images/wp-plugin-logo.svg | 1 + framework/assets/js/main.min.js | 2 + framework/assets/js/plugins.min.js | 2 + framework/classes/abstract.class.php | 195 ++ framework/classes/admin-options.class.php | 667 +++++++ framework/classes/fields.class.php | 405 +++++ framework/classes/setup.class.php | 800 ++++++++ framework/fields/accordion/accordion.php | 64 + framework/fields/background/background.php | 340 ++++ framework/fields/backup/backup.php | 38 + framework/fields/border/border.php | 176 ++ framework/fields/button_set/button_set.php | 67 + framework/fields/callback/callback.php | 31 + framework/fields/checkbox/checkbox.php | 101 ++ framework/fields/code_editor/code_editor.php | 58 + framework/fields/color/color.php | 52 + framework/fields/color_group/color_group.php | 42 + framework/fields/content/content.php | 28 + framework/fields/date/date.php | 64 + framework/fields/datetime/datetime.php | 61 + framework/fields/dimensions/dimensions.php | 101 ++ framework/fields/fieldset/fieldset.php | 41 + framework/fields/gallery/gallery.php | 52 + framework/fields/group/group.php | 164 ++ framework/fields/heading/heading.php | 24 + framework/fields/icon/fa4-icons.php | 12 + framework/fields/icon/fa5-icons.php | 12 + framework/fields/icon/icon.php | 71 + .../fields/image_select/image_select.php | 79 + framework/fields/index.php | 1 + framework/fields/link/link.php | 82 + framework/fields/link_color/link_color.php | 91 + framework/fields/map/map.php | 98 + framework/fields/media/media.php | 96 + framework/fields/notice/notice.php | 26 + framework/fields/number/number.php | 63 + framework/fields/palette/palette.php | 58 + framework/fields/radio/radio.php | 93 + framework/fields/repeater/repeater.php | 108 ++ framework/fields/select/select.php | 132 ++ framework/fields/slider/slider.php | 78 + framework/fields/sortable/sortable.php | 87 + framework/fields/sorter/sorter.php | 76 + framework/fields/spacing/spacing.php | 171 ++ framework/fields/spinner/spinner.php | 70 + framework/fields/subheading/subheading.php | 24 + framework/fields/submessage/submessage.php | 26 + framework/fields/switcher/switcher.php | 40 + framework/fields/tabbed/tabbed.php | 64 + framework/fields/text/text.php | 30 + framework/fields/textarea/textarea.php | 58 + framework/fields/typography/google-fonts.php | 1607 +++++++++++++++++ framework/fields/typography/typography.php | 544 ++++++ framework/fields/upload/upload.php | 61 + framework/fields/wp_editor/wp_editor.php | 107 ++ framework/functions/actions.php | 190 ++ framework/functions/customize.php | 142 ++ framework/functions/helpers.php | 58 + framework/functions/sanitize.php | 29 + framework/functions/validate.php | 152 ++ framework/functions/walker.php | 28 + framework/index.php | 1 + framework/languages/zh_CN.mo | Bin 0 -> 8354 bytes framework/languages/zh_CN.po | 672 +++++++ helpers.php | 18 +- wp-china-yes.php | 4 +- 76 files changed, 9491 insertions(+), 353 deletions(-) create mode 100644 framework/assets/css/style-rtl.min.css create mode 100644 framework/assets/css/style.min.css create mode 100644 framework/assets/images/checkerboard.png create mode 100644 framework/assets/images/wp-logo.svg create mode 100644 framework/assets/images/wp-plugin-logo.svg create mode 100644 framework/assets/js/main.min.js create mode 100644 framework/assets/js/plugins.min.js create mode 100644 framework/classes/abstract.class.php create mode 100644 framework/classes/admin-options.class.php create mode 100644 framework/classes/fields.class.php create mode 100644 framework/classes/setup.class.php create mode 100644 framework/fields/accordion/accordion.php create mode 100644 framework/fields/background/background.php create mode 100644 framework/fields/backup/backup.php create mode 100644 framework/fields/border/border.php create mode 100644 framework/fields/button_set/button_set.php create mode 100644 framework/fields/callback/callback.php create mode 100644 framework/fields/checkbox/checkbox.php create mode 100644 framework/fields/code_editor/code_editor.php create mode 100644 framework/fields/color/color.php create mode 100644 framework/fields/color_group/color_group.php create mode 100644 framework/fields/content/content.php create mode 100644 framework/fields/date/date.php create mode 100644 framework/fields/datetime/datetime.php create mode 100644 framework/fields/dimensions/dimensions.php create mode 100644 framework/fields/fieldset/fieldset.php create mode 100644 framework/fields/gallery/gallery.php create mode 100644 framework/fields/group/group.php create mode 100644 framework/fields/heading/heading.php create mode 100644 framework/fields/icon/fa4-icons.php create mode 100644 framework/fields/icon/fa5-icons.php create mode 100644 framework/fields/icon/icon.php create mode 100644 framework/fields/image_select/image_select.php create mode 100644 framework/fields/index.php create mode 100644 framework/fields/link/link.php create mode 100644 framework/fields/link_color/link_color.php create mode 100644 framework/fields/map/map.php create mode 100644 framework/fields/media/media.php create mode 100644 framework/fields/notice/notice.php create mode 100644 framework/fields/number/number.php create mode 100644 framework/fields/palette/palette.php create mode 100644 framework/fields/radio/radio.php create mode 100644 framework/fields/repeater/repeater.php create mode 100644 framework/fields/select/select.php create mode 100644 framework/fields/slider/slider.php create mode 100644 framework/fields/sortable/sortable.php create mode 100644 framework/fields/sorter/sorter.php create mode 100644 framework/fields/spacing/spacing.php create mode 100644 framework/fields/spinner/spinner.php create mode 100644 framework/fields/subheading/subheading.php create mode 100644 framework/fields/submessage/submessage.php create mode 100644 framework/fields/switcher/switcher.php create mode 100644 framework/fields/tabbed/tabbed.php create mode 100644 framework/fields/text/text.php create mode 100644 framework/fields/textarea/textarea.php create mode 100644 framework/fields/typography/google-fonts.php create mode 100644 framework/fields/typography/typography.php create mode 100644 framework/fields/upload/upload.php create mode 100644 framework/fields/wp_editor/wp_editor.php create mode 100644 framework/functions/actions.php create mode 100644 framework/functions/customize.php create mode 100644 framework/functions/helpers.php create mode 100644 framework/functions/sanitize.php create mode 100644 framework/functions/validate.php create mode 100644 framework/functions/walker.php create mode 100644 framework/index.php create mode 100644 framework/languages/zh_CN.mo create mode 100644 framework/languages/zh_CN.po diff --git a/Service/Monitor.php b/Service/Monitor.php index 1f867f7..bcdecb4 100644 --- a/Service/Monitor.php +++ b/Service/Monitor.php @@ -37,7 +37,7 @@ class Monitor { * 初始化 */ public function init() { - if ( $this->settings['monitor'] != 'on' ) { + if ( $this->settings['monitor'] ) { return; } // 检查应用市场可用性 @@ -104,51 +104,51 @@ class Monitor { */ public function maybe_check_admincdn() { // 后台加速 - if ( ! empty( $this->settings['admincdn']['admin'] ) ) { + if ( in_array( 'admin', $this->settings['admincdn'] ) ) { $response = wp_remote_get( 'https://wpstatic.admincdn.com/6.4.3/wp-includes/js/wp-sanitize.min.js' ); if ( is_wp_error( $response ) || wp_remote_retrieve_response_code( $response ) != 200 ) { - unset( $this->settings['admincdn']['admin'] ); + $this->settings['admincdn'] = array_values( array_diff( $this->settings['admincdn'], [ 'admin' ] ) ); $this->update_settings(); } } // 前台加速 - if ( ! empty( $this->settings['admincdn']['frontend'] ) ) { + if ( in_array( 'frontend', $this->settings['admincdn'] ) ) { $url = network_site_url( '/wp-includes/js/wp-sanitize.min.js' ); $response = wp_remote_get( 'https://public.admincdn.com/' . $url ); if ( is_wp_error( $response ) || wp_remote_retrieve_response_code( $response ) != 200 ) { - unset( $this->settings['admincdn']['frontend'] ); + $this->settings['admincdn'] = array_values( array_diff( $this->settings['admincdn'], [ 'frontend' ] ) ); $this->update_settings(); } } // Google 字体 - if ( ! empty( $this->settings['admincdn']['googlefonts'] ) ) { + if ( in_array( 'googlefonts', $this->settings['admincdn'] ) ) { $response = wp_remote_get( 'https://googlefonts.admincdn.com/css?family=Roboto:400,700' ); if ( is_wp_error( $response ) || wp_remote_retrieve_response_code( $response ) != 200 ) { - unset( $this->settings['admincdn']['googlefonts'] ); + $this->settings['admincdn'] = array_values( array_diff( $this->settings['admincdn'], [ 'googlefonts' ] ) ); $this->update_settings(); } } // Google 前端公共库 - if ( ! empty( $this->settings['admincdn']['googleajax'] ) ) { + if ( in_array( 'googleajax', $this->settings['admincdn'] ) ) { $response = wp_remote_get( 'https://googleajax.admincdn.com/ajax/libs/jquery/3.7.1/jquery.slim.min.js' ); if ( is_wp_error( $response ) || wp_remote_retrieve_response_code( $response ) != 200 ) { - unset( $this->settings['admincdn']['googleajax'] ); + $this->settings['admincdn'] = array_values( array_diff( $this->settings['admincdn'], [ 'googleajax' ] ) ); $this->update_settings(); } } // CDNJS 前端公共库 - if ( ! empty( $this->settings['admincdn']['cdnjs'] ) ) { + if ( in_array( 'cdnjs', $this->settings['admincdn'] ) ) { $response = wp_remote_get( 'https://cdnjs.admincdn.com/jquery/3.7.1/jquery.slim.min.js' ); if ( is_wp_error( $response ) || wp_remote_retrieve_response_code( $response ) != 200 ) { - unset( $this->settings['admincdn']['cdnjs'] ); + $this->settings['admincdn'] = array_values( array_diff( $this->settings['admincdn'], [ 'cdnjs' ] ) ); $this->update_settings(); } } // jsDelivr 公共库 - if ( ! empty( $this->settings['admincdn']['jsdelivr'] ) ) { + if ( in_array( 'jsdelivr', $this->settings['admincdn'] ) ) { $response = wp_remote_get( 'https://jsd.admincdn.com/npm/jquery@3.7.1/dist/jquery.slim.min.js' ); if ( is_wp_error( $response ) || wp_remote_retrieve_response_code( $response ) != 200 ) { - unset( $this->settings['admincdn']['jsdelivr'] ); + $this->settings['admincdn'] = array_values( array_diff( $this->settings['admincdn'], [ 'jsdelivr' ] ) ); $this->update_settings(); } } diff --git a/Service/Setting.php b/Service/Setting.php index c64c782..f85ecbf 100644 --- a/Service/Setting.php +++ b/Service/Setting.php @@ -4,7 +4,8 @@ namespace WenPai\ChinaYes\Service; defined( 'ABSPATH' ) || exit; -use TheTNB\Setting\API; +use WP_CHINA_YES; +use function WenPai\ChinaYes\get_settings; /** * Class Setting @@ -12,115 +13,375 @@ use TheTNB\Setting\API; * @package WenPai\ChinaYes\Service */ class Setting { - private $setting_api; + private $prefix = 'wp_china_yes'; + private $settings; public function __construct() { - $this->setting_api = new API(); - add_action( 'admin_init', [ $this, 'admin_init' ] ); + $this->settings = get_settings(); + add_filter( 'wp_china_yes_enqueue_assets', '__return_true' ); + add_filter( 'wp_china_yes_fa4', '__return_true' ); add_action( 'admin_enqueue_scripts', [ $this, 'enqueue_admin_assets' ] ); add_action( is_multisite() ? 'network_admin_menu' : 'admin_menu', [ $this, 'admin_menu' ] ); + self::admin_init(); } /** * 挂载设置项 */ public function admin_init() { + WP_CHINA_YES::createOptions( $this->prefix, [ + 'framework_title' => sprintf( '%s v%s', $this->settings['custom_name'], CHINA_YES_VERSION ), + 'menu_hidden' => $this->settings['hide'], + 'menu_title' => $this->settings['custom_name'], + 'menu_slug' => 'wp-china-yes', + 'menu_type' => 'submenu', + 'menu_parent' => is_multisite() ? 'settings.php' : 'options-general.php', + 'show_bar_menu' => false, + 'show_sub_menu' => false, + 'show_search' => false, + 'show_reset_section' => false, + 'footer_text' => sprintf( '%s 设置', $this->settings['custom_name'] ), + 'theme' => 'light', + 'enqueue_webfont' => false, + 'async_webfont' => true, + 'database' => is_multisite() ? 'network' : '', + ] ); - $sections = [ - [ - 'id' => 'wp_china_yes', - 'title' => __( '设置', 'wp-china-yes' ) - ] - ]; - - $fields = [ - 'wp_china_yes' => [ + WP_CHINA_YES::createSection( $this->prefix, [ + 'title' => '加速设置', + 'icon' => 'fa fa-rocket', + 'fields' => [ [ - 'name' => 'store', - 'label' => __( '应用市场', 'wp-china-yes' ), - 'desc' => __( '官方加速源(WPMirror)直接从 .org 反代至大陆分发;文派开源(WenPai.org)中国境内自建托管仓库,同时集成文派翻译平台。', - 'wp-china-yes' ), - 'type' => 'radio', - 'default' => 'wenpai', - 'options' => [ + 'id' => 'store', + 'type' => 'radio', + 'title' => __( '应用市场', 'wp-china-yes' ), + 'inline' => true, + 'options' => [ 'proxy' => '官方镜像', 'wenpai' => '文派开源', 'off' => '不启用' - ] + ], + 'default' => 'wenpai', + 'subtitle' => '是否启用市场加速', + 'desc' => __( '官方加速源(WPMirror)直接从 .org 反代至大陆分发;文派开源(WenPai.org)中国境内自建托管仓库,同时集成文派翻译平台', + 'wp-china-yes' ), ], [ - 'name' => 'admincdn', - 'label' => __( '萌芽加速', 'wp-china-yes' ), - 'desc' => __( '萌芽加速(adminCDN)将 WordPress 依赖的静态文件切换为公共资源,加快网站访问速度。您可按需启用需要加速的项目,更多细节控制和功能,请关注 adminCDN 项目。', - 'wp-china-yes' ), - 'type' => 'multicheck', - 'default' => [ - 'admin' => 'admin', - ], - 'options' => [ + 'id' => 'admincdn', + 'type' => 'checkbox', + 'title' => __( '萌芽加速', 'wp-china-yes' ), + 'inline' => true, + 'options' => [ 'admin' => '后台加速', 'frontend' => '前台加速', 'googlefonts' => 'Google 字体', 'googleajax' => 'Google 前端公共库', 'cdnjs' => 'CDNJS 前端公共库', - 'jsdelivr' => 'jsDelivr 公共库', - ] + 'jsdelivr' => 'jsDelivr 公共库' + ], + 'default' => [ + 'admin' => 'admin', + ], + 'subtitle' => '是否启用萌芽加速', + 'desc' => __( '萌芽加速(adminCDN)将 WordPress 依赖的静态文件切换为公共资源,加快网站访问速度。您可按需启用需要加速的项目,更多细节控制和功能,请关注 adminCDN 项目', + 'wp-china-yes' ), ], [ - 'name' => 'cravatar', - 'label' => __( '初认头像', 'wp-china-yes' ), - 'desc' => __( '初认头像(Cravatar)Gravatar 在中国的完美替代方案,您可以在 Cravatar.com 上传头像,更多选项请安装 WPAavatar 插件。(任何开发者均可在自己的产品中集成该服务,不局限于 WordPress)', - 'wp-china-yes' ), - 'type' => 'radio', - 'default' => 'cn', - 'options' => [ + 'id' => 'cravatar', + 'type' => 'radio', + 'title' => __( '初认头像', 'wp-china-yes' ), + 'inline' => true, + 'options' => [ 'cn' => '默认线路', 'global' => '国际线路', - 'weavatar' => '备用源(WeAvatar)', + 'weavatar' => '备用源(WeAvatar.com)', 'off' => '不启用' - ] + ], + 'default' => 'cn', + 'subtitle' => '是否启用头像加速', + 'desc' => __( '初认头像(Cravatar)Gravatar 在中国的完美替代方案,您可以在 Cravatar.com 上传头像,更多选项请安装 WPAavatar 插件。(任何开发者均可在自己的产品中集成该服务,不局限于 WordPress)', + 'wp-china-yes' ), + ], + ], + ] ); + + WP_CHINA_YES::createSection( $this->prefix, [ + 'title' => '文风字体', + 'icon' => 'fa fa-font', + 'fields' => [ + [ + 'id' => 'windfonts', + 'type' => 'radio', + 'title' => __( '文风字体', 'wp-china-yes' ), + 'inline' => true, + 'options' => [ + 'on' => '全局启用', + 'frontend' => '前台启用', + 'optimize' => '本机字体', + 'off' => '不启用', + ], + 'default' => 'off', + 'subtitle' => '是否启用文风字体定制', + 'desc' => __( '文风字体(Windfonts)为您的网站增添无限活力。专为中文网页设计,旨在提升用户阅读体验和视觉享受', + 'wp-china-yes' ), ], [ - 'name' => 'windfonts', - 'label' => __( '文风字体', 'wp-china-yes' ), - 'desc' => __( '文风字体(Windfonts)为您的网页渲染中文字体并对主题、插件内的字体进行加速;优化模式可优化浏览器字体调用。', - 'wp-china-yes' ), - 'type' => 'radio', - 'default' => 'off', - 'options' => [ - 'optimize' => '优化模式', - 'off' => '不启用', - ] + 'id' => 'windfonts_list', + 'type' => 'group', + 'title' => '字体列表', + 'subtitle' => '使用的文风字体列表', + 'desc' => '支持添加多个文风字体,并配置应用元素、字体权重大小', + 'button_title' => '添加字体', + 'accordion_title_number' => true, + 'dependency' => [ + 'windfonts', + 'any', + 'on,frontend', + ], + 'fields' => [ + [ + 'id' => 'family', + 'type' => 'text', + 'title' => __( '字体家族', 'wp-china-yes' ), + 'subtitle' => '字体家族名称', + 'desc' => __( '填入从文风字体获取的字体家族名称', + 'wp-china-yes' ), + 'default' => 'wenfeng-syhtcjk', + ], + [ + 'id' => 'css', + 'type' => 'text', + 'title' => __( '字体链接', 'wp-china-yes' ), + 'subtitle' => '字体 CSS 链接', + 'desc' => __( '填入从文风字体获取的字体 CSS 链接', + 'wp-china-yes' ), + 'default' => 'https://cn.windfonts.com/wenfeng/fonts/syhtcjk/regular/web/index.css', + 'validate' => 'csf_validate_url', + ], + [ + 'id' => 'weight', + 'type' => 'number', + 'title' => __( '字体字重', 'wp-china-yes' ), + 'subtitle' => '字体字重大小', + 'desc' => __( '设置字体权重大小(字体粗细)', + 'wp-china-yes' ), + 'default' => 400, + 'attributes' => [ + 'min' => 100, + 'max' => 1000, + 'step' => 10, + ], + 'validate' => 'csf_validate_numeric', + ], + [ + 'id' => 'style', + 'type' => 'select', + 'title' => __( '字体样式', 'wp-china-yes' ), + 'subtitle' => '字体样式选择', + 'options' => [ + 'normal' => '正常', + 'italic' => '斜体', + 'oblique' => '倾斜', + ], + 'desc' => __( '设置字体样式(正常、斜体、倾斜)', + 'wp-china-yes' ), + ], + [ + 'id' => 'selector', + 'type' => 'textarea', + 'title' => __( '字体应用', 'wp-china-yes' ), + 'subtitle' => '字体应用元素', + 'desc' => __( '设置字体应用的元素(CSS 选择器)', + 'wp-china-yes' ), + 'default' => 'a,p,h1,h2,h3,h4,h5,h6,ul,ol,li,button,blockquote,pre,code,table,th,td,div:not([class*="star"]),label,b,i:not([class]),em,small,strong,sub,sup,ins,del,mark,abbr,dfn,span:not([class*="icon"])', + 'sanitize' => false, + ], + [ + 'id' => 'enable', + 'type' => 'switcher', + 'title' => __( '启用字体', 'wp-china-yes' ), + 'subtitle' => '是否启用该字体', + 'default' => true, + ], + ], ], [ - 'name' => 'adblock', - 'label' => __( '广告拦截', 'wp-china-yes' ), - 'desc' => __( '文派叶子🍃(WP-China-Yes)独家特色功能,让您拥有清爽整洁的 WordPress 后台,清除各类常用插件侵入式后台广告、通知及无用信息;启用后若存在异常拦截,请切换为手动模式,查看可优化插件列表。', - 'wp-china-yes' ), - 'type' => 'radio', - 'default' => 'off', - 'options' => [ - 'off' => '即将上线', - ] + 'type' => 'content', + 'content' => '默认适配规则跟随插件更新,插件更新后可删除字体重新添加以获取最新适配规则', ], + ], + ] ); + + WP_CHINA_YES::createSection( $this->prefix, [ + 'title' => '广告屏蔽', + 'icon' => 'fa fa-ban', + 'fields' => [ [ - 'name' => 'monitor', - 'label' => __( '自动监控', 'wp-china-yes' ), - 'desc' => __( '文派叶子🍃(WP-China-Yes)支持自动监控各加速节点可用性,当节点不可用时自动切换至可用节点或关闭加速,以保证您的网站正常访问。', - 'wp-china-yes' ), - 'type' => 'radio', - 'default' => 'on', - 'options' => [ + 'id' => 'adblock', + 'type' => 'radio', + 'title' => __( '广告屏蔽', 'wp-china-yes' ), + 'inline' => true, + 'options' => [ 'on' => '启用', 'off' => '不启用', - ] + ], + 'default' => 'off', + 'subtitle' => '是否启用后台广告屏蔽', + 'desc' => __( '文派叶子🍃(WP-China-Yes)独家特色功能,让您拥有清爽整洁的 WordPress 后台,清除各类常用插件侵入式后台广告、通知及无用信息', + 'wp-china-yes' ), ], - ] - ]; + [ + 'id' => 'adblock_rule', + 'type' => 'group', + 'title' => '规则列表', + 'subtitle' => '使用的广告屏蔽规则列表', + 'desc' => '支持添加多条广告屏蔽规则', + 'button_title' => '添加规则', + 'accordion_title_number' => true, + 'dependency' => [ + 'adblock', + 'any', + 'on', + ], + 'fields' => [ + [ + 'id' => 'name', + 'type' => 'text', + 'title' => __( '规则名称', 'wp-china-yes' ), + 'subtitle' => '自定义规则名称', + 'desc' => __( '自定义规则名称,方便识别', + 'wp-china-yes' ), + 'default' => '默认规则', + ], + [ + 'id' => 'selector', + 'type' => 'textarea', + 'title' => __( '应用元素', 'wp-china-yes' ), + 'subtitle' => '规则应用元素', + 'desc' => __( '设置规则应用的广告元素(CSS 选择器)', + 'wp-china-yes' ), + 'default' => '.wpseo_content_wrapper #sidebar-container, .yoast_premium_upsell, #wpseo-local-seo-upsell, .yoast-settings-section-upsell, #rank_math_review_plugin_notice, #bwp-get-social, .bwp-button-paypal, #bwp-sidebar-right, .tjcc-custom-css #postbox-container-1, .settings_page_wpcustomtaxfilterinadmin #postbox-container-1, #duplicate-post-notice #newsletter-subscribe-form, div[id^="dnh-wrm"], .notice-info.dst-notice, #googleanalytics_terms_notice, .fw-brz-dismiss, div.elementor-message[data-notice_id="elementor_dev_promote"], .notice-success.wpcf7r-notice, .dc-text__block.disable__comment__alert, #ws_sidebar_pro_ad, .pa-new-feature-notice, #redux-connect-message, .frash-notice-email, .frash-notice-rate, #smush-box-pro-features, #wp-smush-bulk-smush-upsell-row, #easy-updates-manager-dashnotice, #metaslider-optin-notice, #extendifysdk_announcement, .ml-discount-ad, .mo-admin-notice, .post-smtp-donation, div[data-dismissible="notice-owa-sale-forever"], .neve-notice-upsell, #pagelayer_promo, #simple-custom-post-order-epsilon-review-notice, .sfsi_new_prmium_follw, div.fs-slug-the-events-calendar[data-id="connect_account"], .tribe-notice-event-tickets-install, div.notice[data-notice="webp-converter-for-media"], .webpLoader__popup.webpPopup, .put-dismiss-notice, .wp-mail-smtp-review-notice, #wp-mail-smtp-pro-banner, body div.promotion.fs-notice, .analytify-review-thumbnail, .analytify-review-notice, .jitm-banner.is-upgrade-premium, div[data-name*="wbcr_factory_notice_adverts"], .sui-subscription-notice, #sui-cross-sell-footer, .sui-cross-sell-modules, .forminator-rating-notice, .sui-dashboard-upsell-upsell, .anwp-post-grid__rate, .cff-settings-cta, .cff-header-upgrade-notice, .cff_notice.cff_review_notice_step_1, .cff_get_pro_highlight, .aal-install-elementor, #ws_sidebar_pro_ad, .bold-timeline-lite-feedback-notice-wrapper, #elementskit-lite-go-pro-noti2ce, #elementskit-lite-_plugin_rating_msg_used_in_day, .yarpp-review-notice, #prli_review_notice, #webdados_invoicexpress_nag, #vc_license-activation-notice, .villatheme-dashboard.updated, #njt-FileBird-review, .notice[data-dismissible="pro_release_notice"], #thwvsf_review_request_notice, .wpdeveloper-review-notice, div[data-notice_type="tinvwl-user-review"], div[data-notice_type="tinvwl-user-premium"], #sg-backup-review-wrapper, .notice-wpmet-jhanda-getgenie-cross-promo, .notice-getgenie-go-pro-noti2ce, .notice-wpmet-jhanda-Summer2023, .thwcfd-review-wrapper, .woo-permalink-manager-banner, div.notice.bundle-notice, div.notice[data-dismissible="notice-owa-upgrade-forever"], .wpsm-acc-r-review-notice, .wpsm_ac_h_i, .edac-review-notice, .notice-iworks-rate, #monterinsights-admin-menu-tooltip, .monsterinsights-floating-bar, #monterinsights-admin-menu-tooltip, .exactmetrics-floating-bar, #metform-unsupported-metform-pro-version, .lwptocRate, .wpsm-tabs-b-review-notice, .quadlayers_woocommerce-direct-checkout_notice_delay, .iworks-rate-notice, #metform-_plugin_rating_msg_used_in_day, [id^="wpmet-jhanda-"], #wpmet-stories, #ti-optml-notice-helper, .menu-icon-dashboard-notice, .catch-bells-admin-notice, .wpdt-bundles-notice, .td-admin-web-services, .cf-plugin-popup, .wpzinc-review-media-library-organizer, .oxi-image-notice', + 'sanitize' => false, + ], + [ + 'id' => 'enable', + 'type' => 'switcher', + 'title' => __( '启用规则', 'wp-china-yes' ), + 'subtitle' => '是否启用该规则', + 'default' => true, + ], + ], + ], + [ + 'type' => 'content', + 'content' => '默认屏蔽规则跟随插件更新,插件更新后可删除规则重新添加以获取最新屏蔽规则', + ], + ], + ] ); - $this->setting_api->set_sections( $sections ); - $this->setting_api->set_fields( $fields ); - $this->setting_api->admin_init(); + WP_CHINA_YES::createSection( $this->prefix, [ + 'title' => '其他设置', + 'icon' => 'fa fa-cogs', + 'fields' => [ + [ + 'id' => 'monitor', + 'type' => 'switcher', + 'default' => true, + 'title' => '节点监控', + 'subtitle' => '自动监控加速节点可用性', + 'desc' => __( '文派叶子🍃(WP-China-Yes)支持自动监控各加速节点可用性,当节点不可用时自动切换至可用节点或关闭加速,以保证您的网站正常访问', + 'wp-china-yes' ), + ], + [ + 'id' => 'hide', + 'type' => 'switcher', + 'default' => false, + 'title' => '隐藏设置', + 'subtitle' => '隐藏插件设置入口', + 'desc' => __( '如果您不希望让客户知道本站启用了文派叶子🍃(WP-China-Yes)插件及服务,可开启此选项', + 'wp-china-yes' ), + ], + [ + 'id' => 'custom_name', + 'type' => 'text', + 'title' => '品牌白标', + 'subtitle' => '自定义插件显示品牌名', + 'desc' => __( '专为 WordPress 建站服务商和代理机构提供的自定义品牌功能,输入您的品牌词启用后生效', + 'wp-china-yes' ), + 'default' => "WP-China-Yes", + ], + [ + 'type' => 'content', + 'content' => '启用隐藏设置前请务必保存当前设置页面 URL,否则您将无法再次进入插件设置页面', + ], + ], + ] ); + + WP_CHINA_YES::createSection( $this->prefix, [ + 'title' => '关于插件', + 'icon' => 'fa fa-info-circle', + 'fields' => [ + [ + 'type' => 'heading', + 'content' => '将您的 WordPress 接入本土生态体系,这将为您提供一个更贴近中国人使用习惯的 WordPress', + ], + [ + 'type' => 'submessage', + 'content' => '100% 开源代码,一起参与文派(WordPress)软件国产化进程,打造属于您自己的开源自助建站程序', + ], + [ + 'type' => 'subheading', + 'content' => '项目简介', + ], + [ + 'type' => 'content', + 'content' => '文派叶子 🍃(WP-China-Yes)是一款不可多得的 WordPress 系统底层优化和生态基础设施软件。项目起源于 2019 年,专为解决困扰了中国互联网数十年的特色问题而存在。此为文派开源(WenPai.org)的一部分', + ], + [ + 'type' => 'subheading', + 'content' => '赞助商', + ], + [ + 'type' => 'content', + 'content' => + << + + + + + + + + + + + +HTML, + ], + [ + 'type' => 'subheading', + 'content' => '开发者 & 贡献者', + ], + [ + 'type' => 'content', + 'content' => + <<孙锡源 | +耗子 | +Yulinn | +赵丰 | +jialong Dong | +TigerKK | +xianyu125 | +ElliotHughes | +诗语 | +莫蒂奇 | +薇晓朵 +HTML, + ] + ], + ] ); } /** @@ -137,15 +398,6 @@ class Setting { * 挂载设置页面 */ public function admin_menu() { - // 后台设置 - add_submenu_page( - is_multisite() ? 'settings.php' : 'options-general.php', - esc_html__( 'WP-China-Yes', 'wp-china-yes' ), - esc_html__( 'WP-China-Yes', 'wp-china-yes' ), - is_multisite() ? 'manage_network_options' : 'manage_options', - 'wp-china-yes', - [ $this, 'setting_page' ] - ); // 插件页设置 add_filter( 'plugin_action_links', function ( $links, $file ) { if ( 'wp-china-yes/wp-china-yes.php' !== $file ) { @@ -159,76 +411,4 @@ class Setting { return $links; }, 10, 2 ); } - - /** - * 设置页面模版 - */ - public function setting_page() { - echo << -
-

文派叶子🍃(WP-China-Yes)

-
-

将您的 WordPress 接入本土生态体系,这将为您提供一个更贴近中国人使用习惯的 WordPress。

-

100% 开源代码,一起参与文派(WordPress)软件国产化进程,打造属于您自己的开源自助建站程序。

- -
-
-HTML; - $this->setting_api->show_navigation(); - $this->setting_api->show_forms(); - - echo << -

提示:插件会定期检查节点可用性,并在节点不可用时自动切换至可用节点,以保证您的网站正常访问。如您发现设置项被自动切换,可重新设置或关闭自动监控功能。

-

帮助:您可以随时在此处调整个性化设置以便适应不同的业务场景,萌新请保持默认即可。此项目的发展离不开您的支持和建议,查看联系方式

-
-
-
-
-

项目简介

-
- 文派叶子 🍃(WP-China-Yes)是一款不可多得的 WordPress 系统底层优化和生态基础设施软件。项目起源于 2019 年,专为解决困扰了中国互联网数十年的特色问题而存在。此为文派开源(WenPai.org)的一部分。 -
- -
-
-

赞助商

- - -
- -
- -HTML; - - } } diff --git a/Service/Super.php b/Service/Super.php index 5506a35..45e96b4 100644 --- a/Service/Super.php +++ b/Service/Super.php @@ -39,7 +39,7 @@ class Super { echo <<
- HTML; +HTML; wp_widget_rss_output( 'https://wptea.com/feed/', [ 'items' => 5, 'show_summary' => 1, @@ -78,7 +78,7 @@ class Super { margin:0 } - HTML; +HTML; } ); } ); add_action( 'wp_network_dashboard_setup', function () { @@ -89,7 +89,7 @@ class Super { echo <<
- HTML; +HTML; wp_widget_rss_output( 'https://wptea.com/feed/', [ 'items' => 5, 'show_summary' => 1, @@ -128,7 +128,7 @@ class Super { margin:0 } - HTML; +HTML; } ); } ); } @@ -138,7 +138,7 @@ class Super { */ if ( is_admin() && ! ( defined( 'DOING_AJAX' ) && DOING_AJAX ) ) { if ( - ! empty( $this->settings['admincdn']['admin'] ) && + in_array( 'admin', (array) $this->settings['admincdn'] ) && ! stristr( $GLOBALS['wp_version'], 'alpha' ) && ! stristr( $GLOBALS['wp_version'], 'beta' ) && ! stristr( $GLOBALS['wp_version'], 'RC' ) @@ -158,7 +158,7 @@ class Super { /** * 前台静态加速 */ - if ( ! empty( $this->settings['admincdn']['frontend'] ) ) { + if ( in_array( 'frontend', (array) $this->settings['admincdn'] ) ) { $this->page_str_replace( 'template_redirect', 'preg_replace', [ '#(?<=[(\"\'])(?:' . quotemeta( home_url() ) . ')?/(?:((?:wp-content|wp-includes)[^\"\')]+\.(css|js)[^\"\')]+))(?=[\"\')])#', 'https://public.admincdn.com/$0' @@ -168,7 +168,7 @@ class Super { /** * Google 字体替换 */ - if ( ! empty( $this->settings['admincdn']['googlefonts'] ) ) { + if ( in_array( 'googlefonts', (array) $this->settings['admincdn'] ) ) { $this->page_str_replace( 'init', 'str_replace', [ 'fonts.googleapis.com', 'googlefonts.admincdn.com' @@ -178,7 +178,7 @@ class Super { /** * Google 前端公共库替换 */ - if ( ! empty( $this->settings['admincdn']['googleajax'] ) ) { + if ( in_array( 'googleajax', (array) $this->settings['admincdn'] ) ) { $this->page_str_replace( 'init', 'str_replace', [ 'ajax.googleapis.com', 'googleajax.admincdn.com' @@ -188,7 +188,7 @@ class Super { /** * CDNJS 前端公共库替换 */ - if ( ! empty( $this->settings['admincdn']['cdnjs'] ) ) { + if ( in_array( 'cdnjs', (array) $this->settings['admincdn'] ) ) { $this->page_str_replace( 'init', 'str_replace', [ 'cdnjs.cloudflare.com/ajax/libs', 'cdnjs.admincdn.com' @@ -198,9 +198,9 @@ class Super { /** * jsDelivr 前端公共库替换 */ - if ( ! empty( $this->settings['admincdn']['jsdelivr'] ) ) { + if ( in_array( 'jsdelivr', (array) $this->settings['admincdn'] ) ) { $this->page_str_replace( 'init', 'str_replace', [ - 'cdn.jsdelivr.net', + 'jsd.admincdn.com', 'jsd.admincdn.com' ] ); } @@ -225,6 +225,85 @@ class Super { wp_enqueue_style( 'windfonts-optimize', CHINA_YES_PLUGIN_URL . 'assets/css/fonts.css', [], CHINA_YES_VERSION ); } ); } + if ( ! empty( $this->settings['windfonts'] ) && $this->settings['windfonts'] == 'on' ) { + add_action( 'wp_head', [ $this, 'load_windfonts' ] ); + add_action( 'admin_head', [ $this, 'load_windfonts' ] ); + } + if ( ! empty( $this->settings['windfonts'] ) && $this->settings['windfonts'] == 'frontend' ) { + add_action( 'wp_head', [ $this, 'load_windfonts' ] ); + } + + /** + * 广告拦截 + */ + if ( ! empty( $this->settings['adblock'] ) && $this->settings['adblock'] == 'on' ) { + add_action( 'admin_head', [ $this, 'load_adblock' ] ); + } + } + + /** + * 加载文风字体 + */ + public function load_windfonts() { + echo << + +HTML; + + $loaded = []; + foreach ( (array) $this->settings['windfonts_list'] as $font ) { + if ( empty( $font['enable'] ) ) { + continue; + } + if ( empty( $font['family'] ) ) { + continue; + } + if ( in_array( $font['css'], $loaded ) ) { + continue; + } + echo sprintf( << + +HTML + , + $font['css'], + htmlspecialchars_decode( $font['selector'] ), + $font['style'], + $font['weight'], + $font['family'] + ); + $loaded[] = $font['css']; + } + } + + /** + * 加载广告拦截 + */ + public function load_adblock() { + foreach ( (array) $this->settings['adblock_rule'] as $rule ) { + if ( empty( $rule['enable'] ) ) { + continue; + } + if ( empty( $rule['selector'] ) ) { + continue; + } + echo sprintf( << + %s { + display: none!important; + } + +HTML + , + htmlspecialchars_decode( $rule['selector'] ) + ); + } } /** diff --git a/assets/css/setting.css b/assets/css/setting.css index bf4544f..162a105 100644 --- a/assets/css/setting.css +++ b/assets/css/setting.css @@ -1,129 +1,134 @@ -html, body, div, span, applet, object, iframe, h1, h2, h3, h4, h5, h6, p, blockquote, pre, a, abbr, acronym, address, big, cite, code, del, dfn, em, font, ins, kbd, q, s, samp, small, strike, strong, sub, sup, tt, var, dl, dt, dd, ol, ul, li, fieldset, form, label, legend, table, caption, tbody, tfoot, thead, tr, th, td { - font-family: -apple-system, "Noto Sans", "Helvetica Neue", Helvetica, "Nimbus Sans L", Arial, "Liberation Sans", "PingFang SC", "Hiragino Sans GB", "Noto Sans CJK SC", "Source Han Sans SC", "Source Han Sans CN", "Microsoft YaHei", "Wenquanyi Micro Hei", "WenQuanYi Zen Hei", "ST Heiti", SimHei, "WenQuanYi Zen Hei Sharp", sans-serif; -} - -#wpcontent, #wpfooter { - background-color: #ffffff; -} - -#wpbody-content { - padding-bottom: 10%; -} - -.notice { - background-color: #f5f5f5; -} - -.container { - display: flex; - flex-wrap: wrap; - width: 100%; -} - -.left-column, .right-column { - width: 100%; -} - -.right-column { - padding: 20px; - display: flex; - flex-direction: column; - gap: 20px; -} - -.card { - background-color: #fff; - padding: 10%; - border-radius: 10px; - text-transform: none; - border: 0px solid #c3c4c7; - font-size: 14px; - line-height: 2; - box-shadow: 0 0.375rem 1.5rem 0 rgba(141, 153, 165, 0.13); -} - -.card h3 { - margin-top: 0; - font-size: 18px; - font-weight: 400; -} - -.card a, .left-column a { - text-decoration: none; -} - -.card-body, .card-footer { - margin: 10px 0; -} - -.card-footer a.button.button-primary { - padding: 1% 5%; - margin-top: 10px; -} - -.form-table th { - width: 120px; - padding: 5% 0; -} - -.form-table td { - padding: 5% 0; -} - -.settings-header { - padding-top: 20px; - max-width: 1280px; - margin: 0 auto; - line-height: 1.5; -} - -.settings-header .update-messages h2, .update-php h2, h4 { - font-size: 15px; - font-weight: 400; -} - -.settings-title-section { - padding: 1% 0; -} - -.settings-footer p { - font-size: 12px; - line-height: 2; -} - .sponsor-logos { - display: flex; + display: block; flex-wrap: wrap; justify-content: center; } .sponsor-logos img { - width: 26%; - margin-bottom: 30px; - display: block; - margin-left: auto; - margin-right: auto; - height: fit-content; + flex-basis: calc(20% - 10px); + max-width: 85px; + margin: 5px; + height: auto; } -@media screen and (max-width: 782px) { - .auto-fold #wpcontent { - padding: 10px; - } +.wp_china_yes-content a { + color: #0073aa; + text-decoration: none; } -@media (min-width: 768px) { - .container { - flex-wrap: nowrap; - max-width: 1280px; - margin: 0 auto; - } - - .left-column { - width: 70%; - } - - .right-column { - width: 30%; - } +.wp_china_yes-options { + background-color: #fff; + padding: 1%; + border-radius: 10px; + text-transform: none; + line-height: 2; + box-shadow: 0 0.375rem 1.5rem 0 rgba(141, 153, 165, 0.13); + max-width: 1100px; + margin: 2rem auto; +} + +.wp_china_yes-section-title { + padding: 20px 30px; + background-color: #fff; + border-top: 0 solid #f5f5f5; + border-bottom: 1px solid #f5f5f5; +} + +.wp_china_yes-field-subheading { + background-color: #ffffff; +} + +.wp_china_yes-theme-light .wp_china_yes-container { + border: 0 solid #ccd0d4; +} + +.wp_china_yes-theme-light .wp_china_yes-header-inner { + border-bottom: 1px solid #f5f5f5; + background: #ffffff; +} + +.wp_china_yes-theme-light .wp_china_yes-nav-background { + background-color: #ffffff; + border-right: 1px solid #f5f5f5; +} + +.wp_china_yes-theme-light .wp_china_yes-footer { + border-top: 1px solid #fff; + background: #ffffff; +} + +.wp_china_yes-field-heading { + font-size: 1.4em; + background-color: #ffffff; +} + +.wp_china_yes-theme-light .wp_china_yes-nav ul li a { + background-color: #ffffff; +} + +.wp_china_yes-submessage-normal { + border-color: #ffffff; + background-color: #ffffff; +} + +.wp_china_yes-field + .wp_china_yes-field { + border-top: 1px solid #ffffff; +} + +.wp_china_yes-theme-light .wp_china_yes-nav-normal > ul li a { + border-bottom: 1px solid #f5f5f5; + border-right: 1px solid #f5f5f5; +} + +.wp_china_yes-field-group .wp_china_yes-cloneable-header-icon { + font-size: 10px; +} + +.wp_china_yes-field-group .wp_china_yes-cloneable-title { + padding: 10px 65px 10px 10px; +} + +.wp_china_yes-field-group .ui-accordion .wp_china_yes-cloneable-item { + padding: 2px 0; + border-radius: 10px; +} + +.wp_china_yes-field-group .wp_china_yes-cloneable-helper { + top: 15px; +} + +.wp_china_yes-field-group .wp_china_yes-cloneable-title { + border: 1px solid #ccd0d4; + background-color: #ffffff; + border-radius: 8px; +} + +.wp_china_yes-field-group .wp_china_yes-cloneable-content { + border: 0 solid #ffffff; + background-color: #ffffff; +} + +.wp_china_yes-sticky .wp_china_yes-header-inner { + border-radius: 10px; + box-shadow: 0 0 10px rgba(0, 0, 0, .1); +} + +.wp_china_yes-warning-primary { + color: #fff !important; + border-color: #2c3338 !important; + background: #2c3338 !important; +} + +.wp_china_yes-warning-primary:focus, .wp_china_yes-warning-primary:hover { + border-color: #1d2327 !important; + background: #1d2327 !important; +} + +.wp_china_yes-field-switcher .wp_china_yes--switcher:not(.wp_china_yes--active) { + background-color: #9a9a9a; +} + +.wp_china_yes-theme-light .wp_china_yes-nav-normal > ul { + margin-right: -2px; + margin-bottom: -1px; } diff --git a/composer.json b/composer.json index 8f816bf..b4944af 100644 --- a/composer.json +++ b/composer.json @@ -3,7 +3,6 @@ "description": "WordPress Optimized Plugin for Mainland China", "type": "project", "require": { - "thetnb/wp-setting-api": "^2.0", "yahnis-elsts/plugin-update-checker": "^5.2" }, "license": "MIT", @@ -12,7 +11,8 @@ "WenPai\\ChinaYes\\": "./" }, "files": [ - "helpers.php" + "helpers.php", + "framework/classes/setup.class.php" ] }, "authors": [ diff --git a/composer.lock b/composer.lock index a3a6980..6066563 100644 --- a/composer.lock +++ b/composer.lock @@ -4,52 +4,8 @@ "Read more about it at https://getcomposer.org/doc/01-basic-usage.md#installing-dependencies", "This file is @generated automatically" ], - "content-hash": "19512e097932a150b6ccc5f8044c62ed", + "content-hash": "46cf14a68ffba471ee1e2f603a301a9c", "packages": [ - { - "name": "thetnb/wp-setting-api", - "version": "2.0.2", - "source": { - "type": "git", - "url": "https://github.com/TheTNB/wp-setting-api.git", - "reference": "0e34224dfe0832fd3bf29e2e3c054a2aad603f84" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/TheTNB/wp-setting-api/zipball/0e34224dfe0832fd3bf29e2e3c054a2aad603f84", - "reference": "0e34224dfe0832fd3bf29e2e3c054a2aad603f84", - "shasum": "" - }, - "require": { - "php": ">=5.6" - }, - "type": "library", - "autoload": { - "psr-4": { - "TheTNB\\Setting\\": "src/" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "GPL-3.0-or-later" - ], - "authors": [ - { - "name": "耗子", - "email": "i@haozi.net" - } - ], - "description": "WordPress Setting API for developers", - "homepage": "https://github.com/thetnb/wp-setting-api", - "keywords": [ - "wordpress" - ], - "support": { - "issues": "https://github.com/TheTNB/wp-setting-api/issues", - "source": "https://github.com/TheTNB/wp-setting-api/tree/2.0.2" - }, - "time": "2024-03-08T07:11:27+00:00" - }, { "name": "yahnis-elsts/plugin-update-checker", "version": "v5.4", diff --git a/framework/assets/css/style-rtl.min.css b/framework/assets/css/style-rtl.min.css new file mode 100644 index 0000000..a86bcb9 --- /dev/null +++ b/framework/assets/css/style-rtl.min.css @@ -0,0 +1 @@ +.wp_china_yes-options{margin-left:20px;margin-right:0}.wp_china_yes-header h1{float:right}.wp_china_yes-header fieldset{float:left}.wp_china_yes-buttons{float:left;direction:ltr}.wp_china_yes-header-left{float:right}.wp_china_yes-header-right{float:left}.wp_china_yes-nav{float:right}.wp_china_yes-nav ul{clear:right}.wp_china_yes-nav ul li .wp_china_yes-active:after{right:auto;left:0;border-left-color:#fff;border-right-color:transparent}.wp_china_yes-nav ul li .wp_china_yes-arrow:after{content:"\f053";right:auto;left:10px}.wp_china_yes-nav ul li.wp_china_yes-tab-expanded .wp_china_yes-arrow:after{transform:rotate(-90deg)}.wp_china_yes-nav ul ul li a{padding-right:25px;padding-left:15px}.wp_china_yes-nav ul ul:before{left:auto;right:15px}.wp_china_yes-nav .wp_china_yes-tab-icon{margin-left:5px;margin-right:0}.wp_china_yes-nav-background{left:auto;right:0}.wp_china_yes-content{margin-left:0;margin-right:225px}.wp_china_yes-sections{float:right}.wp_china_yes-show-all .wp_china_yes-content{margin-right:0;overflow:hidden}.wp_china_yes-expand-all{float:right;right:auto;left:40px;margin-right:0;margin-left:4px}.wp_china_yes-search{float:right}.wp_china_yes-search input{margin:0 0 0 5px}.wp_china_yes-copyright{float:right}.wp_china_yes-metabox{margin:-6px -12px -12px -12px}.wp_china_yes-metabox .wp_china_yes-section-title{padding:20px}.wp_china_yes-section-title .wp_china_yes-section-icon{margin-left:5px;margin-right:0}.wp_china_yes-field .wp_china_yes-title{float:right}.wp_china_yes-field .wp_china_yes-fieldset{float:left}.wp_china_yes-pseudo-field{padding:0 0 0 5px!important}.wp_china_yes-field-typography select{margin:0;width:100%}.wp_china_yes-field-typography .wp_china_yes--blocks-inputs .wp_china_yes--blocks{flex-direction:row-reverse}.wp_china_yes-field-typography .wp_china_yes--unit{left:4px;right:auto}.wp_china_yes-field-checkbox ul ul li,.wp_china_yes-field-radio ul ul li{margin-left:0;margin-right:8px}.wp_china_yes-field-checkbox ul ul li:first-child,.wp_china_yes-field-radio ul ul li:first-child{margin-right:0}.wp_china_yes-field-checkbox .wp_china_yes--inline-list li,.wp_china_yes-field-radio .wp_china_yes--inline-list li{margin-right:0;margin-left:15px}.wp_china_yes-field-checkbox .wp_china_yes--text,.wp_china_yes-field-radio .wp_china_yes--text{margin-left:0;margin-right:5px}.wp_china_yes-field-switcher .wp_china_yes--switcher{float:right}.wp_china_yes-field-switcher .wp_china_yes--label{float:right;margin-left:0;margin-right:5px}.wp_china_yes-field-upload .wp_china_yes--button,.wp_china_yes-field-upload .wp_china_yes--remove{margin-left:0;margin-right:5px}.wp_china_yes-field-group .wp_china_yes-cloneable-title{padding:15px 10px 15px 65px}.wp_china_yes-field-group .wp_china_yes-cloneable-helper{right:auto;left:10px}.wp_china_yes-field-repeater .wp_china_yes-repeater-helper{border-left:0;border-right:1px solid #eee}.wp_china_yes-help{right:auto;left:5px}.wp_china_yes-field-icon .button{margin-right:0;margin-left:5px}.wp_china_yes-field-icon .wp_china_yes-icon-preview i{margin-right:0;margin-left:5px}.wp_china_yes-field-gallery ul li{margin-right:0;margin-left:5px}.wp_china_yes-field-gallery .button{margin-right:0;margin-left:5px}.wp_china_yes-field-tabbed .wp_china_yes-tabbed-nav .wp_china_yes--icon{padding-right:0;padding-left:5px}.wp_china_yes-field-tabbed .wp_china_yes-tabbed-nav a{margin-right:0;margin-left:5px}.wp_china_yes-field-media .button{margin-left:0;margin-right:7px}.wp_china_yes-field-media .hidden+.button{margin-right:0}.wp_china_yes-notice{border-left:none;border-right-style:solid;border-right-width:4px}.wp_china_yes-field-border .wp_china_yes--input,.wp_china_yes-field-border .wp_china_yes-fieldset,.wp_china_yes-field-dimensions .wp_china_yes--input,.wp_china_yes-field-dimensions .wp_china_yes-fieldset,.wp_china_yes-field-spacing .wp_china_yes--input,.wp_china_yes-field-spacing .wp_china_yes-fieldset{direction:ltr}.wp_china_yes-field-border .wp_china_yes--color,.wp_china_yes-field-border .wp_china_yes--inputs,.wp_china_yes-field-dimensions .wp_china_yes--color,.wp_china_yes-field-dimensions .wp_china_yes--inputs,.wp_china_yes-field-spacing .wp_china_yes--color,.wp_china_yes-field-spacing .wp_china_yes--inputs{float:right}.wp_china_yes-field-border .wp_china_yes--color,.wp_china_yes-field-dimensions .wp_china_yes--color,.wp_china_yes-field-spacing .wp_china_yes--color{margin-right:4px;direction:rtl}.wp_china_yes-field-background .wp_china_yes--block{float:right}.wp_china_yes-field-background .wp_china_yes--media,.wp_china_yes-field-background .wp_china_yes--select{padding-right:0}.wp_china_yes-field-background .wp_china_yes--title{margin-right:0;margin-left:5px}.wp_china_yes-field-spinner .wp_china_yes--spin{float:right;direction:ltr}.wp_china_yes-field-slider .wp_china_yes-slider-ui{direction:ltr;margin-right:0;margin-left:15px}.wp_china_yes-field-slider .wp_china_yes--input{direction:ltr}.wp_china_yes-field-button_set .wp_china_yes--button-group{float:right}.wp_china_yes-field-link_color .wp_china_yes--left{float:right;margin-right:0;margin-left:10px}.wp_china_yes-field-color_group .wp_china_yes--left{float:right;margin-right:0;margin-left:10px}.wp_china_yes-field-palette .wp_china_yes--palette{margin-right:0;margin-left:10px}.wp_china_yes-field-accordion .wp_china_yes--icon{margin-right:0;margin-left:2px}.wp_china_yes-field-date .wp_china_yes--to{margin-left:0;margin-right:7px}.wp_china_yes-field-map .wp_china_yes--map-input:last-child{padding-left:0;padding-right:10px}.wp_china_yes-field-sortable .wp_china_yes-sortable-helper{border-left:none;border-right:1px solid #eee}.wp_china_yes-field-number .wp_china_yes--wrap{float:right}.wp_china_yes-field-number .wp_china_yes--unit{left:4px;right:auto}.wp_china_yes-taxonomy-add-fields{margin-right:0;margin-left:30px}.wp_china_yes-taxonomy-add-fields .wp_china_yes-field>.wp_china_yes-fieldset>.wp_china_yes-help{left:-5px;right:auto}.wp_china_yes-taxonomy-edit-fields{margin-right:0;margin-left:35px}.wp_china_yes-taxonomy-edit-fields .wp_china_yes-field>.wp_china_yes-fieldset>.wp_china_yes-help{right:auto;left:-5px}.wp_china_yes-profile-options>h2>.fa{padding-right:0;padding-left:7px}.wp_china_yes-profile-options>.wp_china_yes-field>.wp_china_yes-fieldset>.wp_china_yes-help{left:-5px;right:auto}.wp_china_yes-nav-menu-options>.wp_china_yes-fields{margin-left:0;margin-right:-10px}.wp_china_yes-nav-menu-title{padding-left:14px;padding-right:12px}.wp_china_yes-nav-menu-icon{margin-right:0;margin-left:5px}.wp_china_yes-modal-content .wp_china_yes-field{padding:15px 15px 15px 30px}.wp_china_yes-modal-title{padding:0 16px 0 36px}.wp_china_yes-modal-close{right:auto;left:0}.control-section .wp_china_yes-field .wp_china_yes-fieldset{margin-right:0}@media only screen and (max-width:1200px){.wp_china_yes-metabox .wp_china_yes-field .wp_china_yes-fieldset{margin-left:0}}@media only screen and (max-width:782px){.wp_china_yes .wp_china_yes-content,.wp_china_yes .wp_china_yes-fieldset{margin-right:0}}.wp_china_yes-field .wp_china_yes--transparent-slider{margin-left:0;margin-right:2px}.wp_china_yes-field .wp_china_yes--transparent-slider .ui-slider-handle{margin:0 -11px}.wp_china_yes-field .wp_china_yes--transparent-offset{background-position:center right}.wp_china_yes-field .wp_china_yes--transparent-text{right:auto;left:10px} \ No newline at end of file diff --git a/framework/assets/css/style.min.css b/framework/assets/css/style.min.css new file mode 100644 index 0000000..47b2091 --- /dev/null +++ b/framework/assets/css/style.min.css @@ -0,0 +1 @@ +.wp_china_yes{position:relative}.wp_china_yes label{padding:0;margin:0;display:inline-block}.wp_china_yes-ab-icon{top:2px}#screen-meta-links+.wp_china_yes-options{margin-top:40px}.wp_china_yes-options{margin-top:20px;margin-right:20px}.wp_china_yes-header{position:relative}.wp_china_yes-header-inner{padding:25px;transition:box-shadow .3s ease}.wp_china_yes-header-inner h1{float:left;font-size:1.5em;line-height:26px;font-weight:400;margin:0}.wp_china_yes-header-inner h1 small{font-size:11px;font-weight:500}.wp_china_yes-sticky .wp_china_yes-header-inner{position:fixed;z-index:99;top:32px;box-shadow:0 5px 10px rgba(0,0,0,.1)}.wp_china_yes-buttons{float:right}.wp_china_yes-buttons .button{margin:0 2px;line-height:26px}.wp_china_yes-buttons .button:focus{outline:0!important;box-shadow:none!important}.wp_china_yes-buttons .wp_china_yes-save{min-width:72px}.wp_china_yes-header-left{float:left}.wp_china_yes-header-right{float:right}.wp_china_yes-nav{display:block;position:relative;z-index:10;float:left}.wp_china_yes-nav ul{clear:left;margin:0;list-style-type:none}.wp_china_yes-nav ul li{margin-bottom:0}.wp_china_yes-nav ul li a{font-size:13px;position:relative;display:block;padding:14px 12px;text-decoration:none;transition-property:color,background;transition-duration:.2s;transition-timing-function:ease}.wp_china_yes-nav ul li a:focus{outline:0;box-shadow:none}.wp_china_yes-nav ul li .wp_china_yes-arrow:after{content:"\f054";display:inline-block;font-family:"Font Awesome 5 Pro","Font Awesome 5 Free",FontAwesome;font-weight:900;font-size:9px;line-height:1;position:absolute;right:10px;top:50%;margin-top:-4px}.wp_china_yes-nav ul li.wp_china_yes-tab-expanded .wp_china_yes-arrow:after{transform:rotate(90deg)}.wp_china_yes-nav ul li.wp_china_yes-tab-expanded ul{display:block}.wp_china_yes-nav ul ul{display:none;position:relative}.wp_china_yes-nav ul ul li a{font-size:12px;padding:12px 14px 12px 24px}.wp_china_yes-nav .wp_china_yes-tab-icon{width:20px;margin-right:5px;font-size:13px;text-align:center}.wp_china_yes-nav .wp_china_yes-label-error{margin-left:4px;vertical-align:top}.wp_china_yes-nav-normal{width:225px}.wp_china_yes-nav-normal+.wp_china_yes-content{margin-left:225px}.wp_china_yes-nav-inline{width:100%}.wp_china_yes-nav-inline ul li{display:inline-block;vertical-align:top}.wp_china_yes-nav-background{position:absolute;top:0;left:0;bottom:0;z-index:9;width:225px}.wp_china_yes-wrapper{position:relative}.wp_china_yes-content{position:relative;background-color:#fff}.wp_china_yes-sections{float:left;width:100%}.wp_china_yes-section-title{display:none;padding:20px 30px;background-color:#f5f5f5;border-top:1px solid #eee;border-bottom:1px solid #eee}.wp_china_yes-section-title h3{margin:0;padding:0;font-size:13px;font-weight:700;text-transform:uppercase}.wp_china_yes-section-title .wp_china_yes-section-icon{margin-right:5px}.wp_china_yes-footer{padding:20px;font-size:11px}.wp_china_yes-copyright{float:left;margin-top:5px}.wp_china_yes-search-all .wp_china_yes-nav,.wp_china_yes-search-all .wp_china_yes-nav-background,.wp_china_yes-show-all .wp_china_yes-nav,.wp_china_yes-show-all .wp_china_yes-nav-background{display:none}.wp_china_yes-search-all .wp_china_yes-content,.wp_china_yes-show-all .wp_china_yes-content{margin-left:0}.wp_china_yes-search-all .wp_china_yes-section,.wp_china_yes-search-all .wp_china_yes-section-title,.wp_china_yes-show-all .wp_china_yes-section,.wp_china_yes-show-all .wp_china_yes-section-title{display:block!important}.wp_china_yes-search-all .wp_china_yes-section-title{display:none!important}.wp_china_yes-expand-all{float:left;padding:0 8px;margin-right:4px;z-index:1;font-size:13px;line-height:30px;cursor:pointer;user-select:none;border-radius:2px;transition:all .2s}.wp_china_yes-expand-all span{font-size:11px;vertical-align:middle}.wp_china_yes-search{float:left}.wp_china_yes-search input{margin:0 2px 0 0;border:none;font-size:12px;line-height:30px;min-height:30px;text-align:inherit;padding:0 10px;border-radius:2px;box-shadow:none}.wp_china_yes-search input:focus{box-shadow:none}.wp_china_yes-saving .wp_china_yes-buttons,.wp_china_yes-saving .wp_china_yes-content{cursor:default;pointer-events:none;opacity:.5}.wp_china_yes-metabox{margin:-6px -12px -12px -12px}.wp_china_yes-metabox .wp_china_yes-field{padding:20px}.wp_china_yes-metabox .wp_china_yes-section-title{padding:20px}.block-editor-page .wp_china_yes-metabox{margin:-6px -14px -14px -14px}.block-editor-editor-skeleton__content .wp_china_yes-metabox{border-left:1px solid #e2e4e7;border-right:1px solid #e2e4e7}.wp_china_yes-sections-reset{float:left;width:100%;text-align:right;border-top:1px solid #eee}.wp_china_yes-sections-reset .wp_china_yes-button-cancel,.wp_china_yes-sections-reset input{display:none}.wp_china_yes-sections-reset label{padding:10px}.wp_china_yes-sections-reset span{-webkit-user-select:none;user-select:none}.wp_china_yes-sections-reset input:checked~.wp_china_yes-button-reset{display:none}.wp_china_yes-sections-reset input:checked~.wp_china_yes-button-cancel{display:inline-block}#side-sortables .wp_china_yes-section-title{padding:12px}#side-sortables .wp_china_yes-field{padding:10px 15px}#side-sortables .wp_china_yes-field .wp_china_yes-title{float:none;width:100%;margin-bottom:6px}#side-sortables .wp_china_yes-field .wp_china_yes-fieldset{float:none;width:100%}#side-sortables .wp_china_yes-field-text input{width:100%}#side-sortables .wp_china_yes-notice{padding:10px 15px}.wp_china_yes-comment-metabox{margin:-6px -12px -12px -12px}.wp_china_yes-comment-metabox .wp_china_yes-field{padding:20px}.wp_china_yes-comment-metabox .wp_china_yes-section-title{padding:20px}.wp_china_yes-tooltip{position:absolute;z-index:5000001;font-size:12px;line-height:1.4;text-align:center;text-decoration:none;padding:6px 12px;max-width:200px;color:#fff;background-color:#000;background-color:rgba(0,0,0,.85);border-radius:4px}.wp_china_yes-theme-dark .wp_china_yes-header-inner{background-color:#050505}.wp_china_yes-theme-dark .wp_china_yes-header-inner h1{color:#fff}.wp_china_yes-theme-dark .wp_china_yes-header-inner h1 small{color:#555}.wp_china_yes-theme-dark .wp_china_yes-expand-all{color:#999;background-color:#222}.wp_china_yes-theme-dark .wp_china_yes-expand-all:hover{color:#fff;background-color:#333}.wp_china_yes-theme-dark .wp_china_yes-search input{color:#fff;background-color:#222}.wp_china_yes-theme-dark .wp_china_yes-search:focus{background-color:#444}.wp_china_yes-theme-dark .wp_china_yes-search::-webkit-input-placeholder{color:#666}.wp_china_yes-theme-dark .wp_china_yes-nav ul li a{color:#999;border-color:#2f2f2f;background-color:#222}.wp_china_yes-theme-dark .wp_china_yes-nav ul li a:hover{color:#fff}.wp_china_yes-theme-dark .wp_china_yes-nav ul li .wp_china_yes-active{color:#fff;background-color:#111}.wp_china_yes-theme-dark .wp_china_yes-nav ul ul li a{border-color:#2f2f2f;background-color:#191919}.wp_china_yes-theme-dark .wp_china_yes-nav ul ul li .wp_china_yes-active{background-color:#101010}.wp_china_yes-theme-dark .wp_china_yes-nav ul ul:before{background-color:rgba(34,34,34,.75)}.wp_china_yes-theme-dark .wp_china_yes-nav>ul>li:last-child>a{border:none}.wp_china_yes-theme-dark .wp_china_yes-nav-normal ul li a{border-bottom-width:1px;border-bottom-style:solid}.wp_china_yes-theme-dark .wp_china_yes-nav-normal ul li .wp_china_yes-active:after{content:" ";position:absolute;right:0;top:50%;height:0;width:0;pointer-events:none;border:solid transparent;border-right-color:#fff;border-width:4px;margin-top:-4px}.wp_china_yes-theme-dark .wp_china_yes-nav-inline{background-color:#222}.wp_china_yes-theme-dark .wp_china_yes-nav-inline ul li a{text-align:center;border-right-width:1px;border-right-style:solid}.wp_china_yes-theme-dark .wp_china_yes-nav-inline ul li .wp_china_yes-active:after{content:" ";position:absolute;left:50%;bottom:0;height:0;width:0;pointer-events:none;border:solid transparent;border-bottom-color:#fff;border-width:4px;margin-left:-4px}.wp_china_yes-theme-dark .wp_china_yes-nav-background{background-color:#222}.wp_china_yes-theme-dark .wp_china_yes-footer{color:#555;background-color:#050505}.wp_china_yes-theme-light .wp_china_yes-container{border:1px solid #ccd0d4;box-shadow:0 0 15 rgba(0,0,0,.04)}.wp_china_yes-theme-light .wp_china_yes-header-inner{border-bottom:1px solid #ccd0d4;background-color:#f5f5f5;background:linear-gradient(#fefefe,#f5f5f5)}.wp_china_yes-theme-light .wp_china_yes-header-inner h1 small{color:#999}.wp_china_yes-theme-light .wp_china_yes-expand-all{color:#999;background-color:#eee}.wp_china_yes-theme-light .wp_china_yes-expand-all:hover{color:#555}.wp_china_yes-theme-light .wp_china_yes-search input{color:#555;background-color:#eee}.wp_china_yes-theme-light .wp_china_yes-search input::-webkit-input-placeholder{color:#999}.wp_china_yes-theme-light .wp_china_yes-nav ul li a{font-weight:500;color:#444;background-color:#f5f5f5}.wp_china_yes-theme-light .wp_china_yes-nav ul li a:hover{color:#111;background-color:#fff}.wp_china_yes-theme-light .wp_china_yes-nav ul li .wp_china_yes-active{color:#111;background-color:#fff}.wp_china_yes-theme-light .wp_china_yes-nav ul ul li a{background-color:#eee}.wp_china_yes-theme-light .wp_china_yes-nav-normal>ul{margin-right:-1px;margin-bottom:-1px}.wp_china_yes-theme-light .wp_china_yes-nav-normal>ul li a{border-bottom:1px solid #ccd0d4;border-right:1px solid #ccd0d4}.wp_china_yes-theme-light .wp_china_yes-nav-normal>ul li .wp_china_yes-active{border-right-color:#fff}.wp_china_yes-theme-light .wp_china_yes-nav-inline{background-color:#f5f5f5;border-bottom:1px solid #ccd0d4}.wp_china_yes-theme-light .wp_china_yes-nav-inline>ul{margin-bottom:-1px}.wp_china_yes-theme-light .wp_china_yes-nav-inline>ul li a{text-align:center;border-right:1px solid #ccd0d4;border-bottom:1px solid #ccd0d4}.wp_china_yes-theme-light .wp_china_yes-nav-inline>ul li .wp_china_yes-active{border-bottom-color:#fff}.wp_china_yes-theme-light .wp_china_yes-nav-inline>ul ul{display:none!important}.wp_china_yes-theme-light .wp_china_yes-nav-inline .wp_china_yes-arrow:after{display:none}.wp_china_yes-theme-light .wp_china_yes-nav-background{background-color:#f5f5f5;border-right:1px solid #ccd0d4}.wp_china_yes-theme-light .wp_china_yes-footer{color:#555;border-top:1px solid #ccd0d4;background-color:#f5f5f5;background:linear-gradient(#fafafa,#f5f5f5)}.wp_china_yes-field{position:relative;padding:30px}.wp_china_yes-field+.wp_china_yes-field{border-top:1px solid #eee}.wp_china_yes-field p:first-child{margin-top:0}.wp_china_yes-field p:last-child{margin-bottom:0}.wp_china_yes-field:after,.wp_china_yes-field:before{content:" ";display:table}.wp_china_yes-field:after{clear:both}.wp_china_yes-field h4{margin-top:0}.wp_china_yes-field .wp_china_yes-title{position:relative;width:20%;float:left}.wp_china_yes-field .wp_china_yes-title h4{margin:0;color:#23282d}.wp_china_yes-field .wp_china_yes-fieldset{float:right;width:calc(80% - 20px)}.wp_china_yes-pseudo-field{padding:0 5px 0 0!important;display:inline-block}.wp_china_yes-pseudo-field+.wp_china_yes-pseudo-field{border:0}.wp_china_yes-pseudo-field pre{display:none}.wp_china_yes-field-accordion .wp_china_yes-accordion-item{position:relative;margin-bottom:5px}.wp_china_yes-field-accordion .wp_china_yes-accordion-item:last-child{margin-bottom:0}.wp_china_yes-field-accordion .wp_china_yes-accordion-item h4{font-size:1em}.wp_china_yes-field-accordion .wp_china_yes-accordion-title{display:block;cursor:pointer;position:relative;margin:0;padding:15px;min-height:0;font-size:100%;user-select:none;border:1px solid #ccd0d4;background-color:#fafafa;box-shadow:0 1px 1px rgba(0,0,0,.04);transition:border-color .15s}.wp_china_yes-field-accordion .wp_china_yes-accordion-title:active,.wp_china_yes-field-accordion .wp_china_yes-accordion-title:focus,.wp_china_yes-field-accordion .wp_china_yes-accordion-title:hover{outline:0;border-color:#999}.wp_china_yes-field-accordion .wp_china_yes-accordion-title .wp_china_yes--icon{width:20px;text-align:center;margin-right:2px}.wp_china_yes-field-accordion .wp_china_yes-accordion-icon{width:16px;text-align:center}.wp_china_yes-field-accordion .wp_china_yes-accordion-content{display:none;padding:0;border:1px solid #ccd0d4;border-top:none;background-color:#fff;box-shadow:0 1px 1px rgba(0,0,0,.04)}.wp_china_yes-field-accordion .wp_china_yes-accordion-content>.wp_china_yes-field{padding:15px}.wp_china_yes-field-accordion .wp_china_yes-accordion-open{display:block}.wp_china_yes-field-background .wp_china_yes-field{border:0!important;padding:0;margin-bottom:6px;margin-right:6px}.wp_china_yes-field-background .wp_china_yes--title{color:#777;font-size:12px}.wp_china_yes-field-background .wp_china_yes--background-colors{display:flex;flex-wrap:wrap}.wp_china_yes-field-background .wp_china_yes--background-attributes{display:flex;flex-wrap:wrap}.wp_china_yes-field-background .wp_china_yes--background-attributes select{min-width:100%;margin:0}.wp_china_yes-field-background .wp_china_yes--background-attributes .wp_china_yes-field{flex:1}.wp_china_yes-field-background .wp_china_yes--attributes-hidden{display:none}.wp_china_yes-field-backup textarea{width:100%;min-height:200px;margin-bottom:5px}.wp_china_yes-field-backup small{display:inline-block;margin:5px}.wp_china_yes-field-backup hr{margin:20px 0;border:none;border-bottom:1px solid #e5e5e5}.wp_china_yes-field-border .wp_china_yes--inputs,.wp_china_yes-field-dimensions .wp_china_yes--inputs,.wp_china_yes-field-spacing .wp_china_yes--inputs{float:left;display:flex;flex-wrap:wrap}.wp_china_yes-field-border .wp_china_yes--input,.wp_china_yes-field-dimensions .wp_china_yes--input,.wp_china_yes-field-spacing .wp_china_yes--input{display:flex;padding-right:6px;padding-bottom:4px;box-sizing:border-box}.wp_china_yes-field-border .wp_china_yes--input select,.wp_china_yes-field-dimensions .wp_china_yes--input select,.wp_china_yes-field-spacing .wp_china_yes--input select{margin:0}.wp_china_yes-field-border .wp_china_yes--input input,.wp_china_yes-field-dimensions .wp_china_yes--input input,.wp_china_yes-field-spacing .wp_china_yes--input input{position:relative;z-index:1;margin:0;width:65px;max-width:100%;text-align:center}.wp_china_yes-field-border .wp_china_yes--color,.wp_china_yes-field-dimensions .wp_china_yes--color,.wp_china_yes-field-spacing .wp_china_yes--color{float:left}.wp_china_yes-field-border .wp_china_yes--label,.wp_china_yes-field-dimensions .wp_china_yes--label,.wp_china_yes-field-spacing .wp_china_yes--label{display:flex;flex-direction:column;justify-content:center;user-select:none;min-width:20px;max-width:100%;padding:0 4px;font-size:12px;text-align:center;color:#555;border:1px solid #7b776c;background-color:#f5f5f5}.wp_china_yes-field-border .wp_china_yes--icon,.wp_china_yes-field-dimensions .wp_china_yes--icon,.wp_china_yes-field-spacing .wp_china_yes--icon{border-right:0;border-radius:4px 0 0 4px}.wp_china_yes-field-border .wp_china_yes--icon+input,.wp_china_yes-field-dimensions .wp_china_yes--icon+input,.wp_china_yes-field-spacing .wp_china_yes--icon+input{border-top-left-radius:0!important;border-bottom-left-radius:0!important}.wp_china_yes-field-border .wp_china_yes--unit,.wp_china_yes-field-dimensions .wp_china_yes--unit,.wp_china_yes-field-spacing .wp_china_yes--unit{border-left:0;border-radius:0 4px 4px 0}.wp_china_yes-field-border .wp_china_yes--is-unit,.wp_china_yes-field-dimensions .wp_china_yes--is-unit,.wp_china_yes-field-spacing .wp_china_yes--is-unit{border-top-right-radius:0!important;border-bottom-right-radius:0!important}.wp_china_yes-field-button_set .wp_china_yes--buttons{display:inline-block}.wp_china_yes-field-button_set .wp_china_yes--button{position:relative;z-index:1;float:left;cursor:pointer;padding:7px 14px;min-width:16px;text-align:center;color:#555;border:1px solid #ccc;background-color:#f7f7f7;user-select:none;box-shadow:0 1px 0 rgba(0,0,0,.1)}.wp_china_yes-field-button_set .wp_china_yes--button:first-child{border-radius:4px 0 0 4px}.wp_china_yes-field-button_set .wp_china_yes--button:last-child{border-radius:0 4px 4px 0}.wp_china_yes-field-button_set .wp_china_yes--button:not(:first-child){margin-left:-1px}.wp_china_yes-field-button_set .wp_china_yes--button:hover{background-color:#eee}.wp_china_yes-field-button_set .wp_china_yes--active,.wp_china_yes-field-button_set .wp_china_yes--active:hover{z-index:2;color:#fff;border-color:#006799;background-color:#0085ba}.wp_china_yes-field-button_set input{display:none}.wp_china_yes-field-checkbox ul,.wp_china_yes-field-radio ul{margin:0;padding:0;list-style-type:none;overflow-y:auto;max-height:305px}.wp_china_yes-field-checkbox ul li,.wp_china_yes-field-radio ul li{margin-bottom:6px}.wp_china_yes-field-checkbox ul ul,.wp_china_yes-field-radio ul ul{max-height:none}.wp_china_yes-field-checkbox ul ul li,.wp_china_yes-field-radio ul ul li{margin-left:8px}.wp_china_yes-field-checkbox ul ul li:first-child,.wp_china_yes-field-radio ul ul li:first-child{margin-left:0}.wp_china_yes-field-checkbox input,.wp_china_yes-field-radio input{margin:0 1px}.wp_china_yes-field-checkbox .wp_china_yes--inline-list li,.wp_china_yes-field-radio .wp_china_yes--inline-list li{display:inline-block;margin-right:15px}.wp_china_yes-field-checkbox .wp_china_yes--text,.wp_china_yes-field-radio .wp_china_yes--text{margin-left:5px;vertical-align:middle}.wp_china_yes-field-checkbox .wp_china_yes-checker,.wp_china_yes-field-radio .wp_china_yes-checker{cursor:pointer}.wp_china_yes-field-checkbox .wp_china_yes-checkbox-all,.wp_china_yes-field-radio .wp_china_yes-checkbox-all{user-select:none;cursor:pointer;margin-top:5px;font-weight:500;text-decoration:none}.wp_china_yes-field-code_editor .CodeMirror{width:100%;height:400px}.wp_china_yes-field-code_editor .cm-s-default{border:1px solid #ccd0d4}.wp_china_yes-field-code_editor textarea{width:100%;height:400px}.wp_china_yes-field-color>input{opacity:.75;width:115px;max-width:100%}.wp_china_yes-field-color .button.wp-picker-clear{padding:0 8px;margin-left:6px;line-height:2.54545455;min-height:30px}.wp_china_yes-field-color_group .wp_china_yes--left{float:left;margin-right:10px;margin-bottom:5px}.wp_china_yes-field-color_group .wp_china_yes--title{color:#999;margin-bottom:5px}.wp_china_yes-field-fieldset .wp_china_yes-fieldset-content{border:1px solid #ccd0d4;background-color:#fff;box-shadow:0 1px 1px rgba(0,0,0,.04)}.wp_china_yes-field-fieldset .wp_china_yes-fieldset-content>.wp_china_yes-field{padding:15px}.wp_china_yes-field-fieldset .wp_china_yes-field-subheading{font-size:13px}.wp_china_yes-field-date input{margin:0}.wp_china_yes-field-date .wp_china_yes--to{margin-left:7px}.wp_china_yes-datepicker-wrapper{margin-top:5px;width:auto;background-color:#fff;z-index:9999999!important;box-shadow:0 0 30px rgba(0,0,0,.15)}.wp_china_yes-datepicker-wrapper *{float:none;margin:0;padding:0;font-family:inherit;font-weight:400;font-style:normal;text-decoration:none;border:0;border-radius:0;box-shadow:none}.wp_china_yes-datepicker-wrapper .ui-datepicker-header,.wp_china_yes-datepicker-wrapper .ui-widget-header{color:#fff;background:#00a0d2}.wp_china_yes-datepicker-wrapper .ui-datepicker-header .ui-state-hover{cursor:pointer}.wp_china_yes-datepicker-wrapper .ui-datepicker-title{font-size:14px;line-height:40px;text-align:center}.wp_china_yes-datepicker-wrapper .ui-datepicker-next,.wp_china_yes-datepicker-wrapper .ui-datepicker-prev{position:static;top:auto;left:auto;right:auto;font-family:"Font Awesome 5 Pro","Font Awesome 5 Free",FontAwesome;font-weight:900;font-size:12px;text-align:center;width:41px;height:40px;line-height:40px;color:#fff;background-color:rgba(255,255,255,.1);text-rendering:auto;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale}.wp_china_yes-datepicker-wrapper .ui-datepicker-next span,.wp_china_yes-datepicker-wrapper .ui-datepicker-prev span{display:none}.wp_china_yes-datepicker-wrapper .ui-datepicker-prev{float:left}.wp_china_yes-datepicker-wrapper .ui-datepicker-next{float:right}.wp_china_yes-datepicker-wrapper .ui-datepicker-prev:before{content:"\f053"}.wp_china_yes-datepicker-wrapper .ui-datepicker-next:before{content:"\f054"}.wp_china_yes-datepicker-wrapper .ui-datepicker-next-hover,.wp_china_yes-datepicker-wrapper .ui-datepicker-prev-hover{opacity:.75}.wp_china_yes-datepicker-wrapper tbody .ui-datepicker-week-col{background-color:#f7f7f7}.wp_china_yes-datepicker-wrapper .ui-datepicker-buttonpane{padding:10px;text-align:center;background-color:#f7f7f7}.wp_china_yes-datepicker-wrapper .ui-datepicker-buttonpane button{cursor:pointer;margin:0 5px;padding:7px 14px;border:1px solid #eee;background-color:#fff}.wp_china_yes-datepicker-wrapper select{margin:0 4px}.wp_china_yes-datepicker-wrapper select option{color:#555}.wp_china_yes-datepicker-wrapper table{font-size:13px;border-collapse:collapse;width:100%}.wp_china_yes-datepicker-wrapper thead{color:#fff;background:#32373c}.wp_china_yes-datepicker-wrapper th{text-align:center;padding:7px;border:1px solid #444}.wp_china_yes-datepicker-wrapper td{text-align:center;border:1px solid #f4f4f4}.wp_china_yes-datepicker-wrapper td.ui-datepicker-other-month{border:transparent}.wp_china_yes-datepicker-wrapper td .ui-state-default{color:#555;width:auto;display:block;padding:6px 12px}.wp_china_yes-datepicker-wrapper td .ui-state-active,.wp_china_yes-datepicker-wrapper td .ui-state-hover{color:#fff;background-color:#0073aa}.wp_china_yes-datepicker-wrapper td.ui-state-disabled .ui-state-default{opacity:.5}.wp_china_yes-field-datetime input{margin:0}.wp_china_yes-field-datetime .wp_china_yes--to{margin-left:7px}.wp_china_yes-flatpickr input,.wp_china_yes-flatpickr select{min-height:auto}.wp_china_yes-flatpickr input:focus,.wp_china_yes-flatpickr select:focus{box-shadow:none}.wp_china_yes-flatpickr.open{z-index:9999999!important}.wp_china_yes-field-gallery ul{margin:0;padding:0;list-style-type:none}.wp_china_yes-field-gallery ul li{display:inline-block;position:relative;padding:4px;margin:0 5px 10px 0;border:1px solid #ccc;background-color:#f9f9f9;border-radius:2px;box-shadow:0 1px 0 rgba(0,0,0,.08)}.wp_china_yes-field-gallery ul li img{max-height:60px;display:inline-block;vertical-align:middle}.wp_china_yes-field-gallery .button{margin-right:5px;margin-bottom:5px}.wp_china_yes-field-group .wp_china_yes-cloneable-hidden{display:none!important}.wp_china_yes-field-group .wp_china_yes-cloneable-wrapper{position:relative}.wp_china_yes-field-group .wp_china_yes-cloneable-item{display:none;position:relative;margin-bottom:5px}.wp_china_yes-field-group .wp_china_yes-cloneable-item h4{font-size:1em}.wp_china_yes-field-group .ui-accordion .wp_china_yes-cloneable-item{display:block}.wp_china_yes-field-group .wp_china_yes-cloneable-content{border:1px solid #ccd0d4;background-color:#fff;box-shadow:0 1px 1px rgba(0,0,0,.04)}.wp_china_yes-field-group .wp_china_yes-cloneable-content>.wp_china_yes-field{padding:15px}.wp_china_yes-field-group .wp_china_yes-cloneable-title{display:block;cursor:pointer;position:relative;user-select:none;margin:0;padding:15px 65px 15px 10px;min-height:0;font-size:100%;border:1px solid #ccd0d4;background-color:#fafafa;box-shadow:0 1px 1px rgba(0,0,0,.04);transition:border-color .15s}.wp_china_yes-field-group .wp_china_yes-cloneable-title:active,.wp_china_yes-field-group .wp_china_yes-cloneable-title:focus,.wp_china_yes-field-group .wp_china_yes-cloneable-title:hover{border-color:#999;outline:0}.wp_china_yes-field-group .wp_china_yes-cloneable-helper{position:absolute;top:12px;right:10px;z-index:1;font-size:14px;line-height:1em}.wp_china_yes-field-group .wp_china_yes-cloneable-helper i{display:inline-block;cursor:pointer;padding:5px;color:#999}.wp_china_yes-field-group .wp_china_yes-cloneable-helper i:hover{color:#555}.wp_china_yes-field-group .wp_china_yes-cloneable-content{padding:0;border-top:0}.wp_china_yes-field-group .wp_china_yes-cloneable-title-number,.wp_china_yes-field-group .wp_china_yes-cloneable-title-prefix{margin-right:5px}.wp_china_yes-field-group .wp_china_yes-cloneable-alert{display:none;margin-bottom:5px;padding:10px 20px;color:#a94442;border:1px solid #ebccd1;background-color:#f2dede}.wp_china_yes-field-group .widget-placeholder{margin-bottom:10px;border:1px dashed #f1c40f;background-color:#fffae4}.wp_china_yes-field-group .wp_china_yes-cloneable-header-icon{display:inline-block;text-align:center;font-size:14px;width:17px;text-indent:0;vertical-align:text-top}.wp_china_yes-field-group .wp_china_yes-cloneable-placeholder{background-color:#ddd;margin-top:4px;width:100px;height:10px;font-size:10px;line-height:10px;display:inline-block;vertical-align:top;border-radius:2px}.wp_china_yes-field-icon .wp_china_yes-icon-select{display:flex;grid-gap:5px}.wp_china_yes-field-icon .wp_china_yes-icon-preview:not(.hidden){display:flex}.wp_china_yes-field-icon .wp_china_yes-icon-preview i{display:flex;justify-content:center;align-items:center;width:30px;font-size:14px;text-align:center;vertical-align:top;color:#555;border:1px solid #ccc;background-color:#f7f7f7;border-radius:3px;box-shadow:0 1px 0 rgba(0,0,0,.08)}.wp_china_yes-field-image_select .wp_china_yes--image{display:inline-block;margin:0 5px 5px 0}.wp_china_yes-field-image_select .wp_china_yes--inline-list .wp_china_yes--image{display:block}.wp_china_yes-field-image_select figure{cursor:pointer;position:relative;display:inline-block;max-width:100%;margin:0;vertical-align:bottom;border:2px solid transparent;background-color:#fff;user-select:none;transition:all .2s}.wp_china_yes-field-image_select figure:before{position:absolute;top:0;left:0;text-align:center;font-size:10px;font-family:"Font Awesome 5 Pro","Font Awesome 5 Free",FontAwesome;font-weight:900;content:"\f00c";width:16px;height:16px;line-height:14px;opacity:0;color:#fff;background-color:#222;transition:opacity .2s}.wp_china_yes-field-image_select .wp_china_yes--active figure{border-color:#222;box-shadow:0 0 20px rgba(0,0,0,.2)}.wp_china_yes-field-image_select .wp_china_yes--active figure:before{opacity:1}.wp_china_yes-field-image_select img{max-width:100%;height:auto;vertical-align:top}.wp_china_yes-field-image_select input{display:none}.wp_china_yes-field-link_color .wp_china_yes--left{float:left;margin-right:10px;margin-bottom:5px}.wp_china_yes-field-link_color .wp_china_yes--title{color:#777;margin-bottom:5px}.wp_china_yes-field-map input{width:100%}.wp_china_yes-field-map input[type=text].ui-autocomplete-loading{background-position-x:calc(100% - 5px)}.wp_china_yes-field-map .wp_china_yes--map-search+.wp_china_yes--map-osm-wrap{margin-top:10px}.wp_china_yes-field-map .wp_china_yes--map-osm-wrap{position:relative;padding:5px;border:1px solid #eee;background-color:#fff;box-shadow:0 1px 1px rgba(0,0,0,.04)}.wp_china_yes-field-map .wp_china_yes--map-osm{position:relative;z-index:1;min-height:250px}.wp_china_yes-field-map .wp_china_yes--map-inputs{margin-top:10px;display:flex;justify-content:space-between}.wp_china_yes-field-map .wp_china_yes--map-input{flex:1}.wp_china_yes-field-map .wp_china_yes--map-input:last-child{padding-left:10px}.wp_china_yes-field-map label{display:block;color:#777;font-size:12px;margin:0 0 2px 0}.wp_china_yes-map-ui-autocomplate{z-index:999999;border-radius:4px;overflow:hidden}.wp_china_yes-field-media .wp_china_yes--placeholder{display:flex;align-items:flex-start}.wp_china_yes-field-media .wp_china_yes--placeholder input{width:100%;margin:0}.wp_china_yes-field-media .button{margin-left:5px}.wp_china_yes-field-media .hidden+.button{margin-left:0}.wp_china_yes-field-media .wp_china_yes--preview{position:relative}.wp_china_yes-field-palette .wp_china_yes--palette{position:relative;display:inline-block;cursor:pointer;border:2px solid #ddd;margin-right:10px;margin-bottom:10px;user-select:none;-webkit-user-select:none;transition:all .2s}.wp_china_yes-field-palette .wp_china_yes--palette span{vertical-align:middle;display:inline-block;width:22px;height:60px;line-height:60px;overflow:hidden;text-indent:-999px}.wp_china_yes-field-palette .wp_china_yes--palette:before{position:absolute;top:0;left:0;text-align:center;font-size:10px;font-family:"Font Awesome 5 Pro","Font Awesome 5 Free",FontAwesome;font-weight:900;content:"\f00c";width:16px;height:16px;line-height:14px;opacity:0;color:#fff;background-color:#222;transition:opacity .2s}.wp_china_yes-field-palette .wp_china_yes--active{border-color:#222;box-shadow:0 0 20px rgba(0,0,0,.2)}.wp_china_yes-field-palette .wp_china_yes--active:before{opacity:1}.wp_china_yes-field-palette input{display:none}.wp_china_yes-field-repeater .wp_china_yes-field-text input{width:100%}.wp_china_yes-field-repeater .wp_china_yes-repeater-hidden{display:none!important}.wp_china_yes-field-repeater .wp_china_yes-repeater-wrapper .wp_china_yes-repeater-item{display:table;width:100%;margin-bottom:5px;border:1px solid #eee}.wp_china_yes-field-repeater .wp_china_yes-repeater-wrapper .wp_china_yes-repeater-item h4{font-size:1em}.wp_china_yes-field-repeater .wp_china_yes-repeater-content{width:100%;display:table-cell;vertical-align:middle;background-color:#fff}.wp_china_yes-field-repeater .wp_china_yes-repeater-content>.wp_china_yes-field{padding:15px}.wp_china_yes-field-repeater .wp_china_yes-repeater-helper{width:100%;display:table-cell;vertical-align:middle;text-align:center;font-size:14px;line-height:1em;border-left:1px solid #eee;background-color:#f7f7f7}.wp_china_yes-field-repeater .wp_china_yes-repeater-helper i{display:inline-block;cursor:pointer;color:#999;padding:5px}.wp_china_yes-field-repeater .wp_china_yes-repeater-helper i:hover{color:#555}.wp_china_yes-field-repeater .wp_china_yes-repeater-helper-inner{width:75px}.wp_china_yes-field-repeater .wp_china_yes-repeater-alert{display:none;margin-bottom:5px;padding:10px 20px;color:#a94442;border:1px solid #ebccd1;background-color:#f2dede}.wp_china_yes-field-repeater .widget-placeholder{height:50px;margin-bottom:3px;border:1px dashed #f1c40f;background-color:#fffae4}.wp_china_yes-field-repeater .ui-sortable-helper{height:50px!important;overflow:hidden!important;border-color:#ccc!important;background-color:#eee!important;opacity:.5}.wp_china_yes-field-repeater .ui-sortable-helper .wp_china_yes-repeater-content,.wp_china_yes-field-repeater .ui-sortable-helper .wp_china_yes-repeater-helper{display:none}.wp_china_yes-field-select .wp_china_yes-fieldset{min-height:30px}.wp_china_yes-field-select .wp_china_yes-chosen{display:none}.wp_china_yes-field-select select{max-width:100%;margin:0}.wp_china_yes-field-select .wp_china_yes-hide-select{display:none!important}.wp_china_yes-field-slider .wp_china_yes--wrap{display:flex;align-items:center}.wp_china_yes-field-slider .wp_china_yes--input{display:flex}.wp_china_yes-field-slider .wp_china_yes--unit{display:flex;justify-content:center;flex-direction:column;user-select:none;padding:0 6px;font-size:11px;line-height:1;border-radius:0 4px 4px 0;color:#555;border:1px solid #7e8993;border-left:0;background-color:#f5f5f5}.wp_china_yes-field-slider .wp_china_yes-slider-ui{margin-right:15px}.wp_china_yes-field-slider input[type=number]{position:relative;z-index:1;margin:0;width:50px;text-align:center}.wp_china_yes-field-slider .wp_china_yes--is-unit{border-top-right-radius:0!important;border-bottom-right-radius:0!important}.wp_china_yes-field-slider .ui-slider{position:relative;width:100%;height:3px;border:none;background:#ddd;border-radius:2px}.wp_china_yes-field-slider .ui-slider-range{height:3px;border:none;background:#333;border-radius:2px}.wp_china_yes-field-slider .ui-slider-handle{position:absolute;width:16px;height:16px;top:-7px;margin-left:-8px;border:none;background:#333;border-radius:2px}.wp_china_yes-field-slider .ui-slider-handle:hover,.wp_china_yes-field-slider .ui-state-active{cursor:pointer;background:#111}.wp_china_yes-field-sortable .wp_china_yes-field-text input{width:100%;max-width:100%}.wp_china_yes-field-sortable .wp_china_yes-sortable .wp_china_yes-sortable-item{display:table;width:100%;margin-bottom:5px;border:1px solid #eee}.wp_china_yes-field-sortable .wp_china_yes-sortable .wp_china_yes-sortable-item h4{font-size:1em}.wp_china_yes-field-sortable .wp_china_yes-sortable-content{width:100%;display:table-cell;vertical-align:middle;background-color:#fff}.wp_china_yes-field-sortable .wp_china_yes-sortable-content>.wp_china_yes-field{padding:15px}.wp_china_yes-field-sortable .wp_china_yes-sortable-helper{width:100%;display:table-cell;vertical-align:middle;text-align:center;font-size:14px;line-height:1em;border-left:1px solid #eee;background-color:#f7f7f7}.wp_china_yes-field-sortable .wp_china_yes-sortable-helper i{display:inline-block;cursor:pointer;width:50px;color:#555}.wp_china_yes-field-sortable .wp_china_yes-sortable-helper i:hover{opacity:.5}.wp_china_yes-field-sortable .widget-placeholder{height:50px;margin-bottom:3px;border:1px dashed #f1c40f;background-color:#fffae4}.wp_china_yes-field-sortable .ui-sortable-helper{height:50px!important;overflow:hidden!important;border-color:#ccc!important;background-color:#eee!important;opacity:.5}.wp_china_yes-field-sortable .ui-sortable-helper .wp_china_yes-sortable-content,.wp_china_yes-field-sortable .ui-sortable-helper .wp_china_yes-sortable-helper{display:none}.wp_china_yes-field-sorter .ui-sortable-placeholder{height:20px;border:1px dashed #f1c40f;background-color:#fffae4}.wp_china_yes-field-sorter .wp_china_yes-modules{float:left;width:50%;box-sizing:border-box}.wp_china_yes-field-sorter .wp_china_yes-modules:first-child{padding-right:15px}.wp_china_yes-field-sorter .wp_china_yes-modules:last-child{padding-left:15px}.wp_china_yes-field-sorter .wp_china_yes-disabled,.wp_china_yes-field-sorter .wp_china_yes-enabled{padding:5px 15px;border:1px dashed #ddd;background-color:#fff}.wp_china_yes-field-sorter .wp_china_yes-disabled li{opacity:.5;transition:opacity .15s}.wp_china_yes-field-sorter .wp_china_yes-disabled .ui-sortable-helper{opacity:1}.wp_china_yes-field-sorter .wp_china_yes-sorter-title{font-size:13px;font-weight:600;padding:10px;text-align:center;border:1px dashed #ddd;border-bottom:none;background-color:#f8f8f8;text-transform:uppercase}.wp_china_yes-field-sorter ul{list-style-type:none;margin:0;padding:0;min-height:62px}.wp_china_yes-field-sorter ul li{margin:10px 0;padding:10px 15px;cursor:move;font-weight:700;text-align:center;border:1px solid #e5e5e5;background-color:#fafafa;transition:border-color .15s}.wp_china_yes-field-sorter ul li:hover{border-color:#bbb}.wp_china_yes-field-spinner .wp_china_yes--spin{display:flex}.wp_china_yes-field-spinner .ui-widget{font-family:inherit}.wp_china_yes-field-spinner .ui-spinner{display:flex;align-items:stretch;overflow:unset;border:none;background:0 0;border-radius:0}.wp_china_yes-field-spinner .ui-spinner .ui-button{display:flex;flex-direction:column;justify-content:center;text-align:center;min-width:20px;padding:0 4px;margin:0;color:#555;background-color:#f5f5f5;border:1px solid #7e8993}.wp_china_yes-field-spinner .ui-spinner .ui-spinner-button{position:relative;cursor:pointer;height:auto}.wp_china_yes-field-spinner .ui-spinner .ui-spinner-button:hover{background-color:#e7e7e7}.wp_china_yes-field-spinner .ui-spinner .ui-spinner-button:active{background-color:#ddd}.wp_china_yes-field-spinner .ui-spinner .ui-spinner-button:before{font-family:"Font Awesome 5 Pro","Font Awesome 5 Free",FontAwesome;font-weight:900;font-size:14px;line-height:14px}.wp_china_yes-field-spinner .ui-spinner .ui-spinner-down{border-right:0;border-radius:4px 0 0 4px}.wp_china_yes-field-spinner .ui-spinner .ui-spinner-down:before{content:"\f0d9"}.wp_china_yes-field-spinner .ui-spinner .ui-spinner-up{border-left:0;border-radius:0 4px 4px 0}.wp_china_yes-field-spinner .ui-spinner .ui-spinner-up:before{content:"\f0da"}.wp_china_yes-field-spinner .ui-spinner .wp_china_yes--unit{border-left:0;user-select:none}.wp_china_yes-field-spinner .ui-spinner .ui-button-icon,.wp_china_yes-field-spinner .ui-spinner .ui-button-icon-space,.wp_china_yes-field-spinner .ui-spinner .ui-button-text{display:none}.wp_china_yes-field-spinner .ui-spinner input{font-family:inherit;font-size:inherit;position:relative;z-index:1;width:50px;text-align:center;margin:0;padding:0 8px;border-radius:0}.wp_china_yes-field-spinner .ui-spinner-down{order:1}.wp_china_yes-field-spinner .ui-spinner-input{order:2}.wp_china_yes-field-spinner .wp_china_yes--unit{order:3}.wp_china_yes-field-spinner .ui-spinner-up{order:4}.wp_china_yes-field-switcher .wp_china_yes--switcher{float:left;cursor:pointer;position:relative;width:60px;height:26px;padding:0;margin:0;overflow:hidden;border-radius:4px;background-color:#ed6f6f;user-select:none;-webkit-user-select:none}.wp_china_yes-field-switcher .wp_china_yes--ball{position:absolute;top:4px;left:4px;width:24px;height:18px;background-color:#fff;border-radius:4px;transition:all .1s;box-shadow:1px 1px 1px rgba(0,0,0,.15)}.wp_china_yes-field-switcher .wp_china_yes--off,.wp_china_yes-field-switcher .wp_china_yes--on{position:absolute;top:0;left:0;right:0;font-size:11px;line-height:26px;font-weight:500;font-style:normal;text-align:center;text-transform:uppercase;color:#fff;padding-right:28px;opacity:0;transition:all .1s}.wp_china_yes-field-switcher .wp_china_yes--off{padding-right:0;padding-left:28px;opacity:1}.wp_china_yes-field-switcher .wp_china_yes--active{background:#4fb845}.wp_china_yes-field-switcher .wp_china_yes--active .wp_china_yes--on{opacity:1}.wp_china_yes-field-switcher .wp_china_yes--active .wp_china_yes--off{opacity:0}.wp_china_yes-field-switcher .wp_china_yes--active .wp_china_yes--ball{left:100%;margin-left:-28px}.wp_china_yes-field-switcher .wp_china_yes--label{float:left;margin-top:4px;margin-left:8px;font-weight:400;color:#999}.wp_china_yes-field-tabbed .wp_china_yes-tabbed-content{border:1px solid #ccd0d4;background-color:#fff;box-shadow:0 1px 1px rgba(0,0,0,.04)}.wp_china_yes-field-tabbed .wp_china_yes-tabbed-content>.wp_china_yes-field{padding:15px}.wp_china_yes-field-tabbed .wp_china_yes-tabbed-nav .wp_china_yes--icon{padding-right:5px}.wp_china_yes-field-tabbed .wp_china_yes-tabbed-nav a{display:inline-block;padding:12px 15px;margin-top:1px;margin-right:5px;margin-bottom:-1px;position:relative;text-decoration:none;color:#444;font-weight:600;border:1px solid #ccd0d4;background-color:#f3f3f3;transition:all .2s}.wp_china_yes-field-tabbed .wp_china_yes-tabbed-nav a:hover{background-color:#f9f9f9}.wp_china_yes-field-tabbed .wp_china_yes-tabbed-nav a.wp_china_yes-tabbed-active{background-color:#fff;border-bottom-color:#fff}.wp_china_yes-field-tabbed .wp_china_yes-tabbed-nav a:focus{outline:0;box-shadow:none}.wp_china_yes-field-text input{width:50%;max-width:100%;margin:0}.wp_china_yes-field-textarea textarea{width:100%;max-width:100%;min-height:125px}.wp_china_yes-field-textarea .wp_china_yes-shortcode-button{margin-bottom:10px;margin-right:5px}.wp_china_yes-field-typography select,.wp_china_yes-field-typography textarea{margin:0;min-width:100%;max-width:100%}.wp_china_yes-field-typography .wp_china_yes--title{color:#777;margin:0 0 2px 0;font-size:12px}.wp_china_yes-field-typography .wp_china_yes--title small{vertical-align:top}.wp_china_yes-field-typography .wp_china_yes--blocks{display:flex;flex-wrap:wrap}.wp_china_yes-field-typography .wp_china_yes--block{flex:1;max-width:100%;padding-right:6px;padding-bottom:6px}.wp_china_yes-field-typography .wp_china_yes--input{margin:0;min-width:100%}.wp_china_yes-field-typography .wp_china_yes--input-wrap{position:relative}.wp_china_yes-field-typography .wp_china_yes--unit{position:absolute;z-index:1;right:4px;top:4px;bottom:4px;padding:2px 6px;color:#666;font-size:11px;line-height:1;border-radius:2px;background:#eee;user-select:none;display:flex;justify-content:center;flex-direction:column}.wp_china_yes-field-typography .wp_china_yes--preview{font-size:16px;line-height:20px;padding:20px;color:#222;border:1px solid #eee;background-color:#fff;border-radius:2.5px;user-select:none;-webkit-user-select:none;transition:background-color .2s,border-color .2s}.wp_china_yes-field-typography .wp_china_yes--block-preview{cursor:pointer;position:relative;overflow:hidden;margin-top:10px;max-width:100%}.wp_china_yes-field-typography .wp_china_yes--black-background{border-color:#000;background-color:#000}.wp_china_yes-field-typography .wp_china_yes--toggle{position:absolute;top:5px;right:10px;color:#999}.wp_china_yes-field-typography .wp_china_yes--block-extra-styles{margin-top:5px}.wp_china_yes-field-upload input{width:100%;margin:0}.wp_china_yes-field-upload .wp_china_yes--wrap{display:flex;align-items:flex-start}.wp_china_yes-field-upload .button{margin-left:5px}.wp_china_yes-field-upload .wp_china_yes--preview{position:relative}.wp_china_yes-field-wp_editor .wp_china_yes-wp-editor{float:left;width:100%}.wp_china_yes-field-wp_editor .mce-toolbar-grp{border:none}.wp_china_yes-field-wp_editor .mce-btn.mce-active button,.wp_china_yes-field-wp_editor .mce-btn.mce-active i,.wp_china_yes-field-wp_editor .mce-btn.mce-active:hover button,.wp_china_yes-field-wp_editor .mce-btn.mce-active:hover i{color:#23282d}.wp_china_yes-field-wp_editor .wp-media-buttons{position:relative;z-index:2}.wp_china_yes-field-wp_editor .wp-editor-tabs{position:relative;z-index:1}.wp_china_yes-field-wp_editor .wp_china_yes-no-tinymce{border:1px solid #e5e5e5}.wp_china_yes-field-wp_editor .wp_china_yes-no-quicktags .wp-media-buttons{float:none;display:block}.wp_china_yes-field-wp_editor .wp_china_yes-no-quicktags .mce-tinymce{box-shadow:none;border:1px solid #e5e5e5}.wp_china_yes-field-wp_editor textarea{width:100%;max-width:100%;margin:0;box-shadow:none}.wp_china_yes-field-heading{font-size:1.5em;font-weight:700;color:#23282d;background-color:#f5f5f5}.wp_china_yes-field-subheading{font-size:14px;font-weight:700;padding-top:17px;padding-bottom:17px;color:#23282d;background-color:#f7f7f7}.wp_china_yes-field-submessage{padding:0!important;border:0!important}.wp_china_yes-field-submessage+.wp_china_yes-field{border-top:0!important}.wp_china_yes-submessage{font-size:12px;padding:17px 30px;border-top:1px solid transparent;border-bottom:1px solid transparent}.wp_china_yes-submessage-success{color:#3c763d;border-color:#d6e9c6;background-color:#dff0d8}.wp_china_yes-submessage-info{color:#31708f;border-color:#bce8f1;background-color:#d9edf7}.wp_china_yes-submessage-warning{color:#8a6d3b;border-color:#faebcc;background-color:#fcf8e3}.wp_china_yes-submessage-danger{color:#a94442;border-color:#ebccd1;background-color:#f2dede}.wp_china_yes-submessage-normal{color:#23282d;border-color:#eee;background-color:#f7f7f7}.wp_china_yes-field-notice{background-color:#f7f7f7}.wp_china_yes-notice{padding:12px;background-color:#fff;border-left-style:solid;border-left-width:4px;box-shadow:0 1px 1px rgba(0,0,0,.1)}.wp_china_yes-notice-success{border-color:#46b450}.wp_china_yes-notice-info{border-color:#339fd4}.wp_china_yes-notice-warning{border-color:#ffbc00}.wp_china_yes-notice-danger{border-color:#dc3232}.wp_china_yes-notice-normal{border-color:#222}.wp_china_yes-field-number input{width:100%;margin:0}.wp_china_yes-field-number .wp_china_yes--wrap{position:relative;float:left;width:100px}.wp_china_yes-field-number .wp_china_yes--unit{position:absolute;z-index:1;right:4px;top:4px;bottom:4px;padding:2px 6px;color:#666;font-size:11px;line-height:1;border-radius:2px;background:#eee;user-select:none;display:flex;justify-content:center;flex-direction:column}.wp_china_yes-field-link .wp_china_yes--result{display:inline-block;font-size:12px;line-height:16px;padding:7px 10px;margin-bottom:7px;color:#777;border:1px solid #e5e5e5;background-color:#f5f5f5;border-radius:2px;world-break:break-word}.wp_china_yes-field-link .wp_china_yes--wrap{position:relative;float:left;width:100px}.wp_china_yes-field-link .wp_china_yes--unit{position:absolute;z-index:1;right:4px;top:4px;bottom:4px;padding:2px 6px;color:#666;font-size:11px;line-height:1;border-radius:2px;background:#eee;user-select:none;display:flex;justify-content:center;flex-direction:column}.wp_china_yes-help{cursor:help;position:absolute;top:0;right:0;padding:5px;font-size:13px;color:#aaa}.wp_china_yes-help .wp_china_yes-help-text{display:none}.wp_china_yes--preview{max-width:100%}.wp_china_yes-image-preview{display:inline-flex;align-items:center;justify-content:center;flex-direction:column;position:relative;padding:6px;max-width:120px;max-height:120px;min-width:40px;min-height:40px;margin-bottom:10px;text-align:center;border-radius:2px;border:1px solid #ccc;background-color:#f9f9f9;box-shadow:0 1px 0 rgba(0,0,0,.08)}.wp_china_yes-image-preview i{cursor:pointer;position:absolute;z-index:1;right:4px;top:4px;font-size:14px;width:22px;height:22px;line-height:22px;text-align:center;text-decoration:none;color:#fff;background-color:#d33;opacity:.75;border-radius:2px;transition:all .2s}.wp_china_yes-image-preview i:hover{opacity:1}.wp_china_yes-image-preview i:focus{box-shadow:none}.wp_china_yes-image-preview span{position:relative;overflow:hidden;display:flex;height:100%;width:100%}.wp_china_yes-image-preview img{max-width:100%;height:auto;object-fit:contain}.wp_china_yes-field-custom .wp_china_yes-field{padding:0}.wp_china_yes-field .chosen-container-single .chosen-single{height:28px;line-height:26px}.wp_china_yes-field .chosen-container-single .chosen-single abbr{top:0;right:20px;font-family:"Font Awesome 5 Pro","Font Awesome 5 Free",FontAwesome;font-weight:900;font-size:12px;height:100%;width:18px;color:#aaa;text-align:center;background:0 0}.wp_china_yes-field .chosen-container-single .chosen-single abbr:before{content:"\f00d"}.wp_china_yes-field .chosen-container-single .chosen-single abbr:hover{color:#555}.wp_china_yes-field .chosen-container-multi .chosen-choices li.search-choice .search-choice-close{font-family:"Font Awesome 5 Pro","Font Awesome 5 Free",FontAwesome;font-weight:900;font-size:12px;height:100%;width:18px;color:#aaa;text-align:center;background:0 0}.wp_china_yes-field .chosen-container-multi .chosen-choices li.search-choice .search-choice-close:before{content:"\f00d";display:inline-block;padding-top:3px}.wp_china_yes-field .chosen-container-multi .chosen-choices li.search-choice .search-choice-close:hover{color:#555}.wp_china_yes-field .chosen-container-single .chosen-single div b{font-family:"Font Awesome 5 Pro","Font Awesome 5 Free",FontAwesome;font-weight:900;font-size:14px;color:#aaa;background:0 0}.wp_china_yes-field .chosen-container-single .chosen-single div b:before{content:"\f107"}.wp_china_yes-field .chosen-container-single .chosen-single div b:hover{color:#555}.wp_china_yes-field .chosen-container-multi .chosen-choices li.search-choice-placeholder{border:1px dashed #aaa;margin:3px 5px 3px 0}.wp_china_yes-field .chosen-container-multi .ui-sortable li.search-choice span{cursor:move}.wp_china_yes-field .chosen-container-active.chosen-with-drop .chosen-single div b:before{content:"\f106"}.wp_china_yes-field .chosen-container-single .chosen-single-with-deselect span{margin-right:40px}.wp_china_yes-field .chosen-container-single .chosen-search input[type=text]{background:0 0}.wp_china_yes-field .chosen-container-single .chosen-search:before{font-family:"Font Awesome 5 Pro","Font Awesome 5 Free",FontAwesome;font-weight:900;font-size:11px;content:"\f002";position:absolute;right:12px;top:10px;color:#aaa}.wp_china_yes-field .wp-picker-container{display:inline-block}.wp_china_yes-field .wp-picker-container .wp-color-result.button{margin-bottom:0}.wp_china_yes-field .wp_china_yes--transparent-wrap{display:none;position:relative;top:-1px;width:235px;padding:9px 10px;border:1px solid #dfdfdf;border-top:none;background-color:#fff}.wp_china_yes-field .wp-picker-active .wp_china_yes--transparent-wrap{display:block}.wp_china_yes-field .wp_china_yes--transparent-slider{position:absolute;width:190px;margin-left:2px;height:18px}.wp_china_yes-field .wp_china_yes--transparent-slider .ui-slider-handle{position:absolute;top:-3px;bottom:-3px;z-index:5;border-color:#aaa;border-style:solid;border-width:4px 3px;width:10px;height:16px;margin:0 -5px;background:0 0;cursor:ew-resize;opacity:.9;border-radius:4px;box-shadow:0 1px 2px rgba(0,0,0,.2)}.wp_china_yes-field .wp_china_yes--transparent-slider .ui-slider-handle:before{content:" ";position:absolute;left:-2px;right:-2px;top:-3px;bottom:-3px;border:2px solid #fff;border-radius:3px}.wp_china_yes-field .wp_china_yes--transparent-offset{height:18px;width:200px;background:url(../images/checkerboard.png) repeat-y center left scroll #fff;border-radius:2px;box-shadow:inset 0 0 5px rgba(0,0,0,.4)}.wp_china_yes-field .wp_china_yes--transparent-text{position:absolute;top:12px;right:10px;width:30px;font-size:12px;line-height:12px;text-align:center;color:#999}.wp_china_yes-field .wp_china_yes--transparent-button{cursor:pointer;user-select:none;margin-top:10px;font-size:11px;text-align:center;border-radius:2px;padding:3px 7px;box-shadow:0 1px 0 rgba(0,0,0,.1);letter-spacing:.2px;color:#777;border:1px solid #ccc;background-color:#f7f7f7;transition:background-color .2s,border-color .2s,color .2s}.wp_china_yes-field .wp_china_yes--transparent-active .wp-color-result{background-image:url(../images/checkerboard.png);background-size:135px;background-position:center left;background-color:transparent!important}.wp_china_yes-field .wp_china_yes--transparent-active .wp_china_yes--transparent-button{color:#fff;border-color:#3ea032;background-color:#4fb845}.wp_china_yes-field .wp_china_yes--transparent-active .fa:before{content:"\f205"}.wp_china_yes-widgets>.wp_china_yes-field{position:relative;top:-1px;margin-left:-15px;margin-right:-15px;padding:12px 15px}.wp_china_yes-widgets>.wp_china_yes-field .wp_china_yes-title{float:none;width:100%;margin-bottom:5px}.wp_china_yes-widgets>.wp_china_yes-field .wp_china_yes-fieldset{float:none;width:100%}.wp_china_yes-widgets .wp_china_yes-field-text input{width:100%}.wp_china_yes-widgets .wp_china_yes-field-notice .wp_china_yes-notice{padding:15px}.control-section .wp_china_yes-widgets>.wp_china_yes-field{margin-left:-10px;margin-right:-10px;padding:10px 12px}.wp-block .wp_china_yes-widgets{font-size:13px}.wp-block .wp_china_yes-widgets>.wp_china_yes-field{margin-left:-10px;margin-right:-10px}.wp-block .wp_china_yes-widgets>.wp_china_yes-field .button-primary{color:#fff}.wp-block .wp_china_yes-widgets>.wp_china_yes-field>.wp_china_yes-title>h4{font-size:13px}.control-section .wp_china_yes-field{padding:0}.control-section .wp_china_yes-field .wp_china_yes-title{float:none;width:100%;margin-bottom:6px}.control-section .wp_china_yes-field .wp_china_yes-title h4{display:block;font-size:13px;line-height:1;font-weight:600;color:inherit}.control-section .wp_china_yes-field .wp_china_yes-fieldset{float:none;width:100%}.control-section .wp_china_yes-help{top:-5px;right:-5px}.control-section .wp_china_yes-field-select select{width:100%}.control-section .wp_china_yes-field-heading{color:inherit;font-size:14px;line-height:1em;margin-right:-15px;margin-left:-15px;padding:15px}.control-section .wp_china_yes-field-subheading{color:inherit;font-size:11px;margin-right:-15px;margin-left:-15px;padding:10px 15px}.control-section .wp_china_yes-subtitle-text{margin-top:4px;font-size:12px}.control-section .wp_china_yes-field-submessage .wp_china_yes-submessage{margin-right:-15px;margin-left:-15px;padding:15px}.control-section .wp_china_yes-fieldset .wp_china_yes-field-heading,.control-section .wp_china_yes-fieldset .wp_china_yes-field-subheading,.control-section .wp_china_yes-fieldset .wp_china_yes-field-submessage .wp_china_yes-submessage{margin-left:0;margin-right:0}.control-section .wp_china_yes-field-date label,.control-section .wp_china_yes-field-datetime label{display:block}.control-section .wp_china_yes-field-date .wp_china_yes--to,.control-section .wp_china_yes-field-datetime .wp_china_yes--to{margin-top:4px;margin-left:0}.control-section .wp_china_yes-field-sorter ul li{padding:5px}.control-section .wp_china_yes-field-sorter .wp_china_yes-modules{float:none;width:100%}.control-section .wp_china_yes-field-sorter .wp_china_yes-modules:first-child{padding-right:0;padding-bottom:15px}.control-section .wp_china_yes-field-background .wp_china_yes--background-attributes{flex-direction:column}.control-section .wp_china_yes-field-spacing input{width:90px}.control-section .wp_china_yes-field-border .wp_china_yes--input{flex:1 50%}.control-section .wp_china_yes-field-border input,.control-section .wp_china_yes-field-border select{width:100%}.control-section .wp_china_yes-field-spinner input{width:50px}.control-section .wp_china_yes-field-number .wp_china_yes--wrap{width:100%}.control-section .wp_china_yes-field-backup .wp_china_yes-export-data{display:none}.control-section .wp_china_yes-field-fieldset .wp_china_yes-fieldset-content{border-color:#e5e5e5}.control-section .wp_china_yes-accordion-content>.wp_china_yes-field,.control-section .wp_china_yes-cloneable-content>.wp_china_yes-field,.control-section .wp_china_yes-fieldset-content>.wp_china_yes-field,.control-section .wp_china_yes-repeater-content>.wp_china_yes-field,.control-section .wp_china_yes-sortable-content>.wp_china_yes-field,.control-section .wp_china_yes-tabbed-content>.wp_china_yes-field{padding:10px}.control-section .wp_china_yes-accordion-content>.wp_china_yes-field .wp_china_yes-title,.control-section .wp_china_yes-cloneable-content>.wp_china_yes-field .wp_china_yes-title,.control-section .wp_china_yes-fieldset-content>.wp_china_yes-field .wp_china_yes-title,.control-section .wp_china_yes-repeater-content>.wp_china_yes-field .wp_china_yes-title,.control-section .wp_china_yes-sortable-content>.wp_china_yes-field .wp_china_yes-title,.control-section .wp_china_yes-tabbed-content>.wp_china_yes-field .wp_china_yes-title{margin-bottom:5px}.control-section .wp_china_yes-accordion-content>.wp_china_yes-field h4,.control-section .wp_china_yes-cloneable-content>.wp_china_yes-field h4,.control-section .wp_china_yes-fieldset-content>.wp_china_yes-field h4,.control-section .wp_china_yes-repeater-content>.wp_china_yes-field h4,.control-section .wp_china_yes-sortable-content>.wp_china_yes-field h4,.control-section .wp_china_yes-tabbed-content>.wp_china_yes-field h4{font-size:12px}.control-section .wp_china_yes-depend-hidden.wp_china_yes-depend-on{display:none!important}.control-section .wp_china_yes-depend-visible.wp_china_yes-depend-on{border-top:0!important}.wp_china_yes-taxonomy{max-width:95%}.wp_china_yes-taxonomy>.wp_china_yes-field{border-top:none!important}.wp_china_yes-taxonomy>.wp_china_yes-field-heading{font-size:1.1em;padding:20px!important;border:1px solid #ddd}.wp_china_yes-taxonomy>.wp_china_yes-field-subheading{font-size:12px;padding:15px!important;border:1px solid #ddd}.wp_china_yes-taxonomy>.wp_china_yes-field-submessage .wp_china_yes-submessage{padding:15px;border-left-width:1px;border-left-style:solid;border-right-width:1px;border-right-style:solid}.wp_china_yes-taxonomy>.wp_china_yes-field-notice{background-color:transparent}.wp_china_yes-taxonomy .wp_china_yes-section-title{display:block;padding:15px;background-color:#f9f9f9;border:1px solid #e5e5e5;box-shadow:0 1px 1px rgba(0,0,0,.04)}.wp_china_yes-taxonomy-add-fields>.wp_china_yes-field{padding:8px 0}.wp_china_yes-taxonomy-add-fields>.wp_china_yes-field>.wp_china_yes-title{float:none;width:100%;padding:2px 2px 4px 0}.wp_china_yes-taxonomy-add-fields>.wp_china_yes-field>.wp_china_yes-title h4{font-size:12px;font-weight:400}.wp_china_yes-taxonomy-add-fields>.wp_china_yes-field>.wp_china_yes-fieldset{float:none;width:100%}.wp_china_yes-taxonomy-add-fields>.wp_china_yes-field>.wp_china_yes-fieldset>.wp_china_yes-help{right:-5px}.wp_china_yes-taxonomy-add-fields+p.submit{margin-top:0}.wp_china_yes-taxonomy-edit-fields>.wp_china_yes-field{padding:20px 0}.wp_china_yes-taxonomy-edit-fields>.wp_china_yes-field>.wp_china_yes-title{width:200px}.wp_china_yes-taxonomy-edit-fields>.wp_china_yes-field>.wp_china_yes-title h4{font-size:14px;font-weight:600;line-height:1.3;display:inline-block;vertical-align:middle}.wp_china_yes-taxonomy-edit-fields>.wp_china_yes-field>.wp_china_yes-fieldset{width:calc(100% - 220px)}.wp_china_yes-taxonomy-edit-fields>.wp_china_yes-field>.wp_china_yes-fieldset>.wp_china_yes-help{top:-5px;right:-5px}.wp_china_yes-taxonomy-edit-fields>.wp_china_yes-field-submessage{margin:20px 0}.wp_china_yes-taxonomy-edit-fields>.wp_china_yes-field-heading,.wp_china_yes-taxonomy-edit-fields>.wp_china_yes-field-subheading{margin:20px 0;border:1px solid #ddd}.wp_china_yes-nav-menu-options{clear:both;float:left;width:100%}.wp_china_yes-nav-menu-options>.wp_china_yes-fields{margin:10px -10px;border-top:1px solid #eee;border-bottom:1px solid #eee}.wp_china_yes-nav-menu-options>.wp_china_yes-fields>.wp_china_yes-field{padding:12px}.wp_china_yes-nav-menu-options>.wp_china_yes-fields>.wp_china_yes-field .wp_china_yes-title{float:none;width:100%;margin-bottom:5px}.wp_china_yes-nav-menu-options>.wp_china_yes-fields>.wp_china_yes-field .wp_china_yes-fieldset{float:none;width:100%}.wp_china_yes-nav-menu-options .wp_china_yes-field-text input{width:100%}.wp_china_yes-nav-menu-options .wp_china_yes-field-notice .wp_china_yes-notice{padding:15px}.wp_china_yes-nav-menu-title{padding:12px;background-color:#f5f5f5;border-top:1px solid #eee;border-bottom:1px solid #eee}.wp_china_yes-nav-menu-title:first-child{border-top:0}.wp_china_yes-nav-menu-title h4{margin:0;padding:0;color:#23282d}.wp_china_yes-nav-menu-icon{margin-right:5px}.wp_china_yes-profile-options>h2>.fa{padding-right:7px}.wp_china_yes-profile-options>.wp_china_yes-field{max-width:750px;padding:15px 0;border-top:none!important}.wp_china_yes-profile-options>.wp_china_yes-field>.wp_china_yes-title{width:200px}.wp_china_yes-profile-options>.wp_china_yes-field>.wp_china_yes-title h4{font-size:14px;font-weight:600;line-height:1.3;display:inline-block;vertical-align:middle}.wp_china_yes-profile-options>.wp_china_yes-field>.wp_china_yes-fieldset{width:calc(100% - 220px)}.wp_china_yes-profile-options>.wp_china_yes-field>.wp_china_yes-fieldset>.wp_china_yes-help{top:-15px;right:-5px}.wp_china_yes-profile-options>.wp_china_yes-field-heading{font-size:1.1em}.wp_china_yes-profile-options>.wp_china_yes-field-subheading{font-size:12px}.wp_china_yes-profile-options>.wp_china_yes-field-heading,.wp_china_yes-profile-options>.wp_china_yes-field-subheading{margin:10px 0;padding:15px!important;border:1px solid #ddd}.wp_china_yes-profile-options>.wp_china_yes-field-submessage{margin:20px 0}.wp_china_yes-profile-options>.wp_china_yes-field-submessage .wp_china_yes-submessage{padding:10px;border-left-width:1px;border-left-style:solid;border-right-width:1px;border-right-style:solid}.wp_china_yes-profile-options>.wp_china_yes-field-notice{background-color:transparent}.wp_china_yes-modal{position:fixed;z-index:100101;top:0;left:0;width:100%;height:100%}.wp_china_yes-modal.hidden{display:none}.wp_china_yes-modal-icon{z-index:100102}.wp_china_yes-modal-table{display:table;width:100%;height:100%}.wp_china_yes-modal-table-cell{display:table-cell;vertical-align:middle;margin:100px 0}.wp_china_yes-modal-inner{position:relative;z-index:10;width:760px;height:750px;margin:0 auto;background-color:#fff}.wp_china_yes-modal-content{position:relative;overflow:hidden;overflow-y:auto;height:595px}.wp_china_yes-modal-content .wp_china_yes-shortcode-button{display:none}.wp_china_yes-modal-content .wp_china_yes-field{padding:15px 30px 15px 15px}.wp_china_yes-modal-content a:active,.wp_china_yes-modal-content a:focus{outline:0;box-shadow:none}.wp_china_yes-modal-content h4{font-size:13px}.wp_china_yes-modal-content h4 small{font-style:italic;font-weight:400;color:#aaa}.wp_china_yes-modal-title{position:relative;background-color:#fcfcfc;border-bottom:1px solid #ddd;height:36px;font-size:16px;font-weight:600;line-height:36px;margin:0;padding:0 36px 0 16px}.wp_china_yes-modal-header{width:100%;padding:14px 0;background-color:#f5f5f5;border-bottom:1px solid #ddd}.wp_china_yes-modal-header select{display:block;width:250px;margin:0 auto;font-size:13px;line-height:1;height:30px;min-height:30px;background-color:#fff}.wp_china_yes-modal-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_china_yes-modal-close:before{font:normal 20px/36px dashicons;content:"\f158";vertical-align:top;width:36px;height:36px}.wp_china_yes-modal-close:hover{opacity:.5}.wp_china_yes-modal-insert-wrapper{text-align:center;width:100%;padding:15px 0;background-color:#f5f5f5;border-top:1px solid #ddd}.wp_china_yes-modal-overlay{position:absolute;top:0;left:0;width:100%;height:100%;background-color:#000;opacity:.5}.wp_china_yes--repeatable{padding:15px 15px 0 15px}.wp_china_yes--repeat-button-block{text-align:center;padding-bottom:15px}.wp_china_yes--repeat-shortcode{position:relative;margin-bottom:15px;border:1px dashed #ddd}.wp_china_yes--repeat-shortcode:first-child .wp_china_yes-repeat-remove{display:none}.wp_china_yes--repeat-shortcode .wp_china_yes-repeat-remove{position:absolute;right:10px;top:10px;z-index:10;cursor:pointer;display:inline-block;font-size:11px;width:18px;height:18px;line-height:18px;text-align:center;border-radius:2px;color:#fff;background-color:#e14d43;opacity:.5}.wp_china_yes--repeat-shortcode .wp_china_yes-repeat-remove:hover{opacity:.5}.wp_china_yes-shortcode-single .wp_china_yes-modal-inner{height:750px}.wp_china_yes-shortcode-single .wp_china_yes-modal-content{height:652px}.elementor-editor-active .wp_china_yes-shortcode-button{margin-left:5px}.elementor-editor-active .wp_china_yes-modal .hidden{display:none!important}.wp_china_yes-shortcode-block{text-align:center;padding:14px;font-size:13px;background-color:#f5f5f5;font-family:-apple-system,BlinkMacSystemFont,"Segoe UI",Roboto,Oxygen-Sans,Ubuntu,Cantarell,"Helvetica Neue",sans-serif}.wp_china_yes-shortcode-block .components-button{margin-bottom:10px}.wp_china_yes-modal-icon .wp_china_yes-icon-title{padding:15px 0;margin:4px;font-size:14px;font-weight:700;text-align:center;border:1px solid #eee;background-color:#f7f7f7}.wp_china_yes-modal-icon .wp_china_yes-modal-header{text-align:center}.wp_china_yes-modal-icon .wp_china_yes-icon-search{width:50%;height:40px;line-height:40px}.wp_china_yes-modal-icon i{cursor:pointer;display:inline-block;margin:4px;width:35px;height:35px;line-height:35px;font-size:16px;color:#555;text-align:center;border:1px solid #ccc;background-color:#f7f7f7;border-radius:2px;box-shadow:1px 1px 0 rgba(0,0,0,.05)}.wp_china_yes-modal-icon i:hover{color:#fff;border-color:#222;background-color:#222}.wp_china_yes-modal-icon .wp_china_yes-modal-content{padding:10px;height:618px}.wp_china_yes-modal-icon .wp_china_yes-error-text{padding:10px}.wp_china_yes-modal-loading{display:none;position:absolute;left:15px;top:15px}.wp_china_yes-loading{position:relative;width:20px;height:20px;background:#ccc;border-radius:20px;box-shadow:0 2px 5px rgba(0,0,0,.07)}.wp_china_yes-loading:after{position:absolute;top:50%;left:50%;width:4px;height:4px;content:"";margin-top:-2px;margin-left:-2px;background-color:#fff;animation-duration:.5s;animation-iteration-count:infinite;animation-timing-function:linear;animation-name:wp_china_yesLoader;border-radius:4px}@keyframes wp_china_yesLoader{0%{transform:rotate(0) translateX(-6px) rotate(0)}100%{transform:rotate(360deg) translateX(-6px) rotate(-360deg)}}.wp_china_yes-subtitle-text{margin-top:6px;font-weight:400;color:#999}.wp_china_yes-desc-text{clear:both;float:left;width:100%;margin-top:6px;font-weight:400;color:#999}.wp_china_yes-error-text{margin-top:6px;color:#d02c21}.wp_china_yes-before-text{margin-bottom:6px}.wp_china_yes-after-text{margin-top:6px}.wp_china_yes-metabox-hide{display:none!important}.wp_china_yes-metabox-show{display:block!important}.wp_china_yes-depend-hidden.wp_china_yes-depend-on{display:none}.wp_china_yes-depend-visible.wp_china_yes-depend-on{display:block;opacity:.75;filter:grayscale(1);user-select:none;border-top:1px solid #eee}.wp_china_yes-depend-visible.wp_china_yes-depend-on .clear:before{content:"";left:0;top:0;right:0;bottom:0;position:absolute;background-color:#eee;opacity:.25;z-index:10}.wp_china_yes-warning-primary{color:#fff!important;border-color:#dc3545!important;background:#dc3545!important}.wp_china_yes-warning-primary:focus,.wp_china_yes-warning-primary:hover{border-color:#bd2130!important;background:#bd2130!important}.wp_china_yes-warning-primary:focus{box-shadow:0 0 0 1px #fff,0 0 0 3px #bd2130!important}.wp_china_yes-warning-primary:active{border-color:#bd2130!important;background:#bd2130!important}.wp_china_yes-form-result{display:none;float:left;padding:0 8px;margin-right:4px;font-size:11px;line-height:30px;user-select:none;border-radius:2px}.wp_china_yes-form-show{display:block}.wp_china_yes-form-success{color:#fff;background-color:#46b450}.wp_china_yes-form-warning{color:#8a6d3b;background-color:#faebcc}.wp_china_yes-label-error{position:relative;top:-2px;display:inline-block;font-size:10px;line-height:10px;height:10px;width:10px;padding:1px;font-style:normal;text-align:center;color:#fff;vertical-align:middle;background-color:#e10000;border-radius:2px}.wp_china_yes-no-option{padding:30px}.wp_china_yes-input-number{-moz-appearance:textfield}.wp_china_yes-input-number::-webkit-inner-spin-button,.wp_china_yes-input-number::-webkit-outer-spin-button{-webkit-appearance:none;margin:0}.wp_china_yes-fa5-shims .wp_china_yes .fab,.wp_china_yes-fa5-shims .wp_china_yes .far,.wp_china_yes-fa5-shims .wp_china_yes .fas{font-family:FontAwesome;font-style:normal}.wp_china_yes-welcome-wrap{position:relative;margin:25px 40px 0 20px;font-size:15px;max-width:1200px}.wp_china_yes-welcome-wrap p{font-size:14px;line-height:1.5}.wp_china_yes-welcome-wrap h1{margin:.2em 200px 0 0;padding:0;color:#32373c;line-height:1.2em;font-size:2.8em;font-weight:400}.wp_china_yes-welcome-wrap .wp_china_yes-logo{position:absolute;overflow:hidden;top:0;right:0;height:160px;width:140px;background-image:linear-gradient(45deg,#2d67cb,#ad19f3);box-shadow:0 1px 4px rgba(0,0,0,.25),inset 0 0 0 4px rgba(0,0,0,.25)}.wp_china_yes-welcome-wrap .wp_china_yes-logo .wp_china_yes--effects i{position:absolute;width:200px;height:100px;background-color:rgba(0,0,0,.15);transform:rotate(-45deg)}.wp_china_yes-welcome-wrap .wp_china_yes-logo .wp_china_yes--effects i:first-child{bottom:-20px;right:-70px}.wp_china_yes-welcome-wrap .wp_china_yes-logo .wp_china_yes--effects i:nth-child(2){bottom:-35px;right:-80px}.wp_china_yes-welcome-wrap .wp_china_yes-logo .wp_china_yes--effects i:nth-child(3){bottom:-50px;right:-90px}.wp_china_yes-welcome-wrap .wp_china_yes-logo .wp_china_yes--effects i:nth-child(4){bottom:-65px;right:-100px}.wp_china_yes-welcome-wrap .wp_china_yes-logo .wp_china_yes--wp-logos{position:relative;padding-top:25px;text-align:center}.wp_china_yes-welcome-wrap .wp_china_yes-logo .wp_china_yes--wp-logo{position:absolute;left:20px;width:20px;height:20px;background-repeat:no-repeat;background-position:center center;background-image:url(../images/wp-logo.svg)}.wp_china_yes-welcome-wrap .wp_china_yes-logo .wp_china_yes--wp-plugin-logo{display:inline-block;width:50px;height:50px;border:3px solid #fff;background-size:40px;background-repeat:no-repeat;background-position:center center;background-image:url(../images/wp-plugin-logo.svg);border-radius:100%;vertical-align:middle}.wp_china_yes-welcome-wrap .wp_china_yes-logo .wp_china_yes--text{position:absolute;left:0;right:0;top:90px;color:#fff;font-size:13px;line-height:1.2em;font-weight:600;text-align:center;text-transform:uppercase;text-shadow:1px 1px 0 rgba(0,0,0,.25)}.wp_china_yes-welcome-wrap .wp_china_yes-logo .wp_china_yes--version{top:auto;left:auto;right:8px;bottom:4px;font-size:11px;text-transform:lowercase}.wp_china_yes-welcome-wrap .wp_china_yes-about-text{font-weight:400;line-height:1.6em;font-size:19px;margin:1em 200px 1em 0;color:#555d66}.wp_china_yes-welcome-wrap .wp_china_yes-demo-button{margin:1em 200px 2em 0}.wp_china_yes-welcome-wrap .nav-tab-wrapper{margin-bottom:20px}.wp_china_yes-welcome-wrap ul{list-style-type:disc;padding-left:15px}.wp_china_yes-welcome-wrap .wp_china_yes--col{float:left;padding-right:20px;box-sizing:border-box}.wp_china_yes-welcome-wrap .wp_china_yes--col-2{width:50%}.wp_china_yes-welcome-wrap .wp_china_yes--col-3{width:33.333%}.wp_china_yes-welcome-wrap .wp_china_yes--col-4{width:25%}.wp_china_yes-welcome-wrap .wp_china_yes--col-5{width:20%}.wp_china_yes-welcome-wrap .wp_china_yes--col-last{padding-right:0}.wp_china_yes-welcome-wrap .wp_china_yes--col-upgrade{padding:10px 0;text-align:center;border-top:1px solid #e5e5e5}.wp_china_yes--table-compare tfoot td,.wp_china_yes--table-compare thead td{text-align:center}.wp_china_yes--table-compare td{font-size:14px;text-align:center;vertical-align:middle;padding:10px}.wp_china_yes--table-compare td:first-child{text-align:left}.wp_china_yes--table-compare tfoot td{padding:15px 0}.wp_china_yes--table-compare .fa{font-size:18px}.wp_china_yes--table-compare .fa-check-circle{color:#46b450}.wp_china_yes--table-compare .fa-times-circle{color:#dc3232}.wp_china_yes-welcome-cols{clear:both;margin:20px 0;background-color:#fff;padding:0 0;border-radius:2px;border:1px solid #e5e5e5}.wp_china_yes-welcome-cols .wp_china_yes--col{width:33.333%;float:left;padding:20px;text-align:center;box-sizing:border-box;min-height:200px;border-right:1px solid #e5e5e5}.wp_china_yes-welcome-cols .wp_china_yes--block,.wp_china_yes-welcome-cols .wp_china_yes--left{float:left;width:20%;padding:0 30px;text-align:center;box-sizing:border-box}.wp_china_yes-welcome-cols .wp_china_yes--block{width:80%}.wp_china_yes-welcome-cols .wp_china_yes--col-first{border-bottom:1px solid #e5e5e5}.wp_china_yes-welcome-cols .wp_china_yes--last{border-right:none}.wp_china_yes-welcome-cols .wp_china_yes--space{height:20px}.wp_china_yes-welcome-cols .wp_china_yes--icon{display:inline-block;font-size:20px;width:30px;height:30px;line-height:30px;text-align:center;margin-bottom:10px;color:#fff;background-color:#555;border-radius:30px}.wp_china_yes-welcome-cols .wp_china_yes--active{background-color:#5cb85c}.wp_china_yes-welcome-cols .wp_china_yes--deactive{background-color:#e14d43}.wp_china_yes-welcome-cols .wp_china_yes--title{font-weight:700;display:block}.wp_china_yes-welcome-cols p:last-child{margin-bottom:0}.wp_china_yes-features-cols .wp_china_yes--key-features{width:30%}.wp_china_yes-features-cols .wp_china_yes--available-fields{width:70%}.wp_china_yes-code-block{margin:20px 0;padding:5px 20px;background-color:#fff;border-radius:2px;box-shadow:0 1px 1px rgba(0,0,0,.15)}.wp_china_yes-code-block pre{font-size:13px;color:#0073aa}.wp_china_yes-code-block pre span{color:#999}.wp_china_yes--table-fields td{font-size:14px}.wp_china_yes--upgrade a{color:#5cb85c;font-weight:700}.wp_china_yes--upgrade a:focus,.wp_china_yes--upgrade a:hover{color:#4aa14a;outline:0;box-shadow:none}@media only screen and (max-width:782px){.wp_china_yes-welcome-cols .wp_china_yes--col{width:100%;min-height:auto;border-right:none;border-bottom:1px solid #e5e5e5}.wp_china_yes-features-cols .wp_china_yes--key-features{width:100%}.wp_china_yes-features-cols .wp_china_yes--available-fields{width:100%}}@media only screen and (max-width:1200px){.wp_china_yes-metabox .wp_china_yes-field .wp_china_yes-title{float:none;width:100%;margin-bottom:10px}.wp_china_yes-metabox .wp_china_yes-field .wp_china_yes-fieldset{float:none;width:100%}}@media only screen and (max-width:782px){.wp_china_yes-header-inner{text-align:center}.wp_china_yes-header-inner h1{width:100%;margin-bottom:10px}.wp_china_yes-form-result{float:none;margin-right:0;margin-bottom:10px}.wp_china_yes-header-left,.wp_china_yes-header-right,.wp_china_yes-search{width:100%}.wp_china_yes-search{text-align:center;margin-bottom:15px}.wp_china_yes-footer{text-align:center}.wp_china_yes-buttons{float:none}.wp_china_yes-copyright{float:none;margin-top:10px}.wp_china_yes-expand-all,.wp_china_yes-nav,.wp_china_yes-nav-background,.wp_china_yes-reset-section{display:none!important}.wp_china_yes-nav-normal+.wp_china_yes-content{margin-left:0}.wp_china_yes-section,.wp_china_yes-section-title{display:block!important}.wp_china_yes-field .wp_china_yes-title{float:none;width:100%;margin-bottom:10px}.wp_china_yes-field .wp_china_yes-fieldset{float:none;width:100%}.wp_china_yes-field-color .button.wp-picker-clear{padding:0 8px;line-height:2.14285714;min-height:32px}.wp_china_yes-profile-options>.wp_china_yes-field>.wp_china_yes-title,.wp_china_yes-taxonomy-edit-fields>.wp_china_yes-field>.wp_china_yes-title{float:none;width:100%;margin-bottom:10px}.wp_china_yes-profile-options>.wp_china_yes-field>.wp_china_yes-fieldset,.wp_china_yes-taxonomy-edit-fields>.wp_china_yes-field>.wp_china_yes-fieldset{float:none;width:100%}.wp_china_yes-nav-menu-options>.wp_china_yes-fields{margin-left:-10px;margin-right:-10px}.wp_china_yes-nav-menu-options>.wp_china_yes-fields>.wp_china_yes-field{padding:10px}}@media only screen and (max-width:782px){.wp_china_yes-modal .wp_china_yes-modal-inner{width:90%}}@media only screen and (max-height:750px){.wp_china_yes-modal .wp_china_yes-modal-inner{height:auto}.wp_china_yes-modal .wp_china_yes-modal-content{height:calc(100vh - 200px)}}.chosen-container{position:relative;display:inline-block;vertical-align:middle;font-size:13px;user-select:none}.chosen-container *{box-sizing:border-box}.chosen-container .chosen-drop{position:absolute;top:100%;z-index:1010;width:100%;border:1px solid #aaa;border-top:0;background:#fff;box-shadow:0 4px 5px rgba(0,0,0,.15);clip:rect(0,0,0,0);clip-path:inset(100% 100%)}.chosen-container.chosen-with-drop .chosen-drop{clip:auto;clip-path:none}.chosen-container a{cursor:pointer}.chosen-container .chosen-single .group-name,.chosen-container .search-choice .group-name{margin-right:4px;overflow:hidden;white-space:nowrap;text-overflow:ellipsis;font-weight:400;color:#999}.chosen-container .chosen-single .group-name:after,.chosen-container .search-choice .group-name:after{content:":";padding-left:2px;vertical-align:top}.chosen-container-single .chosen-single{position:relative;display:block;overflow:hidden;padding:0 0 0 8px;height:25px;border:1px solid #aaa;border-radius:5px;background-color:#fff;background:linear-gradient(#fff 20%,#f6f6f6 50%,#eee 52%,#f4f4f4 100%);background-clip:padding-box;box-shadow:0 0 3px #fff inset,0 1px 1px rgba(0,0,0,.1);color:#444;text-decoration:none;white-space:nowrap;line-height:24px}.chosen-container-single .chosen-default{color:#999}.chosen-container-single .chosen-single span{display:block;overflow:hidden;margin-right:26px;text-overflow:ellipsis;white-space:nowrap}.chosen-container-single .chosen-single-with-deselect span{margin-right:38px}.chosen-container-single .chosen-single abbr{position:absolute;top:6px;right:26px;display:block;width:12px;height:12px;font-size:1px}.chosen-container-single .chosen-single div{position:absolute;top:0;right:0;display:block;width:18px;height:100%}.chosen-container-single .chosen-single div b{display:block;width:100%;height:100%}.chosen-container-single .chosen-search{position:relative;z-index:1010;margin:0;padding:3px 4px;white-space:nowrap}.chosen-container-single .chosen-search input[type=text]{margin:1px 0;padding:4px 20px 4px 5px;width:100%;height:auto;outline:0;border:1px solid #aaa;font-size:1em;font-family:sans-serif;line-height:normal;border-radius:0}.chosen-container-single .chosen-drop{margin-top:-1px;border-radius:0 0 4px 4px;background-clip:padding-box}.chosen-container-single.chosen-container-single-nosearch .chosen-search{position:absolute;clip:rect(0,0,0,0);clip-path:inset(100% 100%)}.chosen-container .chosen-results{color:#444;position:relative;overflow-x:hidden;overflow-y:auto;margin:0 4px 4px 0;padding:0 0 0 4px;max-height:240px;-webkit-overflow-scrolling:touch}.chosen-container .chosen-results li{display:none;margin:0;padding:5px 6px;list-style:none;line-height:15px;word-wrap:break-word;-webkit-touch-callout:none}.chosen-container .chosen-results li.active-result{display:list-item;cursor:pointer}.chosen-container .chosen-results li.disabled-result{display:list-item;color:#ccc;cursor:default}.chosen-container .chosen-results li.highlighted{background-color:#3875d7;background-image:linear-gradient(#3875d7 20%,#2a62bc 90%);color:#fff}.chosen-container .chosen-results li.no-results{color:#777;display:list-item;background:#f4f4f4}.chosen-container .chosen-results li.group-result{display:list-item;font-weight:700;cursor:default}.chosen-container .chosen-results li.group-option{padding-left:15px}.chosen-container .chosen-results li em{font-style:normal;text-decoration:underline}.chosen-container-multi .chosen-choices{position:relative;overflow:hidden;margin:0;padding:0 5px;width:100%;height:auto;border:1px solid #aaa;background-color:#fff;background-image:linear-gradient(#eee 1%,#fff 15%);cursor:text}.chosen-container-multi .chosen-choices li{float:left;list-style:none}.chosen-container-multi .chosen-choices li.search-field{margin:0;padding:0;white-space:nowrap}.chosen-container-multi .chosen-choices li.search-field input[type=text]{margin:1px 0;padding:0;outline:0;border:0!important;background:0 0!important;box-shadow:none;color:#999;font-size:100%;font-family:sans-serif;line-height:normal;border-radius:0;width:25px;height:25px;min-height:25px}.chosen-container-multi .chosen-choices li.search-choice{position:relative;margin:3px 5px 3px 0;padding:3px 20px 3px 6px;border:1px solid #aaa;max-width:100%;border-radius:3px;background-color:#eee;background-image:linear-gradient(#f4f4f4 20%,#f0f0f0 50%,#e8e8e8 52%,#eee 100%);background-size:100% 19px;background-repeat:repeat-x;background-clip:padding-box;box-shadow:0 0 2px #fff inset,0 1px 0 rgba(0,0,0,.05);color:#333;line-height:13px;cursor:default}.chosen-container-multi .chosen-choices li.search-choice span{word-wrap:break-word;white-space:nowrap}.chosen-container-multi .chosen-choices li.search-choice .search-choice-close{position:absolute;top:0;right:0;display:block;width:12px;height:12px;font-size:1px}.chosen-container-multi .chosen-choices li.search-choice-disabled{padding-right:5px;border:1px solid #ccc;background-color:#e4e4e4;background-image:linear-gradient(#f4f4f4 20%,#f0f0f0 50%,#e8e8e8 52%,#eee 100%);color:#666}.chosen-container-multi .chosen-choices li.search-choice-focus{background:#d4d4d4}.chosen-container-multi .chosen-results{margin:0;padding:0}.chosen-container-multi .chosen-drop .result-selected{display:list-item;color:#ccc;cursor:default}.chosen-container-active .chosen-single{border:1px solid #5897fb;box-shadow:0 0 5px rgba(0,0,0,.3)}.chosen-container-active.chosen-with-drop .chosen-single{border:1px solid #aaa;border-bottom-right-radius:0;border-bottom-left-radius:0;background-image:linear-gradient(#eee 20%,#fff 80%);box-shadow:0 1px 0 #fff inset}.chosen-container-active.chosen-with-drop .chosen-single div{border-left:none;background:0 0}.chosen-container-active .chosen-choices{border:1px solid #5897fb;box-shadow:0 0 5px rgba(0,0,0,.3)}.chosen-container-active .chosen-choices li.search-field input[type=text]{color:#222!important}.chosen-disabled{opacity:.5!important;cursor:default}.chosen-disabled .chosen-single{cursor:default}.chosen-disabled .chosen-choices .search-choice .search-choice-close{cursor:default}.chosen-rtl{text-align:right}.chosen-rtl .chosen-single{overflow:visible;padding:0 8px 0 0}.chosen-rtl .chosen-single span{margin-right:0;margin-left:26px;direction:rtl}.chosen-rtl .chosen-single-with-deselect span{margin-left:38px}.chosen-rtl .chosen-single div{right:auto;left:3px}.chosen-rtl .chosen-single abbr{right:auto;left:26px}.chosen-rtl .chosen-choices li{float:right}.chosen-rtl .chosen-choices li.search-field input[type=text]{direction:rtl}.chosen-rtl .chosen-choices li.search-choice{margin:3px 5px 3px 0;padding:3px 5px 3px 19px}.chosen-rtl .chosen-choices li.search-choice .search-choice-close{right:auto;left:4px}.chosen-rtl.chosen-container-single .chosen-results{margin:0 0 4px 4px;padding:0 4px 0 0}.chosen-rtl .chosen-results li.group-option{padding-right:15px;padding-left:0}.chosen-rtl.chosen-container-active.chosen-with-drop .chosen-single div{border-right:none}.chosen-rtl .chosen-search input[type=text]{padding:4px 5px 4px 20px;direction:rtl}.flatpickr-calendar{background:0 0;opacity:0;display:none;text-align:center;visibility:hidden;padding:0;-webkit-animation:none;animation:none;direction:ltr;border:0;font-size:14px;line-height:24px;border-radius:5px;position:absolute;width:307.875px;-webkit-box-sizing:border-box;box-sizing:border-box;-ms-touch-action:manipulation;touch-action:manipulation;background:#fff;-webkit-box-shadow:1px 0 0 #e6e6e6,-1px 0 0 #e6e6e6,0 1px 0 #e6e6e6,0 -1px 0 #e6e6e6,0 3px 13px rgba(0,0,0,.08);box-shadow:1px 0 0 #e6e6e6,-1px 0 0 #e6e6e6,0 1px 0 #e6e6e6,0 -1px 0 #e6e6e6,0 3px 13px rgba(0,0,0,.08)}.flatpickr-calendar.inline,.flatpickr-calendar.open{opacity:1;max-height:640px;visibility:visible}.flatpickr-calendar.open{display:inline-block;z-index:99999}.flatpickr-calendar.animate.open{-webkit-animation:fpFadeInDown .3s cubic-bezier(.23,1,.32,1);animation:fpFadeInDown .3s cubic-bezier(.23,1,.32,1)}.flatpickr-calendar.inline{display:block;position:relative;top:2px}.flatpickr-calendar.static{position:absolute;top:calc(100% + 2px)}.flatpickr-calendar.static.open{z-index:999;display:block}.flatpickr-calendar.multiMonth .flatpickr-days .dayContainer:nth-child(n+1) .flatpickr-day.inRange:nth-child(7n+7){-webkit-box-shadow:none!important;box-shadow:none!important}.flatpickr-calendar.multiMonth .flatpickr-days .dayContainer:nth-child(n+2) .flatpickr-day.inRange:nth-child(7n+1){-webkit-box-shadow:-2px 0 0 #e6e6e6,5px 0 0 #e6e6e6;box-shadow:-2px 0 0 #e6e6e6,5px 0 0 #e6e6e6}.flatpickr-calendar .hasTime .dayContainer,.flatpickr-calendar .hasWeeks .dayContainer{border-bottom:0;border-bottom-right-radius:0;border-bottom-left-radius:0}.flatpickr-calendar .hasWeeks .dayContainer{border-left:0}.flatpickr-calendar.hasTime .flatpickr-time{height:40px;border-top:1px solid #e6e6e6}.flatpickr-calendar.noCalendar.hasTime .flatpickr-time{height:auto}.flatpickr-calendar:after,.flatpickr-calendar:before{position:absolute;display:block;pointer-events:none;border:solid transparent;content:"";height:0;width:0;left:22px}.flatpickr-calendar.arrowRight:after,.flatpickr-calendar.arrowRight:before,.flatpickr-calendar.rightMost:after,.flatpickr-calendar.rightMost:before{left:auto;right:22px}.flatpickr-calendar.arrowCenter:after,.flatpickr-calendar.arrowCenter:before{left:50%;right:50%}.flatpickr-calendar:before{border-width:5px;margin:0 -5px}.flatpickr-calendar:after{border-width:4px;margin:0 -4px}.flatpickr-calendar.arrowTop:after,.flatpickr-calendar.arrowTop:before{bottom:100%}.flatpickr-calendar.arrowTop:before{border-bottom-color:#e6e6e6}.flatpickr-calendar.arrowTop:after{border-bottom-color:#fff}.flatpickr-calendar.arrowBottom:after,.flatpickr-calendar.arrowBottom:before{top:100%}.flatpickr-calendar.arrowBottom:before{border-top-color:#e6e6e6}.flatpickr-calendar.arrowBottom:after{border-top-color:#fff}.flatpickr-calendar:focus{outline:0}.flatpickr-wrapper{position:relative;display:inline-block}.flatpickr-months{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex}.flatpickr-months .flatpickr-month{background:0 0;color:rgba(0,0,0,.9);fill:rgba(0,0,0,0.9);height:34px;line-height:1;text-align:center;position:relative;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;overflow:hidden;-webkit-box-flex:1;-webkit-flex:1;-ms-flex:1;flex:1}.flatpickr-months .flatpickr-next-month,.flatpickr-months .flatpickr-prev-month{text-decoration:none;cursor:pointer;position:absolute;top:0;height:34px;padding:10px;z-index:3;color:rgba(0,0,0,.9);fill:rgba(0,0,0,0.9)}.flatpickr-months .flatpickr-next-month.flatpickr-disabled,.flatpickr-months .flatpickr-prev-month.flatpickr-disabled{display:none}.flatpickr-months .flatpickr-next-month i,.flatpickr-months .flatpickr-prev-month i{position:relative}.flatpickr-months .flatpickr-next-month.flatpickr-prev-month,.flatpickr-months .flatpickr-prev-month.flatpickr-prev-month{left:0}.flatpickr-months .flatpickr-next-month.flatpickr-next-month,.flatpickr-months .flatpickr-prev-month.flatpickr-next-month{right:0}.flatpickr-months .flatpickr-next-month:hover,.flatpickr-months .flatpickr-prev-month:hover{color:#959ea9}.flatpickr-months .flatpickr-next-month:hover svg,.flatpickr-months .flatpickr-prev-month:hover svg{fill:#f64747}.flatpickr-months .flatpickr-next-month svg,.flatpickr-months .flatpickr-prev-month svg{width:14px;height:14px}.flatpickr-months .flatpickr-next-month svg path,.flatpickr-months .flatpickr-prev-month svg path{-webkit-transition:fill .1s;transition:fill .1s;fill:inherit}.numInputWrapper{position:relative;height:auto}.numInputWrapper input,.numInputWrapper span{display:inline-block}.numInputWrapper input{width:100%}.numInputWrapper input::-ms-clear{display:none}.numInputWrapper input::-webkit-inner-spin-button,.numInputWrapper input::-webkit-outer-spin-button{margin:0;-webkit-appearance:none}.numInputWrapper span{position:absolute;right:0;width:14px;padding:0 4px 0 2px;height:50%;line-height:50%;opacity:0;cursor:pointer;border:1px solid rgba(57,57,57,.15);-webkit-box-sizing:border-box;box-sizing:border-box}.numInputWrapper span:hover{background:rgba(0,0,0,.1)}.numInputWrapper span:active{background:rgba(0,0,0,.2)}.numInputWrapper span:after{display:block;content:"";position:absolute}.numInputWrapper span.arrowUp{top:0;border-bottom:0}.numInputWrapper span.arrowUp:after{border-left:4px solid transparent;border-right:4px solid transparent;border-bottom:4px solid rgba(57,57,57,.6);top:26%}.numInputWrapper span.arrowDown{top:50%}.numInputWrapper span.arrowDown:after{border-left:4px solid transparent;border-right:4px solid transparent;border-top:4px solid rgba(57,57,57,.6);top:40%}.numInputWrapper span svg{width:inherit;height:auto}.numInputWrapper span svg path{fill:rgba(0,0,0,0.5)}.numInputWrapper:hover{background:rgba(0,0,0,.05)}.numInputWrapper:hover span{opacity:1}.flatpickr-current-month{font-size:135%;line-height:inherit;font-weight:300;color:inherit;position:absolute;width:75%;left:12.5%;padding:7.48px 0 0 0;line-height:1;height:34px;display:inline-block;text-align:center;-webkit-transform:translate3d(0,0,0);transform:translate3d(0,0,0)}.flatpickr-current-month span.cur-month{font-family:inherit;font-weight:700;color:inherit;display:inline-block;margin-left:.5ch;padding:0}.flatpickr-current-month span.cur-month:hover{background:rgba(0,0,0,.05)}.flatpickr-current-month .numInputWrapper{width:6ch;display:inline-block}.flatpickr-current-month .numInputWrapper span.arrowUp:after{border-bottom-color:rgba(0,0,0,.9)}.flatpickr-current-month .numInputWrapper span.arrowDown:after{border-top-color:rgba(0,0,0,.9)}.flatpickr-current-month input.cur-year{background:0 0;-webkit-box-sizing:border-box;box-sizing:border-box;color:inherit;cursor:text;padding:0 0 0 .5ch;margin:0;display:inline-block;font-size:inherit;font-family:inherit;font-weight:300;line-height:inherit;height:auto;border:0;border-radius:0;vertical-align:initial;-webkit-appearance:textfield;-moz-appearance:textfield;appearance:textfield}.flatpickr-current-month input.cur-year:focus{outline:0}.flatpickr-current-month input.cur-year[disabled],.flatpickr-current-month input.cur-year[disabled]:hover{font-size:100%;color:rgba(0,0,0,.5);background:0 0;pointer-events:none}.flatpickr-current-month .flatpickr-monthDropdown-months{appearance:menulist;background:0 0;border:none;border-radius:0;box-sizing:border-box;color:inherit;cursor:pointer;font-size:inherit;font-family:inherit;font-weight:300;height:auto;line-height:inherit;margin:-1px 0 0 0;outline:0;padding:0 0 0 .5ch;position:relative;vertical-align:initial;-webkit-box-sizing:border-box;-webkit-appearance:menulist;-moz-appearance:menulist;width:auto}.flatpickr-current-month .flatpickr-monthDropdown-months:active,.flatpickr-current-month .flatpickr-monthDropdown-months:focus{outline:0}.flatpickr-current-month .flatpickr-monthDropdown-months:hover{background:rgba(0,0,0,.05)}.flatpickr-current-month .flatpickr-monthDropdown-months .flatpickr-monthDropdown-month{background-color:transparent;outline:0;padding:0}.flatpickr-weekdays{background:0 0;text-align:center;overflow:hidden;width:100%;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-box-align:center;-webkit-align-items:center;-ms-flex-align:center;align-items:center;height:28px}.flatpickr-weekdays .flatpickr-weekdaycontainer{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-box-flex:1;-webkit-flex:1;-ms-flex:1;flex:1}span.flatpickr-weekday{cursor:default;font-size:90%;background:0 0;color:rgba(0,0,0,.54);line-height:1;margin:0;text-align:center;display:block;-webkit-box-flex:1;-webkit-flex:1;-ms-flex:1;flex:1;font-weight:bolder}.dayContainer,.flatpickr-weeks{padding:1px 0 0 0}.flatpickr-days{position:relative;overflow:hidden;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-box-align:start;-webkit-align-items:flex-start;-ms-flex-align:start;align-items:flex-start;width:307.875px}.flatpickr-days:focus{outline:0}.dayContainer{padding:0;outline:0;text-align:left;width:307.875px;min-width:307.875px;max-width:307.875px;-webkit-box-sizing:border-box;box-sizing:border-box;display:inline-block;display:-ms-flexbox;display:-webkit-box;display:-webkit-flex;display:flex;-webkit-flex-wrap:wrap;flex-wrap:wrap;-ms-flex-wrap:wrap;-ms-flex-pack:justify;-webkit-justify-content:space-around;justify-content:space-around;-webkit-transform:translate3d(0,0,0);transform:translate3d(0,0,0);opacity:1}.dayContainer+.dayContainer{-webkit-box-shadow:-1px 0 0 #e6e6e6;box-shadow:-1px 0 0 #e6e6e6}.flatpickr-day{background:0 0;border:1px solid transparent;border-radius:150px;-webkit-box-sizing:border-box;box-sizing:border-box;color:#393939;cursor:pointer;font-weight:400;width:14.2857143%;-webkit-flex-basis:14.2857143%;-ms-flex-preferred-size:14.2857143%;flex-basis:14.2857143%;max-width:39px;height:39px;line-height:39px;margin:0;display:inline-block;position:relative;-webkit-box-pack:center;-webkit-justify-content:center;-ms-flex-pack:center;justify-content:center;text-align:center}.flatpickr-day.inRange,.flatpickr-day.nextMonthDay.inRange,.flatpickr-day.nextMonthDay.today.inRange,.flatpickr-day.nextMonthDay:focus,.flatpickr-day.nextMonthDay:hover,.flatpickr-day.prevMonthDay.inRange,.flatpickr-day.prevMonthDay.today.inRange,.flatpickr-day.prevMonthDay:focus,.flatpickr-day.prevMonthDay:hover,.flatpickr-day.today.inRange,.flatpickr-day:focus,.flatpickr-day:hover{cursor:pointer;outline:0;background:#e6e6e6;border-color:#e6e6e6}.flatpickr-day.today{border-color:#959ea9}.flatpickr-day.today:focus,.flatpickr-day.today:hover{border-color:#959ea9;background:#959ea9;color:#fff}.flatpickr-day.endRange,.flatpickr-day.endRange.inRange,.flatpickr-day.endRange.nextMonthDay,.flatpickr-day.endRange.prevMonthDay,.flatpickr-day.endRange:focus,.flatpickr-day.endRange:hover,.flatpickr-day.selected,.flatpickr-day.selected.inRange,.flatpickr-day.selected.nextMonthDay,.flatpickr-day.selected.prevMonthDay,.flatpickr-day.selected:focus,.flatpickr-day.selected:hover,.flatpickr-day.startRange,.flatpickr-day.startRange.inRange,.flatpickr-day.startRange.nextMonthDay,.flatpickr-day.startRange.prevMonthDay,.flatpickr-day.startRange:focus,.flatpickr-day.startRange:hover{background:#569ff7;-webkit-box-shadow:none;box-shadow:none;color:#fff;border-color:#569ff7}.flatpickr-day.endRange.startRange,.flatpickr-day.selected.startRange,.flatpickr-day.startRange.startRange{border-radius:50px 0 0 50px}.flatpickr-day.endRange.endRange,.flatpickr-day.selected.endRange,.flatpickr-day.startRange.endRange{border-radius:0 50px 50px 0}.flatpickr-day.endRange.startRange+.endRange:not(:nth-child(7n+1)),.flatpickr-day.selected.startRange+.endRange:not(:nth-child(7n+1)),.flatpickr-day.startRange.startRange+.endRange:not(:nth-child(7n+1)){-webkit-box-shadow:-10px 0 0 #569ff7;box-shadow:-10px 0 0 #569ff7}.flatpickr-day.endRange.startRange.endRange,.flatpickr-day.selected.startRange.endRange,.flatpickr-day.startRange.startRange.endRange{border-radius:50px}.flatpickr-day.inRange{border-radius:0;-webkit-box-shadow:-5px 0 0 #e6e6e6,5px 0 0 #e6e6e6;box-shadow:-5px 0 0 #e6e6e6,5px 0 0 #e6e6e6}.flatpickr-day.flatpickr-disabled,.flatpickr-day.flatpickr-disabled:hover,.flatpickr-day.nextMonthDay,.flatpickr-day.notAllowed,.flatpickr-day.notAllowed.nextMonthDay,.flatpickr-day.notAllowed.prevMonthDay,.flatpickr-day.prevMonthDay{color:rgba(57,57,57,.3);background:0 0;border-color:transparent;cursor:default}.flatpickr-day.flatpickr-disabled,.flatpickr-day.flatpickr-disabled:hover{cursor:not-allowed;color:rgba(57,57,57,.1)}.flatpickr-day.week.selected{border-radius:0;-webkit-box-shadow:-5px 0 0 #569ff7,5px 0 0 #569ff7;box-shadow:-5px 0 0 #569ff7,5px 0 0 #569ff7}.flatpickr-day.hidden{visibility:hidden}.rangeMode .flatpickr-day{margin-top:1px}.flatpickr-weekwrapper{float:left}.flatpickr-weekwrapper .flatpickr-weeks{padding:0 12px;-webkit-box-shadow:1px 0 0 #e6e6e6;box-shadow:1px 0 0 #e6e6e6}.flatpickr-weekwrapper .flatpickr-weekday{float:none;width:100%;line-height:28px}.flatpickr-weekwrapper span.flatpickr-day,.flatpickr-weekwrapper span.flatpickr-day:hover{display:block;width:100%;max-width:none;color:rgba(57,57,57,.3);background:0 0;cursor:default;border:none}.flatpickr-innerContainer{display:block;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-box-sizing:border-box;box-sizing:border-box;overflow:hidden}.flatpickr-rContainer{display:inline-block;padding:0;-webkit-box-sizing:border-box;box-sizing:border-box}.flatpickr-time{text-align:center;outline:0;display:block;height:0;line-height:40px;max-height:40px;-webkit-box-sizing:border-box;box-sizing:border-box;overflow:hidden;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex}.flatpickr-time:after{content:"";display:table;clear:both}.flatpickr-time .numInputWrapper{-webkit-box-flex:1;-webkit-flex:1;-ms-flex:1;flex:1;width:40%;height:40px;float:left}.flatpickr-time .numInputWrapper span.arrowUp:after{border-bottom-color:#393939}.flatpickr-time .numInputWrapper span.arrowDown:after{border-top-color:#393939}.flatpickr-time.hasSeconds .numInputWrapper{width:26%}.flatpickr-time.time24hr .numInputWrapper{width:49%}.flatpickr-time input{background:0 0;-webkit-box-shadow:none;box-shadow:none;border:0;border-radius:0;text-align:center;margin:0;padding:0;height:inherit;line-height:inherit;color:#393939;font-size:14px;position:relative;-webkit-box-sizing:border-box;box-sizing:border-box;-webkit-appearance:textfield;-moz-appearance:textfield;appearance:textfield}.flatpickr-time input.flatpickr-hour{font-weight:700}.flatpickr-time input.flatpickr-minute,.flatpickr-time input.flatpickr-second{font-weight:400}.flatpickr-time input:focus{outline:0;border:0}.flatpickr-time .flatpickr-am-pm,.flatpickr-time .flatpickr-time-separator{height:inherit;float:left;line-height:inherit;color:#393939;font-weight:700;width:2%;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;-webkit-align-self:center;-ms-flex-item-align:center;align-self:center}.flatpickr-time .flatpickr-am-pm{outline:0;width:18%;cursor:pointer;text-align:center;font-weight:400}.flatpickr-time .flatpickr-am-pm:focus,.flatpickr-time .flatpickr-am-pm:hover,.flatpickr-time input:focus,.flatpickr-time input:hover{background:#eee}.flatpickr-input[readonly]{cursor:pointer}@-webkit-keyframes fpFadeInDown{from{opacity:0;-webkit-transform:translate3d(0,-20px,0);transform:translate3d(0,-20px,0)}to{opacity:1;-webkit-transform:translate3d(0,0,0);transform:translate3d(0,0,0)}}@keyframes fpFadeInDown{from{opacity:0;-webkit-transform:translate3d(0,-20px,0);transform:translate3d(0,-20px,0)}to{opacity:1;-webkit-transform:translate3d(0,0,0);transform:translate3d(0,0,0)}} \ No newline at end of file diff --git a/framework/assets/images/checkerboard.png b/framework/assets/images/checkerboard.png new file mode 100644 index 0000000000000000000000000000000000000000..f97dade073e8e42bc2f7631cbee0203ab0cc95be GIT binary patch literal 2340 zcmaJ@dpuNmAD+;>ZlR(@-a1ZLHI2EL5yMO~%m^7KY{a`VGv^qS=3?f^V3C@Yq_q|; ztu6|++l^vtT`RX(C6}cT$(DDMOQj;-?9rxu|9E@P=bZDqe4gj|e!su(^T+QX&u7ar zU2|Ow2D8l5gYAcox6p5eHWvM_`A=pKI+!7xAjDr5j>Pa4Fop%m1Tf$!;fr8Dm=DE9 zHN!3#j3y`!2ttCm-ZY_1V#i;=*r_CPl#Ri-Y*xwn!blha1h7afrGpcdwICpd=wKj~ zOXSMk;0UotoC5Zb^9c~fMGBoDa5DpNQPEHV35@Uom1MV6NmJ3m_qsH6zOYRIf%gz3 zk`DfrR1lX3xXBbSK(({S3yCBW;NW0KqEHxY^C-pvX zp-<;R{v?-xCPP?g?0+?SaSL_N!t|qU(ZxsO!&21k3e?u~qjQ58%+g#>HY-5Ydp=}h zOEk-9z{xr@mBD7O1wn9yXHs0Y2b(=*dCGA4^2}TGw!Z4#(fn#>`?mbq#;CT82lwwk zn0eK@TalRfO?Jn$7f7z2pFQ?3kw`Q=^7CtaZDmyz`^m+Aq=L@bPuZfu%GfwRv70}U;kPs>(ZX$H&PSM-%U-sX-SE9R31CKO|D|2#8wqidYPDo1nehxD4WNh8Kl^Q$V(K_h=@(s{DpXF2e zV$HEVXYU$|ECOl@PU1`wTWYAsd1bhn3(x(ALpBVS*YKvjTP)Z+HeIN0x=LMZ8?U>6 zu=i+AdxvH&-_;h%99Rvn6;$bFbd`74iWE<5z<_DWElyTQy!bZoqXGB zQ;i`r4T+l{b4h{e+QyQCYX=H=r))JNBdQXN6a$Z1zubp?5d22`LwkhPmrD-@0gZ~A zM(#R6VQuzB$*Z$HMsMB~YK5#!pC7_AgQ6YxeO5jPbaw?uTAtp2G^)cT&(=LFXKY|v zPfyR*gsmO3Y8$Y=EOcd@srhF1UNzFLt=@Zn6J)%a9dSdYiPvY}%~hotG+nXkc&I~i z2fG8awKcq~faG6%XM0>c$dsJuqE+w0`Y&Exe>~cF#O%&JUVnwn$@WPbK`K+7I`H<2 zSH8Aev%rg#ZlYaR{B@YvAU{~|SM|fnp8#TNT=#AdN2~hcSg#w`;!JODFkt@nBqhw^ z;%)lV+hJCgrv{AGU-)XetOg(HpSLBoK7a!f44+K`n9$zCXvvXUftE!y|Qdb>@fH z9ILFXl=35sdDO((+S;ACilRFSvy+oNoW|>akByK2#Hsvherl=dbCpd+ zE1VWGQL3-@FnVG!xsh_<_Z)j*}mbnG9NH=q`=iXw3r3Zpd+OF(qurebaG3us0 z?XK=s=iE8mz3!BmZKO2w*$J&uFRi=l{wO!VV$a6+YduPE1Xe;DTQnwqFU+_w6&}z` zI-npoIQU*Co+0XGZWH9>>O|3trY4W*Q}z;#PjB}NgYHwZxlGHdva`1P@{N~e6epYM zSwktFPmJOWC+(T>5sy!BvwmfAI#uWRBy2nxIQFW`yV%R(^sa<+8@Todc;s%iNf4Ij z9&4;wcxO(BYM@978B<4P>^te>@)i38dj%zB)U)`$BRU1JuuMAWN6x5&1oFNwIr0zDvLSF^Vfh=75l7Yhw+U*E#|33=UUFjD3ue-QJ zk)%Nm*ksfnn|t-5Z^gZhdL>&7w8<@}O^R}9Sz2nB?=a6@LoA`aOGcMpXK3{t9Addx zY;0zHdoHfrhM68+B!Ip-?`e1g%=B_l9!Y(E1SrwbAA<1tG05@T2JTD!vD%8?)tBGM zR+u+-l8b>6N&B`8TWaz(;}o#jB2PEU)r#N@s+mB8&yNN-)<28V!58p%B-pHeT$DPp wWL!T5@+C#^tFHC{-Knnx>Fqz1&3t|x<5%D1vGxnx?83dpljFm_=o+@~Pr_T#R{#J2 literal 0 HcmV?d00001 diff --git a/framework/assets/images/wp-logo.svg b/framework/assets/images/wp-logo.svg new file mode 100644 index 0000000..a415fd6 --- /dev/null +++ b/framework/assets/images/wp-logo.svg @@ -0,0 +1 @@ + diff --git a/framework/assets/images/wp-plugin-logo.svg b/framework/assets/images/wp-plugin-logo.svg new file mode 100644 index 0000000..967f446 --- /dev/null +++ b/framework/assets/images/wp-plugin-logo.svg @@ -0,0 +1 @@ + diff --git a/framework/assets/js/main.min.js b/framework/assets/js/main.min.js new file mode 100644 index 0000000..666b50d --- /dev/null +++ b/framework/assets/js/main.min.js @@ -0,0 +1,2 @@ +/* Wp_china_yes Framework | A Simple and Lightweight WordPress Option Framework - v2.3.1*/ +!function(S,_,b,y){"use strict";var j={funcs:{}};j.vars={onloaded:!1,$body:S("body"),$window:S(_),$document:S(b),$form_warning:null,is_confirm:!1,form_modified:!1,code_themes:[],is_rtl:S("body").hasClass("rtl")},j.helper={uid:function(e){return(e||"")+Math.random().toString(36).substr(2,9)},preg_quote:function(e){return(e+"").replace(/(\[|\])/g,"\\$1")},name_nested_replace:function(e,t){var n=new RegExp(j.helper.preg_quote(t+"[\\d+]"),"g");e.find(":radio").each(function(){(this.checked||this.orginal_checked)&&(this.orginal_checked=!0)}),e.each(function(e){S(this).find(":input").each(function(){this.name=this.name.replace(n,t+"["+e+"]"),this.orginal_checked&&(this.checked=!0)})})},debounce:function(i,s,c){var a;return function(){var e=this,t=arguments,n=c&&!a;clearTimeout(a),a=setTimeout(function(){a=null,c||i.apply(e,t)},s),n&&i.apply(e,t)}}},S.fn.wp_china_yes_clone=function(){for(var e=S.fn.clone.apply(this,arguments),t=this.find("select").add(this.filter("select")),n=e.find("select").add(e.filter("select")),i=0;i .wp_china_yes-field:not(.wp_china_yes-depend-on)"),i=n.find("> .wp_china_yes-title, .wp_china_yes-search-tags");3"),S("#wp_china_yes-codemirror-css").after(e),e.attr({rel:"stylesheet",id:"wp_china_yes-codemirror-"+s.theme+"-css",href:s.cdnURL+"/theme/"+s.theme+".min.css",type:"text/css",media:"all"}),j.vars.code_themes.push(s.theme)),CodeMirror.modeURL=s.cdnURL+"/mode/%N/%N.min.js",CodeMirror.autoLoadMode(n,s.mode),n.on("change",function(e,t){i.val(n.getValue()).trigger("change")}),clearInterval(c))}))})},S.fn.wp_china_yes_field_date=function(){return this.each(function(){var e=S(this),n=e.find("input"),i=e.find(".wp_china_yes-date-settings").data("settings"),i=S.extend({},i,{showAnim:"",beforeShow:function(e,t){S(t.dpDiv).addClass("wp_china_yes-datepicker-wrapper")},onClose:function(e,t){S(t.dpDiv).removeClass("wp_china_yes-datepicker-wrapper")}});2===n.length&&(i=S.extend({},i,{onSelect:function(e){S(this),n.first();var t=n.first().attr("id")===S(this).attr("id")?"minDate":"maxDate",e=S.datepicker.parseDate(i.dateFormat,e);n.not(this).datepicker("option",t,e)}})),n.each(function(){var e=S(this);e.hasClass("hasDatepicker")&&e.removeAttr("id").removeClass("hasDatepicker"),e.datepicker(i)})})},S.fn.wp_china_yes_field_datetime=function(){return this.each(function(){var e=S(this),i=e.find("input"),t=e.find(".wp_china_yes-datetime-settings").data("settings"),t=S.extend({},t,{onReady:function(e,t,n){S(n.calendarContainer).addClass("wp_china_yes-flatpickr")}});2===i.length&&(t=S.extend({},t,{onChange:function(e,t,n){"from"===S(n.element).data("type")?i.last().get(0)._flatpickr.set("minDate",e[0]):i.first().get(0)._flatpickr.set("maxDate",e[0])}})),i.each(function(){S(this).flatpickr(t)})})},S.fn.wp_china_yes_field_fieldset=function(){return this.each(function(){S(this).find(".wp_china_yes-fieldset-content").wp_china_yes_reload_script()})},S.fn.wp_china_yes_field_gallery=function(){return this.each(function(){var s,e=S(this),c=e.find(".wp_china_yes-edit-gallery"),a=e.find(".wp_china_yes-clear-gallery"),r=e.find("ul"),o=e.find("input");e.find("img");e.on("click",".wp_china_yes-button, .wp_china_yes-edit-gallery",function(e){var t=S(this),n=o.val(),t=t.hasClass("wp_china_yes-edit-gallery")?"edit":"add",i="add"!=t||n.length?"gallery-edit":"gallery";e.preventDefault(),void 0!==_.wp&&_.wp.media&&_.wp.media.gallery&&("gallery"==i?(s=_.wp.media({library:{type:"image"},frame:"post",state:"gallery",multiple:!0})).open():(s=_.wp.media.gallery.edit('[gallery ids="'+n+'"]'),"add"==t&&s.setState("gallery-library")),s.on("update",function(e){r.empty();e=e.models.map(function(e){var e=e.toJSON(),t=(e.sizes&&e.sizes.thumbnail&&e.sizes.thumbnail.url?e.sizes.thumbnail:e).url;return r.append('
  • '),e.id});o.val(e.join(",")).trigger("change"),a.removeClass("hidden"),c.removeClass("hidden")}))}),a.on("click",function(e){e.preventDefault(),r.empty(),o.val("").trigger("change"),a.addClass("hidden"),c.addClass("hidden")})})},S.fn.wp_china_yes_field_group=function(){return this.each(function(){function e(e){e.preventDefault();var t,n,i,s,e=c.children(".wp_china_yes-cloneable-item").length;r.hide(),h&&h')).append(t),s.append(n),s.append(i),c.children().eq(e.index()).after(s),j.helper.name_nested_replace(c.children(".wp_china_yes-cloneable-item"),l),c.accordion("refresh"),c.wp_china_yes_customizer_refresh(),c.wp_china_yes_customizer_listen({closest:!0}),d&&u(c))}function t(e){e.preventDefault(),e=c.children(".wp_china_yes-cloneable-item").length,a.hide(),r.hide(),p&&e-1 .wp_china_yes-cloneable-item > .wp_china_yes-cloneable-title",collapsible:!0,active:!1,animate:!1,heightStyle:"content",icons:{header:"wp_china_yes-cloneable-header-icon fas fa-angle-right",activeHeader:"wp_china_yes-cloneable-header-icon fas fa-angle-down"},activate:function(e,t){var i,s,n=t.newPanel,t=t.newHeader;n.length&&!n.data("opened")?(i=t.find(".wp_china_yes-cloneable-value"),s=[],S.each(o,function(e,t){s.push(n.find('[data-depend-id="'+t+'"]'))}),S.each(s,function(e,t){t.on("change keyup wp_china_yes.keyup",function(){var n=[];S.each(s,function(e,t){t=t.val();t&&n.push(t)}),n.length&&i.text(n.join(f))}).trigger("wp_china_yes.keyup")}),n.wp_china_yes_reload_script(),n.data("opened",!0),n.data("retry",!1)):n.data("retry")&&(n.wp_china_yes_reload_script_retry(),n.data("retry",!1))}}),c.sortable({axis:"y",handle:".wp_china_yes-cloneable-title,.wp_china_yes-cloneable-sort",helper:"original",cursor:"move",placeholder:"widget-placeholder",start:function(e,t){c.accordion({active:!1}),c.sortable("refreshPositions"),t.item.children(".wp_china_yes-cloneable-content").data("retry",!0)},update:function(e,t){j.helper.name_nested_replace(c.children(".wp_china_yes-cloneable-item"),l),c.wp_china_yes_customizer_refresh(),d&&u(c)}}),i.children(".wp_china_yes-cloneable-add").on("click",function(e){e.preventDefault();var t=c.children(".wp_china_yes-cloneable-item").length;r.hide(),h&&hOpenStreetMap contributors'}).addTo(a),r=L.marker(c.center,{draggable:!0}).addTo(a),o=function(e){n.val(e.lat),i.val(e.lng),s.val(a.getZoom())},a.on("click",function(e){r.setLatLng(e.latlng),o(e.latlng)}),a.on("zoom",function(){o(r.getLatLng())}),r.on("drag",function(){o(r.getLatLng())}),t.length||(t=S('[data-depend-id="'+e.find(".wp_china_yes--address-field").data("address-field")+'"]')),f={},t.autocomplete({source:function(e,t){var n=e.term;n in f?t(f[n]):S.get("https://nominatim.openstreetmap.org/search",{format:"json",q:n},function(e){e=e.length?e.map(function(e){return{value:e.display_name,label:e.display_name,lat:e.lat,lon:e.lon}},"json"):[{value:"no-data",label:"No Results."}];f[n]=e,t(e)})},select:function(e,t){if("no-data"===t.item.value)return!1;t=L.latLng(t.item.lat,t.item.lon);a.panTo(t),r.setLatLng(t),o(t)},create:function(e,t){S(this).autocomplete("widget").addClass("wp_china_yes-map-ui-autocomplate")}}),n.on("change",l=function(){var e=L.latLng(n.val(),i.val());a.panTo(e),r.setLatLng(e)}),i.on("change",l))})},S.fn.wp_china_yes_field_link=function(){return this.each(function(){var i=S(this),e=i.find(".wp_china_yes--link"),s=i.find(".wp_china_yes--add"),c=i.find(".wp_china_yes--edit"),a=i.find(".wp_china_yes--remove"),r=i.find(".wp_china_yes--result"),t=j.helper.uid("wp_china_yes-wplink-textarea-");s.on("click",function(e){e.preventDefault(),_.wpLink.open(t)}),c.on("click",function(e){e.preventDefault(),s.trigger("click"),S("#wp-link-url").val(i.find(".wp_china_yes--url").val()),S("#wp-link-text").val(i.find(".wp_china_yes--text").val()),S("#wp-link-target").prop("checked","_blank"===i.find(".wp_china_yes--target").val())}),a.on("click",function(e){e.preventDefault(),i.find(".wp_china_yes--url").val("").trigger("change"),i.find(".wp_china_yes--text").val(""),i.find(".wp_china_yes--target").val(""),s.removeClass("hidden"),c.addClass("hidden"),a.addClass("hidden"),r.parent().addClass("hidden")}),e.attr("id",t).on("change",function(){var e=_.wpLink.getAttrs(),t=e.href,n=S("#wp-link-text").val(),e=e.target||"";i.find(".wp_china_yes--url").val(t).trigger("change"),i.find(".wp_china_yes--text").val(n),i.find(".wp_china_yes--target").val(e),r.html('{url:"'+t+'", text:"'+n+'", target:"'+e+'"}'),s.addClass("hidden"),c.removeClass("hidden"),a.removeClass("hidden"),r.parent().removeClass("hidden")})})},S.fn.wp_china_yes_field_media=function(){return this.each(function(){var n,i=S(this),s=i.find(".wp_china_yes--button"),c=i.find(".wp_china_yes--remove"),a=s.data("library")&&s.data("library").split(",")||"",r=!!i.hasClass("wp_china_yes-assign-field-background")&&i.closest(".wp_china_yes-field-background").find(".wp_china_yes--auto-attributes");s.on("click",function(e){e.preventDefault(),void 0!==_.wp&&_.wp.media&&_.wp.media.gallery&&(n||(n=_.wp.media({library:{type:a}})).on("select",function(){var e=n.state().get("selection").first().attributes,t=s.data("preview-size")||"thumbnail";a.length&&-1===a.indexOf(e.subtype)&&-1===a.indexOf(e.type)||(i.find(".wp_china_yes--id").val(e.id),i.find(".wp_china_yes--width").val(e.width),i.find(".wp_china_yes--height").val(e.height),i.find(".wp_china_yes--alt").val(e.alt),i.find(".wp_china_yes--title").val(e.title),i.find(".wp_china_yes--description").val(e.description),t=void 0!==e.sizes&&void 0!==e.sizes.thumbnail&&"thumbnail"===t?e.sizes.thumbnail.url:void 0!==e.sizes&&void 0!==e.sizes.full?e.sizes.full.url:"image"===e.type?e.url:e.icon,r&&r.removeClass("wp_china_yes--attributes-hidden"),c.removeClass("hidden"),i.find(".wp_china_yes--preview").removeClass("hidden"),i.find(".wp_china_yes--src").attr("src",t),i.find(".wp_china_yes--thumbnail").val(t),i.find(".wp_china_yes--url").val(e.url).trigger("change"))}),n.open())}),c.on("click",function(e){e.preventDefault(),r&&r.addClass("wp_china_yes--attributes-hidden"),c.addClass("hidden"),i.find("input").val(""),i.find(".wp_china_yes--preview").addClass("hidden"),i.find(".wp_china_yes--url").trigger("change")})})},S.fn.wp_china_yes_field_repeater=function(){return this.each(function(){function e(e){e.preventDefault();var t,n,i,e=s.children(".wp_china_yes-repeater-item").length;r.hide(),f&&f')).append(t),i.append(n),s.children().eq(e.index()).after(i),i.children(".wp_china_yes-repeater-content").wp_china_yes_reload_script(),j.helper.name_nested_replace(s.children(".wp_china_yes-repeater-item"),o),s.wp_china_yes_customizer_refresh(),s.wp_china_yes_customizer_listen({closest:!0}))}function t(e){e.preventDefault(),e=s.children(".wp_china_yes-repeater-item").length,a.hide(),r.hide(),l&&e-1'+i.unit+"")},spin:function(e,t){n.val(t.value).trigger("change")}})})},S.fn.wp_china_yes_field_switcher=function(){return this.each(function(){var n=S(this).find(".wp_china_yes--switcher");n.on("click",function(){var e=0,t=n.find("input");n.hasClass("wp_china_yes--active")?n.removeClass("wp_china_yes--active"):(e=1,n.addClass("wp_china_yes--active")),t.val(e).trigger("change")})})},S.fn.wp_china_yes_field_tabbed=function(){return this.each(function(){var e=S(this),t=e.find(".wp_china_yes-tabbed-nav a"),n=e.find(".wp_china_yes-tabbed-content");n.eq(0).wp_china_yes_reload_script(),t.on("click",function(e){e.preventDefault();var e=S(this),t=e.index(),t=n.eq(t);e.addClass("wp_china_yes-tabbed-active").siblings().removeClass("wp_china_yes-tabbed-active"),t.wp_china_yes_reload_script(),t.removeClass("hidden").siblings().addClass("hidden")})})},S.fn.wp_china_yes_field_typography=function(){return this.each(function(){var x=this,z=S(this),i=[],D=wp_china_yes_typography_json.webfonts,t=wp_china_yes_typography_json.googlestyles,O=wp_china_yes_typography_json.defaultstyles;x.sanitize_subset=function(e){return e=(e=e.replace("-ext"," Extended")).charAt(0).toUpperCase()+e.slice(1)},x.sanitize_style=function(e){return t[e]||e},x.load_google_font=function(e,t,n){e&&"object"==typeof WebFont&&(t=t?t.replace("normal",""):"",n=n?n.replace("normal",""):"",-1===i.indexOf(e=t||n?e+":"+t+n:e)&&WebFont.load({google:{families:[e]}}),i.push(e))},x.append_select_options=function(e,t,s,c,a){e.find("option").not(":first").remove();var r="";S.each(t,function(e,t){var n=t,i=a?s&&-1!==s.indexOf(t)?" selected":"":s&&s===t?" selected":"";"subset"===c?n=x.sanitize_subset(t):"style"===c&&(n=x.sanitize_style(t)),r+='"}),e.append(r).trigger("wp_china_yes.change").trigger("chosen:updated")},x.init=function(){var c,a,r,o,f,l,d,h,g,p=[],e=z.find(".wp_china_yes--typography"),u=z.find(".wp_china_yes--type"),v=z.find(".wp_china_yes--block-font-style"),m=e.data("unit"),_=e.data("line-height-unit"),t=e.data("exclude")?e.data("exclude").split(","):[],b=(z.find(".wp_china_yes--chosen").length&&z.find("select").each(function(){var e=S(this),t=e.parent().find(".chosen-container");t.length&&t.remove(),e.chosen({allow_single_deselect:!0,disable_search_threshold:15,width:"100%"})}),z.find(".wp_china_yes--font-family")),i=b.val(),s=(b.find("option").not(":first-child").remove(),""),y=(S.each(D,function(n,e){t&&-1!==t.indexOf(n)||(s+='',S.each(e.fonts,function(e,t){s+='"}),s+="")}),b.append(s).trigger("chosen:updated"),z.find(".wp_china_yes--block-font-style")),w=(y.length&&(c=z.find(".wp_china_yes--font-style-select"),a=c.val()?c.val().replace(/normal/g,""):"",c.on("change wp_china_yes.change",function(e){var t=c.val(),n=(t=!t&&p&&-1===p.indexOf("normal")?p[0]:t)&&"italic"!==t&&"normal"===t?"normal":"",n=t&&"italic"!==t&&"normal"!==t?t.replace("italic",""):n,t=t&&"italic"===t.substr(-6)?"italic":"";z.find(".wp_china_yes--font-weight").val(n),z.find(".wp_china_yes--font-style").val(t)}),(r=z.find(".wp_china_yes--block-extra-styles")).length&&(o=z.find(".wp_china_yes--extra-styles"),f=o.val())),z.find(".wp_china_yes--block-subset")),C=(w.length&&(l=z.find(".wp_china_yes--subset"),d=l.val(),h=l.data("multiple")||!1),z.find(".wp_china_yes--block-backup-font-family")),k=(b.on("change wp_china_yes.change",function(e){w.length&&w.addClass("hidden"),r.length&&r.addClass("hidden"),C.length&&C.addClass("hidden");var t,n,i=b.find(":selected"),s=i.val(),i=i.data("type");i&&s?("google"!==i&&"custom"!==i||!C.length||C.removeClass("hidden"),y.length&&(n=O,"google"===i&&D[i].fonts[s][0]?n=D[i].fonts[s][0]:"custom"===i&&D[i].fonts[s]&&(n=D[i].fonts[s]),t=-1!==(p=n).indexOf("normal")?"normal":n[0],t=a&&-1!==n.indexOf(a)?a:t,x.append_select_options(c,n,t,"style"),a=!1,y.removeClass("hidden"),"google"===i&&r.length&&1!',S.each(e.errors,function(e,t){var e=S('[data-depend-id="'+e+'"]'),n=S('a[href="#tab='+e.closest(".wp_china_yes-section").data("section-id")+'"]'),i=n.closest(".wp_china_yes-tab-item");e.closest(".wp_china_yes-fieldset").append('

    '+t+"

    "),n.find(".wp_china_yes-error").length||n.append(s),i.find(".wp_china_yes-arrow .wp_china_yes-error").length||i.find(".wp_china_yes-arrow").append(s)})),a.removeClass("wp_china_yes-saving"),c.prop("disabled",!1).attr("value",n),r=!1,j.vars.form_modified=!1,j.vars.$form_warning.hide(),clearTimeout(i);var s,t=S(".wp_china_yes-form-success");t.empty().append(e.notice).fadeIn("fast",function(){i=setTimeout(function(){t.fadeOut("fast")},1e3)})}).fail(function(e){alert(e.error)})):j.vars.form_modified=!1),r=!0})})},S.fn.wp_china_yes_options=function(){return this.each(function(){var e=S(this),t=e.find(".wp_china_yes-content"),n=e.find(".wp_china_yes-form-success"),i=e.find(".wp_china_yes-form-warning"),s=e.find(".wp_china_yes-header .wp_china_yes-save");(j.vars.$form_warning=i).length&&(_.onbeforeunload=function(){return!!j.vars.form_modified||y},t.on("change keypress",":input",function(){j.vars.form_modified||(n.hide(),i.fadeIn("fast"),j.vars.form_modified=!0)})),n.hasClass("wp_china_yes-form-show")&&setTimeout(function(){n.fadeOut("fast")},1e3),S(b).keydown(function(e){if((e.ctrlKey||e.metaKey)&&83===e.which)return s.trigger("click"),e.preventDefault(),!1})})},S.fn.wp_china_yes_taxonomy=function(){return this.each(function(){var e,t,n=S(this),i=n.parents("form");"addtag"===i.attr("id")&&(e=i.find("#submit"),t=n.children(".wp_china_yes-field").wp_china_yes_clone(),e.on("click",function(){i.find(".form-required").hasClass("form-invalid")||(n.data("inited",!1),n.empty(),n.html(t),t=t.wp_china_yes_clone(),n.wp_china_yes_reload_script())}))})},S.fn.wp_china_yes_shortcode=function(){var m=this;return m.shortcode_parse=function(e,n){var i="";return S.each(e,function(e,t){i+="["+(n=n||e),S.each(t,function(e,t){"content"===e?i=(i+="]")+t+"[/"+n:i+=m.shortcode_tags(e,t)}),i+="]"}),i},m.shortcode_tags=function(e,t){var n="";return""!==t&&("object"!=typeof t||S.isArray(t)?n+=" "+e+'="'+t.toString()+'"':S.each(t,function(e,t){""!==(t="background-image"===e?t.url||"":t)&&(n+=" "+e+'="'+t.toString()+'"')})),n},m.insertAtChars=function(e,t){e=void 0!==e[0].name?e[0]:e;return e.value.length&&void 0!==e.selectionStart?(e.focus(),e.value.substring(0,e.selectionStart)+t+e.value.substring(e.selectionEnd,e.value.length)):(e.focus(),t)},m.send_to_editor=function(e,t){var n;(n="undefined"!=typeof tinymce?tinymce.get(t):n)&&!n.isHidden()?n.execCommand("mceInsertContent",!1,e):(n=S("#"+t)).val(m.insertAtChars(n,e)).trigger("change")},this.each(function(){var s,c,a,n,r,o,f,i,l,d=S(this),h=d.find(".wp_china_yes-modal-load"),p=(d.find(".wp_china_yes-modal-content"),d.find(".wp_china_yes-modal-insert")),u=d.find(".wp_china_yes-modal-loading"),t=d.find("select"),g=d.data("modal-id"),v=d.data("nonce");S(b).on("click",'.wp_china_yes-shortcode-button[data-modal-id="'+g+'"]',function(e){e.preventDefault(),l=S(this),s=l.data("editor-id")||!1,c=l.data("target-id")||!1,a=l.data("gutenberg-id")||!1,d.removeClass("hidden"),d.hasClass("wp_china_yes-shortcode-single")&&r===y&&t.trigger("change")}),t.on("change",function(){var e=S(this),t=e.find(":selected");n=e.val(),r=t.data("shortcode"),o=t.data("view")||"normal",f=t.data("group")||r,h.empty(),n?(u.show(),_.wp.ajax.post("wp_china_yes-get-shortcode-"+g,{shortcode_key:n,nonce:v}).done(function(e){u.hide();e=S(e.content).appendTo(h);p.parent().removeClass("hidden"),i=e.find(".wp_china_yes--repeat-shortcode").wp_china_yes_clone(),e.wp_china_yes_reload_script(),e.find(".wp_china_yes-fields").wp_china_yes_reload_script()})):p.parent().addClass("hidden")}),p.on("click",function(e){if(e.preventDefault(),!p.prop("disabled")&&!p.attr("disabled")){var n="",t=d.find(".wp_china_yes-field:not(.wp_china_yes-depend-on)").find(":input:not(.ignore)").serializeObjectWP_CHINA_YES();switch(o){case"contents":var i=r?t[r]:t;S.each(i,function(e,t){e=r||e;n+="["+e+"]"+t+"[/"+e+"]"});break;case"group":n+="["+r,S.each(t[r],function(e,t){n+=m.shortcode_tags(e,t)}),n=(n=(n+="]")+m.shortcode_parse(t[f],f))+("[/"+r+"]");break;case"repeater":n+=m.shortcode_parse(t[f],f);break;default:n+=m.shortcode_parse(t)}n=""===n?"["+r+"]":n,a?(e=_.wp_china_yes_gutenberg_props.attributes.hasOwnProperty("shortcode")?_.wp_china_yes_gutenberg_props.attributes.shortcode:"",_.wp_china_yes_gutenberg_props.setAttributes({shortcode:e+n})):s?m.send_to_editor(n,s):(e=c?S(c):l.parent().find("textarea")).val(m.insertAtChars(e,n)).trigger("change"),d.addClass("hidden")}}),d.on("click",".wp_china_yes--repeat-button",function(e){e.preventDefault();var e=d.find(".wp_china_yes--repeatable"),t=i.wp_china_yes_clone(),n=t.find(".wp_china_yes-repeat-remove");t.appendTo(e);t.find(".wp_china_yes-fields").wp_china_yes_reload_script(),j.helper.name_nested_replace(d.find(".wp_china_yes--repeat-shortcode"),f),n.on("click",function(){t.remove(),j.helper.name_nested_replace(d.find(".wp_china_yes--repeat-shortcode"),f)})}),d.on("click",".wp_china_yes-modal-close, .wp_china_yes-modal-overlay",function(){d.addClass("hidden")})})},"function"==typeof Color&&(Color.prototype.toString=function(){if(this._alpha<1)return this.toCSS("rgba",this._alpha).replace(/\s+/g,"");var e=parseInt(this._color,10).toString(16);if(this.error)return"";if(e.length<6)for(var t=6-e.length-1;0<=t;t--)e="0"+e;return"#"+e}),j.funcs.parse_color=function(e){var e=e.replace(/\s+/g,""),t=-1!==e.indexOf("rgba")?parseFloat(100*e.replace(/^.*,(.+)\)/,"$1")):100;return{value:e,transparent:t,rgba:t<100}},S.fn.wp_china_yes_color=function(){return this.each(function(){var a,r=S(this),n=j.funcs.parse_color(r.val()),e=!_.wp_china_yes_vars.color_palette.length||_.wp_china_yes_vars.color_palette;r.hasClass("wp-color-picker")&&r.closest(".wp-picker-container").after(r).remove(),r.wpColorPicker({palettes:e,change:function(e,t){t=t.color.toString();a.removeClass("wp_china_yes--transparent-active"),a.find(".wp_china_yes--transparent-offset").css("background-color",t),r.val(t).trigger("change")},create:function(){a=r.closest(".wp-picker-container");var i=r.data("a8cIris"),e=S('
    transparent
    ').appendTo(a.find(".wp-picker-holder")),s=e.find(".wp_china_yes--transparent-slider"),c=e.find(".wp_china_yes--transparent-text"),t=e.find(".wp_china_yes--transparent-offset"),e=e.find(".wp_china_yes--transparent-button");"transparent"===r.val()&&a.addClass("wp_china_yes--transparent-active"),e.on("click",function(){"transparent"!==r.val()?(r.val("transparent").trigger("change").removeClass("iris-error"),a.addClass("wp_china_yes--transparent-active")):(r.val(i._color.toString()).trigger("change"),a.removeClass("wp_china_yes--transparent-active"))}),s.slider({value:n.transparent,step:1,min:0,max:100,slide:function(e,t){t=parseFloat(t.value/100);i._color._alpha=t,r.wpColorPicker("color",i._color.toString()),c.text(1===t||0===t?"":t)},create:function(){var e=parseFloat(n.transparent/100);c.text(e<1?e:""),t.css("background-color",n.value),a.on("click",".wp-picker-clear",function(){i._color._alpha=1,c.text(""),s.slider("option","value",100),a.removeClass("wp_china_yes--transparent-active"),r.trigger("change")}),a.on("click",".wp-picker-default",function(){var e=j.funcs.parse_color(r.data("default-color")),t=parseFloat(e.transparent/100),n=t<1?t:"";i._color._alpha=t,c.text(n),s.slider("option","value",e.transparent),"transparent"===e.value&&(r.removeClass("iris-error"),a.addClass("wp_china_yes--transparent-active"))})}})}})})},S.fn.wp_china_yes_chosen=function(){return this.each(function(){var n,c,a=S(this),e=a.parent().find(".chosen-container"),t=a.hasClass("wp_china_yes-chosen-sortable")||!1,i=a.hasClass("wp_china_yes-chosen-ajax")||!1,s=a.attr("multiple")||!1,r=S.extend({allow_single_deselect:!0,disable_search_threshold:10,width:s?"100%":"auto",no_results_text:_.wp_china_yes_vars.i18n.no_results_text},a.data("chosen-settings"));e.length&&e.remove(),i?(e=S.extend({data:{type:"post",nonce:""},allow_single_deselect:!0,disable_search_threshold:-1,width:"100%",min_length:3,type_delay:500,typing_text:_.wp_china_yes_vars.i18n.typing_text,searching_text:_.wp_china_yes_vars.i18n.searching_text,no_results_text:_.wp_china_yes_vars.i18n.no_results_text},a.data("chosen-settings")),a.WP_CHINA_YESAjaxChosen(e)):a.chosen(r),s&&(i=(n=a.parent().find(".wp_china_yes-hide-select")).val()||[],a.on("change",function(e,t){t&&t.selected?n.append('"):t&&t.deselected&&n.find('option[value="'+t.deselected+'"]').remove(),_.wp.customize!==y&&0===n.children().length&&n.data("customize-setting-link")&&_.wp.customize.control(n.data("customize-setting-link")).setting.set(""),n.trigger("change")}),a.WP_CHINA_YESChosenOrder(i,!0)),t&&((c=a.parent().find(".chosen-container").find(".chosen-choices")).bind("mousedown",function(e){S(e.target).is("span")&&e.stopPropagation()}),c.sortable({items:"li:not(.search-field)",helper:"orginal",cursor:"move",placeholder:"search-choice-placeholder",start:function(e,t){t.placeholder.width(t.item.innerWidth()),t.placeholder.height(t.item.innerHeight())},update:function(e,t){var i="",s=a.data("chosen"),n=a.parent().find(".wp_china_yes-hide-select");c.find(".search-choice-close").each(function(){var n=S(this).data("option-array-index");S.each(s.results_data,function(e,t){t.array_index===n&&(i+='")})}),n.children().remove(),n.append(i),n.trigger("change")}}))})},S.fn.wp_china_yes_checkbox=function(){return this.each(function(){var e=S(this),t=e.find(".wp_china_yes--input"),n=e.find(".wp_china_yes--checkbox");n.on("click",function(){t.val(Number(n.prop("checked"))).trigger("change")})})},S.fn.wp_china_yes_checkbox_all=function(){return this.each(function(){var n=S(this);n.on("click",function(){var e=n.closest(".wp_china_yes-field-checkbox").find(":input"),t=!1;e.each(function(){S(this).prop("checked")||(t=!0)}),t?(e.prop("checked","checked"),e.attr("checked","checked")):(e.prop("checked",""),e.removeAttr("checked")),e.first().trigger("change")})})},S.fn.wp_china_yes_siblings=function(){return this.each(function(){var t=S(this),e=t.find(".wp_china_yes--sibling"),n=t.data("multiple")||!1;e.on("click",function(){var e=S(this);n?e.hasClass("wp_china_yes--active")?(e.removeClass("wp_china_yes--active"),e.find("input").prop("checked",!1).trigger("change")):(e.addClass("wp_china_yes--active"),e.find("input").prop("checked",!0).trigger("change")):(t.find("input").prop("checked",!1),e.find("input").prop("checked",!0).trigger("change"),e.addClass("wp_china_yes--active").siblings().removeClass("wp_china_yes--active"))})})},S.fn.wp_china_yes_help=function(){return this.each(function(){var e,t,n=S(this);n.on({mouseenter:function(){e=S('
    ').html(n.find(".wp_china_yes-help-text").html()).appendTo("body"),t=j.vars.is_rtl?n.offset().left+24:n.offset().left-e.outerWidth(),e.css({top:n.offset().top-(e.outerHeight()/2-14),left:t})},mouseleave:function(){e!==y&&e.remove()}})})},S.fn.wp_china_yes_customizer_refresh=function(){return this.each(function(){var e=S(this),t=e.closest(".wp_china_yes-customize-complex");if(t.length){var n=t.data("unique-id");if(n===y)return;var i=t.find(":input"),t=t.data("option-id"),i=i.serializeObjectWP_CHINA_YES(),i=!S.isEmptyObject(i)&&i[n]&&i[n][t]?i[n][t]:"",n=_.wp.customize.control(n+"["+t+"]");n.setting._value=null,n.setting.set(i)}else e.find(":input").first().trigger("change");S(b).trigger("wp_china_yes-customizer-refresh",e)})},S.fn.wp_china_yes_customizer_listen=function(e){var s=S.extend({closest:!1},e);return this.each(function(){var t,e,n,i;_.wp.customize!==y&&(e=(t=s.closest?S(this).closest(".wp_china_yes-customize-complex"):S(this)).find(":input"),n=t.data("unique-id"),i=t.data("option-id"),n!==y&&e.on("change keyup wp_china_yes.change",function(){var e=t.find(":input").serializeObjectWP_CHINA_YES(),e=!S.isEmptyObject(e)&&e[n]&&e[n][i]?e[n][i]:"";_.wp.customize.control(n+"["+i+"]").setting.set(e)}))})},S(b).on("expanded",".control-section",function(){var e,t,n=S(this);n.hasClass("open")&&!n.data("inited")&&(e=n.find(".wp_china_yes-customize-field"),t=n.find(".wp_china_yes-customize-complex"),e.length&&(n.wp_china_yes_dependency(),e.wp_china_yes_reload_script({dependency:!1}),t.wp_china_yes_customizer_listen()),n.data("inited",!0))}),j.vars.$window.on("resize wp_china_yes.resize",j.helper.debounce(function(e){(-1",noCalendar:!1,now:new Date,onChange:[],onClose:[],onDayCreate:[],onDestroy:[],onKeyDown:[],onMonthChange:[],onOpen:[],onParseConfig:[],onReady:[],onValueUpdate:[],onYearChange:[],onPreCalendarPosition:[],plugins:[],position:"auto",positionElement:void 0,prevArrow:"",shorthandCurrentMonth:!1,showMonths:1,static:!1,time_24hr:!1,weekNumbers:!1,wrap:!1},fe={weekdays:{shorthand:["Sun","Mon","Tue","Wed","Thu","Fri","Sat"],longhand:["Sunday","Monday","Tuesday","Wednesday","Thursday","Friday","Saturday"]},months:{shorthand:["Jan","Feb","Mar","Apr","May","Jun","Jul","Aug","Sep","Oct","Nov","Dec"],longhand:["January","February","March","April","May","June","July","August","September","October","November","December"]},daysInMonth:[31,28,31,30,31,30,31,31,30,31,30,31],firstDayOfWeek:0,ordinal:function(e){e%=100;if(3Math.min(t,n)&&en)&&(p.amPM.textContent=p.l10n.amPM[_e(p.amPM.textContent===p.l10n.amPM[0])]),t.value=pe(s)));var t,n,i,o,s,r,a=p._input.value;u(),T(),p._input.value!==a&&p._debouncedChange()}function u(){var e,t,n,i,o,s;void 0!==p.hourElement&&void 0!==p.minuteElement&&(o=(parseInt(p.hourElement.value.slice(-2),10)||0)%24,e=(parseInt(p.minuteElement.value,10)||0)%60,t=void 0!==p.secondElement?(parseInt(p.secondElement.value,10)||0)%60:0,void 0!==p.amPM&&(n=o,i=p.amPM.textContent,o=n%12+12*_e(i===p.l10n.amPM[1])),n=void 0!==p.config.minTime||p.config.minDate&&p.minDateHasTime&&p.latestSelectedDateObj&&0===Ee(p.latestSelectedDateObj,p.config.minDate,!0),(void 0!==p.config.maxTime||p.config.maxDate&&p.maxDateHasTime&&p.latestSelectedDateObj&&0===Ee(p.latestSelectedDateObj,p.config.maxDate,!0))&&(i=void 0!==p.config.maxTime?p.config.maxTime:p.config.maxDate,(e=(o=Math.min(o,i.getHours()))===i.getHours()?Math.min(e,i.getMinutes()):e)===i.getMinutes()&&(t=Math.min(t,i.getSeconds()))),n&&(s=void 0!==p.config.minTime?p.config.minTime:p.config.minDate,(e=(o=Math.max(o,s.getHours()))===s.getHours()&&ep.now?p.config.minDate:p.config.maxDate&&p.config.maxDate"+p.config.getWeek(t)+""),k("onDayCreate",s),s}function _(e){e.focus(),"range"===p.config.mode&&K(e)}function m(e){for(var t=0=Math.abs(o))return void _(f)}p.changeMonth(a),g(m(a),0)}else _(e)}function f(){if(void 0!==p.daysContainer){be(p.daysContainer),p.weekNumbers&&be(p.weekNumbers);for(var e=document.createDocumentFragment(),t=0;tp.config.maxDate.getMonth()||((e=ye("option","flatpickr-monthDropdown-month")).value=new Date(p.currentYear,t).getMonth().toString(),e.textContent=Ce(t,p.config.shorthandCurrentMonth,p.l10n),e.tabIndex=-1,p.currentMonth===t&&(e.selected=!0),p.monthsDropdownContainer.appendChild(e))}}function q(){be(p.monthNav),p.monthNav.appendChild(p.prevMonthNav),p.config.showMonths&&(p.yearElements=[],p.monthElements=[]);for(var e,t,n,i,o,s=p.config.showMonths;s--;){o=i=r=n=t=e=void 0,e=ye("div","flatpickr-month"),t=window.document.createDocumentFragment(),n=1\n "+t.join("")+"\n \n "}}function y(e,t){t=(t=void 0===t?!0:t)?e:e-p.currentMonth;t<0&&!0===p._hidePrevMonthArrow||0p.config.maxDate.getFullYear()||(t=p.currentYear!==e,p.currentYear=e||p.currentYear,p.config.maxDate&&p.currentYear===p.config.maxDate.getFullYear()?p.currentMonth=Math.min(p.config.maxDate.getMonth(),p.currentMonth):p.config.minDate&&p.currentYear===p.config.minDate.getFullYear()&&(p.currentMonth=Math.max(p.config.minDate.getMonth(),p.currentMonth)),t&&(p.redraw(),k("onYearChange"),v()))}function D(e,t){var n=p.parseDate(e,void 0,t=void 0===t?!0:t);if(p.config.minDate&&n&&Ee(n,p.config.minDate,void 0!==t?t:!p.minDateHasTime)<0||p.config.maxDate&&n&&0=a.from.getTime()&&n.getTime()<=a.to.getTime())return o}return!o}function C(e){return void 0!==p.daysContainer&&(-1===e.className.indexOf("hidden")&&-1===e.className.indexOf("flatpickr-disabled")&&p.daysContainer.contains(e))}function U(e){e.target===p._input&&(0n,o=window.pageYOffset+t.top+(s?-n-2:e.offsetHeight+2),ve(p.calendarContainer,"arrowTop",!s),ve(p.calendarContainer,"arrowBottom",s),p.config.inline||(n=window.pageXOffset+t.left,s=e=!1,"center"===i?(n-=(r-t.width)/2,e=!0):"right"===i&&(n-=r-t.width,s=!0),ve(p.calendarContainer,"arrowLeft",!e&&!s),ve(p.calendarContainer,"arrowCenter",e),ve(p.calendarContainer,"arrowRight",s),i=window.document.body.offsetWidth-(window.pageXOffset+t.right),e=n+r>window.document.body.offsetWidth,s=i+r>window.document.body.offsetWidth,ve(p.calendarContainer,"rightMost",e),p.config.static||(p.calendarContainer.style.top=o+"px",e?s?void 0!==(o=function(){for(var e=null,t=0;tp.currentMonth+p.config.showMonths-1)&&"range"!==p.config.mode,p.selectedDateElem=e,"single"===p.config.mode?p.selectedDates=[n]:"multiple"===p.config.mode?(i=oe(n))?p.selectedDates.splice(parseInt(i),1):p.selectedDates.push(n):"range"===p.config.mode&&(2===p.selectedDates.length&&p.clear(!1,!1),p.latestSelectedDateObj=n,p.selectedDates.push(n),0!==Ee(n,p.selectedDates[0],!0)&&p.selectedDates.sort(function(e,t){return e.getTime()-t.getTime()})),u(),t&&(i=p.currentYear!==n.getFullYear(),p.currentYear=n.getFullYear(),p.currentMonth=n.getMonth(),i&&(k("onYearChange"),v()),k("onMonthChange")),E(),f(),T(),t||"range"===p.config.mode||1!==p.config.showMonths?void 0!==p.selectedDateElem&&void 0===p.hourElement&&p.selectedDateElem&&p.selectedDateElem.focus():_(e),void 0!==p.hourElement&&void 0!==p.hourElement&&p.hourElement.focus(),p.config.closeOnSelect&&(n="single"===p.config.mode&&!p.config.enableTime,i="range"===p.config.mode&&2===p.selectedDates.length&&!p.config.enableTime,(n||i)&&Z()),o())}p.parseDate=ke({config:p.config,l10n:p.l10n}),p._handlers=[],p.pluginElements=[],p.loadedPlugins=[],p._bind=a,p._setHoursFromDate=i,p._positionCalendar=x,p.changeMonth=y,p.changeYear=w,p.clear=function(e,t){void 0===e&&(e=!0);void 0===t&&(t=!0);p.input.value="",void 0!==p.altInput&&(p.altInput.value="");void 0!==p.mobileInput&&(p.mobileInput.value="");p.selectedDates=[],!(p.latestSelectedDateObj=void 0)===t&&(p.currentYear=p._initialDate.getFullYear(),p.currentMonth=p._initialDate.getMonth());{var n,i;!0===p.config.enableTime&&(t=Se(p.config),n=t.hours,i=t.minutes,t=t.seconds,r(n,i,t))}p.redraw(),e&&k("onChange")},p.close=function(){p.isOpen=!1,p.isMobile||(void 0!==p.calendarContainer&&p.calendarContainer.classList.remove("open"),void 0!==p._input&&p._input.classList.remove("active"));k("onClose")},p._createElement=ye,p.destroy=function(){void 0!==p.config&&k("onDestroy");for(var e=p._handlers.length;e--;)p._handlers[e].remove();if(p._handlers=[],p.mobileInput)p.mobileInput.parentNode&&p.mobileInput.parentNode.removeChild(p.mobileInput),p.mobileInput=void 0;else if(p.calendarContainer&&p.calendarContainer.parentNode)if(p.config.static&&p.calendarContainer.parentNode){var t=p.calendarContainer.parentNode;if(t.lastChild&&t.removeChild(t.lastChild),t.parentNode){for(;t.firstChild;)t.parentNode.insertBefore(t.firstChild,t);t.parentNode.removeChild(t)}}else p.calendarContainer.parentNode.removeChild(p.calendarContainer);p.altInput&&(p.input.type="text",p.altInput.parentNode&&p.altInput.parentNode.removeChild(p.altInput),delete p.altInput);p.input&&(p.input.type=p.input._type,p.input.classList.remove("flatpickr-input"),p.input.removeAttribute("readonly"));["_showTimeInput","latestSelectedDateObj","_hideNextMonthArrow","_hidePrevMonthArrow","__hideNextMonthArrow","__hidePrevMonthArrow","isMobile","isOpen","selectedDateElem","minDateHasTime","maxDateHasTime","days","daysContainer","_input","_positionElement","innerContainer","rContainer","monthNav","todayDateElem","calendarContainer","weekdayContainer","prevMonthNav","nextMonthNav","monthsDropdownContainer","currentMonthElement","currentYearElement","navigationCurrentMonth","selectedDateElem","config"].forEach(function(e){try{delete p[e]}catch(e){}})},p.isEnabled=D,p.jumpToDate=s,p.open=function(e,t){void 0===t&&(t=p._positionElement);var n;!0===p.isMobile?(e&&(e.preventDefault(),(n=De(e))&&n.blur()),void 0!==p.mobileInput&&(p.mobileInput.focus(),p.mobileInput.click()),k("onOpen")):p._input.disabled||p.config.inline||(n=p.isOpen,p.isOpen=!0,n||(p.calendarContainer.classList.add("open"),p._input.classList.add("active"),k("onOpen"),x(t)),!0!==p.config.enableTime||!0!==p.config.noCalendar||!1!==p.config.allowInput||void 0!==e&&p.timeContainer.contains(e.relatedTarget)||setTimeout(function(){return p.hourElement.select()},50))},p.redraw=X,p.set=function(e,t){if(null!==e&&"object"==typeof e)for(var n in Object.assign(p.config,e),e)void 0!==M[n]&&M[n].forEach(function(e){return e()});else p.config[e]=t,void 0!==M[e]?M[e].forEach(function(e){return e()}):-1p.config.maxDate.getMonth():p.currentYear>p.config.maxDate.getFullYear()))}function se(t){return p.selectedDates.map(function(e){return p.formatDate(e,t)}).filter(function(e,t,n){return"range"!==p.config.mode||p.config.enableTime||n.indexOf(e)===t}).join("range"!==p.config.mode?p.config.conjunction:p.l10n.rangeSeparator)}function T(e){void 0===e&&(e=!0),void 0!==p.mobileInput&&p.mobileFormatStr&&(p.mobileInput.value=void 0!==p.latestSelectedDateObj?p.formatDate(p.latestSelectedDateObj,p.mobileFormatStr):""),p.input.value=se(p.config.dateFormat),void 0!==p.altInput&&(p.altInput.value=se(p.config.altFormat)),!1!==e&&k("onValueUpdate")}function re(e){var e=De(e),t=p.prevMonthNav.contains(e),n=p.nextMonthNav.contains(e);t||n?y(t?-1:1):0<=p.yearElements.indexOf(e)?e.select():e.classList.contains("arrowUp")?p.changeYear(p.currentYear+1):e.classList.contains("arrowDown")&&p.changeYear(p.currentYear-1)}p.element=p.input=c,p.isOpen=!1;var e=["wrap","weekNumbers","allowInput","allowInvalidPreload","clickOpens","time_24hr","enableTime","noCalendar","altInput","shorthandCurrentMonth","inline","static","enableSeconds","disableMobile"],t=ce(ce({},JSON.parse(JSON.stringify(c.dataset||{}))),P),n={},O=(p.config.parseDate=t.parseDate,p.config.formatDate=t.formatDate,Object.defineProperty(p.config,"enable",{get:function(){return p.config._enable},set:function(e){p.config._enable=ne(e)}}),Object.defineProperty(p.config,"disable",{get:function(){return p.config._disable},set:function(e){p.config._disable=ne(e)}}),"time"===t.mode);function ae(t){return function(e){p.config["min"===t?"_minTime":"_maxTime"]=p.parseDate(e,"H:i:S")}}t.dateFormat||!t.enableTime&&!O||(N=Ie.defaultConfig.dateFormat||de.dateFormat,n.dateFormat=t.noCalendar||O?"H:i"+(t.enableSeconds?":S":""):N+" H:i"+(t.enableSeconds?":S":"")),t.altInput&&(t.enableTime||O)&&!t.altFormat&&(N=Ie.defaultConfig.altFormat||de.altFormat,n.altFormat=t.noCalendar||O?"h:i"+(t.enableSeconds?":S K":" K"):N+(" h:i"+(t.enableSeconds?":S":""))+" K"),Object.defineProperty(p.config,"minDate",{get:function(){return p.config._minDate},set:Q("min")}),Object.defineProperty(p.config,"maxDate",{get:function(){return p.config._maxDate},set:Q("max")}),Object.defineProperty(p.config,"minTime",{get:function(){return p.config._minTime},set:ae("min")}),Object.defineProperty(p.config,"maxTime",{get:function(){return p.config._maxTime},set:ae("max")}),"time"===t.mode&&(p.config.noCalendar=!0,p.config.enableTime=!0),Object.assign(p.config,n,t);for(var S=0;Sp.now.getTime()?p.config.minDate:p.config.maxDate&&p.config.maxDate.getTime()'+this.options.typing_text.replace("%s",this.options.min_length-e.length)+"")},t.prototype.update_list=function(){var e,t,n=this;this.search_welcome_message(),this.is_typing||(t=(e=r.trim(this.search_field.val())).length").attr("value",t.value).html(t.text).appendTo(s.element)}),t=this.search_field.val(),i=this.search_field.innerWidth(),this.element.trigger("chosen:updated"),this.is_multiple&&(o=this.element.parent().find(".wp_china_yes-hide-select").val()||[],this.element.WP_CHINA_YESChosenOrder(o,!0),this.search_field.css("width",i)),this.search_field.val(t),null!==this.chosenXhr.done&&this.chosenXhr.done(e)))},r.fn.WP_CHINA_YESAjaxChosen=function(e){return this.each(function(){new t(this,e)})}}(jQuery),function(){var s,r,a=[].indexOf||function(e){for(var t=0,n=this.length;t"+this.escape_html(e.group_label)+""+e.html:e.html},c.prototype.mouse_enter=function(){return this.mouse_on_container=!0},c.prototype.mouse_leave=function(){return this.mouse_on_container=!1},c.prototype.input_focus=function(e){if(this.is_multiple){if(!this.active_field)return setTimeout((t=this,function(){return t.container_mousedown()}),50)}else if(!this.active_field)return this.activate_field();var t},c.prototype.input_blur=function(e){if(!this.mouse_on_container)return this.active_field=!1,setTimeout((t=this,function(){return t.blur_test()}),100);var t},c.prototype.label_click_handler=function(e){return this.is_multiple?this.container_mousedown(e):this.activate_field()},c.prototype.results_option_build=function(e){for(var t,n,i="",o=0,s=this.results_data,r=0,a=s.length;r=this.max_shown_results));r++);return i},c.prototype.result_add_option=function(e){var t,n;return e.search_match&&this.include_option_in_results(e)?(t=[],e.disabled||e.selected&&this.is_multiple||t.push("active-result"),!e.disabled||e.selected&&this.is_multiple||t.push("disabled-result"),e.selected&&t.push("result-selected"),null!=e.group_array_index&&t.push("group-option"),""!==e.classes&&t.push(e.classes),(n=document.createElement("li")).className=t.join(" "),e.style&&(n.style.cssText=e.style),n.setAttribute("data-option-array-index",e.array_index),n.innerHTML=e.highlighted_html||e.html,e.title&&(n.title=e.title),this.outerHTML(n)):""},c.prototype.result_add_group=function(e){var t,n;return(e.search_match||e.group_match)&&0"+this.escape_html(n)+""+this.escape_html(f)),null!=u&&(u.group_match=!0)):null!=s.group_array_index&&this.results_data[s.group_array_index].search_match&&(s.search_match=!0)));return this.result_clear_highlight(),h<1&&a.length?(this.update_results_content(""),this.no_results(a)):(this.update_results_content(this.results_option_build()),null!=e&&e.skip_highlight?void 0:this.winnow_results_set_highlight())},c.prototype.get_search_regex=function(e){var t,e=this.search_contains?e:"(^|\\s|\\b)"+e+"[^\\s]*";return this.enable_split_word_search||this.search_contains||(e="^"+e),t=this.case_sensitive_search?"":"i",new RegExp(e,t)},c.prototype.search_string_match=function(e,t){t=t.exec(e);return!this.search_contains&&null!=t&&t[1]&&(t.index+=1),t},c.prototype.choices_count=function(){var e,t,n;if(null==this.selected_option_count)for(e=this.selected_option_count=0,t=(n=this.form_field.options).length;e\n '+this.default_text+'\n
    \n\n
    \n \n
      \n
      '},c.prototype.get_multi_html=function(){return'
        \n
      • \n \n
      • \n
      \n
      \n
        \n
        '},c.prototype.get_no_results_html=function(e){return'
      • \n '+this.results_none_found+" "+this.escape_html(e)+"\n
      • "},c.browser_is_supported=function(){return"Microsoft Internet Explorer"===window.navigator.appName?8<=document.documentMode:!(/iP(od|hone)/i.test(window.navigator.userAgent)||/IEMobile/i.test(window.navigator.userAgent)||/Windows Phone/i.test(window.navigator.userAgent)||/BlackBerry/i.test(window.navigator.userAgent)||/BB10/i.test(window.navigator.userAgent)||/Android.*Mobile/i.test(window.navigator.userAgent))},c.default_multiple_text="Select Some Options",c.default_single_text="Select an Option",c.default_no_result_text="No results match",s=c,(a=jQuery).fn.extend({chosen:function(i){return s.browser_is_supported()?this.each(function(e){var t=a(this),n=t.data("chosen");"destroy"===i?n instanceof o&&n.destroy():n instanceof o||t.data("chosen",new o(this,i))}):this}}),o=function(){var e,t=o,n=s;for(e in n)l.call(n,e)&&(t[e]=n[e]);function i(){this.constructor=t}function o(){return o.__super__.constructor.apply(this,arguments)}return i.prototype=n.prototype,t.prototype=new i,t.__super__=n.prototype,o.prototype.setup=function(){return this.form_field_jq=a(this.form_field),this.current_selectedIndex=this.form_field.selectedIndex},o.prototype.set_up_html=function(){var e=["chosen-container"];return e.push("chosen-container-"+(this.is_multiple?"multi":"single")),this.inherit_select_classes&&this.form_field.className&&e.push(this.form_field.className),this.is_rtl&&e.push("chosen-rtl"),e={class:e.join(" "),title:this.form_field.title},this.form_field.id.length&&(e.id=this.form_field.id.replace(/[^\w]/g,"_")+"_chosen"),this.container=a("
        ",e),this.container.width(this.container_width()),this.is_multiple?this.container.html(this.get_multi_html()):this.container.html(this.get_single_html()),this.form_field_jq.hide().after(this.container),this.dropdown=this.container.find("div.chosen-drop").first(),this.search_field=this.container.find("input").first(),this.search_results=this.container.find("ul.chosen-results").first(),this.search_field_scale(),this.search_no_results=this.container.find("li.no-results").first(),this.is_multiple?(this.search_choices=this.container.find("ul.chosen-choices").first(),this.search_container=this.container.find("li.search-field").first()):(this.search_container=this.container.find("div.chosen-search").first(),this.selected_item=this.container.find(".chosen-single").first()),this.results_build(),this.set_tab_index(),this.set_label_behavior()},o.prototype.on_ready=function(){return this.form_field_jq.trigger("chosen:ready",{chosen:this})},o.prototype.register_observers=function(){var t,n,i,o,s,r,a,l,c,h,u,d,f,p,_,m,g,v,y,b,w,D,C,x;return this.container.on("touchstart.chosen",(t=this,function(e){t.container_mousedown(e)})),this.container.on("touchend.chosen",(n=this,function(e){n.container_mouseup(e)})),this.container.on("mousedown.chosen",(i=this,function(e){i.container_mousedown(e)})),this.container.on("mouseup.chosen",(o=this,function(e){o.container_mouseup(e)})),this.container.on("mouseenter.chosen",(s=this,function(e){s.mouse_enter(e)})),this.container.on("mouseleave.chosen",(r=this,function(e){r.mouse_leave(e)})),this.search_results.on("mouseup.chosen",(a=this,function(e){a.search_results_mouseup(e)})),this.search_results.on("mouseover.chosen",(l=this,function(e){l.search_results_mouseover(e)})),this.search_results.on("mouseout.chosen",(c=this,function(e){c.search_results_mouseout(e)})),this.search_results.on("mousewheel.chosen DOMMouseScroll.chosen",(h=this,function(e){h.search_results_mousewheel(e)})),this.search_results.on("touchstart.chosen",(u=this,function(e){u.search_results_touchstart(e)})),this.search_results.on("touchmove.chosen",(d=this,function(e){d.search_results_touchmove(e)})),this.search_results.on("touchend.chosen",(f=this,function(e){f.search_results_touchend(e)})),this.form_field_jq.on("chosen:updated.chosen",(p=this,function(e){p.results_update_field(e)})),this.form_field_jq.on("chosen:activate.chosen",(_=this,function(e){_.activate_field(e)})),this.form_field_jq.on("chosen:open.chosen",(m=this,function(e){m.container_mousedown(e)})),this.form_field_jq.on("chosen:close.chosen",(g=this,function(e){g.close_field(e)})),this.search_field.on("blur.chosen",(v=this,function(e){v.input_blur(e)})),this.search_field.on("keyup.chosen",(y=this,function(e){y.keyup_checker(e)})),this.search_field.on("keydown.chosen",(b=this,function(e){b.keydown_checker(e)})),this.search_field.on("focus.chosen",(w=this,function(e){w.input_focus(e)})),this.search_field.on("cut.chosen",(D=this,function(e){D.clipboard_event_checker(e)})),this.search_field.on("paste.chosen",(C=this,function(e){C.clipboard_event_checker(e)})),this.is_multiple?this.search_choices.on("click.chosen",(x=this,function(e){x.choices_click(e)})):this.container.on("click.chosen",function(e){e.preventDefault()})},o.prototype.destroy=function(){return a(this.container[0].ownerDocument).off("click.chosen",this.click_test_action),0",{class:"search-choice"}).html(""+this.choice_label(e)+"");return e.disabled?n.addClass("search-choice-disabled"):((e=a("",{class:"search-choice-close","data-option-array-index":e.array_index})).on("click.chosen",(t=this,function(e){return t.choice_destroy_link_click(e)})),n.append(e)),this.search_container.before(n)},o.prototype.choice_destroy_link_click=function(e){if(e.preventDefault(),e.stopPropagation(),!this.is_disabled)return this.choice_destroy(a(e.target))},o.prototype.choice_destroy=function(e){if(this.result_deselect(e[0].getAttribute("data-option-array-index")))return this.active_field?this.search_field.focus():this.show_search_field_default(),this.is_multiple&&0'),this.selected_item.addClass("chosen-single-with-deselect")},o.prototype.get_search_field_value=function(){return this.search_field.val()},o.prototype.get_search_text=function(){return a.trim(this.get_search_field_value())},o.prototype.escape_html=function(e){return a("
        ").text(e).html()},o.prototype.winnow_results_set_highlight=function(){var e=this.is_multiple?[]:this.search_results.find(".result-selected.active-result"),e=(e.length?e:this.search_results.find(".active-result")).first();if(null!=e)return this.result_do_highlight(e)},o.prototype.no_results=function(e){e=this.get_no_results_html(e);return this.search_results.append(e),this.form_field_jq.trigger("chosen:no_results",{chosen:this})},o.prototype.no_results_clear=function(){return this.search_results.find(".no-results").remove()},o.prototype.keydown_arrow=function(){var e;return this.results_showing&&this.result_highlight?(e=this.result_highlight.nextAll("li.active-result").first())?this.result_do_highlight(e):void 0:this.results_show()},o.prototype.keyup_arrow=function(){var e;return this.results_showing||this.is_multiple?this.result_highlight?(e=this.result_highlight.prevAll("li.active-result")).length?this.result_do_highlight(e.first()):(0").css(o)).text(this.get_search_field_value()),a("body").append(e),r=e.width()+25,e.remove(),this.container.is(":visible")&&(r=Math.min(this.container.outerWidth()-10,r)),this.search_field.width(r)}},o.prototype.trigger_form_field_change=function(e){return this.form_field_jq.trigger("input",e),this.form_field_jq.trigger("change",e)},o}()}.call(this),function(r){"use strict";function i(e,t,n){this.init(e,t,n)}function e(){this.rules=[]}r.extend(i.prototype,{init:function(e,t,n){this.controller=e,this.condition=t,this.value=n,this.rules=[],this.controls=[]},evalCondition:function(e,t,n,i,o){if("=="==n)return this.checkBoolean(i)==this.checkBoolean(o);if("!="==n)return this.checkBoolean(i)!=this.checkBoolean(o);if(">="==n)return Number(o)>=Number(i);if("<="==n)return Number(o)<=Number(i);if(">"==n)return Number(o)>Number(i);if("<"==n)return Number(o)args['output_css'] ) || ! empty( $this->args['enqueue_webfont'] ) ) { + add_action( 'wp_enqueue_scripts', array( $this, 'collect_output_css_and_typography' ), 10 ); + WP_CHINA_YES::$css = apply_filters( "wp_china_yes_{$this->unique}_output_css", WP_CHINA_YES::$css, $this ); + } + + } + + public function collect_output_css_and_typography() { + $this->recursive_output_css( $this->pre_fields ); + } + + public function recursive_output_css( $fields = array(), $combine_field = array() ) { + + if ( ! empty( $fields ) ) { + + foreach ( $fields as $field ) { + + $field_id = ( ! empty( $field['id'] ) ) ? $field['id'] : ''; + $field_type = ( ! empty( $field['type'] ) ) ? $field['type'] : ''; + $field_output = ( ! empty( $field['output'] ) ) ? $field['output'] : ''; + $field_check = ( $field_type === 'typography' || $field_output ) ? true : false; + $field_class = 'WP_CHINA_YES_Field_' . $field_type; + + if ( $field_type && $field_id ) { + + + if( $field_type === 'fieldset' ) { + if ( ! empty( $field['fields'] ) ) { + $this->recursive_output_css( $field['fields'], $field ); + } + } + + if( $field_type === 'accordion' ) { + if ( ! empty( $field['accordions'] ) ) { + foreach ( $field['accordions'] as $accordion ) { + $this->recursive_output_css( $accordion['fields'], $field ); + } + } + } + + if( $field_type === 'tabbed' ) { + if ( ! empty( $field['tabs'] ) ) { + foreach ( $field['tabs'] as $accordion ) { + $this->recursive_output_css( $accordion['fields'], $field ); + } + } + } + + if ( class_exists( $field_class ) ) { + + if ( method_exists( $field_class, 'output' ) || method_exists( $field_class, 'enqueue_google_fonts' ) ) { + + $field_value = ''; + + if ( $field_check && ( $this->abstract === 'options' || $this->abstract === 'customize' ) ) { + + if( ! empty( $combine_field ) ) { + + $field_value = ( isset( $this->options[$combine_field['id']][$field_id] ) ) ? $this->options[$combine_field['id']][$field_id] : ''; + + } else { + + $field_value = ( isset( $this->options[$field_id] ) ) ? $this->options[$field_id] : ''; + + } + + } else if ( $field_check && ( $this->abstract === 'metabox' && is_singular() || $this->abstract === 'taxonomy' && is_archive() ) ) { + + if( ! empty( $combine_field ) ) { + + $meta_value = $this->get_meta_value( $combine_field ); + $field_value = ( isset( $meta_value[$field_id] ) ) ? $meta_value[$field_id] : ''; + + } else { + + $meta_value = $this->get_meta_value( $field ); + $field_value = ( isset( $meta_value ) ) ? $meta_value : ''; + + } + + } + + $instance = new $field_class( $field, $field_value, $this->unique, 'wp/enqueue', $this ); + + // typography enqueue and embed google web fonts + if ( $field_type === 'typography' && $this->args['enqueue_webfont'] && ! empty( $field_value['font-family'] ) ) { + + $method = ( ! empty( $this->args['async_webfont'] ) ) ? 'async' : 'enqueue'; + + $instance->enqueue_google_fonts( $method ); + + } + + // output css + if ( $field_output && $this->args['output_css'] ) { + WP_CHINA_YES::$css .= $instance->output(); + } + + unset( $instance ); + + } + + } + + } + + } + + } + + } + + public function pre_tabs( $sections ) { + + $count = 100; + $result = array(); + $parents = array(); + + foreach ( $sections as $key => $section ) { + if ( ! empty( $section['parent'] ) ) { + $section['priority'] = ( isset( $section['priority'] ) ) ? $section['priority'] : $count; + $parents[$section['parent']][] = $section; + unset( $sections[$key] ); + } + $count++; + } + + foreach ( $sections as $key => $section ) { + $section['priority'] = ( isset( $section['priority'] ) ) ? $section['priority'] : $count; + if ( ! empty( $section['id'] ) && ! empty( $parents[$section['id']] ) ) { + $section['subs'] = wp_list_sort( $parents[$section['id']], array( 'priority' => 'ASC' ), 'ASC', true ); + } + $result[] = $section; + $count++; + } + + return wp_list_sort( $result, array( 'priority' => 'ASC' ), 'ASC', true ); + + } + + public function pre_sections( $sections ) { + + $result = array(); + + foreach ( $this->pre_tabs( $sections ) as $section ) { + if ( ! empty( $section['subs'] ) ) { + foreach ( $section['subs'] as $sub ) { + $sub['ptitle'] = ( ! empty( $section['title'] ) ) ? $section['title'] : ''; + $result[] = $sub; + } + } + if ( empty( $section['subs'] ) ) { + $result[] = $section; + } + } + + return $result; + } + + public function pre_fields( $sections ) { + + $result = array(); + + foreach ( $sections as $key => $section ) { + if ( ! empty( $section['fields'] ) ) { + foreach ( $section['fields'] as $field ) { + $result[] = $field; + } + } + } + + return $result; + } + +} +} diff --git a/framework/classes/admin-options.class.php b/framework/classes/admin-options.class.php new file mode 100644 index 0000000..9c250aa --- /dev/null +++ b/framework/classes/admin-options.class.php @@ -0,0 +1,667 @@ + 'Wp_china_yes Framework by Wp_china_yes', + 'framework_class' => '', + + // menu settings + 'menu_title' => '', + 'menu_slug' => '', + 'menu_type' => 'menu', + 'menu_capability' => 'manage_options', + 'menu_icon' => null, + 'menu_position' => null, + 'menu_hidden' => false, + 'menu_parent' => '', + 'sub_menu_title' => '', + + // menu extras + 'show_bar_menu' => true, + 'show_sub_menu' => true, + 'show_in_network' => true, + 'show_in_customizer' => false, + + 'show_search' => true, + 'show_reset_all' => true, + 'show_reset_section' => true, + 'show_footer' => true, + 'show_all_options' => true, + 'show_form_warning' => true, + 'sticky_header' => true, + 'save_defaults' => true, + 'ajax_save' => true, + 'form_action' => '', + + // admin bar menu settings + 'admin_bar_menu_icon' => '', + 'admin_bar_menu_priority' => 50, + + // footer + 'footer_text' => 'Thank you for creating with Wp_china_yes Framework', + 'footer_after' => '', + 'footer_credit' => '', + + // database model + 'database' => '', // options, transient, theme_mod, network + 'transient_time' => 0, + + // contextual help + 'contextual_help' => array(), + 'contextual_help_sidebar' => '', + + // typography options + 'enqueue_webfont' => true, + 'async_webfont' => false, + + // others + 'output_css' => true, + + // theme + 'nav' => 'normal', + 'theme' => 'dark', + 'class' => '', + + // external default values + 'defaults' => array(), + + ); + + // run framework construct + public function __construct( $key, $params = array() ) { + + $this->unique = $key; + $this->args = apply_filters( "wp_china_yes_{$this->unique}_args", wp_parse_args( $params['args'], $this->args ), $this ); + $this->sections = apply_filters( "wp_china_yes_{$this->unique}_sections", $params['sections'], $this ); + + // run only is admin panel options, avoid performance loss + $this->pre_tabs = $this->pre_tabs( $this->sections ); + $this->pre_fields = $this->pre_fields( $this->sections ); + $this->pre_sections = $this->pre_sections( $this->sections ); + + $this->get_options(); + $this->set_options(); + $this->save_defaults(); + + add_action( 'admin_menu', array( $this, 'add_admin_menu' ) ); + add_action( 'admin_bar_menu', array( $this, 'add_admin_bar_menu' ), $this->args['admin_bar_menu_priority'] ); + add_action( 'wp_ajax_wp_china_yes_'. $this->unique .'_ajax_save', array( $this, 'ajax_save' ) ); + + if ( $this->args['database'] === 'network' && ! empty( $this->args['show_in_network'] ) ) { + add_action( 'network_admin_menu', array( $this, 'add_admin_menu' ) ); + } + + // wp enqeueu for typography and output css + parent::__construct(); + + } + + // instance + public static function instance( $key, $params = array() ) { + return new self( $key, $params ); + } + + // add admin bar menu + public function add_admin_bar_menu( $wp_admin_bar ) { + + if ( ! current_user_can( $this->args['menu_capability'] ) ) { + return; + } + + if ( is_network_admin() && ( $this->args['database'] !== 'network' || $this->args['show_in_network'] !== true ) ) { + return; + } + + if ( ! empty( $this->args['show_bar_menu'] ) && empty( $this->args['menu_hidden'] ) ) { + + global $submenu; + + $menu_slug = $this->args['menu_slug']; + $menu_icon = ( ! empty( $this->args['admin_bar_menu_icon'] ) ) ? '' : ''; + + $wp_admin_bar->add_node( array( + 'id' => $menu_slug, + 'title' => $menu_icon . esc_attr( $this->args['menu_title'] ), + 'href' => esc_url( ( is_network_admin() ) ? network_admin_url( 'admin.php?page='. $menu_slug ) : admin_url( 'admin.php?page='. $menu_slug ) ), + ) ); + + if ( ! empty( $submenu[$menu_slug] ) ) { + foreach ( $submenu[$menu_slug] as $menu_key => $menu_value ) { + $wp_admin_bar->add_node( array( + 'parent' => $menu_slug, + 'id' => $menu_slug .'-'. $menu_key, + 'title' => $menu_value[0], + 'href' => esc_url( ( is_network_admin() ) ? network_admin_url( 'admin.php?page='. $menu_value[2] ) : admin_url( 'admin.php?page='. $menu_value[2] ) ), + ) ); + } + } + + } + + } + + public function ajax_save() { + + $result = $this->set_options( true ); + + if ( ! $result ) { + wp_send_json_error( array( 'error' => esc_html__( 'Error while saving the changes.', 'wp_china_yes' ) ) ); + } else { + wp_send_json_success( array( 'notice' => $this->notice, 'errors' => $this->errors ) ); + } + + } + + // get default value + public function get_default( $field ) { + + $default = ( isset( $field['default'] ) ) ? $field['default'] : ''; + $default = ( isset( $this->args['defaults'][$field['id']] ) ) ? $this->args['defaults'][$field['id']] : $default; + + return $default; + + } + + // save defaults and set new fields value to main options + public function save_defaults() { + + $tmp_options = $this->options; + + foreach ( $this->pre_fields as $field ) { + if ( ! empty( $field['id'] ) ) { + $this->options[$field['id']] = ( isset( $this->options[$field['id']] ) ) ? $this->options[$field['id']] : $this->get_default( $field ); + } + } + + if ( $this->args['save_defaults'] && empty( $tmp_options ) ) { + $this->save_options( $this->options ); + } + + } + + // set options + public function set_options( $ajax = false ) { + + // XSS ok. + // No worries, This "POST" requests is sanitizing in the below foreach. see #L337 - #L341 + $response = ( $ajax && ! empty( $_POST['data'] ) ) ? json_decode( wp_unslash( trim( $_POST['data'] ) ), true ) : $_POST; + + // Set variables. + $data = array(); + $noncekey = 'wp_china_yes_options_nonce'. $this->unique; + $nonce = ( ! empty( $response[$noncekey] ) ) ? $response[$noncekey] : ''; + $options = ( ! empty( $response[$this->unique] ) ) ? $response[$this->unique] : array(); + $transient = ( ! empty( $response['wp_china_yes_transient'] ) ) ? $response['wp_china_yes_transient'] : array(); + + if ( wp_verify_nonce( $nonce, 'wp_china_yes_options_nonce' ) ) { + + $importing = false; + $section_id = ( ! empty( $transient['section'] ) ) ? $transient['section'] : ''; + + if ( ! $ajax && ! empty( $response[ 'wp_china_yes_import_data' ] ) ) { + + // XSS ok. + // No worries, This "POST" requests is sanitizing in the below foreach. see #L337 - #L341 + $import_data = json_decode( wp_unslash( trim( $response[ 'wp_china_yes_import_data' ] ) ), true ); + $options = ( is_array( $import_data ) && ! empty( $import_data ) ) ? $import_data : array(); + $importing = true; + $this->notice = esc_html__( 'Settings successfully imported.', 'wp_china_yes' ); + + } + + if ( ! empty( $transient['reset'] ) ) { + + foreach ( $this->pre_fields as $field ) { + if ( ! empty( $field['id'] ) ) { + $data[$field['id']] = $this->get_default( $field ); + } + } + + $this->notice = esc_html__( 'Default settings restored.', 'wp_china_yes' ); + + } else if ( ! empty( $transient['reset_section'] ) && ! empty( $section_id ) ) { + + if ( ! empty( $this->pre_sections[$section_id-1]['fields'] ) ) { + + foreach ( $this->pre_sections[$section_id-1]['fields'] as $field ) { + if ( ! empty( $field['id'] ) ) { + $data[$field['id']] = $this->get_default( $field ); + } + } + + } + + $data = wp_parse_args( $data, $this->options ); + + $this->notice = esc_html__( 'Default settings restored.', 'wp_china_yes' ); + + } else { + + // sanitize and validate + foreach ( $this->pre_fields as $field ) { + + if ( ! empty( $field['id'] ) ) { + + $field_id = $field['id']; + $field_value = isset( $options[$field_id] ) ? $options[$field_id] : ''; + + // Ajax and Importing doing wp_unslash already. + if ( ! $ajax && ! $importing ) { + $field_value = wp_unslash( $field_value ); + } + + // Sanitize "post" request of field. + if ( ! isset( $field['sanitize'] ) ) { + + if( is_array( $field_value ) ) { + + $data[$field_id] = wp_kses_post_deep( $field_value ); + + } else { + + $data[$field_id] = wp_kses_post( $field_value ); + + } + + } else if( isset( $field['sanitize'] ) && is_callable( $field['sanitize'] ) ) { + + $data[$field_id] = call_user_func( $field['sanitize'], $field_value ); + + } else { + + $data[$field_id] = $field_value; + + } + + // Validate "post" request of field. + if ( isset( $field['validate'] ) && is_callable( $field['validate'] ) ) { + + $has_validated = call_user_func( $field['validate'], $field_value ); + + if ( ! empty( $has_validated ) ) { + + $data[$field_id] = ( isset( $this->options[$field_id] ) ) ? $this->options[$field_id] : ''; + $this->errors[$field_id] = $has_validated; + + } + + } + + } + + } + + } + + $data = apply_filters( "wp_china_yes_{$this->unique}_save", $data, $this ); + + do_action( "wp_china_yes_{$this->unique}_save_before", $data, $this ); + + $this->options = $data; + + $this->save_options( $data ); + + do_action( "wp_china_yes_{$this->unique}_save_after", $data, $this ); + + if ( empty( $this->notice ) ) { + $this->notice = esc_html__( 'Settings saved.', 'wp_china_yes' ); + } + + return true; + + } + + return false; + + } + + // save options database + public function save_options( $data ) { + + if ( $this->args['database'] === 'transient' ) { + set_transient( $this->unique, $data, $this->args['transient_time'] ); + } else if ( $this->args['database'] === 'theme_mod' ) { + set_theme_mod( $this->unique, $data ); + } else if ( $this->args['database'] === 'network' ) { + update_site_option( $this->unique, $data ); + } else { + update_option( $this->unique, $data ); + } + + do_action( "wp_china_yes_{$this->unique}_saved", $data, $this ); + + } + + // get options from database + public function get_options() { + + if ( $this->args['database'] === 'transient' ) { + $this->options = get_transient( $this->unique ); + } else if ( $this->args['database'] === 'theme_mod' ) { + $this->options = get_theme_mod( $this->unique ); + } else if ( $this->args['database'] === 'network' ) { + $this->options = get_site_option( $this->unique ); + } else { + $this->options = get_option( $this->unique ); + } + + if ( empty( $this->options ) ) { + $this->options = array(); + } + + return $this->options; + + } + + // admin menu + public function add_admin_menu() { + + extract( $this->args ); + + if ( $menu_type === 'submenu' ) { + + $menu_page = call_user_func( 'add_submenu_page', $menu_parent, esc_attr( $menu_title ), esc_attr( $menu_title ), $menu_capability, $menu_slug, array( $this, 'add_options_html' ) ); + + } else { + + $menu_page = call_user_func( 'add_menu_page', esc_attr( $menu_title ), esc_attr( $menu_title ), $menu_capability, $menu_slug, array( $this, 'add_options_html' ), $menu_icon, $menu_position ); + + if ( ! empty( $sub_menu_title ) ) { + call_user_func( 'add_submenu_page', $menu_slug, esc_attr( $sub_menu_title ), esc_attr( $sub_menu_title ), $menu_capability, $menu_slug, array( $this, 'add_options_html' ) ); + } + + if ( ! empty( $this->args['show_sub_menu'] ) && count( $this->pre_tabs ) > 1 ) { + + // create submenus + foreach ( $this->pre_tabs as $section ) { + call_user_func( 'add_submenu_page', $menu_slug, esc_attr( $section['title'] ), esc_attr( $section['title'] ), $menu_capability, $menu_slug .'#tab='. sanitize_title( $section['title'] ), '__return_null' ); + } + + remove_submenu_page( $menu_slug, $menu_slug ); + + } + + } + + // TODO CHINA-YES 支持隐藏子菜单 + if ( ! empty( $menu_hidden ) ) { + remove_menu_page( $menu_slug ); + remove_submenu_page( $menu_parent, $menu_slug ); + } + + add_action( 'load-'. $menu_page, array( $this, 'add_page_on_load' ) ); + + } + + public function add_page_on_load() { + + if ( ! empty( $this->args['contextual_help'] ) ) { + + $screen = get_current_screen(); + + foreach ( $this->args['contextual_help'] as $tab ) { + $screen->add_help_tab( $tab ); + } + + if ( ! empty( $this->args['contextual_help_sidebar'] ) ) { + $screen->set_help_sidebar( $this->args['contextual_help_sidebar'] ); + } + + } + + if ( ! empty( $this->args['footer_credit'] ) ) { + add_filter( 'admin_footer_text', array( $this, 'add_admin_footer_text' ) ); + } + + } + + public function add_admin_footer_text() { + echo wp_kses_post( $this->args['footer_credit'] ); + } + + public function error_check( $sections, $err = '' ) { + + if ( ! $this->args['ajax_save'] ) { + + if ( ! empty( $sections['fields'] ) ) { + foreach ( $sections['fields'] as $field ) { + if ( ! empty( $field['id'] ) ) { + if ( array_key_exists( $field['id'], $this->errors ) ) { + $err = '!'; + } + } + } + } + + if ( ! empty( $sections['subs'] ) ) { + foreach ( $sections['subs'] as $sub ) { + $err = $this->error_check( $sub, $err ); + } + } + + if ( ! empty( $sections['id'] ) && array_key_exists( $sections['id'], $this->errors ) ) { + $err = $this->errors[$sections['id']]; + } + + } + + return $err; + } + + // option page html output + public function add_options_html() { + + $has_nav = ( count( $this->pre_tabs ) > 1 ) ? true : false; + $show_all = ( ! $has_nav ) ? ' wp_china_yes-show-all' : ''; + $ajax_class = ( $this->args['ajax_save'] ) ? ' wp_china_yes-save-ajax' : ''; + $sticky_class = ( $this->args['sticky_header'] ) ? ' wp_china_yes-sticky-header' : ''; + $wrapper_class = ( $this->args['framework_class'] ) ? ' '. $this->args['framework_class'] : ''; + $theme = ( $this->args['theme'] ) ? ' wp_china_yes-theme-'. $this->args['theme'] : ''; + $class = ( $this->args['class'] ) ? ' '. $this->args['class'] : ''; + $nav_type = ( $this->args['nav'] === 'inline' ) ? 'inline' : 'normal'; + $form_action = ( $this->args['form_action'] ) ? $this->args['form_action'] : ''; + + do_action( 'wp_china_yes_options_before' ); + + echo '
        '; + + echo '
        '; + + echo '
        '; + + echo ''; + + wp_nonce_field( 'wp_china_yes_options_nonce', 'wp_china_yes_options_nonce'. $this->unique ); + + echo '
        '; + echo '
        '; + + echo '
        '; + echo '

        '. $this->args['framework_title'] .'

        '; + echo '
        '; + + echo '
        '; + + $notice_class = ( ! empty( $this->notice ) ) ? 'wp_china_yes-form-show' : ''; + $notice_text = ( ! empty( $this->notice ) ) ? $this->notice : ''; + + echo '
        '. $notice_text .'
        '; + + echo ( $this->args['show_form_warning'] ) ? '
        '. esc_html__( 'You have unsaved changes, save your changes!', 'wp_china_yes' ) .'
        ' : ''; + + echo ( $has_nav && $this->args['show_all_options'] ) ? '
        ' : ''; + + echo ( $this->args['show_search'] ) ? '' : ''; + + echo '
        '; + echo ''; + echo ( $this->args['show_reset_section'] ) ? '' : ''; + echo ( $this->args['show_reset_all'] ) ? '' : ''; + echo '
        '; + + echo '
        '; + + echo '
        '; + echo '
        '; + echo '
        '; + + echo '
        '; + + if ( $has_nav ) { + + echo ''; + + } + + echo '
        '; + + echo '
        '; + + foreach ( $this->pre_sections as $section ) { + + $section_onload = ( ! $has_nav ) ? ' wp_china_yes-onload' : ''; + $section_class = ( ! empty( $section['class'] ) ) ? ' '. $section['class'] : ''; + $section_icon = ( ! empty( $section['icon'] ) ) ? '' : ''; + $section_title = ( ! empty( $section['title'] ) ) ? $section['title'] : ''; + $section_parent = ( ! empty( $section['ptitle'] ) ) ? sanitize_title( $section['ptitle'] ) .'/' : ''; + $section_slug = ( ! empty( $section['title'] ) ) ? sanitize_title( $section_title ) : ''; + + echo '
        '; + echo ( $has_nav ) ? '

        '. $section_icon . $section_title .'

        ' : ''; + echo ( ! empty( $section['description'] ) ) ? '
        '. $section['description'] .'
        ' : ''; + + if ( ! empty( $section['fields'] ) ) { + + foreach ( $section['fields'] as $field ) { + + $is_field_error = $this->error_check( $field ); + + if ( ! empty( $is_field_error ) ) { + $field['_error'] = $is_field_error; + } + + if ( ! empty( $field['id'] ) ) { + $field['default'] = $this->get_default( $field ); + } + + $value = ( ! empty( $field['id'] ) && isset( $this->options[$field['id']] ) ) ? $this->options[$field['id']] : ''; + + WP_CHINA_YES::field( $field, $value, $this->unique, 'options' ); + + } + + } else { + + echo '
        '. esc_html__( 'No data available.', 'wp_china_yes' ) .'
        '; + + } + + echo '
        '; + + } + + echo '
        '; + + echo '
        '; + + echo '
        '; + + echo ( $has_nav && $nav_type === 'normal' ) ? '
        ' : ''; + + echo '
        '; + + if ( ! empty( $this->args['show_footer'] ) ) { + + echo ''; + + } + + echo '
        '; + + echo '
        '; + + echo '
        '; + + echo ( ! empty( $this->args['footer_after'] ) ) ? $this->args['footer_after'] : ''; + + echo '
        '; + + do_action( 'wp_china_yes_options_after' ); + + } + } +} diff --git a/framework/classes/fields.class.php b/framework/classes/fields.class.php new file mode 100644 index 0000000..3f91a1e --- /dev/null +++ b/framework/classes/fields.class.php @@ -0,0 +1,405 @@ +field = $field; + $this->value = $value; + $this->unique = $unique; + $this->where = $where; + $this->parent = $parent; + } + + public function field_name( $nested_name = '' ) { + + $field_id = ( ! empty( $this->field['id'] ) ) ? $this->field['id'] : ''; + $unique_id = ( ! empty( $this->unique ) ) ? $this->unique .'['. $field_id .']' : $field_id; + $field_name = ( ! empty( $this->field['name'] ) ) ? $this->field['name'] : $unique_id; + $tag_prefix = ( ! empty( $this->field['tag_prefix'] ) ) ? $this->field['tag_prefix'] : ''; + + if ( ! empty( $tag_prefix ) ) { + $nested_name = str_replace( '[', '['. $tag_prefix, $nested_name ); + } + + return $field_name . $nested_name; + + } + + public function field_attributes( $custom_atts = array() ) { + + $field_id = ( ! empty( $this->field['id'] ) ) ? $this->field['id'] : ''; + $attributes = ( ! empty( $this->field['attributes'] ) ) ? $this->field['attributes'] : array(); + + if ( ! empty( $field_id ) && empty( $attributes['data-depend-id'] ) ) { + $attributes['data-depend-id'] = $field_id; + } + + if ( ! empty( $this->field['placeholder'] ) ) { + $attributes['placeholder'] = $this->field['placeholder']; + } + + $attributes = wp_parse_args( $attributes, $custom_atts ); + + $atts = ''; + + if ( ! empty( $attributes ) ) { + foreach ( $attributes as $key => $value ) { + if ( $value === 'only-key' ) { + $atts .= ' '. esc_attr( $key ); + } else { + $atts .= ' '. esc_attr( $key ) . '="'. esc_attr( $value ) .'"'; + } + } + } + + return $atts; + + } + + public function field_before() { + return ( ! empty( $this->field['before'] ) ) ? '
        '. $this->field['before'] .'
        ' : ''; + } + + public function field_after() { + + $output = ( ! empty( $this->field['after'] ) ) ? '
        '. $this->field['after'] .'
        ' : ''; + $output .= ( ! empty( $this->field['desc'] ) ) ? '
        '. $this->field['desc'] .'
        ' : ''; + $output .= ( ! empty( $this->field['help'] ) ) ? '
        '. $this->field['help'] .'
        ' : ''; + $output .= ( ! empty( $this->field['_error'] ) ) ? '
        '. $this->field['_error'] .'
        ' : ''; + + return $output; + + } + + public static function field_data( $type = '', $term = false, $query_args = array() ) { + + $options = array(); + $array_search = false; + + // sanitize type name + if ( in_array( $type, array( 'page', 'pages' ) ) ) { + $option = 'page'; + } else if ( in_array( $type, array( 'post', 'posts' ) ) ) { + $option = 'post'; + } else if ( in_array( $type, array( 'category', 'categories' ) ) ) { + $option = 'category'; + } else if ( in_array( $type, array( 'tag', 'tags' ) ) ) { + $option = 'post_tag'; + } else if ( in_array( $type, array( 'menu', 'menus' ) ) ) { + $option = 'nav_menu'; + } else { + $option = ''; + } + + // switch type + switch( $type ) { + + case 'page': + case 'pages': + case 'post': + case 'posts': + + // term query required for ajax select + if ( ! empty( $term ) ) { + + $query = new WP_Query( wp_parse_args( $query_args, array( + 's' => $term, + 'post_type' => $option, + 'post_status' => 'publish', + 'posts_per_page' => 25, + ) ) ); + + } else { + + $query = new WP_Query( wp_parse_args( $query_args, array( + 'post_type' => $option, + 'post_status' => 'publish', + ) ) ); + + } + + if ( ! is_wp_error( $query ) && ! empty( $query->posts ) ) { + foreach ( $query->posts as $item ) { + $options[$item->ID] = $item->post_title; + } + } + + break; + + case 'category': + case 'categories': + case 'tag': + case 'tags': + case 'menu': + case 'menus': + + if ( ! empty( $term ) ) { + + $query = new WP_Term_Query( wp_parse_args( $query_args, array( + 'search' => $term, + 'taxonomy' => $option, + 'hide_empty' => false, + 'number' => 25, + ) ) ); + + } else { + + $query = new WP_Term_Query( wp_parse_args( $query_args, array( + 'taxonomy' => $option, + 'hide_empty' => false, + ) ) ); + + } + + if ( ! is_wp_error( $query ) && ! empty( $query->terms ) ) { + foreach ( $query->terms as $item ) { + $options[$item->term_id] = $item->name; + } + } + + break; + + case 'user': + case 'users': + + if ( ! empty( $term ) ) { + + $query = new WP_User_Query( array( + 'search' => '*'. $term .'*', + 'number' => 25, + 'orderby' => 'title', + 'order' => 'ASC', + 'fields' => array( 'display_name', 'ID' ) + ) ); + + } else { + + $query = new WP_User_Query( array( 'fields' => array( 'display_name', 'ID' ) ) ); + + } + + if ( ! is_wp_error( $query ) && ! empty( $query->get_results() ) ) { + foreach ( $query->get_results() as $item ) { + $options[$item->ID] = $item->display_name; + } + } + + break; + + case 'sidebar': + case 'sidebars': + + global $wp_registered_sidebars; + + if ( ! empty( $wp_registered_sidebars ) ) { + foreach ( $wp_registered_sidebars as $sidebar ) { + $options[$sidebar['id']] = $sidebar['name']; + } + } + + $array_search = true; + + break; + + case 'role': + case 'roles': + + global $wp_roles; + + if ( ! empty( $wp_roles ) ) { + if ( ! empty( $wp_roles->roles ) ) { + foreach ( $wp_roles->roles as $role_key => $role_value ) { + $options[$role_key] = $role_value['name']; + } + } + } + + $array_search = true; + + break; + + case 'post_type': + case 'post_types': + + $post_types = get_post_types( array( 'show_in_nav_menus' => true ), 'objects' ); + + if ( ! is_wp_error( $post_types ) && ! empty( $post_types ) ) { + foreach ( $post_types as $post_type ) { + $options[$post_type->name] = $post_type->labels->name; + } + } + + $array_search = true; + + break; + + case 'location': + case 'locations': + + $nav_menus = get_registered_nav_menus(); + + if ( ! is_wp_error( $nav_menus ) && ! empty( $nav_menus ) ) { + foreach ( $nav_menus as $nav_menu_key => $nav_menu_name ) { + $options[$nav_menu_key] = $nav_menu_name; + } + } + + $array_search = true; + + break; + + default: + + if ( is_callable( $type ) ) { + if ( ! empty( $term ) ) { + $options = call_user_func( $type, $query_args ); + } else { + $options = call_user_func( $type, $term, $query_args ); + } + } + + break; + + } + + // Array search by "term" + if ( ! empty( $term ) && ! empty( $options ) && ! empty( $array_search ) ) { + $options = preg_grep( '/'. $term .'/i', $options ); + } + + // Make multidimensional array for ajax search + if ( ! empty( $term ) && ! empty( $options ) ) { + $arr = array(); + foreach ( $options as $option_key => $option_value ) { + $arr[] = array( 'value' => $option_key, 'text' => $option_value ); + } + $options = $arr; + } + + return $options; + + } + + public function field_wp_query_data_title( $type, $values ) { + + $options = array(); + + if ( ! empty( $values ) && is_array( $values ) ) { + + foreach ( $values as $value ) { + + $options[$value] = ucfirst( $value ); + + switch( $type ) { + + case 'post': + case 'posts': + case 'page': + case 'pages': + + $title = get_the_title( $value ); + + if ( ! is_wp_error( $title ) && ! empty( $title ) ) { + $options[$value] = $title; + } + + break; + + case 'category': + case 'categories': + case 'tag': + case 'tags': + case 'menu': + case 'menus': + + $term = get_term( $value ); + + if ( ! is_wp_error( $term ) && ! empty( $term ) ) { + $options[$value] = $term->name; + } + + break; + + case 'user': + case 'users': + + $user = get_user_by( 'id', $value ); + + if ( ! is_wp_error( $user ) && ! empty( $user ) ) { + $options[$value] = $user->display_name; + } + + break; + + case 'sidebar': + case 'sidebars': + + global $wp_registered_sidebars; + + if ( ! empty( $wp_registered_sidebars[$value] ) ) { + $options[$value] = $wp_registered_sidebars[$value]['name']; + } + + break; + + case 'role': + case 'roles': + + global $wp_roles; + + if ( ! empty( $wp_roles ) && ! empty( $wp_roles->roles ) && ! empty( $wp_roles->roles[$value] ) ) { + $options[$value] = $wp_roles->roles[$value]['name']; + } + + break; + + case 'post_type': + case 'post_types': + + $post_types = get_post_types( array( 'show_in_nav_menus' => true ) ); + + if ( ! is_wp_error( $post_types ) && ! empty( $post_types ) && ! empty( $post_types[$value] ) ) { + $options[$value] = ucfirst( $value ); + } + + break; + + case 'location': + case 'locations': + + $nav_menus = get_registered_nav_menus(); + + if ( ! is_wp_error( $nav_menus ) && ! empty( $nav_menus ) && ! empty( $nav_menus[$value] ) ) { + $options[$value] = $nav_menus[$value]; + } + + break; + + default: + + if ( is_callable( $type .'_title' ) ) { + $options[$value] = call_user_func( $type .'_title', $value ); + } + + break; + + } + + } + + } + + return $options; + + } + + } +} diff --git a/framework/classes/setup.class.php b/framework/classes/setup.class.php new file mode 100644 index 0000000..4742edb --- /dev/null +++ b/framework/classes/setup.class.php @@ -0,0 +1,800 @@ + array(), + 'customize_options' => array(), + 'metabox_options' => array(), + 'nav_menu_options' => array(), + 'profile_options' => array(), + 'taxonomy_options' => array(), + 'widget_options' => array(), + 'comment_options' => array(), + 'shortcode_options' => array(), + ); + + // Shortcode instances + public static $shortcode_instances = array(); + + private static $instance = null; + + public static function init( $file = __FILE__, $premium = false ) { + + // Set file constant + self::$file = $file; + + // Set file constant + self::$premium = $premium; + + // Set constants + self::constants(); + + // Include files + self::includes(); + + if ( is_null( self::$instance ) ) { + self::$instance = new self(); + } + + return self::$instance; + + } + + // Initalize + public function __construct() { + + // Init action + do_action( 'wp_china_yes_init' ); + + // Setup textdomain + self::textdomain(); + + add_action( 'after_setup_theme', array( 'WP_CHINA_YES', 'setup' ) ); + add_action( 'init', array( 'WP_CHINA_YES', 'setup' ) ); + add_action( 'switch_theme', array( 'WP_CHINA_YES', 'setup' ) ); + add_action( 'admin_enqueue_scripts', array( 'WP_CHINA_YES', 'add_admin_enqueue_scripts' ) ); + add_action( 'wp_enqueue_scripts', array( 'WP_CHINA_YES', 'add_typography_enqueue_styles' ), 80 ); + add_action( 'wp_head', array( 'WP_CHINA_YES', 'add_custom_css' ), 80 ); + add_filter( 'admin_body_class', array( 'WP_CHINA_YES', 'add_admin_body_class' ) ); + + } + + // Setup frameworks + public static function setup() { + + // Setup admin option framework + $params = array(); + if ( class_exists( 'WP_CHINA_YES_Options' ) && ! empty( self::$args['admin_options'] ) ) { + foreach ( self::$args['admin_options'] as $key => $value ) { + if ( ! empty( self::$args['sections'][$key] ) && ! isset( self::$inited[$key] ) ) { + + $params['args'] = $value; + $params['sections'] = self::$args['sections'][$key]; + self::$inited[$key] = true; + + WP_CHINA_YES_Options::instance( $key, $params ); + + if ( ! empty( $value['show_in_customizer'] ) ) { + $value['output_css'] = false; + $value['enqueue_webfont'] = false; + self::$args['customize_options'][$key] = $value; + self::$inited[$key] = null; + } + + } + } + } + + // Setup customize option framework + $params = array(); + if ( class_exists( 'WP_CHINA_YES_Customize_Options' ) && ! empty( self::$args['customize_options'] ) ) { + foreach ( self::$args['customize_options'] as $key => $value ) { + if ( ! empty( self::$args['sections'][$key] ) && ! isset( self::$inited[$key] ) ) { + + $params['args'] = $value; + $params['sections'] = self::$args['sections'][$key]; + self::$inited[$key] = true; + + WP_CHINA_YES_Customize_Options::instance( $key, $params ); + + } + } + } + + // Setup metabox option framework + $params = array(); + if ( class_exists( 'WP_CHINA_YES_Metabox' ) && ! empty( self::$args['metabox_options'] ) ) { + foreach ( self::$args['metabox_options'] as $key => $value ) { + if ( ! empty( self::$args['sections'][$key] ) && ! isset( self::$inited[$key] ) ) { + + $params['args'] = $value; + $params['sections'] = self::$args['sections'][$key]; + self::$inited[$key] = true; + + WP_CHINA_YES_Metabox::instance( $key, $params ); + + } + } + } + + // Setup nav menu option framework + $params = array(); + if ( class_exists( 'WP_CHINA_YES_Nav_Menu_Options' ) && ! empty( self::$args['nav_menu_options'] ) ) { + foreach ( self::$args['nav_menu_options'] as $key => $value ) { + if ( ! empty( self::$args['sections'][$key] ) && ! isset( self::$inited[$key] ) ) { + + $params['args'] = $value; + $params['sections'] = self::$args['sections'][$key]; + self::$inited[$key] = true; + + WP_CHINA_YES_Nav_Menu_Options::instance( $key, $params ); + + } + } + } + + // Setup profile option framework + $params = array(); + if ( class_exists( 'WP_CHINA_YES_Profile_Options' ) && ! empty( self::$args['profile_options'] ) ) { + foreach ( self::$args['profile_options'] as $key => $value ) { + if ( ! empty( self::$args['sections'][$key] ) && ! isset( self::$inited[$key] ) ) { + + $params['args'] = $value; + $params['sections'] = self::$args['sections'][$key]; + self::$inited[$key] = true; + + WP_CHINA_YES_Profile_Options::instance( $key, $params ); + + } + } + } + + // Setup taxonomy option framework + $params = array(); + if ( class_exists( 'WP_CHINA_YES_Taxonomy_Options' ) && ! empty( self::$args['taxonomy_options'] ) ) { + $taxonomy = ( isset( $_GET['taxonomy'] ) ) ? sanitize_text_field( wp_unslash( $_GET['taxonomy'] ) ) : ''; + foreach ( self::$args['taxonomy_options'] as $key => $value ) { + if ( ! empty( self::$args['sections'][$key] ) && ! isset( self::$inited[$key] ) ) { + + $params['args'] = $value; + $params['sections'] = self::$args['sections'][$key]; + self::$inited[$key] = true; + + WP_CHINA_YES_Taxonomy_Options::instance( $key, $params ); + + } + } + } + + // Setup widget option framework + if ( class_exists( 'WP_CHINA_YES_Widget' ) && class_exists( 'WP_Widget_Factory' ) && ! empty( self::$args['widget_options'] ) ) { + $wp_widget_factory = new WP_Widget_Factory(); + global $wp_widget_factory; + foreach ( self::$args['widget_options'] as $key => $value ) { + if ( ! isset( self::$inited[$key] ) ) { + + self::$inited[$key] = true; + $wp_widget_factory->register( WP_CHINA_YES_Widget::instance( $key, $value ) ); + + } + } + } + + // Setup comment option framework + $params = array(); + if ( class_exists( 'WP_CHINA_YES_Comment_Metabox' ) && ! empty( self::$args['comment_options'] ) ) { + foreach ( self::$args['comment_options'] as $key => $value ) { + if ( ! empty( self::$args['sections'][$key] ) && ! isset( self::$inited[$key] ) ) { + + $params['args'] = $value; + $params['sections'] = self::$args['sections'][$key]; + self::$inited[$key] = true; + + WP_CHINA_YES_Comment_Metabox::instance( $key, $params ); + + } + } + } + + // Setup shortcode option framework + $params = array(); + if ( class_exists( 'WP_CHINA_YES_Shortcoder' ) && ! empty( self::$args['shortcode_options'] ) ) { + foreach ( self::$args['shortcode_options'] as $key => $value ) { + if ( ! empty( self::$args['sections'][$key] ) && ! isset( self::$inited[$key] ) ) { + + $params['args'] = $value; + $params['sections'] = self::$args['sections'][$key]; + self::$inited[$key] = true; + + WP_CHINA_YES_Shortcoder::instance( $key, $params ); + + } + } + + // Once editor setup for gutenberg and media buttons + if ( class_exists( 'WP_CHINA_YES_Shortcoder' ) && ! empty( self::$shortcode_instances ) ) { + foreach ( self::$shortcode_instances as $instance ) { + if ( ! empty( $instance['show_in_editor'] ) ) { + WP_CHINA_YES_Shortcoder::once_editor_setup(); + break; + } + } + } + + } + + do_action( 'wp_china_yes_loaded' ); + + } + + // Create options + public static function createOptions( $id, $args = array() ) { + self::$args['admin_options'][$id] = $args; + } + + // Create customize options + public static function createCustomizeOptions( $id, $args = array() ) { + self::$args['customize_options'][$id] = $args; + } + + // Create metabox options + public static function createMetabox( $id, $args = array() ) { + self::$args['metabox_options'][$id] = $args; + } + + // Create menu options + public static function createNavMenuOptions( $id, $args = array() ) { + self::$args['nav_menu_options'][$id] = $args; + } + + // Create shortcoder options + public static function createShortcoder( $id, $args = array() ) { + self::$args['shortcode_options'][$id] = $args; + } + + // Create taxonomy options + public static function createTaxonomyOptions( $id, $args = array() ) { + self::$args['taxonomy_options'][$id] = $args; + } + + // Create profile options + public static function createProfileOptions( $id, $args = array() ) { + self::$args['profile_options'][$id] = $args; + } + + // Create widget + public static function createWidget( $id, $args = array() ) { + self::$args['widget_options'][$id] = $args; + self::set_used_fields( $args ); + } + + // Create comment metabox + public static function createCommentMetabox( $id, $args = array() ) { + self::$args['comment_options'][$id] = $args; + } + + // Create section + public static function createSection( $id, $sections ) { + self::$args['sections'][$id][] = $sections; + self::set_used_fields( $sections ); + } + + // Set directory constants + public static function constants() { + + // We need this path-finder code for set URL of framework + $dirname = str_replace( '//', '/', wp_normalize_path( dirname( dirname( self::$file ) ) ) ); + $theme_dir = str_replace( '//', '/', wp_normalize_path( get_parent_theme_file_path() ) ); + $plugin_dir = str_replace( '//', '/', wp_normalize_path( WP_PLUGIN_DIR ) ); + $plugin_dir = str_replace( '/opt/bitnami', '/bitnami', $plugin_dir ); + $located_plugin = ( preg_match( '#'. self::sanitize_dirname( $plugin_dir ) .'#', self::sanitize_dirname( $dirname ) ) ) ? true : false; + $directory = ( $located_plugin ) ? $plugin_dir : $theme_dir; + $directory_uri = ( $located_plugin ) ? WP_PLUGIN_URL : get_parent_theme_file_uri(); + $foldername = str_replace( $directory, '', $dirname ); + $protocol_uri = ( is_ssl() ) ? 'https' : 'http'; + $directory_uri = set_url_scheme( $directory_uri, $protocol_uri ); + + self::$dir = $dirname; + self::$url = $directory_uri . $foldername; + + } + + // Include file helper + public static function include_plugin_file( $file, $load = true ) { + + $path = ''; + $file = ltrim( $file, '/' ); + $override = apply_filters( 'wp_china_yes_override', 'wp_china_yes-override' ); + + if ( file_exists( get_parent_theme_file_path( $override .'/'. $file ) ) ) { + $path = get_parent_theme_file_path( $override .'/'. $file ); + } elseif ( file_exists( get_theme_file_path( $override .'/'. $file ) ) ) { + $path = get_theme_file_path( $override .'/'. $file ); + } elseif ( file_exists( self::$dir .'/'. $override .'/'. $file ) ) { + $path = self::$dir .'/'. $override .'/'. $file; + } elseif ( file_exists( self::$dir .'/'. $file ) ) { + $path = self::$dir .'/'. $file; + } + + if ( ! empty( $path ) && ! empty( $file ) && $load ) { + + global $wp_query; + + if ( is_object( $wp_query ) && function_exists( 'load_template' ) ) { + + load_template( $path, true ); + + } else { + + require_once( $path ); + + } + + } else { + + return self::$dir .'/'. $file; + + } + + } + + // Is active plugin helper + public static function is_active_plugin( $file = '' ) { + return in_array( $file, (array) get_option( 'active_plugins', array() ) ); + } + + // Sanitize dirname + public static function sanitize_dirname( $dirname ) { + return preg_replace( '/[^A-Za-z]/', '', $dirname ); + } + + // Set url constant + public static function include_plugin_url( $file ) { + return esc_url( self::$url ) .'/'. ltrim( $file, '/' ); + } + + // Include files + public static function includes() { + + // Include common functions + self::include_plugin_file( 'functions/actions.php' ); + self::include_plugin_file( 'functions/helpers.php' ); + self::include_plugin_file( 'functions/sanitize.php' ); + self::include_plugin_file( 'functions/validate.php' ); + + // Include free version classes + self::include_plugin_file( 'classes/abstract.class.php' ); + self::include_plugin_file( 'classes/fields.class.php' ); + self::include_plugin_file( 'classes/admin-options.class.php' ); + + // Include premium version classes + if ( self::$premium ) { + self::include_plugin_file( 'classes/customize-options.class.php' ); + self::include_plugin_file( 'classes/metabox-options.class.php' ); + self::include_plugin_file( 'classes/nav-menu-options.class.php' ); + self::include_plugin_file( 'classes/profile-options.class.php' ); + self::include_plugin_file( 'classes/shortcode-options.class.php' ); + self::include_plugin_file( 'classes/taxonomy-options.class.php' ); + self::include_plugin_file( 'classes/widget-options.class.php' ); + self::include_plugin_file( 'classes/comment-options.class.php' ); + } + + // Include all framework fields + $fields = apply_filters( 'wp_china_yes_fields', array( + 'accordion', + 'background', + 'backup', + 'border', + 'button_set', + 'callback', + 'checkbox', + 'code_editor', + 'color', + 'color_group', + 'content', + 'date', + 'datetime', + 'dimensions', + 'fieldset', + 'gallery', + 'group', + 'heading', + 'icon', + 'image_select', + 'link', + 'link_color', + 'map', + 'media', + 'notice', + 'number', + 'palette', + 'radio', + 'repeater', + 'select', + 'slider', + 'sortable', + 'sorter', + 'spacing', + 'spinner', + 'subheading', + 'submessage', + 'switcher', + 'tabbed', + 'text', + 'textarea', + 'typography', + 'upload', + 'wp_editor', + ) ); + + if ( ! empty( $fields ) ) { + foreach ( $fields as $field ) { + if ( ! class_exists( 'WP_CHINA_YES_Field_'. $field ) && class_exists( 'WP_CHINA_YES_Fields' ) ) { + self::include_plugin_file( 'fields/'. $field .'/'. $field .'.php' ); + } + } + } + + } + + // Setup textdomain + public static function textdomain() { + load_textdomain( 'wp_china_yes', self::$dir .'/languages/'. get_locale() .'.mo' ); + } + + // Set all of used fields + public static function set_used_fields( $sections ) { + + if ( ! empty( $sections['fields'] ) ) { + + foreach ( $sections['fields'] as $field ) { + + if ( ! empty( $field['fields'] ) ) { + self::set_used_fields( $field ); + } + + if ( ! empty( $field['tabs'] ) ) { + self::set_used_fields( array( 'fields' => $field['tabs'] ) ); + } + + if ( ! empty( $field['accordions'] ) ) { + self::set_used_fields( array( 'fields' => $field['accordions'] ) ); + } + + if ( ! empty( $field['elements'] ) ) { + self::set_used_fields( array( 'fields' => $field['elements'] ) ); + } + + if ( ! empty( $field['type'] ) ) { + self::$fields[$field['type']] = $field; + } + + } + + } + + } + + // Enqueue admin and fields styles and scripts + public static function add_admin_enqueue_scripts() { + + if ( ! self::$enqueue ) { + + // Loads scripts and styles only when needed + $wpscreen = get_current_screen(); + + if ( ! empty( self::$args['admin_options'] ) ) { + foreach ( self::$args['admin_options'] as $argument ) { + if ( substr( $wpscreen->id, -strlen( $argument['menu_slug'] ) ) === $argument['menu_slug'] ) { + self::$enqueue = true; + } + } + } + + if ( ! empty( self::$args['metabox_options'] ) ) { + foreach ( self::$args['metabox_options'] as $argument ) { + if ( in_array( $wpscreen->post_type, (array) $argument['post_type'] ) ) { + self::$enqueue = true; + } + } + } + + if ( ! empty( self::$args['taxonomy_options'] ) ) { + foreach ( self::$args['taxonomy_options'] as $argument ) { + if ( in_array( $wpscreen->taxonomy, (array) $argument['taxonomy'] ) ) { + self::$enqueue = true; + } + } + } + + if ( ! empty( self::$shortcode_instances ) ) { + foreach ( self::$shortcode_instances as $argument ) { + if ( ( $argument['show_in_editor'] && $wpscreen->base === 'post' ) || $argument['show_in_custom'] ) { + self::$enqueue = true; + } + } + } + + if ( ! empty( self::$args['widget_options'] ) && ( $wpscreen->id === 'widgets' || $wpscreen->id === 'customize' ) ) { + self::$enqueue = true; + } + + if ( ! empty( self::$args['customize_options'] ) && $wpscreen->id === 'customize' ) { + self::$enqueue = true; + } + + if ( ! empty( self::$args['nav_menu_options'] ) && $wpscreen->id === 'nav-menus' ) { + self::$enqueue = true; + } + + if ( ! empty( self::$args['profile_options'] ) && ( $wpscreen->id === 'profile' || $wpscreen->id === 'user-edit' ) ) { + self::$enqueue = true; + } + + if ( ! empty( self::$args['comment_options'] ) && $wpscreen->id === 'comment' ) { + self::$enqueue = true; + } + + } + + if ( ! apply_filters( 'wp_china_yes_enqueue_assets', self::$enqueue ) ) { + return; + } + + // Admin utilities + wp_enqueue_media(); + + // Wp color picker + wp_enqueue_style( 'wp-color-picker' ); + wp_enqueue_script( 'wp-color-picker' ); + + // Font awesome 4 and 5 loader + if ( apply_filters( 'wp_china_yes_fa4', false ) ) { + wp_enqueue_style( 'wp_china_yes-fa', 'https://jsd.admincdn.com/npm/font-awesome@4.7.0/css/font-awesome.min.css', array(), '4.7.0', 'all' ); + } else { + wp_enqueue_style( 'wp_china_yes-fa5', 'https://jsd.admincdn.com/npm/@fortawesome/fontawesome-free@5.15.4/css/all.min.css', array(), '5.15.5', 'all' ); + wp_enqueue_style( 'wp_china_yes-fa5-v4-shims', 'https://jsd.admincdn.com/npm/@fortawesome/fontawesome-free@5.15.4/css/v4-shims.min.css', array(), '5.15.5', 'all' ); + } + + // Check for developer mode + $min = ( self::$premium && SCRIPT_DEBUG ) ? '' : '.min'; + + // Main style + wp_enqueue_style( 'wp_china_yes', self::include_plugin_url( 'assets/css/style'. $min .'.css' ), array(), self::$version, 'all' ); + + // Main RTL styles + if ( is_rtl() ) { + wp_enqueue_style( 'wp_china_yes-rtl', self::include_plugin_url( 'assets/css/style-rtl'. $min .'.css' ), array(), self::$version, 'all' ); + } + + // Main scripts + wp_enqueue_script( 'wp_china_yes-plugins', self::include_plugin_url( 'assets/js/plugins'. $min .'.js' ), array(), self::$version, true ); + wp_enqueue_script( 'wp_china_yes', self::include_plugin_url( 'assets/js/main'. $min .'.js' ), array( 'wp_china_yes-plugins' ), self::$version, true ); + + // Main variables + wp_localize_script( 'wp_china_yes', 'wp_china_yes_vars', array( + 'color_palette' => apply_filters( 'wp_china_yes_color_palette', array() ), + 'i18n' => array( + 'confirm' => esc_html__( 'Are you sure?', 'wp_china_yes' ), + 'typing_text' => esc_html__( 'Please enter %s or more characters', 'wp_china_yes' ), + 'searching_text' => esc_html__( 'Searching...', 'wp_china_yes' ), + 'no_results_text' => esc_html__( 'No results found.', 'wp_china_yes' ), + ), + ) ); + + // Enqueue fields scripts and styles + $enqueued = array(); + + if ( ! empty( self::$fields ) ) { + foreach ( self::$fields as $field ) { + if ( ! empty( $field['type'] ) ) { + $classname = 'WP_CHINA_YES_Field_' . $field['type']; + if ( class_exists( $classname ) && method_exists( $classname, 'enqueue' ) ) { + $instance = new $classname( $field ); + if ( method_exists( $classname, 'enqueue' ) ) { + $instance->enqueue(); + } + unset( $instance ); + } + } + } + } + + do_action( 'wp_china_yes_enqueue' ); + + } + + // Add typography enqueue styles to front page + public static function add_typography_enqueue_styles() { + + if ( ! empty( self::$webfonts ) ) { + + if ( ! empty( self::$webfonts['enqueue'] ) ) { + + $query = array(); + $fonts = array(); + + foreach ( self::$webfonts['enqueue'] as $family => $styles ) { + $fonts[] = $family . ( ( ! empty( $styles ) ) ? ':'. implode( ',', $styles ) : '' ); + } + + if ( ! empty( $fonts ) ) { + $query['family'] = implode( '%7C', $fonts ); + } + + if ( ! empty( self::$subsets ) ) { + $query['subset'] = implode( ',', self::$subsets ); + } + + $query['display'] = 'swap'; + + wp_enqueue_style( 'wp_china_yes-google-web-fonts', esc_url( add_query_arg( $query, '//fonts.googleapis.com/css' ) ), array(), null ); + + } + + if ( ! empty( self::$webfonts['async'] ) ) { + + $fonts = array(); + + foreach ( self::$webfonts['async'] as $family => $styles ) { + $fonts[] = $family . ( ( ! empty( $styles ) ) ? ':'. implode( ',', $styles ) : '' ); + } + + wp_enqueue_script( 'wp_china_yes-google-web-fonts', esc_url( '//ajax.googleapis.com/ajax/libs/webfont/1.6.26/webfont.js' ), array(), null ); + + wp_localize_script( 'wp_china_yes-google-web-fonts', 'WebFontConfig', array( 'google' => array( 'families' => $fonts ) ) ); + + } + + } + + } + + // Add admin body class + public static function add_admin_body_class( $classes ) { + + if ( apply_filters( 'wp_china_yes_fa4', false ) ) { + $classes .= 'wp_china_yes-fa5-shims'; + } + + return $classes; + + } + + // Add custom css to front page + public static function add_custom_css() { + + if ( ! empty( self::$css ) ) { + echo ''; + } + + } + + // Add a new framework field + public static function field( $field = array(), $value = '', $unique = '', $where = '', $parent = '' ) { + + // Check for unallow fields + if ( ! empty( $field['_notice'] ) ) { + + $field_type = $field['type']; + + $field = array(); + $field['content'] = esc_html__( 'Oops! Not allowed.', 'wp_china_yes' ) .' ('. $field_type .')'; + $field['type'] = 'notice'; + $field['style'] = 'danger'; + + } + + $depend = ''; + $visible = ''; + $unique = ( ! empty( $unique ) ) ? $unique : ''; + $class = ( ! empty( $field['class'] ) ) ? ' ' . esc_attr( $field['class'] ) : ''; + $is_pseudo = ( ! empty( $field['pseudo'] ) ) ? ' wp_china_yes-pseudo-field' : ''; + $field_type = ( ! empty( $field['type'] ) ) ? esc_attr( $field['type'] ) : ''; + + if ( ! empty( $field['dependency'] ) ) { + + $dependency = $field['dependency']; + $depend_visible = ''; + $data_controller = ''; + $data_condition = ''; + $data_value = ''; + $data_global = ''; + + if ( is_array( $dependency[0] ) ) { + $data_controller = implode( '|', array_column( $dependency, 0 ) ); + $data_condition = implode( '|', array_column( $dependency, 1 ) ); + $data_value = implode( '|', array_column( $dependency, 2 ) ); + $data_global = implode( '|', array_column( $dependency, 3 ) ); + $depend_visible = implode( '|', array_column( $dependency, 4 ) ); + } else { + $data_controller = ( ! empty( $dependency[0] ) ) ? $dependency[0] : ''; + $data_condition = ( ! empty( $dependency[1] ) ) ? $dependency[1] : ''; + $data_value = ( ! empty( $dependency[2] ) ) ? $dependency[2] : ''; + $data_global = ( ! empty( $dependency[3] ) ) ? $dependency[3] : ''; + $depend_visible = ( ! empty( $dependency[4] ) ) ? $dependency[4] : ''; + } + + $depend .= ' data-controller="'. esc_attr( $data_controller ) .'"'; + $depend .= ' data-condition="'. esc_attr( $data_condition ) .'"'; + $depend .= ' data-value="'. esc_attr( $data_value ) .'"'; + $depend .= ( ! empty( $data_global ) ) ? ' data-depend-global="true"' : ''; + + $visible = ( ! empty( $depend_visible ) ) ? ' wp_china_yes-depend-visible' : ' wp_china_yes-depend-hidden'; + + } + + // These attributes has been sanitized above. + echo '
        '; + + if ( ! empty( $field_type ) ) { + + if ( ! empty( $field['title'] ) ) { + echo '
        '; + echo '

        '. $field['title'] .'

        '; + echo ( ! empty( $field['subtitle'] ) ) ? '
        '. $field['subtitle'] .'
        ' : ''; + echo '
        '; + } + + echo ( ! empty( $field['title'] ) ) ? '
        ' : ''; + + $value = ( ! isset( $value ) && isset( $field['default'] ) ) ? $field['default'] : $value; + $value = ( isset( $field['value'] ) ) ? $field['value'] : $value; + + $classname = 'WP_CHINA_YES_Field_'. $field_type; + + if ( class_exists( $classname ) ) { + $instance = new $classname( $field, $value, $unique, $where, $parent ); + $instance->render(); + } else { + echo '

        '. esc_html__( 'Field not found!', 'wp_china_yes' ) .'

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

        '. esc_html__( 'Field not found!', 'wp_china_yes' ) .'

        '; + } + + echo ( ! empty( $field['title'] ) ) ? '
        ' : ''; + echo '
        '; + echo '
        '; + + } + + } + +} + +WP_CHINA_YES_Setup::init( __FILE__, false ); + +/** + * + * Extended Setup Class for Shortland + * + * @since 1.0.0 + * @version 1.0.0 + * + */ +if ( ! class_exists( 'WP_CHINA_YES' ) ) { + class WP_CHINA_YES extends WP_CHINA_YES_Setup{} +} diff --git a/framework/fields/accordion/accordion.php b/framework/fields/accordion/accordion.php new file mode 100644 index 0000000..f07dc0a --- /dev/null +++ b/framework/fields/accordion/accordion.php @@ -0,0 +1,64 @@ +field_before(); + + echo '
        '; + + foreach ( $this->field['accordions'] as $key => $accordion ) { + + echo '
        '; + + $icon = ( ! empty( $accordion['icon'] ) ) ? 'wp_china_yes--icon '. $accordion['icon'] : 'wp_china_yes-accordion-icon fas fa-angle-right'; + + echo '

        '; + echo ''; + echo esc_html( $accordion['title'] ); + echo '

        '; + + echo '
        '; + + foreach ( $accordion['fields'] as $field ) { + + if ( in_array( $field['type'], $unallows ) ) { $field['_notice'] = true; } + + $field_id = ( isset( $field['id'] ) ) ? $field['id'] : ''; + $field_default = ( isset( $field['default'] ) ) ? $field['default'] : ''; + $field_value = ( isset( $this->value[$field_id] ) ) ? $this->value[$field_id] : $field_default; + $unique_id = ( ! empty( $this->unique ) ) ? $this->unique .'['. $this->field['id'] .']' : $this->field['id']; + + WP_CHINA_YES::field( $field, $field_value, $unique_id, 'field/accordion' ); + + } + + echo '
        '; + + echo '
        '; + + } + + echo '
        '; + + echo $this->field_after(); + + } + + } +} diff --git a/framework/fields/background/background.php b/framework/fields/background/background.php new file mode 100644 index 0000000..c5601d3 --- /dev/null +++ b/framework/fields/background/background.php @@ -0,0 +1,340 @@ +field, array( + 'background_color' => true, + 'background_image' => true, + 'background_position' => true, + 'background_repeat' => true, + 'background_attachment' => true, + 'background_size' => true, + 'background_origin' => false, + 'background_clip' => false, + 'background_blend_mode' => false, + 'background_gradient' => false, + 'background_gradient_color' => true, + 'background_gradient_direction' => true, + 'background_image_preview' => true, + 'background_auto_attributes' => false, + 'compact' => false, + 'background_image_library' => 'image', + 'background_image_placeholder' => esc_html__( 'Not selected', 'wp_china_yes' ), + ) ); + + if ( $args['compact'] ) { + $args['background_color'] = false; + $args['background_auto_attributes'] = true; + } + + $default_value = array( + 'background-color' => '', + 'background-image' => '', + 'background-position' => '', + 'background-repeat' => '', + 'background-attachment' => '', + 'background-size' => '', + 'background-origin' => '', + 'background-clip' => '', + 'background-blend-mode' => '', + 'background-gradient-color' => '', + 'background-gradient-direction' => '', + ); + + $default_value = ( ! empty( $this->field['default'] ) ) ? wp_parse_args( $this->field['default'], $default_value ) : $default_value; + + $this->value = wp_parse_args( $this->value, $default_value ); + + echo $this->field_before(); + + echo '
        '; + + // + // Background Color + if ( ! empty( $args['background_color'] ) ) { + + echo '
        '; + + echo ( ! empty( $args['background_gradient'] ) ) ? '
        '. esc_html__( 'From', 'wp_china_yes' ) .'
        ' : ''; + + WP_CHINA_YES::field( array( + 'id' => 'background-color', + 'type' => 'color', + 'default' => $default_value['background-color'], + ), $this->value['background-color'], $this->field_name(), 'field/background' ); + + echo '
        '; + + } + + // + // Background Gradient Color + if ( ! empty( $args['background_gradient_color'] ) && ! empty( $args['background_gradient'] ) ) { + + echo '
        '; + + echo ( ! empty( $args['background_gradient'] ) ) ? '
        '. esc_html__( 'To', 'wp_china_yes' ) .'
        ' : ''; + + WP_CHINA_YES::field( array( + 'id' => 'background-gradient-color', + 'type' => 'color', + 'default' => $default_value['background-gradient-color'], + ), $this->value['background-gradient-color'], $this->field_name(), 'field/background' ); + + echo '
        '; + + } + + // + // Background Gradient Direction + if ( ! empty( $args['background_gradient_direction'] ) && ! empty( $args['background_gradient'] ) ) { + + echo '
        '; + + echo ( ! empty( $args['background_gradient'] ) ) ? '
        '. esc_html__( 'Direction', 'wp_china_yes' ) .'
        ' : ''; + + WP_CHINA_YES::field( array( + 'id' => 'background-gradient-direction', + 'type' => 'select', + 'options' => array( + '' => esc_html__( 'Gradient Direction', 'wp_china_yes' ), + 'to bottom' => esc_html__( '⇓ top to bottom', 'wp_china_yes' ), + 'to right' => esc_html__( '⇒ left to right', 'wp_china_yes' ), + '135deg' => esc_html__( '⇘ corner top to right', 'wp_china_yes' ), + '-135deg' => esc_html__( '⇙ corner top to left', 'wp_china_yes' ), + ), + ), $this->value['background-gradient-direction'], $this->field_name(), 'field/background' ); + + echo '
        '; + + } + + echo '
        '; + + // + // Background Image + if ( ! empty( $args['background_image'] ) ) { + + echo '
        '; + + WP_CHINA_YES::field( array( + 'id' => 'background-image', + 'type' => 'media', + 'class' => 'wp_china_yes-assign-field-background', + 'library' => $args['background_image_library'], + 'preview' => $args['background_image_preview'], + 'placeholder' => $args['background_image_placeholder'], + 'attributes' => array( 'data-depend-id' => $this->field['id'] ), + ), $this->value['background-image'], $this->field_name(), 'field/background' ); + + echo '
        '; + + } + + $auto_class = ( ! empty( $args['background_auto_attributes'] ) ) ? ' wp_china_yes--auto-attributes' : ''; + $hidden_class = ( ! empty( $args['background_auto_attributes'] ) && empty( $this->value['background-image']['url'] ) ) ? ' wp_china_yes--attributes-hidden' : ''; + + echo '
        '; + + // + // Background Position + if ( ! empty( $args['background_position'] ) ) { + + WP_CHINA_YES::field( array( + 'id' => 'background-position', + 'type' => 'select', + 'options' => array( + '' => esc_html__( 'Background Position', 'wp_china_yes' ), + 'left top' => esc_html__( 'Left Top', 'wp_china_yes' ), + 'left center' => esc_html__( 'Left Center', 'wp_china_yes' ), + 'left bottom' => esc_html__( 'Left Bottom', 'wp_china_yes' ), + 'center top' => esc_html__( 'Center Top', 'wp_china_yes' ), + 'center center' => esc_html__( 'Center Center', 'wp_china_yes' ), + 'center bottom' => esc_html__( 'Center Bottom', 'wp_china_yes' ), + 'right top' => esc_html__( 'Right Top', 'wp_china_yes' ), + 'right center' => esc_html__( 'Right Center', 'wp_china_yes' ), + 'right bottom' => esc_html__( 'Right Bottom', 'wp_china_yes' ), + ), + ), $this->value['background-position'], $this->field_name(), 'field/background' ); + + } + + // + // Background Repeat + if ( ! empty( $args['background_repeat'] ) ) { + + WP_CHINA_YES::field( array( + 'id' => 'background-repeat', + 'type' => 'select', + 'options' => array( + '' => esc_html__( 'Background Repeat', 'wp_china_yes' ), + 'repeat' => esc_html__( 'Repeat', 'wp_china_yes' ), + 'no-repeat' => esc_html__( 'No Repeat', 'wp_china_yes' ), + 'repeat-x' => esc_html__( 'Repeat Horizontally', 'wp_china_yes' ), + 'repeat-y' => esc_html__( 'Repeat Vertically', 'wp_china_yes' ), + ), + ), $this->value['background-repeat'], $this->field_name(), 'field/background' ); + + } + + // + // Background Attachment + if ( ! empty( $args['background_attachment'] ) ) { + + WP_CHINA_YES::field( array( + 'id' => 'background-attachment', + 'type' => 'select', + 'options' => array( + '' => esc_html__( 'Background Attachment', 'wp_china_yes' ), + 'scroll' => esc_html__( 'Scroll', 'wp_china_yes' ), + 'fixed' => esc_html__( 'Fixed', 'wp_china_yes' ), + ), + ), $this->value['background-attachment'], $this->field_name(), 'field/background' ); + + } + + // + // Background Size + if ( ! empty( $args['background_size'] ) ) { + + WP_CHINA_YES::field( array( + 'id' => 'background-size', + 'type' => 'select', + 'options' => array( + '' => esc_html__( 'Background Size', 'wp_china_yes' ), + 'cover' => esc_html__( 'Cover', 'wp_china_yes' ), + 'contain' => esc_html__( 'Contain', 'wp_china_yes' ), + 'auto' => esc_html__( 'Auto', 'wp_china_yes' ), + ), + ), $this->value['background-size'], $this->field_name(), 'field/background' ); + + } + + // + // Background Origin + if ( ! empty( $args['background_origin'] ) ) { + + WP_CHINA_YES::field( array( + 'id' => 'background-origin', + 'type' => 'select', + 'options' => array( + '' => esc_html__( 'Background Origin', 'wp_china_yes' ), + 'padding-box' => esc_html__( 'Padding Box', 'wp_china_yes' ), + 'border-box' => esc_html__( 'Border Box', 'wp_china_yes' ), + 'content-box' => esc_html__( 'Content Box', 'wp_china_yes' ), + ), + ), $this->value['background-origin'], $this->field_name(), 'field/background' ); + + } + + // + // Background Clip + if ( ! empty( $args['background_clip'] ) ) { + + WP_CHINA_YES::field( array( + 'id' => 'background-clip', + 'type' => 'select', + 'options' => array( + '' => esc_html__( 'Background Clip', 'wp_china_yes' ), + 'border-box' => esc_html__( 'Border Box', 'wp_china_yes' ), + 'padding-box' => esc_html__( 'Padding Box', 'wp_china_yes' ), + 'content-box' => esc_html__( 'Content Box', 'wp_china_yes' ), + ), + ), $this->value['background-clip'], $this->field_name(), 'field/background' ); + + } + + // + // Background Blend Mode + if ( ! empty( $args['background_blend_mode'] ) ) { + + WP_CHINA_YES::field( array( + 'id' => 'background-blend-mode', + 'type' => 'select', + 'options' => array( + '' => esc_html__( 'Background Blend Mode', 'wp_china_yes' ), + 'normal' => esc_html__( 'Normal', 'wp_china_yes' ), + 'multiply' => esc_html__( 'Multiply', 'wp_china_yes' ), + 'screen' => esc_html__( 'Screen', 'wp_china_yes' ), + 'overlay' => esc_html__( 'Overlay', 'wp_china_yes' ), + 'darken' => esc_html__( 'Darken', 'wp_china_yes' ), + 'lighten' => esc_html__( 'Lighten', 'wp_china_yes' ), + 'color-dodge' => esc_html__( 'Color Dodge', 'wp_china_yes' ), + 'saturation' => esc_html__( 'Saturation', 'wp_china_yes' ), + 'color' => esc_html__( 'Color', 'wp_china_yes' ), + 'luminosity' => esc_html__( 'Luminosity', 'wp_china_yes' ), + ), + ), $this->value['background-blend-mode'], $this->field_name(), 'field/background' ); + + } + + echo '
        '; + + echo $this->field_after(); + + } + + public function output() { + + $output = ''; + $bg_image = array(); + $important = ( ! empty( $this->field['output_important'] ) ) ? '!important' : ''; + $element = ( is_array( $this->field['output'] ) ) ? join( ',', $this->field['output'] ) : $this->field['output']; + + // Background image and gradient + $background_color = ( ! empty( $this->value['background-color'] ) ) ? $this->value['background-color'] : ''; + $background_gd_color = ( ! empty( $this->value['background-gradient-color'] ) ) ? $this->value['background-gradient-color'] : ''; + $background_gd_direction = ( ! empty( $this->value['background-gradient-direction'] ) ) ? $this->value['background-gradient-direction'] : ''; + $background_image = ( ! empty( $this->value['background-image']['url'] ) ) ? $this->value['background-image']['url'] : ''; + + + if ( $background_color && $background_gd_color ) { + $gd_direction = ( $background_gd_direction ) ? $background_gd_direction .',' : ''; + $bg_image[] = 'linear-gradient('. $gd_direction . $background_color .','. $background_gd_color .')'; + unset( $this->value['background-color'] ); + } + + if ( $background_image ) { + $bg_image[] = 'url('. $background_image .')'; + } + + if ( ! empty( $bg_image ) ) { + $output .= 'background-image:'. implode( ',', $bg_image ) . $important .';'; + } + + // Common background properties + $properties = array( 'color', 'position', 'repeat', 'attachment', 'size', 'origin', 'clip', 'blend-mode' ); + + foreach ( $properties as $property ) { + $property = 'background-'. $property; + if ( ! empty( $this->value[$property] ) ) { + $output .= $property .':'. $this->value[$property] . $important .';'; + } + } + + if ( $output ) { + $output = $element .'{'. $output .'}'; + } + + $this->parent->output_css .= $output; + + return $output; + + } + + } +} diff --git a/framework/fields/backup/backup.php b/framework/fields/backup/backup.php new file mode 100644 index 0000000..f829640 --- /dev/null +++ b/framework/fields/backup/backup.php @@ -0,0 +1,38 @@ +unique; + $nonce = wp_create_nonce( 'wp_china_yes_backup_nonce' ); + $export = add_query_arg( array( 'action' => 'wp_china_yes-export', 'unique' => $unique, 'nonce' => $nonce ), admin_url( 'admin-ajax.php' ) ); + + echo $this->field_before(); + + echo ''; + echo ''; + echo '
        '; + echo ''; + echo ''. esc_html__( 'Export & Download', 'wp_china_yes' ) .''; + echo '
        '; + echo ''; + + echo $this->field_after(); + + } + + } +} diff --git a/framework/fields/border/border.php b/framework/fields/border/border.php new file mode 100644 index 0000000..e055449 --- /dev/null +++ b/framework/fields/border/border.php @@ -0,0 +1,176 @@ +field, array( + 'top_icon' => '', + 'left_icon' => '', + 'bottom_icon' => '', + 'right_icon' => '', + 'all_icon' => '', + 'top_placeholder' => esc_html__( 'top', 'wp_china_yes' ), + 'right_placeholder' => esc_html__( 'right', 'wp_china_yes' ), + 'bottom_placeholder' => esc_html__( 'bottom', 'wp_china_yes' ), + 'left_placeholder' => esc_html__( 'left', 'wp_china_yes' ), + 'all_placeholder' => esc_html__( 'all', 'wp_china_yes' ), + 'top' => true, + 'left' => true, + 'bottom' => true, + 'right' => true, + 'all' => false, + 'color' => true, + 'style' => true, + 'unit' => 'px', + ) ); + + $default_value = array( + 'top' => '', + 'right' => '', + 'bottom' => '', + 'left' => '', + 'color' => '', + 'style' => 'solid', + 'all' => '', + ); + + $border_props = array( + 'solid' => esc_html__( 'Solid', 'wp_china_yes' ), + 'dashed' => esc_html__( 'Dashed', 'wp_china_yes' ), + 'dotted' => esc_html__( 'Dotted', 'wp_china_yes' ), + 'double' => esc_html__( 'Double', 'wp_china_yes' ), + 'inset' => esc_html__( 'Inset', 'wp_china_yes' ), + 'outset' => esc_html__( 'Outset', 'wp_china_yes' ), + 'groove' => esc_html__( 'Groove', 'wp_china_yes' ), + 'ridge' => esc_html__( 'ridge', 'wp_china_yes' ), + 'none' => esc_html__( 'None', 'wp_china_yes' ) + ); + + $default_value = ( ! empty( $this->field['default'] ) ) ? wp_parse_args( $this->field['default'], $default_value ) : $default_value; + + $value = wp_parse_args( $this->value, $default_value ); + + echo $this->field_before(); + + echo '
        '; + + if ( ! empty( $args['all'] ) ) { + + $placeholder = ( ! empty( $args['all_placeholder'] ) ) ? ' placeholder="'. esc_attr( $args['all_placeholder'] ) .'"' : ''; + + echo '
        '; + echo ( ! empty( $args['all_icon'] ) ) ? ''. $args['all_icon'] .'' : ''; + echo ''; + echo ( ! empty( $args['unit'] ) ) ? ''. esc_attr( $args['unit'] ) .'' : ''; + echo '
        '; + + } else { + + $properties = array(); + + foreach ( array( 'top', 'right', 'bottom', 'left' ) as $prop ) { + if ( ! empty( $args[$prop] ) ) { + $properties[] = $prop; + } + } + + $properties = ( $properties === array( 'right', 'left' ) ) ? array_reverse( $properties ) : $properties; + + foreach ( $properties as $property ) { + + $placeholder = ( ! empty( $args[$property.'_placeholder'] ) ) ? ' placeholder="'. esc_attr( $args[$property.'_placeholder'] ) .'"' : ''; + + echo '
        '; + echo ( ! empty( $args[$property.'_icon'] ) ) ? ''. $args[$property.'_icon'] .'' : ''; + echo ''; + echo ( ! empty( $args['unit'] ) ) ? ''. esc_attr( $args['unit'] ) .'' : ''; + echo '
        '; + + } + + } + + if ( ! empty( $args['style'] ) ) { + echo '
        '; + echo ''; + echo '
        '; + } + + echo '
        '; + + if ( ! empty( $args['color'] ) ) { + $default_color_attr = ( ! empty( $default_value['color'] ) ) ? ' data-default-color="'. esc_attr( $default_value['color'] ) .'"' : ''; + echo '
        '; + echo '
        '; + echo ''; + echo '
        '; + echo '
        '; + } + + echo $this->field_after(); + + } + + public function output() { + + $output = ''; + $unit = ( ! empty( $this->value['unit'] ) ) ? $this->value['unit'] : 'px'; + $important = ( ! empty( $this->field['output_important'] ) ) ? '!important' : ''; + $element = ( is_array( $this->field['output'] ) ) ? join( ',', $this->field['output'] ) : $this->field['output']; + + // properties + $top = ( isset( $this->value['top'] ) && $this->value['top'] !== '' ) ? $this->value['top'] : ''; + $right = ( isset( $this->value['right'] ) && $this->value['right'] !== '' ) ? $this->value['right'] : ''; + $bottom = ( isset( $this->value['bottom'] ) && $this->value['bottom'] !== '' ) ? $this->value['bottom'] : ''; + $left = ( isset( $this->value['left'] ) && $this->value['left'] !== '' ) ? $this->value['left'] : ''; + $style = ( isset( $this->value['style'] ) && $this->value['style'] !== '' ) ? $this->value['style'] : ''; + $color = ( isset( $this->value['color'] ) && $this->value['color'] !== '' ) ? $this->value['color'] : ''; + $all = ( isset( $this->value['all'] ) && $this->value['all'] !== '' ) ? $this->value['all'] : ''; + + if ( ! empty( $this->field['all'] ) && ( $all !== '' || $color !== '' ) ) { + + $output = $element .'{'; + $output .= ( $all !== '' ) ? 'border-width:'. $all . $unit . $important .';' : ''; + $output .= ( $color !== '' ) ? 'border-color:'. $color . $important .';' : ''; + $output .= ( $style !== '' ) ? 'border-style:'. $style . $important .';' : ''; + $output .= '}'; + + } else if ( $top !== '' || $right !== '' || $bottom !== '' || $left !== '' || $color !== '' ) { + + $output = $element .'{'; + $output .= ( $top !== '' ) ? 'border-top-width:'. $top . $unit . $important .';' : ''; + $output .= ( $right !== '' ) ? 'border-right-width:'. $right . $unit . $important .';' : ''; + $output .= ( $bottom !== '' ) ? 'border-bottom-width:'. $bottom . $unit . $important .';' : ''; + $output .= ( $left !== '' ) ? 'border-left-width:'. $left . $unit . $important .';' : ''; + $output .= ( $color !== '' ) ? 'border-color:'. $color . $important .';' : ''; + $output .= ( $style !== '' ) ? 'border-style:'. $style . $important .';' : ''; + $output .= '}'; + + } + + $this->parent->output_css .= $output; + + return $output; + + } + + } +} diff --git a/framework/fields/button_set/button_set.php b/framework/fields/button_set/button_set.php new file mode 100644 index 0000000..16ff7b5 --- /dev/null +++ b/framework/fields/button_set/button_set.php @@ -0,0 +1,67 @@ +field, array( + 'multiple' => false, + 'options' => array(), + 'query_args' => array(), + ) ); + + $value = ( is_array( $this->value ) ) ? $this->value : array_filter( (array) $this->value ); + + echo $this->field_before(); + + if ( isset( $this->field['options'] ) ) { + + $options = $this->field['options']; + $options = ( is_array( $options ) ) ? $options : array_filter( $this->field_data( $options, false, $args['query_args'] ) ); + + if ( is_array( $options ) && ! empty( $options ) ) { + + echo '
        '; + + foreach ( $options as $key => $option ) { + + $type = ( $args['multiple'] ) ? 'checkbox' : 'radio'; + $extra = ( $args['multiple'] ) ? '[]' : ''; + $active = ( in_array( $key, $value ) || ( empty( $value ) && empty( $key ) ) ) ? ' wp_china_yes--active' : ''; + $checked = ( in_array( $key, $value ) || ( empty( $value ) && empty( $key ) ) ) ? ' checked' : ''; + + echo '
        '; + echo 'field_attributes() . esc_attr( $checked ) .'/>'; + echo $option; + echo '
        '; + + } + + echo '
        '; + + } else { + + echo ( ! empty( $this->field['empty_message'] ) ) ? esc_attr( $this->field['empty_message'] ) : esc_html__( 'No data available.', 'wp_china_yes' ); + + } + + } + + echo $this->field_after(); + + } + + } +} diff --git a/framework/fields/callback/callback.php b/framework/fields/callback/callback.php new file mode 100644 index 0000000..d3ced5c --- /dev/null +++ b/framework/fields/callback/callback.php @@ -0,0 +1,31 @@ +field['function'] ) && is_callable( $this->field['function'] ) ) { + + $args = ( isset( $this->field['args'] ) ) ? $this->field['args'] : null; + + call_user_func( $this->field['function'], $args ); + + } + + } + + } +} + diff --git a/framework/fields/checkbox/checkbox.php b/framework/fields/checkbox/checkbox.php new file mode 100644 index 0000000..e8ea23b --- /dev/null +++ b/framework/fields/checkbox/checkbox.php @@ -0,0 +1,101 @@ +field, array( + 'inline' => false, + 'query_args' => array(), + 'check_all' => false, + 'check_all_text' => esc_html__( 'Check/Uncheck All' ), + ) ); + + $inline_class = ( $args['inline'] ) ? ' class="wp_china_yes--inline-list"' : ''; + + echo $this->field_before(); + + if ( isset( $this->field['options'] ) ) { + + $value = ( is_array( $this->value ) ) ? $this->value : array_filter( (array) $this->value ); + $options = $this->field['options']; + $options = ( is_array( $options ) ) ? $options : array_filter( $this->field_data( $options, false, $args['query_args'] ) ); + + if ( is_array( $options ) && ! empty( $options ) ) { + + echo ''; + + foreach ( $options as $option_key => $option_value ) { + + if ( is_array( $option_value ) && ! empty( $option_value ) ) { + + echo '
      • '; + echo '
          '; + echo '
        • '. esc_attr( $option_key ) .'
        • '; + foreach ( $option_value as $sub_key => $sub_value ) { + $checked = ( in_array( $sub_key, $value ) ) ? ' checked' : ''; + echo '
        • '; + echo ''; + echo '
        • '; + } + echo '
        '; + echo '
      • '; + + } else { + + $checked = ( in_array( $option_key, $value ) ) ? ' checked' : ''; + + echo '
      • '; + echo ''; + echo '
      • '; + + } + + } + + echo ''; + + if ( $args['check_all'] ) { + echo '
        '. esc_html( $args['check_all_text'] ) .'
        '; + } + + } else { + + echo ( ! empty( $this->field['empty_message'] ) ) ? esc_attr( $this->field['empty_message'] ) : esc_html__( 'No data available.', 'wp_china_yes' ); + + } + + } else { + + echo ''; + + } + + echo $this->field_after(); + + } + + } +} diff --git a/framework/fields/code_editor/code_editor.php b/framework/fields/code_editor/code_editor.php new file mode 100644 index 0000000..4095af5 --- /dev/null +++ b/framework/fields/code_editor/code_editor.php @@ -0,0 +1,58 @@ + 2, + 'lineNumbers' => true, + 'theme' => 'default', + 'mode' => 'htmlmixed', + 'cdnURL' => $this->cdn_url . $this->version, + ); + + $settings = ( ! empty( $this->field['settings'] ) ) ? $this->field['settings'] : array(); + $settings = wp_parse_args( $settings, $default_settings ); + + echo $this->field_before(); + echo ''; + echo $this->field_after(); + + } + + public function enqueue() { + + $page = ( ! empty( $_GET[ 'page' ] ) ) ? sanitize_text_field( wp_unslash( $_GET[ 'page' ] ) ) : ''; + + // Do not loads CodeMirror in revslider page. + if ( in_array( $page, array( 'revslider' ) ) ) { return; } + + if ( ! wp_script_is( 'wp_china_yes-codemirror' ) ) { + wp_enqueue_script( 'wp_china_yes-codemirror', esc_url( $this->cdn_url . $this->version .'/lib/codemirror.min.js' ), array( 'wp_china_yes' ), $this->version, true ); + wp_enqueue_script( 'wp_china_yes-codemirror-loadmode', esc_url( $this->cdn_url . $this->version .'/addon/mode/loadmode.min.js' ), array( 'wp_china_yes-codemirror' ), $this->version, true ); + } + + if ( ! wp_style_is( 'wp_china_yes-codemirror' ) ) { + wp_enqueue_style( 'wp_china_yes-codemirror', esc_url( $this->cdn_url . $this->version .'/lib/codemirror.min.css' ), array(), $this->version ); + } + + } + + } +} diff --git a/framework/fields/color/color.php b/framework/fields/color/color.php new file mode 100644 index 0000000..5720701 --- /dev/null +++ b/framework/fields/color/color.php @@ -0,0 +1,52 @@ +field['default'] ) ) ? ' data-default-color="'. esc_attr( $this->field['default'] ) .'"' : ''; + + echo $this->field_before(); + echo 'field_attributes() .'/>'; + echo $this->field_after(); + + } + + public function output() { + + $output = ''; + $elements = ( is_array( $this->field['output'] ) ) ? $this->field['output'] : array_filter( (array) $this->field['output'] ); + $important = ( ! empty( $this->field['output_important'] ) ) ? '!important' : ''; + $mode = ( ! empty( $this->field['output_mode'] ) ) ? $this->field['output_mode'] : 'color'; + + if ( ! empty( $elements ) && isset( $this->value ) && $this->value !== '' ) { + foreach ( $elements as $key_property => $element ) { + if ( is_numeric( $key_property ) ) { + $output = implode( ',', $elements ) .'{'. $mode .':'. $this->value . $important .';}'; + break; + } else { + $output .= $element .'{'. $key_property .':'. $this->value . $important .'}'; + } + } + } + + $this->parent->output_css .= $output; + + return $output; + + } + + } +} diff --git a/framework/fields/color_group/color_group.php b/framework/fields/color_group/color_group.php new file mode 100644 index 0000000..842adc5 --- /dev/null +++ b/framework/fields/color_group/color_group.php @@ -0,0 +1,42 @@ +field['options'] ) ) ? $this->field['options'] : array(); + + echo $this->field_before(); + + if ( ! empty( $options ) ) { + foreach ( $options as $key => $option ) { + + $color_value = ( ! empty( $this->value[$key] ) ) ? $this->value[$key] : ''; + $default_attr = ( ! empty( $this->field['default'][$key] ) ) ? ' data-default-color="'. esc_attr( $this->field['default'][$key] ) .'"' : ''; + + echo '
        '; + echo '
        '. $option .'
        '; + echo 'field_attributes() .'/>'; + echo '
        '; + + } + } + + echo $this->field_after(); + + } + + } +} diff --git a/framework/fields/content/content.php b/framework/fields/content/content.php new file mode 100644 index 0000000..dadf3bc --- /dev/null +++ b/framework/fields/content/content.php @@ -0,0 +1,28 @@ +field['content'] ) ) { + + echo $this->field['content']; + + } + + } + + } +} diff --git a/framework/fields/date/date.php b/framework/fields/date/date.php new file mode 100644 index 0000000..e03b2f6 --- /dev/null +++ b/framework/fields/date/date.php @@ -0,0 +1,64 @@ + 'mm/dd/yy', + ); + + $settings = ( ! empty( $this->field['settings'] ) ) ? $this->field['settings'] : array(); + $settings = wp_parse_args( $settings, $default_settings ); + + echo $this->field_before(); + + if ( ! empty( $this->field['from_to'] ) ) { + + $args = wp_parse_args( $this->field, array( + 'text_from' => esc_html__( 'From', 'wp_china_yes' ), + 'text_to' => esc_html__( 'To', 'wp_china_yes' ), + ) ); + + $value = wp_parse_args( $this->value, array( + 'from' => '', + 'to' => '', + ) ); + + echo ''; + echo ''; + + } else { + + echo 'field_attributes() .'/>'; + + } + + echo '
        '; + + echo $this->field_after(); + + } + + public function enqueue() { + + if ( ! wp_script_is( 'jquery-ui-datepicker' ) ) { + wp_enqueue_script( 'jquery-ui-datepicker' ); + } + + } + + } +} diff --git a/framework/fields/datetime/datetime.php b/framework/fields/datetime/datetime.php new file mode 100644 index 0000000..db33ea1 --- /dev/null +++ b/framework/fields/datetime/datetime.php @@ -0,0 +1,61 @@ + true, + ); + + $settings = ( ! empty( $this->field['settings'] ) ) ? $this->field['settings'] : array(); + + if ( ! isset( $settings['noCalendar'] ) ) { + $defaults['dateFormat'] = 'm/d/Y'; + } + + $settings = wp_parse_args( $settings, $defaults ); + + echo $this->field_before(); + + if ( ! empty( $this->field['from_to'] ) ) { + + $args = wp_parse_args( $this->field, array( + 'text_from' => esc_html__( 'From', 'wp_china_yes' ), + 'text_to' => esc_html__( 'To', 'wp_china_yes' ), + ) ); + + $value = wp_parse_args( $this->value, array( + 'from' => '', + 'to' => '', + ) ); + + echo ''; + echo ''; + + } else { + + echo 'field_attributes() .'/>'; + + } + + echo '
        '; + + echo $this->field_after(); + + } + + } +} diff --git a/framework/fields/dimensions/dimensions.php b/framework/fields/dimensions/dimensions.php new file mode 100644 index 0000000..3b5a28c --- /dev/null +++ b/framework/fields/dimensions/dimensions.php @@ -0,0 +1,101 @@ +field, array( + 'width_icon' => '', + 'height_icon' => '', + 'width_placeholder' => esc_html__( 'width', 'wp_china_yes' ), + 'height_placeholder' => esc_html__( 'height', 'wp_china_yes' ), + 'width' => true, + 'height' => true, + 'unit' => true, + 'show_units' => true, + 'units' => array( 'px', '%', 'em' ) + ) ); + + $default_values = array( + 'width' => '', + 'height' => '', + 'unit' => 'px', + ); + + $value = wp_parse_args( $this->value, $default_values ); + $unit = ( count( $args['units'] ) === 1 && ! empty( $args['unit'] ) ) ? $args['units'][0] : ''; + $is_unit = ( ! empty( $unit ) ) ? ' wp_china_yes--is-unit' : ''; + + echo $this->field_before(); + + echo '
        '; + + if ( ! empty( $args['width'] ) ) { + $placeholder = ( ! empty( $args['width_placeholder'] ) ) ? ' placeholder="'. esc_attr( $args['width_placeholder'] ) .'"' : ''; + echo '
        '; + echo ( ! empty( $args['width_icon'] ) ) ? ''. $args['width_icon'] .'' : ''; + echo ''; + echo ( ! empty( $unit ) ) ? ''. esc_attr( $args['units'][0] ) .'' : ''; + echo '
        '; + } + + if ( ! empty( $args['height'] ) ) { + $placeholder = ( ! empty( $args['height_placeholder'] ) ) ? ' placeholder="'. esc_attr( $args['height_placeholder'] ) .'"' : ''; + echo '
        '; + echo ( ! empty( $args['height_icon'] ) ) ? ''. $args['height_icon'] .'' : ''; + echo ''; + echo ( ! empty( $unit ) ) ? ''. esc_attr( $args['units'][0] ) .'' : ''; + echo '
        '; + } + + if ( ! empty( $args['unit'] ) && ! empty( $args['show_units'] ) && count( $args['units'] ) > 1 ) { + echo '
        '; + echo ''; + echo '
        '; + } + + echo '
        '; + + echo $this->field_after(); + + } + + public function output() { + + $output = ''; + $element = ( is_array( $this->field['output'] ) ) ? join( ',', $this->field['output'] ) : $this->field['output']; + $prefix = ( ! empty( $this->field['output_prefix'] ) ) ? $this->field['output_prefix'] .'-' : ''; + $important = ( ! empty( $this->field['output_important'] ) ) ? '!important' : ''; + $unit = ( ! empty( $this->value['unit'] ) ) ? $this->value['unit'] : 'px'; + $width = ( isset( $this->value['width'] ) && $this->value['width'] !== '' ) ? $prefix .'width:'. $this->value['width'] . $unit . $important .';' : ''; + $height = ( isset( $this->value['height'] ) && $this->value['height'] !== '' ) ? $prefix .'height:'. $this->value['height'] . $unit . $important .';' : ''; + + if ( $width !== '' || $height !== '' ) { + $output = $element .'{'. $width . $height .'}'; + } + + $this->parent->output_css .= $output; + + return $output; + + } + + } +} diff --git a/framework/fields/fieldset/fieldset.php b/framework/fields/fieldset/fieldset.php new file mode 100644 index 0000000..638fcc5 --- /dev/null +++ b/framework/fields/fieldset/fieldset.php @@ -0,0 +1,41 @@ +field_before(); + + echo '
        '; + + foreach ( $this->field['fields'] as $field ) { + + $field_id = ( isset( $field['id'] ) ) ? $field['id'] : ''; + $field_default = ( isset( $field['default'] ) ) ? $field['default'] : ''; + $field_value = ( isset( $this->value[$field_id] ) ) ? $this->value[$field_id] : $field_default; + $unique_id = ( ! empty( $this->unique ) ) ? $this->unique .'['. $this->field['id'] .']' : $this->field['id']; + + WP_CHINA_YES::field( $field, $field_value, $unique_id, 'field/fieldset' ); + + } + + echo '
        '; + + echo $this->field_after(); + + } + + } +} diff --git a/framework/fields/gallery/gallery.php b/framework/fields/gallery/gallery.php new file mode 100644 index 0000000..cb62c6f --- /dev/null +++ b/framework/fields/gallery/gallery.php @@ -0,0 +1,52 @@ +field, array( + 'add_title' => esc_html__( 'Add Gallery', 'wp_china_yes' ), + 'edit_title' => esc_html__( 'Edit Gallery', 'wp_china_yes' ), + 'clear_title' => esc_html__( 'Clear', 'wp_china_yes' ), + ) ); + + $hidden = ( empty( $this->value ) ) ? ' hidden' : ''; + + echo $this->field_before(); + + echo '
          '; + if ( ! empty( $this->value ) ) { + + $values = explode( ',', $this->value ); + + foreach ( $values as $id ) { + $attachment = wp_get_attachment_image_src( $id, 'thumbnail' ); + echo '
        • '; + } + + } + echo '
        '; + + echo ''. $args['add_title'] .''; + echo ''. $args['edit_title'] .''; + echo ''. $args['clear_title'] .''; + echo 'field_attributes() .'/>'; + + echo $this->field_after(); + + } + + } +} diff --git a/framework/fields/group/group.php b/framework/fields/group/group.php new file mode 100644 index 0000000..6d06c34 --- /dev/null +++ b/framework/fields/group/group.php @@ -0,0 +1,164 @@ +field, array( + 'max' => 0, + 'min' => 0, + 'fields' => array(), + 'button_title' => esc_html__( 'Add New', 'wp_china_yes' ), + 'accordion_title_prefix' => '', + 'accordion_title_number' => false, + 'accordion_title_auto' => true, + 'accordion_title_by' => array(), + 'accordion_title_by_prefix' => ' ', + ) ); + + $title_prefix = ( ! empty( $args['accordion_title_prefix'] ) ) ? $args['accordion_title_prefix'] : ''; + $title_number = ( ! empty( $args['accordion_title_number'] ) ) ? true : false; + $title_auto = ( ! empty( $args['accordion_title_auto'] ) ) ? true : false; + $title_first = ( isset( $this->field['fields'][0]['id'] ) ) ? $this->field['fields'][0]['id'] : $this->field['fields'][1]['id']; + $title_by = ( is_array( $args['accordion_title_by'] ) ) ? $args['accordion_title_by'] : (array) $args['accordion_title_by']; + $title_by = ( empty( $title_by ) ) ? array( $title_first ) : $title_by; + $title_by_prefix = ( ! empty( $args['accordion_title_by_prefix'] ) ) ? $args['accordion_title_by_prefix'] : ''; + + if ( preg_match( '/'. preg_quote( '['. $this->field['id'] .']' ) .'/', $this->unique ) ) { + + echo '
        '. esc_html__( 'Error: Field ID conflict.', 'wp_china_yes' ) .'
        '; + + } else { + + echo $this->field_before(); + + echo '
        '; + + echo '
        '; + echo ''; + echo ''; + echo ''; + echo '
        '; + + echo '

        '; + echo ''; + echo ( $title_number ) ? '' : ''; + echo ( $title_prefix ) ? ''. esc_attr( $title_prefix ) .'' : ''; + echo ( $title_auto ) ? '' : ''; + echo ''; + echo '

        '; + + echo '
        '; + foreach ( $this->field['fields'] as $field ) { + + $field_default = ( isset( $field['default'] ) ) ? $field['default'] : ''; + $field_unique = ( ! empty( $this->unique ) ) ? $this->unique .'['. $this->field['id'] .'][0]' : $this->field['id'] .'[0]'; + + WP_CHINA_YES::field( $field, $field_default, '___'. $field_unique, 'field/group' ); + + } + echo '
        '; + + echo '
        '; + + echo '
        '; + + if ( ! empty( $this->value ) ) { + + $num = 0; + + foreach ( $this->value as $value ) { + + $title = ''; + + if ( ! empty( $title_by ) ) { + + $titles = array(); + + foreach ( $title_by as $title_key ) { + if ( isset( $value[ $title_key ] ) ) { + $titles[] = $value[ $title_key ]; + } + } + + $title = join( $title_by_prefix, $titles ); + + } + + $title = ( is_array( $title ) ) ? reset( $title ) : $title; + + echo '
        '; + + echo '
        '; + echo ''; + echo ''; + echo ''; + echo '
        '; + + echo '

        '; + echo ''; + echo ( $title_number ) ? ''. esc_attr( $num+1 ) .'.' : ''; + echo ( $title_prefix ) ? ''. esc_attr( $title_prefix ) .'' : ''; + echo ( $title_auto ) ? '' . esc_attr( $title ) .'' : ''; + echo ''; + echo '

        '; + + echo '
        '; + + foreach ( $this->field['fields'] as $field ) { + + $field_unique = ( ! empty( $this->unique ) ) ? $this->unique .'['. $this->field['id'] .']['. $num .']' : $this->field['id'] .'['. $num .']'; + $field_value = ( isset( $field['id'] ) && isset( $value[$field['id']] ) ) ? $value[$field['id']] : ''; + + WP_CHINA_YES::field( $field, $field_value, $field_unique, 'field/group' ); + + } + + echo '
        '; + + echo '
        '; + + $num++; + + } + + } + + echo '
        '; + + echo '
        '. esc_html__( 'You cannot add more.', 'wp_china_yes' ) .'
        '; + echo '
        '. esc_html__( 'You cannot remove more.', 'wp_china_yes' ) .'
        '; + echo ''. $args['button_title'] .''; + + echo $this->field_after(); + + } + + } + + public function enqueue() { + + if ( ! wp_script_is( 'jquery-ui-accordion' ) ) { + wp_enqueue_script( 'jquery-ui-accordion' ); + } + + if ( ! wp_script_is( 'jquery-ui-sortable' ) ) { + wp_enqueue_script( 'jquery-ui-sortable' ); + } + + } + + } +} diff --git a/framework/fields/heading/heading.php b/framework/fields/heading/heading.php new file mode 100644 index 0000000..aff7e32 --- /dev/null +++ b/framework/fields/heading/heading.php @@ -0,0 +1,24 @@ +field['content'] ) ) ? $this->field['content'] : ''; + + } + + } +} diff --git a/framework/fields/icon/fa4-icons.php b/framework/fields/icon/fa4-icons.php new file mode 100644 index 0000000..c064689 --- /dev/null +++ b/framework/fields/icon/fa4-icons.php @@ -0,0 +1,12 @@ + 'Font Awesome', + 'icons' => array( 'fa fa-glass','fa fa-music','fa fa-search','fa fa-envelope-o','fa fa-heart','fa fa-star','fa fa-star-o','fa fa-user','fa fa-film','fa fa-th-large','fa fa-th','fa fa-th-list','fa fa-check','fa fa-times','fa fa-search-plus','fa fa-search-minus','fa fa-power-off','fa fa-signal','fa fa-cog','fa fa-trash-o','fa fa-home','fa fa-file-o','fa fa-clock-o','fa fa-road','fa fa-download','fa fa-arrow-circle-o-down','fa fa-arrow-circle-o-up','fa fa-inbox','fa fa-play-circle-o','fa fa-repeat','fa fa-refresh','fa fa-list-alt','fa fa-lock','fa fa-flag','fa fa-headphones','fa fa-volume-off','fa fa-volume-down','fa fa-volume-up','fa fa-qrcode','fa fa-barcode','fa fa-tag','fa fa-tags','fa fa-book','fa fa-bookmark','fa fa-print','fa fa-camera','fa fa-font','fa fa-bold','fa fa-italic','fa fa-text-height','fa fa-text-width','fa fa-align-left','fa fa-align-center','fa fa-align-right','fa fa-align-justify','fa fa-list','fa fa-outdent','fa fa-indent','fa fa-video-camera','fa fa-picture-o','fa fa-pencil','fa fa-map-marker','fa fa-adjust','fa fa-tint','fa fa-pencil-square-o','fa fa-share-square-o','fa fa-check-square-o','fa fa-arrows','fa fa-step-backward','fa fa-fast-backward','fa fa-backward','fa fa-play','fa fa-pause','fa fa-stop','fa fa-forward','fa fa-fast-forward','fa fa-step-forward','fa fa-eject','fa fa-chevron-left','fa fa-chevron-right','fa fa-plus-circle','fa fa-minus-circle','fa fa-times-circle','fa fa-check-circle','fa fa-question-circle','fa fa-info-circle','fa fa-crosshairs','fa fa-times-circle-o','fa fa-check-circle-o','fa fa-ban','fa fa-arrow-left','fa fa-arrow-right','fa fa-arrow-up','fa fa-arrow-down','fa fa-share','fa fa-expand','fa fa-compress','fa fa-plus','fa fa-minus','fa fa-asterisk','fa fa-exclamation-circle','fa fa-gift','fa fa-leaf','fa fa-fire','fa fa-eye','fa fa-eye-slash','fa fa-exclamation-triangle','fa fa-plane','fa fa-calendar','fa fa-random','fa fa-comment','fa fa-magnet','fa fa-chevron-up','fa fa-chevron-down','fa fa-retweet','fa fa-shopping-cart','fa fa-folder','fa fa-folder-open','fa fa-arrows-v','fa fa-arrows-h','fa fa-bar-chart','fa fa-twitter-square','fa fa-facebook-square','fa fa-camera-retro','fa fa-key','fa fa-cogs','fa fa-comments','fa fa-thumbs-o-up','fa fa-thumbs-o-down','fa fa-star-half','fa fa-heart-o','fa fa-sign-out','fa fa-linkedin-square','fa fa-thumb-tack','fa fa-external-link','fa fa-sign-in','fa fa-trophy','fa fa-github-square','fa fa-upload','fa fa-lemon-o','fa fa-phone','fa fa-square-o','fa fa-bookmark-o','fa fa-phone-square','fa fa-twitter','fa fa-facebook','fa fa-github','fa fa-unlock','fa fa-credit-card','fa fa-rss','fa fa-hdd-o','fa fa-bullhorn','fa fa-bell','fa fa-certificate','fa fa-hand-o-right','fa fa-hand-o-left','fa fa-hand-o-up','fa fa-hand-o-down','fa fa-arrow-circle-left','fa fa-arrow-circle-right','fa fa-arrow-circle-up','fa fa-arrow-circle-down','fa fa-globe','fa fa-wrench','fa fa-tasks','fa fa-filter','fa fa-briefcase','fa fa-arrows-alt','fa fa-users','fa fa-link','fa fa-cloud','fa fa-flask','fa fa-scissors','fa fa-files-o','fa fa-paperclip','fa fa-floppy-o','fa fa-square','fa fa-bars','fa fa-list-ul','fa fa-list-ol','fa fa-strikethrough','fa fa-underline','fa fa-table','fa fa-magic','fa fa-truck','fa fa-pinterest','fa fa-pinterest-square','fa fa-google-plus-square','fa fa-google-plus','fa fa-money','fa fa-caret-down','fa fa-caret-up','fa fa-caret-left','fa fa-caret-right','fa fa-columns','fa fa-sort','fa fa-sort-desc','fa fa-sort-asc','fa fa-envelope','fa fa-linkedin','fa fa-undo','fa fa-gavel','fa fa-tachometer','fa fa-comment-o','fa fa-comments-o','fa fa-bolt','fa fa-sitemap','fa fa-umbrella','fa fa-clipboard','fa fa-lightbulb-o','fa fa-exchange','fa fa-cloud-download','fa fa-cloud-upload','fa fa-user-md','fa fa-stethoscope','fa fa-suitcase','fa fa-bell-o','fa fa-coffee','fa fa-cutlery','fa fa-file-text-o','fa fa-building-o','fa fa-hospital-o','fa fa-ambulance','fa fa-medkit','fa fa-fighter-jet','fa fa-beer','fa fa-h-square','fa fa-plus-square','fa fa-angle-double-left','fa fa-angle-double-right','fa fa-angle-double-up','fa fa-angle-double-down','fa fa-angle-left','fa fa-angle-right','fa fa-angle-up','fa fa-angle-down','fa fa-desktop','fa fa-laptop','fa fa-tablet','fa fa-mobile','fa fa-circle-o','fa fa-quote-left','fa fa-quote-right','fa fa-spinner','fa fa-circle','fa fa-reply','fa fa-github-alt','fa fa-folder-o','fa fa-folder-open-o','fa fa-smile-o','fa fa-frown-o','fa fa-meh-o','fa fa-gamepad','fa fa-keyboard-o','fa fa-flag-o','fa fa-flag-checkered','fa fa-terminal','fa fa-code','fa fa-reply-all','fa fa-star-half-o','fa fa-location-arrow','fa fa-crop','fa fa-code-fork','fa fa-chain-broken','fa fa-question','fa fa-info','fa fa-exclamation','fa fa-superscript','fa fa-subscript','fa fa-eraser','fa fa-puzzle-piece','fa fa-microphone','fa fa-microphone-slash','fa fa-shield','fa fa-calendar-o','fa fa-fire-extinguisher','fa fa-rocket','fa fa-maxcdn','fa fa-chevron-circle-left','fa fa-chevron-circle-right','fa fa-chevron-circle-up','fa fa-chevron-circle-down','fa fa-html5','fa fa-css3','fa fa-anchor','fa fa-unlock-alt','fa fa-bullseye','fa fa-ellipsis-h','fa fa-ellipsis-v','fa fa-rss-square','fa fa-play-circle','fa fa-ticket','fa fa-minus-square','fa fa-minus-square-o','fa fa-level-up','fa fa-level-down','fa fa-check-square','fa fa-pencil-square','fa fa-external-link-square','fa fa-share-square','fa fa-compass','fa fa-caret-square-o-down','fa fa-caret-square-o-up','fa fa-caret-square-o-right','fa fa-eur','fa fa-gbp','fa fa-usd','fa fa-inr','fa fa-jpy','fa fa-rub','fa fa-krw','fa fa-btc','fa fa-file','fa fa-file-text','fa fa-sort-alpha-asc','fa fa-sort-alpha-desc','fa fa-sort-amount-asc','fa fa-sort-amount-desc','fa fa-sort-numeric-asc','fa fa-sort-numeric-desc','fa fa-thumbs-up','fa fa-thumbs-down','fa fa-youtube-square','fa fa-youtube','fa fa-xing','fa fa-xing-square','fa fa-youtube-play','fa fa-dropbox','fa fa-stack-overflow','fa fa-instagram','fa fa-flickr','fa fa-adn','fa fa-bitbucket','fa fa-bitbucket-square','fa fa-tumblr','fa fa-tumblr-square','fa fa-long-arrow-down','fa fa-long-arrow-up','fa fa-long-arrow-left','fa fa-long-arrow-right','fa fa-apple','fa fa-windows','fa fa-android','fa fa-linux','fa fa-dribbble','fa fa-skype','fa fa-foursquare','fa fa-trello','fa fa-female','fa fa-male','fa fa-gratipay','fa fa-sun-o','fa fa-moon-o','fa fa-archive','fa fa-bug','fa fa-vk','fa fa-weibo','fa fa-renren','fa fa-pagelines','fa fa-stack-exchange','fa fa-arrow-circle-o-right','fa fa-arrow-circle-o-left','fa fa-caret-square-o-left','fa fa-dot-circle-o','fa fa-wheelchair','fa fa-vimeo-square','fa fa-try','fa fa-plus-square-o','fa fa-space-shuttle','fa fa-slack','fa fa-envelope-square','fa fa-wordpress','fa fa-openid','fa fa-university','fa fa-graduation-cap','fa fa-yahoo','fa fa-google','fa fa-reddit','fa fa-reddit-square','fa fa-stumbleupon-circle','fa fa-stumbleupon','fa fa-delicious','fa fa-digg','fa fa-pied-piper-pp','fa fa-pied-piper-alt','fa fa-drupal','fa fa-joomla','fa fa-language','fa fa-fax','fa fa-building','fa fa-child','fa fa-paw','fa fa-spoon','fa fa-cube','fa fa-cubes','fa fa-behance','fa fa-behance-square','fa fa-steam','fa fa-steam-square','fa fa-recycle','fa fa-car','fa fa-taxi','fa fa-tree','fa fa-spotify','fa fa-deviantart','fa fa-soundcloud','fa fa-database','fa fa-file-pdf-o','fa fa-file-word-o','fa fa-file-excel-o','fa fa-file-powerpoint-o','fa fa-file-image-o','fa fa-file-archive-o','fa fa-file-audio-o','fa fa-file-video-o','fa fa-file-code-o','fa fa-vine','fa fa-codepen','fa fa-jsfiddle','fa fa-life-ring','fa fa-circle-o-notch','fa fa-rebel','fa fa-empire','fa fa-git-square','fa fa-git','fa fa-hacker-news','fa fa-tencent-weibo','fa fa-qq','fa fa-weixin','fa fa-paper-plane','fa fa-paper-plane-o','fa fa-history','fa fa-circle-thin','fa fa-header','fa fa-paragraph','fa fa-sliders','fa fa-share-alt','fa fa-share-alt-square','fa fa-bomb','fa fa-futbol-o','fa fa-tty','fa fa-binoculars','fa fa-plug','fa fa-slideshare','fa fa-twitch','fa fa-yelp','fa fa-newspaper-o','fa fa-wifi','fa fa-calculator','fa fa-paypal','fa fa-google-wallet','fa fa-cc-visa','fa fa-cc-mastercard','fa fa-cc-discover','fa fa-cc-amex','fa fa-cc-paypal','fa fa-cc-stripe','fa fa-bell-slash','fa fa-bell-slash-o','fa fa-trash','fa fa-copyright','fa fa-at','fa fa-eyedropper','fa fa-paint-brush','fa fa-birthday-cake','fa fa-area-chart','fa fa-pie-chart','fa fa-line-chart','fa fa-lastfm','fa fa-lastfm-square','fa fa-toggle-off','fa fa-toggle-on','fa fa-bicycle','fa fa-bus','fa fa-ioxhost','fa fa-angellist','fa fa-cc','fa fa-ils','fa fa-meanpath','fa fa-buysellads','fa fa-connectdevelop','fa fa-dashcube','fa fa-forumbee','fa fa-leanpub','fa fa-sellsy','fa fa-shirtsinbulk','fa fa-simplybuilt','fa fa-skyatlas','fa fa-cart-plus','fa fa-cart-arrow-down','fa fa-diamond','fa fa-ship','fa fa-user-secret','fa fa-motorcycle','fa fa-street-view','fa fa-heartbeat','fa fa-venus','fa fa-mars','fa fa-mercury','fa fa-transgender','fa fa-transgender-alt','fa fa-venus-double','fa fa-mars-double','fa fa-venus-mars','fa fa-mars-stroke','fa fa-mars-stroke-v','fa fa-mars-stroke-h','fa fa-neuter','fa fa-genderless','fa fa-facebook-official','fa fa-pinterest-p','fa fa-whatsapp','fa fa-server','fa fa-user-plus','fa fa-user-times','fa fa-bed','fa fa-viacoin','fa fa-train','fa fa-subway','fa fa-medium','fa fa-y-combinator','fa fa-optin-monster','fa fa-opencart','fa fa-expeditedssl','fa fa-battery-full','fa fa-battery-three-quarters','fa fa-battery-half','fa fa-battery-quarter','fa fa-battery-empty','fa fa-mouse-pointer','fa fa-i-cursor','fa fa-object-group','fa fa-object-ungroup','fa fa-sticky-note','fa fa-sticky-note-o','fa fa-cc-jcb','fa fa-cc-diners-club','fa fa-clone','fa fa-balance-scale','fa fa-hourglass-o','fa fa-hourglass-start','fa fa-hourglass-half','fa fa-hourglass-end','fa fa-hourglass','fa fa-hand-rock-o','fa fa-hand-paper-o','fa fa-hand-scissors-o','fa fa-hand-lizard-o','fa fa-hand-spock-o','fa fa-hand-pointer-o','fa fa-hand-peace-o','fa fa-trademark','fa fa-registered','fa fa-creative-commons','fa fa-gg','fa fa-gg-circle','fa fa-tripadvisor','fa fa-odnoklassniki','fa fa-odnoklassniki-square','fa fa-get-pocket','fa fa-wikipedia-w','fa fa-safari','fa fa-chrome','fa fa-firefox','fa fa-opera','fa fa-internet-explorer','fa fa-television','fa fa-contao','fa fa-500px','fa fa-amazon','fa fa-calendar-plus-o','fa fa-calendar-minus-o','fa fa-calendar-times-o','fa fa-calendar-check-o','fa fa-industry','fa fa-map-pin','fa fa-map-signs','fa fa-map-o','fa fa-map','fa fa-commenting','fa fa-commenting-o','fa fa-houzz','fa fa-vimeo','fa fa-black-tie','fa fa-fonticons','fa fa-reddit-alien','fa fa-edge','fa fa-credit-card-alt','fa fa-codiepie','fa fa-modx','fa fa-fort-awesome','fa fa-usb','fa fa-product-hunt','fa fa-mixcloud','fa fa-scribd','fa fa-pause-circle','fa fa-pause-circle-o','fa fa-stop-circle','fa fa-stop-circle-o','fa fa-shopping-bag','fa fa-shopping-basket','fa fa-hashtag','fa fa-bluetooth','fa fa-bluetooth-b','fa fa-percent','fa fa-gitlab','fa fa-wpbeginner','fa fa-wpforms','fa fa-envira','fa fa-universal-access','fa fa-wheelchair-alt','fa fa-question-circle-o','fa fa-blind','fa fa-audio-description','fa fa-volume-control-phone','fa fa-braille','fa fa-assistive-listening-systems','fa fa-american-sign-language-interpreting','fa fa-deaf','fa fa-glide','fa fa-glide-g','fa fa-sign-language','fa fa-low-vision','fa fa-viadeo','fa fa-viadeo-square','fa fa-snapchat','fa fa-snapchat-ghost','fa fa-snapchat-square','fa fa-pied-piper','fa fa-first-order','fa fa-yoast','fa fa-themeisle','fa fa-google-plus-official','fa fa-font-awesome','fa fa-handshake-o','fa fa-envelope-open','fa fa-envelope-open-o','fa fa-linode','fa fa-address-book','fa fa-address-book-o','fa fa-address-card','fa fa-address-card-o','fa fa-user-circle','fa fa-user-circle-o','fa fa-user-o','fa fa-id-badge','fa fa-id-card','fa fa-id-card-o','fa fa-quora','fa fa-free-code-camp','fa fa-telegram','fa fa-thermometer-full','fa fa-thermometer-three-quarters','fa fa-thermometer-half','fa fa-thermometer-quarter','fa fa-thermometer-empty','fa fa-shower','fa fa-bath','fa fa-podcast','fa fa-window-maximize','fa fa-window-minimize','fa fa-window-restore','fa fa-window-close','fa fa-window-close-o','fa fa-bandcamp','fa fa-grav','fa fa-etsy','fa fa-imdb','fa fa-ravelry','fa fa-eercast','fa fa-microchip','fa fa-snowflake-o','fa fa-superpowers','fa fa-wpexplorer','fa fa-meetup' ) + ) ); + } +} diff --git a/framework/fields/icon/fa5-icons.php b/framework/fields/icon/fa5-icons.php new file mode 100644 index 0000000..e2479b1 --- /dev/null +++ b/framework/fields/icon/fa5-icons.php @@ -0,0 +1,12 @@ + 'Font Awesome 5 Free', + 'icons' => array( 'fab fa-500px','fab fa-accessible-icon','fab fa-accusoft','fab fa-acquisitions-incorporated','fas fa-ad','fas fa-address-book','far fa-address-book','fas fa-address-card','far fa-address-card','fas fa-adjust','fab fa-adn','fab fa-adversal','fab fa-affiliatetheme','fas fa-air-freshener','fab fa-airbnb','fab fa-algolia','fas fa-align-center','fas fa-align-justify','fas fa-align-left','fas fa-align-right','fab fa-alipay','fas fa-allergies','fab fa-amazon','fab fa-amazon-pay','fas fa-ambulance','fas fa-american-sign-language-interpreting','fab fa-amilia','fas fa-anchor','fab fa-android','fab fa-angellist','fas fa-angle-double-down','fas fa-angle-double-left','fas fa-angle-double-right','fas fa-angle-double-up','fas fa-angle-down','fas fa-angle-left','fas fa-angle-right','fas fa-angle-up','fas fa-angry','far fa-angry','fab fa-angrycreative','fab fa-angular','fas fa-ankh','fab fa-app-store','fab fa-app-store-ios','fab fa-apper','fab fa-apple','fas fa-apple-alt','fab fa-apple-pay','fas fa-archive','fas fa-archway','fas fa-arrow-alt-circle-down','far fa-arrow-alt-circle-down','fas fa-arrow-alt-circle-left','far fa-arrow-alt-circle-left','fas fa-arrow-alt-circle-right','far fa-arrow-alt-circle-right','fas fa-arrow-alt-circle-up','far fa-arrow-alt-circle-up','fas fa-arrow-circle-down','fas fa-arrow-circle-left','fas fa-arrow-circle-right','fas fa-arrow-circle-up','fas fa-arrow-down','fas fa-arrow-left','fas fa-arrow-right','fas fa-arrow-up','fas fa-arrows-alt','fas fa-arrows-alt-h','fas fa-arrows-alt-v','fab fa-artstation','fas fa-assistive-listening-systems','fas fa-asterisk','fab fa-asymmetrik','fas fa-at','fas fa-atlas','fab fa-atlassian','fas fa-atom','fab fa-audible','fas fa-audio-description','fab fa-autoprefixer','fab fa-avianex','fab fa-aviato','fas fa-award','fab fa-aws','fas fa-baby','fas fa-baby-carriage','fas fa-backspace','fas fa-backward','fas fa-bacon','fas fa-bacteria','fas fa-bacterium','fas fa-bahai','fas fa-balance-scale','fas fa-balance-scale-left','fas fa-balance-scale-right','fas fa-ban','fas fa-band-aid','fab fa-bandcamp','fas fa-barcode','fas fa-bars','fas fa-baseball-ball','fas fa-basketball-ball','fas fa-bath','fas fa-battery-empty','fas fa-battery-full','fas fa-battery-half','fas fa-battery-quarter','fas fa-battery-three-quarters','fab fa-battle-net','fas fa-bed','fas fa-beer','fab fa-behance','fab fa-behance-square','fas fa-bell','far fa-bell','fas fa-bell-slash','far fa-bell-slash','fas fa-bezier-curve','fas fa-bible','fas fa-bicycle','fas fa-biking','fab fa-bimobject','fas fa-binoculars','fas fa-biohazard','fas fa-birthday-cake','fab fa-bitbucket','fab fa-bitcoin','fab fa-bity','fab fa-black-tie','fab fa-blackberry','fas fa-blender','fas fa-blender-phone','fas fa-blind','fas fa-blog','fab fa-blogger','fab fa-blogger-b','fab fa-bluetooth','fab fa-bluetooth-b','fas fa-bold','fas fa-bolt','fas fa-bomb','fas fa-bone','fas fa-bong','fas fa-book','fas fa-book-dead','fas fa-book-medical','fas fa-book-open','fas fa-book-reader','fas fa-bookmark','far fa-bookmark','fab fa-bootstrap','fas fa-border-all','fas fa-border-none','fas fa-border-style','fas fa-bowling-ball','fas fa-box','fas fa-box-open','fas fa-box-tissue','fas fa-boxes','fas fa-braille','fas fa-brain','fas fa-bread-slice','fas fa-briefcase','fas fa-briefcase-medical','fas fa-broadcast-tower','fas fa-broom','fas fa-brush','fab fa-btc','fab fa-buffer','fas fa-bug','fas fa-building','far fa-building','fas fa-bullhorn','fas fa-bullseye','fas fa-burn','fab fa-buromobelexperte','fas fa-bus','fas fa-bus-alt','fas fa-business-time','fab fa-buy-n-large','fab fa-buysellads','fas fa-calculator','fas fa-calendar','far fa-calendar','fas fa-calendar-alt','far fa-calendar-alt','fas fa-calendar-check','far fa-calendar-check','fas fa-calendar-day','fas fa-calendar-minus','far fa-calendar-minus','fas fa-calendar-plus','far fa-calendar-plus','fas fa-calendar-times','far fa-calendar-times','fas fa-calendar-week','fas fa-camera','fas fa-camera-retro','fas fa-campground','fab fa-canadian-maple-leaf','fas fa-candy-cane','fas fa-cannabis','fas fa-capsules','fas fa-car','fas fa-car-alt','fas fa-car-battery','fas fa-car-crash','fas fa-car-side','fas fa-caravan','fas fa-caret-down','fas fa-caret-left','fas fa-caret-right','fas fa-caret-square-down','far fa-caret-square-down','fas fa-caret-square-left','far fa-caret-square-left','fas fa-caret-square-right','far fa-caret-square-right','fas fa-caret-square-up','far fa-caret-square-up','fas fa-caret-up','fas fa-carrot','fas fa-cart-arrow-down','fas fa-cart-plus','fas fa-cash-register','fas fa-cat','fab fa-cc-amazon-pay','fab fa-cc-amex','fab fa-cc-apple-pay','fab fa-cc-diners-club','fab fa-cc-discover','fab fa-cc-jcb','fab fa-cc-mastercard','fab fa-cc-paypal','fab fa-cc-stripe','fab fa-cc-visa','fab fa-centercode','fab fa-centos','fas fa-certificate','fas fa-chair','fas fa-chalkboard','fas fa-chalkboard-teacher','fas fa-charging-station','fas fa-chart-area','fas fa-chart-bar','far fa-chart-bar','fas fa-chart-line','fas fa-chart-pie','fas fa-check','fas fa-check-circle','far fa-check-circle','fas fa-check-double','fas fa-check-square','far fa-check-square','fas fa-cheese','fas fa-chess','fas fa-chess-bishop','fas fa-chess-board','fas fa-chess-king','fas fa-chess-knight','fas fa-chess-pawn','fas fa-chess-queen','fas fa-chess-rook','fas fa-chevron-circle-down','fas fa-chevron-circle-left','fas fa-chevron-circle-right','fas fa-chevron-circle-up','fas fa-chevron-down','fas fa-chevron-left','fas fa-chevron-right','fas fa-chevron-up','fas fa-child','fab fa-chrome','fab fa-chromecast','fas fa-church','fas fa-circle','far fa-circle','fas fa-circle-notch','fas fa-city','fas fa-clinic-medical','fas fa-clipboard','far fa-clipboard','fas fa-clipboard-check','fas fa-clipboard-list','fas fa-clock','far fa-clock','fas fa-clone','far fa-clone','fas fa-closed-captioning','far fa-closed-captioning','fas fa-cloud','fas fa-cloud-download-alt','fas fa-cloud-meatball','fas fa-cloud-moon','fas fa-cloud-moon-rain','fas fa-cloud-rain','fas fa-cloud-showers-heavy','fas fa-cloud-sun','fas fa-cloud-sun-rain','fas fa-cloud-upload-alt','fab fa-cloudflare','fab fa-cloudscale','fab fa-cloudsmith','fab fa-cloudversify','fas fa-cocktail','fas fa-code','fas fa-code-branch','fab fa-codepen','fab fa-codiepie','fas fa-coffee','fas fa-cog','fas fa-cogs','fas fa-coins','fas fa-columns','fas fa-comment','far fa-comment','fas fa-comment-alt','far fa-comment-alt','fas fa-comment-dollar','fas fa-comment-dots','far fa-comment-dots','fas fa-comment-medical','fas fa-comment-slash','fas fa-comments','far fa-comments','fas fa-comments-dollar','fas fa-compact-disc','fas fa-compass','far fa-compass','fas fa-compress','fas fa-compress-alt','fas fa-compress-arrows-alt','fas fa-concierge-bell','fab fa-confluence','fab fa-connectdevelop','fab fa-contao','fas fa-cookie','fas fa-cookie-bite','fas fa-copy','far fa-copy','fas fa-copyright','far fa-copyright','fab fa-cotton-bureau','fas fa-couch','fab fa-cpanel','fab fa-creative-commons','fab fa-creative-commons-by','fab fa-creative-commons-nc','fab fa-creative-commons-nc-eu','fab fa-creative-commons-nc-jp','fab fa-creative-commons-nd','fab fa-creative-commons-pd','fab fa-creative-commons-pd-alt','fab fa-creative-commons-remix','fab fa-creative-commons-sa','fab fa-creative-commons-sampling','fab fa-creative-commons-sampling-plus','fab fa-creative-commons-share','fab fa-creative-commons-zero','fas fa-credit-card','far fa-credit-card','fab fa-critical-role','fas fa-crop','fas fa-crop-alt','fas fa-cross','fas fa-crosshairs','fas fa-crow','fas fa-crown','fas fa-crutch','fab fa-css3','fab fa-css3-alt','fas fa-cube','fas fa-cubes','fas fa-cut','fab fa-cuttlefish','fab fa-d-and-d','fab fa-d-and-d-beyond','fab fa-dailymotion','fab fa-dashcube','fas fa-database','fas fa-deaf','fab fa-deezer','fab fa-delicious','fas fa-democrat','fab fa-deploydog','fab fa-deskpro','fas fa-desktop','fab fa-dev','fab fa-deviantart','fas fa-dharmachakra','fab fa-dhl','fas fa-diagnoses','fab fa-diaspora','fas fa-dice','fas fa-dice-d20','fas fa-dice-d6','fas fa-dice-five','fas fa-dice-four','fas fa-dice-one','fas fa-dice-six','fas fa-dice-three','fas fa-dice-two','fab fa-digg','fab fa-digital-ocean','fas fa-digital-tachograph','fas fa-directions','fab fa-discord','fab fa-discourse','fas fa-disease','fas fa-divide','fas fa-dizzy','far fa-dizzy','fas fa-dna','fab fa-dochub','fab fa-docker','fas fa-dog','fas fa-dollar-sign','fas fa-dolly','fas fa-dolly-flatbed','fas fa-donate','fas fa-door-closed','fas fa-door-open','fas fa-dot-circle','far fa-dot-circle','fas fa-dove','fas fa-download','fab fa-draft2digital','fas fa-drafting-compass','fas fa-dragon','fas fa-draw-polygon','fab fa-dribbble','fab fa-dribbble-square','fab fa-dropbox','fas fa-drum','fas fa-drum-steelpan','fas fa-drumstick-bite','fab fa-drupal','fas fa-dumbbell','fas fa-dumpster','fas fa-dumpster-fire','fas fa-dungeon','fab fa-dyalog','fab fa-earlybirds','fab fa-ebay','fab fa-edge','fab fa-edge-legacy','fas fa-edit','far fa-edit','fas fa-egg','fas fa-eject','fab fa-elementor','fas fa-ellipsis-h','fas fa-ellipsis-v','fab fa-ello','fab fa-ember','fab fa-empire','fas fa-envelope','far fa-envelope','fas fa-envelope-open','far fa-envelope-open','fas fa-envelope-open-text','fas fa-envelope-square','fab fa-envira','fas fa-equals','fas fa-eraser','fab fa-erlang','fab fa-ethereum','fas fa-ethernet','fab fa-etsy','fas fa-euro-sign','fab fa-evernote','fas fa-exchange-alt','fas fa-exclamation','fas fa-exclamation-circle','fas fa-exclamation-triangle','fas fa-expand','fas fa-expand-alt','fas fa-expand-arrows-alt','fab fa-expeditedssl','fas fa-external-link-alt','fas fa-external-link-square-alt','fas fa-eye','far fa-eye','fas fa-eye-dropper','fas fa-eye-slash','far fa-eye-slash','fab fa-facebook','fab fa-facebook-f','fab fa-facebook-messenger','fab fa-facebook-square','fas fa-fan','fab fa-fantasy-flight-games','fas fa-fast-backward','fas fa-fast-forward','fas fa-faucet','fas fa-fax','fas fa-feather','fas fa-feather-alt','fab fa-fedex','fab fa-fedora','fas fa-female','fas fa-fighter-jet','fab fa-figma','fas fa-file','far fa-file','fas fa-file-alt','far fa-file-alt','fas fa-file-archive','far fa-file-archive','fas fa-file-audio','far fa-file-audio','fas fa-file-code','far fa-file-code','fas fa-file-contract','fas fa-file-csv','fas fa-file-download','fas fa-file-excel','far fa-file-excel','fas fa-file-export','fas fa-file-image','far fa-file-image','fas fa-file-import','fas fa-file-invoice','fas fa-file-invoice-dollar','fas fa-file-medical','fas fa-file-medical-alt','fas fa-file-pdf','far fa-file-pdf','fas fa-file-powerpoint','far fa-file-powerpoint','fas fa-file-prescription','fas fa-file-signature','fas fa-file-upload','fas fa-file-video','far fa-file-video','fas fa-file-word','far fa-file-word','fas fa-fill','fas fa-fill-drip','fas fa-film','fas fa-filter','fas fa-fingerprint','fas fa-fire','fas fa-fire-alt','fas fa-fire-extinguisher','fab fa-firefox','fab fa-firefox-browser','fas fa-first-aid','fab fa-first-order','fab fa-first-order-alt','fab fa-firstdraft','fas fa-fish','fas fa-fist-raised','fas fa-flag','far fa-flag','fas fa-flag-checkered','fas fa-flag-usa','fas fa-flask','fab fa-flickr','fab fa-flipboard','fas fa-flushed','far fa-flushed','fab fa-fly','fas fa-folder','far fa-folder','fas fa-folder-minus','fas fa-folder-open','far fa-folder-open','fas fa-folder-plus','fas fa-font','fab fa-font-awesome','fab fa-font-awesome-alt','fab fa-font-awesome-flag','far fa-font-awesome-logo-full','fas fa-font-awesome-logo-full','fab fa-font-awesome-logo-full','fab fa-fonticons','fab fa-fonticons-fi','fas fa-football-ball','fab fa-fort-awesome','fab fa-fort-awesome-alt','fab fa-forumbee','fas fa-forward','fab fa-foursquare','fab fa-free-code-camp','fab fa-freebsd','fas fa-frog','fas fa-frown','far fa-frown','fas fa-frown-open','far fa-frown-open','fab fa-fulcrum','fas fa-funnel-dollar','fas fa-futbol','far fa-futbol','fab fa-galactic-republic','fab fa-galactic-senate','fas fa-gamepad','fas fa-gas-pump','fas fa-gavel','fas fa-gem','far fa-gem','fas fa-genderless','fab fa-get-pocket','fab fa-gg','fab fa-gg-circle','fas fa-ghost','fas fa-gift','fas fa-gifts','fab fa-git','fab fa-git-alt','fab fa-git-square','fab fa-github','fab fa-github-alt','fab fa-github-square','fab fa-gitkraken','fab fa-gitlab','fab fa-gitter','fas fa-glass-cheers','fas fa-glass-martini','fas fa-glass-martini-alt','fas fa-glass-whiskey','fas fa-glasses','fab fa-glide','fab fa-glide-g','fas fa-globe','fas fa-globe-africa','fas fa-globe-americas','fas fa-globe-asia','fas fa-globe-europe','fab fa-gofore','fas fa-golf-ball','fab fa-goodreads','fab fa-goodreads-g','fab fa-google','fab fa-google-drive','fab fa-google-pay','fab fa-google-play','fab fa-google-plus','fab fa-google-plus-g','fab fa-google-plus-square','fab fa-google-wallet','fas fa-gopuram','fas fa-graduation-cap','fab fa-gratipay','fab fa-grav','fas fa-greater-than','fas fa-greater-than-equal','fas fa-grimace','far fa-grimace','fas fa-grin','far fa-grin','fas fa-grin-alt','far fa-grin-alt','fas fa-grin-beam','far fa-grin-beam','fas fa-grin-beam-sweat','far fa-grin-beam-sweat','fas fa-grin-hearts','far fa-grin-hearts','fas fa-grin-squint','far fa-grin-squint','fas fa-grin-squint-tears','far fa-grin-squint-tears','fas fa-grin-stars','far fa-grin-stars','fas fa-grin-tears','far fa-grin-tears','fas fa-grin-tongue','far fa-grin-tongue','fas fa-grin-tongue-squint','far fa-grin-tongue-squint','fas fa-grin-tongue-wink','far fa-grin-tongue-wink','fas fa-grin-wink','far fa-grin-wink','fas fa-grip-horizontal','fas fa-grip-lines','fas fa-grip-lines-vertical','fas fa-grip-vertical','fab fa-gripfire','fab fa-grunt','fab fa-guilded','fas fa-guitar','fab fa-gulp','fas fa-h-square','fab fa-hacker-news','fab fa-hacker-news-square','fab fa-hackerrank','fas fa-hamburger','fas fa-hammer','fas fa-hamsa','fas fa-hand-holding','fas fa-hand-holding-heart','fas fa-hand-holding-medical','fas fa-hand-holding-usd','fas fa-hand-holding-water','fas fa-hand-lizard','far fa-hand-lizard','fas fa-hand-middle-finger','fas fa-hand-paper','far fa-hand-paper','fas fa-hand-peace','far fa-hand-peace','fas fa-hand-point-down','far fa-hand-point-down','fas fa-hand-point-left','far fa-hand-point-left','fas fa-hand-point-right','far fa-hand-point-right','fas fa-hand-point-up','far fa-hand-point-up','fas fa-hand-pointer','far fa-hand-pointer','fas fa-hand-rock','far fa-hand-rock','fas fa-hand-scissors','far fa-hand-scissors','fas fa-hand-sparkles','fas fa-hand-spock','far fa-hand-spock','fas fa-hands','fas fa-hands-helping','fas fa-hands-wash','fas fa-handshake','far fa-handshake','fas fa-handshake-alt-slash','fas fa-handshake-slash','fas fa-hanukiah','fas fa-hard-hat','fas fa-hashtag','fas fa-hat-cowboy','fas fa-hat-cowboy-side','fas fa-hat-wizard','fas fa-hdd','far fa-hdd','fas fa-head-side-cough','fas fa-head-side-cough-slash','fas fa-head-side-mask','fas fa-head-side-virus','fas fa-heading','fas fa-headphones','fas fa-headphones-alt','fas fa-headset','fas fa-heart','far fa-heart','fas fa-heart-broken','fas fa-heartbeat','fas fa-helicopter','fas fa-highlighter','fas fa-hiking','fas fa-hippo','fab fa-hips','fab fa-hire-a-helper','fas fa-history','fab fa-hive','fas fa-hockey-puck','fas fa-holly-berry','fas fa-home','fab fa-hooli','fab fa-hornbill','fas fa-horse','fas fa-horse-head','fas fa-hospital','far fa-hospital','fas fa-hospital-alt','fas fa-hospital-symbol','fas fa-hospital-user','fas fa-hot-tub','fas fa-hotdog','fas fa-hotel','fab fa-hotjar','fas fa-hourglass','far fa-hourglass','fas fa-hourglass-end','fas fa-hourglass-half','fas fa-hourglass-start','fas fa-house-damage','fas fa-house-user','fab fa-houzz','fas fa-hryvnia','fab fa-html5','fab fa-hubspot','fas fa-i-cursor','fas fa-ice-cream','fas fa-icicles','fas fa-icons','fas fa-id-badge','far fa-id-badge','fas fa-id-card','far fa-id-card','fas fa-id-card-alt','fab fa-ideal','fas fa-igloo','fas fa-image','far fa-image','fas fa-images','far fa-images','fab fa-imdb','fas fa-inbox','fas fa-indent','fas fa-industry','fas fa-infinity','fas fa-info','fas fa-info-circle','fab fa-innosoft','fab fa-instagram','fab fa-instagram-square','fab fa-instalod','fab fa-intercom','fab fa-internet-explorer','fab fa-invision','fab fa-ioxhost','fas fa-italic','fab fa-itch-io','fab fa-itunes','fab fa-itunes-note','fab fa-java','fas fa-jedi','fab fa-jedi-order','fab fa-jenkins','fab fa-jira','fab fa-joget','fas fa-joint','fab fa-joomla','fas fa-journal-whills','fab fa-js','fab fa-js-square','fab fa-jsfiddle','fas fa-kaaba','fab fa-kaggle','fas fa-key','fab fa-keybase','fas fa-keyboard','far fa-keyboard','fab fa-keycdn','fas fa-khanda','fab fa-kickstarter','fab fa-kickstarter-k','fas fa-kiss','far fa-kiss','fas fa-kiss-beam','far fa-kiss-beam','fas fa-kiss-wink-heart','far fa-kiss-wink-heart','fas fa-kiwi-bird','fab fa-korvue','fas fa-landmark','fas fa-language','fas fa-laptop','fas fa-laptop-code','fas fa-laptop-house','fas fa-laptop-medical','fab fa-laravel','fab fa-lastfm','fab fa-lastfm-square','fas fa-laugh','far fa-laugh','fas fa-laugh-beam','far fa-laugh-beam','fas fa-laugh-squint','far fa-laugh-squint','fas fa-laugh-wink','far fa-laugh-wink','fas fa-layer-group','fas fa-leaf','fab fa-leanpub','fas fa-lemon','far fa-lemon','fab fa-less','fas fa-less-than','fas fa-less-than-equal','fas fa-level-down-alt','fas fa-level-up-alt','fas fa-life-ring','far fa-life-ring','fas fa-lightbulb','far fa-lightbulb','fab fa-line','fas fa-link','fab fa-linkedin','fab fa-linkedin-in','fab fa-linode','fab fa-linux','fas fa-lira-sign','fas fa-list','fas fa-list-alt','far fa-list-alt','fas fa-list-ol','fas fa-list-ul','fas fa-location-arrow','fas fa-lock','fas fa-lock-open','fas fa-long-arrow-alt-down','fas fa-long-arrow-alt-left','fas fa-long-arrow-alt-right','fas fa-long-arrow-alt-up','fas fa-low-vision','fas fa-luggage-cart','fas fa-lungs','fas fa-lungs-virus','fab fa-lyft','fab fa-magento','fas fa-magic','fas fa-magnet','fas fa-mail-bulk','fab fa-mailchimp','fas fa-male','fab fa-mandalorian','fas fa-map','far fa-map','fas fa-map-marked','fas fa-map-marked-alt','fas fa-map-marker','fas fa-map-marker-alt','fas fa-map-pin','fas fa-map-signs','fab fa-markdown','fas fa-marker','fas fa-mars','fas fa-mars-double','fas fa-mars-stroke','fas fa-mars-stroke-h','fas fa-mars-stroke-v','fas fa-mask','fab fa-mastodon','fab fa-maxcdn','fab fa-mdb','fas fa-medal','fab fa-medapps','fab fa-medium','fab fa-medium-m','fas fa-medkit','fab fa-medrt','fab fa-meetup','fab fa-megaport','fas fa-meh','far fa-meh','fas fa-meh-blank','far fa-meh-blank','fas fa-meh-rolling-eyes','far fa-meh-rolling-eyes','fas fa-memory','fab fa-mendeley','fas fa-menorah','fas fa-mercury','fas fa-meteor','fab fa-microblog','fas fa-microchip','fas fa-microphone','fas fa-microphone-alt','fas fa-microphone-alt-slash','fas fa-microphone-slash','fas fa-microscope','fab fa-microsoft','fas fa-minus','fas fa-minus-circle','fas fa-minus-square','far fa-minus-square','fas fa-mitten','fab fa-mix','fab fa-mixcloud','fab fa-mixer','fab fa-mizuni','fas fa-mobile','fas fa-mobile-alt','fab fa-modx','fab fa-monero','fas fa-money-bill','fas fa-money-bill-alt','far fa-money-bill-alt','fas fa-money-bill-wave','fas fa-money-bill-wave-alt','fas fa-money-check','fas fa-money-check-alt','fas fa-monument','fas fa-moon','far fa-moon','fas fa-mortar-pestle','fas fa-mosque','fas fa-motorcycle','fas fa-mountain','fas fa-mouse','fas fa-mouse-pointer','fas fa-mug-hot','fas fa-music','fab fa-napster','fab fa-neos','fas fa-network-wired','fas fa-neuter','fas fa-newspaper','far fa-newspaper','fab fa-nimblr','fab fa-node','fab fa-node-js','fas fa-not-equal','fas fa-notes-medical','fab fa-npm','fab fa-ns8','fab fa-nutritionix','fas fa-object-group','far fa-object-group','fas fa-object-ungroup','far fa-object-ungroup','fab fa-octopus-deploy','fab fa-odnoklassniki','fab fa-odnoklassniki-square','fas fa-oil-can','fab fa-old-republic','fas fa-om','fab fa-opencart','fab fa-openid','fab fa-opera','fab fa-optin-monster','fab fa-orcid','fab fa-osi','fas fa-otter','fas fa-outdent','fab fa-page4','fab fa-pagelines','fas fa-pager','fas fa-paint-brush','fas fa-paint-roller','fas fa-palette','fab fa-palfed','fas fa-pallet','fas fa-paper-plane','far fa-paper-plane','fas fa-paperclip','fas fa-parachute-box','fas fa-paragraph','fas fa-parking','fas fa-passport','fas fa-pastafarianism','fas fa-paste','fab fa-patreon','fas fa-pause','fas fa-pause-circle','far fa-pause-circle','fas fa-paw','fab fa-paypal','fas fa-peace','fas fa-pen','fas fa-pen-alt','fas fa-pen-fancy','fas fa-pen-nib','fas fa-pen-square','fas fa-pencil-alt','fas fa-pencil-ruler','fab fa-penny-arcade','fas fa-people-arrows','fas fa-people-carry','fas fa-pepper-hot','fab fa-perbyte','fas fa-percent','fas fa-percentage','fab fa-periscope','fas fa-person-booth','fab fa-phabricator','fab fa-phoenix-framework','fab fa-phoenix-squadron','fas fa-phone','fas fa-phone-alt','fas fa-phone-slash','fas fa-phone-square','fas fa-phone-square-alt','fas fa-phone-volume','fas fa-photo-video','fab fa-php','fab fa-pied-piper','fab fa-pied-piper-alt','fab fa-pied-piper-hat','fab fa-pied-piper-pp','fab fa-pied-piper-square','fas fa-piggy-bank','fas fa-pills','fab fa-pinterest','fab fa-pinterest-p','fab fa-pinterest-square','fas fa-pizza-slice','fas fa-place-of-worship','fas fa-plane','fas fa-plane-arrival','fas fa-plane-departure','fas fa-plane-slash','fas fa-play','fas fa-play-circle','far fa-play-circle','fab fa-playstation','fas fa-plug','fas fa-plus','fas fa-plus-circle','fas fa-plus-square','far fa-plus-square','fas fa-podcast','fas fa-poll','fas fa-poll-h','fas fa-poo','fas fa-poo-storm','fas fa-poop','fas fa-portrait','fas fa-pound-sign','fas fa-power-off','fas fa-pray','fas fa-praying-hands','fas fa-prescription','fas fa-prescription-bottle','fas fa-prescription-bottle-alt','fas fa-print','fas fa-procedures','fab fa-product-hunt','fas fa-project-diagram','fas fa-pump-medical','fas fa-pump-soap','fab fa-pushed','fas fa-puzzle-piece','fab fa-python','fab fa-qq','fas fa-qrcode','fas fa-question','fas fa-question-circle','far fa-question-circle','fas fa-quidditch','fab fa-quinscape','fab fa-quora','fas fa-quote-left','fas fa-quote-right','fas fa-quran','fab fa-r-project','fas fa-radiation','fas fa-radiation-alt','fas fa-rainbow','fas fa-random','fab fa-raspberry-pi','fab fa-ravelry','fab fa-react','fab fa-reacteurope','fab fa-readme','fab fa-rebel','fas fa-receipt','fas fa-record-vinyl','fas fa-recycle','fab fa-red-river','fab fa-reddit','fab fa-reddit-alien','fab fa-reddit-square','fab fa-redhat','fas fa-redo','fas fa-redo-alt','fas fa-registered','far fa-registered','fas fa-remove-format','fab fa-renren','fas fa-reply','fas fa-reply-all','fab fa-replyd','fas fa-republican','fab fa-researchgate','fab fa-resolving','fas fa-restroom','fas fa-retweet','fab fa-rev','fas fa-ribbon','fas fa-ring','fas fa-road','fas fa-robot','fas fa-rocket','fab fa-rocketchat','fab fa-rockrms','fas fa-route','fas fa-rss','fas fa-rss-square','fas fa-ruble-sign','fas fa-ruler','fas fa-ruler-combined','fas fa-ruler-horizontal','fas fa-ruler-vertical','fas fa-running','fas fa-rupee-sign','fab fa-rust','fas fa-sad-cry','far fa-sad-cry','fas fa-sad-tear','far fa-sad-tear','fab fa-safari','fab fa-salesforce','fab fa-sass','fas fa-satellite','fas fa-satellite-dish','fas fa-save','far fa-save','fab fa-schlix','fas fa-school','fas fa-screwdriver','fab fa-scribd','fas fa-scroll','fas fa-sd-card','fas fa-search','fas fa-search-dollar','fas fa-search-location','fas fa-search-minus','fas fa-search-plus','fab fa-searchengin','fas fa-seedling','fab fa-sellcast','fab fa-sellsy','fas fa-server','fab fa-servicestack','fas fa-shapes','fas fa-share','fas fa-share-alt','fas fa-share-alt-square','fas fa-share-square','far fa-share-square','fas fa-shekel-sign','fas fa-shield-alt','fas fa-shield-virus','fas fa-ship','fas fa-shipping-fast','fab fa-shirtsinbulk','fas fa-shoe-prints','fab fa-shopify','fas fa-shopping-bag','fas fa-shopping-basket','fas fa-shopping-cart','fab fa-shopware','fas fa-shower','fas fa-shuttle-van','fas fa-sign','fas fa-sign-in-alt','fas fa-sign-language','fas fa-sign-out-alt','fas fa-signal','fas fa-signature','fas fa-sim-card','fab fa-simplybuilt','fas fa-sink','fab fa-sistrix','fas fa-sitemap','fab fa-sith','fas fa-skating','fab fa-sketch','fas fa-skiing','fas fa-skiing-nordic','fas fa-skull','fas fa-skull-crossbones','fab fa-skyatlas','fab fa-skype','fab fa-slack','fab fa-slack-hash','fas fa-slash','fas fa-sleigh','fas fa-sliders-h','fab fa-slideshare','fas fa-smile','far fa-smile','fas fa-smile-beam','far fa-smile-beam','fas fa-smile-wink','far fa-smile-wink','fas fa-smog','fas fa-smoking','fas fa-smoking-ban','fas fa-sms','fab fa-snapchat','fab fa-snapchat-ghost','fab fa-snapchat-square','fas fa-snowboarding','fas fa-snowflake','far fa-snowflake','fas fa-snowman','fas fa-snowplow','fas fa-soap','fas fa-socks','fas fa-solar-panel','fas fa-sort','fas fa-sort-alpha-down','fas fa-sort-alpha-down-alt','fas fa-sort-alpha-up','fas fa-sort-alpha-up-alt','fas fa-sort-amount-down','fas fa-sort-amount-down-alt','fas fa-sort-amount-up','fas fa-sort-amount-up-alt','fas fa-sort-down','fas fa-sort-numeric-down','fas fa-sort-numeric-down-alt','fas fa-sort-numeric-up','fas fa-sort-numeric-up-alt','fas fa-sort-up','fab fa-soundcloud','fab fa-sourcetree','fas fa-spa','fas fa-space-shuttle','fab fa-speakap','fab fa-speaker-deck','fas fa-spell-check','fas fa-spider','fas fa-spinner','fas fa-splotch','fab fa-spotify','fas fa-spray-can','fas fa-square','far fa-square','fas fa-square-full','fas fa-square-root-alt','fab fa-squarespace','fab fa-stack-exchange','fab fa-stack-overflow','fab fa-stackpath','fas fa-stamp','fas fa-star','far fa-star','fas fa-star-and-crescent','fas fa-star-half','far fa-star-half','fas fa-star-half-alt','fas fa-star-of-david','fas fa-star-of-life','fab fa-staylinked','fab fa-steam','fab fa-steam-square','fab fa-steam-symbol','fas fa-step-backward','fas fa-step-forward','fas fa-stethoscope','fab fa-sticker-mule','fas fa-sticky-note','far fa-sticky-note','fas fa-stop','fas fa-stop-circle','far fa-stop-circle','fas fa-stopwatch','fas fa-stopwatch-20','fas fa-store','fas fa-store-alt','fas fa-store-alt-slash','fas fa-store-slash','fab fa-strava','fas fa-stream','fas fa-street-view','fas fa-strikethrough','fab fa-stripe','fab fa-stripe-s','fas fa-stroopwafel','fab fa-studiovinari','fab fa-stumbleupon','fab fa-stumbleupon-circle','fas fa-subscript','fas fa-subway','fas fa-suitcase','fas fa-suitcase-rolling','fas fa-sun','far fa-sun','fab fa-superpowers','fas fa-superscript','fab fa-supple','fas fa-surprise','far fa-surprise','fab fa-suse','fas fa-swatchbook','fab fa-swift','fas fa-swimmer','fas fa-swimming-pool','fab fa-symfony','fas fa-synagogue','fas fa-sync','fas fa-sync-alt','fas fa-syringe','fas fa-table','fas fa-table-tennis','fas fa-tablet','fas fa-tablet-alt','fas fa-tablets','fas fa-tachometer-alt','fas fa-tag','fas fa-tags','fas fa-tape','fas fa-tasks','fas fa-taxi','fab fa-teamspeak','fas fa-teeth','fas fa-teeth-open','fab fa-telegram','fab fa-telegram-plane','fas fa-temperature-high','fas fa-temperature-low','fab fa-tencent-weibo','fas fa-tenge','fas fa-terminal','fas fa-text-height','fas fa-text-width','fas fa-th','fas fa-th-large','fas fa-th-list','fab fa-the-red-yeti','fas fa-theater-masks','fab fa-themeco','fab fa-themeisle','fas fa-thermometer','fas fa-thermometer-empty','fas fa-thermometer-full','fas fa-thermometer-half','fas fa-thermometer-quarter','fas fa-thermometer-three-quarters','fab fa-think-peaks','fas fa-thumbs-down','far fa-thumbs-down','fas fa-thumbs-up','far fa-thumbs-up','fas fa-thumbtack','fas fa-ticket-alt','fab fa-tiktok','fas fa-times','fas fa-times-circle','far fa-times-circle','fas fa-tint','fas fa-tint-slash','fas fa-tired','far fa-tired','fas fa-toggle-off','fas fa-toggle-on','fas fa-toilet','fas fa-toilet-paper','fas fa-toilet-paper-slash','fas fa-toolbox','fas fa-tools','fas fa-tooth','fas fa-torah','fas fa-torii-gate','fas fa-tractor','fab fa-trade-federation','fas fa-trademark','fas fa-traffic-light','fas fa-trailer','fas fa-train','fas fa-tram','fas fa-transgender','fas fa-transgender-alt','fas fa-trash','fas fa-trash-alt','far fa-trash-alt','fas fa-trash-restore','fas fa-trash-restore-alt','fas fa-tree','fab fa-trello','fas fa-trophy','fas fa-truck','fas fa-truck-loading','fas fa-truck-monster','fas fa-truck-moving','fas fa-truck-pickup','fas fa-tshirt','fas fa-tty','fab fa-tumblr','fab fa-tumblr-square','fas fa-tv','fab fa-twitch','fab fa-twitter','fab fa-twitter-square','fab fa-typo3','fab fa-uber','fab fa-ubuntu','fab fa-uikit','fab fa-umbraco','fas fa-umbrella','fas fa-umbrella-beach','fab fa-uncharted','fas fa-underline','fas fa-undo','fas fa-undo-alt','fab fa-uniregistry','fab fa-unity','fas fa-universal-access','fas fa-university','fas fa-unlink','fas fa-unlock','fas fa-unlock-alt','fab fa-unsplash','fab fa-untappd','fas fa-upload','fab fa-ups','fab fa-usb','fas fa-user','far fa-user','fas fa-user-alt','fas fa-user-alt-slash','fas fa-user-astronaut','fas fa-user-check','fas fa-user-circle','far fa-user-circle','fas fa-user-clock','fas fa-user-cog','fas fa-user-edit','fas fa-user-friends','fas fa-user-graduate','fas fa-user-injured','fas fa-user-lock','fas fa-user-md','fas fa-user-minus','fas fa-user-ninja','fas fa-user-nurse','fas fa-user-plus','fas fa-user-secret','fas fa-user-shield','fas fa-user-slash','fas fa-user-tag','fas fa-user-tie','fas fa-user-times','fas fa-users','fas fa-users-cog','fas fa-users-slash','fab fa-usps','fab fa-ussunnah','fas fa-utensil-spoon','fas fa-utensils','fab fa-vaadin','fas fa-vector-square','fas fa-venus','fas fa-venus-double','fas fa-venus-mars','fas fa-vest','fas fa-vest-patches','fab fa-viacoin','fab fa-viadeo','fab fa-viadeo-square','fas fa-vial','fas fa-vials','fab fa-viber','fas fa-video','fas fa-video-slash','fas fa-vihara','fab fa-vimeo','fab fa-vimeo-square','fab fa-vimeo-v','fab fa-vine','fas fa-virus','fas fa-virus-slash','fas fa-viruses','fab fa-vk','fab fa-vnv','fas fa-voicemail','fas fa-volleyball-ball','fas fa-volume-down','fas fa-volume-mute','fas fa-volume-off','fas fa-volume-up','fas fa-vote-yea','fas fa-vr-cardboard','fab fa-vuejs','fas fa-walking','fas fa-wallet','fas fa-warehouse','fab fa-watchman-monitoring','fas fa-water','fas fa-wave-square','fab fa-waze','fab fa-weebly','fab fa-weibo','fas fa-weight','fas fa-weight-hanging','fab fa-weixin','fab fa-whatsapp','fab fa-whatsapp-square','fas fa-wheelchair','fab fa-whmcs','fas fa-wifi','fab fa-wikipedia-w','fas fa-wind','fas fa-window-close','far fa-window-close','fas fa-window-maximize','far fa-window-maximize','fas fa-window-minimize','far fa-window-minimize','fas fa-window-restore','far fa-window-restore','fab fa-windows','fas fa-wine-bottle','fas fa-wine-glass','fas fa-wine-glass-alt','fab fa-wix','fab fa-wizards-of-the-coast','fab fa-wodu','fab fa-wolf-pack-battalion','fas fa-won-sign','fab fa-wordpress','fab fa-wordpress-simple','fab fa-wpbeginner','fab fa-wpexplorer','fab fa-wpforms','fab fa-wpressr','fas fa-wrench','fas fa-x-ray','fab fa-xbox','fab fa-xing','fab fa-xing-square','fab fa-y-combinator','fab fa-yahoo','fab fa-yammer','fab fa-yandex','fab fa-yandex-international','fab fa-yarn','fab fa-yelp','fas fa-yen-sign','fas fa-yin-yang','fab fa-yoast','fab fa-youtube','fab fa-youtube-square','fab fa-zhihu' ) + ) ); + } +} diff --git a/framework/fields/icon/icon.php b/framework/fields/icon/icon.php new file mode 100644 index 0000000..d8c7e2b --- /dev/null +++ b/framework/fields/icon/icon.php @@ -0,0 +1,71 @@ +field, array( + 'button_title' => esc_html__( 'Add Icon', 'wp_china_yes' ), + 'remove_title' => esc_html__( 'Remove Icon', 'wp_china_yes' ), + ) ); + + echo $this->field_before(); + + $nonce = wp_create_nonce( 'wp_china_yes_icon_nonce' ); + $hidden = ( empty( $this->value ) ) ? ' hidden' : ''; + + echo '
        '; + echo ''; + echo ''. $args['button_title'] .''; + echo ''. $args['remove_title'] .''; + echo 'field_attributes() .' />'; + echo '
        '; + + echo $this->field_after(); + + } + + public function enqueue() { + add_action( 'admin_footer', array( 'WP_CHINA_YES_Field_icon', 'add_footer_modal_icon' ) ); + add_action( 'customize_controls_print_footer_scripts', array( 'WP_CHINA_YES_Field_icon', 'add_footer_modal_icon' ) ); + } + + public static function add_footer_modal_icon() { + ?> + + field, array( + 'multiple' => false, + 'inline' => false, + 'options' => array(), + ) ); + + $inline = ( $args['inline'] ) ? ' wp_china_yes--inline-list' : ''; + + $value = ( is_array( $this->value ) ) ? $this->value : array_filter( (array) $this->value ); + + echo $this->field_before(); + + if ( ! empty( $args['options'] ) ) { + + echo '
        '; + + $num = 1; + + foreach ( $args['options'] as $key => $option ) { + + $type = ( $args['multiple'] ) ? 'checkbox' : 'radio'; + $extra = ( $args['multiple'] ) ? '[]' : ''; + $active = ( in_array( $key, $value ) ) ? ' wp_china_yes--active' : ''; + $checked = ( in_array( $key, $value ) ) ? ' checked' : ''; + + echo '
        '; + echo '
        '; + echo 'img-'. esc_attr( $num++ ) .''; + echo 'field_attributes() . esc_attr( $checked ) .'/>'; + echo '
        '; + echo '
        '; + + } + + echo '
        '; + + } + + echo $this->field_after(); + + } + + public function output() { + + $output = ''; + $bg_image = array(); + $important = ( ! empty( $this->field['output_important'] ) ) ? '!important' : ''; + $elements = ( is_array( $this->field['output'] ) ) ? join( ',', $this->field['output'] ) : $this->field['output']; + + if ( ! empty( $elements ) && isset( $this->value ) && $this->value !== '' ) { + $output = $elements .'{background-image:url('. $this->value .')'. $important .';}'; + } + + $this->parent->output_css .= $output; + + return $output; + + } + + } +} diff --git a/framework/fields/index.php b/framework/fields/index.php new file mode 100644 index 0000000..49d255d --- /dev/null +++ b/framework/fields/index.php @@ -0,0 +1 @@ +field, array( + 'add_title' => esc_html__( 'Add Link', 'wp_china_yes' ), + 'edit_title' => esc_html__( 'Edit Link', 'wp_china_yes' ), + 'remove_title' => esc_html__( 'Remove Link', 'wp_china_yes' ), + ) ); + + $default_values = array( + 'url' => '', + 'text' => '', + 'target' => '', + ); + + $value = wp_parse_args( $this->value, $default_values ); + + $hidden = ( ! empty( $value['url'] ) || ! empty( $value['url'] ) || ! empty( $value['url'] ) ) ? ' hidden' : ''; + + $maybe_hidden = ( empty( $hidden ) ) ? ' hidden' : ''; + + echo $this->field_before(); + + echo ''; + + echo '
        '. sprintf( '{url:"%s", text:"%s", target:"%s"}', $value['url'], $value['text'], $value['target'] ) .'
        '; + + echo 'field_attributes( array( 'class' => 'wp_china_yes--url' ) ) .' />'; + echo ''; + echo ''; + + echo ''. $args['add_title'] .' '; + echo ''. $args['edit_title'] .' '; + echo ''. $args['remove_title'] .''; + + echo $this->field_after(); + + } + + public function enqueue() { + + if ( ! wp_script_is( 'wplink' ) ) { + wp_enqueue_script( 'wplink' ); + } + + if ( ! wp_script_is( 'jquery-ui-autocomplete' ) ) { + wp_enqueue_script( 'jquery-ui-autocomplete' ); + } + + add_action( 'admin_print_footer_scripts', array( $this, 'add_wp_link_dialog' ) ); + + } + + public function add_wp_link_dialog() { + + if ( ! class_exists( '_WP_Editors' ) ) { + require_once ABSPATH . WPINC .'/class-wp-editor.php'; + } + + wp_print_styles( 'editor-buttons' ); + + _WP_Editors::wp_link_dialog(); + + } + + } +} diff --git a/framework/fields/link_color/link_color.php b/framework/fields/link_color/link_color.php new file mode 100644 index 0000000..ea4ad5c --- /dev/null +++ b/framework/fields/link_color/link_color.php @@ -0,0 +1,91 @@ +field, array( + 'color' => true, + 'hover' => true, + 'active' => false, + 'visited' => false, + 'focus' => false, + ) ); + + $default_values = array( + 'color' => '', + 'hover' => '', + 'active' => '', + 'visited' => '', + 'focus' => '', + ); + + $color_props = array( + 'color' => esc_html__( 'Normal', 'wp_china_yes' ), + 'hover' => esc_html__( 'Hover', 'wp_china_yes' ), + 'active' => esc_html__( 'Active', 'wp_china_yes' ), + 'visited' => esc_html__( 'Visited', 'wp_china_yes' ), + 'focus' => esc_html__( 'Focus', 'wp_china_yes' ) + ); + + $value = wp_parse_args( $this->value, $default_values ); + + echo $this->field_before(); + + foreach ( $color_props as $color_prop_key => $color_prop_value ) { + + if ( ! empty( $args[$color_prop_key] ) ) { + + $default_attr = ( ! empty( $this->field['default'][$color_prop_key] ) ) ? ' data-default-color="'. esc_attr( $this->field['default'][$color_prop_key] ) .'"' : ''; + + echo '
        '; + echo '
        '. esc_attr( $color_prop_value ) .'
        '; + echo 'field_attributes() .'/>'; + echo '
        '; + + } + + } + + echo $this->field_after(); + + } + + public function output() { + + $output = ''; + $elements = ( is_array( $this->field['output'] ) ) ? $this->field['output'] : array_filter( (array) $this->field['output'] ); + $important = ( ! empty( $this->field['output_important'] ) ) ? '!important' : ''; + + if ( ! empty( $elements ) && isset( $this->value ) && $this->value !== '' ) { + foreach ( $elements as $element ) { + + if ( isset( $this->value['color'] ) && $this->value['color'] !== '' ) { $output .= $element .'{color:'. $this->value['color'] . $important .';}'; } + if ( isset( $this->value['hover'] ) && $this->value['hover'] !== '' ) { $output .= $element .':hover{color:'. $this->value['hover'] . $important .';}'; } + if ( isset( $this->value['active'] ) && $this->value['active'] !== '' ) { $output .= $element .':active{color:'. $this->value['active'] . $important .';}'; } + if ( isset( $this->value['visited'] ) && $this->value['visited'] !== '' ) { $output .= $element .':visited{color:'. $this->value['visited'] . $important .';}'; } + if ( isset( $this->value['focus'] ) && $this->value['focus'] !== '' ) { $output .= $element .':focus{color:'. $this->value['focus'] . $important .';}'; } + + } + } + + $this->parent->output_css .= $output; + + return $output; + + } + + } +} diff --git a/framework/fields/map/map.php b/framework/fields/map/map.php new file mode 100644 index 0000000..2475a60 --- /dev/null +++ b/framework/fields/map/map.php @@ -0,0 +1,98 @@ +field, array( + 'placeholder' => esc_html__( 'Search...', 'wp_china_yes' ), + 'latitude_text' => esc_html__( 'Latitude', 'wp_china_yes' ), + 'longitude_text' => esc_html__( 'Longitude', 'wp_china_yes' ), + 'address_field' => '', + 'height' => '', + ) ); + + $value = wp_parse_args( $this->value, array( + 'address' => '', + 'latitude' => '20', + 'longitude' => '0', + 'zoom' => '2', + ) ); + + $default_settings = array( + 'center' => array( $value['latitude'], $value['longitude'] ), + 'zoom' => $value['zoom'], + 'scrollWheelZoom' => false, + ); + + $settings = ( ! empty( $this->field['settings'] ) ) ? $this->field['settings'] : array(); + $settings = wp_parse_args( $settings, $default_settings ); + + $style_attr = ( ! empty( $args['height'] ) ) ? ' style="min-height:'. esc_attr( $args['height'] ) .';"' : ''; + $placeholder = ( ! empty( $args['placeholder'] ) ) ? array( 'placeholder' => $args['placeholder'] ) : ''; + + echo $this->field_before(); + + if ( empty( $args['address_field'] ) ) { + echo ''; + } else { + echo '
        '; + } + + echo '
        '; + + echo '
        '; + + echo '
        '; + echo ''; + echo ''; + echo '
        '; + + echo '
        '; + echo ''; + echo ''; + echo '
        '; + + echo '
        '; + + echo ''; + + echo $this->field_after(); + + } + + public function enqueue() { + + if ( ! wp_script_is( 'wp_china_yes-leaflet' ) ) { + wp_enqueue_script( 'wp_china_yes-leaflet', esc_url( $this->cdn_url . $this->version .'/dist/leaflet.js' ), array( 'wp_china_yes' ), $this->version, true ); + } + + if ( ! wp_style_is( 'wp_china_yes-leaflet' ) ) { + wp_enqueue_style( 'wp_china_yes-leaflet', esc_url( $this->cdn_url . $this->version .'/dist/leaflet.css' ), array(), $this->version ); + } + + if ( ! wp_script_is( 'jquery-ui-autocomplete' ) ) { + wp_enqueue_script( 'jquery-ui-autocomplete' ); + } + + } + + } +} diff --git a/framework/fields/media/media.php b/framework/fields/media/media.php new file mode 100644 index 0000000..0dc827d --- /dev/null +++ b/framework/fields/media/media.php @@ -0,0 +1,96 @@ +field, array( + 'url' => true, + 'preview' => true, + 'preview_width' => '', + 'preview_height' => '', + 'library' => array(), + 'button_title' => esc_html__( 'Upload', 'wp_china_yes' ), + 'remove_title' => esc_html__( 'Remove', 'wp_china_yes' ), + 'preview_size' => 'thumbnail', + ) ); + + $default_values = array( + 'url' => '', + 'id' => '', + 'width' => '', + 'height' => '', + 'thumbnail' => '', + 'alt' => '', + 'title' => '', + 'description' => '' + ); + + // fallback + if ( is_numeric( $this->value ) ) { + + $this->value = array( + 'id' => $this->value, + 'url' => wp_get_attachment_url( $this->value ), + 'thumbnail' => wp_get_attachment_image_src( $this->value, 'thumbnail', true )[0], + ); + + } + + $this->value = wp_parse_args( $this->value, $default_values ); + + $library = ( is_array( $args['library'] ) ) ? $args['library'] : array_filter( (array) $args['library'] ); + $library = ( ! empty( $library ) ) ? implode(',', $library ) : ''; + $preview_src = ( $args['preview_size'] !== 'thumbnail' ) ? $this->value['url'] : $this->value['thumbnail']; + $hidden_url = ( empty( $args['url'] ) ) ? ' hidden' : ''; + $hidden_auto = ( empty( $this->value['url'] ) ) ? ' hidden' : ''; + $placeholder = ( empty( $this->field['placeholder'] ) ) ? ' placeholder="'. esc_html__( 'Not selected', 'wp_china_yes' ) .'"' : ''; + + echo $this->field_before(); + + if ( ! empty( $args['preview'] ) ) { + + $preview_width = ( ! empty( $args['preview_width'] ) ) ? 'max-width:'. esc_attr( $args['preview_width'] ) .'px;' : ''; + $preview_height = ( ! empty( $args['preview_height'] ) ) ? 'max-height:'. esc_attr( $args['preview_height'] ) .'px;' : ''; + $preview_style = ( ! empty( $preview_width ) || ! empty( $preview_height ) ) ? ' style="'. esc_attr( $preview_width . $preview_height ) .'"': ''; + + echo '
        '; + echo '
        '; + echo ''; + echo '
        '; + echo '
        '; + + } + + echo '
        '; + echo 'field_attributes() . $placeholder .' />'; + echo ''. $args['button_title'] .''; + echo ( empty( $args['preview'] ) ) ? ''. $args['remove_title'] .'' : ''; + echo '
        '; + + echo ''; + echo ''; + echo ''; + echo ''; + echo ''; + echo ''; + echo ''; + + echo $this->field_after(); + + } + + } +} diff --git a/framework/fields/notice/notice.php b/framework/fields/notice/notice.php new file mode 100644 index 0000000..8cc42e6 --- /dev/null +++ b/framework/fields/notice/notice.php @@ -0,0 +1,26 @@ +field['style'] ) ) ? $this->field['style'] : 'normal'; + + echo ( ! empty( $this->field['content'] ) ) ? '
        '. $this->field['content'] .'
        ' : ''; + + } + + } +} diff --git a/framework/fields/number/number.php b/framework/fields/number/number.php new file mode 100644 index 0000000..60c21e9 --- /dev/null +++ b/framework/fields/number/number.php @@ -0,0 +1,63 @@ +field, array( + 'min' => 'any', + 'max' => 'any', + 'step' => 'any', + 'unit' => '', + ) ); + + echo $this->field_before(); + echo '
        '; + echo 'field_attributes() .' min="'. esc_attr( $args['min'] ) .'" max="'. esc_attr( $args['max'] ) .'" step="'. esc_attr( $args['step'] ) .'"/>'; + echo ( ! empty( $args['unit'] ) ) ? ''. esc_attr( $args['unit'] ) .'' : ''; + echo '
        '; + echo $this->field_after(); + + } + + public function output() { + + $output = ''; + $elements = ( is_array( $this->field['output'] ) ) ? $this->field['output'] : array_filter( (array) $this->field['output'] ); + $important = ( ! empty( $this->field['output_important'] ) ) ? '!important' : ''; + $mode = ( ! empty( $this->field['output_mode'] ) ) ? $this->field['output_mode'] : 'width'; + $unit = ( ! empty( $this->field['unit'] ) ) ? $this->field['unit'] : 'px'; + + if ( ! empty( $elements ) && isset( $this->value ) && $this->value !== '' ) { + foreach ( $elements as $key_property => $element ) { + if ( is_numeric( $key_property ) ) { + if ( $mode ) { + $output = implode( ',', $elements ) .'{'. $mode .':'. $this->value . $unit . $important .';}'; + } + break; + } else { + $output .= $element .'{'. $key_property .':'. $this->value . $unit . $important .'}'; + } + } + } + + $this->parent->output_css .= $output; + + return $output; + + } + + } +} diff --git a/framework/fields/palette/palette.php b/framework/fields/palette/palette.php new file mode 100644 index 0000000..e8a95da --- /dev/null +++ b/framework/fields/palette/palette.php @@ -0,0 +1,58 @@ +field['options'] ) ) ? $this->field['options'] : array(); + + echo $this->field_before(); + + if ( ! empty( $palette ) ) { + + echo '
        '; + + foreach ( $palette as $key => $colors ) { + + $active = ( $key === $this->value ) ? ' wp_china_yes--active' : ''; + $checked = ( $key === $this->value ) ? ' checked' : ''; + + echo '
        '; + + if ( ! empty( $colors ) ) { + + foreach ( $colors as $color ) { + + echo ''; + + } + + } + + echo 'field_attributes() . esc_attr( $checked ) .'/>'; + echo '
        '; + + } + + echo '
        '; + + } + + echo $this->field_after(); + + } + + } +} diff --git a/framework/fields/radio/radio.php b/framework/fields/radio/radio.php new file mode 100644 index 0000000..30768ff --- /dev/null +++ b/framework/fields/radio/radio.php @@ -0,0 +1,93 @@ +field, array( + 'inline' => false, + 'query_args' => array(), + ) ); + + $inline_class = ( $args['inline'] ) ? ' class="wp_china_yes--inline-list"' : ''; + + echo $this->field_before(); + + if ( isset( $this->field['options'] ) ) { + + $options = $this->field['options']; + $options = ( is_array( $options ) ) ? $options : array_filter( $this->field_data( $options, false, $args['query_args'] ) ); + + if ( is_array( $options ) && ! empty( $options ) ) { + + echo ''; + + foreach ( $options as $option_key => $option_value ) { + + if ( is_array( $option_value ) && ! empty( $option_value ) ) { + + echo '
      • '; + echo '
          '; + echo '
        • '. esc_attr( $option_key ) .'
        • '; + foreach ( $option_value as $sub_key => $sub_value ) { + $checked = ( $sub_key == $this->value ) ? ' checked' : ''; + echo '
        • '; + echo ''; + echo '
        • '; + } + echo '
        '; + echo '
      • '; + + } else { + + $checked = ( $option_key == $this->value ) ? ' checked' : ''; + + echo '
      • '; + echo ''; + echo '
      • '; + + } + + } + + echo ''; + + } else { + + echo ( ! empty( $this->field['empty_message'] ) ) ? esc_attr( $this->field['empty_message'] ) : esc_html__( 'No data available.', 'wp_china_yes' ); + + } + + } else { + + $label = ( isset( $this->field['label'] ) ) ? $this->field['label'] : ''; + echo ''; + + } + + echo $this->field_after(); + + } + + } +} diff --git a/framework/fields/repeater/repeater.php b/framework/fields/repeater/repeater.php new file mode 100644 index 0000000..92f2ec2 --- /dev/null +++ b/framework/fields/repeater/repeater.php @@ -0,0 +1,108 @@ +field, array( + 'max' => 0, + 'min' => 0, + 'button_title' => '', + ) ); + + if ( preg_match( '/'. preg_quote( '['. $this->field['id'] .']' ) .'/', $this->unique ) ) { + + echo '
        '. esc_html__( 'Error: Field ID conflict.', 'wp_china_yes' ) .'
        '; + + } else { + + echo $this->field_before(); + + echo '
        '; + echo '
        '; + foreach ( $this->field['fields'] as $field ) { + + $field_default = ( isset( $field['default'] ) ) ? $field['default'] : ''; + $field_unique = ( ! empty( $this->unique ) ) ? $this->unique .'['. $this->field['id'] .'][0]' : $this->field['id'] .'[0]'; + + WP_CHINA_YES::field( $field, $field_default, '___'. $field_unique, 'field/repeater' ); + + } + echo '
        '; + echo '
        '; + echo '
        '; + echo ''; + echo ''; + echo ''; + echo '
        '; + echo '
        '; + echo '
        '; + + echo '
        '; + + if ( ! empty( $this->value ) && is_array( $this->value ) ) { + + $num = 0; + + foreach ( $this->value as $key => $value ) { + + echo '
        '; + echo '
        '; + foreach ( $this->field['fields'] as $field ) { + + $field_unique = ( ! empty( $this->unique ) ) ? $this->unique .'['. $this->field['id'] .']['. $num .']' : $this->field['id'] .'['. $num .']'; + $field_value = ( isset( $field['id'] ) && isset( $this->value[$key][$field['id']] ) ) ? $this->value[$key][$field['id']] : ''; + + WP_CHINA_YES::field( $field, $field_value, $field_unique, 'field/repeater' ); + + } + echo '
        '; + echo '
        '; + echo '
        '; + echo ''; + echo ''; + echo ''; + echo '
        '; + echo '
        '; + echo '
        '; + + $num++; + + } + + } + + echo '
        '; + + echo '
        '. esc_html__( 'You cannot add more.', 'wp_china_yes' ) .'
        '; + echo '
        '. esc_html__( 'You cannot remove more.', 'wp_china_yes' ) .'
        '; + echo ''. $args['button_title'] .''; + + echo $this->field_after(); + + } + + } + + public function enqueue() { + + if ( ! wp_script_is( 'jquery-ui-sortable' ) ) { + wp_enqueue_script( 'jquery-ui-sortable' ); + } + + } + + } +} diff --git a/framework/fields/select/select.php b/framework/fields/select/select.php new file mode 100644 index 0000000..b15b6da --- /dev/null +++ b/framework/fields/select/select.php @@ -0,0 +1,132 @@ +field, array( + 'placeholder' => '', + 'chosen' => false, + 'multiple' => false, + 'sortable' => false, + 'ajax' => false, + 'settings' => array(), + 'query_args' => array(), + ) ); + + $this->value = ( is_array( $this->value ) ) ? $this->value : array_filter( (array) $this->value ); + + echo $this->field_before(); + + if ( isset( $this->field['options'] ) ) { + + if ( ! empty( $args['ajax'] ) ) { + $args['settings']['data']['type'] = $args['options']; + $args['settings']['data']['nonce'] = wp_create_nonce( 'wp_china_yes_chosen_ajax_nonce' ); + if ( ! empty( $args['query_args'] ) ) { + $args['settings']['data']['query_args'] = $args['query_args']; + } + } + + $chosen_rtl = ( is_rtl() ) ? ' chosen-rtl' : ''; + $multiple_name = ( $args['multiple'] ) ? '[]' : ''; + $multiple_attr = ( $args['multiple'] ) ? ' multiple="multiple"' : ''; + $chosen_sortable = ( $args['chosen'] && $args['sortable'] ) ? ' wp_china_yes-chosen-sortable' : ''; + $chosen_ajax = ( $args['chosen'] && $args['ajax'] ) ? ' wp_china_yes-chosen-ajax' : ''; + $placeholder_attr = ( $args['chosen'] && $args['placeholder'] ) ? ' data-placeholder="'. esc_attr( $args['placeholder'] ) .'"' : ''; + $field_class = ( $args['chosen'] ) ? ' class="wp_china_yes-chosen'. esc_attr( $chosen_rtl . $chosen_sortable . $chosen_ajax ) .'"' : ''; + $field_name = $this->field_name( $multiple_name ); + $field_attr = $this->field_attributes(); + $maybe_options = $this->field['options']; + $chosen_data_attr = ( $args['chosen'] && ! empty( $args['settings'] ) ) ? ' data-chosen-settings="'. esc_attr( json_encode( $args['settings'] ) ) .'"' : ''; + + if ( is_string( $maybe_options ) && ! empty( $args['chosen'] ) && ! empty( $args['ajax'] ) ) { + $options = $this->field_wp_query_data_title( $maybe_options, $this->value ); + } else if ( is_string( $maybe_options ) ) { + $options = $this->field_data( $maybe_options, false, $args['query_args'] ); + } else { + $options = $maybe_options; + } + + if ( ( is_array( $options ) && ! empty( $options ) ) || ( ! empty( $args['chosen'] ) && ! empty( $args['ajax'] ) ) ) { + + if ( ! empty( $args['chosen'] ) && ! empty( $args['multiple'] ) ) { + + echo ''; + + $field_name = '_pseudo'; + $field_attr = ''; + + } + + // These attributes has been serialized above. + echo ''; + + } else { + + echo ( ! empty( $this->field['empty_message'] ) ) ? esc_attr( $this->field['empty_message'] ) : esc_html__( 'No data available.', 'wp_china_yes' ); + + } + + } + + echo $this->field_after(); + + } + + public function enqueue() { + + if ( ! wp_script_is( 'jquery-ui-sortable' ) ) { + wp_enqueue_script( 'jquery-ui-sortable' ); + } + + } + + } +} diff --git a/framework/fields/slider/slider.php b/framework/fields/slider/slider.php new file mode 100644 index 0000000..3a6c320 --- /dev/null +++ b/framework/fields/slider/slider.php @@ -0,0 +1,78 @@ +field, array( + 'max' => 100, + 'min' => 0, + 'step' => 1, + 'unit' => '', + ) ); + + $is_unit = ( ! empty( $args['unit'] ) ) ? ' wp_china_yes--is-unit' : ''; + + echo $this->field_before(); + + echo '
        '; + echo '
        '; + echo '
        '; + echo 'field_attributes( array( 'class' => 'wp_china_yes-input-number'. esc_attr( $is_unit ) ) ) .' data-min="'. esc_attr( $args['min'] ) .'" data-max="'. esc_attr( $args['max'] ) .'" data-step="'. esc_attr( $args['step'] ) .'" step="any" />'; + echo ( ! empty( $args['unit'] ) ) ? ''. esc_attr( $args['unit'] ) .'' : ''; + echo '
        '; + echo '
        '; + + echo $this->field_after(); + + } + + public function enqueue() { + + if ( ! wp_script_is( 'jquery-ui-slider' ) ) { + wp_enqueue_script( 'jquery-ui-slider' ); + } + + } + + public function output() { + + $output = ''; + $elements = ( is_array( $this->field['output'] ) ) ? $this->field['output'] : array_filter( (array) $this->field['output'] ); + $important = ( ! empty( $this->field['output_important'] ) ) ? '!important' : ''; + $mode = ( ! empty( $this->field['output_mode'] ) ) ? $this->field['output_mode'] : 'width'; + $unit = ( ! empty( $this->field['unit'] ) ) ? $this->field['unit'] : 'px'; + + if ( ! empty( $elements ) && isset( $this->value ) && $this->value !== '' ) { + foreach ( $elements as $key_property => $element ) { + if ( is_numeric( $key_property ) ) { + if ( $mode ) { + $output = implode( ',', $elements ) .'{'. $mode .':'. $this->value . $unit . $important .';}'; + } + break; + } else { + $output .= $element .'{'. $key_property .':'. $this->value . $unit . $important .'}'; + } + } + } + + $this->parent->output_css .= $output; + + return $output; + + } + + } +} diff --git a/framework/fields/sortable/sortable.php b/framework/fields/sortable/sortable.php new file mode 100644 index 0000000..8cc6dbe --- /dev/null +++ b/framework/fields/sortable/sortable.php @@ -0,0 +1,87 @@ +field_before(); + + echo '
        '; + + $pre_sortby = array(); + $pre_fields = array(); + + // Add array-keys to defined fields for sort by + foreach ( $this->field['fields'] as $key => $field ) { + $pre_fields[$field['id']] = $field; + } + + // Set sort by by saved-value or default-value + if ( ! empty( $this->value ) ) { + + foreach ( $this->value as $key => $value ) { + $pre_sortby[$key] = $pre_fields[$key]; + } + + $diff = array_diff_key( $pre_fields, $this->value ); + + if( ! empty( $diff ) ) { + $pre_sortby = array_merge( $pre_sortby, $diff ); + } + + } else { + + foreach ( $pre_fields as $key => $value ) { + $pre_sortby[$key] = $value; + } + + } + + foreach ( $pre_sortby as $key => $field ) { + + echo '
        '; + + echo '
        '; + + $field_default = ( isset( $this->field['default'][$key] ) ) ? $this->field['default'][$key] : ''; + $field_value = ( isset( $this->value[$key] ) ) ? $this->value[$key] : $field_default; + $unique_id = ( ! empty( $this->unique ) ) ? $this->unique .'['. $this->field['id'] .']' : $this->field['id']; + + WP_CHINA_YES::field( $field, $field_value, $unique_id, 'field/sortable' ); + + echo '
        '; + + echo '
        '; + + echo '
        '; + + } + + echo '
        '; + + echo $this->field_after(); + + } + + public function enqueue() { + + if ( ! wp_script_is( 'jquery-ui-sortable' ) ) { + wp_enqueue_script( 'jquery-ui-sortable' ); + } + + } + + } +} diff --git a/framework/fields/sorter/sorter.php b/framework/fields/sorter/sorter.php new file mode 100644 index 0000000..6037675 --- /dev/null +++ b/framework/fields/sorter/sorter.php @@ -0,0 +1,76 @@ +field, array( + 'disabled' => true, + 'enabled_title' => esc_html__( 'Enabled', 'wp_china_yes' ), + 'disabled_title' => esc_html__( 'Disabled', 'wp_china_yes' ), + ) ); + + echo $this->field_before(); + + $this->value = ( ! empty( $this->value ) ) ? $this->value : $this->field['default']; + $enabled_options = ( ! empty( $this->value['enabled'] ) ) ? $this->value['enabled'] : array(); + $disabled_options = ( ! empty( $this->value['disabled'] ) ) ? $this->value['disabled'] : array(); + + echo '
        '; + + echo ( $args['disabled'] ) ? '
        ' : ''; + + echo ( ! empty( $args['enabled_title'] ) ) ? '
        '. esc_attr( $args['enabled_title'] ) .'
        ' : ''; + echo '
          '; + if ( ! empty( $enabled_options ) ) { + foreach ( $enabled_options as $key => $value ) { + echo '
        • '; + } + } + echo '
        '; + + // Check for hide/show disabled section + if ( $args['disabled'] ) { + + echo '
        '; + + echo '
        '; + echo ( ! empty( $args['disabled_title'] ) ) ? '
        '. esc_attr( $args['disabled_title'] ) .'
        ' : ''; + echo '
          '; + if ( ! empty( $disabled_options ) ) { + foreach ( $disabled_options as $key => $value ) { + echo '
        • '; + } + } + echo '
        '; + echo '
        '; + + } + + + echo $this->field_after(); + + } + + public function enqueue() { + + if ( ! wp_script_is( 'jquery-ui-sortable' ) ) { + wp_enqueue_script( 'jquery-ui-sortable' ); + } + + } + + } +} diff --git a/framework/fields/spacing/spacing.php b/framework/fields/spacing/spacing.php new file mode 100644 index 0000000..1cc92b2 --- /dev/null +++ b/framework/fields/spacing/spacing.php @@ -0,0 +1,171 @@ +field, array( + 'top_icon' => '', + 'right_icon' => '', + 'bottom_icon' => '', + 'left_icon' => '', + 'all_icon' => '', + 'top_placeholder' => esc_html__( 'top', 'wp_china_yes' ), + 'right_placeholder' => esc_html__( 'right', 'wp_china_yes' ), + 'bottom_placeholder' => esc_html__( 'bottom', 'wp_china_yes' ), + 'left_placeholder' => esc_html__( 'left', 'wp_china_yes' ), + 'all_placeholder' => esc_html__( 'all', 'wp_china_yes' ), + 'top' => true, + 'left' => true, + 'bottom' => true, + 'right' => true, + 'unit' => true, + 'show_units' => true, + 'all' => false, + 'units' => array( 'px', '%', 'em' ) + ) ); + + $default_values = array( + 'top' => '', + 'right' => '', + 'bottom' => '', + 'left' => '', + 'all' => '', + 'unit' => 'px', + ); + + $value = wp_parse_args( $this->value, $default_values ); + $unit = ( count( $args['units'] ) === 1 && ! empty( $args['unit'] ) ) ? $args['units'][0] : ''; + $is_unit = ( ! empty( $unit ) ) ? ' wp_china_yes--is-unit' : ''; + + echo $this->field_before(); + + echo '
        '; + + if ( ! empty( $args['all'] ) ) { + + $placeholder = ( ! empty( $args['all_placeholder'] ) ) ? ' placeholder="'. esc_attr( $args['all_placeholder'] ) .'"' : ''; + + echo '
        '; + echo ( ! empty( $args['all_icon'] ) ) ? ''. $args['all_icon'] .'' : ''; + echo ''; + echo ( $unit ) ? ''. esc_attr( $args['units'][0] ) .'' : ''; + echo '
        '; + + } else { + + $properties = array(); + + foreach ( array( 'top', 'right', 'bottom', 'left' ) as $prop ) { + if ( ! empty( $args[$prop] ) ) { + $properties[] = $prop; + } + } + + $properties = ( $properties === array( 'right', 'left' ) ) ? array_reverse( $properties ) : $properties; + + foreach ( $properties as $property ) { + + $placeholder = ( ! empty( $args[$property.'_placeholder'] ) ) ? ' placeholder="'. esc_attr( $args[$property.'_placeholder'] ) .'"' : ''; + + echo '
        '; + echo ( ! empty( $args[$property.'_icon'] ) ) ? ''. $args[$property.'_icon'] .'' : ''; + echo ''; + echo ( $unit ) ? ''. esc_attr( $args['units'][0] ) .'' : ''; + echo '
        '; + + } + + } + + if ( ! empty( $args['unit'] ) && ! empty( $args['show_units'] ) && count( $args['units'] ) > 1 ) { + echo '
        '; + echo ''; + echo '
        '; + } + + echo '
        '; + + echo $this->field_after(); + + } + + public function output() { + + $output = ''; + $element = ( is_array( $this->field['output'] ) ) ? join( ',', $this->field['output'] ) : $this->field['output']; + $important = ( ! empty( $this->field['output_important'] ) ) ? '!important' : ''; + $unit = ( ! empty( $this->value['unit'] ) ) ? $this->value['unit'] : 'px'; + + $mode = ( ! empty( $this->field['output_mode'] ) ) ? $this->field['output_mode'] : 'padding'; + + if ( $mode === 'border-radius' || $mode === 'radius' ) { + + $top = 'border-top-left-radius'; + $right = 'border-top-right-radius'; + $bottom = 'border-bottom-right-radius'; + $left = 'border-bottom-left-radius'; + + } else if ( $mode === 'relative' || $mode === 'absolute' || $mode === 'none' ) { + + $top = 'top'; + $right = 'right'; + $bottom = 'bottom'; + $left = 'left'; + + } else { + + $top = $mode .'-top'; + $right = $mode .'-right'; + $bottom = $mode .'-bottom'; + $left = $mode .'-left'; + + } + + if ( ! empty( $this->field['all'] ) && isset( $this->value['all'] ) && $this->value['all'] !== '' ) { + + $output = $element .'{'; + $output .= $top .':'. $this->value['all'] . $unit . $important .';'; + $output .= $right .':'. $this->value['all'] . $unit . $important .';'; + $output .= $bottom .':'. $this->value['all'] . $unit . $important .';'; + $output .= $left .':'. $this->value['all'] . $unit . $important .';'; + $output .= '}'; + + } else { + + $top = ( isset( $this->value['top'] ) && $this->value['top'] !== '' ) ? $top .':'. $this->value['top'] . $unit . $important .';' : ''; + $right = ( isset( $this->value['right'] ) && $this->value['right'] !== '' ) ? $right .':'. $this->value['right'] . $unit . $important .';' : ''; + $bottom = ( isset( $this->value['bottom'] ) && $this->value['bottom'] !== '' ) ? $bottom .':'. $this->value['bottom'] . $unit . $important .';' : ''; + $left = ( isset( $this->value['left'] ) && $this->value['left'] !== '' ) ? $left .':'. $this->value['left'] . $unit . $important .';' : ''; + + if ( $top !== '' || $right !== '' || $bottom !== '' || $left !== '' ) { + $output = $element .'{'. $top . $right . $bottom . $left .'}'; + } + + } + + $this->parent->output_css .= $output; + + return $output; + + } + + } +} diff --git a/framework/fields/spinner/spinner.php b/framework/fields/spinner/spinner.php new file mode 100644 index 0000000..3e657a8 --- /dev/null +++ b/framework/fields/spinner/spinner.php @@ -0,0 +1,70 @@ +field, array( + 'max' => 100, + 'min' => 0, + 'step' => 1, + 'unit' => '', + ) ); + + echo $this->field_before(); + + echo '
        field_attributes( array( 'class' => 'wp_china_yes-input-number' ) ) .' data-min="'. esc_attr( $args['min'] ) .'" data-max="'. esc_attr( $args['max'] ) .'" data-step="'. esc_attr( $args['step'] ) .'" data-unit="'. esc_attr( $args['unit'] ) .'" step="any" />
        '; + + echo $this->field_after(); + + } + + public function enqueue() { + + if ( ! wp_script_is( 'jquery-ui-spinner' ) ) { + wp_enqueue_script( 'jquery-ui-spinner' ); + } + + } + + public function output() { + + $output = ''; + $elements = ( is_array( $this->field['output'] ) ) ? $this->field['output'] : array_filter( (array) $this->field['output'] ); + $important = ( ! empty( $this->field['output_important'] ) ) ? '!important' : ''; + $mode = ( ! empty( $this->field['output_mode'] ) ) ? $this->field['output_mode'] : 'width'; + $unit = ( ! empty( $this->field['unit'] ) ) ? $this->field['unit'] : 'px'; + + if ( ! empty( $elements ) && isset( $this->value ) && $this->value !== '' ) { + foreach ( $elements as $key_property => $element ) { + if ( is_numeric( $key_property ) ) { + if ( $mode ) { + $output = implode( ',', $elements ) .'{'. $mode .':'. $this->value . $unit . $important .';}'; + } + break; + } else { + $output .= $element .'{'. $key_property .':'. $this->value . $unit . $important .'}'; + } + } + } + + $this->parent->output_css .= $output; + + return $output; + + } + + } +} diff --git a/framework/fields/subheading/subheading.php b/framework/fields/subheading/subheading.php new file mode 100644 index 0000000..9cf27c6 --- /dev/null +++ b/framework/fields/subheading/subheading.php @@ -0,0 +1,24 @@ +field['content'] ) ) ? $this->field['content'] : ''; + + } + + } +} diff --git a/framework/fields/submessage/submessage.php b/framework/fields/submessage/submessage.php new file mode 100644 index 0000000..4d34b09 --- /dev/null +++ b/framework/fields/submessage/submessage.php @@ -0,0 +1,26 @@ +field['style'] ) ) ? $this->field['style'] : 'normal'; + + echo '
        '. $this->field['content'] .'
        '; + + } + + } +} diff --git a/framework/fields/switcher/switcher.php b/framework/fields/switcher/switcher.php new file mode 100644 index 0000000..f2b41b2 --- /dev/null +++ b/framework/fields/switcher/switcher.php @@ -0,0 +1,40 @@ +value ) ) ? ' wp_china_yes--active' : ''; + $text_on = ( ! empty( $this->field['text_on'] ) ) ? $this->field['text_on'] : esc_html__( 'On', 'wp_china_yes' ); + $text_off = ( ! empty( $this->field['text_off'] ) ) ? $this->field['text_off'] : esc_html__( 'Off', 'wp_china_yes' ); + $text_width = ( ! empty( $this->field['text_width'] ) ) ? ' style="width: '. esc_attr( $this->field['text_width'] ) .'px;"': ''; + + echo $this->field_before(); + + echo '
        '; + echo ''. esc_attr( $text_on ) .''; + echo ''. esc_attr( $text_off ) .''; + echo ''; + echo 'field_attributes() .' />'; + echo '
        '; + + echo ( ! empty( $this->field['label'] ) ) ? ''. esc_attr( $this->field['label'] ) . '' : ''; + + echo $this->field_after(); + + } + + } +} diff --git a/framework/fields/tabbed/tabbed.php b/framework/fields/tabbed/tabbed.php new file mode 100644 index 0000000..240aa1c --- /dev/null +++ b/framework/fields/tabbed/tabbed.php @@ -0,0 +1,64 @@ +field_before(); + + echo '
        '; + foreach ( $this->field['tabs'] as $key => $tab ) { + + $tabbed_icon = ( ! empty( $tab['icon'] ) ) ? '' : ''; + $tabbed_active = ( empty( $key ) ) ? 'wp_china_yes-tabbed-active' : ''; + + echo ''. $tabbed_icon . esc_attr( $tab['title'] ) .''; + + } + echo '
        '; + + echo '
        '; + foreach ( $this->field['tabs'] as $key => $tab ) { + + $tabbed_hidden = ( ! empty( $key ) ) ? ' hidden' : ''; + + echo '
        '; + + foreach ( $tab['fields'] as $field ) { + + if ( in_array( $field['type'], $unallows ) ) { $field['_notice'] = true; } + + $field_id = ( isset( $field['id'] ) ) ? $field['id'] : ''; + $field_default = ( isset( $field['default'] ) ) ? $field['default'] : ''; + $field_value = ( isset( $this->value[$field_id] ) ) ? $this->value[$field_id] : $field_default; + $unique_id = ( ! empty( $this->unique ) ) ? $this->unique .'['. $this->field['id'] .']' : $this->field['id']; + + WP_CHINA_YES::field( $field, $field_value, $unique_id, 'field/tabbed' ); + + } + + echo '
        '; + + } + echo '
        '; + + echo $this->field_after(); + + } + + } +} diff --git a/framework/fields/text/text.php b/framework/fields/text/text.php new file mode 100644 index 0000000..3daffc9 --- /dev/null +++ b/framework/fields/text/text.php @@ -0,0 +1,30 @@ +field['attributes']['type'] ) ) ? $this->field['attributes']['type'] : 'text'; + + echo $this->field_before(); + + echo 'field_attributes() .' />'; + + echo $this->field_after(); + + } + + } +} diff --git a/framework/fields/textarea/textarea.php b/framework/fields/textarea/textarea.php new file mode 100644 index 0000000..b67fbe3 --- /dev/null +++ b/framework/fields/textarea/textarea.php @@ -0,0 +1,58 @@ +field_before(); + echo $this->shortcoder(); + echo ''; + echo $this->field_after(); + + } + + public function shortcoder() { + + if ( ! empty( $this->field['shortcoder'] ) ) { + + $shortcodes = ( is_array( $this->field['shortcoder'] ) ) ? $this->field['shortcoder'] : array_filter( (array) $this->field['shortcoder'] ); + $instances = ( ! empty( WP_CHINA_YES::$shortcode_instances ) ) ? WP_CHINA_YES::$shortcode_instances : array(); + + if ( ! empty( $shortcodes ) && ! empty( $instances ) ) { + + foreach ( $shortcodes as $shortcode ) { + + foreach ( $instances as $instance ) { + + if ( $instance['modal_id'] === $shortcode ) { + + $id = $instance['modal_id']; + $title = $instance['button_title']; + + echo ''. esc_html( $title ) .''; + + } + + } + + } + + } + + } + + } + } +} diff --git a/framework/fields/typography/google-fonts.php b/framework/fields/typography/google-fonts.php new file mode 100644 index 0000000..b7cad4d --- /dev/null +++ b/framework/fields/typography/google-fonts.php @@ -0,0 +1,1607 @@ +[['normal','italic'],['latin','latin-ext']], + 'ADLaM Display'=>[['normal'],['adlam','latin','latin-ext']], + 'AR One Sans'=>[['normal','500','600','700'],['latin','latin-ext','vietnamese']], + 'Abel'=>[['normal'],['latin']], + 'Abhaya Libre'=>[['normal','500','600','700','800'],['latin','latin-ext','sinhala']], + 'Aboreto'=>[['normal'],['latin','latin-ext']], + 'Abril Fatface'=>[['normal'],['latin','latin-ext']], + 'Abyssinica SIL'=>[['normal'],['ethiopic','latin','latin-ext']], + 'Aclonica'=>[['normal'],['latin']], + 'Acme'=>[['normal'],['latin']], + 'Actor'=>[['normal'],['latin']], + 'Adamina'=>[['normal'],['latin']], + 'Advent Pro'=>[['100','200','300','normal','500','600','700','800','900','100italic','200italic','300italic','italic','500italic','600italic','700italic','800italic','900italic'],['cyrillic','cyrillic-ext','greek','latin','latin-ext']], + 'Afacad'=>[['normal','500','600','700','italic','500italic','600italic','700italic'],['cyrillic-ext','latin','latin-ext','math','symbols','vietnamese']], + 'Agbalumo'=>[['normal'],['cyrillic-ext','latin','latin-ext','vietnamese']], + 'Agdasima'=>[['normal','700'],['latin','latin-ext']], + 'Aguafina Script'=>[['normal'],['latin','latin-ext']], + 'Akatab'=>[['normal','500','600','700','800','900'],['latin','latin-ext','tifinagh']], + 'Akaya Kanadaka'=>[['normal'],['kannada','latin','latin-ext']], + 'Akaya Telivigala'=>[['normal'],['latin','latin-ext','telugu']], + 'Akronim'=>[['normal'],['latin','latin-ext']], + 'Akshar'=>[['300','normal','500','600','700'],['devanagari','latin','latin-ext']], + 'Aladin'=>[['normal'],['latin','latin-ext']], + 'Alata'=>[['normal'],['latin','latin-ext','vietnamese']], + 'Alatsi'=>[['normal'],['cyrillic-ext','latin','latin-ext','vietnamese']], + 'Albert Sans'=>[['100','200','300','normal','500','600','700','800','900','100italic','200italic','300italic','italic','500italic','600italic','700italic','800italic','900italic'],['latin','latin-ext']], + 'Aldrich'=>[['normal'],['latin']], + 'Alef'=>[['normal','700'],['hebrew','latin']], + 'Alegreya'=>[['normal','500','600','700','800','900','italic','500italic','600italic','700italic','800italic','900italic'],['cyrillic','cyrillic-ext','greek','greek-ext','latin','latin-ext','vietnamese']], + 'Alegreya SC'=>[['normal','italic','500','500italic','700','700italic','800','800italic','900','900italic'],['cyrillic','cyrillic-ext','greek','greek-ext','latin','latin-ext','vietnamese']], + 'Alegreya Sans'=>[['100','100italic','300','300italic','normal','italic','500','500italic','700','700italic','800','800italic','900','900italic'],['cyrillic','cyrillic-ext','greek','greek-ext','latin','latin-ext','vietnamese']], + 'Alegreya Sans SC'=>[['100','100italic','300','300italic','normal','italic','500','500italic','700','700italic','800','800italic','900','900italic'],['cyrillic','cyrillic-ext','greek','greek-ext','latin','latin-ext','vietnamese']], + 'Aleo'=>[['100','200','300','normal','500','600','700','800','900','100italic','200italic','300italic','italic','500italic','600italic','700italic','800italic','900italic'],['latin','latin-ext','vietnamese']], + 'Alex Brush'=>[['normal'],['latin','latin-ext','vietnamese']], + 'Alexandria'=>[['100','200','300','normal','500','600','700','800','900'],['arabic','latin','latin-ext','vietnamese']], + 'Alfa Slab One'=>[['normal'],['latin','latin-ext','vietnamese']], + 'Alice'=>[['normal'],['cyrillic','cyrillic-ext','latin','latin-ext']], + 'Alike'=>[['normal'],['latin','latin-ext','math','symbols']], + 'Alike Angular'=>[['normal'],['latin','latin-ext','math','symbols']], + 'Alkalami'=>[['normal'],['arabic','latin','latin-ext']], + 'Alkatra'=>[['normal','500','600','700'],['bengali','devanagari','latin','latin-ext','oriya']], + 'Allan'=>[['normal','700'],['latin','latin-ext']], + 'Allerta'=>[['normal'],['latin']], + 'Allerta Stencil'=>[['normal'],['latin']], + 'Allison'=>[['normal'],['latin','latin-ext','vietnamese']], + 'Allura'=>[['normal'],['latin','latin-ext','vietnamese']], + 'Almarai'=>[['300','normal','700','800'],['arabic']], + 'Almendra'=>[['normal','italic','700','700italic'],['latin','latin-ext']], + 'Almendra Display'=>[['normal'],['latin','latin-ext']], + 'Almendra SC'=>[['normal'],['latin']], + 'Alumni Sans'=>[['100','200','300','normal','500','600','700','800','900','100italic','200italic','300italic','italic','500italic','600italic','700italic','800italic','900italic'],['cyrillic','cyrillic-ext','latin','latin-ext','vietnamese']], + 'Alumni Sans Collegiate One'=>[['normal','italic'],['cyrillic','latin','latin-ext','vietnamese']], + 'Alumni Sans Inline One'=>[['normal','italic'],['latin','latin-ext','vietnamese']], + 'Alumni Sans Pinstripe'=>[['normal','italic'],['cyrillic','cyrillic-ext','latin','latin-ext','vietnamese']], + 'Amarante'=>[['normal'],['latin','latin-ext']], + 'Amaranth'=>[['normal','italic','700','700italic'],['latin']], + 'Amatic SC'=>[['normal','700'],['cyrillic','hebrew','latin','latin-ext','vietnamese']], + 'Amethysta'=>[['normal'],['latin']], + 'Amiko'=>[['normal','600','700'],['devanagari','latin','latin-ext']], + 'Amiri'=>[['normal','italic','700','700italic'],['arabic','latin','latin-ext']], + 'Amiri Quran'=>[['normal'],['arabic','latin']], + 'Amita'=>[['normal','700'],['devanagari','latin','latin-ext']], + 'Anaheim'=>[['normal'],['latin','latin-ext']], + 'Andada Pro'=>[['normal','500','600','700','800','italic','500italic','600italic','700italic','800italic'],['latin','latin-ext','vietnamese']], + 'Andika'=>[['normal','italic','700','700italic'],['cyrillic','cyrillic-ext','latin','latin-ext','vietnamese']], + 'Anek Bangla'=>[['100','200','300','normal','500','600','700','800'],['bengali','latin','latin-ext']], + 'Anek Devanagari'=>[['100','200','300','normal','500','600','700','800'],['devanagari','latin','latin-ext']], + 'Anek Gujarati'=>[['100','200','300','normal','500','600','700','800'],['gujarati','latin','latin-ext']], + 'Anek Gurmukhi'=>[['100','200','300','normal','500','600','700','800'],['gurmukhi','latin','latin-ext']], + 'Anek Kannada'=>[['100','200','300','normal','500','600','700','800'],['kannada','latin','latin-ext']], + 'Anek Latin'=>[['100','200','300','normal','500','600','700','800'],['latin','latin-ext','vietnamese']], + 'Anek Malayalam'=>[['100','200','300','normal','500','600','700','800'],['latin','latin-ext','malayalam']], + 'Anek Odia'=>[['100','200','300','normal','500','600','700','800'],['latin','latin-ext','oriya']], + 'Anek Tamil'=>[['100','200','300','normal','500','600','700','800'],['latin','latin-ext','tamil']], + 'Anek Telugu'=>[['100','200','300','normal','500','600','700','800'],['latin','latin-ext','telugu']], + 'Angkor'=>[['normal'],['khmer','latin']], + 'Annie Use Your Telescope'=>[['normal'],['latin']], + 'Anonymous Pro'=>[['normal','italic','700','700italic'],['cyrillic','greek','latin','latin-ext']], + 'Antic'=>[['normal'],['latin']], + 'Antic Didone'=>[['normal'],['latin']], + 'Antic Slab'=>[['normal'],['latin']], + 'Anton'=>[['normal'],['latin','latin-ext','vietnamese']], + 'Antonio'=>[['100','200','300','normal','500','600','700'],['latin','latin-ext']], + 'Anuphan'=>[['100','200','300','normal','500','600','700'],['cyrillic-ext','latin','latin-ext','thai','vietnamese']], + 'Anybody'=>[['100','200','300','normal','500','600','700','800','900','100italic','200italic','300italic','italic','500italic','600italic','700italic','800italic','900italic'],['latin','latin-ext','vietnamese']], + 'Aoboshi One'=>[['normal'],['japanese','latin','latin-ext']], + 'Arapey'=>[['normal','italic'],['latin']], + 'Arbutus'=>[['normal'],['latin','latin-ext']], + 'Arbutus Slab'=>[['normal'],['latin','latin-ext']], + 'Architects Daughter'=>[['normal'],['latin']], + 'Archivo'=>[['100','200','300','normal','500','600','700','800','900','100italic','200italic','300italic','italic','500italic','600italic','700italic','800italic','900italic'],['latin','latin-ext','vietnamese']], + 'Archivo Black'=>[['normal'],['latin','latin-ext']], + 'Archivo Narrow'=>[['normal','500','600','700','italic','500italic','600italic','700italic'],['latin','latin-ext','vietnamese']], + 'Are You Serious'=>[['normal'],['latin','latin-ext','vietnamese']], + 'Aref Ruqaa'=>[['normal','700'],['arabic','latin','latin-ext']], + 'Aref Ruqaa Ink'=>[['normal','700'],['arabic','latin','latin-ext']], + 'Arima'=>[['100','200','300','normal','500','600','700'],['greek','greek-ext','latin','latin-ext','malayalam','tamil','vietnamese']], + 'Arimo'=>[['normal','500','600','700','italic','500italic','600italic','700italic'],['cyrillic','cyrillic-ext','greek','greek-ext','hebrew','latin','latin-ext','vietnamese']], + 'Arizonia'=>[['normal'],['latin','latin-ext','vietnamese']], + 'Armata'=>[['normal'],['latin','latin-ext']], + 'Arsenal'=>[['normal','italic','700','700italic'],['cyrillic','cyrillic-ext','latin','latin-ext','vietnamese']], + 'Artifika'=>[['normal'],['latin']], + 'Arvo'=>[['normal','italic','700','700italic'],['latin']], + 'Arya'=>[['normal','700'],['devanagari','latin','latin-ext']], + 'Asap'=>[['100','200','300','normal','500','600','700','800','900','100italic','200italic','300italic','italic','500italic','600italic','700italic','800italic','900italic'],['latin','latin-ext','vietnamese']], + 'Asap Condensed'=>[['200','200italic','300','300italic','normal','italic','500','500italic','600','600italic','700','700italic','800','800italic','900','900italic'],['latin','latin-ext','vietnamese']], + 'Asar'=>[['normal'],['devanagari','latin','latin-ext']], + 'Asset'=>[['normal'],['latin']], + 'Assistant'=>[['200','300','normal','500','600','700','800'],['hebrew','latin','latin-ext']], + 'Astloch'=>[['normal','700'],['latin']], + 'Asul'=>[['normal','700'],['latin']], + 'Athiti'=>[['200','300','normal','500','600','700'],['latin','latin-ext','thai','vietnamese']], + 'Atkinson Hyperlegible'=>[['normal','italic','700','700italic'],['latin','latin-ext']], + 'Atma'=>[['300','normal','500','600','700'],['bengali','latin','latin-ext']], + 'Atomic Age'=>[['normal'],['latin']], + 'Aubrey'=>[['normal'],['latin']], + 'Audiowide'=>[['normal'],['latin','latin-ext']], + 'Autour One'=>[['normal'],['latin','latin-ext']], + 'Average'=>[['normal'],['latin','latin-ext']], + 'Average Sans'=>[['normal'],['latin','latin-ext']], + 'Averia Gruesa Libre'=>[['normal'],['latin','latin-ext']], + 'Averia Libre'=>[['300','300italic','normal','italic','700','700italic'],['latin']], + 'Averia Sans Libre'=>[['300','300italic','normal','italic','700','700italic'],['latin']], + 'Averia Serif Libre'=>[['300','300italic','normal','italic','700','700italic'],['latin']], + 'Azeret Mono'=>[['100','200','300','normal','500','600','700','800','900','100italic','200italic','300italic','italic','500italic','600italic','700italic','800italic','900italic'],['latin','latin-ext']], + 'B612'=>[['normal','italic','700','700italic'],['latin']], + 'B612 Mono'=>[['normal','italic','700','700italic'],['latin']], + 'BIZ UDGothic'=>[['normal','700'],['cyrillic','greek-ext','japanese','latin','latin-ext']], + 'BIZ UDMincho'=>[['normal','700'],['cyrillic','greek-ext','japanese','latin','latin-ext']], + 'BIZ UDPGothic'=>[['normal','700'],['cyrillic','greek-ext','japanese','latin','latin-ext']], + 'BIZ UDPMincho'=>[['normal','700'],['cyrillic','greek-ext','japanese','latin','latin-ext']], + 'Babylonica'=>[['normal'],['latin','latin-ext','vietnamese']], + 'Bacasime Antique'=>[['normal'],['latin','latin-ext']], + 'Bad Script'=>[['normal'],['cyrillic','latin']], + 'Bagel Fat One'=>[['normal'],['korean','latin','latin-ext']], + 'Bahiana'=>[['normal'],['latin','latin-ext']], + 'Bahianita'=>[['normal'],['latin','latin-ext','vietnamese']], + 'Bai Jamjuree'=>[['200','200italic','300','300italic','normal','italic','500','500italic','600','600italic','700','700italic'],['latin','latin-ext','thai','vietnamese']], + 'Bakbak One'=>[['normal'],['devanagari','latin','latin-ext']], + 'Ballet'=>[['normal'],['latin','latin-ext','vietnamese']], + 'Baloo 2'=>[['normal','500','600','700','800'],['devanagari','latin','latin-ext','vietnamese']], + 'Baloo Bhai 2'=>[['normal','500','600','700','800'],['gujarati','latin','latin-ext','vietnamese']], + 'Baloo Bhaijaan 2'=>[['normal','500','600','700','800'],['arabic','latin','latin-ext','vietnamese']], + 'Baloo Bhaina 2'=>[['normal','500','600','700','800'],['latin','latin-ext','oriya','vietnamese']], + 'Baloo Chettan 2'=>[['normal','500','600','700','800'],['latin','latin-ext','malayalam','vietnamese']], + 'Baloo Da 2'=>[['normal','500','600','700','800'],['bengali','latin','latin-ext','vietnamese']], + 'Baloo Paaji 2'=>[['normal','500','600','700','800'],['gurmukhi','latin','latin-ext','vietnamese']], + 'Baloo Tamma 2'=>[['normal','500','600','700','800'],['kannada','latin','latin-ext','vietnamese']], + 'Baloo Tammudu 2'=>[['normal','500','600','700','800'],['latin','latin-ext','telugu','vietnamese']], + 'Baloo Thambi 2'=>[['normal','500','600','700','800'],['latin','latin-ext','tamil','vietnamese']], + 'Balsamiq Sans'=>[['normal','italic','700','700italic'],['cyrillic','cyrillic-ext','latin','latin-ext']], + 'Balthazar'=>[['normal'],['latin']], + 'Bangers'=>[['normal'],['latin','latin-ext','vietnamese']], + 'Barlow'=>[['100','100italic','200','200italic','300','300italic','normal','italic','500','500italic','600','600italic','700','700italic','800','800italic','900','900italic'],['latin','latin-ext','vietnamese']], + 'Barlow Condensed'=>[['100','100italic','200','200italic','300','300italic','normal','italic','500','500italic','600','600italic','700','700italic','800','800italic','900','900italic'],['latin','latin-ext','vietnamese']], + 'Barlow Semi Condensed'=>[['100','100italic','200','200italic','300','300italic','normal','italic','500','500italic','600','600italic','700','700italic','800','800italic','900','900italic'],['latin','latin-ext','vietnamese']], + 'Barriecito'=>[['normal'],['latin','latin-ext','vietnamese']], + 'Barrio'=>[['normal'],['latin','latin-ext']], + 'Basic'=>[['normal'],['latin','latin-ext']], + 'Baskervville'=>[['normal','italic'],['latin','latin-ext']], + 'Battambang'=>[['100','300','normal','700','900'],['khmer','latin']], + 'Baumans'=>[['normal'],['latin']], + 'Bayon'=>[['normal'],['khmer','latin']], + 'Be Vietnam Pro'=>[['100','100italic','200','200italic','300','300italic','normal','italic','500','500italic','600','600italic','700','700italic','800','800italic','900','900italic'],['latin','latin-ext','vietnamese']], + 'Beau Rivage'=>[['normal'],['latin','latin-ext','vietnamese']], + 'Bebas Neue'=>[['normal'],['latin','latin-ext']], + 'Belanosima'=>[['normal','600','700'],['latin','latin-ext']], + 'Belgrano'=>[['normal'],['latin']], + 'Bellefair'=>[['normal'],['hebrew','latin','latin-ext']], + 'Belleza'=>[['normal'],['latin','latin-ext']], + 'Bellota'=>[['300','300italic','normal','italic','700','700italic'],['cyrillic','latin','latin-ext','vietnamese']], + 'Bellota Text'=>[['300','300italic','normal','italic','700','700italic'],['cyrillic','latin','latin-ext','vietnamese']], + 'BenchNine'=>[['300','normal','700'],['latin','latin-ext']], + 'Benne'=>[['normal'],['kannada','latin','latin-ext']], + 'Bentham'=>[['normal'],['latin']], + 'Berkshire Swash'=>[['normal'],['latin','latin-ext']], + 'Besley'=>[['normal','500','600','700','800','900','italic','500italic','600italic','700italic','800italic','900italic'],['latin','latin-ext']], + 'Beth Ellen'=>[['normal'],['latin']], + 'Bevan'=>[['normal','italic'],['latin','latin-ext','vietnamese']], + 'BhuTuka Expanded One'=>[['normal'],['gurmukhi','latin','latin-ext']], + 'Big Shoulders Display'=>[['100','200','300','normal','500','600','700','800','900'],['latin','latin-ext','vietnamese']], + 'Big Shoulders Inline Display'=>[['100','200','300','normal','500','600','700','800','900'],['latin','latin-ext','vietnamese']], + 'Big Shoulders Inline Text'=>[['100','200','300','normal','500','600','700','800','900'],['latin','latin-ext','vietnamese']], + 'Big Shoulders Stencil Display'=>[['100','200','300','normal','500','600','700','800','900'],['latin','latin-ext','vietnamese']], + 'Big Shoulders Stencil Text'=>[['100','200','300','normal','500','600','700','800','900'],['latin','latin-ext','vietnamese']], + 'Big Shoulders Text'=>[['100','200','300','normal','500','600','700','800','900'],['latin','latin-ext','vietnamese']], + 'Bigelow Rules'=>[['normal'],['latin','latin-ext']], + 'Bigshot One'=>[['normal'],['latin']], + 'Bilbo'=>[['normal'],['latin','latin-ext','vietnamese']], + 'Bilbo Swash Caps'=>[['normal'],['latin','latin-ext']], + 'BioRhyme'=>[['200','300','normal','500','600','700','800'],['latin','latin-ext']], + 'BioRhyme Expanded'=>[['200','300','normal','700','800'],['latin','latin-ext']], + 'Birthstone'=>[['normal'],['latin','latin-ext','vietnamese']], + 'Birthstone Bounce'=>[['normal','500'],['latin','latin-ext','vietnamese']], + 'Biryani'=>[['200','300','normal','600','700','800','900'],['devanagari','latin','latin-ext']], + 'Bitter'=>[['100','200','300','normal','500','600','700','800','900','100italic','200italic','300italic','italic','500italic','600italic','700italic','800italic','900italic'],['cyrillic','cyrillic-ext','latin','latin-ext','vietnamese']], + 'Black And White Picture'=>[['normal'],['korean','latin']], + 'Black Han Sans'=>[['normal'],['korean','latin']], + 'Black Ops One'=>[['normal'],['cyrillic-ext','latin','latin-ext','vietnamese']], + 'Blaka'=>[['normal'],['arabic','latin','latin-ext']], + 'Blaka Hollow'=>[['normal'],['arabic','latin','latin-ext']], + 'Blaka Ink'=>[['normal'],['arabic','latin','latin-ext']], + 'Blinker'=>[['100','200','300','normal','600','700','800','900'],['latin','latin-ext']], + 'Bodoni Moda'=>[['normal','500','600','700','800','900','italic','500italic','600italic','700italic','800italic','900italic'],['latin','latin-ext']], + 'Bokor'=>[['normal'],['khmer','latin']], + 'Bona Nova'=>[['normal','italic','700'],['cyrillic','cyrillic-ext','greek','hebrew','latin','latin-ext','vietnamese']], + 'Bonbon'=>[['normal'],['latin']], + 'Bonheur Royale'=>[['normal'],['latin','latin-ext','vietnamese']], + 'Boogaloo'=>[['normal'],['latin']], + 'Borel'=>[['normal'],['latin','latin-ext','math','symbols','vietnamese']], + 'Bowlby One'=>[['normal'],['latin']], + 'Bowlby One SC'=>[['normal'],['latin','latin-ext']], + 'Braah One'=>[['normal'],['gurmukhi','latin','latin-ext','vietnamese']], + 'Brawler'=>[['normal','700'],['latin']], + 'Bree Serif'=>[['normal'],['latin','latin-ext']], + 'Bricolage Grotesque'=>[['200','300','normal','500','600','700','800'],['cyrillic-ext','latin','latin-ext','vietnamese']], + 'Bruno Ace'=>[['normal'],['latin','latin-ext']], + 'Bruno Ace SC'=>[['normal'],['latin','latin-ext']], + 'Brygada 1918'=>[['normal','500','600','700','italic','500italic','600italic','700italic'],['cyrillic','cyrillic-ext','greek','latin','latin-ext','vietnamese']], + 'Bubblegum Sans'=>[['normal'],['latin','latin-ext']], + 'Bubbler One'=>[['normal'],['latin','latin-ext']], + 'Buda'=>[['300'],['latin']], + 'Buenard'=>[['normal','700'],['latin','latin-ext']], + 'Bungee'=>[['normal'],['latin','latin-ext','vietnamese']], + 'Bungee Hairline'=>[['normal'],['latin','latin-ext','vietnamese']], + 'Bungee Inline'=>[['normal'],['latin','latin-ext','vietnamese']], + 'Bungee Outline'=>[['normal'],['latin','latin-ext','vietnamese']], + 'Bungee Shade'=>[['normal'],['latin','latin-ext','vietnamese']], + 'Bungee Spice'=>[['normal'],['latin','latin-ext','vietnamese']], + 'Butcherman'=>[['normal'],['latin','latin-ext']], + 'Butterfly Kids'=>[['normal'],['latin','latin-ext']], + 'Cabin'=>[['normal','500','600','700','italic','500italic','600italic','700italic'],['latin','latin-ext','vietnamese']], + 'Cabin Condensed'=>[['normal','500','600','700'],['latin','latin-ext','vietnamese']], + 'Cabin Sketch'=>[['normal','700'],['latin']], + 'Caesar Dressing'=>[['normal'],['latin']], + 'Cagliostro'=>[['normal'],['latin']], + 'Cairo'=>[['200','300','normal','500','600','700','800','900'],['arabic','latin','latin-ext']], + 'Cairo Play'=>[['200','300','normal','500','600','700','800','900'],['arabic','latin','latin-ext']], + 'Caladea'=>[['normal','italic','700','700italic'],['latin','latin-ext']], + 'Calistoga'=>[['normal'],['latin','latin-ext','vietnamese']], + 'Calligraffitti'=>[['normal'],['latin']], + 'Cambay'=>[['normal','italic','700','700italic'],['devanagari','latin','latin-ext']], + 'Cambo'=>[['normal'],['latin','latin-ext']], + 'Candal'=>[['normal'],['latin']], + 'Cantarell'=>[['normal','italic','700','700italic'],['latin','latin-ext']], + 'Cantata One'=>[['normal'],['latin','latin-ext']], + 'Cantora One'=>[['normal'],['latin','latin-ext']], + 'Caprasimo'=>[['normal'],['latin','latin-ext']], + 'Capriola'=>[['normal'],['latin','latin-ext']], + 'Caramel'=>[['normal'],['latin','latin-ext','vietnamese']], + 'Carattere'=>[['normal'],['latin','latin-ext','vietnamese']], + 'Cardo'=>[['normal','italic','700'],['greek','greek-ext','latin','latin-ext']], + 'Carlito'=>[['normal','italic','700','700italic'],['cyrillic','cyrillic-ext','greek','greek-ext','latin','latin-ext','vietnamese']], + 'Carme'=>[['normal'],['latin']], + 'Carrois Gothic'=>[['normal'],['latin']], + 'Carrois Gothic SC'=>[['normal'],['latin']], + 'Carter One'=>[['normal'],['latin']], + 'Castoro'=>[['normal','italic'],['latin','latin-ext']], + 'Castoro Titling'=>[['normal'],['latin','latin-ext']], + 'Catamaran'=>[['100','200','300','normal','500','600','700','800','900'],['latin','latin-ext','tamil']], + 'Caudex'=>[['normal','italic','700','700italic'],['greek','greek-ext','latin','latin-ext']], + 'Caveat'=>[['normal','500','600','700'],['cyrillic','cyrillic-ext','latin','latin-ext']], + 'Caveat Brush'=>[['normal'],['latin','latin-ext']], + 'Cedarville Cursive'=>[['normal'],['latin']], + 'Ceviche One'=>[['normal'],['latin','latin-ext']], + 'Chakra Petch'=>[['300','300italic','normal','italic','500','500italic','600','600italic','700','700italic'],['latin','latin-ext','thai','vietnamese']], + 'Changa'=>[['200','300','normal','500','600','700','800'],['arabic','latin','latin-ext']], + 'Changa One'=>[['normal','italic'],['latin']], + 'Chango'=>[['normal'],['latin','latin-ext']], + 'Charis SIL'=>[['normal','italic','700','700italic'],['cyrillic','cyrillic-ext','latin','latin-ext','vietnamese']], + 'Charm'=>[['normal','700'],['latin','latin-ext','thai','vietnamese']], + 'Charmonman'=>[['normal','700'],['latin','latin-ext','thai','vietnamese']], + 'Chathura'=>[['100','300','normal','700','800'],['latin','telugu']], + 'Chau Philomene One'=>[['normal','italic'],['latin','latin-ext']], + 'Chela One'=>[['normal'],['latin','latin-ext']], + 'Chelsea Market'=>[['normal'],['latin','latin-ext']], + 'Chenla'=>[['normal'],['khmer']], + 'Cherish'=>[['normal'],['latin','latin-ext','vietnamese']], + 'Cherry Bomb One'=>[['normal'],['japanese','latin','latin-ext','vietnamese']], + 'Cherry Cream Soda'=>[['normal'],['latin']], + 'Cherry Swash'=>[['normal','700'],['latin','latin-ext']], + 'Chewy'=>[['normal'],['latin']], + 'Chicle'=>[['normal'],['latin','latin-ext']], + 'Chilanka'=>[['normal'],['latin','latin-ext','malayalam']], + 'Chivo'=>[['100','200','300','normal','500','600','700','800','900','100italic','200italic','300italic','italic','500italic','600italic','700italic','800italic','900italic'],['latin','latin-ext','vietnamese']], + 'Chivo Mono'=>[['100','200','300','normal','500','600','700','800','900','100italic','200italic','300italic','italic','500italic','600italic','700italic','800italic','900italic'],['latin','latin-ext','vietnamese']], + 'Chokokutai'=>[['normal'],['japanese','latin','latin-ext','vietnamese']], + 'Chonburi'=>[['normal'],['latin','latin-ext','thai','vietnamese']], + 'Cinzel'=>[['normal','500','600','700','800','900'],['latin','latin-ext']], + 'Cinzel Decorative'=>[['normal','700','900'],['latin']], + 'Clicker Script'=>[['normal'],['latin','latin-ext']], + 'Climate Crisis'=>[['normal'],['latin','latin-ext']], + 'Coda'=>[['normal','800'],['latin','latin-ext']], + 'Codystar'=>[['300','normal'],['latin','latin-ext']], + 'Coiny'=>[['normal'],['latin','latin-ext','tamil','vietnamese']], + 'Combo'=>[['normal'],['latin','latin-ext']], + 'Comfortaa'=>[['300','normal','500','600','700'],['cyrillic','cyrillic-ext','greek','latin','latin-ext','vietnamese']], + 'Comforter'=>[['normal'],['cyrillic','latin','latin-ext','vietnamese']], + 'Comforter Brush'=>[['normal'],['cyrillic','latin','latin-ext','vietnamese']], + 'Comic Neue'=>[['300','300italic','normal','italic','700','700italic'],['latin']], + 'Coming Soon'=>[['normal'],['latin']], + 'Comme'=>[['100','200','300','normal','500','600','700','800','900'],['latin','latin-ext']], + 'Commissioner'=>[['100','200','300','normal','500','600','700','800','900'],['cyrillic','cyrillic-ext','greek','latin','latin-ext','vietnamese']], + 'Concert One'=>[['normal'],['latin','latin-ext']], + 'Condiment'=>[['normal'],['latin','latin-ext']], + 'Content'=>[['normal','700'],['khmer']], + 'Contrail One'=>[['normal'],['latin']], + 'Convergence'=>[['normal'],['latin','latin-ext']], + 'Cookie'=>[['normal'],['latin']], + 'Copse'=>[['normal'],['latin']], + 'Corben'=>[['normal','700'],['latin','latin-ext']], + 'Corinthia'=>[['normal','700'],['latin','latin-ext','vietnamese']], + 'Cormorant'=>[['300','normal','500','600','700','300italic','italic','500italic','600italic','700italic'],['cyrillic','cyrillic-ext','latin','latin-ext','vietnamese']], + 'Cormorant Garamond'=>[['300','300italic','normal','italic','500','500italic','600','600italic','700','700italic'],['cyrillic','cyrillic-ext','latin','latin-ext','vietnamese']], + 'Cormorant Infant'=>[['300','300italic','normal','italic','500','500italic','600','600italic','700','700italic'],['cyrillic','cyrillic-ext','latin','latin-ext','vietnamese']], + 'Cormorant SC'=>[['300','normal','500','600','700'],['cyrillic','cyrillic-ext','latin','latin-ext','vietnamese']], + 'Cormorant Unicase'=>[['300','normal','500','600','700'],['cyrillic','cyrillic-ext','latin','latin-ext','vietnamese']], + 'Cormorant Upright'=>[['300','normal','500','600','700'],['latin','latin-ext','vietnamese']], + 'Courgette'=>[['normal'],['latin','latin-ext']], + 'Courier Prime'=>[['normal','italic','700','700italic'],['latin','latin-ext']], + 'Cousine'=>[['normal','italic','700','700italic'],['cyrillic','cyrillic-ext','greek','greek-ext','hebrew','latin','latin-ext','vietnamese']], + 'Coustard'=>[['normal','900'],['latin']], + 'Covered By Your Grace'=>[['normal'],['latin']], + 'Crafty Girls'=>[['normal'],['latin']], + 'Creepster'=>[['normal'],['latin']], + 'Crete Round'=>[['normal','italic'],['latin','latin-ext']], + 'Crimson Pro'=>[['200','300','normal','500','600','700','800','900','200italic','300italic','italic','500italic','600italic','700italic','800italic','900italic'],['latin','latin-ext','vietnamese']], + 'Crimson Text'=>[['normal','italic','600','600italic','700','700italic'],['latin','latin-ext','vietnamese']], + 'Croissant One'=>[['normal'],['latin','latin-ext']], + 'Crushed'=>[['normal'],['latin']], + 'Cuprum'=>[['normal','500','600','700','italic','500italic','600italic','700italic'],['cyrillic','cyrillic-ext','latin','latin-ext','vietnamese']], + 'Cute Font'=>[['normal'],['korean','latin']], + 'Cutive'=>[['normal'],['latin','latin-ext']], + 'Cutive Mono'=>[['normal'],['latin','latin-ext']], + 'DM Mono'=>[['300','300italic','normal','italic','500','500italic'],['latin','latin-ext']], + 'DM Sans'=>[['100','200','300','normal','500','600','700','800','900','100italic','200italic','300italic','italic','500italic','600italic','700italic','800italic','900italic'],['latin','latin-ext']], + 'DM Serif Display'=>[['normal','italic'],['latin','latin-ext']], + 'DM Serif Text'=>[['normal','italic'],['latin','latin-ext']], + 'Dai Banna SIL'=>[['300','300italic','normal','italic','500','500italic','600','600italic','700','700italic'],['latin','latin-ext','new-tai-lue']], + 'Damion'=>[['normal'],['latin']], + 'Dancing Script'=>[['normal','500','600','700'],['latin','latin-ext','vietnamese']], + 'Dangrek'=>[['normal'],['khmer','latin']], + 'Darker Grotesque'=>[['300','normal','500','600','700','800','900'],['latin','latin-ext','vietnamese']], + 'Darumadrop One'=>[['normal'],['japanese','latin','latin-ext']], + 'David Libre'=>[['normal','500','700'],['hebrew','latin','latin-ext','vietnamese']], + 'Dawning of a New Day'=>[['normal'],['latin']], + 'Days One'=>[['normal'],['latin']], + 'Dekko'=>[['normal'],['devanagari','latin','latin-ext']], + 'Dela Gothic One'=>[['normal'],['cyrillic','greek','japanese','latin','latin-ext','vietnamese']], + 'Delicious Handrawn'=>[['normal'],['latin','latin-ext']], + 'Delius'=>[['normal'],['latin']], + 'Delius Swash Caps'=>[['normal'],['latin']], + 'Delius Unicase'=>[['normal','700'],['latin']], + 'Della Respira'=>[['normal'],['latin']], + 'Denk One'=>[['normal'],['cyrillic-ext','latin','latin-ext','vietnamese']], + 'Devonshire'=>[['normal'],['latin','latin-ext']], + 'Dhurjati'=>[['normal'],['latin','telugu']], + 'Didact Gothic'=>[['normal'],['cyrillic','cyrillic-ext','greek','greek-ext','latin','latin-ext']], + 'Diphylleia'=>[['normal'],['korean','latin','latin-ext']], + 'Diplomata'=>[['normal'],['latin','latin-ext']], + 'Diplomata SC'=>[['normal'],['latin','latin-ext']], + 'Do Hyeon'=>[['normal'],['korean','latin']], + 'Dokdo'=>[['normal'],['korean','latin']], + 'Domine'=>[['normal','500','600','700'],['latin','latin-ext']], + 'Donegal One'=>[['normal'],['latin','latin-ext']], + 'Dongle'=>[['300','normal','700'],['korean','latin','latin-ext','vietnamese']], + 'Doppio One'=>[['normal'],['latin','latin-ext']], + 'Dorsa'=>[['normal'],['latin']], + 'Dosis'=>[['200','300','normal','500','600','700','800'],['latin','latin-ext','vietnamese']], + 'DotGothic16'=>[['normal'],['cyrillic','japanese','latin','latin-ext']], + 'Dr Sugiyama'=>[['normal'],['latin','latin-ext']], + 'Duru Sans'=>[['normal'],['latin','latin-ext']], + 'DynaPuff'=>[['normal','500','600','700'],['cyrillic-ext','latin','latin-ext']], + 'Dynalight'=>[['normal'],['latin','latin-ext']], + 'EB Garamond'=>[['normal','500','600','700','800','italic','500italic','600italic','700italic','800italic'],['cyrillic','cyrillic-ext','greek','greek-ext','latin','latin-ext','vietnamese']], + 'Eagle Lake'=>[['normal'],['latin','latin-ext']], + 'East Sea Dokdo'=>[['normal'],['korean','latin']], + 'Eater'=>[['normal'],['latin','latin-ext']], + 'Economica'=>[['normal','italic','700','700italic'],['latin','latin-ext']], + 'Eczar'=>[['normal','500','600','700','800'],['devanagari','greek','greek-ext','latin','latin-ext']], + 'Edu NSW ACT Foundation'=>[['normal','500','600','700'],['latin']], + 'Edu QLD Beginner'=>[['normal','500','600','700'],['latin']], + 'Edu SA Beginner'=>[['normal','500','600','700'],['latin']], + 'Edu TAS Beginner'=>[['normal','500','600','700'],['latin']], + 'Edu VIC WA NT Beginner'=>[['normal','500','600','700'],['latin']], + 'El Messiri'=>[['normal','500','600','700'],['arabic','cyrillic','latin','latin-ext']], + 'Electrolize'=>[['normal'],['latin']], + 'Elsie'=>[['normal','900'],['latin','latin-ext']], + 'Elsie Swash Caps'=>[['normal','900'],['latin','latin-ext']], + 'Emblema One'=>[['normal'],['latin','latin-ext']], + 'Emilys Candy'=>[['normal'],['latin','latin-ext']], + 'Encode Sans'=>[['100','200','300','normal','500','600','700','800','900'],['latin','latin-ext','vietnamese']], + 'Encode Sans Condensed'=>[['100','200','300','normal','500','600','700','800','900'],['latin','latin-ext','vietnamese']], + 'Encode Sans Expanded'=>[['100','200','300','normal','500','600','700','800','900'],['latin','latin-ext','vietnamese']], + 'Encode Sans SC'=>[['100','200','300','normal','500','600','700','800','900'],['latin','latin-ext','vietnamese']], + 'Encode Sans Semi Condensed'=>[['100','200','300','normal','500','600','700','800','900'],['latin','latin-ext','vietnamese']], + 'Encode Sans Semi Expanded'=>[['100','200','300','normal','500','600','700','800','900'],['latin','latin-ext','vietnamese']], + 'Engagement'=>[['normal'],['latin']], + 'Englebert'=>[['normal'],['latin','latin-ext']], + 'Enriqueta'=>[['normal','500','600','700'],['latin','latin-ext']], + 'Ephesis'=>[['normal'],['latin','latin-ext','vietnamese']], + 'Epilogue'=>[['100','200','300','normal','500','600','700','800','900','100italic','200italic','300italic','italic','500italic','600italic','700italic','800italic','900italic'],['latin','latin-ext','vietnamese']], + 'Erica One'=>[['normal'],['latin','latin-ext']], + 'Esteban'=>[['normal'],['latin','latin-ext']], + 'Estonia'=>[['normal'],['latin','latin-ext','vietnamese']], + 'Euphoria Script'=>[['normal'],['latin','latin-ext']], + 'Ewert'=>[['normal'],['latin','latin-ext']], + 'Exo'=>[['100','200','300','normal','500','600','700','800','900','100italic','200italic','300italic','italic','500italic','600italic','700italic','800italic','900italic'],['latin','latin-ext','vietnamese']], + 'Exo 2'=>[['100','200','300','normal','500','600','700','800','900','100italic','200italic','300italic','italic','500italic','600italic','700italic','800italic','900italic'],['cyrillic','cyrillic-ext','latin','latin-ext','vietnamese']], + 'Expletus Sans'=>[['normal','500','600','700','italic','500italic','600italic','700italic'],['latin','latin-ext']], + 'Explora'=>[['normal'],['cherokee','latin','latin-ext','vietnamese']], + 'Fahkwang'=>[['200','200italic','300','300italic','normal','italic','500','500italic','600','600italic','700','700italic'],['latin','latin-ext','thai','vietnamese']], + 'Familjen Grotesk'=>[['normal','500','600','700','italic','500italic','600italic','700italic'],['latin','latin-ext','vietnamese']], + 'Fanwood Text'=>[['normal','italic'],['latin']], + 'Farro'=>[['300','normal','500','700'],['latin','latin-ext']], + 'Farsan'=>[['normal'],['gujarati','latin','latin-ext','vietnamese']], + 'Fascinate'=>[['normal'],['latin']], + 'Fascinate Inline'=>[['normal'],['latin']], + 'Faster One'=>[['normal'],['latin','latin-ext']], + 'Fasthand'=>[['normal'],['khmer','latin']], + 'Fauna One'=>[['normal'],['latin','latin-ext']], + 'Faustina'=>[['300','normal','500','600','700','800','300italic','italic','500italic','600italic','700italic','800italic'],['latin','latin-ext','vietnamese']], + 'Federant'=>[['normal'],['latin']], + 'Federo'=>[['normal'],['latin']], + 'Felipa'=>[['normal'],['latin','latin-ext']], + 'Fenix'=>[['normal'],['latin','latin-ext']], + 'Festive'=>[['normal'],['latin','latin-ext','vietnamese']], + 'Figtree'=>[['300','normal','500','600','700','800','900','300italic','italic','500italic','600italic','700italic','800italic','900italic'],['latin','latin-ext']], + 'Finger Paint'=>[['normal'],['latin']], + 'Finlandica'=>[['normal','500','600','700','italic','500italic','600italic','700italic'],['cyrillic','cyrillic-ext','latin','latin-ext']], + 'Fira Code'=>[['300','normal','500','600','700'],['cyrillic','cyrillic-ext','greek','greek-ext','latin','latin-ext']], + 'Fira Mono'=>[['normal','500','700'],['cyrillic','cyrillic-ext','greek','greek-ext','latin','latin-ext']], + 'Fira Sans'=>[['100','100italic','200','200italic','300','300italic','normal','italic','500','500italic','600','600italic','700','700italic','800','800italic','900','900italic'],['cyrillic','cyrillic-ext','greek','greek-ext','latin','latin-ext','vietnamese']], + 'Fira Sans Condensed'=>[['100','100italic','200','200italic','300','300italic','normal','italic','500','500italic','600','600italic','700','700italic','800','800italic','900','900italic'],['cyrillic','cyrillic-ext','greek','greek-ext','latin','latin-ext','vietnamese']], + 'Fira Sans Extra Condensed'=>[['100','100italic','200','200italic','300','300italic','normal','italic','500','500italic','600','600italic','700','700italic','800','800italic','900','900italic'],['cyrillic','cyrillic-ext','greek','greek-ext','latin','latin-ext','vietnamese']], + 'Fjalla One'=>[['normal'],['cyrillic-ext','latin','latin-ext','vietnamese']], + 'Fjord One'=>[['normal'],['latin']], + 'Flamenco'=>[['300','normal'],['latin']], + 'Flavors'=>[['normal'],['latin','latin-ext']], + 'Fleur De Leah'=>[['normal'],['latin','latin-ext','vietnamese']], + 'Flow Block'=>[['normal'],['cyrillic','cyrillic-ext','latin','latin-ext','vietnamese']], + 'Flow Circular'=>[['normal'],['cyrillic','cyrillic-ext','latin','latin-ext','vietnamese']], + 'Flow Rounded'=>[['normal'],['cyrillic','cyrillic-ext','latin','latin-ext','vietnamese']], + 'Foldit'=>[['100','200','300','normal','500','600','700','800','900'],['latin','latin-ext','vietnamese']], + 'Fondamento'=>[['normal','italic'],['latin','latin-ext']], + 'Fontdiner Swanky'=>[['normal'],['latin']], + 'Forum'=>[['normal'],['cyrillic','cyrillic-ext','latin','latin-ext']], + 'Fragment Mono'=>[['normal','italic'],['cyrillic-ext','latin','latin-ext']], + 'Francois One'=>[['normal'],['latin','latin-ext','vietnamese']], + 'Frank Ruhl Libre'=>[['300','normal','500','600','700','800','900'],['hebrew','latin','latin-ext']], + 'Fraunces'=>[['100','200','300','normal','500','600','700','800','900','100italic','200italic','300italic','italic','500italic','600italic','700italic','800italic','900italic'],['latin','latin-ext','vietnamese']], + 'Freckle Face'=>[['normal'],['latin','latin-ext']], + 'Fredericka the Great'=>[['normal'],['latin','latin-ext']], + 'Fredoka'=>[['300','normal','500','600','700'],['hebrew','latin','latin-ext']], + 'Freehand'=>[['normal'],['khmer','latin']], + 'Fresca'=>[['normal'],['latin','latin-ext']], + 'Frijole'=>[['normal'],['latin']], + 'Fruktur'=>[['normal','italic'],['cyrillic-ext','latin','latin-ext','vietnamese']], + 'Fugaz One'=>[['normal'],['latin']], + 'Fuggles'=>[['normal'],['latin','latin-ext','vietnamese']], + 'Fuzzy Bubbles'=>[['normal','700'],['latin','latin-ext','vietnamese']], + 'GFS Didot'=>[['normal'],['greek']], + 'GFS Neohellenic'=>[['normal','italic','700','700italic'],['greek']], + 'Gabarito'=>[['normal','500','600','700','800','900'],['latin','latin-ext']], + 'Gabriela'=>[['normal'],['cyrillic','cyrillic-ext','latin','latin-ext']], + 'Gaegu'=>[['300','normal','700'],['korean','latin']], + 'Gafata'=>[['normal'],['latin','latin-ext']], + 'Gajraj One'=>[['normal'],['devanagari','latin','latin-ext']], + 'Galada'=>[['normal'],['bengali','latin']], + 'Galdeano'=>[['normal'],['latin']], + 'Galindo'=>[['normal'],['latin','latin-ext']], + 'Gamja Flower'=>[['normal'],['korean','latin']], + 'Gantari'=>[['100','200','300','normal','500','600','700','800','900','100italic','200italic','300italic','italic','500italic','600italic','700italic','800italic','900italic'],['latin','latin-ext']], + 'Gasoek One'=>[['normal'],['korean','latin','latin-ext']], + 'Gayathri'=>[['100','normal','700'],['latin','malayalam']], + 'Gelasio'=>[['normal','italic','500','500italic','600','600italic','700','700italic'],['latin','latin-ext','vietnamese']], + 'Gemunu Libre'=>[['200','300','normal','500','600','700','800'],['latin','latin-ext','sinhala']], + 'Genos'=>[['100','200','300','normal','500','600','700','800','900','100italic','200italic','300italic','italic','500italic','600italic','700italic','800italic','900italic'],['cherokee','latin','latin-ext','vietnamese']], + 'Gentium Book Plus'=>[['normal','italic','700','700italic'],['cyrillic','cyrillic-ext','greek','greek-ext','latin','latin-ext','vietnamese']], + 'Gentium Plus'=>[['normal','italic','700','700italic'],['cyrillic','cyrillic-ext','greek','greek-ext','latin','latin-ext','vietnamese']], + 'Geo'=>[['normal','italic'],['latin']], + 'Geologica'=>[['100','200','300','normal','500','600','700','800','900'],['cyrillic','cyrillic-ext','greek','latin','latin-ext','vietnamese']], + 'Georama'=>[['100','200','300','normal','500','600','700','800','900','100italic','200italic','300italic','italic','500italic','600italic','700italic','800italic','900italic'],['latin','latin-ext','vietnamese']], + 'Geostar'=>[['normal'],['latin']], + 'Geostar Fill'=>[['normal'],['latin']], + 'Germania One'=>[['normal'],['latin']], + 'Gideon Roman'=>[['normal'],['latin','latin-ext','vietnamese']], + 'Gidugu'=>[['normal'],['latin','telugu']], + 'Gilda Display'=>[['normal'],['latin','latin-ext']], + 'Girassol'=>[['normal'],['latin','latin-ext']], + 'Give You Glory'=>[['normal'],['latin']], + 'Glass Antiqua'=>[['normal'],['latin','latin-ext']], + 'Glegoo'=>[['normal','700'],['devanagari','latin','latin-ext']], + 'Gloock'=>[['normal'],['cyrillic-ext','latin','latin-ext']], + 'Gloria Hallelujah'=>[['normal'],['latin']], + 'Glory'=>[['100','200','300','normal','500','600','700','800','100italic','200italic','300italic','italic','500italic','600italic','700italic','800italic'],['latin','latin-ext','vietnamese']], + 'Gluten'=>[['100','200','300','normal','500','600','700','800','900'],['latin','latin-ext','vietnamese']], + 'Goblin One'=>[['normal'],['latin']], + 'Gochi Hand'=>[['normal'],['latin']], + 'Goldman'=>[['normal','700'],['latin','latin-ext','vietnamese']], + 'Golos Text'=>[['normal','500','600','700','800','900'],['cyrillic','cyrillic-ext','latin','latin-ext']], + 'Gorditas'=>[['normal','700'],['latin']], + 'Gothic A1'=>[['100','200','300','normal','500','600','700','800','900'],['korean','latin']], + 'Gotu'=>[['normal'],['devanagari','latin','latin-ext','vietnamese']], + 'Goudy Bookletter 1911'=>[['normal'],['latin']], + 'Gowun Batang'=>[['normal','700'],['korean','latin','latin-ext','vietnamese']], + 'Gowun Dodum'=>[['normal'],['korean','latin','latin-ext','vietnamese']], + 'Graduate'=>[['normal'],['latin']], + 'Grand Hotel'=>[['normal'],['latin','latin-ext']], + 'Grandiflora One'=>[['normal'],['korean','latin','latin-ext']], + 'Grandstander'=>[['100','200','300','normal','500','600','700','800','900','100italic','200italic','300italic','italic','500italic','600italic','700italic','800italic','900italic'],['latin','latin-ext','vietnamese']], + 'Grape Nuts'=>[['normal'],['latin','latin-ext','vietnamese']], + 'Gravitas One'=>[['normal'],['latin']], + 'Great Vibes'=>[['normal'],['latin','latin-ext','vietnamese']], + 'Grechen Fuemen'=>[['normal'],['latin','latin-ext','vietnamese']], + 'Grenze'=>[['100','100italic','200','200italic','300','300italic','normal','italic','500','500italic','600','600italic','700','700italic','800','800italic','900','900italic'],['latin','latin-ext','vietnamese']], + 'Grenze Gotisch'=>[['100','200','300','normal','500','600','700','800','900'],['latin','latin-ext','vietnamese']], + 'Grey Qo'=>[['normal'],['latin','latin-ext','vietnamese']], + 'Griffy'=>[['normal'],['latin','latin-ext']], + 'Gruppo'=>[['normal'],['latin','latin-ext']], + 'Gudea'=>[['normal','italic','700'],['latin','latin-ext']], + 'Gugi'=>[['normal'],['korean','latin']], + 'Gulzar'=>[['normal'],['arabic','latin','latin-ext']], + 'Gupter'=>[['normal','500','700'],['latin']], + 'Gurajada'=>[['normal'],['latin','telugu']], + 'Gwendolyn'=>[['normal','700'],['latin','latin-ext','vietnamese']], + 'Habibi'=>[['normal'],['latin','latin-ext']], + 'Hachi Maru Pop'=>[['normal'],['cyrillic','japanese','latin','latin-ext']], + 'Hahmlet'=>[['100','200','300','normal','500','600','700','800','900'],['korean','latin','latin-ext','vietnamese']], + 'Halant'=>[['300','normal','500','600','700'],['devanagari','latin','latin-ext']], + 'Hammersmith One'=>[['normal'],['latin','latin-ext']], + 'Hanalei'=>[['normal'],['latin','latin-ext']], + 'Hanalei Fill'=>[['normal'],['latin','latin-ext']], + 'Handjet'=>[['100','200','300','normal','500','600','700','800','900'],['arabic','armenian','cyrillic','cyrillic-ext','greek','hebrew','latin','latin-ext','vietnamese']], + 'Handlee'=>[['normal'],['latin']], + 'Hanken Grotesk'=>[['100','200','300','normal','500','600','700','800','900','100italic','200italic','300italic','italic','500italic','600italic','700italic','800italic','900italic'],['cyrillic-ext','latin','latin-ext','vietnamese']], + 'Hanuman'=>[['100','300','normal','700','900'],['khmer','latin']], + 'Happy Monkey'=>[['normal'],['latin','latin-ext']], + 'Harmattan'=>[['normal','500','600','700'],['arabic','latin','latin-ext']], + 'Headland One'=>[['normal'],['latin','latin-ext']], + 'Hedvig Letters Sans'=>[['normal'],['latin','latin-ext','math','symbols']], + 'Hedvig Letters Serif'=>[['normal'],['latin','latin-ext','math','symbols']], + 'Heebo'=>[['100','200','300','normal','500','600','700','800','900'],['hebrew','latin']], + 'Henny Penny'=>[['normal'],['latin']], + 'Hepta Slab'=>[['100','200','300','normal','500','600','700','800','900'],['latin','latin-ext','vietnamese']], + 'Herr Von Muellerhoff'=>[['normal'],['latin','latin-ext']], + 'Hi Melody'=>[['normal'],['korean','latin']], + 'Hina Mincho'=>[['normal'],['cyrillic','japanese','latin','latin-ext','vietnamese']], + 'Hind'=>[['300','normal','500','600','700'],['devanagari','latin','latin-ext']], + 'Hind Guntur'=>[['300','normal','500','600','700'],['latin','latin-ext','telugu']], + 'Hind Madurai'=>[['300','normal','500','600','700'],['latin','latin-ext','tamil']], + 'Hind Siliguri'=>[['300','normal','500','600','700'],['bengali','latin','latin-ext']], + 'Hind Vadodara'=>[['300','normal','500','600','700'],['gujarati','latin','latin-ext']], + 'Holtwood One SC'=>[['normal'],['latin']], + 'Homemade Apple'=>[['normal'],['latin']], + 'Homenaje'=>[['normal'],['latin']], + 'Honk'=>[['normal'],['latin','latin-ext','math','symbols','vietnamese']], + 'Hubballi'=>[['normal'],['kannada','latin','latin-ext']], + 'Hurricane'=>[['normal'],['latin','latin-ext','vietnamese']], + 'IBM Plex Mono'=>[['100','100italic','200','200italic','300','300italic','normal','italic','500','500italic','600','600italic','700','700italic'],['cyrillic','cyrillic-ext','latin','latin-ext','vietnamese']], + 'IBM Plex Sans'=>[['100','100italic','200','200italic','300','300italic','normal','italic','500','500italic','600','600italic','700','700italic'],['cyrillic','cyrillic-ext','greek','latin','latin-ext','vietnamese']], + 'IBM Plex Sans Arabic'=>[['100','200','300','normal','500','600','700'],['arabic','cyrillic-ext','latin','latin-ext']], + 'IBM Plex Sans Condensed'=>[['100','100italic','200','200italic','300','300italic','normal','italic','500','500italic','600','600italic','700','700italic'],['cyrillic-ext','latin','latin-ext','vietnamese']], + 'IBM Plex Sans Devanagari'=>[['100','200','300','normal','500','600','700'],['cyrillic-ext','devanagari','latin','latin-ext']], + 'IBM Plex Sans Hebrew'=>[['100','200','300','normal','500','600','700'],['cyrillic-ext','hebrew','latin','latin-ext']], + 'IBM Plex Sans JP'=>[['100','200','300','normal','500','600','700'],['cyrillic','japanese','latin','latin-ext']], + 'IBM Plex Sans KR'=>[['100','200','300','normal','500','600','700'],['korean','latin','latin-ext']], + 'IBM Plex Sans Thai'=>[['100','200','300','normal','500','600','700'],['cyrillic-ext','latin','latin-ext','thai']], + 'IBM Plex Sans Thai Looped'=>[['100','200','300','normal','500','600','700'],['cyrillic-ext','latin','latin-ext','thai']], + 'IBM Plex Serif'=>[['100','100italic','200','200italic','300','300italic','normal','italic','500','500italic','600','600italic','700','700italic'],['cyrillic','cyrillic-ext','latin','latin-ext','vietnamese']], + 'IM Fell DW Pica'=>[['normal','italic'],['latin']], + 'IM Fell DW Pica SC'=>[['normal'],['latin']], + 'IM Fell Double Pica'=>[['normal','italic'],['latin']], + 'IM Fell Double Pica SC'=>[['normal'],['latin']], + 'IM Fell English'=>[['normal','italic'],['latin']], + 'IM Fell English SC'=>[['normal'],['latin']], + 'IM Fell French Canon'=>[['normal','italic'],['latin']], + 'IM Fell French Canon SC'=>[['normal'],['latin']], + 'IM Fell Great Primer'=>[['normal','italic'],['latin']], + 'IM Fell Great Primer SC'=>[['normal'],['latin']], + 'Ibarra Real Nova'=>[['normal','500','600','700','italic','500italic','600italic','700italic'],['latin','latin-ext']], + 'Iceberg'=>[['normal'],['latin']], + 'Iceland'=>[['normal'],['latin']], + 'Imbue'=>[['100','200','300','normal','500','600','700','800','900'],['latin','latin-ext','vietnamese']], + 'Imperial Script'=>[['normal'],['latin','latin-ext','vietnamese']], + 'Imprima'=>[['normal'],['latin','latin-ext']], + 'Inclusive Sans'=>[['normal','italic'],['latin','latin-ext','vietnamese']], + 'Inconsolata'=>[['200','300','normal','500','600','700','800','900'],['latin','latin-ext','vietnamese']], + 'Inder'=>[['normal'],['latin','latin-ext']], + 'Indie Flower'=>[['normal'],['latin']], + 'Ingrid Darling'=>[['normal'],['latin','latin-ext','vietnamese']], + 'Inika'=>[['normal','700'],['latin','latin-ext']], + 'Inknut Antiqua'=>[['300','normal','500','600','700','800','900'],['devanagari','latin','latin-ext']], + 'Inria Sans'=>[['300','300italic','normal','italic','700','700italic'],['latin','latin-ext']], + 'Inria Serif'=>[['300','300italic','normal','italic','700','700italic'],['latin','latin-ext']], + 'Inspiration'=>[['normal'],['latin','latin-ext','vietnamese']], + 'Instrument Sans'=>[['normal','500','600','700','italic','500italic','600italic','700italic'],['latin','latin-ext']], + 'Instrument Serif'=>[['normal','italic'],['latin','latin-ext']], + 'Inter'=>[['100','200','300','normal','500','600','700','800','900'],['cyrillic','cyrillic-ext','greek','greek-ext','latin','latin-ext','vietnamese']], + 'Inter Tight'=>[['100','200','300','normal','500','600','700','800','900','100italic','200italic','300italic','italic','500italic','600italic','700italic','800italic','900italic'],['cyrillic','cyrillic-ext','greek','greek-ext','latin','latin-ext','vietnamese']], + 'Irish Grover'=>[['normal'],['latin']], + 'Island Moments'=>[['normal'],['latin','latin-ext','vietnamese']], + 'Istok Web'=>[['normal','italic','700','700italic'],['cyrillic','cyrillic-ext','latin','latin-ext']], + 'Italiana'=>[['normal'],['latin']], + 'Italianno'=>[['normal'],['latin','latin-ext','vietnamese']], + 'Itim'=>[['normal'],['latin','latin-ext','thai','vietnamese']], + 'Jacques Francois'=>[['normal'],['latin']], + 'Jacques Francois Shadow'=>[['normal'],['latin']], + 'Jaldi'=>[['normal','700'],['devanagari','latin','latin-ext']], + 'JetBrains Mono'=>[['100','200','300','normal','500','600','700','800','100italic','200italic','300italic','italic','500italic','600italic','700italic','800italic'],['cyrillic','cyrillic-ext','greek','latin','latin-ext','vietnamese']], + 'Jim Nightshade'=>[['normal'],['latin','latin-ext']], + 'Joan'=>[['normal'],['latin','latin-ext']], + 'Jockey One'=>[['normal'],['latin','latin-ext']], + 'Jolly Lodger'=>[['normal'],['latin','latin-ext']], + 'Jomhuria'=>[['normal'],['arabic','latin','latin-ext']], + 'Jomolhari'=>[['normal'],['latin','tibetan']], + 'Josefin Sans'=>[['100','200','300','normal','500','600','700','100italic','200italic','300italic','italic','500italic','600italic','700italic'],['latin','latin-ext','vietnamese']], + 'Josefin Slab'=>[['100','200','300','normal','500','600','700','100italic','200italic','300italic','italic','500italic','600italic','700italic'],['latin']], + 'Jost'=>[['100','200','300','normal','500','600','700','800','900','100italic','200italic','300italic','italic','500italic','600italic','700italic','800italic','900italic'],['cyrillic','latin','latin-ext']], + 'Joti One'=>[['normal'],['latin','latin-ext']], + 'Jua'=>[['normal'],['korean','latin']], + 'Judson'=>[['normal','italic','700'],['latin','latin-ext','vietnamese']], + 'Julee'=>[['normal'],['latin','latin-ext']], + 'Julius Sans One'=>[['normal'],['latin','latin-ext']], + 'Junge'=>[['normal'],['latin']], + 'Jura'=>[['300','normal','500','600','700'],['cyrillic','cyrillic-ext','greek','greek-ext','kayah-li','latin','latin-ext','vietnamese']], + 'Just Another Hand'=>[['normal'],['latin']], + 'Just Me Again Down Here'=>[['normal'],['latin','latin-ext']], + 'K2D'=>[['100','100italic','200','200italic','300','300italic','normal','italic','500','500italic','600','600italic','700','700italic','800','800italic'],['latin','latin-ext','thai','vietnamese']], + 'Kablammo'=>[['normal'],['cyrillic','cyrillic-ext','latin','latin-ext','vietnamese']], + 'Kadwa'=>[['normal','700'],['devanagari','latin']], + 'Kaisei Decol'=>[['normal','500','700'],['cyrillic','japanese','latin','latin-ext']], + 'Kaisei HarunoUmi'=>[['normal','500','700'],['cyrillic','japanese','latin','latin-ext']], + 'Kaisei Opti'=>[['normal','500','700'],['cyrillic','japanese','latin','latin-ext']], + 'Kaisei Tokumin'=>[['normal','500','700','800'],['cyrillic','japanese','latin','latin-ext']], + 'Kalam'=>[['300','normal','700'],['devanagari','latin','latin-ext']], + 'Kalnia'=>[['100','200','300','normal','500','600','700'],['latin','latin-ext','math']], + 'Kameron'=>[['normal','500','600','700'],['latin','latin-ext']], + 'Kanit'=>[['100','100italic','200','200italic','300','300italic','normal','italic','500','500italic','600','600italic','700','700italic','800','800italic','900','900italic'],['latin','latin-ext','thai','vietnamese']], + 'Kantumruy Pro'=>[['100','200','300','normal','500','600','700','100italic','200italic','300italic','italic','500italic','600italic','700italic'],['khmer','latin','latin-ext']], + 'Karantina'=>[['300','normal','700'],['hebrew','latin','latin-ext']], + 'Karla'=>[['200','300','normal','500','600','700','800','200italic','300italic','italic','500italic','600italic','700italic','800italic'],['latin','latin-ext']], + 'Karma'=>[['300','normal','500','600','700'],['devanagari','latin','latin-ext']], + 'Katibeh'=>[['normal'],['arabic','latin','latin-ext']], + 'Kaushan Script'=>[['normal'],['latin','latin-ext']], + 'Kavivanar'=>[['normal'],['latin','latin-ext','tamil']], + 'Kavoon'=>[['normal'],['latin','latin-ext']], + 'Kay Pho Du'=>[['normal','500','600','700'],['kayah-li','latin','latin-ext']], + 'Kdam Thmor Pro'=>[['normal'],['khmer','latin','latin-ext']], + 'Keania One'=>[['normal'],['latin','latin-ext']], + 'Kelly Slab'=>[['normal'],['cyrillic','latin','latin-ext']], + 'Kenia'=>[['normal'],['latin']], + 'Khand'=>[['300','normal','500','600','700'],['devanagari','latin','latin-ext']], + 'Khmer'=>[['normal'],['khmer']], + 'Khula'=>[['300','normal','600','700','800'],['devanagari','latin','latin-ext']], + 'Kings'=>[['normal'],['latin','latin-ext','vietnamese']], + 'Kirang Haerang'=>[['normal'],['korean','latin']], + 'Kite One'=>[['normal'],['latin','latin-ext']], + 'Kiwi Maru'=>[['300','normal','500'],['cyrillic','japanese','latin','latin-ext']], + 'Klee One'=>[['normal','600'],['cyrillic','greek-ext','japanese','latin','latin-ext']], + 'Knewave'=>[['normal'],['latin','latin-ext']], + 'KoHo'=>[['200','200italic','300','300italic','normal','italic','500','500italic','600','600italic','700','700italic'],['latin','latin-ext','thai','vietnamese']], + 'Kodchasan'=>[['200','200italic','300','300italic','normal','italic','500','500italic','600','600italic','700','700italic'],['latin','latin-ext','thai','vietnamese']], + 'Koh Santepheap'=>[['100','300','normal','700','900'],['khmer','latin']], + 'Kolker Brush'=>[['normal'],['latin','latin-ext','vietnamese']], + 'Konkhmer Sleokchher'=>[['normal'],['khmer','latin','latin-ext']], + 'Kosugi'=>[['normal'],['cyrillic','japanese','latin','latin-ext']], + 'Kosugi Maru'=>[['normal'],['cyrillic','japanese','latin','latin-ext']], + 'Kotta One'=>[['normal'],['latin','latin-ext']], + 'Koulen'=>[['normal'],['khmer','latin']], + 'Kranky'=>[['normal'],['latin']], + 'Kreon'=>[['300','normal','500','600','700'],['latin','latin-ext']], + 'Kristi'=>[['normal'],['latin']], + 'Krona One'=>[['normal'],['latin','latin-ext']], + 'Krub'=>[['200','200italic','300','300italic','normal','italic','500','500italic','600','600italic','700','700italic'],['latin','latin-ext','thai','vietnamese']], + 'Kufam'=>[['normal','500','600','700','800','900','italic','500italic','600italic','700italic','800italic','900italic'],['arabic','latin','latin-ext','vietnamese']], + 'Kulim Park'=>[['200','200italic','300','300italic','normal','italic','600','600italic','700','700italic'],['latin','latin-ext']], + 'Kumar One'=>[['normal'],['gujarati','latin','latin-ext']], + 'Kumar One Outline'=>[['normal'],['gujarati','latin','latin-ext']], + 'Kumbh Sans'=>[['100','200','300','normal','500','600','700','800','900'],['latin','latin-ext','math','symbols']], + 'Kurale'=>[['normal'],['cyrillic','cyrillic-ext','devanagari','latin','latin-ext']], + 'La Belle Aurore'=>[['normal'],['latin']], + 'Labrada'=>[['100','200','300','normal','500','600','700','800','900','100italic','200italic','300italic','italic','500italic','600italic','700italic','800italic','900italic'],['latin','latin-ext','vietnamese']], + 'Lacquer'=>[['normal'],['latin']], + 'Laila'=>[['300','normal','500','600','700'],['devanagari','latin','latin-ext']], + 'Lakki Reddy'=>[['normal'],['latin','telugu']], + 'Lalezar'=>[['normal'],['arabic','latin','latin-ext','vietnamese']], + 'Lancelot'=>[['normal'],['latin','latin-ext']], + 'Langar'=>[['normal'],['gurmukhi','latin','latin-ext']], + 'Lateef'=>[['200','300','normal','500','600','700','800'],['arabic','latin','latin-ext']], + 'Lato'=>[['100','100italic','300','300italic','normal','italic','700','700italic','900','900italic'],['latin','latin-ext']], + 'Lavishly Yours'=>[['normal'],['latin','latin-ext','vietnamese']], + 'League Gothic'=>[['normal'],['latin','latin-ext','vietnamese']], + 'League Script'=>[['normal'],['latin']], + 'League Spartan'=>[['100','200','300','normal','500','600','700','800','900'],['latin','latin-ext','vietnamese']], + 'Leckerli One'=>[['normal'],['latin']], + 'Ledger'=>[['normal'],['cyrillic','latin','latin-ext']], + 'Lekton'=>[['normal','italic','700'],['latin','latin-ext']], + 'Lemon'=>[['normal'],['latin','latin-ext']], + 'Lemonada'=>[['300','normal','500','600','700'],['arabic','latin','latin-ext','vietnamese']], + 'Lexend'=>[['100','200','300','normal','500','600','700','800','900'],['latin','latin-ext','vietnamese']], + 'Lexend Deca'=>[['100','200','300','normal','500','600','700','800','900'],['latin','latin-ext','vietnamese']], + 'Lexend Exa'=>[['100','200','300','normal','500','600','700','800','900'],['latin','latin-ext','vietnamese']], + 'Lexend Giga'=>[['100','200','300','normal','500','600','700','800','900'],['latin','latin-ext','vietnamese']], + 'Lexend Mega'=>[['100','200','300','normal','500','600','700','800','900'],['latin','latin-ext','vietnamese']], + 'Lexend Peta'=>[['100','200','300','normal','500','600','700','800','900'],['latin','latin-ext','vietnamese']], + 'Lexend Tera'=>[['100','200','300','normal','500','600','700','800','900'],['latin','latin-ext','vietnamese']], + 'Lexend Zetta'=>[['100','200','300','normal','500','600','700','800','900'],['latin','latin-ext','vietnamese']], + 'Libre Barcode 128'=>[['normal'],['latin']], + 'Libre Barcode 128 Text'=>[['normal'],['latin']], + 'Libre Barcode 39'=>[['normal'],['latin']], + 'Libre Barcode 39 Extended'=>[['normal'],['latin']], + 'Libre Barcode 39 Extended Text'=>[['normal'],['latin']], + 'Libre Barcode 39 Text'=>[['normal'],['latin']], + 'Libre Barcode EAN13 Text'=>[['normal'],['latin']], + 'Libre Baskerville'=>[['normal','italic','700'],['latin','latin-ext']], + 'Libre Bodoni'=>[['normal','500','600','700','italic','500italic','600italic','700italic'],['latin','latin-ext','vietnamese']], + 'Libre Caslon Display'=>[['normal'],['latin','latin-ext']], + 'Libre Caslon Text'=>[['normal','italic','700'],['latin','latin-ext']], + 'Libre Franklin'=>[['100','200','300','normal','500','600','700','800','900','100italic','200italic','300italic','italic','500italic','600italic','700italic','800italic','900italic'],['latin','latin-ext','vietnamese']], + 'Licorice'=>[['normal'],['latin','latin-ext','vietnamese']], + 'Life Savers'=>[['normal','700','800'],['latin','latin-ext']], + 'Lilita One'=>[['normal'],['latin','latin-ext']], + 'Lily Script One'=>[['normal'],['latin','latin-ext']], + 'Limelight'=>[['normal'],['latin','latin-ext']], + 'Linden Hill'=>[['normal','italic'],['latin']], + 'Linefont'=>[['100','200','300','normal','500','600','700','800','900'],['latin']], + 'Lisu Bosa'=>[['200','200italic','300','300italic','normal','italic','500','500italic','600','600italic','700','700italic','800','800italic','900','900italic'],['latin','latin-ext','lisu']], + 'Literata'=>[['200','300','normal','500','600','700','800','900','200italic','300italic','italic','500italic','600italic','700italic','800italic','900italic'],['cyrillic','cyrillic-ext','greek','greek-ext','latin','latin-ext','vietnamese']], + 'Liu Jian Mao Cao'=>[['normal'],['chinese-simplified','latin']], + 'Livvic'=>[['100','100italic','200','200italic','300','300italic','normal','italic','500','500italic','600','600italic','700','700italic','900','900italic'],['latin','latin-ext','vietnamese']], + 'Lobster'=>[['normal'],['cyrillic','cyrillic-ext','latin','latin-ext','vietnamese']], + 'Lobster Two'=>[['normal','italic','700','700italic'],['latin']], + 'Londrina Outline'=>[['normal'],['latin']], + 'Londrina Shadow'=>[['normal'],['latin']], + 'Londrina Sketch'=>[['normal'],['latin']], + 'Londrina Solid'=>[['100','300','normal','900'],['latin']], + 'Long Cang'=>[['normal'],['chinese-simplified','latin']], + 'Lora'=>[['normal','500','600','700','italic','500italic','600italic','700italic'],['cyrillic','cyrillic-ext','latin','latin-ext','vietnamese']], + 'Love Light'=>[['normal'],['latin','latin-ext','vietnamese']], + 'Love Ya Like A Sister'=>[['normal'],['latin']], + 'Loved by the King'=>[['normal'],['latin']], + 'Lovers Quarrel'=>[['normal'],['latin','latin-ext','vietnamese']], + 'Luckiest Guy'=>[['normal'],['latin']], + 'Lugrasimo'=>[['normal'],['latin','latin-ext']], + 'Lumanosimo'=>[['normal'],['latin','latin-ext']], + 'Lunasima'=>[['normal','700'],['cyrillic','cyrillic-ext','greek','greek-ext','hebrew','latin','latin-ext','vietnamese']], + 'Lusitana'=>[['normal','700'],['latin']], + 'Lustria'=>[['normal'],['latin']], + 'Luxurious Roman'=>[['normal'],['latin','latin-ext','vietnamese']], + 'Luxurious Script'=>[['normal'],['latin','latin-ext','vietnamese']], + 'M PLUS 1'=>[['100','200','300','normal','500','600','700','800','900'],['japanese','latin','latin-ext','vietnamese']], + 'M PLUS 1 Code'=>[['100','200','300','normal','500','600','700'],['japanese','latin','latin-ext','vietnamese']], + 'M PLUS 1p'=>[['100','300','normal','500','700','800','900'],['cyrillic','cyrillic-ext','greek','greek-ext','hebrew','japanese','latin','latin-ext','vietnamese']], + 'M PLUS 2'=>[['100','200','300','normal','500','600','700','800','900'],['japanese','latin','latin-ext','vietnamese']], + 'M PLUS Code Latin'=>[['100','200','300','normal','500','600','700'],['latin','latin-ext','vietnamese']], + 'M PLUS Rounded 1c'=>[['100','300','normal','500','700','800','900'],['cyrillic','cyrillic-ext','greek','greek-ext','hebrew','japanese','latin','latin-ext','vietnamese']], + 'Ma Shan Zheng'=>[['normal'],['chinese-simplified','latin']], + 'Macondo'=>[['normal'],['latin']], + 'Macondo Swash Caps'=>[['normal'],['latin']], + 'Mada'=>[['200','300','normal','500','600','700','800','900'],['arabic','latin','latin-ext']], + 'Magra'=>[['normal','700'],['latin','latin-ext']], + 'Maiden Orange'=>[['normal'],['latin']], + 'Maitree'=>[['200','300','normal','500','600','700'],['latin','latin-ext','thai','vietnamese']], + 'Major Mono Display'=>[['normal'],['latin','latin-ext','vietnamese']], + 'Mako'=>[['normal'],['latin','latin-ext']], + 'Mali'=>[['200','200italic','300','300italic','normal','italic','500','500italic','600','600italic','700','700italic'],['latin','latin-ext','thai','vietnamese']], + 'Mallanna'=>[['normal'],['latin','telugu']], + 'Mandali'=>[['normal'],['latin','telugu']], + 'Manjari'=>[['100','normal','700'],['latin','latin-ext','malayalam']], + 'Manrope'=>[['200','300','normal','500','600','700','800'],['cyrillic','cyrillic-ext','greek','latin','latin-ext','vietnamese']], + 'Mansalva'=>[['normal'],['greek','latin','latin-ext','vietnamese']], + 'Manuale'=>[['300','normal','500','600','700','800','300italic','italic','500italic','600italic','700italic','800italic'],['latin','latin-ext','vietnamese']], + 'Marcellus'=>[['normal'],['latin','latin-ext']], + 'Marcellus SC'=>[['normal'],['latin','latin-ext']], + 'Marck Script'=>[['normal'],['cyrillic','latin','latin-ext']], + 'Margarine'=>[['normal'],['latin','latin-ext']], + 'Marhey'=>[['300','normal','500','600','700'],['arabic','latin','latin-ext']], + 'Markazi Text'=>[['normal','500','600','700'],['arabic','latin','latin-ext','vietnamese']], + 'Marko One'=>[['normal'],['latin']], + 'Marmelad'=>[['normal'],['cyrillic','cyrillic-ext','latin','latin-ext','vietnamese']], + 'Martel'=>[['200','300','normal','600','700','800','900'],['devanagari','latin','latin-ext']], + 'Martel Sans'=>[['200','300','normal','600','700','800','900'],['devanagari','latin','latin-ext']], + 'Martian Mono'=>[['100','200','300','normal','500','600','700','800'],['cyrillic','cyrillic-ext','latin','latin-ext']], + 'Marvel'=>[['normal','italic','700','700italic'],['latin']], + 'Mate'=>[['normal','italic'],['latin','latin-ext']], + 'Mate SC'=>[['normal'],['latin','latin-ext']], + 'Material Icons'=>[['normal'],['latin']], + 'Material Icons Outlined'=>[['normal'],['latin']], + 'Material Icons Round'=>[['normal'],['latin']], + 'Material Icons Sharp'=>[['normal'],['latin']], + 'Material Icons Two Tone'=>[['normal'],['latin']], + 'Material Symbols Outlined'=>[['100','200','300','normal','500','600','700'],['latin']], + 'Material Symbols Rounded'=>[['100','200','300','normal','500','600','700'],['latin']], + 'Material Symbols Sharp'=>[['100','200','300','normal','500','600','700'],['latin']], + 'Maven Pro'=>[['normal','500','600','700','800','900'],['latin','latin-ext','vietnamese']], + 'McLaren'=>[['normal'],['latin','latin-ext']], + 'Mea Culpa'=>[['normal'],['latin','latin-ext','vietnamese']], + 'Meddon'=>[['normal'],['latin']], + 'MedievalSharp'=>[['normal'],['latin','latin-ext']], + 'Medula One'=>[['normal'],['latin']], + 'Meera Inimai'=>[['normal'],['latin','tamil']], + 'Megrim'=>[['normal'],['latin']], + 'Meie Script'=>[['normal'],['latin','latin-ext']], + 'Meow Script'=>[['normal'],['latin','latin-ext','vietnamese']], + 'Merienda'=>[['300','normal','500','600','700','800','900'],['latin','latin-ext','vietnamese']], + 'Merriweather'=>[['300','300italic','normal','italic','700','700italic','900','900italic'],['cyrillic','cyrillic-ext','latin','latin-ext','vietnamese']], + 'Merriweather Sans'=>[['300','normal','500','600','700','800','300italic','italic','500italic','600italic','700italic','800italic'],['cyrillic-ext','latin','latin-ext','vietnamese']], + 'Metal'=>[['normal'],['khmer','latin']], + 'Metal Mania'=>[['normal'],['latin','latin-ext']], + 'Metamorphous'=>[['normal'],['latin','latin-ext']], + 'Metrophobic'=>[['normal'],['latin','latin-ext','vietnamese']], + 'Michroma'=>[['normal'],['latin','latin-ext']], + 'Milonga'=>[['normal'],['latin','latin-ext']], + 'Miltonian'=>[['normal'],['latin']], + 'Miltonian Tattoo'=>[['normal'],['latin']], + 'Mina'=>[['normal','700'],['bengali','latin','latin-ext']], + 'Mingzat'=>[['normal'],['latin','latin-ext','lepcha']], + 'Miniver'=>[['normal'],['latin']], + 'Miriam Libre'=>[['normal','700'],['hebrew','latin','latin-ext']], + 'Mirza'=>[['normal','500','600','700'],['arabic','latin','latin-ext']], + 'Miss Fajardose'=>[['normal'],['latin','latin-ext']], + 'Mitr'=>[['200','300','normal','500','600','700'],['latin','latin-ext','thai','vietnamese']], + 'Mochiy Pop One'=>[['normal'],['japanese','latin']], + 'Mochiy Pop P One'=>[['normal'],['japanese','latin']], + 'Modak'=>[['normal'],['devanagari','latin','latin-ext']], + 'Modern Antiqua'=>[['normal'],['latin','latin-ext']], + 'Mogra'=>[['normal'],['gujarati','latin','latin-ext']], + 'Mohave'=>[['300','normal','500','600','700','300italic','italic','500italic','600italic','700italic'],['latin','latin-ext']], + 'Moirai One'=>[['normal'],['korean','latin','latin-ext']], + 'Molengo'=>[['normal'],['latin','latin-ext']], + 'Molle'=>[['italic'],['latin','latin-ext']], + 'Monda'=>[['normal','700'],['latin','latin-ext','vietnamese']], + 'Monofett'=>[['normal'],['latin','latin-ext']], + 'Monomaniac One'=>[['normal'],['japanese','latin','latin-ext']], + 'Monoton'=>[['normal'],['latin']], + 'Monsieur La Doulaise'=>[['normal'],['latin','latin-ext']], + 'Montaga'=>[['normal'],['latin']], + 'Montagu Slab'=>[['100','200','300','normal','500','600','700'],['latin','latin-ext','vietnamese']], + 'MonteCarlo'=>[['normal'],['latin','latin-ext','vietnamese']], + 'Montez'=>[['normal'],['latin']], + 'Montserrat'=>[['100','200','300','normal','500','600','700','800','900','100italic','200italic','300italic','italic','500italic','600italic','700italic','800italic','900italic'],['cyrillic','cyrillic-ext','latin','latin-ext','vietnamese']], + 'Montserrat Alternates'=>[['100','100italic','200','200italic','300','300italic','normal','italic','500','500italic','600','600italic','700','700italic','800','800italic','900','900italic'],['cyrillic','cyrillic-ext','latin','latin-ext','vietnamese']], + 'Montserrat Subrayada'=>[['normal','700'],['latin']], + 'Moo Lah Lah'=>[['normal'],['latin','latin-ext','vietnamese']], + 'Mooli'=>[['normal'],['latin','latin-ext']], + 'Moon Dance'=>[['normal'],['latin','latin-ext','vietnamese']], + 'Moul'=>[['normal'],['khmer','latin']], + 'Moulpali'=>[['normal'],['khmer','latin']], + 'Mountains of Christmas'=>[['normal','700'],['latin']], + 'Mouse Memoirs'=>[['normal'],['latin','latin-ext']], + 'Mr Bedfort'=>[['normal'],['latin','latin-ext']], + 'Mr Dafoe'=>[['normal'],['latin','latin-ext']], + 'Mr De Haviland'=>[['normal'],['latin','latin-ext']], + 'Mrs Saint Delafield'=>[['normal'],['latin','latin-ext']], + 'Mrs Sheppards'=>[['normal'],['latin','latin-ext']], + 'Ms Madi'=>[['normal'],['latin','latin-ext','vietnamese']], + 'Mukta'=>[['200','300','normal','500','600','700','800'],['devanagari','latin','latin-ext']], + 'Mukta Mahee'=>[['200','300','normal','500','600','700','800'],['gurmukhi','latin','latin-ext']], + 'Mukta Malar'=>[['200','300','normal','500','600','700','800'],['latin','latin-ext','tamil']], + 'Mukta Vaani'=>[['200','300','normal','500','600','700','800'],['gujarati','latin','latin-ext']], + 'Mulish'=>[['200','300','normal','500','600','700','800','900','200italic','300italic','italic','500italic','600italic','700italic','800italic','900italic'],['cyrillic','cyrillic-ext','latin','latin-ext','vietnamese']], + 'Murecho'=>[['100','200','300','normal','500','600','700','800','900'],['cyrillic','cyrillic-ext','greek','japanese','latin','latin-ext']], + 'MuseoModerno'=>[['100','200','300','normal','500','600','700','800','900','100italic','200italic','300italic','italic','500italic','600italic','700italic','800italic','900italic'],['latin','latin-ext','vietnamese']], + 'My Soul'=>[['normal'],['latin','latin-ext','vietnamese']], + 'Mynerve'=>[['normal'],['greek','latin','latin-ext','vietnamese']], + 'Mystery Quest'=>[['normal'],['latin','latin-ext']], + 'NTR'=>[['normal'],['latin','telugu']], + 'Nabla'=>[['normal'],['cyrillic-ext','latin','latin-ext','math','vietnamese']], + 'Nanum Brush Script'=>[['normal'],['korean','latin']], + 'Nanum Gothic'=>[['normal','700','800'],['korean','latin']], + 'Nanum Gothic Coding'=>[['normal','700'],['korean','latin']], + 'Nanum Myeongjo'=>[['normal','700','800'],['korean','latin']], + 'Nanum Pen Script'=>[['normal'],['korean','latin']], + 'Narnoor'=>[['normal','500','600','700','800'],['gunjala-gondi','latin','latin-ext','math','symbols']], + 'Neonderthaw'=>[['normal'],['latin','latin-ext','vietnamese']], + 'Nerko One'=>[['normal'],['latin','latin-ext']], + 'Neucha'=>[['normal'],['cyrillic','latin']], + 'Neuton'=>[['200','300','normal','italic','700','800'],['latin','latin-ext']], + 'New Rocker'=>[['normal'],['latin','latin-ext']], + 'New Tegomin'=>[['normal'],['japanese','latin','latin-ext']], + 'News Cycle'=>[['normal','700'],['latin','latin-ext']], + 'Newsreader'=>[['200','300','normal','500','600','700','800','200italic','300italic','italic','500italic','600italic','700italic','800italic'],['latin','latin-ext','vietnamese']], + 'Niconne'=>[['normal'],['latin','latin-ext']], + 'Niramit'=>[['200','200italic','300','300italic','normal','italic','500','500italic','600','600italic','700','700italic'],['latin','latin-ext','thai','vietnamese']], + 'Nixie One'=>[['normal'],['latin']], + 'Nobile'=>[['normal','italic','500','500italic','700','700italic'],['latin','latin-ext']], + 'Nokora'=>[['100','300','normal','700','900'],['khmer','latin']], + 'Norican'=>[['normal'],['latin','latin-ext']], + 'Nosifer'=>[['normal'],['latin','latin-ext']], + 'Notable'=>[['normal'],['latin']], + 'Nothing You Could Do'=>[['normal'],['latin']], + 'Noticia Text'=>[['normal','italic','700','700italic'],['latin','latin-ext','vietnamese']], + 'Noto Color Emoji'=>[['normal'],['emoji']], + 'Noto Emoji'=>[['300','normal','500','600','700'],['emoji']], + 'Noto Kufi Arabic'=>[['100','200','300','normal','500','600','700','800','900'],['arabic']], + 'Noto Music'=>[['normal'],['latin','latin-ext','music']], + 'Noto Naskh Arabic'=>[['normal','500','600','700'],['arabic','latin','latin-ext']], + 'Noto Nastaliq Urdu'=>[['normal','500','600','700'],['arabic','latin','latin-ext']], + 'Noto Rashi Hebrew'=>[['100','200','300','normal','500','600','700','800','900'],['hebrew','latin','latin-ext']], + 'Noto Sans'=>[['100','200','300','normal','500','600','700','800','900','100italic','200italic','300italic','italic','500italic','600italic','700italic','800italic','900italic'],['cyrillic','cyrillic-ext','devanagari','greek','greek-ext','latin','latin-ext','vietnamese']], + 'Noto Sans Adlam'=>[['normal','500','600','700'],['adlam','latin','latin-ext']], + 'Noto Sans Adlam Unjoined'=>[['normal','500','600','700'],['adlam','latin','latin-ext']], + 'Noto Sans Anatolian Hieroglyphs'=>[['normal'],['anatolian-hieroglyphs','latin','latin-ext']], + 'Noto Sans Arabic'=>[['100','200','300','normal','500','600','700','800','900'],['arabic']], + 'Noto Sans Armenian'=>[['100','200','300','normal','500','600','700','800','900'],['armenian','latin','latin-ext']], + 'Noto Sans Avestan'=>[['normal'],['avestan','latin','latin-ext']], + 'Noto Sans Balinese'=>[['normal','500','600','700'],['balinese','latin','latin-ext']], + 'Noto Sans Bamum'=>[['normal','500','600','700'],['bamum','latin','latin-ext']], + 'Noto Sans Bassa Vah'=>[['normal','500','600','700'],['bassa-vah','latin','latin-ext']], + 'Noto Sans Batak'=>[['normal'],['batak','latin','latin-ext']], + 'Noto Sans Bengali'=>[['100','200','300','normal','500','600','700','800','900'],['bengali','latin','latin-ext']], + 'Noto Sans Bhaiksuki'=>[['normal'],['bhaiksuki','latin','latin-ext']], + 'Noto Sans Brahmi'=>[['normal'],['brahmi','latin','latin-ext']], + 'Noto Sans Buginese'=>[['normal'],['buginese','latin','latin-ext']], + 'Noto Sans Buhid'=>[['normal'],['buhid','latin','latin-ext']], + 'Noto Sans Canadian Aboriginal'=>[['100','200','300','normal','500','600','700','800','900'],['canadian-aboriginal','latin','latin-ext']], + 'Noto Sans Carian'=>[['normal'],['carian','latin','latin-ext']], + 'Noto Sans Caucasian Albanian'=>[['normal'],['caucasian-albanian','latin','latin-ext']], + 'Noto Sans Chakma'=>[['normal'],['chakma','latin','latin-ext']], + 'Noto Sans Cham'=>[['100','200','300','normal','500','600','700','800','900'],['cham','latin','latin-ext']], + 'Noto Sans Cherokee'=>[['100','200','300','normal','500','600','700','800','900'],['cherokee','latin','latin-ext']], + 'Noto Sans Chorasmian'=>[['normal'],['chorasmian','latin','latin-ext','math','symbols']], + 'Noto Sans Coptic'=>[['normal'],['coptic','latin','latin-ext']], + 'Noto Sans Cuneiform'=>[['normal'],['cuneiform','latin','latin-ext']], + 'Noto Sans Cypriot'=>[['normal'],['cypriot','latin','latin-ext']], + 'Noto Sans Cypro Minoan'=>[['normal'],['cypro-minoan','latin','latin-ext']], + 'Noto Sans Deseret'=>[['normal'],['deseret','latin','latin-ext']], + 'Noto Sans Devanagari'=>[['100','200','300','normal','500','600','700','800','900'],['devanagari','latin','latin-ext']], + 'Noto Sans Display'=>[['100','200','300','normal','500','600','700','800','900','100italic','200italic','300italic','italic','500italic','600italic','700italic','800italic','900italic'],['cyrillic','cyrillic-ext','greek','greek-ext','latin','latin-ext','vietnamese']], + 'Noto Sans Duployan'=>[['normal','700'],['duployan','latin','latin-ext']], + 'Noto Sans Egyptian Hieroglyphs'=>[['normal'],['egyptian-hieroglyphs','latin','latin-ext']], + 'Noto Sans Elbasan'=>[['normal'],['elbasan','latin','latin-ext']], + 'Noto Sans Elymaic'=>[['normal'],['elymaic','latin','latin-ext']], + 'Noto Sans Ethiopic'=>[['100','200','300','normal','500','600','700','800','900'],['ethiopic','latin','latin-ext']], + 'Noto Sans Georgian'=>[['100','200','300','normal','500','600','700','800','900'],['georgian','latin','latin-ext']], + 'Noto Sans Glagolitic'=>[['normal'],['cyrillic-ext','glagolitic','latin','latin-ext','math','symbols']], + 'Noto Sans Gothic'=>[['normal'],['gothic','latin','latin-ext']], + 'Noto Sans Grantha'=>[['normal'],['grantha','latin','latin-ext']], + 'Noto Sans Gujarati'=>[['100','200','300','normal','500','600','700','800','900'],['gujarati','latin','latin-ext','math','symbols']], + 'Noto Sans Gunjala Gondi'=>[['normal','500','600','700'],['gunjala-gondi','latin','latin-ext']], + 'Noto Sans Gurmukhi'=>[['100','200','300','normal','500','600','700','800','900'],['gurmukhi','latin','latin-ext']], + 'Noto Sans HK'=>[['100','200','300','normal','500','600','700','800','900'],['chinese-hongkong','cyrillic','latin','latin-ext','vietnamese']], + 'Noto Sans Hanifi Rohingya'=>[['normal','500','600','700'],['hanifi-rohingya','latin','latin-ext']], + 'Noto Sans Hanunoo'=>[['normal'],['hanunoo','latin','latin-ext']], + 'Noto Sans Hatran'=>[['normal'],['hatran','latin','latin-ext']], + 'Noto Sans Hebrew'=>[['100','200','300','normal','500','600','700','800','900'],['hebrew','latin','latin-ext']], + 'Noto Sans Imperial Aramaic'=>[['normal'],['imperial-aramaic','latin','latin-ext']], + 'Noto Sans Indic Siyaq Numbers'=>[['normal'],['indic-siyaq-numbers','latin','latin-ext']], + 'Noto Sans Inscriptional Pahlavi'=>[['normal'],['inscriptional-pahlavi','latin','latin-ext']], + 'Noto Sans Inscriptional Parthian'=>[['normal'],['inscriptional-parthian','latin','latin-ext']], + 'Noto Sans JP'=>[['100','200','300','normal','500','600','700','800','900'],['cyrillic','japanese','latin','latin-ext','vietnamese']], + 'Noto Sans Javanese'=>[['normal','500','600','700'],['javanese','latin','latin-ext']], + 'Noto Sans KR'=>[['100','200','300','normal','500','600','700','800','900'],['cyrillic','korean','latin','latin-ext','vietnamese']], + 'Noto Sans Kaithi'=>[['normal'],['kaithi','latin','latin-ext']], + 'Noto Sans Kannada'=>[['100','200','300','normal','500','600','700','800','900'],['kannada','latin','latin-ext']], + 'Noto Sans Kawi'=>[['normal','500','600','700'],['kawi','latin','latin-ext']], + 'Noto Sans Kayah Li'=>[['normal','500','600','700'],['kayah-li','latin','latin-ext']], + 'Noto Sans Kharoshthi'=>[['normal'],['kharoshthi','latin','latin-ext']], + 'Noto Sans Khmer'=>[['100','200','300','normal','500','600','700','800','900'],['khmer','latin','latin-ext']], + 'Noto Sans Khojki'=>[['normal'],['khojki','latin','latin-ext']], + 'Noto Sans Khudawadi'=>[['normal'],['khudawadi','latin','latin-ext']], + 'Noto Sans Lao'=>[['100','200','300','normal','500','600','700','800','900'],['lao','latin','latin-ext']], + 'Noto Sans Lao Looped'=>[['100','200','300','normal','500','600','700','800','900'],['lao','latin','latin-ext']], + 'Noto Sans Lepcha'=>[['normal'],['latin','latin-ext','lepcha']], + 'Noto Sans Limbu'=>[['normal'],['latin','latin-ext','limbu']], + 'Noto Sans Linear A'=>[['normal'],['latin','latin-ext','linear-a']], + 'Noto Sans Linear B'=>[['normal'],['latin','latin-ext','linear-b']], + 'Noto Sans Lisu'=>[['normal','500','600','700'],['latin','latin-ext','lisu']], + 'Noto Sans Lycian'=>[['normal'],['lycian']], + 'Noto Sans Lydian'=>[['normal'],['latin','latin-ext','lydian']], + 'Noto Sans Mahajani'=>[['normal'],['latin','latin-ext','mahajani']], + 'Noto Sans Malayalam'=>[['100','200','300','normal','500','600','700','800','900'],['latin','latin-ext','malayalam']], + 'Noto Sans Mandaic'=>[['normal'],['latin','latin-ext','mandaic']], + 'Noto Sans Manichaean'=>[['normal'],['latin','latin-ext','manichaean']], + 'Noto Sans Marchen'=>[['normal'],['latin','latin-ext','marchen']], + 'Noto Sans Masaram Gondi'=>[['normal'],['latin','latin-ext','masaram-gondi']], + 'Noto Sans Math'=>[['normal'],['math']], + 'Noto Sans Mayan Numerals'=>[['normal'],['latin','latin-ext','mayan-numerals']], + 'Noto Sans Medefaidrin'=>[['normal','500','600','700'],['latin','latin-ext','medefaidrin']], + 'Noto Sans Meetei Mayek'=>[['100','200','300','normal','500','600','700','800','900'],['latin','latin-ext','meetei-mayek']], + 'Noto Sans Mende Kikakui'=>[['normal'],['latin','latin-ext','mende-kikakui']], + 'Noto Sans Meroitic'=>[['normal'],['latin','latin-ext','meroitic','meroitic-cursive','meroitic-hieroglyphs']], + 'Noto Sans Miao'=>[['normal'],['latin','latin-ext','miao']], + 'Noto Sans Modi'=>[['normal'],['latin','latin-ext','modi']], + 'Noto Sans Mongolian'=>[['normal'],['latin','latin-ext','mongolian']], + 'Noto Sans Mono'=>[['100','200','300','normal','500','600','700','800','900'],['cyrillic','cyrillic-ext','greek','greek-ext','latin','latin-ext','vietnamese']], + 'Noto Sans Mro'=>[['normal'],['latin','latin-ext','mro']], + 'Noto Sans Multani'=>[['normal'],['latin','latin-ext','multani']], + 'Noto Sans Myanmar'=>[['100','200','300','normal','500','600','700','800','900'],['myanmar']], + 'Noto Sans NKo'=>[['normal'],['latin','latin-ext','nko']], + 'Noto Sans NKo Unjoined'=>[['normal','500','600','700'],['latin','latin-ext','nko']], + 'Noto Sans Nabataean'=>[['normal'],['latin','latin-ext','nabataean']], + 'Noto Sans Nag Mundari'=>[['normal','500','600','700'],['latin','latin-ext','nag-mundari']], + 'Noto Sans Nandinagari'=>[['normal'],['latin','latin-ext','nandinagari']], + 'Noto Sans New Tai Lue'=>[['normal','500','600','700'],['latin','latin-ext','new-tai-lue']], + 'Noto Sans Newa'=>[['normal'],['latin','latin-ext','newa']], + 'Noto Sans Nushu'=>[['normal'],['latin','latin-ext','nushu']], + 'Noto Sans Ogham'=>[['normal'],['latin','latin-ext','ogham']], + 'Noto Sans Ol Chiki'=>[['normal','500','600','700'],['latin','latin-ext','ol-chiki']], + 'Noto Sans Old Hungarian'=>[['normal'],['latin','latin-ext','old-hungarian']], + 'Noto Sans Old Italic'=>[['normal'],['latin','latin-ext','old-italic']], + 'Noto Sans Old North Arabian'=>[['normal'],['latin','latin-ext','old-north-arabian']], + 'Noto Sans Old Permic'=>[['normal'],['cyrillic-ext','latin','latin-ext','old-permic']], + 'Noto Sans Old Persian'=>[['normal'],['latin','latin-ext','old-persian']], + 'Noto Sans Old Sogdian'=>[['normal'],['latin','latin-ext','old-sogdian']], + 'Noto Sans Old South Arabian'=>[['normal'],['latin','latin-ext','old-south-arabian']], + 'Noto Sans Old Turkic'=>[['normal'],['latin','latin-ext','old-turkic']], + 'Noto Sans Oriya'=>[['100','200','300','normal','500','600','700','800','900'],['latin','latin-ext','oriya']], + 'Noto Sans Osage'=>[['normal'],['latin','latin-ext','osage']], + 'Noto Sans Osmanya'=>[['normal'],['latin','latin-ext','osmanya']], + 'Noto Sans Pahawh Hmong'=>[['normal'],['latin','latin-ext','pahawh-hmong']], + 'Noto Sans Palmyrene'=>[['normal'],['latin','latin-ext','palmyrene']], + 'Noto Sans Pau Cin Hau'=>[['normal'],['latin','latin-ext','pau-cin-hau']], + 'Noto Sans Phags Pa'=>[['normal'],['phags-pa']], + 'Noto Sans Phoenician'=>[['normal'],['latin','latin-ext','phoenician']], + 'Noto Sans Psalter Pahlavi'=>[['normal'],['latin','latin-ext','psalter-pahlavi']], + 'Noto Sans Rejang'=>[['normal'],['latin','latin-ext','rejang']], + 'Noto Sans Runic'=>[['normal'],['latin','latin-ext','runic']], + 'Noto Sans SC'=>[['100','200','300','normal','500','600','700','800','900'],['chinese-simplified','cyrillic','latin','latin-ext','vietnamese']], + 'Noto Sans Samaritan'=>[['normal'],['latin','latin-ext','samaritan']], + 'Noto Sans Saurashtra'=>[['normal'],['latin','latin-ext','saurashtra']], + 'Noto Sans Sharada'=>[['normal'],['latin','latin-ext','sharada']], + 'Noto Sans Shavian'=>[['normal'],['latin','latin-ext','shavian']], + 'Noto Sans Siddham'=>[['normal'],['latin','latin-ext','siddham']], + 'Noto Sans SignWriting'=>[['normal'],['latin','latin-ext','signwriting']], + 'Noto Sans Sinhala'=>[['100','200','300','normal','500','600','700','800','900'],['latin','latin-ext','sinhala']], + 'Noto Sans Sogdian'=>[['normal'],['latin','latin-ext','sogdian']], + 'Noto Sans Sora Sompeng'=>[['normal','500','600','700'],['latin','latin-ext','sora-sompeng']], + 'Noto Sans Soyombo'=>[['normal'],['latin','latin-ext','soyombo']], + 'Noto Sans Sundanese'=>[['normal','500','600','700'],['latin','latin-ext','sundanese']], + 'Noto Sans Syloti Nagri'=>[['normal'],['latin','latin-ext','syloti-nagri']], + 'Noto Sans Symbols'=>[['100','200','300','normal','500','600','700','800','900'],['latin','latin-ext','symbols']], + 'Noto Sans Symbols 2'=>[['normal'],['braille','latin','latin-ext','math','mayan-numerals','symbols']], + 'Noto Sans Syriac'=>[['100','200','300','normal','500','600','700','800','900'],['latin','latin-ext','syriac']], + 'Noto Sans Syriac Eastern'=>[['100','200','300','normal','500','600','700','800','900'],['latin','latin-ext','syriac']], + 'Noto Sans TC'=>[['100','200','300','normal','500','600','700','800','900'],['chinese-traditional','cyrillic','latin','latin-ext','vietnamese']], + 'Noto Sans Tagalog'=>[['normal'],['latin','latin-ext','tagalog']], + 'Noto Sans Tagbanwa'=>[['normal'],['latin','latin-ext','tagbanwa']], + 'Noto Sans Tai Le'=>[['normal'],['latin','latin-ext','tai-le']], + 'Noto Sans Tai Tham'=>[['normal','500','600','700'],['latin','latin-ext','tai-tham']], + 'Noto Sans Tai Viet'=>[['normal'],['latin','latin-ext','tai-viet']], + 'Noto Sans Takri'=>[['normal'],['latin','latin-ext','takri']], + 'Noto Sans Tamil'=>[['100','200','300','normal','500','600','700','800','900'],['latin','latin-ext','tamil']], + 'Noto Sans Tamil Supplement'=>[['normal'],['latin','latin-ext','tamil-supplement']], + 'Noto Sans Tangsa'=>[['normal','500','600','700'],['latin','latin-ext','tangsa']], + 'Noto Sans Telugu'=>[['100','200','300','normal','500','600','700','800','900'],['latin','latin-ext','telugu']], + 'Noto Sans Thaana'=>[['100','200','300','normal','500','600','700','800','900'],['latin','latin-ext','thaana']], + 'Noto Sans Thai'=>[['100','200','300','normal','500','600','700','800','900'],['latin','latin-ext','thai']], + 'Noto Sans Thai Looped'=>[['100','200','300','normal','500','600','700','800','900'],['latin','latin-ext','thai']], + 'Noto Sans Tifinagh'=>[['normal'],['latin','latin-ext','tifinagh']], + 'Noto Sans Tirhuta'=>[['normal'],['latin','latin-ext','tirhuta']], + 'Noto Sans Ugaritic'=>[['normal'],['latin','latin-ext','ugaritic']], + 'Noto Sans Vai'=>[['normal'],['latin','latin-ext','vai']], + 'Noto Sans Vithkuqi'=>[['normal','500','600','700'],['latin','latin-ext','vithkuqi']], + 'Noto Sans Wancho'=>[['normal'],['latin','latin-ext','wancho']], + 'Noto Sans Warang Citi'=>[['normal'],['latin','latin-ext','warang-citi']], + 'Noto Sans Yi'=>[['normal'],['latin','latin-ext','yi']], + 'Noto Sans Zanabazar Square'=>[['normal'],['latin','latin-ext','zanabazar-square']], + 'Noto Serif'=>[['100','200','300','normal','500','600','700','800','900','100italic','200italic','300italic','italic','500italic','600italic','700italic','800italic','900italic'],['cyrillic','cyrillic-ext','greek','greek-ext','latin','latin-ext','vietnamese']], + 'Noto Serif Ahom'=>[['normal'],['ahom','latin','latin-ext']], + 'Noto Serif Armenian'=>[['100','200','300','normal','500','600','700','800','900'],['armenian','latin','latin-ext']], + 'Noto Serif Balinese'=>[['normal'],['balinese','latin','latin-ext']], + 'Noto Serif Bengali'=>[['100','200','300','normal','500','600','700','800','900'],['bengali','latin','latin-ext']], + 'Noto Serif Devanagari'=>[['100','200','300','normal','500','600','700','800','900'],['devanagari','latin','latin-ext']], + 'Noto Serif Display'=>[['100','200','300','normal','500','600','700','800','900','100italic','200italic','300italic','italic','500italic','600italic','700italic','800italic','900italic'],['cyrillic','cyrillic-ext','greek','greek-ext','latin','latin-ext','vietnamese']], + 'Noto Serif Dogra'=>[['normal'],['dogra','latin','latin-ext']], + 'Noto Serif Ethiopic'=>[['100','200','300','normal','500','600','700','800','900'],['ethiopic','latin','latin-ext']], + 'Noto Serif Georgian'=>[['100','200','300','normal','500','600','700','800','900'],['georgian','latin','latin-ext']], + 'Noto Serif Grantha'=>[['normal'],['grantha','latin','latin-ext']], + 'Noto Serif Gujarati'=>[['100','200','300','normal','500','600','700','800','900'],['gujarati','latin','latin-ext','math','symbols']], + 'Noto Serif Gurmukhi'=>[['100','200','300','normal','500','600','700','800','900'],['gurmukhi','latin','latin-ext']], + 'Noto Serif HK'=>[['200','300','normal','500','600','700','800','900'],['chinese-hongkong','cyrillic','latin','latin-ext','vietnamese']], + 'Noto Serif Hebrew'=>[['100','200','300','normal','500','600','700','800','900'],['hebrew','latin','latin-ext']], + 'Noto Serif JP'=>[['200','300','normal','500','600','700','900'],['japanese','latin']], + 'Noto Serif KR'=>[['200','300','normal','500','600','700','900'],['korean','latin']], + 'Noto Serif Kannada'=>[['100','200','300','normal','500','600','700','800','900'],['kannada','latin','latin-ext']], + 'Noto Serif Khitan Small Script'=>[['normal'],['khitan-small-script','latin','latin-ext']], + 'Noto Serif Khmer'=>[['100','200','300','normal','500','600','700','800','900'],['khmer','latin','latin-ext']], + 'Noto Serif Khojki'=>[['normal','500','600','700'],['khojki','latin','latin-ext']], + 'Noto Serif Lao'=>[['100','200','300','normal','500','600','700','800','900'],['lao','latin','latin-ext']], + 'Noto Serif Makasar'=>[['normal'],['latin','latin-ext','makasar']], + 'Noto Serif Malayalam'=>[['100','200','300','normal','500','600','700','800','900'],['latin','latin-ext','malayalam']], + 'Noto Serif Myanmar'=>[['100','200','300','normal','500','600','700','800','900'],['myanmar']], + 'Noto Serif NP Hmong'=>[['normal','500','600','700'],['latin','nyiakeng-puachue-hmong']], + 'Noto Serif Old Uyghur'=>[['normal'],['latin','latin-ext','old-uyghur']], + 'Noto Serif Oriya'=>[['normal','500','600','700'],['latin','latin-ext','oriya']], + 'Noto Serif Ottoman Siyaq'=>[['normal'],['latin','latin-ext','ottoman-siyaq-numbers']], + 'Noto Serif SC'=>[['200','300','normal','500','600','700','900'],['chinese-simplified','latin']], + 'Noto Serif Sinhala'=>[['100','200','300','normal','500','600','700','800','900'],['latin','latin-ext','sinhala']], + 'Noto Serif TC'=>[['200','300','normal','500','600','700','900'],['chinese-traditional','latin']], + 'Noto Serif Tamil'=>[['100','200','300','normal','500','600','700','800','900','100italic','200italic','300italic','italic','500italic','600italic','700italic','800italic','900italic'],['latin','latin-ext','tamil']], + 'Noto Serif Tangut'=>[['normal'],['latin','latin-ext','tangut']], + 'Noto Serif Telugu'=>[['100','200','300','normal','500','600','700','800','900'],['latin','latin-ext','telugu']], + 'Noto Serif Thai'=>[['100','200','300','normal','500','600','700','800','900'],['latin','latin-ext','thai']], + 'Noto Serif Tibetan'=>[['100','200','300','normal','500','600','700','800','900'],['latin','latin-ext','tibetan']], + 'Noto Serif Toto'=>[['normal','500','600','700'],['latin','latin-ext','toto']], + 'Noto Serif Vithkuqi'=>[['normal','500','600','700'],['latin','latin-ext','vithkuqi']], + 'Noto Serif Yezidi'=>[['normal','500','600','700'],['latin','latin-ext','yezidi']], + 'Noto Traditional Nushu'=>[['300','normal','500','600','700'],['latin','latin-ext','nushu']], + 'Nova Cut'=>[['normal'],['latin']], + 'Nova Flat'=>[['normal'],['latin']], + 'Nova Mono'=>[['normal'],['greek','latin']], + 'Nova Oval'=>[['normal'],['latin']], + 'Nova Round'=>[['normal'],['latin']], + 'Nova Script'=>[['normal'],['latin']], + 'Nova Slim'=>[['normal'],['latin']], + 'Nova Square'=>[['normal'],['latin']], + 'Numans'=>[['normal'],['latin']], + 'Nunito'=>[['200','300','normal','500','600','700','800','900','200italic','300italic','italic','500italic','600italic','700italic','800italic','900italic'],['cyrillic','cyrillic-ext','latin','latin-ext','vietnamese']], + 'Nunito Sans'=>[['200','300','normal','500','600','700','800','900','200italic','300italic','italic','500italic','600italic','700italic','800italic','900italic'],['cyrillic','cyrillic-ext','latin','latin-ext','vietnamese']], + 'Nuosu SIL'=>[['normal'],['latin','latin-ext','yi']], + 'Odibee Sans'=>[['normal'],['latin']], + 'Odor Mean Chey'=>[['normal'],['khmer','latin']], + 'Offside'=>[['normal'],['latin','latin-ext']], + 'Oi'=>[['normal'],['cyrillic','cyrillic-ext','greek','latin','latin-ext','tamil','vietnamese']], + 'Old Standard TT'=>[['normal','italic','700'],['cyrillic','cyrillic-ext','latin','latin-ext','vietnamese']], + 'Oldenburg'=>[['normal'],['latin','latin-ext']], + 'Ole'=>[['normal'],['latin','latin-ext','vietnamese']], + 'Oleo Script'=>[['normal','700'],['latin','latin-ext']], + 'Oleo Script Swash Caps'=>[['normal','700'],['latin','latin-ext']], + 'Onest'=>[['100','200','300','normal','500','600','700','800','900'],['cyrillic','cyrillic-ext','latin','latin-ext']], + 'Oooh Baby'=>[['normal'],['latin','latin-ext','vietnamese']], + 'Open Sans'=>[['300','normal','500','600','700','800','300italic','italic','500italic','600italic','700italic','800italic'],['cyrillic','cyrillic-ext','greek','greek-ext','hebrew','latin','latin-ext','math','symbols','vietnamese']], + 'Oranienbaum'=>[['normal'],['cyrillic','cyrillic-ext','latin','latin-ext']], + 'Orbit'=>[['normal'],['korean','latin','latin-ext']], + 'Orbitron'=>[['normal','500','600','700','800','900'],['latin']], + 'Oregano'=>[['normal','italic'],['latin','latin-ext']], + 'Orelega One'=>[['normal'],['cyrillic','cyrillic-ext','latin','latin-ext']], + 'Orienta'=>[['normal'],['latin','latin-ext']], + 'Original Surfer'=>[['normal'],['latin']], + 'Oswald'=>[['200','300','normal','500','600','700'],['cyrillic','cyrillic-ext','latin','latin-ext','vietnamese']], + 'Outfit'=>[['100','200','300','normal','500','600','700','800','900'],['latin','latin-ext']], + 'Over the Rainbow'=>[['normal'],['latin']], + 'Overlock'=>[['normal','italic','700','700italic','900','900italic'],['latin','latin-ext']], + 'Overlock SC'=>[['normal'],['latin','latin-ext']], + 'Overpass'=>[['100','200','300','normal','500','600','700','800','900','100italic','200italic','300italic','italic','500italic','600italic','700italic','800italic','900italic'],['cyrillic','cyrillic-ext','latin','latin-ext','vietnamese']], + 'Overpass Mono'=>[['300','normal','500','600','700'],['cyrillic','cyrillic-ext','latin','latin-ext','vietnamese']], + 'Ovo'=>[['normal'],['latin']], + 'Oxanium'=>[['200','300','normal','500','600','700','800'],['latin','latin-ext']], + 'Oxygen'=>[['300','normal','700'],['latin','latin-ext']], + 'Oxygen Mono'=>[['normal'],['latin','latin-ext']], + 'PT Mono'=>[['normal'],['cyrillic','cyrillic-ext','latin','latin-ext']], + 'PT Sans'=>[['normal','italic','700','700italic'],['cyrillic','cyrillic-ext','latin','latin-ext']], + 'PT Sans Caption'=>[['normal','700'],['cyrillic','cyrillic-ext','latin','latin-ext']], + 'PT Sans Narrow'=>[['normal','700'],['cyrillic','cyrillic-ext','latin','latin-ext']], + 'PT Serif'=>[['normal','italic','700','700italic'],['cyrillic','cyrillic-ext','latin','latin-ext']], + 'PT Serif Caption'=>[['normal','italic'],['cyrillic','cyrillic-ext','latin','latin-ext']], + 'Pacifico'=>[['normal'],['cyrillic','cyrillic-ext','latin','latin-ext','vietnamese']], + 'Padauk'=>[['normal','700'],['latin','latin-ext','myanmar']], + 'Padyakke Expanded One'=>[['normal'],['kannada','latin','latin-ext']], + 'Palanquin'=>[['100','200','300','normal','500','600','700'],['devanagari','latin','latin-ext']], + 'Palanquin Dark'=>[['normal','500','600','700'],['devanagari','latin','latin-ext']], + 'Palette Mosaic'=>[['normal'],['japanese','latin']], + 'Pangolin'=>[['normal'],['cyrillic','cyrillic-ext','latin','latin-ext','vietnamese']], + 'Paprika'=>[['normal'],['latin','latin-ext']], + 'Parisienne'=>[['normal'],['latin','latin-ext']], + 'Passero One'=>[['normal'],['latin','latin-ext']], + 'Passion One'=>[['normal','700','900'],['latin','latin-ext']], + 'Passions Conflict'=>[['normal'],['latin','latin-ext','vietnamese']], + 'Pathway Extreme'=>[['100','200','300','normal','500','600','700','800','900','100italic','200italic','300italic','italic','500italic','600italic','700italic','800italic','900italic'],['latin','latin-ext','vietnamese']], + 'Pathway Gothic One'=>[['normal'],['latin','latin-ext']], + 'Patrick Hand'=>[['normal'],['latin','latin-ext','vietnamese']], + 'Patrick Hand SC'=>[['normal'],['latin','latin-ext','vietnamese']], + 'Pattaya'=>[['normal'],['cyrillic','latin','latin-ext','thai','vietnamese']], + 'Patua One'=>[['normal'],['latin']], + 'Pavanam'=>[['normal'],['latin','latin-ext','tamil']], + 'Paytone One'=>[['normal'],['latin','latin-ext','vietnamese']], + 'Peddana'=>[['normal'],['latin','telugu']], + 'Peralta'=>[['normal'],['latin','latin-ext']], + 'Permanent Marker'=>[['normal'],['latin']], + 'Petemoss'=>[['normal'],['latin','latin-ext','vietnamese']], + 'Petit Formal Script'=>[['normal'],['latin','latin-ext']], + 'Petrona'=>[['100','200','300','normal','500','600','700','800','900','100italic','200italic','300italic','italic','500italic','600italic','700italic','800italic','900italic'],['latin','latin-ext','vietnamese']], + 'Philosopher'=>[['normal','italic','700','700italic'],['cyrillic','cyrillic-ext','latin','vietnamese']], + 'Phudu'=>[['300','normal','500','600','700','800','900'],['cyrillic-ext','latin','latin-ext','vietnamese']], + 'Piazzolla'=>[['100','200','300','normal','500','600','700','800','900','100italic','200italic','300italic','italic','500italic','600italic','700italic','800italic','900italic'],['cyrillic','cyrillic-ext','greek','greek-ext','latin','latin-ext','vietnamese']], + 'Piedra'=>[['normal'],['latin','latin-ext']], + 'Pinyon Script'=>[['normal'],['latin','latin-ext','vietnamese']], + 'Pirata One'=>[['normal'],['latin','latin-ext']], + 'Pixelify Sans'=>[['normal','500','600','700'],['cyrillic','latin','latin-ext']], + 'Plaster'=>[['normal'],['latin','latin-ext']], + 'Play'=>[['normal','700'],['cyrillic','cyrillic-ext','greek','latin','latin-ext','vietnamese']], + 'Playball'=>[['normal'],['latin','latin-ext','vietnamese']], + 'Playfair'=>[['300','normal','500','600','700','800','900','300italic','italic','500italic','600italic','700italic','800italic','900italic'],['cyrillic','cyrillic-ext','latin','latin-ext','vietnamese']], + 'Playfair Display'=>[['normal','500','600','700','800','900','italic','500italic','600italic','700italic','800italic','900italic'],['cyrillic','latin','latin-ext','vietnamese']], + 'Playfair Display SC'=>[['normal','italic','700','700italic','900','900italic'],['cyrillic','latin','latin-ext','vietnamese']], + 'Playpen Sans'=>[['100','200','300','normal','500','600','700','800'],['emoji','latin','latin-ext','math','vietnamese']], + 'Plus Jakarta Sans'=>[['200','300','normal','500','600','700','800','200italic','300italic','italic','500italic','600italic','700italic','800italic'],['cyrillic-ext','latin','latin-ext','vietnamese']], + 'Podkova'=>[['normal','500','600','700','800'],['cyrillic','cyrillic-ext','latin','latin-ext','vietnamese']], + 'Poiret One'=>[['normal'],['cyrillic','latin','latin-ext']], + 'Poller One'=>[['normal'],['latin']], + 'Poltawski Nowy'=>[['normal','500','600','700','italic','500italic','600italic','700italic'],['latin','latin-ext','vietnamese']], + 'Poly'=>[['normal','italic'],['latin']], + 'Pompiere'=>[['normal'],['latin']], + 'Pontano Sans'=>[['300','normal','500','600','700'],['latin','latin-ext']], + 'Poor Story'=>[['normal'],['korean','latin']], + 'Poppins'=>[['100','100italic','200','200italic','300','300italic','normal','italic','500','500italic','600','600italic','700','700italic','800','800italic','900','900italic'],['devanagari','latin','latin-ext']], + 'Port Lligat Sans'=>[['normal'],['latin']], + 'Port Lligat Slab'=>[['normal'],['latin']], + 'Potta One'=>[['normal'],['japanese','latin','latin-ext','vietnamese']], + 'Pragati Narrow'=>[['normal','700'],['devanagari','latin','latin-ext']], + 'Praise'=>[['normal'],['latin','latin-ext','vietnamese']], + 'Prata'=>[['normal'],['cyrillic','cyrillic-ext','latin','vietnamese']], + 'Preahvihear'=>[['normal'],['khmer','latin']], + 'Press Start 2P'=>[['normal'],['cyrillic','cyrillic-ext','greek','latin','latin-ext']], + 'Pridi'=>[['200','300','normal','500','600','700'],['latin','latin-ext','thai','vietnamese']], + 'Princess Sofia'=>[['normal'],['latin','latin-ext']], + 'Prociono'=>[['normal'],['latin']], + 'Prompt'=>[['100','100italic','200','200italic','300','300italic','normal','italic','500','500italic','600','600italic','700','700italic','800','800italic','900','900italic'],['latin','latin-ext','thai','vietnamese']], + 'Prosto One'=>[['normal'],['cyrillic','latin','latin-ext']], + 'Proza Libre'=>[['normal','italic','500','500italic','600','600italic','700','700italic','800','800italic'],['latin','latin-ext']], + 'Public Sans'=>[['100','200','300','normal','500','600','700','800','900','100italic','200italic','300italic','italic','500italic','600italic','700italic','800italic','900italic'],['latin','latin-ext','vietnamese']], + 'Puppies Play'=>[['normal'],['latin','latin-ext','vietnamese']], + 'Puritan'=>[['normal','italic','700','700italic'],['latin']], + 'Purple Purse'=>[['normal'],['latin','latin-ext']], + 'Qahiri'=>[['normal'],['arabic','latin']], + 'Quando'=>[['normal'],['latin','latin-ext']], + 'Quantico'=>[['normal','italic','700','700italic'],['latin']], + 'Quattrocento'=>[['normal','700'],['latin','latin-ext']], + 'Quattrocento Sans'=>[['normal','italic','700','700italic'],['latin','latin-ext']], + 'Questrial'=>[['normal'],['latin','latin-ext','vietnamese']], + 'Quicksand'=>[['300','normal','500','600','700'],['latin','latin-ext','vietnamese']], + 'Quintessential'=>[['normal'],['latin','latin-ext']], + 'Qwigley'=>[['normal'],['latin','latin-ext','vietnamese']], + 'Qwitcher Grypen'=>[['normal','700'],['latin','latin-ext','vietnamese']], + 'REM'=>[['100','200','300','normal','500','600','700','800','900','100italic','200italic','300italic','italic','500italic','600italic','700italic','800italic','900italic'],['latin','latin-ext','vietnamese']], + 'Racing Sans One'=>[['normal'],['latin','latin-ext']], + 'Radio Canada'=>[['300','normal','500','600','700','300italic','italic','500italic','600italic','700italic'],['canadian-aboriginal','latin','latin-ext','vietnamese']], + 'Radley'=>[['normal','italic'],['latin','latin-ext']], + 'Rajdhani'=>[['300','normal','500','600','700'],['devanagari','latin','latin-ext']], + 'Rakkas'=>[['normal'],['arabic','latin','latin-ext']], + 'Raleway'=>[['100','200','300','normal','500','600','700','800','900','100italic','200italic','300italic','italic','500italic','600italic','700italic','800italic','900italic'],['cyrillic','cyrillic-ext','latin','latin-ext','vietnamese']], + 'Raleway Dots'=>[['normal'],['latin','latin-ext']], + 'Ramabhadra'=>[['normal'],['latin','telugu']], + 'Ramaraja'=>[['normal'],['latin','telugu']], + 'Rambla'=>[['normal','italic','700','700italic'],['latin','latin-ext']], + 'Rammetto One'=>[['normal'],['latin','latin-ext']], + 'Rampart One'=>[['normal'],['cyrillic','japanese','latin','latin-ext']], + 'Ranchers'=>[['normal'],['latin','latin-ext']], + 'Rancho'=>[['normal'],['latin']], + 'Ranga'=>[['normal','700'],['devanagari','latin','latin-ext']], + 'Rasa'=>[['300','normal','500','600','700','300italic','italic','500italic','600italic','700italic'],['gujarati','latin','latin-ext','vietnamese']], + 'Rationale'=>[['normal'],['latin']], + 'Ravi Prakash'=>[['normal'],['latin','telugu']], + 'Readex Pro'=>[['200','300','normal','500','600','700'],['arabic','latin','latin-ext','vietnamese']], + 'Recursive'=>[['300','normal','500','600','700','800','900'],['cyrillic-ext','latin','latin-ext','vietnamese']], + 'Red Hat Display'=>[['300','normal','500','600','700','800','900','300italic','italic','500italic','600italic','700italic','800italic','900italic'],['latin','latin-ext']], + 'Red Hat Mono'=>[['300','normal','500','600','700','300italic','italic','500italic','600italic','700italic'],['latin','latin-ext']], + 'Red Hat Text'=>[['300','normal','500','600','700','300italic','italic','500italic','600italic','700italic'],['latin','latin-ext']], + 'Red Rose'=>[['300','normal','500','600','700'],['latin','latin-ext','vietnamese']], + 'Redacted'=>[['normal'],['latin','latin-ext']], + 'Redacted Script'=>[['300','normal','700'],['latin','latin-ext']], + 'Redressed'=>[['normal'],['latin']], + 'Reem Kufi'=>[['normal','500','600','700'],['arabic','latin','latin-ext','vietnamese']], + 'Reem Kufi Fun'=>[['normal','500','600','700'],['arabic','latin','latin-ext','vietnamese']], + 'Reem Kufi Ink'=>[['normal'],['arabic','latin','latin-ext','vietnamese']], + 'Reenie Beanie'=>[['normal'],['latin']], + 'Reggae One'=>[['normal'],['cyrillic','japanese','latin','latin-ext']], + 'Rethink Sans'=>[['normal','500','600','700','800','italic','500italic','600italic','700italic','800italic'],['latin','latin-ext']], + 'Revalia'=>[['normal'],['latin','latin-ext']], + 'Rhodium Libre'=>[['normal'],['devanagari','latin','latin-ext']], + 'Ribeye'=>[['normal'],['latin','latin-ext']], + 'Ribeye Marrow'=>[['normal'],['latin','latin-ext']], + 'Righteous'=>[['normal'],['latin','latin-ext']], + 'Risque'=>[['normal'],['latin','latin-ext']], + 'Road Rage'=>[['normal'],['latin','latin-ext','vietnamese']], + 'Roboto'=>[['100','100italic','300','300italic','normal','italic','500','500italic','700','700italic','900','900italic'],['cyrillic','cyrillic-ext','greek','greek-ext','latin','latin-ext','vietnamese']], + 'Roboto Condensed'=>[['100','200','300','normal','500','600','700','800','900','100italic','200italic','300italic','italic','500italic','600italic','700italic','800italic','900italic'],['cyrillic','cyrillic-ext','greek','greek-ext','latin','latin-ext','vietnamese']], + 'Roboto Flex'=>[['normal'],['cyrillic','cyrillic-ext','greek','latin','latin-ext','vietnamese']], + 'Roboto Mono'=>[['100','200','300','normal','500','600','700','100italic','200italic','300italic','italic','500italic','600italic','700italic'],['cyrillic','cyrillic-ext','greek','latin','latin-ext','vietnamese']], + 'Roboto Serif'=>[['100','200','300','normal','500','600','700','800','900','100italic','200italic','300italic','italic','500italic','600italic','700italic','800italic','900italic'],['cyrillic','cyrillic-ext','latin','latin-ext','vietnamese']], + 'Roboto Slab'=>[['100','200','300','normal','500','600','700','800','900'],['cyrillic','cyrillic-ext','greek','greek-ext','latin','latin-ext','vietnamese']], + 'Rochester'=>[['normal'],['latin']], + 'Rock 3D'=>[['normal'],['japanese','latin']], + 'Rock Salt'=>[['normal'],['latin']], + 'RocknRoll One'=>[['normal'],['cyrillic','japanese','latin','latin-ext']], + 'Rokkitt'=>[['100','200','300','normal','500','600','700','800','900','100italic','200italic','300italic','italic','500italic','600italic','700italic','800italic','900italic'],['latin','latin-ext','vietnamese']], + 'Romanesco'=>[['normal'],['latin','latin-ext']], + 'Ropa Sans'=>[['normal','italic'],['latin','latin-ext']], + 'Rosario'=>[['300','normal','500','600','700','300italic','italic','500italic','600italic','700italic'],['latin','latin-ext','vietnamese']], + 'Rosarivo'=>[['normal','italic'],['latin','latin-ext']], + 'Rouge Script'=>[['normal'],['latin']], + 'Rowdies'=>[['300','normal','700'],['latin','latin-ext','vietnamese']], + 'Rozha One'=>[['normal'],['devanagari','latin','latin-ext']], + 'Rubik'=>[['300','normal','500','600','700','800','900','300italic','italic','500italic','600italic','700italic','800italic','900italic'],['arabic','cyrillic','cyrillic-ext','hebrew','latin','latin-ext']], + 'Rubik 80s Fade'=>[['normal'],['cyrillic','cyrillic-ext','hebrew','latin','latin-ext']], + 'Rubik Beastly'=>[['normal'],['cyrillic','cyrillic-ext','hebrew','latin','latin-ext']], + 'Rubik Broken Fax'=>[['normal'],['cyrillic','cyrillic-ext','hebrew','latin','latin-ext','math','symbols']], + 'Rubik Bubbles'=>[['normal'],['cyrillic','cyrillic-ext','hebrew','latin','latin-ext']], + 'Rubik Burned'=>[['normal'],['cyrillic','cyrillic-ext','hebrew','latin','latin-ext']], + 'Rubik Dirt'=>[['normal'],['cyrillic','cyrillic-ext','hebrew','latin','latin-ext']], + 'Rubik Distressed'=>[['normal'],['cyrillic','cyrillic-ext','hebrew','latin','latin-ext']], + 'Rubik Doodle Shadow'=>[['normal'],['cyrillic','cyrillic-ext','hebrew','latin','latin-ext','math','symbols']], + 'Rubik Doodle Triangles'=>[['normal'],['cyrillic','cyrillic-ext','hebrew','latin','latin-ext','math','symbols']], + 'Rubik Gemstones'=>[['normal'],['cyrillic','cyrillic-ext','hebrew','latin','latin-ext']], + 'Rubik Glitch'=>[['normal'],['cyrillic','cyrillic-ext','hebrew','latin','latin-ext']], + 'Rubik Glitch Pop'=>[['normal'],['cyrillic','cyrillic-ext','hebrew','latin','latin-ext','math','symbols']], + 'Rubik Iso'=>[['normal'],['cyrillic','cyrillic-ext','hebrew','latin','latin-ext']], + 'Rubik Lines'=>[['normal'],['cyrillic','cyrillic-ext','hebrew','latin','latin-ext','math','symbols']], + 'Rubik Maps'=>[['normal'],['cyrillic','cyrillic-ext','hebrew','latin','latin-ext','math','symbols']], + 'Rubik Marker Hatch'=>[['normal'],['cyrillic','cyrillic-ext','hebrew','latin','latin-ext']], + 'Rubik Maze'=>[['normal'],['cyrillic','cyrillic-ext','hebrew','latin','latin-ext']], + 'Rubik Microbe'=>[['normal'],['cyrillic','cyrillic-ext','hebrew','latin','latin-ext']], + 'Rubik Mono One'=>[['normal'],['cyrillic','latin','latin-ext']], + 'Rubik Moonrocks'=>[['normal'],['cyrillic','cyrillic-ext','hebrew','latin','latin-ext']], + 'Rubik Pixels'=>[['normal'],['cyrillic','cyrillic-ext','hebrew','latin','latin-ext']], + 'Rubik Puddles'=>[['normal'],['cyrillic','cyrillic-ext','hebrew','latin','latin-ext']], + 'Rubik Scribble'=>[['normal'],['cyrillic','cyrillic-ext','hebrew','latin','latin-ext','math','symbols']], + 'Rubik Spray Paint'=>[['normal'],['cyrillic','cyrillic-ext','hebrew','latin','latin-ext']], + 'Rubik Storm'=>[['normal'],['cyrillic','cyrillic-ext','hebrew','latin','latin-ext']], + 'Rubik Vinyl'=>[['normal'],['cyrillic','cyrillic-ext','hebrew','latin','latin-ext']], + 'Rubik Wet Paint'=>[['normal'],['cyrillic','cyrillic-ext','hebrew','latin','latin-ext']], + 'Ruda'=>[['normal','500','600','700','800','900'],['cyrillic','latin','latin-ext','vietnamese']], + 'Rufina'=>[['normal','700'],['latin','latin-ext']], + 'Ruge Boogie'=>[['normal'],['latin','latin-ext','vietnamese']], + 'Ruluko'=>[['normal'],['latin','latin-ext']], + 'Rum Raisin'=>[['normal'],['latin','latin-ext']], + 'Ruslan Display'=>[['normal'],['cyrillic','latin','latin-ext','math','symbols']], + 'Russo One'=>[['normal'],['cyrillic','latin','latin-ext']], + 'Ruthie'=>[['normal'],['latin','latin-ext','vietnamese']], + 'Ruwudu'=>[['normal','500','600','700'],['arabic','latin','latin-ext']], + 'Rye'=>[['normal'],['latin','latin-ext']], + 'STIX Two Text'=>[['normal','500','600','700','italic','500italic','600italic','700italic'],['cyrillic','cyrillic-ext','greek','latin','latin-ext','vietnamese']], + 'Sacramento'=>[['normal'],['latin','latin-ext']], + 'Sahitya'=>[['normal','700'],['devanagari','latin']], + 'Sail'=>[['normal'],['latin','latin-ext']], + 'Saira'=>[['100','200','300','normal','500','600','700','800','900','100italic','200italic','300italic','italic','500italic','600italic','700italic','800italic','900italic'],['latin','latin-ext','vietnamese']], + 'Saira Condensed'=>[['100','200','300','normal','500','600','700','800','900'],['latin','latin-ext','vietnamese']], + 'Saira Extra Condensed'=>[['100','200','300','normal','500','600','700','800','900'],['latin','latin-ext','vietnamese']], + 'Saira Semi Condensed'=>[['100','200','300','normal','500','600','700','800','900'],['latin','latin-ext','vietnamese']], + 'Saira Stencil One'=>[['normal'],['latin','latin-ext','vietnamese']], + 'Salsa'=>[['normal'],['latin']], + 'Sanchez'=>[['normal','italic'],['latin','latin-ext']], + 'Sancreek'=>[['normal'],['latin','latin-ext']], + 'Sansita'=>[['normal','italic','700','700italic','800','800italic','900','900italic'],['latin','latin-ext']], + 'Sansita Swashed'=>[['300','normal','500','600','700','800','900'],['latin','latin-ext','vietnamese']], + 'Sarabun'=>[['100','100italic','200','200italic','300','300italic','normal','italic','500','500italic','600','600italic','700','700italic','800','800italic'],['latin','latin-ext','thai','vietnamese']], + 'Sarala'=>[['normal','700'],['devanagari','latin','latin-ext']], + 'Sarina'=>[['normal'],['latin','latin-ext']], + 'Sarpanch'=>[['normal','500','600','700','800','900'],['devanagari','latin','latin-ext']], + 'Sassy Frass'=>[['normal'],['latin','latin-ext','vietnamese']], + 'Satisfy'=>[['normal'],['latin']], + 'Sawarabi Gothic'=>[['normal'],['cyrillic','japanese','latin','latin-ext','vietnamese']], + 'Sawarabi Mincho'=>[['normal'],['japanese','latin','latin-ext']], + 'Scada'=>[['normal','italic','700','700italic'],['cyrillic','cyrillic-ext','latin','latin-ext']], + 'Scheherazade New'=>[['normal','500','600','700'],['arabic','latin','latin-ext']], + 'Schibsted Grotesk'=>[['normal','500','600','700','800','900','italic','500italic','600italic','700italic','800italic','900italic'],['latin','latin-ext']], + 'Schoolbell'=>[['normal'],['latin']], + 'Scope One'=>[['normal'],['latin','latin-ext']], + 'Seaweed Script'=>[['normal'],['latin','latin-ext']], + 'Secular One'=>[['normal'],['hebrew','latin','latin-ext']], + 'Sedgwick Ave'=>[['normal'],['latin','latin-ext','vietnamese']], + 'Sedgwick Ave Display'=>[['normal'],['latin','latin-ext','vietnamese']], + 'Sen'=>[['normal','500','600','700','800'],['latin','latin-ext']], + 'Send Flowers'=>[['normal'],['latin','latin-ext','vietnamese']], + 'Sevillana'=>[['normal'],['latin','latin-ext']], + 'Seymour One'=>[['normal'],['cyrillic','latin','latin-ext']], + 'Shadows Into Light'=>[['normal'],['latin']], + 'Shadows Into Light Two'=>[['normal'],['latin','latin-ext']], + 'Shalimar'=>[['normal'],['latin','latin-ext','vietnamese']], + 'Shantell Sans'=>[['300','normal','500','600','700','800','300italic','italic','500italic','600italic','700italic','800italic'],['cyrillic','cyrillic-ext','latin','latin-ext','vietnamese']], + 'Shanti'=>[['normal'],['latin','latin-ext']], + 'Share'=>[['normal','italic','700','700italic'],['latin','latin-ext']], + 'Share Tech'=>[['normal'],['latin']], + 'Share Tech Mono'=>[['normal'],['latin']], + 'Shippori Antique'=>[['normal'],['japanese','latin','latin-ext']], + 'Shippori Antique B1'=>[['normal'],['japanese','latin','latin-ext']], + 'Shippori Mincho'=>[['normal','500','600','700','800'],['japanese','latin','latin-ext']], + 'Shippori Mincho B1'=>[['normal','500','600','700','800'],['japanese','latin','latin-ext']], + 'Shizuru'=>[['normal'],['japanese','latin']], + 'Shojumaru'=>[['normal'],['latin','latin-ext']], + 'Short Stack'=>[['normal'],['latin']], + 'Shrikhand'=>[['normal'],['gujarati','latin','latin-ext']], + 'Siemreap'=>[['normal'],['khmer']], + 'Sigmar'=>[['normal'],['latin','latin-ext','vietnamese']], + 'Sigmar One'=>[['normal'],['latin','latin-ext','vietnamese']], + 'Signika'=>[['300','normal','500','600','700'],['latin','latin-ext','vietnamese']], + 'Signika Negative'=>[['300','normal','500','600','700'],['latin','latin-ext','vietnamese']], + 'Silkscreen'=>[['normal','700'],['latin','latin-ext']], + 'Simonetta'=>[['normal','italic','900','900italic'],['latin','latin-ext']], + 'Single Day'=>[['normal'],['korean']], + 'Sintony'=>[['normal','700'],['latin','latin-ext']], + 'Sirin Stencil'=>[['normal'],['latin']], + 'Six Caps'=>[['normal'],['latin']], + 'Sixtyfour'=>[['normal'],['latin','latin-ext','math','symbols']], + 'Skranji'=>[['normal','700'],['latin','latin-ext']], + 'Slabo 13px'=>[['normal'],['latin','latin-ext']], + 'Slabo 27px'=>[['normal'],['latin','latin-ext']], + 'Slackey'=>[['normal'],['latin']], + 'Slackside One'=>[['normal'],['japanese','latin','latin-ext']], + 'Smokum'=>[['normal'],['latin']], + 'Smooch'=>[['normal'],['latin','latin-ext','vietnamese']], + 'Smooch Sans'=>[['100','200','300','normal','500','600','700','800','900'],['latin','latin-ext','vietnamese']], + 'Smythe'=>[['normal'],['latin']], + 'Sniglet'=>[['normal','800'],['latin','latin-ext']], + 'Snippet'=>[['normal'],['latin']], + 'Snowburst One'=>[['normal'],['latin','latin-ext']], + 'Sofadi One'=>[['normal'],['latin']], + 'Sofia'=>[['normal'],['latin']], + 'Sofia Sans'=>[['100','200','300','normal','500','600','700','800','900','100italic','200italic','300italic','italic','500italic','600italic','700italic','800italic','900italic'],['cyrillic','cyrillic-ext','greek','latin','latin-ext']], + 'Sofia Sans Condensed'=>[['100','200','300','normal','500','600','700','800','900','100italic','200italic','300italic','italic','500italic','600italic','700italic','800italic','900italic'],['cyrillic','cyrillic-ext','greek','latin','latin-ext']], + 'Sofia Sans Extra Condensed'=>[['100','200','300','normal','500','600','700','800','900','100italic','200italic','300italic','italic','500italic','600italic','700italic','800italic','900italic'],['cyrillic','cyrillic-ext','greek','latin','latin-ext']], + 'Sofia Sans Semi Condensed'=>[['100','200','300','normal','500','600','700','800','900','100italic','200italic','300italic','italic','500italic','600italic','700italic','800italic','900italic'],['cyrillic','cyrillic-ext','greek','latin','latin-ext']], + 'Solitreo'=>[['normal'],['hebrew','latin','latin-ext']], + 'Solway'=>[['300','normal','500','700','800'],['latin']], + 'Sometype Mono'=>[['normal','500','600','700','italic','500italic','600italic','700italic'],['latin','latin-ext']], + 'Song Myung'=>[['normal'],['korean','latin']], + 'Sono'=>[['200','300','normal','500','600','700','800'],['latin','latin-ext','vietnamese']], + 'Sonsie One'=>[['normal'],['latin','latin-ext']], + 'Sora'=>[['100','200','300','normal','500','600','700','800'],['latin','latin-ext']], + 'Sorts Mill Goudy'=>[['normal','italic'],['latin','latin-ext']], + 'Source Code Pro'=>[['200','300','normal','500','600','700','800','900','200italic','300italic','italic','500italic','600italic','700italic','800italic','900italic'],['cyrillic','cyrillic-ext','greek','greek-ext','latin','latin-ext','vietnamese']], + 'Source Sans 3'=>[['200','300','normal','500','600','700','800','900','200italic','300italic','italic','500italic','600italic','700italic','800italic','900italic'],['cyrillic','cyrillic-ext','greek','greek-ext','latin','latin-ext','vietnamese']], + 'Source Serif 4'=>[['200','300','normal','500','600','700','800','900','200italic','300italic','italic','500italic','600italic','700italic','800italic','900italic'],['cyrillic','cyrillic-ext','greek','latin','latin-ext','vietnamese']], + 'Space Grotesk'=>[['300','normal','500','600','700'],['latin','latin-ext','vietnamese']], + 'Space Mono'=>[['normal','italic','700','700italic'],['latin','latin-ext','vietnamese']], + 'Special Elite'=>[['normal'],['latin']], + 'Spectral'=>[['200','200italic','300','300italic','normal','italic','500','500italic','600','600italic','700','700italic','800','800italic'],['cyrillic','latin','latin-ext','vietnamese']], + 'Spectral SC'=>[['200','200italic','300','300italic','normal','italic','500','500italic','600','600italic','700','700italic','800','800italic'],['cyrillic','latin','latin-ext','vietnamese']], + 'Spicy Rice'=>[['normal'],['latin']], + 'Spinnaker'=>[['normal'],['latin','latin-ext']], + 'Spirax'=>[['normal'],['latin']], + 'Splash'=>[['normal'],['latin','latin-ext','vietnamese']], + 'Spline Sans'=>[['300','normal','500','600','700'],['latin','latin-ext']], + 'Spline Sans Mono'=>[['300','normal','500','600','700','300italic','italic','500italic','600italic','700italic'],['latin','latin-ext']], + 'Squada One'=>[['normal'],['latin']], + 'Square Peg'=>[['normal'],['latin','latin-ext','vietnamese']], + 'Sree Krushnadevaraya'=>[['normal'],['latin','telugu']], + 'Sriracha'=>[['normal'],['latin','latin-ext','thai','vietnamese']], + 'Srisakdi'=>[['normal','700'],['latin','latin-ext','thai','vietnamese']], + 'Staatliches'=>[['normal'],['latin','latin-ext']], + 'Stalemate'=>[['normal'],['latin','latin-ext']], + 'Stalinist One'=>[['normal'],['cyrillic','latin','latin-ext']], + 'Stardos Stencil'=>[['normal','700'],['latin']], + 'Stick'=>[['normal'],['cyrillic','japanese','latin','latin-ext']], + 'Stick No Bills'=>[['200','300','normal','500','600','700','800'],['latin','latin-ext','sinhala']], + 'Stint Ultra Condensed'=>[['normal'],['latin','latin-ext']], + 'Stint Ultra Expanded'=>[['normal'],['latin','latin-ext']], + 'Stoke'=>[['300','normal'],['latin','latin-ext']], + 'Strait'=>[['normal'],['latin','latin-ext']], + 'Style Script'=>[['normal'],['latin','latin-ext','vietnamese']], + 'Stylish'=>[['normal'],['korean','latin']], + 'Sue Ellen Francisco'=>[['normal'],['latin']], + 'Suez One'=>[['normal'],['hebrew','latin','latin-ext']], + 'Sulphur Point'=>[['300','normal','700'],['latin','latin-ext']], + 'Sumana'=>[['normal','700'],['devanagari','latin','latin-ext']], + 'Sunflower'=>[['300','500','700'],['korean','latin']], + 'Sunshiney'=>[['normal'],['latin']], + 'Supermercado One'=>[['normal'],['latin']], + 'Sura'=>[['normal','700'],['devanagari','latin','latin-ext']], + 'Suranna'=>[['normal'],['latin','telugu']], + 'Suravaram'=>[['normal'],['latin','telugu']], + 'Suwannaphum'=>[['100','300','normal','700','900'],['khmer','latin']], + 'Swanky and Moo Moo'=>[['normal'],['latin']], + 'Syncopate'=>[['normal','700'],['latin']], + 'Syne'=>[['normal','500','600','700','800'],['greek','latin','latin-ext']], + 'Syne Mono'=>[['normal'],['latin','latin-ext']], + 'Syne Tactile'=>[['normal'],['latin','latin-ext']], + 'Tai Heritage Pro'=>[['normal','700'],['latin','latin-ext','tai-viet','vietnamese']], + 'Tajawal'=>[['200','300','normal','500','700','800','900'],['arabic','latin']], + 'Tangerine'=>[['normal','700'],['latin']], + 'Tapestry'=>[['normal'],['latin','latin-ext','vietnamese']], + 'Taprom'=>[['normal'],['khmer','latin']], + 'Tauri'=>[['normal'],['latin','latin-ext']], + 'Taviraj'=>[['100','100italic','200','200italic','300','300italic','normal','italic','500','500italic','600','600italic','700','700italic','800','800italic','900','900italic'],['latin','latin-ext','thai','vietnamese']], + 'Teko'=>[['300','normal','500','600','700'],['devanagari','latin','latin-ext']], + 'Tektur'=>[['normal','500','600','700','800','900'],['cyrillic','cyrillic-ext','greek','latin','latin-ext','vietnamese']], + 'Telex'=>[['normal'],['latin','latin-ext']], + 'Tenali Ramakrishna'=>[['normal'],['latin','telugu']], + 'Tenor Sans'=>[['normal'],['cyrillic','latin','latin-ext']], + 'Text Me One'=>[['normal'],['latin','latin-ext']], + 'Texturina'=>[['100','200','300','normal','500','600','700','800','900','100italic','200italic','300italic','italic','500italic','600italic','700italic','800italic','900italic'],['latin','latin-ext','vietnamese']], + 'Thasadith'=>[['normal','italic','700','700italic'],['latin','latin-ext','thai','vietnamese']], + 'The Girl Next Door'=>[['normal'],['latin']], + 'The Nautigal'=>[['normal','700'],['latin','latin-ext','vietnamese']], + 'Tienne'=>[['normal','700','900'],['latin']], + 'Tillana'=>[['normal','500','600','700','800'],['devanagari','latin','latin-ext']], + 'Tilt Neon'=>[['normal'],['latin','latin-ext','vietnamese']], + 'Tilt Prism'=>[['normal'],['latin','latin-ext','vietnamese']], + 'Tilt Warp'=>[['normal'],['latin','latin-ext','vietnamese']], + 'Timmana'=>[['normal'],['latin','telugu']], + 'Tinos'=>[['normal','italic','700','700italic'],['cyrillic','cyrillic-ext','greek','greek-ext','hebrew','latin','latin-ext','vietnamese']], + 'Tiro Bangla'=>[['normal','italic'],['bengali','latin','latin-ext']], + 'Tiro Devanagari Hindi'=>[['normal','italic'],['devanagari','latin','latin-ext']], + 'Tiro Devanagari Marathi'=>[['normal','italic'],['devanagari','latin','latin-ext']], + 'Tiro Devanagari Sanskrit'=>[['normal','italic'],['devanagari','latin','latin-ext']], + 'Tiro Gurmukhi'=>[['normal','italic'],['gurmukhi','latin','latin-ext']], + 'Tiro Kannada'=>[['normal','italic'],['kannada','latin','latin-ext']], + 'Tiro Tamil'=>[['normal','italic'],['latin','latin-ext','tamil']], + 'Tiro Telugu'=>[['normal','italic'],['latin','latin-ext','telugu']], + 'Titan One'=>[['normal'],['latin','latin-ext']], + 'Titillium Web'=>[['200','200italic','300','300italic','normal','italic','600','600italic','700','700italic','900'],['latin','latin-ext']], + 'Tomorrow'=>[['100','100italic','200','200italic','300','300italic','normal','italic','500','500italic','600','600italic','700','700italic','800','800italic','900','900italic'],['latin','latin-ext']], + 'Tourney'=>[['100','200','300','normal','500','600','700','800','900','100italic','200italic','300italic','italic','500italic','600italic','700italic','800italic','900italic'],['latin','latin-ext','vietnamese']], + 'Trade Winds'=>[['normal'],['latin']], + 'Train One'=>[['normal'],['cyrillic','japanese','latin','latin-ext']], + 'Trirong'=>[['100','100italic','200','200italic','300','300italic','normal','italic','500','500italic','600','600italic','700','700italic','800','800italic','900','900italic'],['latin','latin-ext','thai','vietnamese']], + 'Trispace'=>[['100','200','300','normal','500','600','700','800'],['latin','latin-ext','vietnamese']], + 'Trocchi'=>[['normal'],['latin','latin-ext']], + 'Trochut'=>[['normal','italic','700'],['latin']], + 'Truculenta'=>[['100','200','300','normal','500','600','700','800','900'],['latin','latin-ext','vietnamese']], + 'Trykker'=>[['normal'],['latin','latin-ext']], + 'Tsukimi Rounded'=>[['300','normal','500','600','700'],['japanese','latin','latin-ext']], + 'Tulpen One'=>[['normal'],['latin']], + 'Turret Road'=>[['200','300','normal','500','700','800'],['latin','latin-ext']], + 'Twinkle Star'=>[['normal'],['latin','latin-ext','vietnamese']], + 'Ubuntu'=>[['300','300italic','normal','italic','500','500italic','700','700italic'],['cyrillic','cyrillic-ext','greek','greek-ext','latin','latin-ext']], + 'Ubuntu Condensed'=>[['normal'],['cyrillic','cyrillic-ext','greek','greek-ext','latin','latin-ext']], + 'Ubuntu Mono'=>[['normal','italic','700','700italic'],['cyrillic','cyrillic-ext','greek','greek-ext','latin','latin-ext']], + 'Uchen'=>[['normal'],['latin','tibetan']], + 'Ultra'=>[['normal'],['latin']], + 'Unbounded'=>[['200','300','normal','500','600','700','800','900'],['cyrillic','cyrillic-ext','latin','latin-ext','vietnamese']], + 'Uncial Antiqua'=>[['normal'],['latin']], + 'Underdog'=>[['normal'],['cyrillic','latin','latin-ext']], + 'Unica One'=>[['normal'],['latin','latin-ext','vietnamese']], + 'UnifrakturCook'=>[['700'],['latin']], + 'UnifrakturMaguntia'=>[['normal'],['latin']], + 'Unkempt'=>[['normal','700'],['latin']], + 'Unlock'=>[['normal'],['latin','latin-ext']], + 'Unna'=>[['normal','italic','700','700italic'],['latin','latin-ext']], + 'Updock'=>[['normal'],['latin','latin-ext','vietnamese']], + 'Urbanist'=>[['100','200','300','normal','500','600','700','800','900','100italic','200italic','300italic','italic','500italic','600italic','700italic','800italic','900italic'],['latin','latin-ext']], + 'VT323'=>[['normal'],['latin','latin-ext','vietnamese']], + 'Vampiro One'=>[['normal'],['latin','latin-ext']], + 'Varela'=>[['normal'],['latin','latin-ext']], + 'Varela Round'=>[['normal'],['hebrew','latin','latin-ext','vietnamese']], + 'Varta'=>[['300','normal','500','600','700'],['latin','latin-ext','vietnamese']], + 'Vast Shadow'=>[['normal'],['latin']], + 'Vazirmatn'=>[['100','200','300','normal','500','600','700','800','900'],['arabic','latin','latin-ext']], + 'Vesper Libre'=>[['normal','500','700','900'],['devanagari','latin','latin-ext']], + 'Viaoda Libre'=>[['normal'],['cyrillic','cyrillic-ext','latin','latin-ext','vietnamese']], + 'Vibes'=>[['normal'],['arabic','latin']], + 'Vibur'=>[['normal'],['latin']], + 'Victor Mono'=>[['100','200','300','normal','500','600','700','100italic','200italic','300italic','italic','500italic','600italic','700italic'],['cyrillic','cyrillic-ext','greek','latin','latin-ext','vietnamese']], + 'Vidaloka'=>[['normal'],['latin']], + 'Viga'=>[['normal'],['latin','latin-ext']], + 'Vina Sans'=>[['normal'],['latin','latin-ext','vietnamese']], + 'Voces'=>[['normal'],['latin','latin-ext']], + 'Volkhov'=>[['normal','italic','700','700italic'],['latin']], + 'Vollkorn'=>[['normal','500','600','700','800','900','italic','500italic','600italic','700italic','800italic','900italic'],['cyrillic','cyrillic-ext','greek','latin','latin-ext','vietnamese']], + 'Vollkorn SC'=>[['normal','600','700','900'],['cyrillic','cyrillic-ext','latin','latin-ext','vietnamese']], + 'Voltaire'=>[['normal'],['latin','latin-ext','vietnamese']], + 'Vujahday Script'=>[['normal'],['latin','latin-ext','vietnamese']], + 'Waiting for the Sunrise'=>[['normal'],['latin']], + 'Wallpoet'=>[['normal'],['latin']], + 'Walter Turncoat'=>[['normal'],['latin']], + 'Warnes'=>[['normal'],['latin','latin-ext']], + 'Water Brush'=>[['normal'],['latin','latin-ext','vietnamese']], + 'Waterfall'=>[['normal'],['latin','latin-ext','vietnamese']], + 'Wavefont'=>[['100','200','300','normal','500','600','700','800','900'],['latin']], + 'Wellfleet'=>[['normal'],['latin','latin-ext']], + 'Wendy One'=>[['normal'],['latin','latin-ext']], + 'Whisper'=>[['normal'],['latin','latin-ext','vietnamese']], + 'WindSong'=>[['normal','500'],['latin','latin-ext','vietnamese']], + 'Wire One'=>[['normal'],['latin']], + 'Wix Madefor Display'=>[['normal','500','600','700','800'],['cyrillic','cyrillic-ext','latin','latin-ext','vietnamese']], + 'Wix Madefor Text'=>[['normal','italic','500','500italic','600','600italic','700','700italic','800','800italic'],['cyrillic','cyrillic-ext','latin','latin-ext','vietnamese']], + 'Work Sans'=>[['100','200','300','normal','500','600','700','800','900','100italic','200italic','300italic','italic','500italic','600italic','700italic','800italic','900italic'],['latin','latin-ext','vietnamese']], + 'Workbench'=>[['normal'],['latin','math','symbols']], + 'Xanh Mono'=>[['normal','italic'],['latin','latin-ext','vietnamese']], + 'Yaldevi'=>[['200','300','normal','500','600','700'],['latin','latin-ext','sinhala']], + 'Yanone Kaffeesatz'=>[['200','300','normal','500','600','700'],['cyrillic','latin','latin-ext','vietnamese']], + 'Yantramanav'=>[['100','300','normal','500','700','900'],['devanagari','latin','latin-ext']], + 'Yatra One'=>[['normal'],['devanagari','latin','latin-ext']], + 'Yellowtail'=>[['normal'],['latin']], + 'Yeon Sung'=>[['normal'],['korean','latin']], + 'Yeseva One'=>[['normal'],['cyrillic','cyrillic-ext','latin','latin-ext','vietnamese']], + 'Yesteryear'=>[['normal'],['latin']], + 'Yomogi'=>[['normal'],['cyrillic','japanese','latin','latin-ext','vietnamese']], + 'Young Serif'=>[['normal'],['latin','latin-ext']], + 'Yrsa'=>[['300','normal','500','600','700','300italic','italic','500italic','600italic','700italic'],['latin','latin-ext','vietnamese']], + 'Ysabeau'=>[['100','200','300','normal','500','600','700','800','900','100italic','200italic','300italic','italic','500italic','600italic','700italic','800italic','900italic'],['cyrillic','cyrillic-ext','greek','latin','latin-ext','math','symbols','vietnamese']], + 'Ysabeau Infant'=>[['100','200','300','normal','500','600','700','800','900','100italic','200italic','300italic','italic','500italic','600italic','700italic','800italic','900italic'],['cyrillic','cyrillic-ext','greek','latin','latin-ext','math','symbols','vietnamese']], + 'Ysabeau Office'=>[['100','200','300','normal','500','600','700','800','900','100italic','200italic','300italic','italic','500italic','600italic','700italic','800italic','900italic'],['cyrillic','cyrillic-ext','greek','latin','latin-ext','math','symbols','vietnamese']], + 'Ysabeau SC'=>[['100','200','300','normal','500','600','700','800','900'],['cyrillic','cyrillic-ext','greek','latin','latin-ext','math','symbols','vietnamese']], + 'Yuji Boku'=>[['normal'],['cyrillic','japanese','latin','latin-ext']], + 'Yuji Hentaigana Akari'=>[['normal'],['japanese','latin','latin-ext']], + 'Yuji Hentaigana Akebono'=>[['normal'],['japanese','latin','latin-ext']], + 'Yuji Mai'=>[['normal'],['cyrillic','japanese','latin','latin-ext']], + 'Yuji Syuku'=>[['normal'],['cyrillic','japanese','latin','latin-ext']], + 'Yusei Magic'=>[['normal'],['japanese','latin','latin-ext']], + 'ZCOOL KuaiLe'=>[['normal'],['chinese-simplified','latin']], + 'ZCOOL QingKe HuangYou'=>[['normal'],['chinese-simplified','latin']], + 'ZCOOL XiaoWei'=>[['normal'],['chinese-simplified','latin']], + 'Zen Antique'=>[['normal'],['cyrillic','greek','japanese','latin','latin-ext']], + 'Zen Antique Soft'=>[['normal'],['cyrillic','greek','japanese','latin','latin-ext']], + 'Zen Dots'=>[['normal'],['latin','latin-ext']], + 'Zen Kaku Gothic Antique'=>[['300','normal','500','700','900'],['cyrillic','japanese','latin','latin-ext']], + 'Zen Kaku Gothic New'=>[['300','normal','500','700','900'],['cyrillic','japanese','latin','latin-ext']], + 'Zen Kurenaido'=>[['normal'],['cyrillic','greek','japanese','latin','latin-ext']], + 'Zen Loop'=>[['normal','italic'],['latin','latin-ext']], + 'Zen Maru Gothic'=>[['300','normal','500','700','900'],['cyrillic','greek','japanese','latin','latin-ext']], + 'Zen Old Mincho'=>[['normal','500','600','700','900'],['cyrillic','greek','japanese','latin','latin-ext']], + 'Zen Tokyo Zoo'=>[['normal'],['latin','latin-ext']], + 'Zeyada'=>[['normal'],['latin']], + 'Zhi Mang Xing'=>[['normal'],['chinese-simplified','latin']], + 'Zilla Slab'=>[['300','300italic','normal','italic','500','500italic','600','600italic','700','700italic'],['latin','latin-ext']], + 'Zilla Slab Highlight'=>[['normal','700'],['latin','latin-ext']], + ]; + } +} diff --git a/framework/fields/typography/typography.php b/framework/fields/typography/typography.php new file mode 100644 index 0000000..6ea6bcf --- /dev/null +++ b/framework/fields/typography/typography.php @@ -0,0 +1,544 @@ +field_before(); + + $args = wp_parse_args( $this->field, array( + 'font_family' => true, + 'font_weight' => true, + 'font_style' => true, + 'font_size' => true, + 'line_height' => true, + 'letter_spacing' => true, + 'text_align' => true, + 'text_transform' => true, + 'color' => true, + 'chosen' => true, + 'preview' => true, + 'subset' => true, + 'multi_subset' => false, + 'extra_styles' => false, + 'backup_font_family' => false, + 'font_variant' => false, + 'word_spacing' => false, + 'text_decoration' => false, + 'custom_style' => false, + 'compact' => false, + 'exclude' => '', + 'unit' => 'px', + 'line_height_unit' => '', + 'preview_text' => 'The quick brown fox jumps over the lazy dog', + ) ); + + if ( $args['compact'] ) { + $args['text_transform'] = false; + $args['text_align'] = false; + $args['font_size'] = false; + $args['line_height'] = false; + $args['letter_spacing'] = false; + $args['preview'] = false; + $args['color'] = false; + } + + $default_value = array( + 'font-family' => '', + 'font-weight' => '', + 'font-style' => '', + 'font-variant' => '', + 'font-size' => '', + 'line-height' => '', + 'letter-spacing' => '', + 'word-spacing' => '', + 'text-align' => '', + 'text-transform' => '', + 'text-decoration' => '', + 'backup-font-family' => '', + 'color' => '', + 'custom-style' => '', + 'type' => '', + 'subset' => '', + 'extra-styles' => array(), + ); + + $default_value = ( ! empty( $this->field['default'] ) ) ? wp_parse_args( $this->field['default'], $default_value ) : $default_value; + $this->value = wp_parse_args( $this->value, $default_value ); + $this->chosen = $args['chosen']; + $chosen_class = ( $this->chosen ) ? ' wp_china_yes--chosen' : ''; + $line_height_unit = ( ! empty( $args['line_height_unit'] ) ) ? $args['line_height_unit'] : $args['unit']; + + echo '
        '; + + echo '
        '; + + // + // Font Family + if ( ! empty( $args['font_family'] ) ) { + echo '
        '; + echo '
        '. esc_html__( 'Font Family', 'wp_china_yes' ) .'
        '; + echo $this->create_select( array( $this->value['font-family'] => $this->value['font-family'] ), 'font-family', esc_html__( 'Select a font', 'wp_china_yes' ) ); + echo '
        '; + } + + // + // Backup Font Family + if ( ! empty( $args['backup_font_family'] ) ) { + echo ''; + } + + // + // Font Style and Extra Style Select + if ( ! empty( $args['font_weight'] ) || ! empty( $args['font_style'] ) ) { + + // + // Font Style Select + echo ''; + + } + + // + // Subset + if ( ! empty( $args['subset'] ) ) { + echo ''; + } + + // + // Text Align + if ( ! empty( $args['text_align'] ) ) { + echo '
        '; + echo '
        '. esc_html__( 'Text Align', 'wp_china_yes' ) .'
        '; + echo $this->create_select( array( + 'inherit' => esc_html__( 'Inherit', 'wp_china_yes' ), + 'left' => esc_html__( 'Left', 'wp_china_yes' ), + 'center' => esc_html__( 'Center', 'wp_china_yes' ), + 'right' => esc_html__( 'Right', 'wp_china_yes' ), + 'justify' => esc_html__( 'Justify', 'wp_china_yes' ), + 'initial' => esc_html__( 'Initial', 'wp_china_yes' ) + ), 'text-align', esc_html__( 'Default', 'wp_china_yes' ) ); + echo '
        '; + } + + // + // Font Variant + if ( ! empty( $args['font_variant'] ) ) { + echo '
        '; + echo '
        '. esc_html__( 'Font Variant', 'wp_china_yes' ) .'
        '; + echo $this->create_select( array( + 'normal' => esc_html__( 'Normal', 'wp_china_yes' ), + 'small-caps' => esc_html__( 'Small Caps', 'wp_china_yes' ), + 'all-small-caps' => esc_html__( 'All Small Caps', 'wp_china_yes' ) + ), 'font-variant', esc_html__( 'Default', 'wp_china_yes' ) ); + echo '
        '; + } + + // + // Text Transform + if ( ! empty( $args['text_transform'] ) ) { + echo '
        '; + echo '
        '. esc_html__( 'Text Transform', 'wp_china_yes' ) .'
        '; + echo $this->create_select( array( + 'none' => esc_html__( 'None', 'wp_china_yes' ), + 'capitalize' => esc_html__( 'Capitalize', 'wp_china_yes' ), + 'uppercase' => esc_html__( 'Uppercase', 'wp_china_yes' ), + 'lowercase' => esc_html__( 'Lowercase', 'wp_china_yes' ) + ), 'text-transform', esc_html__( 'Default', 'wp_china_yes' ) ); + echo '
        '; + } + + // + // Text Decoration + if ( ! empty( $args['text_decoration'] ) ) { + echo '
        '; + echo '
        '. esc_html__( 'Text Decoration', 'wp_china_yes' ) .'
        '; + echo $this->create_select( array( + 'none' => esc_html__( 'None', 'wp_china_yes' ), + 'underline' => esc_html__( 'Solid', 'wp_china_yes' ), + 'underline double' => esc_html__( 'Double', 'wp_china_yes' ), + 'underline dotted' => esc_html__( 'Dotted', 'wp_china_yes' ), + 'underline dashed' => esc_html__( 'Dashed', 'wp_china_yes' ), + 'underline wavy' => esc_html__( 'Wavy', 'wp_china_yes' ), + 'underline overline' => esc_html__( 'Overline', 'wp_china_yes' ), + 'line-through' => esc_html__( 'Line-through', 'wp_china_yes' ) + ), 'text-decoration', esc_html__( 'Default', 'wp_china_yes' ) ); + echo '
        '; + } + + echo '
        '; + + echo '
        '; + + // + // Font Size + if ( ! empty( $args['font_size'] ) ) { + echo '
        '; + echo '
        '. esc_html__( 'Font Size', 'wp_china_yes' ) .'
        '; + echo '
        '; + echo ''; + echo ''. esc_attr( $args['unit'] ) .''; + echo '
        '; + echo '
        '; + } + + // + // Line Height + if ( ! empty( $args['line_height'] ) ) { + echo '
        '; + echo '
        '. esc_html__( 'Line Height', 'wp_china_yes' ) .'
        '; + echo '
        '; + echo ''; + echo ''. esc_attr( $line_height_unit ) .''; + echo '
        '; + echo '
        '; + } + + // + // Letter Spacing + if ( ! empty( $args['letter_spacing'] ) ) { + echo '
        '; + echo '
        '. esc_html__( 'Letter Spacing', 'wp_china_yes' ) .'
        '; + echo '
        '; + echo ''; + echo ''. esc_attr( $args['unit'] ) .''; + echo '
        '; + echo '
        '; + } + + // + // Word Spacing + if ( ! empty( $args['word_spacing'] ) ) { + echo '
        '; + echo '
        '. esc_html__( 'Word Spacing', 'wp_china_yes' ) .'
        '; + echo '
        '; + echo ''; + echo ''. esc_attr( $args['unit'] ) .''; + echo '
        '; + echo '
        '; + } + + echo '
        '; + + // + // Font Color + if ( ! empty( $args['color'] ) ) { + $default_color_attr = ( ! empty( $default_value['color'] ) ) ? ' data-default-color="'. esc_attr( $default_value['color'] ) .'"' : ''; + echo '
        '; + echo '
        '. esc_html__( 'Font Color', 'wp_china_yes' ) .'
        '; + echo '
        '; + echo ''; + echo '
        '; + echo '
        '; + } + + // + // Custom style + if ( ! empty( $args['custom_style'] ) ) { + echo '
        '; + echo '
        '. esc_html__( 'Custom Style', 'wp_china_yes' ) .'
        '; + echo ''; + echo '
        '; + } + + // + // Preview + $always_preview = ( $args['preview'] !== 'always' ) ? ' hidden' : ''; + + if ( ! empty( $args['preview'] ) ) { + echo '
        '; + echo '
        '; + echo '
        '. esc_attr( $args['preview_text'] ) .'
        '; + echo '
        '; + } + + echo ''; + echo ''; + + echo '
        '; + + echo $this->field_after(); + + } + + public function create_select( $options, $name, $placeholder = '', $is_multiple = false ) { + + $multiple_name = ( $is_multiple ) ? '[]' : ''; + $multiple_attr = ( $is_multiple ) ? ' multiple data-multiple="true"' : ''; + $chosen_rtl = ( $this->chosen && is_rtl() ) ? ' chosen-rtl' : ''; + + $output = ''; + + return $output; + + } + + public function enqueue() { + + if ( ! wp_script_is( 'wp_china_yes-webfontloader' ) ) { + + WP_CHINA_YES::include_plugin_file( 'fields/typography/google-fonts.php' ); + + wp_enqueue_script( 'wp_china_yes-webfontloader', 'https://jsd.admincdn.com/npm/webfontloader@1.6.28/webfontloader.min.js', array( 'wp_china_yes' ), '1.6.28', true ); + + $webfonts = array(); + + $customwebfonts = apply_filters( 'wp_china_yes_field_typography_customwebfonts', array() ); + + if ( ! empty( $customwebfonts ) ) { + $webfonts['custom'] = array( + 'label' => esc_html__( 'Custom Web Fonts', 'wp_china_yes' ), + 'fonts' => $customwebfonts + ); + } + + $webfonts['safe'] = array( + 'label' => esc_html__( 'Safe Web Fonts', 'wp_china_yes' ), + 'fonts' => apply_filters( 'wp_china_yes_field_typography_safewebfonts', array( + 'Arial', + 'Arial Black', + 'Helvetica', + 'Times New Roman', + 'Courier New', + 'Tahoma', + 'Verdana', + 'Impact', + 'Trebuchet MS', + 'Comic Sans MS', + 'Lucida Console', + 'Lucida Sans Unicode', + 'Georgia, serif', + 'Palatino Linotype' + ) + ) ); + + $webfonts['google'] = array( + 'label' => esc_html__( 'Google Web Fonts', 'wp_china_yes' ), + 'fonts' => apply_filters( 'wp_china_yes_field_typography_googlewebfonts', wp_china_yes_get_google_fonts() + ) ); + + $defaultstyles = apply_filters( 'wp_china_yes_field_typography_defaultstyles', array( 'normal', 'italic', '700', '700italic' ) ); + + $googlestyles = apply_filters( 'wp_china_yes_field_typography_googlestyles', array( + '100' => 'Thin 100', + '100italic' => 'Thin 100 Italic', + '200' => 'Extra-Light 200', + '200italic' => 'Extra-Light 200 Italic', + '300' => 'Light 300', + '300italic' => 'Light 300 Italic', + 'normal' => 'Normal 400', + 'italic' => 'Normal 400 Italic', + '500' => 'Medium 500', + '500italic' => 'Medium 500 Italic', + '600' => 'Semi-Bold 600', + '600italic' => 'Semi-Bold 600 Italic', + '700' => 'Bold 700', + '700italic' => 'Bold 700 Italic', + '800' => 'Extra-Bold 800', + '800italic' => 'Extra-Bold 800 Italic', + '900' => 'Black 900', + '900italic' => 'Black 900 Italic' + ) ); + + $webfonts = apply_filters( 'wp_china_yes_field_typography_webfonts', $webfonts ); + + wp_localize_script( 'wp_china_yes', 'wp_china_yes_typography_json', array( + 'webfonts' => $webfonts, + 'defaultstyles' => $defaultstyles, + 'googlestyles' => $googlestyles + ) ); + + } + + } + + public function enqueue_google_fonts( $method = 'enqueue' ) { + + $is_google = false; + + if ( ! empty( $this->value['type'] ) ) { + $is_google = ( $this->value['type'] === 'google' ) ? true : false; + } else { + WP_CHINA_YES::include_plugin_file( 'fields/typography/google-fonts.php' ); + $is_google = ( array_key_exists( $this->value['font-family'], wp_china_yes_get_google_fonts() ) ) ? true : false; + } + + if ( $is_google ) { + + // set style + $font_family = ( ! empty( $this->value['font-family'] ) ) ? $this->value['font-family'] : ''; + $font_weight = ( ! empty( $this->value['font-weight'] ) ) ? $this->value['font-weight'] : ''; + $font_style = ( ! empty( $this->value['font-style'] ) ) ? $this->value['font-style'] : ''; + + if ( $font_weight || $font_style ) { + $style = $font_weight . $font_style; + if ( ! empty( $style ) ) { + $style = ( $style === 'normal' ) ? '400' : $style; + WP_CHINA_YES::$webfonts[$method][$font_family][$style] = $style; + } + } else { + WP_CHINA_YES::$webfonts[$method][$font_family] = array(); + } + + // set extra styles + if ( ! empty( $this->value['extra-styles'] ) ) { + foreach ( $this->value['extra-styles'] as $extra_style ) { + if ( ! empty( $extra_style ) ) { + $extra_style = ( $extra_style === 'normal' ) ? '400' : $extra_style; + WP_CHINA_YES::$webfonts[$method][$font_family][$extra_style] = $extra_style; + } + } + } + + // set subsets + if ( ! empty( $this->value['subset'] ) ) { + $this->value['subset'] = ( is_array( $this->value['subset'] ) ) ? $this->value['subset'] : array_filter( (array) $this->value['subset'] ); + foreach ( $this->value['subset'] as $subset ) { + if( ! empty( $subset ) ) { + WP_CHINA_YES::$subsets[$subset] = $subset; + } + } + } + + return true; + + } + + return false; + + } + + public function output() { + + $output = ''; + $bg_image = array(); + $important = ( ! empty( $this->field['output_important'] ) ) ? '!important' : ''; + $element = ( is_array( $this->field['output'] ) ) ? join( ',', $this->field['output'] ) : $this->field['output']; + + $font_family = ( ! empty( $this->value['font-family'] ) ) ? $this->value['font-family'] : ''; + $backup_family = ( ! empty( $this->value['backup-font-family'] ) ) ? ', '. $this->value['backup-font-family'] : ''; + + if ( $font_family ) { + $output .= 'font-family:"'. $font_family .'"'. $backup_family . $important .';'; + } + + // Common font properties + $properties = array( + 'color', + 'font-weight', + 'font-style', + 'font-variant', + 'text-align', + 'text-transform', + 'text-decoration', + ); + + foreach ( $properties as $property ) { + if ( isset( $this->value[$property] ) && $this->value[$property] !== '' ) { + $output .= $property .':'. $this->value[$property] . $important .';'; + } + } + + $properties = array( + 'font-size', + 'line-height', + 'letter-spacing', + 'word-spacing', + ); + + $unit = ( ! empty( $this->value['unit'] ) ) ? $this->value['unit'] : 'px'; + $line_height_unit = ( ! empty( $this->value['line_height_unit'] ) ) ? $this->value['line_height_unit'] : $unit; + + foreach ( $properties as $property ) { + if ( isset( $this->value[$property] ) && $this->value[$property] !== '' ) { + $unit = ( $property === 'line-height' ) ? $line_height_unit : $unit; + $output .= $property .':'. $this->value[$property] . $unit . $important .';'; + } + } + + $custom_style = ( ! empty( $this->value['custom-style'] ) ) ? $this->value['custom-style'] : ''; + + if ( $output ) { + $output = $element .'{'. $output . $custom_style .'}'; + } + + $this->parent->output_css .= $output; + + return $output; + + } + + } +} diff --git a/framework/fields/upload/upload.php b/framework/fields/upload/upload.php new file mode 100644 index 0000000..1eebcba --- /dev/null +++ b/framework/fields/upload/upload.php @@ -0,0 +1,61 @@ +field, array( + 'library' => array(), + 'preview' => false, + 'preview_width' => '', + 'preview_height' => '', + 'button_title' => esc_html__( 'Upload', 'wp_china_yes' ), + 'remove_title' => esc_html__( 'Remove', 'wp_china_yes' ), + ) ); + + echo $this->field_before(); + + $library = ( is_array( $args['library'] ) ) ? $args['library'] : array_filter( (array) $args['library'] ); + $library = ( ! empty( $library ) ) ? implode(',', $library ) : ''; + $hidden = ( empty( $this->value ) ) ? ' hidden' : ''; + + if ( ! empty( $args['preview'] ) ) { + + $preview_type = ( ! empty( $this->value ) ) ? strtolower( substr( strrchr( $this->value, '.' ), 1 ) ) : ''; + $preview_src = ( ! empty( $preview_type ) && in_array( $preview_type, array( 'jpg', 'jpeg', 'gif', 'png', 'svg', 'webp' ) ) ) ? $this->value : ''; + $preview_width = ( ! empty( $args['preview_width'] ) ) ? 'max-width:'. esc_attr( $args['preview_width'] ) .'px;' : ''; + $preview_height = ( ! empty( $args['preview_height'] ) ) ? 'max-height:'. esc_attr( $args['preview_height'] ) .'px;' : ''; + $preview_style = ( ! empty( $preview_width ) || ! empty( $preview_height ) ) ? ' style="'. esc_attr( $preview_width . $preview_height ) .'"': ''; + $preview_hidden = ( empty( $preview_src ) ) ? ' hidden' : ''; + + echo '
        '; + echo '
        '; + echo ''; + echo '
        '; + echo '
        '; + + } + + echo '
        '; + echo 'field_attributes() .'/>'; + echo ''. $args['button_title'] .''; + echo ''. $args['remove_title'] .''; + echo '
        '; + + echo $this->field_after(); + + } + } +} diff --git a/framework/fields/wp_editor/wp_editor.php b/framework/fields/wp_editor/wp_editor.php new file mode 100644 index 0000000..2614869 --- /dev/null +++ b/framework/fields/wp_editor/wp_editor.php @@ -0,0 +1,107 @@ +field, array( + 'tinymce' => true, + 'quicktags' => true, + 'media_buttons' => true, + 'wpautop' => false, + 'height' => '', + ) ); + + $attributes = array( + 'rows' => 10, + 'class' => 'wp-editor-area', + 'autocomplete' => 'off', + ); + + $editor_height = ( ! empty( $args['height'] ) ) ? ' style="height:'. esc_attr( $args['height'] ) .';"' : ''; + + $editor_settings = array( + 'tinymce' => $args['tinymce'], + 'quicktags' => $args['quicktags'], + 'media_buttons' => $args['media_buttons'], + 'wpautop' => $args['wpautop'], + ); + + echo $this->field_before(); + + echo ( wp_china_yes_wp_editor_api() ) ? '
        ' : ''; + + echo ''; + + echo ( wp_china_yes_wp_editor_api() ) ? '
        ' : ''; + + echo $this->field_after(); + + } + + public function enqueue() { + + if ( wp_china_yes_wp_editor_api() && function_exists( 'wp_enqueue_editor' ) ) { + + wp_enqueue_editor(); + + $this->setup_wp_editor_settings(); + + add_action( 'print_default_editor_scripts', array( $this, 'setup_wp_editor_media_buttons' ) ); + + } + + } + + // Setup wp editor media buttons + public function setup_wp_editor_media_buttons() { + + if ( ! function_exists( 'media_buttons' ) ) { + return; + } + + ob_start(); + echo '
        '; + do_action( 'media_buttons' ); + echo '
        '; + $media_buttons = ob_get_clean(); + + echo ''; + + } + + // Setup wp editor settings + public function setup_wp_editor_settings() { + + if ( wp_china_yes_wp_editor_api() && class_exists( '_WP_Editors') ) { + + $defaults = apply_filters( 'wp_china_yes_wp_editor', array( + 'tinymce' => array( + 'wp_skip_init' => true + ), + ) ); + + $setup = _WP_Editors::parse_settings( 'wp_china_yes_wp_editor', $defaults ); + + _WP_Editors::editor_settings( 'wp_china_yes_wp_editor', $setup ); + + } + + } + + } +} diff --git a/framework/functions/actions.php b/framework/functions/actions.php new file mode 100644 index 0000000..b18ed96 --- /dev/null +++ b/framework/functions/actions.php @@ -0,0 +1,190 @@ + esc_html__( 'Error: Invalid nonce verification.', 'wp_china_yes' ) ) ); + } + + ob_start(); + + $icon_library = ( apply_filters( 'wp_china_yes_fa4', false ) ) ? 'fa4' : 'fa5'; + + WP_CHINA_YES::include_plugin_file( 'fields/icon/'. $icon_library .'-icons.php' ); + + $icon_lists = apply_filters( 'wp_china_yes_field_icon_add_icons', wp_china_yes_get_default_icons() ); + + if ( ! empty( $icon_lists ) ) { + + foreach ( $icon_lists as $list ) { + + echo ( count( $icon_lists ) >= 2 ) ? '
        '. esc_attr( $list['title'] ) .'
        ' : ''; + + foreach ( $list['icons'] as $icon ) { + echo ''; + } + + } + + } else { + + echo '
        '. esc_html__( 'No data available.', 'wp_china_yes' ) .'
        '; + + } + + $content = ob_get_clean(); + + wp_send_json_success( array( 'content' => $content ) ); + + } + add_action( 'wp_ajax_wp_china_yes-get-icons', 'wp_china_yes_get_icons' ); +} + +/** + * + * Export + * + * @since 1.0.0 + * @version 1.0.0 + * + */ +if ( ! function_exists( 'wp_china_yes_export' ) ) { + function wp_china_yes_export() { + + $nonce = ( ! empty( $_GET[ 'nonce' ] ) ) ? sanitize_text_field( wp_unslash( $_GET[ 'nonce' ] ) ) : ''; + $unique = ( ! empty( $_GET[ 'unique' ] ) ) ? sanitize_text_field( wp_unslash( $_GET[ 'unique' ] ) ) : ''; + + if ( ! wp_verify_nonce( $nonce, 'wp_china_yes_backup_nonce' ) ) { + die( esc_html__( 'Error: Invalid nonce verification.', 'wp_china_yes' ) ); + } + + if ( empty( $unique ) ) { + die( esc_html__( 'Error: Invalid key.', 'wp_china_yes' ) ); + } + + // Export + header('Content-Type: application/json'); + header('Content-disposition: attachment; filename=backup-'. gmdate( 'd-m-Y' ) .'.json'); + header('Content-Transfer-Encoding: binary'); + header('Pragma: no-cache'); + header('Expires: 0'); + + echo json_encode( get_option( $unique ) ); + + die(); + + } + add_action( 'wp_ajax_wp_china_yes-export', 'wp_china_yes_export' ); +} + +/** + * + * Import Ajax + * + * @since 1.0.0 + * @version 1.0.0 + * + */ +if ( ! function_exists( 'wp_china_yes_import_ajax' ) ) { + function wp_china_yes_import_ajax() { + + $nonce = ( ! empty( $_POST[ 'nonce' ] ) ) ? sanitize_text_field( wp_unslash( $_POST[ 'nonce' ] ) ) : ''; + $unique = ( ! empty( $_POST[ 'unique' ] ) ) ? sanitize_text_field( wp_unslash( $_POST[ 'unique' ] ) ) : ''; + $data = ( ! empty( $_POST[ 'data' ] ) ) ? wp_kses_post_deep( json_decode( wp_unslash( trim( $_POST[ 'data' ] ) ), true ) ) : array(); + + if ( ! wp_verify_nonce( $nonce, 'wp_china_yes_backup_nonce' ) ) { + wp_send_json_error( array( 'error' => esc_html__( 'Error: Invalid nonce verification.', 'wp_china_yes' ) ) ); + } + + if ( empty( $unique ) ) { + wp_send_json_error( array( 'error' => esc_html__( 'Error: Invalid key.', 'wp_china_yes' ) ) ); + } + + if ( empty( $data ) || ! is_array( $data ) ) { + wp_send_json_error( array( 'error' => esc_html__( 'Error: The response is not a valid JSON response.', 'wp_china_yes' ) ) ); + } + + // Success + update_option( $unique, $data ); + + wp_send_json_success(); + + } + add_action( 'wp_ajax_wp_china_yes-import', 'wp_china_yes_import_ajax' ); +} + +/** + * + * Reset Ajax + * + * @since 1.0.0 + * @version 1.0.0 + * + */ +if ( ! function_exists( 'wp_china_yes_reset_ajax' ) ) { + function wp_china_yes_reset_ajax() { + + $nonce = ( ! empty( $_POST[ 'nonce' ] ) ) ? sanitize_text_field( wp_unslash( $_POST[ 'nonce' ] ) ) : ''; + $unique = ( ! empty( $_POST[ 'unique' ] ) ) ? sanitize_text_field( wp_unslash( $_POST[ 'unique' ] ) ) : ''; + + if ( ! wp_verify_nonce( $nonce, 'wp_china_yes_backup_nonce' ) ) { + wp_send_json_error( array( 'error' => esc_html__( 'Error: Invalid nonce verification.', 'wp_china_yes' ) ) ); + } + + // Success + delete_option( $unique ); + + wp_send_json_success(); + + } + add_action( 'wp_ajax_wp_china_yes-reset', 'wp_china_yes_reset_ajax' ); +} + +/** + * + * Chosen Ajax + * + * @since 1.0.0 + * @version 1.0.0 + * + */ +if ( ! function_exists( 'wp_china_yes_chosen_ajax' ) ) { + function wp_china_yes_chosen_ajax() { + + $nonce = ( ! empty( $_POST[ 'nonce' ] ) ) ? sanitize_text_field( wp_unslash( $_POST[ 'nonce' ] ) ) : ''; + $type = ( ! empty( $_POST[ 'type' ] ) ) ? sanitize_text_field( wp_unslash( $_POST[ 'type' ] ) ) : ''; + $term = ( ! empty( $_POST[ 'term' ] ) ) ? sanitize_text_field( wp_unslash( $_POST[ 'term' ] ) ) : ''; + $query = ( ! empty( $_POST[ 'query_args' ] ) ) ? wp_kses_post_deep( $_POST[ 'query_args' ] ) : array(); + + if ( ! wp_verify_nonce( $nonce, 'wp_china_yes_chosen_ajax_nonce' ) ) { + wp_send_json_error( array( 'error' => esc_html__( 'Error: Invalid nonce verification.', 'wp_china_yes' ) ) ); + } + + if ( empty( $type ) || empty( $term ) ) { + wp_send_json_error( array( 'error' => esc_html__( 'Error: Invalid term ID.', 'wp_china_yes' ) ) ); + } + + $capability = apply_filters( 'wp_china_yes_chosen_ajax_capability', 'manage_options' ); + + if ( ! current_user_can( $capability ) ) { + wp_send_json_error( array( 'error' => esc_html__( 'Error: You do not have permission to do that.', 'wp_china_yes' ) ) ); + } + + // Success + $options = WP_CHINA_YES_Fields::field_data( $type, $term, $query ); + + wp_send_json_success( $options ); + + } + add_action( 'wp_ajax_wp_china_yes-chosen', 'wp_china_yes_chosen_ajax' ); +} diff --git a/framework/functions/customize.php b/framework/functions/customize.php new file mode 100644 index 0000000..8fbad7b --- /dev/null +++ b/framework/functions/customize.php @@ -0,0 +1,142 @@ +field['dependency'] ) ) { + + $dependency = $this->field['dependency']; + $depend_visible = ''; + $data_controller = ''; + $data_condition = ''; + $data_value = ''; + $data_global = ''; + + if ( is_array( $dependency[0] ) ) { + $data_controller = implode( '|', array_column( $dependency, 0 ) ); + $data_condition = implode( '|', array_column( $dependency, 1 ) ); + $data_value = implode( '|', array_column( $dependency, 2 ) ); + $data_global = implode( '|', array_column( $dependency, 3 ) ); + $depend_visible = implode( '|', array_column( $dependency, 4 ) ); + } else { + $data_controller = ( ! empty( $dependency[0] ) ) ? $dependency[0] : ''; + $data_condition = ( ! empty( $dependency[1] ) ) ? $dependency[1] : ''; + $data_value = ( ! empty( $dependency[2] ) ) ? $dependency[2] : ''; + $data_global = ( ! empty( $dependency[3] ) ) ? $dependency[3] : ''; + $depend_visible = ( ! empty( $dependency[4] ) ) ? $dependency[4] : ''; + } + + $depend .= ' data-controller="'. esc_attr( $data_controller ) .'"'; + $depend .= ' data-condition="'. esc_attr( $data_condition ) .'"'; + $depend .= ' data-value="'. esc_attr( $data_value ) .'"'; + $depend .= ( ! empty( $data_global ) ) ? ' data-depend-global="true"' : ''; + + $visible = ' wp_china_yes-dependency-control'; + $visible .= ( ! empty( $depend_visible ) ) ? ' wp_china_yes-depend-visible' : ' wp_china_yes-depend-hidden'; + + } + + $id = 'customize-control-' . str_replace( array( '[', ']' ), array( '-', '' ), $this->id ); + $class = 'customize-control customize-control-'. $this->type . $visible; + + echo '
      • '; + $this->render_field_content(); + echo '
      • '; + + } + + public function render_field_content() { + + $complex = apply_filters( 'wp_china_yes_customize_complex_fields', array( + 'accordion', + 'background', + 'border', + 'button_set', + 'checkbox', + 'color_group', + 'date', + 'dimensions', + 'fieldset', + 'group', + 'image_select', + 'link', + 'link_color', + 'media', + 'palette', + 'repeater', + 'sortable', + 'sorter', + 'spacing', + 'switcher', + 'tabbed', + 'typography' + ) ); + + $field_id = ( ! empty( $this->field['id'] ) ) ? $this->field['id'] : ''; + $custom = ( ! empty( $this->field['customizer'] ) ) ? true : false; + $is_complex = ( in_array( $this->field['type'], $complex ) ) ? true : false; + $class = ( $is_complex || $custom ) ? ' wp_china_yes-customize-complex' : ''; + $atts = ( $is_complex || $custom ) ? ' data-unique-id="'. esc_attr( $this->unique ) .'" data-option-id="'. esc_attr( $field_id ) .'"' : ''; + + if ( ! $is_complex && ! $custom ) { + $this->field['attributes']['data-customize-setting-link'] = $this->settings['default']->id; + } + + $this->field['name'] = $this->settings['default']->id; + + $this->field['dependency'] = array(); + + echo '
        '; + + WP_CHINA_YES::field( $this->field, $this->value(), $this->unique, 'customize' ); + + echo '
        '; + + } + + } +} diff --git a/framework/functions/helpers.php b/framework/functions/helpers.php new file mode 100644 index 0000000..6a2ac5d --- /dev/null +++ b/framework/functions/helpers.php @@ -0,0 +1,58 @@ +=' ); + } +} diff --git a/framework/functions/sanitize.php b/framework/functions/sanitize.php new file mode 100644 index 0000000..f0c3869 --- /dev/null +++ b/framework/functions/sanitize.php @@ -0,0 +1,29 @@ +add( 'required', esc_html__( 'Please enter a valid email address.', 'wp_china_yes' ) ); + } + + return $validity; + + } +} + +/** + * + * Numeric validate for Customizer + * + * @since 1.0.0 + * @version 1.0.0 + * + */ +if ( ! function_exists( 'wp_china_yes_customize_validate_numeric' ) ) { + function wp_china_yes_customize_validate_numeric( $validity, $value, $wp_customize ) { + + if ( ! is_numeric( $value ) ) { + $validity->add( 'required', esc_html__( 'Please enter a valid number.', 'wp_china_yes' ) ); + } + + return $validity; + + } +} + +/** + * + * Required validate for Customizer + * + * @since 1.0.0 + * @version 1.0.0 + * + */ +if ( ! function_exists( 'wp_china_yes_customize_validate_required' ) ) { + function wp_china_yes_customize_validate_required( $validity, $value, $wp_customize ) { + + if ( empty( $value ) ) { + $validity->add( 'required', esc_html__( 'This field is required.', 'wp_china_yes' ) ); + } + + return $validity; + + } +} + +/** + * + * URL validate for Customizer + * + * @since 1.0.0 + * @version 1.0.0 + * + */ +if ( ! function_exists( 'wp_china_yes_customize_validate_url' ) ) { + function wp_china_yes_customize_validate_url( $validity, $value, $wp_customize ) { + + if ( ! filter_var( $value, FILTER_VALIDATE_URL ) ) { + $validity->add( 'required', esc_html__( 'Please enter a valid URL.', 'wp_china_yes' ) ); + } + + return $validity; + + } +} diff --git a/framework/functions/walker.php b/framework/functions/walker.php new file mode 100644 index 0000000..3fe43c7 --- /dev/null +++ b/framework/functions/walker.php @@ -0,0 +1,28 @@ +ID, $item, $depth, $args ); + $custom_fields = ob_get_clean(); + + $output .= preg_replace( '/(?=<(fieldset|p)[^>]+class="[^"]*field-move)/', $custom_fields, $html ); + + } + + } +} diff --git a/framework/index.php b/framework/index.php new file mode 100644 index 0000000..49d255d --- /dev/null +++ b/framework/index.php @@ -0,0 +1 @@ +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 Xdf-iE^PbCi{Gp`e1)MoHOE&ypPBR}V literal 0 HcmV?d00001 diff --git a/framework/languages/zh_CN.po b/framework/languages/zh_CN.po new file mode 100644 index 0000000..4121676 --- /dev/null +++ b/framework/languages/zh_CN.po @@ -0,0 +1,672 @@ +# Copyright (C) 2021 Wp_china_yes +# This file is distributed under the same license as the Wp_china_yes Framework package. +msgid "" +msgstr "" +"POT-Creation-Date: 2021-06-25 12:32:35+00:00\n" +"PO-Revision-Date: 2021-08-19 12:18+0800\n" +"Last-Translator: Seaton Jiang \n" +"Language-Team: \n" +"Language: zh_CN\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"X-Generator: Poedit 2.4.3\n" +"Project-Id-Version: \n" + +#: classes/admin-options.class.php:226 +msgid "Error while saving the changes." +msgstr "保存失败" + +#: classes/admin-options.class.php:286 +msgid "Settings successfully imported." +msgstr "导入成功" + +#: classes/admin-options.class.php:298 classes/admin-options.class.php:314 +msgid "Default settings restored." +msgstr "恢复完成" + +#: classes/admin-options.class.php:385 +msgid "Settings saved." +msgstr "保存成功" + +#: classes/admin-options.class.php:565 +msgid "You have unsaved changes, save your changes!" +msgstr "配置发生改变,请勿忘记保存!" + +#: classes/admin-options.class.php:567 +msgid "show all settings" +msgstr "显示所有设置" + +#: classes/admin-options.class.php:569 fields/icon/icon.php:57 +#: fields/map/map.php:23 +msgid "Search..." +msgstr "请输入关键词" + +#: classes/admin-options.class.php:572 classes/admin-options.class.php:695 +msgid "Save" +msgstr "保存配置" + +#: classes/admin-options.class.php:572 classes/admin-options.class.php:695 +msgid "Saving..." +msgstr "正在保存" + +#: classes/admin-options.class.php:573 classes/admin-options.class.php:696 +msgid "Reset Section" +msgstr "恢复此页" + +#: classes/admin-options.class.php:573 classes/admin-options.class.php:696 +msgid "Are you sure to reset this section options?" +msgstr "单击「确定」进行恢复,当前页面的配置将会丢失!" + +#: classes/admin-options.class.php:574 classes/admin-options.class.php:697 +msgid "Reset All" +msgstr "恢复全部" + +#: classes/admin-options.class.php:574 classes/admin-options.class.php:697 +#: classes/comment-options.class.php:216 classes/metabox-options.class.php:294 +#: fields/backup/backup.php:31 +msgid "Reset" +msgstr "恢复默认" + +#: classes/admin-options.class.php:574 classes/admin-options.class.php:697 +msgid "Are you sure you want to reset all settings to default values?" +msgstr "单击「确定」进行恢复,所有页面的配置都将丢失!" + +#: classes/admin-options.class.php:672 classes/comment-options.class.php:199 +#: classes/metabox-options.class.php:277 fields/button_set/button_set.php:56 +#: fields/checkbox/checkbox.php:76 fields/radio/radio.php:75 +#: fields/select/select.php:113 functions/actions.php:41 +msgid "No data available." +msgstr "没有可用数据" + +#: classes/comment-options.class.php:217 classes/metabox-options.class.php:295 +msgid "update post" +msgstr "更新文章" + +#: classes/comment-options.class.php:217 classes/metabox-options.class.php:295 +msgid "Cancel" +msgstr "取消" + +#: classes/setup.class.php:592 +msgid "Are you sure?" +msgstr "单击「确定」进行下一步操作,该操作可能会丢失部分配置!" + +#: classes/setup.class.php:593 +msgid "Please enter %s or more characters" +msgstr "请输入 %s 或更多字符" + +#: classes/setup.class.php:594 +msgid "Searching..." +msgstr "搜索中..." + +#: classes/setup.class.php:595 +msgid "No results found." +msgstr "未找到结果。" + +#: classes/setup.class.php:696 +msgid "Oops! Not allowed." +msgstr "哎呀!不允许。" + +#: classes/setup.class.php:768 classes/setup.class.php:772 +msgid "Field not found!" +msgstr "没有找到任何数据" + +#: classes/shortcode-options.class.php:253 fields/group/group.php:23 +msgid "Add New" +msgstr "新增" + +#: classes/shortcode-options.class.php:290 functions/actions.php:16 +#: functions/actions.php:68 functions/actions.php:106 functions/actions.php:141 +#: functions/actions.php:170 +msgid "Error: Invalid nonce verification." +msgstr "错误: 无效的nonce验证。" + +#: fields/background/background.php:36 fields/media/media.php:59 +msgid "Not selected" +msgstr "未选择" + +#: fields/background/background.php:72 fields/date/date.php:31 +msgid "From" +msgstr "从" + +#: fields/background/background.php:90 fields/date/date.php:32 +msgid "To" +msgstr "到" + +#: fields/background/background.php:108 +msgid "Direction" +msgstr "方向" + +#: fields/background/background.php:114 +msgid "Gradient Direction" +msgstr "渐变方向" + +#: fields/background/background.php:115 +msgid "⇓ top to bottom" +msgstr "⇓ 从上到下" + +#: fields/background/background.php:116 +msgid "⇒ left to right" +msgstr "⇒从左到右" + +#: fields/background/background.php:117 +msgid "⇘ corner top to right" +msgstr "⇘ 右上角" + +#: fields/background/background.php:118 +msgid "⇙ corner top to left" +msgstr "⇘ 左上角" + +#: fields/background/background.php:161 +msgid "Background Position" +msgstr "背景位置" + +#: fields/background/background.php:162 +msgid "Left Top" +msgstr "左上" + +#: fields/background/background.php:163 +msgid "Left Center" +msgstr "左中" + +#: fields/background/background.php:164 +msgid "Left Bottom" +msgstr "左下" + +#: fields/background/background.php:165 +msgid "Center Top" +msgstr "中上" + +#: fields/background/background.php:166 +msgid "Center Center" +msgstr "居中" + +#: fields/background/background.php:167 +msgid "Center Bottom" +msgstr "中下" + +#: fields/background/background.php:168 +msgid "Right Top" +msgstr "右上" + +#: fields/background/background.php:169 +msgid "Right Center" +msgstr "右中" + +#: fields/background/background.php:170 +msgid "Right Bottom" +msgstr "右下" + +#: fields/background/background.php:184 +msgid "Background Repeat" +msgstr "背景重复" + +#: fields/background/background.php:185 +msgid "Repeat" +msgstr "重复" + +#: fields/background/background.php:186 +msgid "No Repeat" +msgstr "不重复" + +#: fields/background/background.php:187 +msgid "Repeat Horizontally" +msgstr "水平重复" + +#: fields/background/background.php:188 +msgid "Repeat Vertically" +msgstr "垂直重复" + +#: fields/background/background.php:202 +msgid "Background Attachment" +msgstr "背景附件" + +#: fields/background/background.php:203 +msgid "Scroll" +msgstr "滚动" + +#: fields/background/background.php:204 +msgid "Fixed" +msgstr "固定" + +#: fields/background/background.php:218 +msgid "Background Size" +msgstr "背景大小" + +#: fields/background/background.php:219 +msgid "Cover" +msgstr "覆盖" + +#: fields/background/background.php:220 +msgid "Contain" +msgstr "包含" + +#: fields/background/background.php:221 +msgid "Auto" +msgstr "自动" + +#: fields/background/background.php:235 +msgid "Background Origin" +msgstr "背景起源" + +#: fields/background/background.php:236 fields/background/background.php:254 +msgid "Padding Box" +msgstr "框内边距" + +#: fields/background/background.php:237 fields/background/background.php:253 +msgid "Border Box" +msgstr "边框" + +#: fields/background/background.php:238 fields/background/background.php:255 +msgid "Content Box" +msgstr "内容框" + +#: fields/background/background.php:252 +msgid "Background Clip" +msgstr "背景剪辑" + +#: fields/background/background.php:269 +msgid "Background Blend Mode" +msgstr "背景混合模式" + +#: fields/background/background.php:270 fields/link_color/link_color.php:36 +#: fields/typography/typography.php:186 +msgid "Normal" +msgstr "正常" + +#: fields/background/background.php:271 +msgid "Multiply" +msgstr "乘" + +#: fields/background/background.php:272 +msgid "Screen" +msgstr "屏幕" + +#: fields/background/background.php:273 +msgid "Overlay" +msgstr "覆盖" + +#: fields/background/background.php:274 +msgid "Darken" +msgstr "变黑" + +#: fields/background/background.php:275 +msgid "Lighten" +msgstr "减轻" + +#: fields/background/background.php:276 +msgid "Color Dodge" +msgstr "颜色减淡" + +#: fields/background/background.php:277 +msgid "Saturation" +msgstr "饱和度" + +#: fields/background/background.php:278 +msgid "Color" +msgstr "颜色" + +#: fields/background/background.php:279 +msgid "Luminosity" +msgstr "光度" + +#: fields/backup/backup.php:26 +msgid "Import" +msgstr "导入" + +#: fields/backup/backup.php:29 +msgid "Export & Download" +msgstr "导出和下载" + +#: fields/border/border.php:25 fields/spacing/spacing.php:25 +msgid "top" +msgstr "顶部" + +#: fields/border/border.php:26 fields/spacing/spacing.php:26 +msgid "right" +msgstr "右" + +#: fields/border/border.php:27 fields/spacing/spacing.php:27 +msgid "bottom" +msgstr "底部" + +#: fields/border/border.php:28 fields/spacing/spacing.php:28 +msgid "left" +msgstr "左" + +#: fields/border/border.php:29 fields/spacing/spacing.php:29 +msgid "all" +msgstr "所有" + +#: fields/border/border.php:51 fields/typography/typography.php:214 +msgid "Solid" +msgstr "实线" + +#: fields/border/border.php:52 fields/typography/typography.php:217 +msgid "Dashed" +msgstr "虚线" + +#: fields/border/border.php:53 fields/typography/typography.php:216 +msgid "Dotted" +msgstr "点线" + +#: fields/border/border.php:54 fields/typography/typography.php:215 +msgid "Double" +msgstr "双线" + +#: fields/border/border.php:55 +msgid "Inset" +msgstr "插入" + +#: fields/border/border.php:56 +msgid "Outset" +msgstr "开始" + +#: fields/border/border.php:57 +msgid "Groove" +msgstr "凹槽" + +#: fields/border/border.php:58 +msgid "ridge" +msgstr "凸出" + +#: fields/border/border.php:59 fields/typography/typography.php:199 +#: fields/typography/typography.php:213 +msgid "None" +msgstr "无" + +#: fields/dimensions/dimensions.php:22 +msgid "width" +msgstr "宽度" + +#: fields/dimensions/dimensions.php:23 +msgid "height" +msgstr "高度" + +#: fields/gallery/gallery.php:20 +msgid "Add Gallery" +msgstr "添加图库" + +#: fields/gallery/gallery.php:21 +msgid "Edit Gallery" +msgstr "编辑图库" + +#: fields/gallery/gallery.php:22 +msgid "Clear" +msgstr "清除" + +#: fields/group/group.php:35 fields/repeater/repeater.php:27 +msgid "Error: Field ID conflict." +msgstr "错误:字段ID冲突。" + +#: fields/group/group.php:46 fields/group/group.php:87 +#: fields/repeater/repeater.php:48 fields/repeater/repeater.php:76 +msgid "Are you sure to delete this item?" +msgstr "确定要删除这个项目吗?" + +#: fields/group/group.php:121 fields/repeater/repeater.php:89 +msgid "You cannot add more." +msgstr "无法添加更多" + +#: fields/group/group.php:122 fields/repeater/repeater.php:90 +msgid "You cannot remove more." +msgstr "无法删除更多" + +#: fields/icon/icon.php:20 fields/icon/icon.php:53 +msgid "Add Icon" +msgstr "添加图标" + +#: fields/icon/icon.php:21 +msgid "Remove Icon" +msgstr "删除图标" + +#: fields/link/link.php:20 +msgid "Add Link" +msgstr "添加链接" + +#: fields/link/link.php:21 +msgid "Edit Link" +msgstr "编辑链接" + +#: fields/link/link.php:22 +msgid "Remove Link" +msgstr "移除链接" + +#: fields/link_color/link_color.php:37 +msgid "Hover" +msgstr "悬停" + +#: fields/link_color/link_color.php:38 +msgid "Active" +msgstr "启用" + +#: fields/link_color/link_color.php:39 +msgid "Visited" +msgstr "访问" + +#: fields/link_color/link_color.php:40 +msgid "Focus" +msgstr "焦点" + +#: fields/map/map.php:24 +msgid "Latitude" +msgstr "纬度" + +#: fields/map/map.php:25 +msgid "Longitude" +msgstr "经度" + +#: fields/media/media.php:25 fields/upload/upload.php:25 +msgid "Upload" +msgstr "上传" + +#: fields/media/media.php:26 fields/upload/upload.php:26 +msgid "Remove" +msgstr "删除" + +#: fields/sorter/sorter.php:21 +msgid "Enabled" +msgstr "启用" + +#: fields/sorter/sorter.php:22 +msgid "Disabled" +msgstr "禁用" + +#: fields/switcher/switcher.php:20 +msgid "On" +msgstr "启用" + +#: fields/switcher/switcher.php:21 +msgid "Off" +msgstr "禁用" + +#: fields/typography/typography.php:96 +msgid "Font Family" +msgstr "字体" + +#: fields/typography/typography.php:97 +msgid "Select a font" +msgstr "选择字体" + +#: fields/typography/typography.php:105 +msgid "Backup Font Family" +msgstr "备份字体系列" + +#: fields/typography/typography.php:119 fields/typography/typography.php:132 +#: fields/typography/typography.php:145 fields/typography/typography.php:160 +#: fields/typography/typography.php:176 fields/typography/typography.php:189 +#: fields/typography/typography.php:203 fields/typography/typography.php:221 +msgid "Default" +msgstr "默认" + +#: fields/typography/typography.php:130 +msgid "Font Style" +msgstr "字体样式" + +#: fields/typography/typography.php:144 fields/typography/typography.php:145 +msgid "Load Extra Styles" +msgstr "加载额外样式" + +#: fields/typography/typography.php:158 +msgid "Subset" +msgstr "子集" + +#: fields/typography/typography.php:168 +msgid "Text Align" +msgstr "文本对齐" + +#: fields/typography/typography.php:170 +msgid "Inherit" +msgstr "继承" + +#: fields/typography/typography.php:171 +msgid "Left" +msgstr "左侧" + +#: fields/typography/typography.php:172 +msgid "Center" +msgstr "居中" + +#: fields/typography/typography.php:173 +msgid "Right" +msgstr "右侧" + +#: fields/typography/typography.php:174 +msgid "Justify" +msgstr "两端对齐" + +#: fields/typography/typography.php:175 +msgid "Initial" +msgstr "初始" + +#: fields/typography/typography.php:184 +msgid "Font Variant" +msgstr "字体变体" + +#: fields/typography/typography.php:187 +msgid "Small Caps" +msgstr "小写" + +#: fields/typography/typography.php:188 +msgid "All Small Caps" +msgstr "所有字母小写" + +#: fields/typography/typography.php:197 +msgid "Text Transform" +msgstr "文本转换" + +#: fields/typography/typography.php:200 +msgid "Capitalize" +msgstr "大写" + +#: fields/typography/typography.php:201 +msgid "Uppercase" +msgstr "大写" + +#: fields/typography/typography.php:202 +msgid "Lowercase" +msgstr "小写" + +#: fields/typography/typography.php:211 +msgid "Text Decoration" +msgstr "文本装饰" + +#: fields/typography/typography.php:218 +msgid "Wavy" +msgstr "波浪" + +#: fields/typography/typography.php:219 +msgid "Overline" +msgstr "上划线" + +#: fields/typography/typography.php:220 +msgid "Line-through" +msgstr "删除线" + +#: fields/typography/typography.php:233 +msgid "Font Size" +msgstr "字体大小" + +#: fields/typography/typography.php:245 +msgid "Line Height" +msgstr "线高度" + +#: fields/typography/typography.php:257 +msgid "Letter Spacing" +msgstr "字母间距" + +#: fields/typography/typography.php:269 +msgid "Word Spacing" +msgstr "字间距" + +#: fields/typography/typography.php:284 +msgid "Font Color" +msgstr "字体颜色" + +#: fields/typography/typography.php:295 +msgid "Custom Style" +msgstr "自定义样式" + +#: fields/typography/typography.php:362 +msgid "Custom Web Fonts" +msgstr "自定义 Web 字体" + +#: fields/typography/typography.php:368 +msgid "Safe Web Fonts" +msgstr "Web 安全字体" + +#: fields/typography/typography.php:388 +msgid "Google Web Fonts" +msgstr "Google Web 字体" + +#: functions/actions.php:72 functions/actions.php:110 +msgid "Error: Invalid key." +msgstr "错误:无效密钥。" + +#: functions/actions.php:114 +msgid "Error: The response is not a valid JSON response." +msgstr "错误:响应不是有效的 JSON 响应。" + +#: functions/actions.php:174 +msgid "Error: Invalid term ID." +msgstr "错误:无效的项目ID。" + +#: functions/actions.php:180 +msgid "Error: You do not have permission to do that." +msgstr "错误:您无权这样做。" + +#: functions/validate.php:14 functions/validate.php:86 +msgid "Please enter a valid email address." +msgstr "请输入正确的电子邮件地址。" + +#: functions/validate.php:32 functions/validate.php:106 +msgid "Please enter a valid number." +msgstr "请输入有效的数字" + +#: functions/validate.php:50 functions/validate.php:126 +msgid "This field is required." +msgstr "这是必填栏。" + +#: functions/validate.php:68 functions/validate.php:146 +msgid "Please enter a valid URL." +msgstr "请输入有效网址" + +#. Plugin Name of the plugin/theme +msgid "Wp_china_yes Framework" +msgstr "Wp_china_yes Framework" + +#. Plugin URI of the plugin/theme +msgid "http://wp_china_yesframework.com/" +msgstr "http://wp_china_yesframework.com/" + +#. Description of the plugin/theme +msgid "A Simple and Lightweight WordPress Option Framework for Themes and Plugins" +msgstr "一个简单且轻量的 WordPress 主题和插件选项框架" + +#. Author of the plugin/theme +msgid "Wp_china_yes" +msgstr "Wp_china_yes" + +#. Author URI of the plugin/theme +msgid "http://wp_china_yesthemes.com/" +msgstr "http://wp_china_yesthemes.com/" diff --git a/helpers.php b/helpers.php index c69e791..bf78610 100644 --- a/helpers.php +++ b/helpers.php @@ -9,13 +9,15 @@ function get_settings() { $settings = is_multisite() ? get_site_option( 'wp_china_yes' ) : get_option( 'wp_china_yes' ); return wp_parse_args( $settings, [ - 'store' => 'wenpai', - 'admincdn' => [ - 'admin' => 'admin', - ], - 'cravatar' => 'cn', - 'windfonts' => 'off', - 'adblock' => 'off', - 'monitor' => 'on', + 'store' => 'wenpai', + 'admincdn' => [ 'admin' ], + 'cravatar' => 'cn', + 'windfonts' => 'off', + 'windfonts_list' => [], + 'adblock' => 'off', + 'adblock_rule' => [], + 'monitor' => true, + 'hide' => false, + 'custom_name' => 'WP-China-Yes', ] ); } diff --git a/wp-china-yes.php b/wp-china-yes.php index 1fe9762..0d93e57 100644 --- a/wp-china-yes.php +++ b/wp-china-yes.php @@ -4,7 +4,7 @@ * Description: 文派叶子 🍃(WP-China-Yes)是中国 WordPress 生态基础设施软件,犹如落叶新芽,生生不息。 * Author: 文派开源 * Author URI: https://wp-china-yes.com - * Version: 3.6.5 + * Version: 3.7.0 * License: GPLv3 or later * Text Domain: wp-china-yes * Domain Path: /languages @@ -19,7 +19,7 @@ namespace WenPai\ChinaYes; defined( 'ABSPATH' ) || exit; -define( 'CHINA_YES_VERSION', '3.6.5' ); +define( 'CHINA_YES_VERSION', '3.7.0' ); define( 'CHINA_YES_PLUGIN_FILE', __FILE__ ); define( 'CHINA_YES_PLUGIN_URL', plugin_dir_url( CHINA_YES_PLUGIN_FILE ) ); define( 'CHINA_YES_PLUGIN_PATH', plugin_dir_path( CHINA_YES_PLUGIN_FILE ) ); From 529bb10f34c5116eee295281650ffd9ab44383df Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=96=87=E6=B4=BE=E5=A4=87=E6=A1=88?= <130886204+modiqi@users.noreply.github.com> Date: Mon, 23 Sep 2024 22:26:26 +0800 Subject: [PATCH 05/36] Update Setting.php MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 修改文案内容、添加帮助链接 --- Service/Setting.php | 38 +++++++++++++++++++++++--------------- 1 file changed, 23 insertions(+), 15 deletions(-) diff --git a/Service/Setting.php b/Service/Setting.php index f85ecbf..b442979 100644 --- a/Service/Setting.php +++ b/Service/Setting.php @@ -63,7 +63,7 @@ class Setting { ], 'default' => 'wenpai', 'subtitle' => '是否启用市场加速', - 'desc' => __( '官方加速源(WPMirror)直接从 .org 反代至大陆分发;文派开源(WenPai.org)中国境内自建托管仓库,同时集成文派翻译平台', + 'desc' => __( '官方加速源(WPMirror)直接从 .org 反代至大陆分发;文派开源(WenPai.org)中国境内自建托管仓库,同时集成文派翻译平台。可参考节点选择说明。', 'wp-china-yes' ), ], [ @@ -83,7 +83,7 @@ class Setting { 'admin' => 'admin', ], 'subtitle' => '是否启用萌芽加速', - 'desc' => __( '萌芽加速(adminCDN)将 WordPress 依赖的静态文件切换为公共资源,加快网站访问速度。您可按需启用需要加速的项目,更多细节控制和功能,请关注 adminCDN 项目', + 'desc' => __( '萌芽加速(adminCDN)将 WordPress 依赖的静态文件切换为公共资源,加快网站访问速度。您可按需启用需要加速的项目,更多细节控制和功能,查看推荐设置。', 'wp-china-yes' ), ], [ @@ -122,7 +122,7 @@ class Setting { ], 'default' => 'off', 'subtitle' => '是否启用文风字体定制', - 'desc' => __( '文风字体(Windfonts)为您的网站增添无限活力。专为中文网页设计,旨在提升用户阅读体验和视觉享受', + 'desc' => __( '文风字体(Windfonts)为您的网站增添无限活力。专为中文网页设计,旨在提升用户阅读体验和视觉享受。新手使用请先查看字体使用说明。', 'wp-china-yes' ), ], [ @@ -144,7 +144,7 @@ class Setting { 'type' => 'text', 'title' => __( '字体家族', 'wp-china-yes' ), 'subtitle' => '字体家族名称', - 'desc' => __( '填入从文风字体获取的字体家族名称', + 'desc' => __( '填入从文风字体获取的字体家族名称', 'wp-china-yes' ), 'default' => 'wenfeng-syhtcjk', ], @@ -153,7 +153,7 @@ class Setting { 'type' => 'text', 'title' => __( '字体链接', 'wp-china-yes' ), 'subtitle' => '字体 CSS 链接', - 'desc' => __( '填入从文风字体获取的字体 CSS 链接', + 'desc' => __( '填入从文风字体获取的字体 CSS 链接', 'wp-china-yes' ), 'default' => 'https://cn.windfonts.com/wenfeng/fonts/syhtcjk/regular/web/index.css', 'validate' => 'csf_validate_url', @@ -207,7 +207,7 @@ class Setting { ], [ 'type' => 'content', - 'content' => '默认适配规则跟随插件更新,插件更新后可删除字体重新添加以获取最新适配规则', + 'content' => '默认字体适配规则跟随插件更新,插件更新后可删除字体重新添加以获取最新适配规则', ], ], ] ); @@ -227,7 +227,7 @@ class Setting { ], 'default' => 'off', 'subtitle' => '是否启用后台广告屏蔽', - 'desc' => __( '文派叶子🍃(WP-China-Yes)独家特色功能,让您拥有清爽整洁的 WordPress 后台,清除各类常用插件侵入式后台广告、通知及无用信息', + 'desc' => __( '文派叶子🍃(WP-China-Yes)独家特色功能,让您拥有清爽整洁的 WordPress 后台,清除各类常用插件侵入式后台广告、通知及无用信息,拿回您后台的控制权。', 'wp-china-yes' ), ], [ @@ -274,7 +274,7 @@ class Setting { ], [ 'type' => 'content', - 'content' => '默认屏蔽规则跟随插件更新,插件更新后可删除规则重新添加以获取最新屏蔽规则', + 'content' => '默认广告屏蔽规则跟随插件更新,插件更新后可删除规则重新添加以获取更多最新屏蔽规则,出现异常,请尝试先停用规则排查原因。', ], ], ] ); @@ -289,7 +289,7 @@ class Setting { 'default' => true, 'title' => '节点监控', 'subtitle' => '自动监控加速节点可用性', - 'desc' => __( '文派叶子🍃(WP-China-Yes)支持自动监控各加速节点可用性,当节点不可用时自动切换至可用节点或关闭加速,以保证您的网站正常访问', + 'desc' => __( '脉云维护(MainCloud)支持自动监控各加速节点可用性,当节点不可用时自动切换至可用节点或关闭加速,以保证您的网站正常访问', 'wp-china-yes' ), ], [ @@ -298,7 +298,7 @@ class Setting { 'default' => false, 'title' => '隐藏设置', 'subtitle' => '隐藏插件设置入口', - 'desc' => __( '如果您不希望让客户知道本站启用了文派叶子🍃(WP-China-Yes)插件及服务,可开启此选项', + 'desc' => __( '如果您不希望让客户知道本站启用了文派叶子🍃(WP-China-Yes)插件及服务,可开启此选项', 'wp-china-yes' ), ], [ @@ -306,13 +306,13 @@ class Setting { 'type' => 'text', 'title' => '品牌白标', 'subtitle' => '自定义插件显示品牌名', - 'desc' => __( '专为 WordPress 建站服务商和代理机构提供的自定义品牌功能,输入您的品牌词启用后生效', + 'desc' => __( '专为 WordPress 建站服务商和代理机构提供的自定义品牌 OEM 功能,输入您的品牌词启用后生效', 'wp-china-yes' ), 'default' => "WP-China-Yes", ], [ 'type' => 'content', - 'content' => '启用隐藏设置前请务必保存当前设置页面 URL,否则您将无法再次进入插件设置页面', + 'content' => '启用隐藏设置前请务必的保存或收藏当前设置页面 URL,否则您将无法再次进入插件设置页面', ], ], ] ); @@ -323,11 +323,11 @@ class Setting { 'fields' => [ [ 'type' => 'heading', - 'content' => '将您的 WordPress 接入本土生态体系,这将为您提供一个更贴近中国人使用习惯的 WordPress', + 'content' => '文派叶子🍃 —— 开源 WordPress 中国网站加速器。', ], [ 'type' => 'submessage', - 'content' => '100% 开源代码,一起参与文派(WordPress)软件国产化进程,打造属于您自己的开源自助建站程序', + 'content' => '100% 开源代码,一起参与文派(WordPress)软件国产化进程,打造属于您自己的开源自助建站程序。', ], [ 'type' => 'subheading', @@ -335,12 +335,16 @@ class Setting { ], [ 'type' => 'content', - 'content' => '文派叶子 🍃(WP-China-Yes)是一款不可多得的 WordPress 系统底层优化和生态基础设施软件。项目起源于 2019 年,专为解决困扰了中国互联网数十年的特色问题而存在。此为文派开源(WenPai.org)的一部分', + 'content' => '文派叶子 🍃(WP-China-Yes)是一款不可多得的 WordPress 系统底层优化和生态基础设施软件。项目起源于 2019 年,专为解决困扰了中国互联网数十年的特色问题而存在。此为文派开源(WenPai.org)的一部分。

        将您的 WordPress 接入本土生态体系,这将为您提供一个更贴近中国人使用习惯的 WordPress。', ], [ 'type' => 'subheading', 'content' => '赞助商', ], + [ + 'type' => 'submessage', + 'content' => '特别感谢以下企业品牌对文派项目提供的资金资源,期待社会各界参与。', + ], [ 'type' => 'content', 'content' => @@ -363,6 +367,10 @@ HTML, 'type' => 'subheading', 'content' => '开发者 & 贡献者', ], + [ + 'type' => 'submessage', + 'content' => '以下为对此项目做出过贡献和帮助的朋友,贡献您自己的力量。', + ], [ 'type' => 'content', 'content' => From 210e2ffbce8733e3fb8caad453c48151d27fe415 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=96=87=E6=B4=BE=E5=A4=87=E6=A1=88?= <130886204+modiqi@users.noreply.github.com> Date: Mon, 23 Sep 2024 22:34:56 +0800 Subject: [PATCH 06/36] Update Setting.php MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 优化文案 --- Service/Setting.php | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/Service/Setting.php b/Service/Setting.php index b442979..857f171 100644 --- a/Service/Setting.php +++ b/Service/Setting.php @@ -63,7 +63,7 @@ class Setting { ], 'default' => 'wenpai', 'subtitle' => '是否启用市场加速', - 'desc' => __( '官方加速源(WPMirror)直接从 .org 反代至大陆分发;文派开源(WenPai.org)中国境内自建托管仓库,同时集成文派翻译平台。可参考节点选择说明。', + 'desc' => __( '官方加速源(WPMirror)直接从 .org 反代至大陆分发;文派开源(WenPai.org)中国境内自建托管仓库,同时集成文派翻译平台。可参考源站说明。', 'wp-china-yes' ), ], [ @@ -99,7 +99,7 @@ class Setting { ], 'default' => 'cn', 'subtitle' => '是否启用头像加速', - 'desc' => __( '初认头像(Cravatar)Gravatar 在中国的完美替代方案,您可以在 Cravatar.com 上传头像,更多选项请安装 WPAavatar 插件。(任何开发者均可在自己的产品中集成该服务,不局限于 WordPress)', + 'desc' => __( '初认头像(Cravatar)Gravatar 在中国的完美替代方案,您可以在 Cravatar.com 上传头像,更多选项请安装 WPAavatar 插件。可自选加速线路。', 'wp-china-yes' ), ], ], @@ -227,7 +227,7 @@ class Setting { ], 'default' => 'off', 'subtitle' => '是否启用后台广告屏蔽', - 'desc' => __( '文派叶子🍃(WP-China-Yes)独家特色功能,让您拥有清爽整洁的 WordPress 后台,清除各类常用插件侵入式后台广告、通知及无用信息,拿回您后台的控制权。', + 'desc' => __( '文派叶子🍃(WP-China-Yes)独家特色功能,让您拥有清爽整洁的 WordPress 后台,清除各类常用插件侵入式后台广告、通知及无用信息,拿回您的后台控制权。', 'wp-china-yes' ), ], [ From ada09d9f8c0a9b51efe503448b6c5107ab985d2e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=96=87=E6=B4=BE=E5=A4=87=E6=A1=88?= <130886204+modiqi@users.noreply.github.com> Date: Mon, 23 Sep 2024 23:45:15 +0800 Subject: [PATCH 07/36] Update Super.php MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 优化新闻推送小工具 --- Service/Super.php | 28 ++++++++++++++++++++++------ 1 file changed, 22 insertions(+), 6 deletions(-) diff --git a/Service/Super.php b/Service/Super.php index 45e96b4..5395ace 100644 --- a/Service/Super.php +++ b/Service/Super.php @@ -49,10 +49,14 @@ HTML;
        HTML; } ); @@ -99,11 +107,15 @@ HTML;
        + | + 翻译平台 + | + 文章投稿 + | + 自选新闻源 +

        HTML; } ); From 9c678616f2d9d634b092b1eb166737bd7ce1cf98 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=96=87=E6=B4=BE=E5=A4=87=E6=A1=88?= <130886204+modiqi@users.noreply.github.com> Date: Tue, 24 Sep 2024 00:33:27 +0800 Subject: [PATCH 08/36] =?UTF-8?q?=E6=B7=BB=E5=8A=A0=E5=8E=BB=E5=B9=BF?= =?UTF-8?q?=E5=91=8A=E6=8F=92=E4=BB=B6=E5=88=97=E8=A1=A8=E9=93=BE=E6=8E=A5?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Service/Base.php | 1 + Service/Setting.php | 12 +++++++----- 2 files changed, 8 insertions(+), 5 deletions(-) diff --git a/Service/Base.php b/Service/Base.php index d1dd9e5..238172e 100644 --- a/Service/Base.php +++ b/Service/Base.php @@ -17,6 +17,7 @@ class Base { */ add_filter( sprintf( '%splugin_action_links', is_multisite() ? 'network_admin_' : '' ), function ( $links, $plugin = '' ) { $links[] = '参与翻译'; + $links[] = '去广告'; return $links; }, 10, 2 ); diff --git a/Service/Setting.php b/Service/Setting.php index 857f171..7f685fe 100644 --- a/Service/Setting.php +++ b/Service/Setting.php @@ -83,7 +83,7 @@ class Setting { 'admin' => 'admin', ], 'subtitle' => '是否启用萌芽加速', - 'desc' => __( '萌芽加速(adminCDN)将 WordPress 依赖的静态文件切换为公共资源,加快网站访问速度。您可按需启用需要加速的项目,更多细节控制和功能,查看推荐设置。', + 'desc' => __( '萌芽加速(adminCDN)将 WordPress 依赖的静态文件切换为公共资源,加快网站访问速度。您可按需启用需要加速的项目,更多细节控制和功能,请查看推荐设置。', 'wp-china-yes' ), ], [ @@ -235,7 +235,9 @@ class Setting { 'type' => 'group', 'title' => '规则列表', 'subtitle' => '使用的广告屏蔽规则列表', - 'desc' => '支持添加多条广告屏蔽规则', + 'desc' => __( '支持添加多条广告屏蔽规则', + 'wp-china-yes' ), + 'button_title' => '添加规则', 'accordion_title_number' => true, 'dependency' => [ @@ -274,7 +276,7 @@ class Setting { ], [ 'type' => 'content', - 'content' => '默认广告屏蔽规则跟随插件更新,插件更新后可删除规则重新添加以获取更多最新屏蔽规则,出现异常,请尝试先停用规则排查原因。', + 'content' => '默认规则跟随插件更新,插件更新后可删除规则重新添加以获取更多最新屏蔽规则,出现异常,请尝试先停用规则排查原因。', ], ], ] ); @@ -343,7 +345,7 @@ class Setting { ], [ 'type' => 'submessage', - 'content' => '特别感谢以下企业品牌对文派项目提供的资金资源,期待社会各界参与。', + 'content' => '特别感谢以下企业品牌对文派项目提供的资金资源,同时期待社会各界参与。', ], [ 'type' => 'content', @@ -369,7 +371,7 @@ HTML, ], [ 'type' => 'submessage', - 'content' => '以下为对此项目做出过贡献和帮助的朋友,贡献您自己的力量。', + 'content' => '以下为对此项目提供过帮助的朋友,欢迎贡献您自己的力量。', ], [ 'type' => 'content', From cb98197084a3cc133a1eec680ad21d0fc32389d7 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=96=87=E6=B4=BE=E5=A4=87=E6=A1=88?= <130886204+modiqi@users.noreply.github.com> Date: Tue, 24 Sep 2024 00:43:16 +0800 Subject: [PATCH 09/36] Update Setting.php MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 修改Logo至CDN外链 --- Service/Setting.php | 20 ++++++++++---------- 1 file changed, 10 insertions(+), 10 deletions(-) diff --git a/Service/Setting.php b/Service/Setting.php index 7f685fe..f85de8c 100644 --- a/Service/Setting.php +++ b/Service/Setting.php @@ -352,16 +352,16 @@ class Setting { 'content' => << - - - - - - - - - - + + + + + + + + + +
        HTML, ], From cb06d1bef4bcd3b1396036f1c758ec45aea4fa9d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=96=87=E6=B4=BE=E5=A4=87=E6=A1=88?= <130886204+modiqi@users.noreply.github.com> Date: Tue, 24 Sep 2024 01:18:23 +0800 Subject: [PATCH 10/36] =?UTF-8?q?=E4=BF=AE=E6=94=B9=E9=93=BE=E6=8E=A5?= =?UTF-8?q?=E8=89=B2=E5=80=BC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- assets/css/setting.css | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/assets/css/setting.css b/assets/css/setting.css index 162a105..45e2a80 100644 --- a/assets/css/setting.css +++ b/assets/css/setting.css @@ -12,7 +12,7 @@ } .wp_china_yes-content a { - color: #0073aa; + color: #3858e9; text-decoration: none; } From 219631bc7e55b3f76792d5023abb328922234c2d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=96=87=E6=B4=BE=E5=A4=87=E6=A1=88?= <130886204+modiqi@users.noreply.github.com> Date: Tue, 24 Sep 2024 02:01:11 +0800 Subject: [PATCH 11/36] =?UTF-8?q?=E4=BC=98=E5=8C=96=E6=A0=B7=E5=BC=8Fcss?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- assets/css/fonts.css | 6 +++++- assets/css/setting.css | 4 ++++ 2 files changed, 9 insertions(+), 1 deletion(-) diff --git a/assets/css/fonts.css b/assets/css/fonts.css index 5b0941e..86bde42 100644 --- a/assets/css/fonts.css +++ b/assets/css/fonts.css @@ -1,3 +1,7 @@ +html { + -webkit-font-smoothing: antialiased; +} + html, body, div, span, applet, object, iframe, h1, h2, h3, h4, h5, h6, p, blockquote, pre, a, abbr, acronym, address, big, cite, code, del, dfn, em, font, ins, kbd, q, s, samp, small, strike, strong, sub, sup, tt, var, dl, dt, dd, ol, ul, li, fieldset, form, label, legend, table, caption, tbody, tfoot, thead, tr, th, td { font-family: -apple-system, "Noto Sans", "Helvetica Neue", Helvetica, "Nimbus Sans L", Arial, "Liberation Sans", "PingFang SC", "Hiragino Sans GB", "Noto Sans CJK SC", "Source Han Sans SC", "Source Han Sans CN", "Microsoft YaHei", "Wenquanyi Micro Hei", "WenQuanYi Zen Hei", "ST Heiti", SimHei, "WenQuanYi Zen Hei Sharp", sans-serif; -} \ No newline at end of file +} diff --git a/assets/css/setting.css b/assets/css/setting.css index 45e2a80..96cb79c 100644 --- a/assets/css/setting.css +++ b/assets/css/setting.css @@ -16,6 +16,10 @@ text-decoration: none; } +.wp_china_yes-content a:active, a:focus, a:hover { + color: #2c3338; +} + .wp_china_yes-options { background-color: #fff; padding: 1%; From b0a4bc3d420d788b6bfdf0d7bedb7e7ffdcf0da4 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=96=87=E6=B4=BE=E5=A4=87=E6=A1=88?= <130886204+modiqi@users.noreply.github.com> Date: Tue, 24 Sep 2024 02:25:17 +0800 Subject: [PATCH 12/36] =?UTF-8?q?=E4=BC=98=E5=8C=96=E6=98=BE=E7=A4=BA?= =?UTF-8?q?=E6=95=88=E6=9E=9C?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Service/Setting.php | 4 +++- assets/css/setting.css | 13 ++++++++++++- 2 files changed, 15 insertions(+), 2 deletions(-) diff --git a/Service/Setting.php b/Service/Setting.php index f85de8c..7984f60 100644 --- a/Service/Setting.php +++ b/Service/Setting.php @@ -308,7 +308,7 @@ class Setting { 'type' => 'text', 'title' => '品牌白标', 'subtitle' => '自定义插件显示品牌名', - 'desc' => __( '专为 WordPress 建站服务商和代理机构提供的自定义品牌 OEM 功能,输入您的品牌词启用后生效', + 'desc' => __( '专为 WordPress 建站服务商和代理机构提供的自定义品牌 OEM 功能,输入您的品牌词启用后生效', 'wp-china-yes' ), 'default' => "WP-China-Yes", ], @@ -377,6 +377,7 @@ HTML, 'type' => 'content', 'content' => << 孙锡源 | 耗子 | Yulinn | @@ -388,6 +389,7 @@ HTML, 诗语 | 莫蒂奇 | 薇晓朵 +
        HTML, ] ], diff --git a/assets/css/setting.css b/assets/css/setting.css index 96cb79c..a9ebcba 100644 --- a/assets/css/setting.css +++ b/assets/css/setting.css @@ -7,10 +7,21 @@ .sponsor-logos img { flex-basis: calc(20% - 10px); max-width: 85px; - margin: 5px; + margin: 14px; height: auto; } +.contributors-name { + margin-top: 0; + margin-bottom: 0; + padding: 12px; + color: #dcdcde; +} + +.contributors-name a{ + line-height: 2; + padding: 0.5em; +} .wp_china_yes-content a { color: #3858e9; text-decoration: none; From a87985970d67acb112ceef9e7c24d8171c0f8a36 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E8=80=97=E5=AD=90?= Date: Wed, 25 Sep 2024 16:45:48 +0800 Subject: [PATCH 13/36] =?UTF-8?q?feat:=20=E6=B7=BB=E5=8A=A0=E6=8E=92?= =?UTF-8?q?=E5=8D=B0=E4=BC=98=E5=8C=96=E5=92=8C=E9=A3=9E=E8=A1=8C=E6=A8=A1?= =?UTF-8?q?=E5=BC=8F?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .gitignore | 1 + Service/Monitor.php | 6 +- Service/Setting.php | 98 ++++++++++- Service/Super.php | 291 +++++++++++++++++++++++++------- assets/css/setting.css | 3 +- helpers.php | 23 +-- languages/wp-china-yes-en_US.mo | Bin 5870 -> 0 bytes languages/wp-china-yes-en_US.po | 171 ------------------- languages/wp-china-yes-zh_CN.mo | Bin 5468 -> 0 bytes languages/wp-china-yes-zh_CN.po | 160 ------------------ languages/wp-china-yes-zh_TW.mo | Bin 5492 -> 0 bytes languages/wp-china-yes-zh_TW.po | 160 ------------------ 12 files changed, 340 insertions(+), 573 deletions(-) delete mode 100644 languages/wp-china-yes-en_US.mo delete mode 100644 languages/wp-china-yes-en_US.po delete mode 100644 languages/wp-china-yes-zh_CN.mo delete mode 100644 languages/wp-china-yes-zh_CN.po delete mode 100644 languages/wp-china-yes-zh_TW.mo delete mode 100644 languages/wp-china-yes-zh_TW.po diff --git a/.gitignore b/.gitignore index 5657f6e..331c58f 100644 --- a/.gitignore +++ b/.gitignore @@ -1 +1,2 @@ +.idea vendor \ No newline at end of file diff --git a/Service/Monitor.php b/Service/Monitor.php index bcdecb4..e59aab6 100644 --- a/Service/Monitor.php +++ b/Service/Monitor.php @@ -17,6 +17,9 @@ class Monitor { public function __construct() { $this->settings = get_settings(); + if ( $this->settings['monitor'] ) { + return; + } add_action( 'init', [ $this, 'init' ] ); add_action( 'wp_china_yes_maybe_check_store', [ @@ -37,9 +40,6 @@ class Monitor { * 初始化 */ public function init() { - if ( $this->settings['monitor'] ) { - return; - } // 检查应用市场可用性 if ( ! wp_next_scheduled( 'wp_china_yes_maybe_check_store' ) && $this->settings['store'] != 'off' ) { wp_schedule_event( time(), 'hourly', 'wp_china_yes_maybe_check_store' ); diff --git a/Service/Setting.php b/Service/Setting.php index 7984f60..9d4e8cb 100644 --- a/Service/Setting.php +++ b/Service/Setting.php @@ -125,6 +125,26 @@ class Setting { 'desc' => __( '文风字体(Windfonts)为您的网站增添无限活力。专为中文网页设计,旨在提升用户阅读体验和视觉享受。新手使用请先查看字体使用说明。', 'wp-china-yes' ), ], + [ + 'id' => 'windfonts_typography', + 'type' => 'checkbox', + 'title' => __( '排印优化', 'wp-china-yes' ), + 'inline' => true, + 'options' => [ + 'corner' => '直角括号', + 'space' => '文本空格', + 'punctuation' => '标点显示', + ], + 'default' => '', + 'subtitle' => '是否启用排印优化', + 'desc' => __( '排印优化可提升中文网页的视觉美感,适用于中文字体的网站。', + 'wp-china-yes' ), + 'dependency' => [ + 'windfonts', + 'any', + 'on,frontend,optimize', + ], + ], [ 'id' => 'windfonts_list', 'type' => 'group', @@ -193,7 +213,7 @@ class Setting { 'subtitle' => '字体应用元素', 'desc' => __( '设置字体应用的元素(CSS 选择器)', 'wp-china-yes' ), - 'default' => 'a,p,h1,h2,h3,h4,h5,h6,ul,ol,li,button,blockquote,pre,code,table,th,td,div:not([class*="star"]),label,b,i:not([class]),em,small,strong,sub,sup,ins,del,mark,abbr,dfn,span:not([class*="icon"])', + 'default' => 'a:not([class]),p,h1,h2,h3,h4,h5,h6,ul,ol,li,button,blockquote,pre,code,table,th,td,label,b,i:not([class]),em,small,strong,sub,sup,ins,del,mark,abbr,dfn,span:not([class])', 'sanitize' => false, ], [ @@ -231,11 +251,11 @@ class Setting { 'wp-china-yes' ), ], [ - 'id' => 'adblock_rule', - 'type' => 'group', - 'title' => '规则列表', - 'subtitle' => '使用的广告屏蔽规则列表', - 'desc' => __( '支持添加多条广告屏蔽规则', + 'id' => 'adblock_rule', + 'type' => 'group', + 'title' => '规则列表', + 'subtitle' => '使用的广告屏蔽规则列表', + 'desc' => __( '支持添加多条广告屏蔽规则', 'wp-china-yes' ), 'button_title' => '添加规则', @@ -281,6 +301,72 @@ class Setting { ], ] ); + WP_CHINA_YES::createSection( $this->prefix, [ + 'title' => '飞行模式', + 'icon' => 'fa fa-plane', + 'fields' => [ + [ + 'id' => 'plane', + 'type' => 'radio', + 'title' => __( '飞行模式', 'wp-china-yes' ), + 'inline' => true, + 'options' => [ + 'on' => '启用', + 'off' => '不启用', + ], + 'default' => 'off', + 'subtitle' => '是否启用飞行模式', + 'desc' => __( '文派叶子🍃(WP-China-Yes)独家特色功能,飞行模式可以屏蔽 WordPress 主题插件中国不能访问的服务 API 请求,加速网站前后台访问。注意:部分外部请求为产品更新检测,若屏蔽请定期手动检测。', + 'wp-china-yes' ), + ], + [ + 'id' => 'plane_rule', + 'type' => 'group', + 'title' => '规则列表', + 'subtitle' => '飞行模式使用的 URL 屏蔽规则列表', + 'desc' => __( '支持添加多条 URL 屏蔽规则', + 'wp-china-yes' ), + + 'button_title' => '添加规则', + 'accordion_title_number' => true, + 'dependency' => [ + 'plane', + 'any', + 'on', + ], + 'fields' => [ + [ + 'id' => 'name', + 'type' => 'text', + 'title' => __( '规则名称', 'wp-china-yes' ), + 'subtitle' => '自定义规则名称', + 'desc' => __( '自定义规则名称,方便识别', + 'wp-china-yes' ), + 'default' => '默认规则', + ], + [ + 'id' => 'url', + 'type' => 'textarea', + 'title' => __( 'URL', 'wp-china-yes' ), + 'subtitle' => 'URL', + 'desc' => __( '设置需要屏蔽的 URL 关键词', + 'wp-china-yes' ), + 'default' => '', + 'placeholder' => 'example.com', + 'sanitize' => false, + ], + [ + 'id' => 'enable', + 'type' => 'switcher', + 'title' => __( '启用规则', 'wp-china-yes' ), + 'subtitle' => '是否启用该规则', + 'default' => true, + ], + ], + ] + ], + ] ); + WP_CHINA_YES::createSection( $this->prefix, [ 'title' => '其他设置', 'icon' => 'fa fa-cogs', diff --git a/Service/Super.php b/Service/Super.php index 5395ace..73c5832 100644 --- a/Service/Super.php +++ b/Service/Super.php @@ -4,6 +4,7 @@ namespace WenPai\ChinaYes\Service; defined( 'ABSPATH' ) || exit; +use WP_Error; use function WenPai\ChinaYes\get_settings; /** @@ -170,56 +171,11 @@ HTML; } } + /** + * adminCDN + */ if ( ! ( defined( 'DOING_AJAX' ) && DOING_AJAX ) ) { - /** - * 前台静态加速 - */ - if ( in_array( 'frontend', (array) $this->settings['admincdn'] ) ) { - $this->page_str_replace( 'template_redirect', 'preg_replace', [ - '#(?<=[(\"\'])(?:' . quotemeta( home_url() ) . ')?/(?:((?:wp-content|wp-includes)[^\"\')]+\.(css|js)[^\"\')]+))(?=[\"\')])#', - 'https://public.admincdn.com/$0' - ] ); - } - - /** - * Google 字体替换 - */ - if ( in_array( 'googlefonts', (array) $this->settings['admincdn'] ) ) { - $this->page_str_replace( 'init', 'str_replace', [ - 'fonts.googleapis.com', - 'googlefonts.admincdn.com' - ] ); - } - - /** - * Google 前端公共库替换 - */ - if ( in_array( 'googleajax', (array) $this->settings['admincdn'] ) ) { - $this->page_str_replace( 'init', 'str_replace', [ - 'ajax.googleapis.com', - 'googleajax.admincdn.com' - ] ); - } - - /** - * CDNJS 前端公共库替换 - */ - if ( in_array( 'cdnjs', (array) $this->settings['admincdn'] ) ) { - $this->page_str_replace( 'init', 'str_replace', [ - 'cdnjs.cloudflare.com/ajax/libs', - 'cdnjs.admincdn.com' - ] ); - } - - /** - * jsDelivr 前端公共库替换 - */ - if ( in_array( 'jsdelivr', (array) $this->settings['admincdn'] ) ) { - $this->page_str_replace( 'init', 'str_replace', [ - 'jsd.admincdn.com', - 'jsd.admincdn.com' - ] ); - } + $this->load_admincdn(); } /** @@ -236,24 +192,93 @@ HTML; /** * 文风字体 */ - if ( ! empty( $this->settings['windfonts'] ) && $this->settings['windfonts'] == 'optimize' ) { - add_action( 'init', function () { - wp_enqueue_style( 'windfonts-optimize', CHINA_YES_PLUGIN_URL . 'assets/css/fonts.css', [], CHINA_YES_VERSION ); - } ); - } - if ( ! empty( $this->settings['windfonts'] ) && $this->settings['windfonts'] == 'on' ) { - add_action( 'wp_head', [ $this, 'load_windfonts' ] ); - add_action( 'admin_head', [ $this, 'load_windfonts' ] ); - } - if ( ! empty( $this->settings['windfonts'] ) && $this->settings['windfonts'] == 'frontend' ) { - add_action( 'wp_head', [ $this, 'load_windfonts' ] ); + if ( ! ( defined( 'DOING_AJAX' ) && DOING_AJAX ) ) { + if ( ! empty( $this->settings['windfonts'] ) && $this->settings['windfonts'] != 'off' ) { + $this->load_typography(); + } + if ( ! empty( $this->settings['windfonts'] ) && $this->settings['windfonts'] == 'optimize' ) { + add_action( 'init', function () { + wp_enqueue_style( 'windfonts-optimize', CHINA_YES_PLUGIN_URL . 'assets/css/fonts.css', [], CHINA_YES_VERSION ); + } ); + } + if ( ! empty( $this->settings['windfonts'] ) && $this->settings['windfonts'] == 'on' ) { + add_action( 'wp_head', [ $this, 'load_windfonts' ] ); + add_action( 'admin_head', [ $this, 'load_windfonts' ] ); + } + if ( ! empty( $this->settings['windfonts'] ) && $this->settings['windfonts'] == 'frontend' ) { + add_action( 'wp_head', [ $this, 'load_windfonts' ] ); + } } /** * 广告拦截 */ - if ( ! empty( $this->settings['adblock'] ) && $this->settings['adblock'] == 'on' ) { - add_action( 'admin_head', [ $this, 'load_adblock' ] ); + if ( ! ( defined( 'DOING_AJAX' ) && DOING_AJAX ) ) { + if ( ! empty( $this->settings['adblock'] ) && $this->settings['adblock'] == 'on' ) { + add_action( 'admin_head', [ $this, 'load_adblock' ] ); + } + } + + /** + * 飞行模式 + */ + if ( ! empty( $this->settings['plane'] ) && $this->settings['plane'] == 'on' ) { + $this->load_plane(); + } + } + + /** + * 加载 adminCDN + */ + public function load_admincdn() { + /** + * 前台静态加速 + */ + if ( in_array( 'frontend', (array) $this->settings['admincdn'] ) ) { + $this->page_str_replace( 'template_redirect', 'preg_replace', [ + '#(?<=[(\"\'])(?:' . quotemeta( home_url() ) . ')?/(?:((?:wp-content|wp-includes)[^\"\')]+\.(css|js)[^\"\')]+))(?=[\"\')])#', + 'https://public.admincdn.com/$0' + ] ); + } + + /** + * Google 字体替换 + */ + if ( in_array( 'googlefonts', (array) $this->settings['admincdn'] ) ) { + $this->page_str_replace( 'init', 'str_replace', [ + 'fonts.googleapis.com', + 'googlefonts.admincdn.com' + ] ); + } + + /** + * Google 前端公共库替换 + */ + if ( in_array( 'googleajax', (array) $this->settings['admincdn'] ) ) { + $this->page_str_replace( 'init', 'str_replace', [ + 'ajax.googleapis.com', + 'googleajax.admincdn.com' + ] ); + } + + /** + * CDNJS 前端公共库替换 + */ + if ( in_array( 'cdnjs', (array) $this->settings['admincdn'] ) ) { + $this->page_str_replace( 'init', 'str_replace', [ + 'cdnjs.cloudflare.com/ajax/libs', + 'cdnjs.admincdn.com' + ] ); + } + + /** + * jsDelivr 前端公共库替换 + */ + if ( in_array( 'jsdelivr', (array) $this->settings['admincdn'] ) ) { + $this->page_str_replace( 'init', 'str_replace', [ + 'jsd.admincdn.com', + 'jsd.admincdn.com' + ] ); } } @@ -298,6 +323,127 @@ HTML } } + /** + * 加载排印优化 + */ + public function load_typography() { + // code from corner-bracket-lover plugin + if ( in_array( 'corner', (array) $this->settings['windfonts_typography'] ) ) { + $this->page_str_replace( 'init', 'str_replace', [ + 'n’t', + 'n’t' + ] ); + $this->page_str_replace( 'init', 'str_replace', [ + '’s', + '’s' + ] ); + $this->page_str_replace( 'init', 'str_replace', [ + '’m', + '’m' + ] ); + $this->page_str_replace( 'init', 'str_replace', [ + '’re', + '’re' + ] ); + $this->page_str_replace( 'init', 'str_replace', [ + '’ve', + '’ve' + ] ); + $this->page_str_replace( 'init', 'str_replace', [ + '’d', + '’d' + ] ); + $this->page_str_replace( 'init', 'str_replace', [ + '’ll', + '’ll' + ] ); + $this->page_str_replace( 'init', 'str_replace', [ + '“', + '「' + ] ); + $this->page_str_replace( 'init', 'str_replace', [ + '”', + '」' + ] ); + $this->page_str_replace( 'init', 'str_replace', [ + '‘', + '『' + ] ); + $this->page_str_replace( 'init', 'str_replace', [ + '’', + '』' + ] ); + } + // code from space-lover plugin + if ( in_array( 'space', (array) $this->settings['windfonts_typography'] ) ) { + $this->page_str_replace( 'template_redirect', 'preg_replace', [ + '~(\p{Han})([a-zA-Z0-9\p{Ps}\p{Pi}])(?![^<]*>)~u', + '\1 \2' + ] ); + $this->page_str_replace( 'template_redirect', 'preg_replace', [ + '~([a-zA-Z0-9\p{Pe}\p{Pf}])(\p{Han})(?![^<]*>)~u', + '\1 \2' + ] ); + $this->page_str_replace( 'template_redirect', 'preg_replace', [ + '~([!?‽:;,.%])(\p{Han})~u', + '\1 \2' + ] ); + $this->page_str_replace( 'template_redirect', 'preg_replace', [ + '~(\p{Han})([@$#])~u', + '\1 \2' + ] ); + $this->page_str_replace( 'template_redirect', 'preg_replace', [ + '~(&?(?:amp)?;) (\p{Han})(?![^<]*>)~u', + '\1\2' + ] ); + $this->page_str_replace( 'template_redirect', 'preg_replace', [ + '~(\p{Han})(<(?!ruby)[a-zA-Z]+?[^>]*?>)([a-zA-Z0-9\p{Ps}\p{Pi}@$#])~u', + '\1 \2\3' + ] ); + $this->page_str_replace( 'template_redirect', 'preg_replace', [ + '~(\p{Han})(<\/(?!ruby)[a-zA-Z]+>)([a-zA-Z0-9])~u', + '\1\2 \3' + ] ); + $this->page_str_replace( 'template_redirect', 'preg_replace', [ + '~([a-zA-Z0-9\p{Pe}\p{Pf}!?‽:;,.%])(<(?!ruby)[a-zA-Z]+?[^>]*?>)(\p{Han})~u', + '\1 \2\3' + ] ); + $this->page_str_replace( 'template_redirect', 'preg_replace', [ + '~([a-zA-Z0-9\p{Ps}\p{Pi}!?‽:;,.%])(<\/(?!ruby)[a-zA-Z]+>)(\p{Han})~u', + '\1\2 \3' + ] ); + $this->page_str_replace( 'template_redirect', 'preg_replace', [ + '~[ ]*([「」『』()〈〉《》【】〔〕〖〗〘〙〚〛])[ ]*~u', + '\1' + ] ); + } + // code from quotmarks-replacer plugin + if ( in_array( 'punctuation', (array) $this->settings['windfonts_typography'] ) ) { + $qmr_work_tags = array( + 'the_title', // http://codex.wordpress.org/Function_Reference/the_title + 'the_content', // http://codex.wordpress.org/Function_Reference/the_content + 'the_excerpt', // http://codex.wordpress.org/Function_Reference/the_excerpt + // 'list_cats', Deprecated. http://codex.wordpress.org/Function_Reference/list_cats + 'single_post_title', // http://codex.wordpress.org/Function_Reference/single_post_title + 'comment_author', // http://codex.wordpress.org/Function_Reference/comment_author + 'comment_text', // http://codex.wordpress.org/Function_Reference/comment_text + // 'link_name', Deprecated. + // 'link_notes', Deprecated. + 'link_description', // Deprecated, but still widely used. + 'bloginfo', // http://codex.wordpress.org/Function_Reference/bloginfo + 'wp_title', // http://codex.wordpress.org/Function_Reference/wp_title + 'term_description', // http://codex.wordpress.org/Function_Reference/term_description + 'category_description', // http://codex.wordpress.org/Function_Reference/category_description + 'widget_title', // Used by all widgets in themes + 'widget_text' // Used by all widgets in themes + ); + + foreach ( $qmr_work_tags as $qmr_work_tag ) { + remove_filter( $qmr_work_tag, 'wptexturize' ); + } + } + } + /** * 加载广告拦截 */ @@ -322,6 +468,27 @@ HTML } } + /** + * 加载飞行模式 + */ + public function load_plane() { + add_filter( 'pre_http_request', function ( $preempt, $parsed_args, $url ) { + foreach ( (array) $this->settings['plane_rule'] as $rule ) { + if ( empty( $rule['enable'] ) ) { + continue; + } + if ( empty( $rule['url'] ) ) { + continue; + } + if ( strpos( $url, $rule['url'] ) !== false ) { + return new WP_Error( 'http_request_not_executed', '无用 URL 已屏蔽访问' ); + } + } + + return $preempt; + }, PHP_INT_MAX, 3 ); + } + /** * WordPress.Org 替换 */ diff --git a/assets/css/setting.css b/assets/css/setting.css index a9ebcba..f72e77b 100644 --- a/assets/css/setting.css +++ b/assets/css/setting.css @@ -18,10 +18,11 @@ color: #dcdcde; } -.contributors-name a{ +.contributors-name a { line-height: 2; padding: 0.5em; } + .wp_china_yes-content a { color: #3858e9; text-decoration: none; diff --git a/helpers.php b/helpers.php index bf78610..c5fa9c0 100644 --- a/helpers.php +++ b/helpers.php @@ -9,15 +9,18 @@ function get_settings() { $settings = is_multisite() ? get_site_option( 'wp_china_yes' ) : get_option( 'wp_china_yes' ); return wp_parse_args( $settings, [ - 'store' => 'wenpai', - 'admincdn' => [ 'admin' ], - 'cravatar' => 'cn', - 'windfonts' => 'off', - 'windfonts_list' => [], - 'adblock' => 'off', - 'adblock_rule' => [], - 'monitor' => true, - 'hide' => false, - 'custom_name' => 'WP-China-Yes', + 'store' => 'wenpai', + 'admincdn' => [ 'admin' ], + 'cravatar' => 'cn', + 'windfonts' => 'off', + 'windfonts_list' => [], + 'windfonts_typography' => [], + 'adblock' => 'off', + 'adblock_rule' => [], + 'plane' => 'off', + 'plane_rule' => [], + 'monitor' => true, + 'hide' => false, + 'custom_name' => 'WP-China-Yes', ] ); } diff --git a/languages/wp-china-yes-en_US.mo b/languages/wp-china-yes-en_US.mo deleted file mode 100644 index 4c31d5666c01ab038964f60bf85fbd4b6741aa24..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 5870 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 diff --git a/languages/wp-china-yes-en_US.po b/languages/wp-china-yes-en_US.po deleted file mode 100644 index 9e7e54b..0000000 --- a/languages/wp-china-yes-en_US.po +++ /dev/null @@ -1,171 +0,0 @@ -msgid "" -msgstr "" -"Project-Id-Version: WP-China-Yes\n" -"Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2024-08-23 03:41+0000\n" -"PO-Revision-Date: 2024-08-23 12:21+0800\n" -"Last-Translator: \n" -"Language-Team: English (United States)\n" -"Language: en_US\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: Poedit 3.4.4\n" -"X-Loco-Version: 2.6.11; wp-6.6\n" -"X-Domain: wp-china-yes\n" - -#: Service/Setting.php:54 -msgid "" -"萌芽加速(adminCDN)" -"将 WordPress 依赖的静态文件切换为公共资源,加快网站访问速度。您可按需启用需要" -"加速的项目,更多细节控制和功能,请关注 adminCDN 项目。" -msgstr "" -"adminCDN switches " -"the static files that WordPress relies on to public resources to speed up " -"website access. You can enable the projects that need to be accelerated as " -"needed. For more detailed control and functions, please pay attention to the " -"adminCDN project." - -#: Service/Setting.php:72 -msgid "" -"初认头像(Cravatar)Gravatar 在中国的完美替代方案,您可以在 Cravatar.com 上传头像,更多选项请安" -"装 WPAavatar 插件。(任何开发者均可在自己的产品中集成该服务,不局限于 " -"WordPress)" -msgstr "" -"Cravatar is a " -"perfect alternative to Gravatar in China. You can upload your avatar on " -"Cravatar.com. For more options, please install the WPAavatar plugin. (Any " -"developer can integrate this service into their own products, not limited to " -"WordPress)" - -#: Service/Setting.php:86 -msgid "" -"文风字体(Windfonts)为您的网页渲染中文字体并对主题、插件内的字体进行加速;优化模式可优化浏览器" -"字体调用。" -msgstr "" -"Windfonts renders " -"Chinese fonts for your web pages and accelerates fonts in themes and plug-" -"ins; the optimization mode can optimize browser font calls." - -#: Service/Setting.php:109 -msgid "" -"文派叶子🍃(WP-" -"China-Yes)支持自动监控各加速节点可用性,当节点不可用时自动切换至可用节点" -"或关闭加速,以保证您的网站正常访问。" -msgstr "" -"WP-China-Yes 🍃 " -"(文派叶子) supports automatic monitoring of the availability of each " -"acceleration node. When a node is unavailable, it automatically switches to " -"an available node or turns off acceleration to ensure normal access to your " -"website." - -#: Service/Setting.php:98 -msgid "" -"文派叶子🍃(WP-" -"China-Yes)独家特色功能,让您拥有清爽整洁的 WordPress 后台,清除各类常用" -"插件侵入式后台广告、通知及无用信息;启用后若存在异常拦截,请切换为手动模式," -"查看可优化插件列表。" -msgstr "" -"WP-China-Yes 🍃 " -"(文派叶子) unique features allow you to have a clean and tidy WordPress " -"backend, removing all kinds of intrusive backend ads, notifications and " -"useless information from commonly used plugins; if there is abnormal " -"interception after enabling, please switch to manual mode and check the list of optimizable " -"plugins." - -#: Service/Setting.php:41 -msgid "" -"官方加速源(WPMirror)直接从 .org 反代至大陆分发;文派开源(WenPai.org)中国境内自建托管仓库,同时集成文" -"派翻译平台。" -msgstr "" -"The official " -"acceleration source (WPMirror) is directly reverse-generated from .org " -"to the mainland for distribution; WenPai.org Open Source has its own hosting warehouse " -"in China and is integrated with the WenPai translation platform." - -#. Author URI of the plugin -msgid "https://wp-china-yes.com" -msgstr "https://wp-china-yes.com" - -#. Name of the plugin -#: Service/Setting.php:143 Service/Setting.php:144 -msgid "WP-China-Yes" -msgstr "WP-China-Yes" - -#: Plugin.php:52 -#, php-format -msgid "" -"WP-China-Yes 插件需要 PHP 5.6.0 或更高版本,当前版本为 %s,插件已自动禁用。" -msgstr "" -"The WP-China-Yes plugin requires PHP 5.6.0 or higher. The current version is " -"%s and the plugin has been automatically disabled." - -#: Service/Setting.php:71 -msgid "初认头像" -msgstr "Cravatar" - -#: Service/Setting.php:97 -msgid "广告拦截" -msgstr "Ad Blocker" - -#: Service/Setting.php:40 -msgid "应用市场" -msgstr "App Market" - -#. Description of the plugin -msgid "" -"文派叶子 🍃(WP-China-Yes)是中国 WordPress 生态基础设施软件,犹如落叶新芽," -"生生不息。" -msgstr "" -"WP-China-Yes 🍃 (文派叶子) is the infrastructure software for the Chinese " -"WordPress ecosystem, just like fallen leaves sprouting new leaves, it is " -"everlasting." - -#. Author of the plugin -msgid "文派开源" -msgstr "WenPai.org" - -#: Service/Setting.php:85 -msgid "文风字体" -msgstr "Windfonts" - -#: Plugin.php:71 -msgid "检测到不兼容的插件 Kill 429,已自动禁用!" -msgstr "Incompatible plugin Kill 429 detected, automatically disabled!" - -#: Plugin.php:65 -msgid "检测到不兼容的插件 WP-China-Plus,已自动禁用!" -msgstr "Incompatible plugin WP-China-Plus detected and automatically disabled!" - -#: Plugin.php:78 -msgid "" -"检测到已在 WordPress 配置文件中设置代理服务器,这可能会导致插件无法正常工作!" -msgstr "" -"A proxy server has been detected in the WordPress configuration file. This " -"may cause the plugin to not work properly!" - -#: Plugin.php:59 -msgid "检测到旧版插件 WP-China-No,已自动禁用!" -msgstr "" -"An old version of the plugin WP-China-No has been detected and automatically " -"disabled!" - -#: Service/Setting.php:108 -msgid "自动监控" -msgstr "Automatic Monitor" - -#: Service/Setting.php:53 -msgid "萌芽加速" -msgstr "adminCDN" - -#: Service/Setting.php:32 Service/Setting.php:155 -msgid "设置" -msgstr "Setting" diff --git a/languages/wp-china-yes-zh_CN.mo b/languages/wp-china-yes-zh_CN.mo deleted file mode 100644 index b2774338414318a58e6eaa183a91dd709e52971f..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 5468 zcmeHKOK%(36`rPQo3M{G?sE~e0|8wHBhiX&I8%v z@aW^cb06P1=R4seWc@AAaD2|eUjVP8{{^Rg+ra|x zCG=N;XMtY# z@Nu0Ez7Ax(F9ShSz_xZ9u>atbZ7WO?KvVds^93Oh;C2BN><1s`Lw?FRxu>&-Ad?8 z>pSoE%IbTqXRUP7O4LZ=RwJCnMCiB=sj!e1}&#|t4SUYfAxOr#J%GVn+dF(*S zE1!i2=)f9D6=*Wvm=BY5!JJ&f4{IgDS+MnUB{P%9A~dr}mTsDrAuBOJ$5u&fn|zFw zv({h@U#-GJ5`91)tciQHMLrXI2!|Zu)8*?j%zuI-NNmB%FOj89GMIuRx}4FDBVKcw zBAH(^it8j(15J`onmc1OQ#UG$bh<=yF-F-o&ZsP7q`0>V+fy`(38Q*zZwJS=MmP@6 z%#wWET8xTUyuao&MVk5;?u98}V^k_eZHiRGBsFe@qhw(i4#Wo5@F(QqJy0>qt7IYq zW{u1cjis%^GMyhKi5v(S#ZhuE+?Y!n<*{ZkVb@_7eGpLnS2Z;he1eY<@y6m9S)Va# z6JT{^Z@A+mhyd1u4Wi!2ZPDU=nwgF24<60{ zu%nwhB(+V}(_dsq2bp1Bsmq@DdnM@DMkgWI2=jMh&CHB5F{W>DqR^%}Py#>jpy5@x zoYW?GC-Xh;pV{VfdAeA`4|qQxMq|?ua${zF&+;VnW7HR{LS)~eNF%zwNQyaPEXey5DG&W=9)>u`1g75nR zx~@I3yyRz5B6xi50tt~_uqQYIGc%iXY}u%ciEWzREt1qIstVJ|(rROFh{T4F`f$Zz zLlm`N4zM|osqT)pt6^tLMfLKr`x(nh8M!@(BxL%mlxcj{%;${C1SuoMlO&y_GuynV z@Wsq}#VU-G5(K=#9C0vL9%(oQjF)!N`?^;=*>y10JW;{mc@3Kv56C^&$ zo2Vh;uaI;}r#L*k@8sM{#7XnLgY7>fC>*Td0@oB5h(OAdm`sWTWWFpM%y;qe2~TGW zyvQFAwKfs(I2kqN8Rl50)?xo`Ah*LXT#8h@UGczgW|%&ml>07#r1_q)@enH#u#jFMTk@ z%N2RJY}Do-VM}LLS+MP_!hz@1+KbxbSstvp!oll`z-b9yUHgOL3rTPIrMDG57|>Kt zb5&Gu*IP=zriY{p!R~-x`pvcOpma&|h%WDMrMHyp0X9K8Cx;Y|*x~LtA-PXW9WRQ< zJ3Jlk7u=`aZr6D^7?LjOvKs7_Lz<46=Vi6~n%u2OmlV0rBbxaz4n%&??SJ!#AN9P` zbaWIc%6+2u>GN~fFS*w$AS zU3x|JY5suP?GaDE8wj}&SY7UwUe)xzphr~u?Pl=I@lKKdJmc-wVlG}b6Ourd05B(De5|WXE?fFIv4Gu`{mL7 j^5}kv|57?9-G8}IAKfpH?w3dR%jT8q=zjVCdcXWPOdu@z diff --git a/languages/wp-china-yes-zh_CN.po b/languages/wp-china-yes-zh_CN.po deleted file mode 100644 index 08cf984..0000000 --- a/languages/wp-china-yes-zh_CN.po +++ /dev/null @@ -1,160 +0,0 @@ -msgid "" -msgstr "" -"Project-Id-Version: WP-China-Yes\n" -"Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2024-08-23 03:41+0000\n" -"PO-Revision-Date: 2024-08-23 12:20+0800\n" -"Last-Translator: \n" -"Language-Team: 简体中文\n" -"Language: zh_CN\n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: 8bit\n" -"Plural-Forms: nplurals=1; plural=0;\n" -"X-Generator: Poedit 3.4.4\n" -"X-Loco-Version: 2.6.10; wp-6.6\n" -"X-Domain: wp-china-yes\n" - -#: Service/Setting.php:54 -msgid "" -"萌芽加速(adminCDN)" -"将 WordPress 依赖的静态文件切换为公共资源,加快网站访问速度。您可按需启用需" -"要加速的项目,更多细节控制和功能,请关注 adminCDN 项目。" -msgstr "" -"萌芽加速(adminCDN)" -"将 WordPress 依赖的静态文件切换为公共资源,加快网站访问速度。您可按需启用需" -"要加速的项目,更多细节控制和功能,请关注 adminCDN 项目。" - -#: Service/Setting.php:72 -msgid "" -"初认头像(Cravatar)Gravatar 在中国的完美替代方案,您可以在 Cravatar.com 上传头像,更多选项请" -"安装 WPAavatar 插件。(任何开发者均可在自己的产品中集成该服务,不局限于 " -"WordPress)" -msgstr "" -"初认头像(Cravatar)Gravatar 在中国的完美替代方案,您可以在 Cravatar.com 上传头像,更多选项请" -"安装 WPAavatar 插件。(任何开发者均可在自己的产品中集成该服务,不局限于 " -"WordPress)" - -#: Service/Setting.php:86 -msgid "" -"文风字体(Windfonts)为您的网页渲染中文字体并对主题、插件内的字体进行加速;优化模式可优化浏览器" -"字体调用。" -msgstr "" -"文风字体(Windfonts)为您的网页渲染中文字体并对主题、插件内的字体进行加速;优化模式可优化浏览器" -"字体调用。" - -#: Service/Setting.php:109 -msgid "" -"文派叶子🍃(WP-" -"China-Yes)支持自动监控各加速节点可用性,当节点不可用时自动切换至可用节" -"点或关闭加速,以保证您的网站正常访问。" -msgstr "" -"文派叶子🍃(WP-" -"China-Yes)支持自动监控各加速节点可用性,当节点不可用时自动切换至可用节" -"点或关闭加速,以保证您的网站正常访问。" - -#: Service/Setting.php:98 -msgid "" -"文派叶子🍃(WP-" -"China-Yes)独家特色功能,让您拥有清爽整洁的 WordPress 后台,清除各类常用" -"插件侵入式后台广告、通知及无用信息;启用后若存在异常拦截,请切换为手动模式," -"查看可优化插件列表。" -msgstr "" -"文派叶子🍃(WP-" -"China-Yes)独家特色功能,让您拥有清爽整洁的 WordPress 后台,清除各类常用" -"插件侵入式后台广告、通知及无用信息;启用后若存在异常拦截,请切换为手动模式," -"查看可优化插件列表。" - -#: Service/Setting.php:41 -msgid "" -"官方加速源(WPMirror)直接从 .org 反代至大陆分发;文派开源(WenPai.org)中国境内自建托管仓库,同时集成文" -"派翻译平台。" -msgstr "" -"官方加速源(WPMirror)直接从 .org 反代至大陆分发;文派开源(WenPai.org)中国境内自建托管仓库,同时集成文" -"派翻译平台。" - -#. Author URI of the plugin -msgid "https://wp-china-yes.com" -msgstr "https://wp-china-yes.com" - -#. Name of the plugin -#: Service/Setting.php:143 Service/Setting.php:144 -msgid "WP-China-Yes" -msgstr "WP-China-Yes" - -#: Plugin.php:52 -#, php-format -msgid "" -"WP-China-Yes 插件需要 PHP 5.6.0 或更高版本,当前版本为 %s,插件已自动禁用。" -msgstr "" -"WP-China-Yes 插件需要 PHP 5.6.0 或更高版本,当前版本为 %s,插件已自动禁用。" - -#: Service/Setting.php:71 -msgid "初认头像" -msgstr "初认头像" - -#: Service/Setting.php:97 -msgid "广告拦截" -msgstr "广告拦截" - -#: Service/Setting.php:40 -msgid "应用市场" -msgstr "应用市场" - -#. Description of the plugin -msgid "" -"文派叶子 🍃(WP-China-Yes)是中国 WordPress 生态基础设施软件,犹如落叶新芽," -"生生不息。" -msgstr "" -"文派叶子 🍃(WP-China-Yes)是中国 WordPress 生态基础设施软件,犹如落叶新芽," -"生生不息。" - -#. Author of the plugin -msgid "文派开源" -msgstr "文派开源" - -#: Service/Setting.php:85 -msgid "文风字体" -msgstr "文风字体" - -#: Plugin.php:71 -msgid "检测到不兼容的插件 Kill 429,已自动禁用!" -msgstr "检测到不兼容的插件 Kill 429,已自动禁用!" - -#: Plugin.php:65 -msgid "检测到不兼容的插件 WP-China-Plus,已自动禁用!" -msgstr "检测到不兼容的插件 WP-China-Plus,已自动禁用!" - -#: Plugin.php:78 -msgid "" -"检测到已在 WordPress 配置文件中设置代理服务器,这可能会导致插件无法正常工" -"作!" -msgstr "" -"检测到已在 WordPress 配置文件中设置代理服务器,这可能会导致插件无法正常工" -"作!" - -#: Plugin.php:59 -msgid "检测到旧版插件 WP-China-No,已自动禁用!" -msgstr "检测到旧版插件 WP-China-No,已自动禁用!" - -#: Service/Setting.php:108 -msgid "自动监控" -msgstr "自动监控" - -#: Service/Setting.php:53 -msgid "萌芽加速" -msgstr "萌芽加速" - -#: Service/Setting.php:32 Service/Setting.php:155 -msgid "设置" -msgstr "设置" diff --git a/languages/wp-china-yes-zh_TW.mo b/languages/wp-china-yes-zh_TW.mo deleted file mode 100644 index 69ac10ceb5e68effc045a644c6af17621786528e..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 5492 zcmchb+jARN9mf|4(3)!lr93dO;~AbhvK=?cBu!oc-O;NBR576Hx)zOZa>bpTFSq1AIcC!yjDFeI6fte;%?G^5ho;;m;U9b3zcF zK%V%bAp8;IpFpyCzyGozd==v#J|_r0kY32|LjD7ijh}d)%NKO{eaPDwe_6j@&}A0# zJjP3qmmvQMX@NY`A_!+8mmt}Gf77J``6b+c0yzLZ{sqbOF=G0@ zyl%DicH2yLyD06?DmyXx?ua@Yr%o4*d8Ohm@pIIkaMSTs;@c%3VdptzxQwSt_95|X(XF&tQCs9I@eZNE5j{5JZ6nNoiX(_`R>>@p zrEM}Ch9fTPvvo(jq2G!mnU?Y!BvFQ%BomVN$7$j~DlXF49!>d}%9?RfaTznk$}a4k zqLdFvrTNMmblX&?A38HjGJa*zBVO$f{$Wz|RGX?;m<7zxxg;&+A& zJ^f~j(eQzZTV(9DH&y_&qucu=yh}DBPv*vknPJ_A%i6+Une4i4bP5UUV*U=K<-`O_ z#>fa)6uBw8_n;s2pw3meoRlZ|AoD#RpWfwbdATUwEk4etQC|#+tWIxKEDs@nq=Q){ z>#8~wWkfd?Nj}eu=`%N24&Eo3UD>~<_%~}6m-!e9(IB$RPxBtxSEkWzy6r*$YpErY z$T$h-SS{o|YJ3Tfk{=YIIrEPea%q2uc$QgEwV7n^fJ_9C5UTU8Jhx230XjX8$yB4X#k%8eYWer_zV0KZqFdq+vSDEz8MZLpNy1jmE^N zWgO2_-?WlSv#$6Q-w&E?HtSQ{OJ)Wwg2z{DkVvwt+5$bnNPw6qW1**+T;7m?P?I<~+|+As#if^d}V>_GzrFl(T5iP*o1>krlTRDWi$d zSPthY8=RWMKQsWOF!NJ=DA-N4kqUItNq2(8mt)<+QzDr?loK~!{Hb|hKs?=fo_Xo8 zD;}3z$F8i#rF-BO^XGBP@r<2TwUb`;jLGE;w1k211nk8v@==bA@^c047kerPaTEy- zW2tnPWJ`*7o2!lTrCU+nuE@h>shm8dEuCIv!Pcq@2cF(*-?lc_vcBgE^|&H%wS;b) z^`@!EVR*CG@C%d8Znj#wYP+I?x4dH-vf3PmtM)!~ui?kH`s{{l)-JK7`)7uCOt;N! zf#HhLVd@e)J33DrI?fq7UlC7rcAYx^a>u!jj+VEKc8B4b&1kU?7#&s{R=#Dl^xZP{ znGDxV#=$O8-gBwzQ~aQ-KI;-c?0@gt^_Ht|UVW{m*QvISmdiL{O%`nV!4Tf*F#W;N zJ~Uu7TP}z_{YIM|boTRWuN%(Q=CN1bFxd>RS$eF!W=mg}cM7dN$PE7@UwZ4Zj`8KzHj-bRO;S&gu1x`{SYHn(WOs!xx4eh= za(9#QWqOT7!_E0JiZVRPmn7%YVU6?Uc23SZoABj&P@PU5;!D1==>hNze7QEJ&Tl*u zUnYZ$iT-20B<`)s8!CM1%B%ApWj(0znAH*48CF)xoHDU9nJAI)degYq z*N4W<$55s+;r~?13~#fJ7mUh@#d^v_hN{JTI!$VnDMxqtV2v{4ZoZZmO_ehFG#tE0 zXEo+ON|_t}s#|N6sg=}cZm>L-Zbq4tj4~%(hbXf=g)r6YSQTm`~Lt+IkMXvW>VyKq!upt+F+Xd=oi5BVsspu?ca-6p4l_(j2S^EleX|14B#6CFi^ z&H5d5PzpwgEBP$QS!wD5PcWV>0`>ZJ萌芽加速(adminCDN)" -"将 WordPress 依赖的静态文件切换为公共资源,加快网站访问速度。您可按需启用需" -"要加速的项目,更多细节控制和功能,请关注 adminCDN 项目。" -msgstr "" -"萌芽加速(adminCDN)" -"將 WordPress 依賴的靜態檔案切換為公共資源,加快網站訪問速度。您可按需啟用需" -"要加速的專案,更多細節控制和功能,請關注 adminCDN 專案。" - -#: Service/Setting.php:72 -msgid "" -"初认头像(Cravatar)Gravatar 在中国的完美替代方案,您可以在 Cravatar.com 上传头像,更多选项请" -"安装 WPAavatar 插件。(任何开发者均可在自己的产品中集成该服务,不局限于 " -"WordPress)" -msgstr "" -"初認頭像(Cravatar)Gravatar 在中國的完美替代方案,您可以在 Cravatar.com 上傳頭像,更多選項請" -"安裝 WPAavatar 外掛。(任何開發者均可在自己的產品中整合該服務,不侷限於 " -"WordPress)" - -#: Service/Setting.php:86 -msgid "" -"文风字体(Windfonts)为您的网页渲染中文字体并对主题、插件内的字体进行加速;优化模式可优化浏览器" -"字体调用。" -msgstr "" -"文風字型(Windfonts)為您的網頁渲染中文字型並對主題、外掛內的字型進行加速;最佳化模式可最佳化瀏" -"覽器字型呼叫。" - -#: Service/Setting.php:109 -msgid "" -"文派叶子🍃(WP-" -"China-Yes)支持自动监控各加速节点可用性,当节点不可用时自动切换至可用节" -"点或关闭加速,以保证您的网站正常访问。" -msgstr "" -"文派葉子🍃(WP-" -"China-Yes)支援自動監控各加速節點可用性,當節點不可用時自動切換至可用節" -"點或關閉加速,以保證您的網站正常訪問。" - -#: Service/Setting.php:98 -msgid "" -"文派叶子🍃(WP-" -"China-Yes)独家特色功能,让您拥有清爽整洁的 WordPress 后台,清除各类常用" -"插件侵入式后台广告、通知及无用信息;启用后若存在异常拦截,请切换为手动模式," -"查看可优化插件列表。" -msgstr "" -"文派葉子🍃(WP-" -"China-Yes)獨家特色功能,讓您擁有清爽整潔的 WordPress 後臺,清除各類常用" -"外掛侵入式後臺廣告、通知及無用資訊;啟用後若存在異常攔截,請切換為手動模式," -"檢視可最佳化外掛列表" -"。" - -#: Service/Setting.php:41 -msgid "" -"官方加速源(WPMirror)直接从 .org 反代至大陆分发;文派开源(WenPai.org)中国境内自建托管仓库,同时集成文" -"派翻译平台。" -msgstr "" -"官方加速源(WPMirror)直接從 .org 反代至大陸分發;文派開源(WenPai.org)中國境內自建託管倉庫,同時整合文" -"派翻譯平臺。" - -#. Author URI of the plugin -msgid "https://wp-china-yes.com" -msgstr "https://wp-china-yes.com" - -#. Name of the plugin -#: Service/Setting.php:143 Service/Setting.php:144 -msgid "WP-China-Yes" -msgstr "文派葉子" - -#: Plugin.php:52 -#, php-format -msgid "" -"WP-China-Yes 插件需要 PHP 5.6.0 或更高版本,当前版本为 %s,插件已自动禁用。" -msgstr "" -"WP-China-Yes 外掛程式需要PHP 5.6.0 或更高版本,目前版本為%s,外掛程式已自動" -"停用。" - -#: Service/Setting.php:71 -msgid "初认头像" -msgstr "初認頭像" - -#: Service/Setting.php:97 -msgid "广告拦截" -msgstr "廣告攔截" - -#: Service/Setting.php:40 -msgid "应用市场" -msgstr "應用市場" - -#. Description of the plugin -msgid "" -"文派叶子 🍃(WP-China-Yes)是中国 WordPress 生态基础设施软件,犹如落叶新芽," -"生生不息。" -msgstr "" -"文派葉子 🍃(WP-China-Yes)是中國 WordPress 生態基礎設施軟體,猶如落葉新芽," -"生生不息。" - -#. Author of the plugin -msgid "文派开源" -msgstr "文派開源" - -#: Service/Setting.php:85 -msgid "文风字体" -msgstr "文風字體" - -#: Plugin.php:71 -msgid "检测到不兼容的插件 Kill 429,已自动禁用!" -msgstr "偵測到不相容的插件Kill 429,已自動停用!" - -#: Plugin.php:65 -msgid "检测到不兼容的插件 WP-China-Plus,已自动禁用!" -msgstr "偵測到不相容的外掛程式WP-China-Plus,已自動停用!" - -#: Plugin.php:78 -msgid "" -"检测到已在 WordPress 配置文件中设置代理服务器,这可能会导致插件无法正常工" -"作!" -msgstr "" -"偵測到已在WordPress 設定檔中設定代理伺服器,這可能會導致外掛無法正常運作!" - -#: Plugin.php:59 -msgid "检测到旧版插件 WP-China-No,已自动禁用!" -msgstr "偵測到舊版外掛程式WP-China-No,已自動停用!" - -#: Service/Setting.php:108 -msgid "自动监控" -msgstr "自動監控" - -#: Service/Setting.php:53 -msgid "萌芽加速" -msgstr "萌芽加速" - -#: Service/Setting.php:32 Service/Setting.php:155 -msgid "设置" -msgstr "設定" From 82ca5e5dc4e96e6bfc47bbee4e8cb1a0cfd8f476 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E8=80=97=E5=AD=90?= Date: Wed, 25 Sep 2024 16:47:55 +0800 Subject: [PATCH 14/36] =?UTF-8?q?fix:=20=E7=BB=9F=E4=B8=80=E9=A1=B9?= =?UTF-8?q?=E7=9B=AE=E4=B8=AD=E7=9A=84=E8=AE=B8=E5=8F=AF=E8=AF=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- composer.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/composer.json b/composer.json index b4944af..dc15555 100644 --- a/composer.json +++ b/composer.json @@ -5,7 +5,7 @@ "require": { "yahnis-elsts/plugin-update-checker": "^5.2" }, - "license": "MIT", + "license": "GPL-3.0-or-later", "autoload": { "psr-4": { "WenPai\\ChinaYes\\": "./" From 2b7c57a4275447948d1139b27b629157656055db Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E8=80=97=E5=AD=90?= Date: Wed, 25 Sep 2024 17:05:46 +0800 Subject: [PATCH 15/36] =?UTF-8?q?feat:=20=E6=94=AF=E6=8C=81=E6=9B=BF?= =?UTF-8?q?=E6=8D=A2=E6=8F=92=E4=BB=B6=E5=88=97=E8=A1=A8=E7=9A=84=E6=8F=92?= =?UTF-8?q?=E4=BB=B6=E5=90=8D?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Service/Setting.php | 11 +++++++++-- 1 file changed, 9 insertions(+), 2 deletions(-) diff --git a/Service/Setting.php b/Service/Setting.php index 9d4e8cb..504b598 100644 --- a/Service/Setting.php +++ b/Service/Setting.php @@ -342,11 +342,11 @@ class Setting { 'subtitle' => '自定义规则名称', 'desc' => __( '自定义规则名称,方便识别', 'wp-china-yes' ), - 'default' => '默认规则', + 'default' => '未命名规则', ], [ 'id' => 'url', - 'type' => 'textarea', + 'type' => 'text', 'title' => __( 'URL', 'wp-china-yes' ), 'subtitle' => 'URL', 'desc' => __( '设置需要屏蔽的 URL 关键词', @@ -496,6 +496,13 @@ HTML, * 挂载设置页面 */ public function admin_menu() { + // 自定义名称 + add_filter( 'all_plugins', function ( $plugins ) { + $plugins['wp-china-yes/wp-china-yes.php']['Name'] = $this->settings['custom_name']; + + return $plugins; + } ); + // 插件页设置 add_filter( 'plugin_action_links', function ( $links, $file ) { if ( 'wp-china-yes/wp-china-yes.php' !== $file ) { From 789c9200322bc3d1d6dbd6efb6aa36c2fde291b1 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E8=80=97=E5=AD=90?= Date: Wed, 25 Sep 2024 17:15:09 +0800 Subject: [PATCH 16/36] =?UTF-8?q?feat:=20=E6=8F=90=E5=8D=87PHP=E5=88=B07.0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Service/Setting.php | 4 +++- wp-china-yes.php | 2 +- 2 files changed, 4 insertions(+), 2 deletions(-) diff --git a/Service/Setting.php b/Service/Setting.php index 504b598..80d7fc7 100644 --- a/Service/Setting.php +++ b/Service/Setting.php @@ -498,7 +498,9 @@ HTML, public function admin_menu() { // 自定义名称 add_filter( 'all_plugins', function ( $plugins ) { - $plugins['wp-china-yes/wp-china-yes.php']['Name'] = $this->settings['custom_name']; + if ( isset( $plugins['wp-china-yes/wp-china-yes.php'] ) ) { + $plugins['wp-china-yes/wp-china-yes.php']['Name'] = $this->settings['custom_name']; + } return $plugins; } ); diff --git a/wp-china-yes.php b/wp-china-yes.php index 0d93e57..278cb81 100644 --- a/wp-china-yes.php +++ b/wp-china-yes.php @@ -11,7 +11,7 @@ * Network: True * Requires at least: 4.9 * Tested up to: 9.9.9 - * Requires PHP: 5.6.0 + * Requires PHP: 7.0.0 * License URI: http://www.gnu.org/licenses/gpl-3.0.html */ From 7121b4b7ef91b645ac5046427596a2ea5855c60e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E8=80=97=E5=AD=90?= Date: Tue, 19 Nov 2024 17:47:44 +0800 Subject: [PATCH 17/36] =?UTF-8?q?feat:=20=E6=80=A7=E8=83=BD=E4=BC=98?= =?UTF-8?q?=E5=8C=96?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Plugin.php | 20 +++++--- Service/Base.php | 14 ++---- Service/Monitor.php | 56 ++++++++++++----------- Service/Super.php | 10 ++-- composer.lock | 14 +++--- framework/classes/admin-options.class.php | 2 +- framework/functions/actions.php | 2 +- wp-china-yes.php | 2 +- 8 files changed, 63 insertions(+), 57 deletions(-) diff --git a/Plugin.php b/Plugin.php index 3d74313..4723162 100644 --- a/Plugin.php +++ b/Plugin.php @@ -5,7 +5,6 @@ namespace WenPai\ChinaYes; defined( 'ABSPATH' ) || exit; use WenPai\ChinaYes\Service\Base; -use WenPai\ChinaYes\Service\Setting; class Plugin { @@ -14,8 +13,9 @@ class Plugin { */ public function __construct() { new Base(); - new Setting(); - add_action( 'plugins_loaded', [ $this, 'plugins_loaded' ] ); + if ( is_admin() ) { + add_action( 'plugins_loaded', [ $this, 'plugins_loaded' ] ); + } } /** @@ -40,6 +40,15 @@ class Plugin { public function plugins_loaded() { load_plugin_textdomain( 'wp-china-yes', false, CHINA_YES_PLUGIN_PATH . 'languages' ); add_action( 'admin_notices', [ $this, 'admin_notices' ] ); + /** + * 插件列表页中所有插件增加「参与翻译」链接 + */ + add_filter( sprintf( '%splugin_action_links', is_multisite() ? 'network_admin_' : '' ), function ( $links, $plugin = '' ) { + $links[] = '参与翻译'; + $links[] = '去广告'; + + return $links; + }, 10, 2 ); } /** @@ -47,9 +56,9 @@ class Plugin { */ public static function check() { $notices = []; - if ( version_compare( PHP_VERSION, '5.6.0', '<' ) ) { + if ( version_compare( PHP_VERSION, '7.0.0', '<' ) ) { deactivate_plugins( 'wp-china-yes/wp-china-yes.php' ); - $notices[] = '

        ' . sprintf( __( 'WP-China-Yes 插件需要 PHP 5.6.0 或更高版本,当前版本为 %s,插件已自动禁用。', + $notices[] = '

        ' . sprintf( __( 'WP-China-Yes 插件需要 PHP 7.0.0 或更高版本,当前版本为 %s,插件已自动禁用。', 'wp-china-yes' ), PHP_VERSION ) . '

        '; } @@ -70,7 +79,6 @@ class Plugin { $notices[] = '

        ' . __( '检测到不兼容的插件 Kill 429,已自动禁用!', 'wp-china-yes' ) . '

        '; - } // 代理服务器检测 if ( defined( 'WP_PROXY_HOST' ) || defined( 'WP_PROXY_PORT' ) ) { diff --git a/Service/Base.php b/Service/Base.php index 238172e..5938a15 100644 --- a/Service/Base.php +++ b/Service/Base.php @@ -12,21 +12,15 @@ defined( 'ABSPATH' ) || exit; class Base { public function __construct() { - /** - * 插件列表页中所有插件增加「参与翻译」链接 - */ - add_filter( sprintf( '%splugin_action_links', is_multisite() ? 'network_admin_' : '' ), function ( $links, $plugin = '' ) { - $links[] = '参与翻译'; - $links[] = '去广告'; - - return $links; - }, 10, 2 ); - // 加速服务 new Super(); // 监控服务 new Monitor(); // 更新服务 new Update(); + if ( is_admin() ) { + // 设置服务 + new Setting(); + } } } diff --git a/Service/Monitor.php b/Service/Monitor.php index e59aab6..73fb085 100644 --- a/Service/Monitor.php +++ b/Service/Monitor.php @@ -17,40 +17,44 @@ class Monitor { public function __construct() { $this->settings = get_settings(); + wp_clear_scheduled_hook( 'wp_china_yes_maybe_check_store' ); // TODO 下个版本移除 + wp_clear_scheduled_hook( 'wp_china_yes_maybe_check_cravatar' ); // TODO 下个版本移除 + wp_clear_scheduled_hook( 'wp_china_yes_maybe_check_admincdn' ); // TODO 下个版本移除 if ( $this->settings['monitor'] ) { - return; + // 站点网络下只在主站运行 + if ( is_main_site() ) { + add_action( 'init', [ $this, 'init' ] ); + add_action( 'wp_china_yes_monitor_hook', [ + $this, + 'run_monitor' + ] ); + } + } else { + wp_clear_scheduled_hook( 'wp_china_yes_monitor' ); } - - add_action( 'init', [ $this, 'init' ] ); - add_action( 'wp_china_yes_maybe_check_store', [ - $this, - 'maybe_check_store' - ] ); - add_action( 'wp_china_yes_maybe_check_cravatar', [ - $this, - 'maybe_check_cravatar' - ] ); - add_action( 'wp_china_yes_maybe_check_admincdn', [ - $this, - 'maybe_check_admincdn' - ] ); } /** * 初始化 */ public function init() { - // 检查应用市场可用性 - if ( ! wp_next_scheduled( 'wp_china_yes_maybe_check_store' ) && $this->settings['store'] != 'off' ) { - wp_schedule_event( time(), 'hourly', 'wp_china_yes_maybe_check_store' ); + if ( ! wp_next_scheduled( 'wp_china_yes_monitor' ) ) { + wp_schedule_event( time(), 'hourly', 'wp_china_yes_monitor_hook' ); } - // 检查初认头像可用性 - if ( ! wp_next_scheduled( 'wp_china_yes_maybe_check_cravatar' ) && $this->settings['cravatar'] != 'off' ) { - wp_schedule_event( time(), 'hourly', 'wp_china_yes_maybe_check_cravatar' ); + } + + /** + * 运行监控 + */ + public function run_monitor() { + if ( $this->settings['store'] != 'off' ) { + $this->maybe_check_store(); } - // 检查萌芽加速可用性 - if ( ! wp_next_scheduled( 'wp_china_yes_maybe_check_admincdn' ) && ! empty( $this->settings['admincdn'] ) ) { - wp_schedule_event( time(), 'hourly', 'wp_china_yes_maybe_check_admincdn' ); + if ( $this->settings['cravatar'] != 'off' ) { + $this->maybe_check_cravatar(); + } + if ( ! empty( $this->settings['admincdn'] ) ) { + $this->maybe_check_admincdn(); } } @@ -105,7 +109,7 @@ class Monitor { public function maybe_check_admincdn() { // 后台加速 if ( in_array( 'admin', $this->settings['admincdn'] ) ) { - $response = wp_remote_get( 'https://wpstatic.admincdn.com/6.4.3/wp-includes/js/wp-sanitize.min.js' ); + $response = wp_remote_get( 'https://wpstatic.admincdn.com/6.7/wp-includes/js/wp-sanitize.min.js' ); if ( is_wp_error( $response ) || wp_remote_retrieve_response_code( $response ) != 200 ) { $this->settings['admincdn'] = array_values( array_diff( $this->settings['admincdn'], [ 'admin' ] ) ); $this->update_settings(); @@ -161,7 +165,7 @@ class Monitor { if ( is_multisite() ) { update_site_option( 'wp_china_yes', $this->settings ); } else { - update_option( 'wp_china_yes', $this->settings ); + update_option( 'wp_china_yes', $this->settings, true ); } } } diff --git a/Service/Super.php b/Service/Super.php index 73c5832..c0e10d0 100644 --- a/Service/Super.php +++ b/Service/Super.php @@ -54,10 +54,10 @@ HTML; 支持论坛 | 翻译平台 - | - 文章投稿 | - 自选新闻源 + 文章投稿 + | + 自选新闻源

        HTML; diff --git a/composer.lock b/composer.lock index 6066563..55fa2ae 100644 --- a/composer.lock +++ b/composer.lock @@ -8,16 +8,16 @@ "packages": [ { "name": "yahnis-elsts/plugin-update-checker", - "version": "v5.4", + "version": "v5.5", "source": { "type": "git", "url": "https://github.com/YahnisElsts/plugin-update-checker.git", - "reference": "e8e53e6d98e37fa7c895c93417f52e3775494715" + "reference": "845d65da93bcff31649ede00d9d73b1beadbb7f0" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/YahnisElsts/plugin-update-checker/zipball/e8e53e6d98e37fa7c895c93417f52e3775494715", - "reference": "e8e53e6d98e37fa7c895c93417f52e3775494715", + "url": "https://api.github.com/repos/YahnisElsts/plugin-update-checker/zipball/845d65da93bcff31649ede00d9d73b1beadbb7f0", + "reference": "845d65da93bcff31649ede00d9d73b1beadbb7f0", "shasum": "" }, "require": { @@ -27,7 +27,7 @@ "type": "library", "autoload": { "files": [ - "load-v5p4.php" + "load-v5p5.php" ] }, "notification-url": "https://packagist.org/downloads/", @@ -52,9 +52,9 @@ ], "support": { "issues": "https://github.com/YahnisElsts/plugin-update-checker/issues", - "source": "https://github.com/YahnisElsts/plugin-update-checker/tree/v5.4" + "source": "https://github.com/YahnisElsts/plugin-update-checker/tree/v5.5" }, - "time": "2024-02-24T09:56:49+00:00" + "time": "2024-10-16T14:25:00+00:00" } ], "packages-dev": [], diff --git a/framework/classes/admin-options.class.php b/framework/classes/admin-options.class.php index 9c250aa..3a9cb9d 100644 --- a/framework/classes/admin-options.class.php +++ b/framework/classes/admin-options.class.php @@ -346,7 +346,7 @@ if ( ! class_exists( 'WP_CHINA_YES_Options' ) ) { } else if ( $this->args['database'] === 'network' ) { update_site_option( $this->unique, $data ); } else { - update_option( $this->unique, $data ); + update_option( $this->unique, $data, true ); } do_action( "wp_china_yes_{$this->unique}_saved", $data, $this ); diff --git a/framework/functions/actions.php b/framework/functions/actions.php index b18ed96..f22a70e 100644 --- a/framework/functions/actions.php +++ b/framework/functions/actions.php @@ -115,7 +115,7 @@ if ( ! function_exists( 'wp_china_yes_import_ajax' ) ) { } // Success - update_option( $unique, $data ); + update_option( $unique, $data, true ); wp_send_json_success(); diff --git a/wp-china-yes.php b/wp-china-yes.php index 278cb81..7db8452 100644 --- a/wp-china-yes.php +++ b/wp-china-yes.php @@ -4,7 +4,7 @@ * Description: 文派叶子 🍃(WP-China-Yes)是中国 WordPress 生态基础设施软件,犹如落叶新芽,生生不息。 * Author: 文派开源 * Author URI: https://wp-china-yes.com - * Version: 3.7.0 + * Version: 3.7.1 * License: GPLv3 or later * Text Domain: wp-china-yes * Domain Path: /languages From adb8efd3207ddbac5366f35a51f93d548e591322 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E8=80=97=E5=AD=90?= Date: Tue, 19 Nov 2024 18:12:56 +0800 Subject: [PATCH 18/36] =?UTF-8?q?feat:=20=E6=8F=90=E5=8D=87=E7=89=88?= =?UTF-8?q?=E6=9C=AC=E5=8F=B7?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Service/Monitor.php | 4 ++-- wp-china-yes.php | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/Service/Monitor.php b/Service/Monitor.php index 73fb085..efb8c63 100644 --- a/Service/Monitor.php +++ b/Service/Monitor.php @@ -24,7 +24,7 @@ class Monitor { // 站点网络下只在主站运行 if ( is_main_site() ) { add_action( 'init', [ $this, 'init' ] ); - add_action( 'wp_china_yes_monitor_hook', [ + add_action( 'wp_china_yes_monitor', [ $this, 'run_monitor' ] ); @@ -39,7 +39,7 @@ class Monitor { */ public function init() { if ( ! wp_next_scheduled( 'wp_china_yes_monitor' ) ) { - wp_schedule_event( time(), 'hourly', 'wp_china_yes_monitor_hook' ); + wp_schedule_event( time(), 'hourly', 'wp_china_yes_monitor' ); } } diff --git a/wp-china-yes.php b/wp-china-yes.php index 7db8452..1cdd69e 100644 --- a/wp-china-yes.php +++ b/wp-china-yes.php @@ -19,7 +19,7 @@ namespace WenPai\ChinaYes; defined( 'ABSPATH' ) || exit; -define( 'CHINA_YES_VERSION', '3.7.0' ); +define( 'CHINA_YES_VERSION', '3.7.1' ); define( 'CHINA_YES_PLUGIN_FILE', __FILE__ ); define( 'CHINA_YES_PLUGIN_URL', plugin_dir_url( CHINA_YES_PLUGIN_FILE ) ); define( 'CHINA_YES_PLUGIN_PATH', plugin_dir_path( CHINA_YES_PLUGIN_FILE ) ); From 435ffd698025356ead759a2aee4fc16c4efab0b2 Mon Sep 17 00:00:00 2001 From: devhaozi Date: Tue, 19 Nov 2024 10:19:27 +0000 Subject: [PATCH 19/36] docs: Update CHANGELOG --- CHANGELOG.md | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index 1d10811..d8c5dfa 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -2,6 +2,13 @@ All notable changes to `WP-China-Yes` will be documented in this file. +## v3.7.1 - 2024-11-19 + +1. 性能优化 +2. 修复监控无法关闭的问题 + +**Full Changelog**: https://github.com/WenPai-org/wp-china-yes/compare/v3.6.5...v3.7.1 + ## v3.6.5 - 2024-08-23 1. 优化 CLI 判断 From 25fdf04fcc342851622f8065ed46ce1a3da09a5c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E8=80=97=E5=AD=90?= Date: Sun, 8 Dec 2024 02:50:27 +0800 Subject: [PATCH 20/36] feat: check hook before clear --- Service/Monitor.php | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/Service/Monitor.php b/Service/Monitor.php index efb8c63..b2be08e 100644 --- a/Service/Monitor.php +++ b/Service/Monitor.php @@ -30,7 +30,9 @@ class Monitor { ] ); } } else { - wp_clear_scheduled_hook( 'wp_china_yes_monitor' ); + if ( wp_get_scheduled_event( 'wp_china_yes_monitor' ) ) { + wp_clear_scheduled_hook( 'wp_china_yes_monitor' ); + } } } From a500ff9b6de5953c6d48171bfcf2cc7262af91b7 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E8=80=97=E5=AD=90?= Date: Thu, 12 Dec 2024 23:58:22 +0800 Subject: [PATCH 21/36] =?UTF-8?q?feat:=20=E4=BD=BF=E7=94=A8fa5?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Service/Setting.php | 1 - 1 file changed, 1 deletion(-) diff --git a/Service/Setting.php b/Service/Setting.php index 80d7fc7..39903d9 100644 --- a/Service/Setting.php +++ b/Service/Setting.php @@ -19,7 +19,6 @@ class Setting { public function __construct() { $this->settings = get_settings(); add_filter( 'wp_china_yes_enqueue_assets', '__return_true' ); - add_filter( 'wp_china_yes_fa4', '__return_true' ); add_action( 'admin_enqueue_scripts', [ $this, 'enqueue_admin_assets' ] ); add_action( is_multisite() ? 'network_admin_menu' : 'admin_menu', [ $this, 'admin_menu' ] ); self::admin_init(); From f2a89c42daa9dd41265486e2d0c16ce3bebc734d Mon Sep 17 00:00:00 2001 From: feng Date: Sat, 21 Dec 2024 12:06:40 +0800 Subject: [PATCH 22/36] =?UTF-8?q?=E5=8D=87=E7=BA=A7=E6=96=B0=20UI=20?= =?UTF-8?q?=E5=8F=8A=E5=9F=9F=E5=90=8D=E6=9B=BF=E6=8D=A2?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 更新域名wp-china-yes.com 到 wpcy.com --- Service/Setting.php | 182 +++++++++-------- assets/css/fonts.css | 0 assets/css/setting.css | 336 ++++++++++++++++++++++++++++--- assets/images/website-banner.jpg | Bin 0 -> 29467 bytes wp-china-yes.php | 6 +- 5 files changed, 407 insertions(+), 117 deletions(-) mode change 100644 => 100755 Service/Setting.php mode change 100644 => 100755 assets/css/fonts.css mode change 100644 => 100755 assets/css/setting.css create mode 100755 assets/images/website-banner.jpg mode change 100644 => 100755 wp-china-yes.php diff --git a/Service/Setting.php b/Service/Setting.php old mode 100644 new mode 100755 index 39903d9..376bbc6 --- a/Service/Setting.php +++ b/Service/Setting.php @@ -19,6 +19,7 @@ class Setting { public function __construct() { $this->settings = get_settings(); add_filter( 'wp_china_yes_enqueue_assets', '__return_true' ); + add_filter( 'wp_china_yes_fa4', '__return_true' ); add_action( 'admin_enqueue_scripts', [ $this, 'enqueue_admin_assets' ] ); add_action( is_multisite() ? 'network_admin_menu' : 'admin_menu', [ $this, 'admin_menu' ] ); self::admin_init(); @@ -46,9 +47,23 @@ class Setting { 'database' => is_multisite() ? 'network' : '', ] ); + WP_CHINA_YES::createSection( $this->prefix, [ + 'title' => '欢迎使用', + 'icon' => 'icon icon-home-1', + 'fields' => [ + [ + 'type' => 'content', + 'content' => + <<

        原生体验

        文派叶子🍃(WP-China-Yes)是一款不可多得的 WordPress 系统底层优化和生态基础设施软件。

        网站加速

        优化加速插件多如牛毛,为何文派叶子如此与众不同?

        进一步了解 ↗

        翻译推送

        高质量翻译中文本地化翻译由文派开源官方提供,欢迎参与改进。

        本地化改进 ↗

        广告屏蔽

        呈现清爽整洁的网站后台,清除侵入式后台广告、无用信息。

        获取广告规则 ↗

        加入我们

        关注文派茶馆 WPTEA.com 公众号以及订阅我们的时事通讯即可接收独家内容、提示和更新。

        +HTML, + ] + ], + ] ); + WP_CHINA_YES::createSection( $this->prefix, [ 'title' => '加速设置', - 'icon' => 'fa fa-rocket', + 'icon' => 'icon icon-flash-1', 'fields' => [ [ 'id' => 'store', @@ -62,7 +77,7 @@ class Setting { ], 'default' => 'wenpai', 'subtitle' => '是否启用市场加速', - 'desc' => __( '官方加速源(WPMirror)直接从 .org 反代至大陆分发;文派开源(WenPai.org)中国境内自建托管仓库,同时集成文派翻译平台。可参考源站说明。', + 'desc' => __( '官方加速源(WPMirror)直接从 .org 反代至大陆分发;文派开源(WenPai.org)中国境内自建托管仓库,同时集成文派翻译平台。可参考源站说明。', 'wp-china-yes' ), ], [ @@ -74,15 +89,15 @@ class Setting { 'admin' => '后台加速', 'frontend' => '前台加速', 'googlefonts' => 'Google 字体', - 'googleajax' => 'Google 前端公共库', - 'cdnjs' => 'CDNJS 前端公共库', - 'jsdelivr' => 'jsDelivr 公共库' + 'googleajax' => 'Google 前端库', + 'cdnjs' => 'CDNJS 前端库', + 'jsdelivr' => 'jsDelivr 前端库' ], 'default' => [ 'admin' => 'admin', ], 'subtitle' => '是否启用萌芽加速', - 'desc' => __( '萌芽加速(adminCDN)将 WordPress 依赖的静态文件切换为公共资源,加快网站访问速度。您可按需启用需要加速的项目,更多细节控制和功能,请查看推荐设置。', + 'desc' => __( '萌芽加速(adminCDN)将 WordPress 依赖的静态文件切换为公共资源,加快网站访问速度。您可按需启用需要加速的项目,更多细节控制和功能,请查看推荐设置。', 'wp-china-yes' ), ], [ @@ -98,7 +113,7 @@ class Setting { ], 'default' => 'cn', 'subtitle' => '是否启用头像加速', - 'desc' => __( '初认头像(Cravatar)Gravatar 在中国的完美替代方案,您可以在 Cravatar.com 上传头像,更多选项请安装 WPAavatar 插件。可自选加速线路。', + 'desc' => __( '初认头像(Cravatar)Gravatar 在中国的完美替代方案,您可以在 Cravatar.com 上传头像,更多选项请安装 WPAavatar 插件。可自选加速线路。', 'wp-china-yes' ), ], ], @@ -106,7 +121,7 @@ class Setting { WP_CHINA_YES::createSection( $this->prefix, [ 'title' => '文风字体', - 'icon' => 'fa fa-font', + 'icon' => 'icon icon-text', 'fields' => [ [ 'id' => 'windfonts', @@ -121,7 +136,7 @@ class Setting { ], 'default' => 'off', 'subtitle' => '是否启用文风字体定制', - 'desc' => __( '文风字体(Windfonts)为您的网站增添无限活力。专为中文网页设计,旨在提升用户阅读体验和视觉享受。新手使用请先查看字体使用说明。', + 'desc' => __( '文风字体(Windfonts)为您的网站增添无限活力。专为中文网页设计,旨在提升用户阅读体验和视觉享受。新手使用请先查看字体使用说明。', 'wp-china-yes' ), ], [ @@ -226,14 +241,14 @@ class Setting { ], [ 'type' => 'content', - 'content' => '默认字体适配规则跟随插件更新,插件更新后可删除字体重新添加以获取最新适配规则', + 'content' => '默认字体适配规则跟随插件更新,插件更新后可删除字体重新添加以获取最新适配规则', ], ], ] ); WP_CHINA_YES::createSection( $this->prefix, [ 'title' => '广告屏蔽', - 'icon' => 'fa fa-ban', + 'icon' => 'icon icon-eye-slash', 'fields' => [ [ 'id' => 'adblock', @@ -246,7 +261,7 @@ class Setting { ], 'default' => 'off', 'subtitle' => '是否启用后台广告屏蔽', - 'desc' => __( '文派叶子🍃(WP-China-Yes)独家特色功能,让您拥有清爽整洁的 WordPress 后台,清除各类常用插件侵入式后台广告、通知及无用信息,拿回您的后台控制权。', + 'desc' => __( '文派叶子🍃(WP-China-Yes)独家特色功能,让您拥有清爽整洁的 WordPress 后台,清除各类常用插件侵入式后台广告、通知及无用信息,拿回您的后台控制权。', 'wp-china-yes' ), ], [ @@ -254,7 +269,7 @@ class Setting { 'type' => 'group', 'title' => '规则列表', 'subtitle' => '使用的广告屏蔽规则列表', - 'desc' => __( '支持添加多条广告屏蔽规则', + 'desc' => __( '支持添加多条广告屏蔽规则', 'wp-china-yes' ), 'button_title' => '添加规则', @@ -295,14 +310,14 @@ class Setting { ], [ 'type' => 'content', - 'content' => '默认规则跟随插件更新,插件更新后可删除规则重新添加以获取更多最新屏蔽规则,出现异常,请尝试先停用规则排查原因。', + 'content' => '默认规则跟随插件更新,插件更新后可删除规则重新添加以获取更多最新屏蔽规则,出现异常,请尝试先停用规则排查原因。', ], ], ] ); WP_CHINA_YES::createSection( $this->prefix, [ 'title' => '飞行模式', - 'icon' => 'fa fa-plane', + 'icon' => 'icon icon-airplane', 'fields' => [ [ 'id' => 'plane', @@ -315,7 +330,7 @@ class Setting { ], 'default' => 'off', 'subtitle' => '是否启用飞行模式', - 'desc' => __( '文派叶子🍃(WP-China-Yes)独家特色功能,飞行模式可以屏蔽 WordPress 主题插件中国不能访问的服务 API 请求,加速网站前后台访问。注意:部分外部请求为产品更新检测,若屏蔽请定期手动检测。', + 'desc' => __( '飞行模式可屏蔽 WordPress 插件主题在中国无法访问的 API 请求,加速网站前后台访问。注:部分外部请求为产品更新检测,若已屏蔽请定期检测。', 'wp-china-yes' ), ], [ @@ -323,7 +338,7 @@ class Setting { 'type' => 'group', 'title' => '规则列表', 'subtitle' => '飞行模式使用的 URL 屏蔽规则列表', - 'desc' => __( '支持添加多条 URL 屏蔽规则', + 'desc' => __( '支持添加多条 URL 屏蔽规则', 'wp-china-yes' ), 'button_title' => '添加规则', @@ -366,9 +381,10 @@ class Setting { ], ] ); + WP_CHINA_YES::createSection( $this->prefix, [ - 'title' => '其他设置', - 'icon' => 'fa fa-cogs', + 'title' => '节点监控', + 'icon' => 'icon icon-story', 'fields' => [ [ 'id' => 'monitor', @@ -379,64 +395,82 @@ class Setting { 'desc' => __( '脉云维护(MainCloud)支持自动监控各加速节点可用性,当节点不可用时自动切换至可用节点或关闭加速,以保证您的网站正常访问', 'wp-china-yes' ), ], - [ - 'id' => 'hide', - 'type' => 'switcher', - 'default' => false, - 'title' => '隐藏设置', - 'subtitle' => '隐藏插件设置入口', - 'desc' => __( '如果您不希望让客户知道本站启用了文派叶子🍃(WP-China-Yes)插件及服务,可开启此选项', - 'wp-china-yes' ), - ], - [ - 'id' => 'custom_name', - 'type' => 'text', - 'title' => '品牌白标', - 'subtitle' => '自定义插件显示品牌名', - 'desc' => __( '专为 WordPress 建站服务商和代理机构提供的自定义品牌 OEM 功能,输入您的品牌词启用后生效', - 'wp-china-yes' ), - 'default' => "WP-China-Yes", - ], [ 'type' => 'content', - 'content' => '启用隐藏设置前请务必的保存或收藏当前设置页面 URL,否则您将无法再次进入插件设置页面', + 'content' => '启用隐藏设置前请务必的保存或收藏当前设置页面 URL,否则您将无法再次进入插件设置页面', ], ], ] ); WP_CHINA_YES::createSection( $this->prefix, [ - 'title' => '关于插件', - 'icon' => 'fa fa-info-circle', + 'title' => '品牌白标', + 'icon' => 'icon icon-password-check', 'fields' => [ [ - 'type' => 'heading', - 'content' => '文派叶子🍃 —— 开源 WordPress 中国网站加速器。', - ], - [ - 'type' => 'submessage', - 'content' => '100% 开源代码,一起参与文派(WordPress)软件国产化进程,打造属于您自己的开源自助建站程序。', - ], - [ - 'type' => 'subheading', - 'content' => '项目简介', + 'id' => 'custom_name', + 'type' => 'text', + 'title' => '品牌白标', + 'subtitle' => '自定义插件显示品牌名', + 'desc' => __( '专为 WordPress 建站服务商和代理机构提供的自定义品牌 OEM 功能,输入您的品牌词启用后生效', + 'wp-china-yes' ), + 'default' => "WP-China-Yes", ], [ 'type' => 'content', - 'content' => '文派叶子 🍃(WP-China-Yes)是一款不可多得的 WordPress 系统底层优化和生态基础设施软件。项目起源于 2019 年,专为解决困扰了中国互联网数十年的特色问题而存在。此为文派开源(WenPai.org)的一部分。

        将您的 WordPress 接入本土生态体系,这将为您提供一个更贴近中国人使用习惯的 WordPress。', + 'content' => '启用隐藏设置前请务必的保存或收藏当前设置页面 URL,否则您将无法再次进入插件设置页面', ], + ], + ] ); + + + WP_CHINA_YES::createSection( $this->prefix, [ + 'title' => '其他设置', + 'icon' => 'icon icon-setting', + 'fields' => [ [ - 'type' => 'subheading', - 'content' => '赞助商', - ], - [ - 'type' => 'submessage', - 'content' => '特别感谢以下企业品牌对文派项目提供的资金资源,同时期待社会各界参与。', + 'id' => 'hide', + 'type' => 'switcher', + 'default' => false, + 'title' => '隐藏设置', + 'subtitle' => '隐藏插件设置入口', + 'desc' => __( '如果您不希望让客户知道本站启用了文派叶子🍃(WP-China-Yes)插件及服务,可开启此选项', + 'wp-china-yes' ), ], + ], + ] ); + + + WP_CHINA_YES::createSection( $this->prefix, [ + 'title' => '建站套件', + 'icon' => 'icon icon-mouse', + 'fields' => [ [ 'type' => 'content', 'content' => << +

        开源建站

        文派寻鹿🦌(WP Deer)建站套件是由文派科技官方提供的企业建站产品集合,代码均为 100% GPL 开源,无任何加密隐藏。

        SEO 优化技巧

        WPXYZ.com ↗

        网站政策合规

        WPICP.com ↗

        软件开发工具

        WPSDK.com ↗
        +HTML, + ] + ], + ] ); + + + + WP_CHINA_YES::createSection( $this->prefix, [ + 'title' => '关于插件', + 'icon' => 'icon icon-info-circle', + 'fields' => [ + [ + 'type' => 'content', + 'content' => + <<
        +

        项目简介

        文派(WordPress)中国本土化项目始于 2019 年,由 文派叶子🍃(WPCY) 插件开启,其前身为 WP-China-Yes。 + +

        2023 年 5 月,文派科技完成对该项目的收购,并对其进行了全面的品牌重塑。

        +

        赞助支持

        特别感谢以下企业品牌对文派项目提供的资金资源支持。早期伙伴未来有机会共享文派生态资源,期待社会各界参与。

        -HTML, - ], - [ - 'type' => 'subheading', - 'content' => '开发者 & 贡献者', - ], - [ - 'type' => 'submessage', - 'content' => '以下为对此项目提供过帮助的朋友,欢迎贡献您自己的力量。', - ], - [ - 'type' => 'content', - 'content' => - << -孙锡源 | -耗子 | -Yulinn | -赵丰 | -jialong Dong | -TigerKK | -xianyu125 | -ElliotHughes | -诗语 | -莫蒂奇 | -薇晓朵 -
        +

        开发 & 贡献者

        100% 开源代码,诚邀您一起参与文派 (WordPress) 软件国产化进程,打造属于自己的开源自助建站程序。

        HTML, ] ], ] ); + } /** diff --git a/assets/css/fonts.css b/assets/css/fonts.css old mode 100644 new mode 100755 diff --git a/assets/css/setting.css b/assets/css/setting.css old mode 100644 new mode 100755 index f72e77b..1ad5486 --- a/assets/css/setting.css +++ b/assets/css/setting.css @@ -1,26 +1,64 @@ +#wpcontent { + padding-left: 0px; +} +#wpbody-content { + padding-bottom: 0px; +} +#wpfooter { + display: none; +} + + +@media only screen and (max-width: 782px) { + .wp_china_yes-nav-normal+.wp_china_yes-content { + margin-left: 0!important; + } + .wp_china_yes-header-inner h1 { + margin-bottom: 20px; + } + .auto-fold #wpcontent { + padding-left: 0px; + } + .wp_china_yes-field-text input { + width: 100%; + } +} + +.wp-core-ui .button, .wp-core-ui .button-primary, .wp-core-ui .button-secondary { + border-radius: 1px; +} + .sponsor-logos { display: block; flex-wrap: wrap; justify-content: center; + margin: 24px 0; + grid-gap: 24px; + grid-template-columns: repeat(7, minmax(0, 1fr)); + align-items: center; } .sponsor-logos img { flex-basis: calc(20% - 10px); - max-width: 85px; - margin: 14px; + max-width: 80px; + margin: 13px; height: auto; } .contributors-name { margin-top: 0; margin-bottom: 0; - padding: 12px; + padding: 20px 0; color: #dcdcde; + display: block; + flex-wrap: wrap; + display: flex; + grid-gap: 22px; } -.contributors-name a { - line-height: 2; - padding: 0.5em; +.wp_china_yes-content { + position: relative; + background-color: #f1f1f1; } .wp_china_yes-content a { @@ -33,21 +71,67 @@ } .wp_china_yes-options { - background-color: #fff; - padding: 1%; + background-color: #ffffff; border-radius: 10px; text-transform: none; line-height: 2; - box-shadow: 0 0.375rem 1.5rem 0 rgba(141, 153, 165, 0.13); - max-width: 1100px; - margin: 2rem auto; +} + +.wp_china_yes-options { + margin-top: 0px; + margin-right: 0px; +} + +.wp_china_yes-field.wp_china_yes-field-radio, .wp_china_yes-field-checkbox, .wp_china_yes-field-group, .wp_china_yes-field-switcher, .wp_china_yes-field-text { + padding: 8%; + background-color: #ffffff; + margin: 5% 0; + border-radius: 1px; + box-shadow: 0 0 0 1px #ccd0d4, 0 1px 1px 1px rgba(0, 0, 0, .04); +} + + +.wp_china_yes-section { + margin: 50px auto; + max-width: 1000px; + background-color: #f1f1f1; +} + +.wp_china_yes-field { + position: relative; + border: 0px solid #ccd0d4; +} + +.wp_china_yes-field+.wp_china_yes-field { + border-top: 0px solid #eee; +} + +.wp_china_yes-field.wp_china_yes-field-content { + padding: 0px; } .wp_china_yes-section-title { padding: 20px 30px; background-color: #fff; border-top: 0 solid #f5f5f5; - border-bottom: 1px solid #f5f5f5; + border-bottom: 0px solid #eee; + box-shadow: 0 0 0 1px #ccd0d4, 0 1px 1px 1px rgba(0, 0, 0, .04); +} + +.wp_china_yes-section-title h3 { + font-size: 14px; + font-weight: 400; +} + +.wp_china_yes-section-title .wp_china_yes-section-icon { + margin-right: 10px; + width: 20px; + height: 24px; + line-height: 20px; + font-size: 20px; + text-align: center; + display: inline-block; + vertical-align: middle; } .wp_china_yes-field-subheading { @@ -63,14 +147,18 @@ background: #ffffff; } + .wp_china_yes-theme-light .wp_china_yes-nav-background { background-color: #ffffff; - border-right: 1px solid #f5f5f5; + border-right: 1px solid #dddddd; + flex-direction: column; + min-height: 100vh; } .wp_china_yes-theme-light .wp_china_yes-footer { border-top: 1px solid #fff; background: #ffffff; + display: none; } .wp_china_yes-field-heading { @@ -78,24 +166,71 @@ background-color: #ffffff; } +.wp_china_yes-nav-normal { + width: 205px; + padding-left: 20px; +} + +.wp_china_yes-nav { + padding: 20px; +} +.wp_china_yes-nav-background { + width: 250px; +} +.wp_china_yes-nav ul li a { + font-size: 13px; + position: relative; + display: block; + padding: 10px 15px; + margin: 5px; + text-decoration: none; + transition-property: color, background; + transition-duration: .2s; + transition-timing-function: ease; +} + +.wp_china_yes-nav .wp_china_yes-tab-icon { + margin-right: 10px; + width: 20px; + height: 24px; + line-height: 20px; + font-size: 20px; + text-align: center; + display: inline-block; + vertical-align: middle; +} + .wp_china_yes-theme-light .wp_china_yes-nav ul li a { background-color: #ffffff; } +.wp_china_yes-theme-light .wp_china_yes-nav ul li a:hover { + color: #3858e9; + background-color: #f1f1f1; +} .wp_china_yes-submessage-normal { border-color: #ffffff; background-color: #ffffff; } -.wp_china_yes-field + .wp_china_yes-field { - border-top: 1px solid #ffffff; + +.wp_china_yes-nav-normal+.wp_china_yes-content { + margin-left: 248px; +} + +.wp_china_yes-search-all .wp_china_yes-content, .wp_china_yes-show-all .wp_china_yes-content { + margin-left: 0; } .wp_china_yes-theme-light .wp_china_yes-nav-normal > ul li a { - border-bottom: 1px solid #f5f5f5; - border-right: 1px solid #f5f5f5; + border-bottom: 0px solid #f5f5f5; + border-right: 0px solid #f5f5f5; +} +.wp_china_yes-theme-light .wp_china_yes-nav ul li .wp_china_yes-active { + color: #111; + background-color: #f5f5f7; + background: #f5f5f7; } - .wp_china_yes-field-group .wp_china_yes-cloneable-header-icon { font-size: 10px; } @@ -116,28 +251,37 @@ .wp_china_yes-field-group .wp_china_yes-cloneable-title { border: 1px solid #ccd0d4; background-color: #ffffff; - border-radius: 8px; + border-radius: 1px; } .wp_china_yes-field-group .wp_china_yes-cloneable-content { - border: 0 solid #ffffff; - background-color: #ffffff; + padding: 0; + border-top: 1px solid #ffffff; +} + +.wp_china_yes-field-group .wp_china_yes-cloneable-content>.wp_china_yes-field { + padding: 15px; + margin: 20px; } .wp_china_yes-sticky .wp_china_yes-header-inner { - border-radius: 10px; - box-shadow: 0 0 10px rgba(0, 0, 0, .1); + border-bottom: 1px solid #dddddd; + background: #ffffff; +} +.wp_china_yes-sticky .wp_china_yes-header-inner { + position: fixed; + box-shadow: unset; } .wp_china_yes-warning-primary { - color: #fff !important; - border-color: #2c3338 !important; - background: #2c3338 !important; + color: #5e77ec !important; + border-color: #5e77ec !important; + background: #ffffff !important; } .wp_china_yes-warning-primary:focus, .wp_china_yes-warning-primary:hover { - border-color: #1d2327 !important; - background: #1d2327 !important; + border-color: #3858e9 !important; + background: #ffffff !important; } .wp_china_yes-field-switcher .wp_china_yes--switcher:not(.wp_china_yes--active) { @@ -148,3 +292,139 @@ margin-right: -2px; margin-bottom: -1px; } + + +@media screen and (max-width: 600px) { +.wpcy-about__grid { + grid-template-columns: 1fr!important; + } +} + + +span.wpcy-icon-inner { + line-height: 1px; + font-size: 28px; + color: #000000; +} + +span.wpcy-icon-inner-list { + line-height: 0px; + font-size: 24px; + color: #000000; +} + +.wpcy-about__grid { + margin: 24px auto; + display: grid; + grid-gap: 24px; + grid-template-columns: repeat(2, minmax(0, 1fr)); +} + +.wpcy-kit__grid { + margin: 24px auto; + display: grid; + grid-gap: 24px; + grid-template-columns: repeat(1, minmax(0, 1fr)); +} + +.column.wpcy-kit-banner { + padding: 6% 6% 3%!important; +} + +.wpcy-about__grid .column { + padding: 10%; + background-color: #ffffff; + border-radius: 1px; + box-shadow: 0 0 0 1px #ccd0d4, 0 1px 1px 1px rgba(0, 0, 0, .04); + display: flex; + flex-direction: column; + align-items: flex-start; +} +.wpcy-about__grid.columns-1 { + grid-template-columns: repeat(1, minmax(0, 1fr)); +} +.wpcy-about__grid.columns-3 { + grid-template-columns: repeat(3, minmax(0, 1fr)); +} +.wpcy-about__grid .column > svg { + width: 30px; + height: 30px; + margin-left: -3px; +} + +.wpcy-buttons { + margin-top: 4px; + margin-bottom: 32px; + display: flex; + flex-wrap: wrap; + gap: 12px; +} +.wpcy-banner img { + max-width: 100%; + width: 100%; + height: auto; + margin-top: auto; + vertical-align: middle; +} +.components-button.has-icon { + justify-content: center; + min-width: 36px; + padding: 6px; +} +.components-button.has-icon.has-text { + gap: 4px; + justify-content: start; + padding-left: 8px; + padding-right: 12px; +} + +.wpcy-about__list li a:not(:hover) { + text-decoration: none; +} +.components-button { + align-items: center; + -webkit-appearance: none; + background: none; + border: 0; + border-radius: 2px; + box-sizing: border-box; + color: var(--wp-components-color-foreground, #1e1e1e); + cursor: pointer; + display: inline-flex +; + font-family: inherit; + font-size: 13px; + font-weight: 400; + height: 36px; + margin: 0; + padding: 6px 12px; + text-decoration: none; + transition: box-shadow .1s linear; +} +.components-button.button-link { + background: none; + border: 0; + border-radius: 0; + box-shadow: none; + color: var(--wp-components-color-accent, var(--wp-admin-theme-color, #3858e9)); + height: auto; + margin: 0; + outline: none; + padding: 0; + text-align: left; + text-decoration: underline; + transition-duration: .05s; + transition-property: border, background, color; + transition-timing-function: ease-in-out; +} +.components-button.button-primary { + display: inline-flex; + padding: 6px 12px; +} + +.components-button.button-secondary { + background: #0000; + display: inline-flex; + padding: 6px 12px; +} + diff --git a/assets/images/website-banner.jpg b/assets/images/website-banner.jpg new file mode 100755 index 0000000000000000000000000000000000000000..475afd7c3cfa94a9b262deecb33615eb9419067f GIT binary patch literal 29467 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%0AaD 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 T9S5<@vmHI@;eVa*yPf$TYTP0d literal 0 HcmV?d00001 diff --git a/wp-china-yes.php b/wp-china-yes.php old mode 100644 new mode 100755 index 1cdd69e..597557f --- a/wp-china-yes.php +++ b/wp-china-yes.php @@ -3,8 +3,8 @@ * Plugin Name: WP-China-Yes * Description: 文派叶子 🍃(WP-China-Yes)是中国 WordPress 生态基础设施软件,犹如落叶新芽,生生不息。 * Author: 文派开源 - * Author URI: https://wp-china-yes.com - * Version: 3.7.1 + * Author URI: https://wpcy.com + * Version: 3.8 * License: GPLv3 or later * Text Domain: wp-china-yes * Domain Path: /languages @@ -19,7 +19,7 @@ namespace WenPai\ChinaYes; defined( 'ABSPATH' ) || exit; -define( 'CHINA_YES_VERSION', '3.7.1' ); +define( 'CHINA_YES_VERSION', '3.8' ); define( 'CHINA_YES_PLUGIN_FILE', __FILE__ ); define( 'CHINA_YES_PLUGIN_URL', plugin_dir_url( CHINA_YES_PLUGIN_FILE ) ); define( 'CHINA_YES_PLUGIN_PATH', plugin_dir_path( CHINA_YES_PLUGIN_FILE ) ); From 8c29188c1bfbcda0fc6ebd9feb9ad10c30c7f391 Mon Sep 17 00:00:00 2001 From: feng Date: Sat, 21 Dec 2024 12:25:04 +0800 Subject: [PATCH 23/36] Create iconsax-icons.php --- framework/fields/icon/iconsax-icons.php | 12 ++++++++++++ 1 file changed, 12 insertions(+) create mode 100755 framework/fields/icon/iconsax-icons.php diff --git a/framework/fields/icon/iconsax-icons.php b/framework/fields/icon/iconsax-icons.php new file mode 100755 index 0000000..1ab2438 --- /dev/null +++ b/framework/fields/icon/iconsax-icons.php @@ -0,0 +1,12 @@ + 'Iconsax font icon', + 'icons' => array( 'icon icon-24-support','icon icon-3d-cube-scan','icon icon-3d-rotate','icon icon-3d-square','icon icon-3dcube','icon icon-3square','icon icon-aave-aave','icon icon-activity','icon icon-add-circle','icon icon-add-square','icon icon-add','icon icon-additem','icon icon-airdrop','icon icon-airplane-square','icon icon-airplane','icon icon-airpod','icon icon-airpods','icon icon-alarm','icon icon-align-bottom','icon icon-align-horizontally','icon icon-align-left','icon icon-align-right','icon icon-align-vertically','icon icon-android','icon icon-ankr-ankr','icon icon-apple','icon icon-aquarius','icon icon-archive-1','icon icon-archive-2','icon icon-archive-add','icon icon-archive-book','icon icon-archive-minus','icon icon-archive-slash','icon icon-archive-tick','icon icon-archive','icon icon-arrange-circle-2','icon icon-arrange-circle','icon icon-arrange-square-2','icon icon-arrange-square','icon icon-arrow-2','icon icon-arrow-3','icon icon-arrow-bottom','icon icon-arrow-circle-down','icon icon-arrow-circle-left','icon icon-arrow-circle-right','icon icon-arrow-circle-up','icon icon-arrow-down-1','icon icon-arrow-down-2','icon icon-arrow-down','icon icon-arrow-left-1','icon icon-arrow-left-2','icon icon-arrow-left-3','icon icon-arrow-left','icon icon-arrow-right-1','icon icon-arrow-right-2','icon icon-arrow-right-3','icon icon-arrow-right-4','icon icon-arrow-right','icon icon-arrow-square-down','icon icon-arrow-square-left','icon icon-arrow-square-up','icon icon-arrow-square','icon icon-arrow-swap-horizontal','icon icon-arrow-swap','icon icon-arrow-up-1','icon icon-arrow-up-2','icon icon-arrow-up-3','icon icon-arrow-up','icon icon-arrow','icon icon-attach-circle','icon icon-attach-square','icon icon-audio-square','icon icon-augur-rep','icon icon-autobrightness','icon icon-autonio-niox','icon icon-avalanche-avax','icon icon-award','icon icon-back-square','icon icon-backward-10-seconds','icon icon-backward-15-seconds','icon icon-backward-5-seconds','icon icon-backward-item','icon icon-backward','icon icon-bag-2','icon icon-bag-cross-1','icon icon-bag-cross','icon icon-bag-happy','icon icon-bag-tick-2','icon icon-bag-tick','icon icon-bag-timer','icon icon-bag','icon icon-bank','icon icon-barcode','icon icon-battery-charging','icon icon-battery-disable','icon icon-battery-empty-1','icon icon-battery-empty','icon icon-battery-full','icon icon-battery-half','icon icon-be','icon icon-bezier','icon icon-bill','icon icon-binance-coin-bnb','icon icon-binance-usd-busd','icon icon-bitcoin-btc','icon icon-bitcoin-card','icon icon-bitcoin-convert','icon icon-bitcoin-refresh','icon icon-blend-2','icon icon-blend','icon icon-blogger','icon icon-bluetooth-2','icon icon-bluetooth-circle','icon icon-bluetooth-rectangle','icon icon-bluetooth','icon icon-blur','icon icon-book-1','icon icon-book-saved','icon icon-book-square','icon icon-book','icon icon-bookmark-2','icon icon-bookmark','icon icon-bootstrap','icon icon-box-1','icon icon-box-2','icon icon-box-add','icon icon-box-remove','icon icon-box-search','icon icon-box-tick','icon icon-box-time','icon icon-box','icon icon-briefcase','icon icon-brifecase-cross','icon icon-brifecase-tick','icon icon-brifecase-timer','icon icon-broom','icon icon-brush-1','icon icon-brush-2','icon icon-brush-3','icon icon-brush-4','icon icon-brush','icon icon-bubble','icon icon-bucket-circle','icon icon-bucket-square','icon icon-bucket','icon icon-building-3','icon icon-building-4','icon icon-building','icon icon-buildings-2','icon icon-buildings','icon icon-buliding','icon icon-bus','icon icon-buy-crypto','icon icon-cake','icon icon-calculator','icon icon-calendar-1','icon icon-calendar-2','icon icon-calendar-add','icon icon-calendar-circle','icon icon-calendar-edit','icon icon-calendar-remove','icon icon-calendar-search','icon icon-calendar-tick','icon icon-calendar','icon icon-call-add','icon icon-call-calling','icon icon-call-incoming','icon icon-call-minus','icon icon-call-outgoing','icon icon-call-received','icon icon-call-remove','icon icon-call-slash','icon icon-call','icon icon-camera-slash','icon icon-camera','icon icon-candle-2','icon icon-candle','icon icon-car','icon icon-card-add','icon icon-card-coin','icon icon-card-edit','icon icon-card-pos','icon icon-card-receive','icon icon-card-remove-1','icon icon-card-remove','icon icon-card-send','icon icon-card-slash','icon icon-card-tick-1','icon icon-card-tick','icon icon-card','icon icon-cardano-ada','icon icon-cards','icon icon-category-2','icon icon-category','icon icon-cd','icon icon-celo-celo','icon icon-celsius-cel','icon icon-chainlink-link','icon icon-chart-1','icon icon-chart-2','icon icon-chart-21','icon icon-chart-3','icon icon-chart-fail','icon icon-chart-square','icon icon-chart-success','icon icon-chart','icon icon-check','icon icon-chrome','icon icon-civic-cvc','icon icon-clipboard-close','icon icon-clipboard-export','icon icon-clipboard-import','icon icon-clipboard-text','icon icon-clipboard-tick','icon icon-clipboard','icon icon-clock-1','icon icon-clock','icon icon-close-circle','icon icon-close-square','icon icon-cloud-add','icon icon-cloud-change','icon icon-cloud-connection','icon icon-cloud-cross','icon icon-cloud-drizzle','icon icon-cloud-fog','icon icon-cloud-lightning','icon icon-cloud-minus','icon icon-cloud-notif','icon icon-cloud-plus','icon icon-cloud-remove','icon icon-cloud-snow','icon icon-cloud-sunny','icon icon-cloud','icon icon-code-1','icon icon-code-circle','icon icon-code','icon icon-coffee','icon icon-coin-1','icon icon-coin','icon icon-color-swatch','icon icon-colorfilter','icon icon-colors-square','icon icon-command-square','icon icon-command','icon icon-component','icon icon-computing','icon icon-convert-3d-cube','icon icon-convert-card','icon icon-convert','icon icon-convertshape-2','icon icon-convertshape','icon icon-copy-success','icon icon-copy','icon icon-copyright','icon icon-courthouse','icon icon-cpu-charge','icon icon-cpu-setting','icon icon-cpu','icon icon-creative-commons','icon icon-crop','icon icon-crown-1','icon icon-crown','icon icon-cup','icon icon-dai-dai','icon icon-danger','icon icon-dash-dash','icon icon-data-2','icon icon-data','icon icon-decred-dcr','icon icon-dent-dent','icon icon-designtools','icon icon-device-message','icon icon-devices-1','icon icon-devices','icon icon-diagram','icon icon-diamonds','icon icon-direct-down','icon icon-direct-inbox','icon icon-direct-left','icon icon-direct-normal','icon icon-direct-notification','icon icon-direct-right','icon icon-direct-send','icon icon-direct-up','icon icon-direct','icon icon-directbox-default','icon icon-directbox-notif','icon icon-directbox-receive','icon icon-directbox-send','icon icon-discount-circle','icon icon-discount-shape','icon icon-discover-1','icon icon-discover','icon icon-dislike','icon icon-document-1','icon icon-document-cloud','icon icon-document-code-2','icon icon-document-code','icon icon-document-copy','icon icon-document-download','icon icon-document-favorite','icon icon-document-filter','icon icon-document-forward','icon icon-document-like','icon icon-document-normal','icon icon-document-previous','icon icon-document-sketch','icon icon-document-text-1','icon icon-document-text','icon icon-document-upload','icon icon-document','icon icon-dollar-circle','icon icon-dollar-square','icon icon-dribbble','icon icon-driver-2','icon icon-driver-refresh','icon icon-driver','icon icon-driving','icon icon-dropbox','icon icon-edit-2','icon icon-edit','icon icon-educare-ekt','icon icon-electricity','icon icon-element-2','icon icon-element-3','icon icon-element-4','icon icon-element-equal','icon icon-element-plus','icon icon-emercoin-emc','icon icon-emoji-happy','icon icon-emoji-normal','icon icon-emoji-sad','icon icon-empty-wallet-add','icon icon-empty-wallet-change','icon icon-empty-wallet-remove','icon icon-empty-wallet-tick','icon icon-empty-wallet-time','icon icon-empty-wallet','icon icon-enjin-coin-enj','icon icon-eos-eos','icon icon-eraser-1','icon icon-eraser','icon icon-ethereum-classic-etc','icon icon-ethereum-eth','icon icon-export-1','icon icon-export-2','icon icon-export-3','icon icon-export','icon icon-external-drive','icon icon-eye-slash','icon icon-eye','icon icon-facebook','icon icon-fatrows','icon icon-favorite-chart','icon icon-figma-1','icon icon-figma','icon icon-filter-add','icon icon-filter-edit','icon icon-filter-remove','icon icon-filter-search','icon icon-filter-square','icon icon-filter-tick','icon icon-filter','icon icon-finger-cricle','icon icon-finger-scan','icon icon-firstline','icon icon-flag-2','icon icon-flag','icon icon-flash-1','icon icon-flash-circle-1','icon icon-flash-circle','icon icon-flash-slash','icon icon-flash','icon icon-folder-2','icon icon-folder-add','icon icon-folder-cloud','icon icon-folder-connection','icon icon-folder-cross','icon icon-folder-favorite','icon icon-folder-minus','icon icon-folder-open','icon icon-folder','icon icon-forbidden-2','icon icon-forbidden','icon icon-format-circle','icon icon-format-square','icon icon-forward-10-seconds','icon icon-forward-15-seconds','icon icon-forward-5-seconds','icon icon-forward-item','icon icon-forward-square','icon icon-forward','icon icon-frame-1','icon icon-frame-2','icon icon-frame-3','icon icon-frame-4','icon icon-frame','icon icon-framer','icon icon-ftx-token-ftt','icon icon-gallery-add','icon icon-gallery-edit','icon icon-gallery-export','icon icon-gallery-favorite','icon icon-gallery-import','icon icon-gallery-remove','icon icon-gallery-slash','icon icon-gallery-tick','icon icon-gallery','icon icon-game','icon icon-gameboy','icon icon-gas-station','icon icon-gemini-2','icon icon-gemini','icon icon-ghost','icon icon-gift','icon icon-glass-1','icon icon-glass','icon icon-global-edit','icon icon-global-refresh','icon icon-global-search','icon icon-global','icon icon-google-drive','icon icon-google-paly','icon icon-google','icon icon-gps-slash','icon icon-gps','icon icon-grammerly','icon icon-graph','icon icon-grid-1','icon icon-grid-2','icon icon-grid-3','icon icon-grid-4','icon icon-grid-5','icon icon-grid-6','icon icon-grid-7','icon icon-grid-8','icon icon-grid-9','icon icon-grid-edit','icon icon-grid-eraser','icon icon-grid-lock','icon icon-happyemoji','icon icon-harmony-one','icon icon-hashtag-1','icon icon-hashtag-down','icon icon-hashtag-up','icon icon-hashtag','icon icon-headphone','icon icon-headphones','icon icon-health','icon icon-heart-add','icon icon-heart-circle','icon icon-heart-edit','icon icon-heart-remove','icon icon-heart-search','icon icon-heart-slash','icon icon-heart-tick','icon icon-heart','icon icon-hedera-hashgraph-hbar','icon icon-hex-hex','icon icon-hierarchy-2','icon icon-hierarchy-3','icon icon-hierarchy-square-2','icon icon-hierarchy-square-3','icon icon-hierarchy-square','icon icon-hierarchy','icon icon-home-1','icon icon-home-2','icon icon-home-hashtag','icon icon-home-trend-down','icon icon-home-trend-up','icon icon-home-wifi','icon icon-home','icon icon-hospital','icon icon-house-2','icon icon-house','icon icon-html-3','icon icon-html-5','icon icon-huobi-token-ht','icon icon-icon-1','icon icon-icon-2','icon icon-icon-icx','icon icon-icon','icon icon-illustrator','icon icon-image','icon icon-import-1','icon icon-import-2','icon icon-import','icon icon-info-circle','icon icon-information','icon icon-instagram','icon icon-iost-iost','icon icon-java-script','icon icon-js','icon icon-judge','icon icon-kanban','icon icon-key-square','icon icon-key','icon icon-keyboard-open','icon icon-keyboard','icon icon-kyber-network-knc','icon icon-lamp-1','icon icon-lamp-charge','icon icon-lamp-on','icon icon-lamp-slash','icon icon-lamp','icon icon-language-circle','icon icon-language-square','icon icon-layer','icon icon-level','icon icon-lifebuoy','icon icon-like-1','icon icon-like-dislike','icon icon-like-shapes','icon icon-like-tag','icon icon-like','icon icon-Line','icon icon-link-1','icon icon-link-2','icon icon-link-21','icon icon-link-circle','icon icon-link-square','icon icon-link','icon icon-litecoinltc','icon icon-location-add','icon icon-location-cross','icon icon-location-minus','icon icon-location-slash','icon icon-location-tick','icon icon-location','icon icon-lock-1','icon icon-lock-circle','icon icon-lock-slash','icon icon-lock','icon icon-login-1','icon icon-login','icon icon-logout-1','icon icon-logout','icon icon-lovely','icon icon-magic-star','icon icon-magicpen','icon icon-main-component','icon icon-maker-mkr','icon icon-man','icon icon-map-1','icon icon-map','icon icon-mask-1','icon icon-mask-2','icon icon-mask','icon icon-math','icon icon-maximize-1','icon icon-maximize-2','icon icon-maximize-21','icon icon-maximize-3','icon icon-maximize-4','icon icon-maximize-circle','icon icon-maximize','icon icon-medal-star','icon icon-medal','icon icon-menu-1','icon icon-menu-board','icon icon-menu','icon icon-message-2','icon icon-message-add-1','icon icon-message-add','icon icon-message-circle','icon icon-message-edit','icon icon-message-favorite','icon icon-message-minus','icon icon-message-notif','icon icon-message-programming','icon icon-message-question','icon icon-message-remove','icon icon-message-search','icon icon-message-square','icon icon-message-text-1','icon icon-message-text','icon icon-message-tick','icon icon-message-time','icon icon-message','icon icon-messages-1','icon icon-messages-2','icon icon-messages-3','icon icon-messages','icon icon-messenger','icon icon-microphone-2','icon icon-microphone-slash-1','icon icon-microphone-slash','icon icon-microphone','icon icon-microscope','icon icon-milk','icon icon-mini-music-sqaure','icon icon-minus-cirlce','icon icon-minus-square','icon icon-minus','icon icon-mirror','icon icon-mirroring-screen','icon icon-mobile-programming','icon icon-mobile','icon icon-monero-xmr','icon icon-money-2','icon icon-money-3','icon icon-money-4','icon icon-money-add','icon icon-money-change','icon icon-money-forbidden','icon icon-money-recive','icon icon-money-remove','icon icon-money-send','icon icon-money-tick','icon icon-money-time','icon icon-money','icon icon-moneys','icon icon-monitor-mobbile','icon icon-monitor-recorder','icon icon-monitor','icon icon-moon','icon icon-more-2','icon icon-more-circle','icon icon-more-square','icon icon-more','icon icon-mouse-1','icon icon-mouse-circle','icon icon-mouse-square','icon icon-mouse','icon icon-music-circle','icon icon-music-dashboard','icon icon-music-filter','icon icon-music-library-2','icon icon-music-play','icon icon-music-playlist','icon icon-music-square-add','icon icon-music-square-remove','icon icon-music-square-search','icon icon-music-square','icon icon-music','icon icon-musicnote','icon icon-nebulas-nas','icon icon-nem-xem','icon icon-nexo-nexo','icon icon-next','icon icon-note-1','icon icon-note-2','icon icon-note-21','icon icon-note-add','icon icon-note-favorite','icon icon-note-remove','icon icon-note-square','icon icon-note-text','icon icon-note','icon icon-notification-1','icon icon-notification-bing','icon icon-notification-circle','icon icon-notification-favorite','icon icon-notification-status','icon icon-notification','icon icon-ocean-protocol-ocean','icon icon-okb-okb','icon icon-omega-circle','icon icon-omega-square','icon icon-ontology-ont','icon icon-paintbucket','icon icon-paperclip-2','icon icon-paperclip','icon icon-password-check','icon icon-path-2','icon icon-path-square','icon icon-path','icon icon-pause-circle','icon icon-pause','icon icon-paypal','icon icon-pen-add','icon icon-pen-close','icon icon-pen-remove','icon icon-pen-tool-2','icon icon-pen-tool','icon icon-people','icon icon-percentage-circle','icon icon-percentage-square','icon icon-personalcard','icon icon-pet','icon icon-pharagraphspacing','icon icon-photoshop','icon icon-picture-frame','icon icon-play-add','icon icon-play-circle','icon icon-play-cricle','icon icon-play-remove','icon icon-play','icon icon-polkadot-dot','icon icon-polygon-matic','icon icon-polyswarm-nct','icon icon-presention-chart','icon icon-previous','icon icon-printer-slash','icon icon-printer','icon icon-profile-2user','icon icon-profile-add','icon icon-profile-circle','icon icon-profile-delete','icon icon-profile-remove','icon icon-profile-tick','icon icon-programming-arrow','icon icon-programming-arrows','icon icon-python','icon icon-quant-qnt','icon icon-quote-down-circle','icon icon-quote-down-square','icon icon-quote-down','icon icon-quote-up-circle','icon icon-quote-up-square','icon icon-quote-up','icon icon-radar-1','icon icon-radar-2','icon icon-radar','icon icon-radio','icon icon-ram-2','icon icon-ram','icon icon-ranking-1','icon icon-ranking','icon icon-receipt-1','icon icon-receipt-2-1','icon icon-receipt-2','icon icon-receipt-add','icon icon-receipt-discount','icon icon-receipt-disscount','icon icon-receipt-edit','icon icon-receipt-item','icon icon-receipt-minus','icon icon-receipt-search','icon icon-receipt-square','icon icon-receipt-text','icon icon-receipt','icon icon-receive-square-2','icon icon-receive-square','icon icon-received','icon icon-record-circle','icon icon-record','icon icon-recovery-convert','icon icon-redo','icon icon-refresh-2','icon icon-refresh-circle','icon icon-refresh-left-square','icon icon-refresh-right-square','icon icon-refresh-square-2','icon icon-refresh','icon icon-repeat-circle','icon icon-repeat','icon icon-repeate-music','icon icon-repeate-one','icon icon-reserve','icon icon-rotate-left-1','icon icon-rotate-left','icon icon-rotate-right-1','icon icon-rotate-right','icon icon-route-square','icon icon-routing-2','icon icon-routing','icon icon-row-horizontal','icon icon-row-vertical','icon icon-ruler','icon icon-rulerandpen','icon icon-safe-home','icon icon-sagittarius','icon icon-save-2','icon icon-save-add','icon icon-save-minus','icon icon-save-remove','icon icon-scan-barcode','icon icon-scan','icon icon-scanner','icon icon-scanning','icon icon-scissor-1','icon icon-scissor','icon icon-screenmirroring','icon icon-scroll','icon icon-search-favorite-1','icon icon-search-favorite','icon icon-search-normal-1','icon icon-search-normal','icon icon-search-status-1','icon icon-search-status','icon icon-search-zoom-in-1','icon icon-search-zoom-in','icon icon-search-zoom-out-1','icon icon-search-zoom-out','icon icon-security-card','icon icon-security-safe','icon icon-security-time','icon icon-security-user','icon icon-security','icon icon-send-1','icon icon-send-2','icon icon-send-sqaure-2','icon icon-send-square','icon icon-send','icon icon-setting-2','icon icon-setting-3','icon icon-setting-4','icon icon-setting-5','icon icon-setting','icon icon-settings','icon icon-shapes-1','icon icon-shapes','icon icon-share','icon icon-shield-cross','icon icon-shield-search','icon icon-shield-slash','icon icon-shield-tick','icon icon-shield','icon icon-ship','icon icon-shop-add','icon icon-shop-remove','icon icon-shop','icon icon-shopping-bag','icon icon-shopping-cart','icon icon-shuffle','icon icon-siacoin-sc','icon icon-sidebar-bottom','icon icon-sidebar-left','icon icon-sidebar-right','icon icon-sidebar-top','icon icon-signpost','icon icon-simcard-1','icon icon-simcard-2','icon icon-simcard','icon icon-size','icon icon-slack','icon icon-slash','icon icon-slider-horizontal-1','icon icon-slider-horizontal','icon icon-slider-vertical-1','icon icon-slider-vertical','icon icon-slider','icon icon-smallcaps','icon icon-smart-car','icon icon-smart-home','icon icon-smileys','icon icon-sms-edit','icon icon-sms-notification','icon icon-sms-search','icon icon-sms-star','icon icon-sms-tracking','icon icon-sms','icon icon-snapchat','icon icon-solana-sol','icon icon-sort','icon icon-sound','icon icon-speaker','icon icon-speedometer','icon icon-spotify','icon icon-stacks-stx','icon icon-star-1','icon icon-star-slash','icon icon-star','icon icon-status-up','icon icon-status','icon icon-stellar-xlm','icon icon-sticker','icon icon-stickynote','icon icon-stop-circle','icon icon-stop','icon icon-story','icon icon-strongbox-2','icon icon-strongbox','icon icon-subtitle','icon icon-sun-1','icon icon-sun-fog','icon icon-sun','icon icon-tag-2','icon icon-tag-cross','icon icon-tag-right','icon icon-tag-user','icon icon-tag','icon icon-task-square','icon icon-task','icon icon-teacher','icon icon-tenx-pay','icon icon-tether-usdt','icon icon-text-block','icon icon-text-bold','icon icon-text-italic','icon icon-text-underline','icon icon-text','icon icon-textalign-center','icon icon-textalign-justifycenter','icon icon-textalign-justifyleft','icon icon-textalign-justifyright','icon icon-textalign-left','icon icon-textalign-right','icon icon-the-graph-grt','icon icon-theta-theta','icon icon-thorchain-rune','icon icon-tick-circle','icon icon-tick-square','icon icon-ticket-2','icon icon-ticket-discount','icon icon-ticket-expired','icon icon-ticket-star','icon icon-ticket','icon icon-timer-1','icon icon-timer-pause','icon icon-timer-start','icon icon-timer','icon icon-toggle-off-circle','icon icon-toggle-off','icon icon-toggle-on-circle','icon icon-toggle-on','icon icon-trade','icon icon-transaction-minus','icon icon-translate','icon icon-trash','icon icon-tree','icon icon-trello','icon icon-trend-down','icon icon-trend-up','icon icon-triangle-1','icon icon-triangle','icon icon-trontron-trx','icon icon-truck-fast','icon icon-truck-remove','icon icon-truck-tick','icon icon-truck-time','icon icon-truck','icon icon-trush-square','icon icon-twitch','icon icon-ui8','icon icon-undo','icon icon-unlimited','icon icon-unlock','icon icon-usd-coin-usdc','icon icon-user-add','icon icon-user-cirlce-add','icon icon-user-edit','icon icon-user-minus','icon icon-user-octagon','icon icon-user-remove','icon icon-user-search','icon icon-user-square','icon icon-user-tag','icon icon-user-tick','icon icon-user','icon icon-velas-vlx','icon icon-verify','icon icon-vibe-vibe','icon icon-video-add','icon icon-video-circle','icon icon-video-horizontal','icon icon-video-octagon','icon icon-video-play','icon icon-video-remove','icon icon-video-slash','icon icon-video-square','icon icon-video-tick','icon icon-video-time','icon icon-video-vertical','icon icon-video','icon icon-voice-cricle','icon icon-voice-square','icon icon-volume-cross','icon icon-volume-high','icon icon-volume-low-1','icon icon-volume-low','icon icon-volume-mute','icon icon-volume-slash','icon icon-volume-up','icon icon-vuesax','icon icon-wallet-1','icon icon-wallet-2','icon icon-wallet-3','icon icon-wallet-add-1','icon icon-wallet-add','icon icon-wallet-check','icon icon-wallet-minus','icon icon-wallet-money','icon icon-wallet-remove','icon icon-wallet-search','icon icon-wallet','icon icon-wanchain-wan-1','icon icon-wanchain-wan','icon icon-warning-2','icon icon-watch-status','icon icon-watch','icon icon-weight-1','icon icon-weight','icon icon-whatsapp','icon icon-wifi-square','icon icon-wifi','icon icon-wind-2','icon icon-wind','icon icon-windows','icon icon-wing-wing','icon icon-woman','icon icon-xd','icon icon-xiaomi','icon icon-xrp-xrp','icon icon-youtube','icon icon-zel-zel','icon icon-zoom' ) + ) ); + } +} From 071d022ccfc4235cfc8c350a8889d99bd4b6eba2 Mon Sep 17 00:00:00 2001 From: feng Date: Sat, 21 Dec 2024 12:33:36 +0800 Subject: [PATCH 24/36] Update readme.md --- readme.md | 11 ++--------- 1 file changed, 2 insertions(+), 9 deletions(-) diff --git a/readme.md b/readme.md index 0cd9af6..dca2c28 100644 --- a/readme.md +++ b/readme.md @@ -33,12 +33,5 @@ ## 赞助商 - - - - - - - - - + + From 33e05459654bb2ae731d1b2f8a086f24ec503255 Mon Sep 17 00:00:00 2001 From: feng Date: Sat, 21 Dec 2024 12:34:21 +0800 Subject: [PATCH 25/36] Update readme.md --- readme.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/readme.md b/readme.md index dca2c28..871eb5f 100644 --- a/readme.md +++ b/readme.md @@ -33,5 +33,5 @@ ## 赞助商 - + From 9ea04f6ac47c7692871035abd8929d22dcb01cb7 Mon Sep 17 00:00:00 2001 From: feng Date: Sat, 21 Dec 2024 12:50:20 +0800 Subject: [PATCH 26/36] =?UTF-8?q?=E6=B7=BB=E5=8A=A0=20iconsax=20=E5=9B=BE?= =?UTF-8?q?=E6=A0=87?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- framework/classes/setup.class.php | 4 ++++ 1 file changed, 4 insertions(+) mode change 100644 => 100755 framework/classes/setup.class.php diff --git a/framework/classes/setup.class.php b/framework/classes/setup.class.php old mode 100644 new mode 100755 index 4742edb..dbd55d2 --- a/framework/classes/setup.class.php +++ b/framework/classes/setup.class.php @@ -577,6 +577,10 @@ if ( ! class_exists( 'WP_CHINA_YES_Setup' ) ) { wp_enqueue_style( 'wp_china_yes-fa5-v4-shims', 'https://jsd.admincdn.com/npm/@fortawesome/fontawesome-free@5.15.4/css/v4-shims.min.css', array(), '5.15.5', 'all' ); } + // Iconsax font icon loader + wp_enqueue_style( 'wp_china_yes-iconsax', 'https://jsd.admincdn.com/npm/iconsax-font-icon@1.1.0/dist/icons.min.css', array(), '1.1.0', 'all' ); + + // Check for developer mode $min = ( self::$premium && SCRIPT_DEBUG ) ? '' : '.min'; From fdce4da05e54842dcb90247587adc26ea202961d Mon Sep 17 00:00:00 2001 From: feng Date: Sat, 21 Dec 2024 13:07:24 +0800 Subject: [PATCH 27/36] Update readme.md --- readme.md | 16 +++++++++++++--- 1 file changed, 13 insertions(+), 3 deletions(-) diff --git a/readme.md b/readme.md index 871eb5f..b7893bb 100644 --- a/readme.md +++ b/readme.md @@ -2,9 +2,12 @@ 文派叶子 🍃(WP-China-Yes)是中国 WordPress 生态基础设施软件,犹如落叶新芽,生生不息。 + + + ## 简介 -文派叶子 🍃(WP-China-Yes)是一款不可多得的 WordPress 系统底层优化和生态基础设施软件。项目起源于 2019 年,专为解决困扰了中国互联网数十年的特色问题而存在。此为文派开源(WenPai.org)的一部分。 +文派叶子 🍃(WPCY)是一款不可多得的 WordPress 系统底层优化和生态基础设施软件。项目起源于 2019 年,专为解决困扰了中国互联网数十年的特色问题而存在。此为文派开源(WenPai.org)的一部分。 ## 功能 @@ -16,6 +19,14 @@ - [x] 优化 谷歌字体 加载速度 - [x] 优化 谷歌前端库 加载速度 - [x] 优化 CDNJS 加载速度 +- [x] 优化 Jsdelivr 加载速度 +- [x] 集成 WPMirror 镜像更新源 +- [x] 集成 Windfonts 中文网页 Webfonts [文风字体](https://windfonts.com) +- [x] 集成 adminCDN 前端公共库[文风字体](https://windfonts.com) +- [x] 启用 飞行模式 可屏蔽外部 API 请求 +- [x] 启用 节点监控 可自动切换加速节点 +- [x] 启用 品牌白标 可自定义 OEM 插件品牌 + ## 安装 @@ -33,5 +44,4 @@ ## 赞助商 - - + From 7e08f3392336d5cd01c26a3af15627bc040d6657 Mon Sep 17 00:00:00 2001 From: feng Date: Sat, 21 Dec 2024 13:10:25 +0800 Subject: [PATCH 28/36] Update readme.md --- readme.md | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/readme.md b/readme.md index b7893bb..1fe546b 100644 --- a/readme.md +++ b/readme.md @@ -1,12 +1,13 @@ # WP-China-Yes +开源 WordPress 中国网站加速器。 + 文派叶子 🍃(WP-China-Yes)是中国 WordPress 生态基础设施软件,犹如落叶新芽,生生不息。 ## 简介 - 文派叶子 🍃(WPCY)是一款不可多得的 WordPress 系统底层优化和生态基础设施软件。项目起源于 2019 年,专为解决困扰了中国互联网数十年的特色问题而存在。此为文派开源(WenPai.org)的一部分。 ## 功能 @@ -22,7 +23,7 @@ - [x] 优化 Jsdelivr 加载速度 - [x] 集成 WPMirror 镜像更新源 - [x] 集成 Windfonts 中文网页 Webfonts [文风字体](https://windfonts.com) -- [x] 集成 adminCDN 前端公共库[文风字体](https://windfonts.com) +- [x] 集成 adminCDN 前端公共库[萌芽加速](https://admincdn.com) - [x] 启用 飞行模式 可屏蔽外部 API 请求 - [x] 启用 节点监控 可自动切换加速节点 - [x] 启用 品牌白标 可自定义 OEM 插件品牌 From 8d3a71414d1fc4a8c5983a8fa29ab66539a4a5c2 Mon Sep 17 00:00:00 2001 From: feng Date: Sat, 21 Dec 2024 13:11:29 +0800 Subject: [PATCH 29/36] Update readme.md --- readme.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/readme.md b/readme.md index 1fe546b..fd4c790 100644 --- a/readme.md +++ b/readme.md @@ -16,14 +16,14 @@ - [x] 优化 WordPress 后台加载速度 - [x] 优化 WordPress 前台加载速度 - [x] 移除后台无用请求与组件 -- [x] 替换 Gravatar 头像为[初认头像](https://cravatar.com/) +- [x] 替换 Gravatar 头像为 Cravatar [初认头像](https://cravatar.com/) - [x] 优化 谷歌字体 加载速度 - [x] 优化 谷歌前端库 加载速度 - [x] 优化 CDNJS 加载速度 - [x] 优化 Jsdelivr 加载速度 - [x] 集成 WPMirror 镜像更新源 - [x] 集成 Windfonts 中文网页 Webfonts [文风字体](https://windfonts.com) -- [x] 集成 adminCDN 前端公共库[萌芽加速](https://admincdn.com) +- [x] 集成 adminCDN 前端公共库 [萌芽加速](https://admincdn.com) - [x] 启用 飞行模式 可屏蔽外部 API 请求 - [x] 启用 节点监控 可自动切换加速节点 - [x] 启用 品牌白标 可自定义 OEM 插件品牌 From 5370b07c366d813543337907c58c1673495ac286 Mon Sep 17 00:00:00 2001 From: feng Date: Thu, 2 Jan 2025 10:36:40 +0800 Subject: [PATCH 30/36] =?UTF-8?q?=E5=8D=87=E7=BA=A7=E8=87=B3=203.8=20?= =?UTF-8?q?=E7=89=88=E6=9C=AC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Plugin.php | 2 +- Service/Base.php | 6 +- Service/Memory.php | 254 ++++ Service/Monitor.php | 344 +++-- Service/Setting.php | 138 +- Service/Super.php | 59 +- Service/Update.php | 0 assets/css/setting.css | 3 + assets/images/qr-banner.jpg | Bin 0 -> 48213 bytes assets/images/website-banner.jpg | Bin 29467 -> 48110 bytes framework/assets/css/style-rtl.min.css | 0 framework/assets/css/style.min.css | 0 framework/assets/images/checkerboard.png | Bin framework/assets/images/wp-logo.svg | 0 framework/assets/images/wp-plugin-logo.svg | 0 framework/assets/js/main.min.js | 0 framework/assets/js/plugins.min.js | 0 framework/classes/abstract.class.php | 0 framework/classes/admin-options.class.php | 0 framework/classes/fields.class.php | 0 framework/fields/accordion/accordion.php | 0 framework/fields/background/background.php | 0 framework/fields/backup/backup.php | 0 framework/fields/border/border.php | 0 framework/fields/button_set/button_set.php | 0 framework/fields/callback/callback.php | 0 framework/fields/checkbox/checkbox.php | 0 framework/fields/code_editor/code_editor.php | 0 framework/fields/color/color.php | 0 framework/fields/color_group/color_group.php | 0 framework/fields/content/content.php | 0 framework/fields/date/date.php | 0 framework/fields/datetime/datetime.php | 0 framework/fields/dimensions/dimensions.php | 0 framework/fields/fieldset/fieldset.php | 0 framework/fields/gallery/gallery.php | 0 framework/fields/group/group.php | 0 framework/fields/heading/heading.php | 0 framework/fields/icon/fa4-icons.php | 0 framework/fields/icon/fa5-icons.php | 0 framework/fields/icon/icon.php | 0 .../fields/image_select/image_select.php | 0 framework/fields/index.php | 0 framework/fields/link/link.php | 0 framework/fields/link_color/link_color.php | 0 framework/fields/map/map.php | 0 framework/fields/media/media.php | 0 framework/fields/notice/notice.php | 0 framework/fields/number/number.php | 0 framework/fields/palette/palette.php | 0 framework/fields/radio/radio.php | 0 framework/fields/repeater/repeater.php | 0 framework/fields/select/select.php | 0 framework/fields/slider/slider.php | 0 framework/fields/sortable/sortable.php | 0 framework/fields/sorter/sorter.php | 0 framework/fields/spacing/spacing.php | 0 framework/fields/spinner/spinner.php | 0 framework/fields/subheading/subheading.php | 0 framework/fields/submessage/submessage.php | 0 framework/fields/switcher/switcher.php | 0 framework/fields/tabbed/tabbed.php | 0 framework/fields/text/text.php | 0 framework/fields/textarea/textarea.php | 0 framework/fields/typography/google-fonts.php | 0 framework/fields/typography/typography.php | 0 framework/fields/upload/upload.php | 0 framework/fields/wp_editor/wp_editor.php | 0 framework/functions/actions.php | 0 framework/functions/customize.php | 0 framework/functions/helpers.php | 0 framework/functions/sanitize.php | 0 framework/functions/validate.php | 0 framework/functions/walker.php | 0 framework/index.php | 0 framework/languages/zh_CN.mo | Bin framework/languages/zh_CN.po | 1344 ++++++++--------- helpers.php | 1 + 78 files changed, 1261 insertions(+), 890 deletions(-) mode change 100644 => 100755 Plugin.php mode change 100644 => 100755 Service/Base.php create mode 100755 Service/Memory.php mode change 100644 => 100755 Service/Monitor.php mode change 100644 => 100755 Service/Super.php mode change 100644 => 100755 Service/Update.php create mode 100755 assets/images/qr-banner.jpg mode change 100644 => 100755 framework/assets/css/style-rtl.min.css mode change 100644 => 100755 framework/assets/css/style.min.css mode change 100644 => 100755 framework/assets/images/checkerboard.png mode change 100644 => 100755 framework/assets/images/wp-logo.svg mode change 100644 => 100755 framework/assets/images/wp-plugin-logo.svg mode change 100644 => 100755 framework/assets/js/main.min.js mode change 100644 => 100755 framework/assets/js/plugins.min.js mode change 100644 => 100755 framework/classes/abstract.class.php mode change 100644 => 100755 framework/classes/admin-options.class.php mode change 100644 => 100755 framework/classes/fields.class.php mode change 100644 => 100755 framework/fields/accordion/accordion.php mode change 100644 => 100755 framework/fields/background/background.php mode change 100644 => 100755 framework/fields/backup/backup.php mode change 100644 => 100755 framework/fields/border/border.php mode change 100644 => 100755 framework/fields/button_set/button_set.php mode change 100644 => 100755 framework/fields/callback/callback.php mode change 100644 => 100755 framework/fields/checkbox/checkbox.php mode change 100644 => 100755 framework/fields/code_editor/code_editor.php mode change 100644 => 100755 framework/fields/color/color.php mode change 100644 => 100755 framework/fields/color_group/color_group.php mode change 100644 => 100755 framework/fields/content/content.php mode change 100644 => 100755 framework/fields/date/date.php mode change 100644 => 100755 framework/fields/datetime/datetime.php mode change 100644 => 100755 framework/fields/dimensions/dimensions.php mode change 100644 => 100755 framework/fields/fieldset/fieldset.php mode change 100644 => 100755 framework/fields/gallery/gallery.php mode change 100644 => 100755 framework/fields/group/group.php mode change 100644 => 100755 framework/fields/heading/heading.php mode change 100644 => 100755 framework/fields/icon/fa4-icons.php mode change 100644 => 100755 framework/fields/icon/fa5-icons.php mode change 100644 => 100755 framework/fields/icon/icon.php mode change 100644 => 100755 framework/fields/image_select/image_select.php mode change 100644 => 100755 framework/fields/index.php mode change 100644 => 100755 framework/fields/link/link.php mode change 100644 => 100755 framework/fields/link_color/link_color.php mode change 100644 => 100755 framework/fields/map/map.php mode change 100644 => 100755 framework/fields/media/media.php mode change 100644 => 100755 framework/fields/notice/notice.php mode change 100644 => 100755 framework/fields/number/number.php mode change 100644 => 100755 framework/fields/palette/palette.php mode change 100644 => 100755 framework/fields/radio/radio.php mode change 100644 => 100755 framework/fields/repeater/repeater.php mode change 100644 => 100755 framework/fields/select/select.php mode change 100644 => 100755 framework/fields/slider/slider.php mode change 100644 => 100755 framework/fields/sortable/sortable.php mode change 100644 => 100755 framework/fields/sorter/sorter.php mode change 100644 => 100755 framework/fields/spacing/spacing.php mode change 100644 => 100755 framework/fields/spinner/spinner.php mode change 100644 => 100755 framework/fields/subheading/subheading.php mode change 100644 => 100755 framework/fields/submessage/submessage.php mode change 100644 => 100755 framework/fields/switcher/switcher.php mode change 100644 => 100755 framework/fields/tabbed/tabbed.php mode change 100644 => 100755 framework/fields/text/text.php mode change 100644 => 100755 framework/fields/textarea/textarea.php mode change 100644 => 100755 framework/fields/typography/google-fonts.php mode change 100644 => 100755 framework/fields/typography/typography.php mode change 100644 => 100755 framework/fields/upload/upload.php mode change 100644 => 100755 framework/fields/wp_editor/wp_editor.php mode change 100644 => 100755 framework/functions/actions.php mode change 100644 => 100755 framework/functions/customize.php mode change 100644 => 100755 framework/functions/helpers.php mode change 100644 => 100755 framework/functions/sanitize.php mode change 100644 => 100755 framework/functions/validate.php mode change 100644 => 100755 framework/functions/walker.php mode change 100644 => 100755 framework/index.php mode change 100644 => 100755 framework/languages/zh_CN.mo mode change 100644 => 100755 framework/languages/zh_CN.po mode change 100644 => 100755 helpers.php diff --git a/Plugin.php b/Plugin.php old mode 100644 new mode 100755 index 4723162..c7801a3 --- a/Plugin.php +++ b/Plugin.php @@ -45,7 +45,7 @@ class Plugin { */ add_filter( sprintf( '%splugin_action_links', is_multisite() ? 'network_admin_' : '' ), function ( $links, $plugin = '' ) { $links[] = '参与翻译'; - $links[] = '去广告'; + $links[] = '去广告'; return $links; }, 10, 2 ); diff --git a/Service/Base.php b/Service/Base.php old mode 100644 new mode 100755 index 5938a15..4da50cc --- a/Service/Base.php +++ b/Service/Base.php @@ -16,11 +16,13 @@ class Base { new Super(); // 监控服务 new Monitor(); + // 内存服务 + new Memory(); // 更新服务 new Update(); if ( is_admin() ) { - // 设置服务 - new Setting(); + // 设置服务 + new Setting(); } } } diff --git a/Service/Memory.php b/Service/Memory.php new file mode 100755 index 0000000..23a1115 --- /dev/null +++ b/Service/Memory.php @@ -0,0 +1,254 @@ +' . __('WP_DEBUG', 'wp-china-yes') . ''; + } + return '' . __('WP_DEBUG', 'wp-china-yes') . ''; + } + + /** + * 获取 CPU 使用率 + */ + private function get_cpu_usage() { + if (function_exists('sys_getloadavg') && is_callable('sys_getloadavg')) { + $load = sys_getloadavg(); + return round($load[0] * 100 / 4, 2); // 假设是4核CPU + } + return false; + } + + /** + * 获取 MySQL 版本 + */ + private function get_mysql_version() { + global $wpdb; + return $wpdb->get_var("SELECT VERSION()"); + } + + /** + * 检查 PHP 内存限制 + */ + public function check_memory_limit() { + $this->memory['limit'] = (int) ini_get('memory_limit'); + } + + /** + * 检查内存使用情况 + */ + private function check_memory_usage() { + $this->memory['usage'] = function_exists('memory_get_peak_usage') + ? round(memory_get_peak_usage(true) / 1024 / 1024, 2) + : 0; + + if (!empty($this->memory['usage']) && !empty($this->memory['limit'])) { + $this->memory['percent'] = round($this->memory['usage'] / $this->memory['limit'] * 100, 0); + $this->memory['color'] = $this->get_memory_color($this->memory['percent']); + } + } + + /** + * 获取内存使用率的颜色 + */ + private function get_memory_color($percent) { + if ($percent > 90) { + return 'font-weight:bold;color:red'; + } elseif ($percent > 75) { + return 'font-weight:bold;color:#E66F00'; + } + return 'font-weight:normal;'; + } + + /** + * 格式化 WordPress 内存限制 + */ + private function format_wp_limit($size) { + $unit = strtoupper(substr($size, -1)); + $value = (int) substr($size, 0, -1); + + switch ($unit) { + case 'P': $value *= 1024; + case 'T': $value *= 1024; + case 'G': $value *= 1024; + case 'M': $value *= 1024; + case 'K': $value *= 1024; + } + return $value; + } + + /** + * 获取 WordPress 内存限制 + */ + private function check_wp_limit() { + $memory = $this->format_wp_limit(WP_MEMORY_LIMIT); + return $memory ? size_format($memory) : __('N/A', 'wp-china-yes'); + } + + /** + * 添加信息到管理界面页脚 + */ +public function add_footer($content) { + $settings = get_settings(); + // 确保 memory_display 是数组,如果不是则使用空数组 + $display_options = is_array($settings['memory_display'] ?? []) ? $settings['memory_display'] : []; + + // 如果 memory 设置未启用,直接返回原始内容 + if (empty($settings['memory'])) { + return $content; + } + + $this->check_memory_usage(); + $this->server_ip_address = $_SERVER['SERVER_ADDR'] ?? ($_SERVER['LOCAL_ADDR'] ?? ''); + $this->os_info = $this->get_os_info(); + + $footer_parts = []; + + // 内存使用量 + if (in_array('memory_usage', $display_options)) { + $footer_parts[] = sprintf('%s: %s %s %s MB (%s%%)', + __('Memory', 'wp-china-yes'), + $this->memory['usage'], + __('of', 'wp-china-yes'), + $this->memory['limit'], + $this->memory['color'], + $this->memory['percent'] + ); + } + + // WP内存限制 + if (in_array('wp_limit', $display_options)) { + $footer_parts[] = sprintf('%s: %s', + __('WP LIMIT', 'wp-china-yes'), + $this->check_wp_limit() + ); + } + + // 服务器IP和主机名 + if (in_array('server_ip', $display_options)) { + $hostname_part = in_array('hostname', $display_options) ? " (" . gethostname() . ")" : ""; + $footer_parts[] = sprintf('IP: %s%s', + $this->server_ip_address, + $hostname_part + ); + } + + // 操作系统信息 + if (in_array('os_info', $display_options)) { + $footer_parts[] = sprintf('OS: %s', $this->os_info); + } + + // PHP信息 + if (in_array('php_info', $display_options)) { + $footer_parts[] = sprintf('PHP: %s @%sBitOS', + PHP_VERSION, + PHP_INT_SIZE * 8 + ); + } + + // Debug状态 + if (in_array('debug_status', $display_options)) { + $footer_parts[] = $this->get_debug_status(); + } + + // CPU使用率 + if (in_array('cpu_usage', $display_options)) { + $cpu_usage = $this->get_cpu_usage(); + if ($cpu_usage !== false) { + $footer_parts[] = sprintf('CPU: %s%%', $cpu_usage); + } + } + + // MySQL版本 + if (in_array('mysql_version', $display_options)) { + $footer_parts[] = sprintf('MySQL: %s', $this->get_mysql_version()); + } + + if (!empty($footer_parts)) { + $content .= ' | WPCY - ' . implode(' | ', $footer_parts); + } + + return $content; +} + + + /** + * 检查 PHP 版本 + */ + public function check_php_version() { + if (version_compare(PHP_VERSION, '7.0', '<')) { + deactivate_plugins(plugin_basename(CHINA_YES_PLUGIN_FILE)); + wp_die( + sprintf( + '

        %s

        %s

        ', + __('插件无法激活:PHP 版本过低', 'wp-china-yes'), + __('请升级 PHP 至 7.0 或更高版本。', 'wp-china-yes') + ), + __('PHP 版本错误', 'wp-china-yes'), + ['back_link' => true] + ); + } + } +} diff --git a/Service/Monitor.php b/Service/Monitor.php old mode 100644 new mode 100755 index b2be08e..c6d3b44 --- a/Service/Monitor.php +++ b/Service/Monitor.php @@ -1,173 +1,171 @@ -settings = get_settings(); - wp_clear_scheduled_hook( 'wp_china_yes_maybe_check_store' ); // TODO 下个版本移除 - wp_clear_scheduled_hook( 'wp_china_yes_maybe_check_cravatar' ); // TODO 下个版本移除 - wp_clear_scheduled_hook( 'wp_china_yes_maybe_check_admincdn' ); // TODO 下个版本移除 - if ( $this->settings['monitor'] ) { - // 站点网络下只在主站运行 - if ( is_main_site() ) { - add_action( 'init', [ $this, 'init' ] ); - add_action( 'wp_china_yes_monitor', [ - $this, - 'run_monitor' - ] ); - } - } else { - if ( wp_get_scheduled_event( 'wp_china_yes_monitor' ) ) { - wp_clear_scheduled_hook( 'wp_china_yes_monitor' ); - } - } - } - - /** - * 初始化 - */ - public function init() { - if ( ! wp_next_scheduled( 'wp_china_yes_monitor' ) ) { - wp_schedule_event( time(), 'hourly', 'wp_china_yes_monitor' ); - } - } - - /** - * 运行监控 - */ - public function run_monitor() { - if ( $this->settings['store'] != 'off' ) { - $this->maybe_check_store(); - } - if ( $this->settings['cravatar'] != 'off' ) { - $this->maybe_check_cravatar(); - } - if ( ! empty( $this->settings['admincdn'] ) ) { - $this->maybe_check_admincdn(); - } - } - - /** - * 检查应用市场可用性 - */ - public function maybe_check_store() { - $test_url = 'https://api.wenpai.net/china-yes/version-check'; - if ( $this->settings['store'] == 'proxy' ) { - $test_url = 'https://api.wpmirror.com/core/version-check/1.7/'; - } - $response = wp_remote_get( $test_url ); - if ( is_wp_error( $response ) || wp_remote_retrieve_response_code( $response ) != 200 ) { - if ( $this->settings['store'] == 'wenpai' ) { - $this->settings['store'] = 'proxy'; - } elseif ( $this->settings['store'] == 'proxy' ) { - $this->settings['store'] = 'off'; - } - $this->update_settings(); - } - } - - /** - * 检查初认头像可用性 - */ - public function maybe_check_cravatar() { - $test_url = 'https://cn.cravatar.com/avatar/'; - switch ( $this->settings['cravatar'] ) { - case 'global': - $test_url = 'https://en.cravatar.com/avatar/'; - break; - case 'weavatar': - $test_url = 'https://weavatar.com/avatar/'; - break; - } - $response = wp_remote_get( $test_url ); - if ( is_wp_error( $response ) || wp_remote_retrieve_response_code( $response ) != 200 ) { - if ( $this->settings['cravatar'] == 'cn' ) { - $this->settings['cravatar'] = 'global'; - } elseif ( $this->settings['cravatar'] == 'global' ) { - $this->settings['cravatar'] = 'weavatar'; - } elseif ( $this->settings['cravatar'] == 'weavatar' ) { - $this->settings['cravatar'] = 'cn'; - } - $this->update_settings(); - } - } - - /** - * 检查萌芽加速可用性 - */ - public function maybe_check_admincdn() { - // 后台加速 - if ( in_array( 'admin', $this->settings['admincdn'] ) ) { - $response = wp_remote_get( 'https://wpstatic.admincdn.com/6.7/wp-includes/js/wp-sanitize.min.js' ); - if ( is_wp_error( $response ) || wp_remote_retrieve_response_code( $response ) != 200 ) { - $this->settings['admincdn'] = array_values( array_diff( $this->settings['admincdn'], [ 'admin' ] ) ); - $this->update_settings(); - } - } - // 前台加速 - if ( in_array( 'frontend', $this->settings['admincdn'] ) ) { - $url = network_site_url( '/wp-includes/js/wp-sanitize.min.js' ); - $response = wp_remote_get( 'https://public.admincdn.com/' . $url ); - if ( is_wp_error( $response ) || wp_remote_retrieve_response_code( $response ) != 200 ) { - $this->settings['admincdn'] = array_values( array_diff( $this->settings['admincdn'], [ 'frontend' ] ) ); - $this->update_settings(); - } - } - // Google 字体 - if ( in_array( 'googlefonts', $this->settings['admincdn'] ) ) { - $response = wp_remote_get( 'https://googlefonts.admincdn.com/css?family=Roboto:400,700' ); - if ( is_wp_error( $response ) || wp_remote_retrieve_response_code( $response ) != 200 ) { - $this->settings['admincdn'] = array_values( array_diff( $this->settings['admincdn'], [ 'googlefonts' ] ) ); - $this->update_settings(); - } - } - // Google 前端公共库 - if ( in_array( 'googleajax', $this->settings['admincdn'] ) ) { - $response = wp_remote_get( 'https://googleajax.admincdn.com/ajax/libs/jquery/3.7.1/jquery.slim.min.js' ); - if ( is_wp_error( $response ) || wp_remote_retrieve_response_code( $response ) != 200 ) { - $this->settings['admincdn'] = array_values( array_diff( $this->settings['admincdn'], [ 'googleajax' ] ) ); - $this->update_settings(); - } - } - // CDNJS 前端公共库 - if ( in_array( 'cdnjs', $this->settings['admincdn'] ) ) { - $response = wp_remote_get( 'https://cdnjs.admincdn.com/jquery/3.7.1/jquery.slim.min.js' ); - if ( is_wp_error( $response ) || wp_remote_retrieve_response_code( $response ) != 200 ) { - $this->settings['admincdn'] = array_values( array_diff( $this->settings['admincdn'], [ 'cdnjs' ] ) ); - $this->update_settings(); - } - } - // jsDelivr 公共库 - if ( in_array( 'jsdelivr', $this->settings['admincdn'] ) ) { - $response = wp_remote_get( 'https://jsd.admincdn.com/npm/jquery@3.7.1/dist/jquery.slim.min.js' ); - if ( is_wp_error( $response ) || wp_remote_retrieve_response_code( $response ) != 200 ) { - $this->settings['admincdn'] = array_values( array_diff( $this->settings['admincdn'], [ 'jsdelivr' ] ) ); - $this->update_settings(); - } - } - } - - /** - * 更新设置 - */ - private function update_settings() { - if ( is_multisite() ) { - update_site_option( 'wp_china_yes', $this->settings ); - } else { - update_option( 'wp_china_yes', $this->settings, true ); - } - } -} +settings = get_settings(); + wp_clear_scheduled_hook( 'wp_china_yes_maybe_check_store' ); // TODO 下个版本移除 + wp_clear_scheduled_hook( 'wp_china_yes_maybe_check_cravatar' ); // TODO 下个版本移除 + wp_clear_scheduled_hook( 'wp_china_yes_maybe_check_admincdn' ); // TODO 下个版本移除 + if ( $this->settings['monitor'] ) { + // 站点网络下只在主站运行 + if ( is_main_site() ) { + add_action( 'init', [ $this, 'init' ] ); + add_action( 'wp_china_yes_monitor', [ + $this, + 'run_monitor' + ] ); + } + } else { + wp_clear_scheduled_hook( 'wp_china_yes_monitor' ); + } + } + + /** + * 初始化 + */ + public function init() { + if ( ! wp_next_scheduled( 'wp_china_yes_monitor' ) ) { + wp_schedule_event( time(), 'hourly', 'wp_china_yes_monitor' ); + } + } + + /** + * 运行监控 + */ + public function run_monitor() { + if ( $this->settings['store'] != 'off' ) { + $this->maybe_check_store(); + } + if ( $this->settings['cravatar'] != 'off' ) { + $this->maybe_check_cravatar(); + } + if ( ! empty( $this->settings['admincdn'] ) ) { + $this->maybe_check_admincdn(); + } + } + + /** + * 检查应用市场可用性 + */ + public function maybe_check_store() { + $test_url = 'https://api.wenpai.net/china-yes/version-check'; + if ( $this->settings['store'] == 'proxy' ) { + $test_url = 'https://api.wpmirror.com/core/version-check/1.7/'; + } + $response = wp_remote_get( $test_url ); + if ( is_wp_error( $response ) || wp_remote_retrieve_response_code( $response ) != 200 ) { + if ( $this->settings['store'] == 'wenpai' ) { + $this->settings['store'] = 'proxy'; + } elseif ( $this->settings['store'] == 'proxy' ) { + $this->settings['store'] = 'off'; + } + $this->update_settings(); + } + } + + /** + * 检查初认头像可用性 + */ + public function maybe_check_cravatar() { + $test_url = 'https://cn.cravatar.com/avatar/'; + switch ( $this->settings['cravatar'] ) { + case 'global': + $test_url = 'https://en.cravatar.com/avatar/'; + break; + case 'weavatar': + $test_url = 'https://weavatar.com/avatar/'; + break; + } + $response = wp_remote_get( $test_url ); + if ( is_wp_error( $response ) || wp_remote_retrieve_response_code( $response ) != 200 ) { + if ( $this->settings['cravatar'] == 'cn' ) { + $this->settings['cravatar'] = 'global'; + } elseif ( $this->settings['cravatar'] == 'global' ) { + $this->settings['cravatar'] = 'weavatar'; + } elseif ( $this->settings['cravatar'] == 'weavatar' ) { + $this->settings['cravatar'] = 'cn'; + } + $this->update_settings(); + } + } + + /** + * 检查萌芽加速可用性 + */ + public function maybe_check_admincdn() { + // 后台加速 + if ( in_array( 'admin', $this->settings['admincdn'] ) ) { + $response = wp_remote_get( 'https://wpstatic.admincdn.com/6.7/wp-includes/js/wp-sanitize.min.js' ); + if ( is_wp_error( $response ) || wp_remote_retrieve_response_code( $response ) != 200 ) { + $this->settings['admincdn'] = array_values( array_diff( $this->settings['admincdn'], [ 'admin' ] ) ); + $this->update_settings(); + } + } + // 前台加速 + if ( in_array( 'frontend', $this->settings['admincdn'] ) ) { + $url = network_site_url( '/wp-includes/js/wp-sanitize.min.js' ); + $response = wp_remote_get( 'https://public.admincdn.com/' . $url ); + if ( is_wp_error( $response ) || wp_remote_retrieve_response_code( $response ) != 200 ) { + $this->settings['admincdn'] = array_values( array_diff( $this->settings['admincdn'], [ 'frontend' ] ) ); + $this->update_settings(); + } + } + // Google 字体 + if ( in_array( 'googlefonts', $this->settings['admincdn'] ) ) { + $response = wp_remote_get( 'https://googlefonts.admincdn.com/css?family=Roboto:400,700' ); + if ( is_wp_error( $response ) || wp_remote_retrieve_response_code( $response ) != 200 ) { + $this->settings['admincdn'] = array_values( array_diff( $this->settings['admincdn'], [ 'googlefonts' ] ) ); + $this->update_settings(); + } + } + // Google 前端公共库 + if ( in_array( 'googleajax', $this->settings['admincdn'] ) ) { + $response = wp_remote_get( 'https://googleajax.admincdn.com/ajax/libs/jquery/3.7.1/jquery.slim.min.js' ); + if ( is_wp_error( $response ) || wp_remote_retrieve_response_code( $response ) != 200 ) { + $this->settings['admincdn'] = array_values( array_diff( $this->settings['admincdn'], [ 'googleajax' ] ) ); + $this->update_settings(); + } + } + // CDNJS 前端公共库 + if ( in_array( 'cdnjs', $this->settings['admincdn'] ) ) { + $response = wp_remote_get( 'https://cdnjs.admincdn.com/jquery/3.7.1/jquery.slim.min.js' ); + if ( is_wp_error( $response ) || wp_remote_retrieve_response_code( $response ) != 200 ) { + $this->settings['admincdn'] = array_values( array_diff( $this->settings['admincdn'], [ 'cdnjs' ] ) ); + $this->update_settings(); + } + } + // jsDelivr 公共库 + if ( in_array( 'jsdelivr', $this->settings['admincdn'] ) ) { + $response = wp_remote_get( 'https://jsd.admincdn.com/npm/jquery@3.7.1/dist/jquery.slim.min.js' ); + if ( is_wp_error( $response ) || wp_remote_retrieve_response_code( $response ) != 200 ) { + $this->settings['admincdn'] = array_values( array_diff( $this->settings['admincdn'], [ 'jsdelivr' ] ) ); + $this->update_settings(); + } + } + } + + /** + * 更新设置 + */ + private function update_settings() { + if ( is_multisite() ) { + update_site_option( 'wp_china_yes', $this->settings ); + } else { + update_option( 'wp_china_yes', $this->settings, true ); + } + } +} diff --git a/Service/Setting.php b/Service/Setting.php index 376bbc6..99b06d0 100755 --- a/Service/Setting.php +++ b/Service/Setting.php @@ -25,6 +25,19 @@ class Setting { self::admin_init(); } + +/** + * 动态获取设置页面的 URL + * + * @return string + */ +private function get_settings_page_url() { + if ( is_multisite() ) { + return network_admin_url( 'settings.php?page=wp-china-yes' ); + } + return admin_url( 'options-general.php?page=wp-china-yes' ); +} + /** * 挂载设置项 */ @@ -55,7 +68,7 @@ class Setting { 'type' => 'content', 'content' => <<

        原生体验

        文派叶子🍃(WP-China-Yes)是一款不可多得的 WordPress 系统底层优化和生态基础设施软件。

        网站加速

        优化加速插件多如牛毛,为何文派叶子如此与众不同?

        进一步了解 ↗

        翻译推送

        高质量翻译中文本地化翻译由文派开源官方提供,欢迎参与改进。

        本地化改进 ↗

        广告屏蔽

        呈现清爽整洁的网站后台,清除侵入式后台广告、无用信息。

        获取广告规则 ↗

        加入我们

        关注文派茶馆 WPTEA.com 公众号以及订阅我们的时事通讯即可接收独家内容、提示和更新。

        +

        原生体验

        文派叶子🍃(WP-China-Yes)是一款不可多得的 WordPress 系统底层优化和生态基础设施软件。

        网站加速

        优化加速插件多如牛毛,为何文派叶子如此与众不同?

        进一步了解 ↗

        翻译推送

        高质量翻译中文本地化翻译由文派开源官方提供,欢迎参与改进。

        本地化改进 ↗

        广告屏蔽

        呈现清爽整洁的网站后台,清除侵入式后台广告、无用信息。

        获取广告规则 ↗

        加入我们

        关注文派茶馆 WPTEA.com 公众号以及订阅我们的时事通讯即可接收独家内容、提示和更新。

        HTML, ] ], @@ -71,13 +84,13 @@ HTML, 'title' => __( '应用市场', 'wp-china-yes' ), 'inline' => true, 'options' => [ + 'wenpai' => '文派开源', 'proxy' => '官方镜像', - 'wenpai' => '文派开源', 'off' => '不启用' ], 'default' => 'wenpai', 'subtitle' => '是否启用市场加速', - 'desc' => __( '官方加速源(WPMirror)直接从 .org 反代至大陆分发;文派开源(WenPai.org)中国境内自建托管仓库,同时集成文派翻译平台。可参考源站说明。', + 'desc' => __( '文派开源(WenPai.org)中国境内自建托管仓库,同时集成文派翻译平台。官方加速源(WPMirror)直接从 .org 反代至大陆分发;可参考源站说明。', 'wp-china-yes' ), ], [ @@ -86,20 +99,36 @@ HTML, 'title' => __( '萌芽加速', 'wp-china-yes' ), 'inline' => true, 'options' => [ - 'admin' => '后台加速', - 'frontend' => '前台加速', 'googlefonts' => 'Google 字体', 'googleajax' => 'Google 前端库', 'cdnjs' => 'CDNJS 前端库', - 'jsdelivr' => 'jsDelivr 前端库' + 'jsdelivr' => 'jsDelivr 前端库', + 'bootstrapcdn' => 'Bootstrap 前端库' ], 'default' => [ 'admin' => 'admin', ], 'subtitle' => '是否启用萌芽加速', - 'desc' => __( '萌芽加速(adminCDN)将 WordPress 依赖的静态文件切换为公共资源,加快网站访问速度。您可按需启用需要加速的项目,更多细节控制和功能,请查看推荐设置。', + 'desc' => __( '萌芽加速(adminCDN)将 WordPress 插件依赖的静态文件切换为公共资源,解决卡顿、加载慢等问题。您可按需启用加速项目,更多细节控制和功能,请查看推荐设置。', 'wp-china-yes' ), ], + [ + 'id' => 'admincdn', + 'type' => 'checkbox', + 'title' => __( '文件加速', 'wp-china-yes' ), + 'inline' => true, + 'options' => [ + 'admin' => '后台加速', + 'frontend' => '前台加速', + ], + 'default' => [ + 'admin' => 'admin', + ], + 'subtitle' => '是否启用文件加速', + 'desc' => __( '专为 WordPress 系统内置依赖的静态资源进行加速,加快网站访问速度,如遇异常请停用对应选项。', + 'wp-china-yes' ), + ], + [ 'id' => 'cravatar', 'type' => 'radio', @@ -148,10 +177,12 @@ HTML, 'corner' => '直角括号', 'space' => '文本空格', 'punctuation' => '标点显示', + 'indent' => '段首缩进', + 'align' => '两端对齐', ], 'default' => '', 'subtitle' => '是否启用排印优化', - 'desc' => __( '排印优化可提升中文网页的视觉美感,适用于中文字体的网站。', + 'desc' => __( '文风字体排印优化可提升中文网页的视觉美感,适用于正式内容的网站。', 'wp-china-yes' ), 'dependency' => [ 'windfonts', @@ -261,7 +292,7 @@ HTML, ], 'default' => 'off', 'subtitle' => '是否启用后台广告屏蔽', - 'desc' => __( '文派叶子🍃(WP-China-Yes)独家特色功能,让您拥有清爽整洁的 WordPress 后台,清除各类常用插件侵入式后台广告、通知及无用信息,拿回您的后台控制权。', + 'desc' => __( '文派叶子🍃(WPCY)独家特色功能,让您拥有清爽整洁的 WordPress 后台,清除各类常用插件侵入式后台广告、通知及无用信息,拿回后台控制权。', 'wp-china-yes' ), ], [ @@ -360,10 +391,10 @@ HTML, ], [ 'id' => 'url', - 'type' => 'text', + 'type' => 'textarea', 'title' => __( 'URL', 'wp-china-yes' ), 'subtitle' => 'URL', - 'desc' => __( '设置需要屏蔽的 URL 关键词', + 'desc' => __( '填入需要屏蔽的 URL 链接,一行一条,注意不要串行', 'wp-china-yes' ), 'default' => '', 'placeholder' => 'example.com', @@ -382,25 +413,64 @@ HTML, ] ); - WP_CHINA_YES::createSection( $this->prefix, [ - 'title' => '节点监控', - 'icon' => 'icon icon-story', - 'fields' => [ - [ - 'id' => 'monitor', - 'type' => 'switcher', - 'default' => true, - 'title' => '节点监控', - 'subtitle' => '自动监控加速节点可用性', - 'desc' => __( '脉云维护(MainCloud)支持自动监控各加速节点可用性,当节点不可用时自动切换至可用节点或关闭加速,以保证您的网站正常访问', - 'wp-china-yes' ), - ], - [ - 'type' => 'content', - 'content' => '启用隐藏设置前请务必的保存或收藏当前设置页面 URL,否则您将无法再次进入插件设置页面', - ], - ], - ] ); +WP_CHINA_YES::createSection( $this->prefix, [ + 'title' => '脉云维护', + 'icon' => 'icon icon-story', + 'fields' => [ + [ + 'id' => 'monitor', + 'type' => 'switcher', + 'default' => true, + 'title' => '节点监控', + 'subtitle' => '自动监控加速节点可用性', + 'desc' => __( '脉云维护(MainCloud)支持自动监控各加速节点可用性,当节点不可用时自动切换至可用节点或关闭加速,以保证您的网站正常访问', + 'wp-china-yes' ), + ], + [ + 'id' => 'memory', + 'type' => 'switcher', + 'default' => true, + 'title' => '系统监控', + 'subtitle' => '自动监控站点系统运行状态', + 'desc' => __( '支持在管理后台页脚中显示系统运行状态,包括内存使用、CPU负载、MySQL版本、调试状态等信息', + 'wp-china-yes' ), + ], + [ + 'id' => 'memory_display', + 'type' => 'checkbox', + 'title' => __( '显示参数', 'wp-china-yes' ), + 'inline' => true, + 'options' => [ + 'memory_usage' => '内存使用量', + 'wp_limit' => 'WP内存限制', + 'server_ip' => '服务器IP', + 'hostname' => '主机名', + 'os_info' => '操作系统', + 'php_info' => 'PHP信息', + 'cpu_usage' => 'CPU使用率', + 'debug_status' => '调试状态', + 'mysql_version'=> 'MySQL版本' + ], + 'default' => [ + 'memory_usage', + 'wp_limit', + 'server_ip', + 'os_info', + 'php_info', + 'cpu_usage', + 'debug_status', + 'mysql_version' + ], + 'subtitle' => '选择页脚要显示的信息', + 'desc' => __( '为网站维护人员提供参考依据,无需登录服务器即可查看相关信息参数','wp-china-yes' ), + 'dependency' => ['memory', '==', 'true'], + ], + [ + 'type' => 'content', + 'content' => '启用隐藏设置前请务必的保存或收藏当前设置页面 URL,否则您将无法再次进入插件设置页面', + ], + ], +] ); WP_CHINA_YES::createSection( $this->prefix, [ 'title' => '品牌白标', @@ -448,7 +518,7 @@ HTML, 'type' => 'content', 'content' => <<

        开源建站

        文派寻鹿🦌(WP Deer)建站套件是由文派科技官方提供的企业建站产品集合,代码均为 100% GPL 开源,无任何加密隐藏。

        SEO 优化技巧

        WPXYZ.com ↗

        网站政策合规

        WPICP.com ↗

        软件开发工具

        WPSDK.com ↗
        +

        开源建站

        文派寻鹿🦌(WP Deer)建站套件是由文派科技官方提供的企业建站产品集合,代码均为 100% GPL 开源,无任何加密隐藏。

        SEO 优化技巧

        WPXYZ.com ↗

        网站政策合规

        WPICP.com ↗

        软件开发工具

        WPSDK.com ↗
        HTML, ] ], @@ -468,9 +538,7 @@ HTML,

        项目简介

        文派(WordPress)中国本土化项目始于 2019 年,由 文派叶子🍃(WPCY) 插件开启,其前身为 WP-China-Yes。

        2023 年 5 月,文派科技完成对该项目的收购,并对其进行了全面的品牌重塑。

        -

        赞助支持

        特别感谢以下企业品牌对文派项目提供的资金资源支持。早期伙伴未来有机会共享文派生态资源,期待社会各界参与。

        赞助支持

        特别感谢以下企业品牌对文派项目提供的资金资源支持。早期伙伴未来有机会共享文派生态资源,期待社会各界参与。

        开发 & 贡献者

        100% 开源代码,诚邀您一起参与文派 (WordPress) 软件国产化进程,打造属于自己的开源自助建站程序。

        +
        HTML, ] ], diff --git a/Service/Super.php b/Service/Super.php old mode 100644 new mode 100755 index c0e10d0..7f664ca --- a/Service/Super.php +++ b/Service/Super.php @@ -55,9 +55,7 @@ HTML; | 翻译平台 | - 文章投稿 - | - 自选新闻源 + 订阅推送

        '; + } ); + } + // 支持中文排版两端对齐 + if ( in_array( 'align', (array) $this->settings['windfonts_typography'] ) ) { + add_action( 'wp_head', function () { + echo ''; + } ); + } + } /** diff --git a/Service/Update.php b/Service/Update.php old mode 100644 new mode 100755 diff --git a/assets/css/setting.css b/assets/css/setting.css index 1ad5486..f69d956 100755 --- a/assets/css/setting.css +++ b/assets/css/setting.css @@ -90,6 +90,9 @@ box-shadow: 0 0 0 1px #ccd0d4, 0 1px 1px 1px rgba(0, 0, 0, .04); } +.wp_china_yes-field-checkbox .wp_china_yes--inline-list li, .wp_china_yes-field-radio .wp_china_yes--inline-list li { + margin-right: 20px; +} .wp_china_yes-section { margin: 50px auto; diff --git a/assets/images/qr-banner.jpg b/assets/images/qr-banner.jpg new file mode 100755 index 0000000000000000000000000000000000000000..4620f3bd9d344aa6435ee5041d506af5fcc9dd07 GIT binary patch literal 48213 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�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 literal 0 HcmV?d00001 diff --git a/assets/images/website-banner.jpg b/assets/images/website-banner.jpg index 475afd7c3cfa94a9b262deecb33615eb9419067f..d212bdc2696fc432f25476e8ab3c4c2de6cc5c76 100755 GIT binary patch literal 48110 zcmeFY2UL^K)-N1HK&4ygO{xl^_bMHvDJU%zArNXpN$6k!DbkD5n?3p>4I++KsXa~AM z004dc8-R0w|Dcmi0Hc;4*dqu)1~_|~tPB90%#$a$A`sq+Vq!43sDqQ2qq8X33n~`q z;4LO0DlP_4RtxlY0DCwicpRNw++Zra+s*HJdEA^-cr9d%#ErZ)on77Zf_GQ8-F&&AdDggwGi%amxDTq4AJ4wsQNJ%S*@JNbFN{NX}iAhQUC8QL^WfY}lc>W;X z(*}K=Ad041I)5~G`liDBN529B0z?C(M7?}n#3U3H6vV_O#Uv$xryM|d5DeiE2!z4; z{;WaE84mV!^G3LN!FYbv=-}w(hfv`?754XDK)sEO{;K$&4j2^rt82e;!x5&={~^Xd z<%Zu4@^%(8b%uNS`GTEK+4=q~d^&vp>xO@4-N=Qop9U&6pKnPeuT0vS|R$5-d;m>;hS$Pe49SM0Y zX$ehv1qBHSZ5?$j87XZINlkSP2@NR)4e3A2>cij&2N>A-&$iu8+y0}h`2Vu3qNcC2 z1H#Mqu9uhRpNeqX)eGSTclGk-k(3sd2f`YSxw6nY%P)fo<4(K2&?Fdwmb#eweNlJ@5OM&I2oWz}Z#ZE;O`=vL3 z)1yC=PL=c5<6jfw^yROqU)_|gXv2u zUwDm~H2=vofQI~35JqxFfEwW2tuy~G5;go5k*PXiobLyN5rF(v!EK%*qkVMOF6_&& zw0)?jz3et8x%PjR0FXRdEK)lG7|keB#%(9W5ebWhu5I6^+Mxe8;s5jF!Ritf1r?3| zEOs9_x)E;sk>cy={Qqwe6ZhAt2gWAoPUc~T|9x`ZWnXl4@MQ$=G=_L6VIKj*t;lWI z7IhkbqNVf0*C}eB7Y+2IvT+cH#2*{LY{P|_Gw05-MRYRMXZ@0zNvti>X9xB}`~O%! zLVxRrPgup$_NHu$s!@=jFzPLTZw!KyzI04togpEzfW0g{C%S ztY)-R`mmKgurmeC3R4K4_oUCz7wG)DQI#qq4_b8mZz{b2&dgV*VNJurZnO9a8otuoAu+Y6|Alw?sa<9T1gj} zHJGH&;}_U)uP~CHr0Ik0&5R1YSHC<^Jb25)66cSD(D=);@CSvaiXUe-%@@i(+iIwz zyE+C168st}tML8aNVHWZIF>XT-78Xq)AS|oSkDw$;vP+BeBpZ;qj>ipRgT=64N*AH z8BMy3yVbKD^L(<#guOtR0$7*EanFOZ+d{8c>G_2~zPQF{`|G(wPex=8zb>R|6rXqB z-8%@Hi)_FK8Poq%;VecgvPETc)w^lU!0yDNhO{3_RTW>HZn$)Q?EKl`;X0Y3DRtCM zbytpgDCqlxod zv_dgAasHriT%RhciCMXQltPW?-gNYWQ3v8tFoW+tODmRNAjM8mj@6bYK%ChZbI!@{ z(@o7)+xEOAP7#hzXG5pqh(u@kgu9DB-#SIQQ`V|@J#RoJD#H&>qVc!}BKf(5%9vN^yA9HA*C zx|$VhI2m0(4c^;Y?Dpi)xyW9#S)9s?WC6^!nP~lpjwtlr5>>5|m6C$BO}(;} z0``{$dB)_`c~(z^q+~e&2_5$Lry>;Yk8h>vmE~T4bsN<iuUZYEabi$nK{-QtW{_tYL~W3^#6WQRFC@W#t@f<-F+vNs>@bcbs#CT)M;H zq5Z(*mX<|7HC`3di*q|RZU-i=@aCm6<`h^uoRS~5s){qdUf~hB&dtsad9vb{sb;qo zjkEU~5InU3wf@hS>nn;UnEE_G%nEz{Td0_B#vp-1)>6GOBb)1;g-)`t(O&q2cO6*5 z(-LN>^Dn?1L{CRiaKz)XMktNUniu&;%D(Br!7*i!I>#AZsvbVq`|t=&GU+p=25hsI zXPJ}#H<8=2?eI!>@B5i&{}$-~Lt~Z?M;#6nRCXEcZ~nWa?s&9n!7X?K2)_OASMo>W z>JF!#P4v>ze!qIysr&iw5k=hg3!BiKpKJe(I{s*xBKoH+cUs!4#DBxW{ca___KW`; zb^HO?e^~q9t>iy^$AA6hAC<=q<-h#_D#DM=UB&@L7Uo9w0c-ptHhl5ir+6sss=hqX zyFX6w>S;cn{%EC{=tUXkh%L#Qd9#F}25tDLzxg^sve?WO$|0NpEc>PU?*}n<# ze;fGgJN^G|i0&N;QU9iChbXXGFvw`}d4v~Ci3uzv$B&#?II}JI{3n{SrLo^n@y6m^ zZvX$|5UIX0+ZKUWQfq(5Ra7&;AN+FK{ed)>(!UG9H*c!@Pi!rWth491abEtSQkkg3 zrclz#^Mt$99wBy3(6F?+%upQ#~EE@*G5nfC~;I;E;)rARHz)$|f z$bQkH+?x`u*}(JYHv#(3R*3qe)4Hn zo~1_wzjUR09g>MC-wSXeFn-aI-nEF$SbvGlEJ5%3ZX4tZstRwvwTCmHM-IYVHw(UF#bbubN8+sPMyvOj_mh!>262Yq zV#uvk6A$(*{yRt`33ZY3bUV5=K=5<3=Y)M*Pa`)u&-TDkPi>y}cbEpQ*TT@VQVo?P zph#u8NKtd*rn~ALIA<2vKr`oa;aK+9049#|n4A*PY_peb#asRDf_z?C5f1NJRjGuY z<$ok)u)>#&>yYV6MbcZ0J6M|dtFIbI>vP?7&C3K1744zbYT3e8?K%E?!mLw<{SWMw z*qNuH#YBynK~LM|*V%fT%MEbyqBtH>C`LCq7`*%)T4r=_d+Q($;<(}R(Dr@V=jn2H z$GXe{#AnAD|JPH#0TXw?i@=(^y~8arzQ-eqa;{?&OwAEXWvt!h+KPd~Si(3`Gz)j7 zefq#hbZlfTHrUG7KPNsG2RML2oG1L{3^6=3X}atz2Ct_g`YT0?tS7!sv;c18bNhL{ znunYK4yFp0w1L?VAUZv>@dVk70NQt{bD!lpit*(*)Hs-XyvekgvK6q#LH?Mb z>Df1>^>kN3xM&R|w~io%%>O$0u!GsmE2H{d*S3L2Z&i*;bNNE|bhn@PN`uOhLh%U8 z;(dWnQpPDlnmvj)D9l9$_;HN-6_9*e6?RkwBtUxPS$hQ?6_NvD284oD;?sR*8f2#f z^m@;&FfI*b%YG{gog0%&P%8FZ39y|2NnNrIQInDX6gyyJxQScltSYPodHxq*^q-tQ z^_BN+Nne>R9lZWIbC*ly_rmI74V!V1Z=kQ1QJu(MJj&E@atF^Vy}@w&rZga&CIYp) zsO^(+zt3h0*OO)z51sf4EGa5(F`+vL?27I;;z?wu&T^8Fos*Qe+h^hIs`*ryM^{CK z;Cbl@)1e-9ka_jVKAg>SDPc3a@(KVw$JxpDl?Mf^7z5I0Go!mNPPCG)77wh^3Oz1; z9Yc&A4W8!zvs3C1+S`w=hR`NFp>Jww3{0dBj4EyIZWv~8?nTP+8|T%4MJ+d6S^d0e zoLs|iQ}YJ|RgQn8tUg;ffS%iBmEYp;w!-*v7WokruijzTgV(FITx$>a%@jf35O(u5 zPqo$!9E6rF6<(Ag$Ugb39{wl-9Eoe(T&mTMewTf0;17541dhLWvNpCAd*K;l@@bY| zJoEnd1Cl4qh6p0uYM+`RDh$A_x5CvO)GOB(7;e$@o3jHmnq>pa6sjsaxW&?N?^+M} zu7uPjN|R91bEMLm--=}R58TL! zv(TFYDf=|`OUkd&(w)g?roTPXdW}yeynk++-8r*1y`9v5QT9AKgGuR;pAtGo{Pypj zWxx@&lY``x%aX5#mEA$XWgql0$a?C-g6nzy3{ksUi?ECx+{fjR?KY_zsUk7a6pm{7 zF8`(tSdZ+tfx3P3?;DL!(wm{@Y4TB%Ng+uO!^aa~p;U>W?EbudG zG1I~0^L~Y2C&ZF0H^K8v@j#Uk)unY| z-hB^-##@FiS?tTES4e>HI*>%WmYRO+&ueeEZPvZ?MsMYFb`{(!$GjJXKFzBpmeN@6 z)QH9{xRj2J+WE^gIHR0h;*&q*gECdSBhw{JIbH@ zcIC_tV&%>DS_GWM@;k86~=UM}8VZm68HgzE!^- z!}`@S%9+r`d!Ri!251z5EVL%vmY3}&a)hvZYfW(yFf>}VuBjoTU>V97v&Ao6E;znD z&wb`>p2}HZd@Ibx*YE@oud~Iej1Ru@{?rDP9B%*M6kM1_?Kg)H@zLfh@ws?73zT{8 zC_ZvZN=YJ0ru5HJs;B@e3=@oySlNDp=fHSH+k?yn%!9lAUA%(4atG-(?DldY^($Sn zm`hG8wjI*`x8cgEdf=4Q*3`8`A@?A+%Jet2cbprm!@P2ZSaCIA8W%?)Q3y5`L}RGa z(PudW-BUrf=_i2sTN@JfH48+H3NkKxD-=JD55vXT*}n~cB9fJjgT<||5o%p9R$1#P zNEevbF-I{3;)j$NbJH*50P^}Me94$mD)(FT3uyS zdfQ!};5MSzRT=QQdU*pHSDE$ndu1i*c~yE>DX*KScajmy)IdZYveU&e@)MS@#D_%I zQm$LYU423awpZedBoXg@aD!^JK~SPzH7+bjh|7gw;Tu*d2(7K`+ufeDLtYs*jj2S+ zX^@R1L?%NH7S^I+<&-)j*g)CWD^vZd7f%(fk@Kw)?%5?+%K_{@7n3z_`~;VRF!cM9 zE8)0wBs#DJ-4RPACEEt#`VHeOm`E$qA>nQqiz&U<~- zP>u8TdlNZ}Qf^z7gp$S0z0ib&=kcDk*&JcH!|ME>Bod`;R1(Hm&`c8LG0LCUd^ne* z`D~eN<-i=H?EAU}3Cft+6p*9*z2^>flE_RvHe3%X=9~M`!-YH_=SsF-J(yhA%b)FL zVVVGtNTBuN2+GcZ<#<@d`S+6wIwq0M9=;{QO2W&_9q|0=*5?p$tY**<%IP*iT?)!4 z%3wHAhqO9JOO(}d=V+^@eCGXP9`$;gT?$w%x--kKV) zeSnm$V52Z5A-+&FOg_8u17*^ddCV-I;pQT39`PnD_x`(gDWB}{tMOfD6L?sb(+Y|c z&py`mF<)MNCfatqoME1xgb&;!EU`JgLrIA1E3wHiYYc|j0T#`R`JTkj^5P%5s}rM- zePg@N=4&?`k3|g7|5z&brvEF$T%IZgrdH3ht9b%Y5auB7L2*wf2fa7}0Xx9%y;oeW4_5@hkAj#Mk4)*M)pk>>KPbof{Cq=|&3({oImfG6P!l=Y zD=qh_+X8dR5h3a7`eyml&Y7*xD%YPRPIPeNK#Exe#p74tBKe3BBzDob%YU< zs=96nBltI|O1kVv@=@8Nb)F(Q&0bDbqzYSbe05DMiP)FqiL4ms_wI&$x1L)`5D_cW z4bElo{R9iFLfKC$V7$M>Fj;9#L`}XNVFP<%d*P*ra*1!(bwpO%JoEL7aanmUx2S0< z232P-r8V?8mP0%J%bSukNkidaH(E%^nk&yp>o=w@wrQH2a%2!G4wi+^8D%nY)TFJ; z*Mc;`skeC%_C-$Nf>GU9^y%o5ea5cObFEsZW#q|p)Aqxkzs}06WUpSEC0af(aL=;b z!{UOZ=28~Mx~`=P*N}moGTGWxLS1Lr}&ix0yc!i*D$12;aJ3{;JGE?g`LV_nf7&sgR5@DXK4k(Am21dbUBo!mH3|TEL-=jj-rko1(osl{L}Fz1 z5<8}qh~}5nG#1aZrSU0B%w~JsMG-fE$!zvZD=tV>#arX(#K;~sq|RRr6jK~9sn%kv zJIl$`H`^Qmu{Q~MB7VLS%rLObcs|>b?yZ{-d1*0)g6%=0Wag1g*jV)e@L9`|xunEc zn9brm^IiFtG49(40E4Sj%8uR|zheH5&Em})Ca#XM=RC(VYqvc1(y{#XKh-5NkK(M@`__3i8l8)R1Urx|VybM%tCTAPs1eX$99 zpuL-A8QaArbwnAV`cuo^InA%uQ-@`9VXHc?$l=SoA=*kvr!Ktx{sG&9_Vsa@vM~QI zKd8<7TQ)olT)3j8g!rs7E-@|7CiV5UlFZw;Lfn=HEG0d3dT;^g&m*7sq?HQ44todO z%BdL2dYa=x7iEa?o9s7So&|ZBL?>Q=g_w5Z7Yfk^+3#fcDm~_s6~fKa&#+HYwJfAT z5IClRTD?{6Jr5WrPDpfJ7ZYb6(E2VQDPi9VXO(vu8YOv{_$g*V0PO>LX2gv(Np~hontwzNt-0 zXEiDW3_7>8Ogdabo%4w+{HpOwN6)DM|G8%gNLKvAEC1a$XJ8z4@;M}kv{ z{UrQ{?zPtG2~ur`yuM)Od_oi0BinXzc`Q96;8vJ^_p72R%aK1$Xz{%CdYravvY?(2 zbpmjy{+TZpc$rWKx%RI?=5M(9ul!@Yd0RSh=gQyz{y5C>KOHA3Ou&}Q)e}HtAdMLe z*wy0Qv_3=GxZU76C@5#pTbMA?`aE{l?Dfb>%lE7P2rKgw0N2qQ8SE$HD_;qp7}=+T z<5u#gIxrZz{F3OJgB|9a{OS2wdsUAjfk8WuxTu`KY=V!aHjnF1C4?rwS877pG`%*{ zWS};3x&PscUi-9;R1GXYp<052MN(Mq1dxsoep$DHl?mfrL2SL=f+PY9LX_{c4kY>$ zEbH`!UAf3h=*S4tyk#k{f*X#4aA1qj{!@_h3Q?ivFtmXfrH-Bh zvKNg7iu5*w4pcXI#Nt?o#mx`MA23=(wYO~*Kj4QM zduf#mhn$k#FbcRlgQjl>;bUrcyBvJ{M7-)#r)Pq4&W^AwGh*I+oaQU?Ftb}&aYgLm z3Ji#>E=C^WKlv>+kfqDBzEv%C``9Jt^* zDI)Q)UC%%!`gS6Rg)a`8`MvC{oSWuxdb|Z(|N4AYsWOd`(a({$ z){Ea5&&SntXJ~vfTFWRb@x5zTNHls`Gz(c;?eG-EpoNdy@wHW{P_$x68C>31(Y#kw zmf5xe&KD&d1i22SM7pG>Oj-4uim50Id&@ziWH?KjwN=%t~kndpJf zUqEtKpEctB4?rB6UgeuO>Y7Q1sVOfW`Y4092J^jqQvw^uNw>GoSlG+Dq)%aTMB6e< zmQV{hE-Wb8Pu4y~#?$7IpqEo62kp%(xR2v|IU#&CfzYbx9%qr701*+yL?rPXiLL#B zTflPBM+JvQx{YQ|CaZE-E zZ#cdt9dv!`YDfGhaJXzF>=3!raB*td=H^=A6*FjkHm`HMU|)*8K#WBK4f=glN^;H4 z@|XOft}FR8Fdh31HQ>_6(zM>?U0dsoaqFG2QPF4Rdk+LfDq$AiTpt9@?u_~VV(%=^ z#aFEl|JZ%MTqc^bj3u`ktA~ zwbWvvdkC1-f_h%l+0Av|!3Ug8%tn|elDQk(bXvgqZ^g?UX(w%d3HeawKURDB)Z|bz z&uTOr$Q_OR+J`?wuk!Qj!@_q31G-x~gL)Ria3-NMYy-{r72@p%Ii z1~P$`2k@QVmwO7l0-u`3zeFLi)eWg=9rBRFhDraB_V1a?G02`10O#zF_xA$Eqa=9? zn54Q1AK$f1?_+7`l-N`H+K9x#g&E?)cMY`S98Qm)>{DWqA5-k;lx4*j2(w7ADo!P%MLqoRovG*dDTieTi!&S1q12@ zdmt=7;Di;<39|5V+SOA@beEq1ECEfd!NoJaoEED*UQT+N_!b$s zDYzDnK4c&0gjJTtOZLqpy)|%-WNe-Hn={>YpSX3raOfZG%X*6J(>dMDg}kZ36nRee z5BFlFnHH$#YxbEkXr5;T7&n2%iW*v-A8x!#w03Lc{}Mv2t4l}b*&WnBnLm|T%v(SU z{3-u1Nvqm8=gA_@0+iHcC<1isAL6n*#QvC=X*;*@lSjw^%QD77tQ#q;5Z>j>hV(2y zC76dmvqLSbB|=O`Mm#sRa&dbuupe&&Aqm9^_oL)NjBaBb!@OJj7fCDJF&k zVb|gtDn`|ow_YY->bHFN8*n(ov@a;jYHw(MPnP&a8|_|tU|QLjn;(VJTf|{Zjp$QU zwrFwa=v|2Ou4&q>kk^yYinRQ8r;MSQu02*I?cq12D=wG)ZA5GOEo$X0gUpBg9j4tOt< zx&NZA?xiwJND;j&|6Nl}^pgOMDNHsBsPgEb51kP5>nxJH8=Ao`3B)R`}DGp6}X(?#k+!)MLm@MBTm_o_RmDoKqn7_3$CZb!E%xT5hWY?sVPKw86>VMcZJv`8PyN zaZs4rWBr9**+%y;g#vM9KaPWkrK8^k)4JRjj=xm zhCTFlc$VBfaZT3_7n;&eu0_sUHR)LxEzGeFW3IEK{ zeB$0}`}bK}$&JYoMXEUv>)zmu#D$K{@(_O45Du=6VPbZ~ca1Tts7`z>;ycWyPySX)drvMyq%AdG%hL}>TUQOj%P zFs%zbch1D{#$3MnlJeOFp4eY+m;Yf(|CcZ7RK@ReXVDA~3f0!${m9Kfi1|$?d3Y8p z_mQ`TBtp(k?W>MV%xU%|D%i@S7+CXy%%f#CMLCew;Z02@-dg%fmWCwLhrE|CC`rbi z)y0%}nvm=*L}H?B{d_(nqu#=~d7a6Q3)+FlBffHSvgULj1~=C56SnE+L1*a@_}aJn zyiiT634XeKuD6*Q6)SC0Q;=oaC}o=_w8y!^r1bqPc7NOcprXa~aB1Z84f=cLZSNh& zzJ*xc_D@T9CPY?@*K!?T1RBz3t{Xz@oOW;on~Me!XH6JoBRlh~qs{9wOEX?vqTwiT zZ;qu_-X(o`Gz1ngd>5Lc-y_~+cef^^zB`}DT<3ba)ZV}AZ6x6(tGYixBzgPVW6wGD zYWg3QQ0lWU>;#DG>`Qzb;o{by4IGZp4i0`^RRI@kk(yxd1UsNm&7FEv^F%UX{-|}G zjQZ4GUGX~f$Z=V4QRyr5=hJl^X-JY;Xz$aDHRwUl_*9Lam%ywFv1iF(-g?){^!n~3 zeV}ZG1Mz718RsPtIR9(pb}=HLp(|dZ|s-`TGtGeyIt(I{`zTE0m0Pq z^dy5l+P^Bd3H3fTL{JNQ7CPdPu0Y;WlqTG7?Bg?Dkz4Y4(t6T_AtB{@W_Nx1)-XzI z(h`le?2@S%x{8vjk8Dq~Jy5bE_-YW{U44f4#*0hpIZR~_yt8zOW3aql4?%~?y?4H( zx|)e|1_VA)frOHo3nOW}Hhbd(v?J?@eC27@h?HAjrGqL*0)Taa0oK+U*pj#tKnt$F zyKxxbx!0u(9G*84^Vw)vEu^fIF+0AChpmAL{snEo`2ho2#^mn%UfR#9Vqs=K(ig5x zt#R2XRwiuufkxY7+w7hl1mAdfJRb0Bsy}QzQFU5hl-L9fGE-JS9_r-Z4tyT1569%; zIWL6uxJ>z%W)~oqHeKpa5%f+15_Ub9OiX4^e0;_|j!C)K#N-*7)o=Ib*8CrAwDxoY z;f7JTYaBgwH|<~SwxyWtuZ>Gnj^HhESdP!76x>e%?J&Ww+!!*6AY zPEVR+qb+PVi|mL|pQ)Z+sIDgQ9sp zOmOLkiW~B6X((T21rE;V-!PV#xR~q%5L2b4&)R5ZVrgZCgua%6;|t!udDFB3CxEZ^ zKTmC@4CseW*IiKh^!YsY;)E)M@gys6aV6()1$6hyE0R|G!dpuPtWX?n2>&JaAS-G- zc6xZB??MJ;Q(>~=jSASOoy~Nq&;=h!XTyv5B@CM*s;g+jc&iw1`+~zF8lw<&UU+*wC@YX5P`A9t z&5R>ENd3-e0$m(cP*}j}LD{!<_$+CsD!BeQYivclY`KdixrJy{_JiwH85xZR&wq}n zZBthcb9%+~4Y@_sJ;EBQm1^Fi(-Zg*KkNz5+DKK8|jCjfmPp4jtRW(+Hh#d8-V z+sF+X_AjdEz1*B6SWm~tX?Jb&^%jXFGY8o!Z~}ic#XfY;25U6j3%S~c%vYRVCmvnp zV8EWP`n5lHc3-=)QD4{~o9oATE8y;Bke4gF{$ON68^x%soXksw8wx`b=t-1uiNc^8 zo6U`9H=_KbYdO6Fyz$Q<91l_g=O***N}0}Bv)jsWUAb;7^Wx6kPijXIb!R{0+J5Nz z`LIJ03H`~pz@f*+lWwDSlGzWvGzvt=GmhAq$CFX8Ey9MbnN~ZPK6J+zF9mR6P1ar@j zS~7tjdlLBdCM4TRyu?rQoz55IqZ-ubWX_4_P0RLs8mC|d6PW30;ne&@>L`F=XsaUT z^?EFwN++vk5VTh0PTV^~l1Gs@7-PW6`n-}~_Hh%Nk;z#W8j_q-Q|C-G9|n05$!QV` z$@6lN$g{mtlr=$BShy;Ir4~teW-%f8v;xLndENRP9p{w=vMm8hBeI(#!qz^E-IHs7 zm~HjPAt}!@4Byoz)XeI$7jL9aErN~nym(9F5&)bxKCv%3hB>4%4K?`@WkjpMRB#Ka&$jusV%&+C#;eh|L35b$DA{FPT^1yTprodgw&aK)NvwHu;gl z{bwWmIxBq(5;)lL3E;Y#FdHTy>(yCzV2CSQ-`CdhB3;CrK1|cm0?rX-_!7b^EEeMu z098q1D^g|?yZ6)LMs*hAt8S&u*5~G(j`Yo< z0FY;He@d6j*}(FaPw_cL_ni{F*ClTg_gTy0!c29qjBXn*VTNj8H41P(mU)#++YUYB zww@zC^=r$!D2F6bop#}d@}-7^46`$ij~b{N=vKXMWgCC;|2-UkTjJd;iAk-tYx_(N z@}GK@??bm&mH+T6e<9g#K=<<8DYO}#LR;}4KIXZbFHg53PIYtc@y9=sC>XAV|Au|1 zC4QYM{b$7U6}6l5y`6rH>K_l#b1XGeU-;SnYN;sw= zgvbunaV4$KrvXV;ZWiTMql7`9^80IB0KkQ7+2sRM#IbC{&=G^+ja(G;O+sj}N0+q_Tah29tbv#H(iaOB40a`bX5o%-Ub(E!<7>|(s$9=XGYtp0 z5pGMH`kU1q_%q^aK<0}DBI)fya>k8zb~Z$nN{_mRZ|?H^4pRu$vVQ zOm$Z%=em@w#;kEi#>r;S>v3a?AASU%wG<9=%jH6EB)WoNKdmk0cNSe=zc5z07SH5) z1jMCJM2(Nk*q{ya4ukNE7CMd_ZZwlRN=BS_v~vAZqR?hainu#%GnR`fwI9iW+^S7& zuHZ+w`kGYvZ}gnfZ_d2&ms#VxfRLfxw0D!D^SNUba+%T`&&rooo|cXFjfjYle-Il# zI`>GP*2dIlXJ=aT^+)J;?{~GcJW{EMjR=?Rzm%_w;`Yrj_|;19B;R+AWCcEji!?6?UP< zIBZl#n>{Gx`n0K+vgo!*1FI)(X7|*CEVQVB^`0Ea$RL+pxM4COaNJ^jKv4dfKQ)`y zA5m$R1Ma<}s?>+AH^8pnPXMqiNkT2s$4F);BkqlEfKeTf^pB+q;gJ)7RWEVO_Td_8 zGWu-=&~L1UFTPDI5Y5Q`b^VzEOH3@4J3PYrM##69dyRNxxAayQrlwXp8t)Go?1dWY zL(9v12rk9ROHjTL(t$mk8lX zcXUQxh*uoaU?r~>lX?PZ<&EGUajLI=nqu-nazWH7aYdT`?6Cn3?>+w^a^qpy=<2M= z_$J)%bca!~Kov=!idF^374Y3S-AqPtZ@&H7XeRyC&9;6W_`b0qs7~Bh>oaC!LsnJ4 zKvz~!YZwa&-1>xPQ>x?}w-?{0RT~|HfSN=LJ`#H0XZPes`oqu$lsbJMD@E&@BGc?z z8b^kFE|-hJXKq$zd{Yc|2LOQjm6t>k|JZ)COhx~>j=lh!mii~rY_+i6hlQUD2B=P> z**jF1e|^D=kA49kPx1{0<7bS;XWed|!rw0d{LQyx{Dp~Uf5$kEQw5Xf@jeB?)5Jeq zzTY^1!@<*d&R-NUGCSzCcuwv1?-z6b%d0w;`G*tdvuKijN*6ZCPgCb=x|x!zufFYt z-J8?~JMqF|?jx6rr1*a{1_@&0>6i75)VKK&0kNpjY#8YYT&l1YnQzg-o+K;I@f}ZX zLtdt-OE#))P_u;;RuYgv+&X-zb@p<%w5dh<-h2I`x@6ZdYo0e}m6N*}N622%$(!V$ zULh@f`&YmC%&HEm5Bhc1`wVxhbfnuGDa-qOV{+FyzUH}iJlEWue$A_&V)7kz^Lc1} z4F01!zi!q9QA@9i>~=84g^E41`}Mg6*MazI%|K`cPkNsMZ$iPVzdONmPAjvNg%aElmE~<83k8`2yqq z{tZ&Wk6qrB8o?RQu*bDKm^8HAQy<@we@)w?@ zylPvd1J(0TX)_HQEVNjfEe;`H-TjJuBeM;!vqF3P34Ek%_xXlxy~sa{P|b!8tr`mL zs{e{mMf{pKzhY9qc@n2n=}~y$B0*g!&WKhXv7a24Q=9AJh|BO?@$%ZMzz5(!7jZwH zBrh#56MEV89s-Nz8WSOJeTrQpgoM4ON~CJa?Y<(hm+<-xm9Xkh)0nh;eV`Vv`R-zx zKJ4A<^c=O?1v+YK)E6pe*$uhyo|?nMEj*O;@qDtSZT%!o)WS&cy?CH&$^hJT{jmMT zH_vUyul#1w3hCslTvJt>j+#mG z@&e&C#k&DeEOkMgT!Cd2D3X2s8`9}dk>kg{Db3aov3oKZE0~a)u78X zE}Lfi=X+5>Qr5y8dLdqHCqq6#(-2YicIF*lLwL?WZKEd?=p|Ooj6`M(E@N$syhJ>+ zzLmt_i3!H@!wg~6wUvD`psjM`ar=^pPlF+UBelFJt4vOD?qsTFjGOnmyjfddA>m_P zGxM}cCY1JLTXhgex(i&=?W-l8rRQnY*racNik#llFNaHoBYWdmfqXn6J-u0S;&8A1 z^h%(VB$&WXY^Z%AU%iz~R<8TO=b`#*^$(cZfF}yV$~IFXPZX3N(Y>oqoiI02GU2@Q zu8x`RU@PFZLk;qKdgjnAet2|nToVEio^)^n>{g{#}mikll=bAtUa+Ilb8==lP67eP`YD2`bD zv4+|lhm%QVnk4urpP`}czzPmD9d&DCw^WsKjp>NzUY%jywV8}lyZ#{B(2gWFs$t~1 zZ5B=q#1gW5UBJm5oA^EBzSC8l?9cb<%cSz+!~RFwEuUnWS-u5uT6-^QF*RFn;-HpL z(sMXUJatZrwYh8)rqjOn)u@Cx;REnYYuSlj6P{!P-MUA~^=;EP6oRSm%iI(XYO$?F z&!I8T!xunrG#@4GC0CEE`6S&&gl zacKGq@_)g5`PgdqUV6FblO)a!Cgru5)eJLW@0pSZ)nxx+G~2LE zR%{)7ABAH6j&8Z{8~FX>MZ7MzxVp+4dg-)#)YDsUyaLClM*X=Raujkxd^ns4js!LBg5;SaJRGM}9-rYvJ?;4;9|W^ZdN|kM|SRdu;p@Tquv?T-mR4Drf7ad&KK- zd?yH7TN^j6CJ=_u=?k_Iey9M>#NdeqV*hdC^wz>aXZHBS4wDD>=N4Kcm5F3Cgvn*E zB7+PP*AROPNw#_ORjNm&OE5PV7EmZblK0~CH_R+3s5 zhwL*p!>`>>UN2O%nVMOV8IxHpeVbDAid4kz;~(etgpf&S20lyEPgyRw;j!q!cd-Wy zDQQ^$9PPuCp2mvHzi`a)Y@pk=n@bS{QC7-$U9&Z(&Jo%4_JcbIc|(2@b-0eelu7zB zt_@qghwf3jU ze28?5bYH#u*Uh2df;8%n;a;3wM=w(gS;*+zin8a9>D;y$YO$d>XK+%rer#WQZ^nyy zIF&dX^>JnRkl)LC;=>Ljm6^l~5XlpO?DpvQ&tEe)ZBeMindNF-YhV0|0=g0&7iqId z5HLR?Zg?o0G3rA^gwH-YFZjrZzwnFDj8J_Tu0gJA5dW^Z5!q>_fc&%w%_Z)ZJmfSz zH{j$m25_5GdhGWV%LIZtC$5FQoxIwNeBg(k@#yDrA6U%n>-Cc2{4k=!=FQhIufc@J z!JLGvx9K`U3{+lt3VXI`vvca`eLT-JNV5Up4TuzD=yP zEV9r`8=q#kqREM=R+ZhSE7Vc^howqf+W;=i0?R)rq_JbQ5RQ2wGjm9RT%$m(Krt4pDj{p8ctfiITT$sgT|A5TN^RNJO6KhJT;?bRA8j*YEV6g}dFDl|oR z@*xh6W$zjbtAJ^;f;2sMkIX7-^vI^=4o;>-YUfzOB+_>!QEaeon=QQ;bCtV>kNBf} z?qjt>?n@cYwICRx%Uaz8!W2$!1{|DE!+}g9c4 z1j?NKeY)nheOwU~iJ`6uZ3Rklv=?r{hTqBc**S>R@O2}*N4qhT5Q8yeKRt^8c&L9b zE8y}2<|zIi#s9%r)F~DzBH~ZD2oPN;fLRFON51OXJ>2_rr6!nWf!39i6e0y!FU`Tz zb}aj)9*1TN$^@fr>&^=ws(W6cJE_=34+Se@;yGx~)P2qRoP%v%(e&*ol;L9oldUR8 z`vi4-Q$5&twIWEvmdFsp?Blk9J!)KpU(mi4O6rh?=8`tF&#W?gf#@p5Tujo0?$+=$ z`LmjOHRA!`Pp2TkO(L~{&e1Gp==C1kL=Qlg^q>}D{f7%S)wShjhvu7ob<-#PbHybL zHR0m3a8)LDrp{wX9S!=8!|Q@?hV|_dW>&3^^uZEy!Ur)t1f8=hc63IH%5_C~ZhZKZ zYWt7YOx7D12Injx0X@O*aPH?3>sbm@AENR`oiY3S|;cI-|aCiSr9chM5e;#?bW3DPM3Fe3-L1?V%=6mm7A>E*{)$vkXbTtSpzs zq##70FcoEt@C)0=bF~cHY2v`OWNzy>Vz#+*x|QpG5MxP>P70eL<>M)<94n?kld1If zGpJ9Wk0bo%zRBsa;a+NEso7K&mKsxoqbY0Ihh`92;%+eX!5N(CJyuNfr4p0~!7{IL zgX0H)2{Jj#rvzA!O}n+1URcrwm=e^)s9y$n_s$+^A#u)a-Ypc(L-QPSV*BiPNe>Rn z5(eUp5u%275j!Y-NhxXv)DigJ%>-i{eSn0p)m>g5HZ(OfE(ji?Ih)&jyS8KDfFn68 zkf*JSq0k8Rk8jB>wvaXUGcikEEVoK+syV)O311K-SUjV;WnQ#of)pm$;+zgus>qrJ z#b!?KIjD(YDaWF}S%kJ!9Fy~;`;-1 z6}Q5W#C_ohCDEG0ba=S{!}$(Ek(~fuVq}-d5)y$7R1G|VmW6~olFM} zs|+S(X`f5mBHpYD0^4(tW9X4)D~r(bq{p`MHTQh+n9)z}CT1xvkJi~Ndn?dG%^Tfj ze*DkDyvKKVYh0d$zDOyDy`wj(hO$rkA5+4oBA0ScXjS z-wM}Bmr$9%?d``IN?Tkh>lr)-fKJ%XK*Fnl?)iB~t8$ud1BvBtr+1SPn?&NBo4a0& zk6Cu>TAK#BR+Q7#kU-U!o65eT*8r$Kcn8J1MOYmHNO~%!KP)$w}p6VSG@Rqx)?G zMd#J#3nvj!LR62{hl9^{euoATBi6mi>Za({PB4D^9{J@m0iuMM`Q#Q2JkU=hXyXAwa~GeIaL86aBBqZQ&()VTlQmvulDk2z zRxx(-?5QAYbo;tHFf{h5y~A)%LP36AK~4iBwX@=LmPZf&`so~A(r`&Ly|;*4iYMl6 z<$!RP@Sw}Sw&&1{3a+K&&?oTNpipinU3KnPjQ~#h=&JSrZ;BX7v!R3JyH|dWhV4BE z&bmp5i^3yT5uDo98g&QPm-|uk+HSKwwtM+UY}?jw!I*;8=>9Gqso_8Z=|_5br|tn6 z*_N;#aW^YB8#8N&srm+xnt8&*>+>~1R)}EI26XHJEw^)1-d#jbtci^`kGz~ww&Phv zN-(hJWH0AQHO|pXI9VclhHVVUZA?Zo1-=YVc&t`m009FDVZT7Y7H?trh3-#W{TP(@9tCDg?QTvOZN^{fV0Vg?`@$sO3d?R;nK zg!3{Kr7Ik>cOLtUU)4<_F$Zr*N^K^Fua^H#pp$R+@!`piRBMV#dX?kaG8lz@w3#uP zRL?BAAS|f%+q;ux?X~Z(lVaW^YgkE>l{L3N>HG5h_0!kg`W$hSHhWSBlFhE~6qtFs zmwJZatCevyny12pXX3bmvf|~cB^CoJx2<41eBW6Bn)0s?JCdh2 z@YJ!z>j^YCU36nU?=x&Q@TPPQPBh;rcII6$gr$#ILl@i{sz0iu2$FLV1tIKYG zpM5D?-XL88K4LMVD{+L5_>v~`Rtx6CBXmu#oN<>4;bNfqz~$ryC#uaD43pxqzklcv zipPpo+IWj^o@UIPK(~3wq!p418b)HlPds##4!Nsj0#UG1YRFpXRjt| z_}pRR{OuK3ggz)kFMXw7bqP~tayRnAX?fWXa1~rE(ZQ2l7G@0reV^K8m}j>uVQJ8( zCTE14Wl2(V8(+C9C_}Fs6RTO@y5B;jli%c!4PDl(Mecv<|Pl7_UYR^={ul z9UTRI$A)Vf0Xb_S zs?MG{?Cwkz<~A3=g)Cl4T@m&^u(^G<3ontC2C+*sE0!B;>m@PpNM&2eXm{k7P?RC_ zB$wJ5@XD>VEbuFi6xp)jYTEjkf2a!669>_HlZ-(@RrA7mM;_^)Te=PgHdWiA;`mFl z*SnaryT?aK49w<7CFPZy3owEXW~y=<6c&&a1PUye!*M#_5%FcrEM4X_9^Q&MJ_K(H zV)P&C>=dg><>RyX2JpuF&XhG-yDHe$;P%-F#p99Ny#`MA9QP_}i-P=A!TvV661q}n zQ!C`Dyvd0OowUhaBoGr{P#0gv2`C%3^m)zYg25U*=-|ep-<;bg=A1Yo23zk*6w3P$?NNOOIkP zYLWIBl;3?B-oWnUOd6^+VIDA#NmS@Ok1lJUThXjs-`F#vGtLj~hZTE-5qVHic_|Ye zH^EQmcY1Z$w^%}q4kANMRGRStw!5=)mbhhAPquD`UX2%mBs~BkLun8FDyl+%%%S&qXo)5*=o)}n>C#%v&yk7eP(+!vZ zB}wekIb+(07tu-B8M3hW!aWQ^gI#VG7++Ub8AT%4o*lhJ8{LIiAM^*+=a={LJL&_H z`5&mhKLUdP^^L?WB{nQ=*|{!3VryPPeH?`rg|f%{*$Lir*1o!LZ_CD|9j7JQRD|1F zVFa@yvZ7w;ToI67L_Vn8O7}fk1gbznmdlCFjL_m{LCnK?@+6(@_pIbJnT8YVa)uVw z=9~32RWgSg)kc2H4Q`b~Cl+blT8l)(>=ObEYE4Bo)t}>)su>)-?L#qQDkZhFtN6lY zO2>==kfeWeD=fOYGWZ9~h>Sb~5clS<7MY6aTYqB5)=3x(55f5x_a89%>WA^8@x$vO~L}wt=H9m2j+eQVgKYVpgbmff!c;N$w;EWsPGCEnHo`(Pjg{Y zL{4B=&Q4}!0zK8Sa;z&wU{ZJ;e8|xor9tzp4fWdcO*y6W?qzO*#t9#c$0A?QP1HZSB{H%%RZh-W zKgqyRzu9KhRD%MwS1qaHP;$QWZRjOzy&E-wf8?CeL_x|p0$PGW)RDgUOC@wy!yHYeR=%{gy}2x`lm3$NHVQljI0$%Nl}Okk{<;R7Gd>= zKC)PI=O7=A!IM!~mSYuK0{8N=iyd1^oYt+fDqO&LhQHezA5R2H5H833`#^0fj9#wU ziZe5A6b&o>T|Eg^3;h^0vY*-$_qu}L_bp{~U!k}+_2gGcY(ElodeddDHgJ7x3G9#^ zbws5fw3yMC*ndbG&mf%K{`;bFPc>nLtc)?ATc*5@FKVLCaPw0`LxGJkG1$brnz!DS zLU?;stq=Hwm@^Bja&J49Q0(no3>Os+wM|1%j@E*21{$zB7@44IUW)B zEBUC>CQ;5Ebv-S}T~=&*oWGp@YbR)x_t^V>vnInaI-n;| zF*ADsNvY+9*~=d=+I{ybu2?uN{#5r{yg|ohd}G}yT6}AZt4jAy3>RA4LJ|+yh2usp z_mKd>o$F!Vt5pA?u<7S_;p}iX79dR#&8PVkcy4`15LI-WYAm0`l^9_2oZcew{t4bJ!g@59 z`PaLFC0)EVaUsF`_ls8aJcBgaua^0N)7X-~Hmxw+9IEU#jQ;$78lWSC@;ddTgpuAo zaQySOQfls}R}x=UFD5dUcy?&K~tODrsUHgis~yL^=vz%>_XE~~3s ze9z-GSzR(^m;9UXi=pY-a_9z56?ui=HnrJb{P5(`k(!6#hDKckg~a}Rv~r4Np7S%z zyCm4or~*Egp-=ISs~i<*pP8)*m0PPWr!1zHs7vk0^N!7FYZVmY!Dp|R#&)-46A2+W zyprUR-)|DmY*%khSR8lfof$8A#Ho%4-K!moIP`CZvoV4MOmq$G&)(R*p1t+iEU4qZ zk}#Lw?9typJ6Dd~mYrVy{;9}iFuCZPT-w1Eo+Yc{b3dMFY&-1(gi4ya*EVR| zJUjN)8W(luX{tp~bBTjWo3ET4MsXFBx4inKA`APs7H#2;X&tvi zOkKq=SBkb}5c02_JV3dwS`)xmkp3xbY%N`=26tzA2;ub6F>Pd)zvW71)7w^fB7V7XULF}GR&miE1o?}F9jtxu8}iDKw$Xl zwFZVo_3eU!akQqAR;K~L%Y7_Zf;l&gCNBwc4*YCn$?p`^AhxF< z--EJd=aKD9Y~Hx#dz)$cs?u?Z48HRiLQ078A;)LEfO*1G2>Pd7r2?wuE#8tXB`vPn z^9Vmg%xT`#X3E_V7mJm0tT<&8e`1pB>?lR?1$o~ca1t1Xx6$`Ou$mnD@pF0i%K>Ss zo~Ck$43~uTo8rWYdTC89HSVS@C3$!}26NKX%PWOz;Vg2;dt13_!KB4P4XJ?;KWB-y zu~Dvbs)4G55yv*}&XKa71%X2($N~y63mGL%4%_mvc$H`^a6K%y22g?;WtF(N>9NJx zKt#DS+WLWH?8(ch>8WP9_IZ1JqART;OSA?4j&=6$w}ZfZRHJgEGq%f#88pcSWuuT6 zq@I&0SRe>^DE`#9zbxn{e=(|mGpuaHR)LhK_y_sldbsrOdRQnLV)URid~^8&ra_`< z$=>U(+U4GMc~4~j8xQMl8RS%-(g`^R%0b`hA{*aoW0!FA17@e8K*km2@gYLIMs5QS zOZI+gyat7`zJ|(2xA~IkWZ1}VN%&Q_2LnTo2HNoR=tSqTjj1eWg=5WI!5SX6>fJ7u z+y@+qsrf>B)?iNqUTDEVLrPfj4C}^F4PIQ;^w?B@>N$7z?j8(^1=2gNn;h9xNTNjr zk)G^>_66&t1}CYt9lz|>M~}$nCiJ-Z-5)TN7UotNU`|?Ib}9X2as3I^4U>)Ck^{tseS4!J^2?)Z9nzHJ_O;IE zgaE0v@~voC`q0qGRL#JN#-71=N`pGaP;~n`Tb3s&$%0m>P24GrWsUGSf7b|*ogood z)wIh}ETVNO+2h3Z%}@)kobf>9Nc5Ujbe6U0Tqb>~lGq9Y z;JD7NJL?_|UO>u4U3!u$RAgY0Pl%PmOr{$8Dl$s?F708OFMD0m2064ZR}w>>Od{f` zTjUPQJyN0*mPij~9r&-PFytcYj+PhUag^GWzN-vP)!)&(wq-X{jP(9N(nT#&u=2y52(s=V@$@TE(s20qb(xM*Pgc}+iTeme#C0=m=n$6q#TsL z!C_;&4?Kk2dX(=vIjyJF%*LnxQDK4P=}EPUTZ!a?Wbw&tC(-g&wa@s#TZss)6_sL^ z7md|e1PfYo>(Nr_6SQf7FV-0cc46E@mm@*;Nl14dQ6Xn8th9&Zth`U)Ac-BrK?!uk`eVNAbgR zbTRWpO0vbw_c0acfC(t9aod-#xN4MA`mZDr;s(A{QPTGH*!eFdNGx$i+kF_MjO~`P z(Oaph(f9q5G5YPC%>^2Fc4ZGCJs1ps7?${AlB%8HQE2+{)R|(ag#GFyi1ncR?SYv# zrPO+TZ5$yIZy-_H#I8LXtizbYn6O-fL2Rhr{)w9L2>J(oC)Ty;$^;&MQ>0n}{U0!> zAvQ%eN^ zBsU5cDy6fPbk7Lk{^S|UG`-MTZBKIvuV)!+4l80^+ zW;c>hvi*Cftu4Q`!?KXUYGLrY8m&VH%9RW}mz44_s)J3Z{3JH}mwE)8yqXHrMj7{I&EJ^GZb{VO}d z6mA^%%6r3GC(%6)LVD#`%LdlxHMipB2g#MC^i3V=!tv1+F?*kLqKty}6uaZ2vvHpp zS2<{{rKaOpocX&X+Ez{*4C#^#wtP%Y*|2ruX9^+Kt7~wHvq9)Ad)|A<>KM=<#VRCA zU|w=Psb;Q$=Wi3FctD{wq5k~-A735!`z%%dKfm7;8@Zk7rw*K_>XSN)VKFl3-mu$UbiRpr+>d)^ZA8CSl7HX7UhS%C0 z*{Xqlz;sbb&C!fBRS3$P@RpEq^%#2uJZcWPcLnGskDHwM>PH$xjJ}k9JQ~_`LAN z=F6}V10f@mVJp!wit;yqr@9yX7dD&GfcXV~CwYtV5Ie?p=90gc2BoV^cp2h;Q3qhzK`?cTn= zvd}`E%!%isl3bOwDsiH0XCCkHLqGXEhqc4ueNx>j+>%YsZA4MCELPQ0)`;bh)2V_H zHc!hgT#8|R7oDAi|6kW!F+JsR+HW?LCnIL*&|8-`1LircYt^F}?*lfI;%AJek_9Yy z_}QUkRm1Cz-CFan0-58S)5)xO*f}>=d8sWiwqada zS+`yXMLLy7Fmo}fG+*g6TKyc!3A5QlDo!L+04FvEg1%1x(~vP}Ev!SmvDc1yBMIQWrrMcJ2ie4Wy+sBgHU zk&m?0T9{zxEaw~1NY5MB@i=3bochprsJa5?^s!+!QnZI5=Zcus9qlTZD?Dy)=5o;OZBsJ&askdKo zc2Y3TmwkHIGiS85_F59hba~S%%OStYB89`ZZ_7UO5M2m4tcU^!$%i4ZAonSp37I*V zr@Kw!Ibx-gH$JLw_CEk+VB^1F${Sw)fRtatWB&mpGnq96&Vkf_;)Op)raU|*GBQ4} z!~$NA^x?VdHfvl)b`?AU@B;T5nFY|8$m70T8NpO0AQA;+;Q7Ze2ZW#hubJ{B=qaE> ze+~aXROKJvgn(<0HEh+4EGoD3YYn%5q>7l?5}|wSV6m+C6_1NZ0d=41P7+ddS|_); zkg}by3pE`n=*t0Ptg?T!Cty%)blP?v%Jub~y>$UvoFEgPksbVrwDl1kTqNFlkwqqJ zNd#h6e%F-nWInU^j__Mk?lgN@L-138r zVBzSvL{i0PP*BY7$*KZ*dD&sJ!4DV_t7l+1)1C&IK-%MRb&VXT_G6l<*9SWU&~GOa zZcib!KHpbm6RE*0n2uk$hph_(zQ~v@#}Jcx8P6@tbor0-Jk8!*kXUY~I1mski4Y?f z!nRWQiyiYn+x)wo;|_Ne{ZFX{)B;4n{%xrc61fE)Qx*L5GXZ<&FN8CxhgClg&SD?v zqTgP|&klq)0d1!@Sn1s&Ihx<@Uv6}V=FGLk4HIp;b-tBEBXTX)OP;n%lV+F(UAVZx z?sE{9MI96}E>UM&xJOmiM!$y9UmN!$bELlVw9`EC>yG;tafKE*ij6|`5Z^eipkH%% zKWmr0!D~K8Z2y@Hg>EWi5=kj>)MVVZMbfg%>rQ#*?#yctv|+i#ql{(f7~=G~wR@Yr zq{{b{)QEosM?mZ2pk9hhrLsV9+G8o%GBpeHOOa`Vlt(g%Bh+DF_i_G>VY?(0dVkE_ zv#Y%d!=0Q-_ao632Ro0+W{coqoY$_2Z)QmyWl5fA-u0iJS1T3Df65IE6D$x-Ouflb zJ@T;MZ$9k3V)_9CNqLNN<3GyxJQdH{X4^_$KJV+b%bih~)#I6mhFcn-G+_7q7+<-j zIF0j;*>#vmoAvt#OQ+pf)}vH&Sq6?H$vR8fu*!|Fu~54wtner_b{+F>{^XLGZ_FyP zD0CO^r!}~5qJ{BZyQV*30cgHjwAD>FBy2Bk*mHm>^lNhboIrrCpz_Bbga2(d_+tW^ z!L*{}gDtdV*{x%39NZ8`)m7VBi|K;;#?ZKw$YQIiX@RMi43Vu7c=|*an zC`FsKi6_my(Rku|ZkS)N)JjcO$)+Pfhg4fn_BCK2Zb9TOHdKkH(s;cgn)0#XVUq%k z%Nle**y^<7+GIMr$I%dypzZzct?r5;GHtgIe4vIJ1QG%tzJ z)O1cduZ{BS7ImFrzc0}YsO765HlFb|RX2N@c|?N!u6wE&f>8vMtYN#z^1K^F1|oTM z8gG$S=N`_9c6dLrXU}&4ar-bJA!$ByP2|L!NC&@bVnrg5!qgr@mw0CJl$3N%c#Y>( zt*3V4Rk_^#pfPpzabThr@AE*su2r##o(%p*w;Y{o6??YTnd7jk%WtO|g$!;U8@`OI zUR01BmMsi`1;8D{x0@BdvYPMd4&~MzK0+&PNJef?@vvYb0c|fMNFTunC=>V(tRQ|G zp~-0Kq*SOaRlV6a2j>Bj)0gq*6OgjM((#^B!~c2*`sMfF`DJqei{QL$M!ws;UG_WQ z_?J@r|Ab)w*SG#1Sc{v-posE^F9l=};!eEqT?O)_QN&h#6<$9=P{5W1PUjuajxi*n*MU<6px3wix!&A4zEnR3@C|82tlgBQab! zxf>*XKv@YSl(7Iru|*D4uPe&R(m($~{sFT99&fp;Vc)87?&ZJDKP)*ksBcJZiIatV<~YI$rAwa7_-j#I4~NVI5?jCMcMGN=$T zL2YgvzR$8dE4iHXKyR5K4|ethzIu4%rtM3}Ic)u}pNob9~l;7+ z;mg>O;Rc9&X8eubx8r-jm`+W<_*7RxoTzKBxU|sB8!QZtoup}W&JRs~Vn)!TJ8fLf zlGLpg$qrP_^3gYs`ITr1^dn$beu9Ok%Fgfy)bl^o4{vMm>&aib zL*^xcg#lBYAWecmx~MY1g3Stw>cFpW6gKekbFeb{A|pSgMxgy2ss1U-ei_Cf>1~iS z@?TtQY!K*|%<)I{C)mvO`7P-Fx*XzvAl&|X=)VX$Zx4WwWc>#r>B+AHVYomFjL*cx z3Q&+5eG4+)1N}f1Aq7&fK0F2~0$#tLUT|6lL^Rtb6jxSz-Rcv>o`4)z98%EOKeS( zsZqYG2w5x__{t_QmW6ndDOLftJzYTJt`j}7 zvGT5X=dM~f*(!Z5C^m0Jt~L!WBSfFOV`4QK3P1#rlS5CW$SjoxrAjto$1JUEU?&zkDuu zcJ3u^H*jm1;uZH67Ju`ndq<9!U$@a4$xLvKWn@?9mvcTC& z*NZANUFUmb<6O{h-M{#K$FdiGz~pKF?uF#^3$)+85N-F6`DZWK{eZdr)j6PW6P7`z zv9gWUJ@m-%Qu|R~RE#n!Twt0;{dP`pUSfOuPF?`I^Yc$XoagU;_`k0ymnZh;4+zLy zCw=2FTayT;l9E4JS$hMmfu z2u9!6-tIDBqckzpp^faObE~|7lYKgKEWNgH^q7l?w_%#}O$^bFxgjBE_qE@%(U;~4 z?N}74nq)9*FA9lrKVmG^#&^IEnz$=zaZDu5aD6kwcp|Gc?U09j^qBFv;2CjzORqZ5 zQ5e)arQYiu#sRK}~@7LpBD)uc?x|eQi{*ezI^ye{H zAkYUdg;%#PJ%Rhn*SEfJ6KB=b90M{V=k5nlnQ~DeGh}B>wRl)4zkcFyD?a#W_fsil zrZCpAE8mxAy?%}sd!P5011_SZBWBiJ#e<^b3*VC=AaGH{d@&s|d_63)rCKhl!V>ys z6J{5Ykif4X$yM@|>6h9uFsDWGHPeY=QN(7NFKQgi6 zw^=M_@p(iDXl#Q6pqRSf<+=Z%kLB(;Q)V1j2q;TBfyd5k2u*K+LOUEA5 z@{!~?vWjK!UgU))OC5Zts``#QW7;&*Xn4O!m6B7+(x#!b_kp$yvp!EF% zJxj;dQ;@$U9Cr(?|Iq6931hWJqi3LUmE4|7dp93 zrtql`+8V>?eg^aUj&a{4J&doH0~mAboWC1&Z=uk;**m-`9<{IW&gyZ(26_8oJ!}hM=3sH^N$(0Jh3b%*5fe0yY`RiYa)i|w!`_m6LjjY@ zldHx=kT|^4vElLkdc>wVUAawc?W}(2ZYckH=MFT(EDL6m6sR@;mD*v*WUz9~WPJl9 z{OblItKAStlFHCJo8;D>qjK%;k-wa@mO8zR>aVIg5aFjj4S_tJrK3==H%4TCer!DM zIy&97<#hA1o$ia{{K2Q0x(ZA~K8r&(|5;1(ToC>vNkMTxU`Z2}EPI=aDLvhZs$ggX zU2BHufi$Qt8dv z+0z>_*Q>NBrBc$DZySbj=ZIE*9T+J3lw!GbV7t_NSHTPczX>D!6!pl^YC9yQ^?Qfv zVpc%3lA`ly{u1&+Sv2InT$I=b1N^pZN!EFeNJzxxHC2g!z8t+V{eWm5oWE0izVZ$ zQs>0(+#MwrHT0OIc@avj_8v?;1m@Rv@0zPZyZ`h^34xEh<=@9Wb=0tsbG}i}5{RqAl(kag?23yP8QNJ)@y8 zt^USYk*hP0LOnQQQlPxVSG^K8uKVHh35<(3kCs8}$@Y#ay#t>4n!emYipOBgK#`|K zv65b!K=;`@m6Ih*=Q8S=SN?T_r$&O=ToT-S#SYeoMN@;D;RA1&Dn|CdL=vpkcrB0A z8FujpT`ON3ejKX9-9GhuUTfYCCJFTY?sHMNqhhcC2 zQ0Dkfv!(Ysw9ZVnhR=9%o?v%t8|&a!@agFUd9ulo^7r!S*VCnPjy&|_2^M3| zog>u4UdVzT@ba}ZT>);Bx)=S8jiY^wB{}(}4wi|Fm4y?R4OCu-LGP0$NWj^8MXAjW zg8sC|aK5I-e0*rYr~H&?>*X9;uA~jLoVr^SSom3BbE^Cs4JyvoCm1&`{Nf&=bGnZlHYhuAnda z0*@p@toOp2i*2WjJ}&b4?j$$+YKC%Cd+sN-Q+4&;2mOfdtMR0TQCYz$YO&gB_Sn(U z`J^P&cjrIz6v#Xu95)cBW~C43pV%2Rg2(Ck%IRwfhg7N-W)LUQY`X4;!PH@OM@~ZB z)3Qw)N-wpnxQ5y53F^rO=0`PQ?G|?TNF-6Ydj*&sUCkOBYp?VUKZ2Q@OAz+U5>~yq z;4(WSNfFQV?)o+NNf0&4oPhwL?es-}nD zd~|Om97>SzjK5PNG^ko6Y=YYB#i2#x%>{G>&gcfIUFXv$b%9R~oZjxagpF_)CbipF z)&p*QL02RmXIE)-P6g{;NsYy=Ocf;k&+PRHKK(b_D?KKfBG{=>wZww;;xtum)voHh9gJEcbE7Ml9lK zw(cby(S=P%dS8FZz~XY=Ga-3zdwa#iM#`Z}A5EF$D4)n{VwqawN`61RSlz(Fs~|2o zhnE2);F1qG`7a_hKs7ZSI4%1Ux|q}crg5?U(zJ-%yq%F5nn4W zG5F1pP!Ej>ydhswyQ$c!H;kbChW<;Fqti^0u_Zw=-GNvX>UK0zWo@ zAI7drU6oi4^NI!e8L7NwVEg54_l$-w#8o-ccYL0`D$5yf)bH5{7PuTdFDO;VuKv6W z-rUYlTnes;Ns^*era&=^{h!9wzaU7hBG)>jwSUn4aQ-+9p2F9+^#_bs_+`*N5I6T0 z+o28bc!?w7R(c?oB|LMP@iuMmR)KNE;XV)FsQzIRFB?ZezT6K+hOJw04kR?^$-dZ+ z#G@1HRPHkrzec{FVQ28Y$BmKf|M(rgdFwH~quQ&_o-yra+|5J1uHo44=C`imsfwWt zGk~v4l|hvQ3*(RNJ2cYvhf6}Rcsqkuad2SkV#8h?J6vrQ-81A^19PH0X`O9gVZs%^ z%eqk>n`5IpJRDkER7WXIG2ApPJ|rJnF9Mr)?WX=f9Y5|Wb?I<7$4lfG7F zfYnX3*clzg^vT*65pH2Rsl|^B!}16n6+G5+gL4ZIL$QYs?&QpFpSPXdsb)v16sYxw-cPrk6N;b4IkW4xtAVki|e~6&Zv8fW!U-CGy)X zolEZ6Zgxj3_cUSmjb7Oo3lA+X=_`9`8_$qnt9{PuxcyP`TiH?mYBfMhFFq+W&yjcax%cMOp7v zE}V_^BpfO_M=_2RDS4Q_A8rEIn{_3BDOu^W{`U6kEzP{x|Fi{yt!ki1d(|*4&bYG; z<5ORP{w*Y2m`5=eroLDIuN(c3PfL%#UVC#oGuJyU29L14;w*3tbX`~f1LhP_@49N_ zh!te>ONUd#0vWstFM!cwxU~#0Mt=?*r~g9+4iIhv9@sLKX^f0kx92)+lmHP!Awo|w ztPH&B7Vu(v#1pFJ{z{mz<-0FM9s>3awF(A* z@kM3^j>|o5#6niot~*XL?iT)Hc-0?9?`7n`;{&(lr=<=8nXY?=+{prxsz&5=X`F8f z(sLuPH3G;7PcQSEmCQv-OM&|%zEa(_p#QD{^#96dyrjH04JfxBH8;iTNk?T~2Mv=0 zkyk8xfmMVf+ChLA>NVHJ^l@fU z*@|yWwrf5+%n_)Ue}Q4feAOaePS6a8Sn^gh8~6R;G7^&H)K{-y3@`!Ng2Ee)E9`~g zoostdp8%d}TrY_pxbYPzBMIs(#Lu9js<1oOSp}Fz!gW`150Tvui=yMMhh93jXSYT( z7?{VmHZw;qU2cSA|2WzIa0663*D^IL4>@R=GM$|92>AhHv6!nFUT38#oY(C7b2U>e zp!lxnKMEq?{)#^WashK&q#Tv>;hu1y2MF^{0!2r)#=`3Q7F1tSmdx@EaC+l}2|uYS zmMrpxcAr5mm!wli$=RF3!`2EpuWi!8`$cE{*wE6t3=gvFy5(4@f>j_*%Q(_BT-Ixg zpl^UeK<4&=Ij2-Z>`R05_~0j=Rt6;`Hg~UW=!WPWbU@vRY2IajXMrh$;vZ#Wa5-yF zgf%5Nni344^Ws3Kif!T~18udDLt(!ZAK5#-ctI`#tr^r3Nh^7bKIF3fh#(bf~cpR zP?QtZ=llbw!#3Oat|rQt@#?tfZsq%^r=?}-olnAph28Bygtn9P#i*jf3uG}sjpGAR z9>AsY`WfW8+*;JQktDqZ=-SeIb@yIJBM0f4T!I}3JvvQWkM}ig{yEzIvn|9m!yhmz zA4RRIf55yiRMNU+yRUIgv=!NCvcCLsy*CEP2BG__!3Y0#FD}Z4e!pI+pV9&tu2g}} z0NYB&Yw63i^G}C3z;{qt*+%#%7*1n1i7keyD9+!LhHvY@MBFB z?I^)Sx(H?LWxl53VldIrWnjr}xKTecMUDc!z7%H*m8IJ*IQ7_hs0avYCaKl=1N6yR25KoVh!iS6W^$ zWU_C<$T3IVn)d=rd~45$5<%>Xt;-a8v{EA&O)NV*$j@#d1a$1Az5E%b%$ppQN8@=< z*4TrqVHUK-v02=`nmw#VJ~{t zK&HUzQ$?api0bHq?f{Q@)y%kr#K^aC7OGqywyenwo1X>6MCN#T%!fNiA_kMhXHW4- zsQkTBT6b_=E9|&*#%owRv3x4b>x*{^3VR`rBm&A@QDO+KHjlEIUR4N2DriDT6qQLv zF~69Nt0ZPQW{exBBl zKJ#$*Fn7@*-YBx*aQpvM_T5oU^jox8KtVu2nt-4JDk7mn=%Vy4O&}EMC82~CItmJc z^iB{^ssaHiNq`_7LMQYR2u(n$bfo&?{ciidch|f3%^x%QWzCwkCTntLpMCb(hX6Hi z!xAs6WAlQGi30sD+{f>;!o$lnS4FRUcug1a4=VdFN8M%7oYFhF^*(p$cV~aLpWM;p zD*7T%5~|~ORfn7I-(H!2`ZxudSzW)saWJ!rbOP765lx?e=mC_c(539d7BYT!E?l^h zU4NAQ&$do-;v;Qv@e}d;%Ti6mSO@y|SVyU)MLB)8e%KC{iW{IpJ^*PQeP7+9l98EA zVn+LWh>GYcllje4>52{jMN2)b!QJo3rHS(<%!U+LH4Ks$^Yp}4H^yR9o~w=3>8YEk zDGh9brsUx-U;5F2FJ2%yqwY-=8UlIqAibpthC~zCZ^gb0j|4JOhiuqT9~zB? zTxGRzd8;7z9F#UWe^AvvqzrTfFl@#ZtGY32bc41lFH40D582zqj>pI7-N_s>r?9&->KM$?r3#CFRjJ4hm52WmCi=N zew0;gnPIp#VHvJ-Q~bNPAc2H&J@}~UXl-91&}l@k(djn(e8&A$OCXvN1Ez)83ABRx zZJ;Wmz-XFN*2nk5lC#bX4s|Ol>XSJEjA8xwkI_*kLD6|M%}3XKU`;R%1JF?o2D~bp zS=@^^va7C%V@v=)J{&6e%8*mCS_ym~hxV%45*H_%S9cwfR90I?_A&V5KelckK7@?g zf#@R|-&emkoTwDr<%&_l(|pfnE6JVK)In?5C7;IQ5Ry|95m@Iysb_l#m(kqYzZ11k z3;yQLqqd9uZ|s+^w}#O{K#38o<@b)0{LhBP5GL|jO$oo1AU5PjK*tv(z5 zb?Chq@q_L2#4!(I>*Y)~Ubfl+7LJc;@bBXtub#h1ImO5~5wIjhHzA>PzQpUnuNC&S zQKAtxIT=@OZx<*9XxM8rtRR4Mfb}J3{jZvhUJ$h1tbAi>|wUQ5f+4$zorkNk!@1K>mUH;iO7hMPlvR=LU+| zQrOb2GFS$7_NnIS?GHr{YBy=vQWlCs}2`EI#Pff(L)4`+mr zZ;+qjeh;I(O$3a$UlXrE^MlwO#`CY_2IRDwHa+Diz#0n z-Vdi|whu58yM6TN2lM=BB5O|WtAM%>1o(|3rSK;CsusIDUHDFEo!(2<$pegi)70FV zxQ9OUH^2WCX$Q0*sn+VYSuxi_@D-Eo>v{Zg`_PfP#$$>Gok5YZr_+*DvM!28>E*B{ zscMn^n`pcz$c0$fa4;)ZenjhQ$lX^HG1UIli1lNF`?T&dI;M146IhxAa|yAsOHb33 zVVG^%-}PhU+z>~R-z??XcE{?9BFhI6THsJn7 zF1aZqOjCRAjag6LUq&1(3;lIWGlYb$V?N=;@g_dpO$aP@104 zH{B3fnNHJP-9HKX8U^36rB4uI-RV_%pa)b4mQ z>hEuKJF#5gM%uH({Z{QYVJk5+ZL|SUi*SBd;ZjzHslLEsuO5Qt)!D1`eDf;O7xO2C z=}VMkcoj$NCc1?SatX_V+d_sYB{G@()~(xmv7gElU|3ca7bBXY#f$sL8OY zke>X7Pn`4tuV%=umMJejkDSCjx7bDp=f?=G)a!RwF8F(*IlY?-#I6tOhqZ15-mhI4 z^zX6;37(7nm~K4|-sIdR&)CcXCjKk?{S5?(WW$3r%M;D!GeQgNFP^rTNB0%{5( zK}P!E>Z9p^{}HR0Rbgr>F(EsnS_UH}QCS3etVVpbMBxMl8pNc~x}Mb9qiMN^$-<$Q z)R`Q4xsfdv#@c)>+m&;(b#JkN^jlOVCAOsYjvnfJaH$ei2i|CxaG~x3!TO0vL;keg z9xt!;CXD1eJD`TAAV#laJt~ZY`V=r*-92M63WUtCL2SQPB?p9P(zZWsX?ZGt|77F@ z%`e%#xm>}Af^BDwc!?W}VfjW<`>{_NQP=Ey>3mps*Uw`E#(ggGl5KWGqwtVLbfv+;_4gBLAV1k-V3gl=rY7y#LY*}L+RMfwHCZq~*S8>m(4JNLv-TK! zg{Ico^1^@K{+Ep9sF}=le|twn24pd>7aIA+Ze^n$3-fBIPd(NR!FS1>HReHtdDe#K}%Ff)b`~}ibM`(;{0E^9o4exYv0w5 zfqm&`P!@4};BNc#@Pu+(4-TZ45IXfg3-kHh%SLe6BO#Y*lv=&F+C~8=%Kr-^B7}niGqW>L{pv8j_P6hB9Wu*?=T|O$<}?A# zNf`mIb5Y%mgutC!F^roUjF!y;J;NK17FVIx)b&QWNVh`MZ7;ctlTjz)6YS7Ie*=(=(5z>CWXaCiV-%3`2t%-vMo4nDBy)*sj{qD}f3i zVTYJ(HR8PVFj{YnYdIlJv_i^`zP!_HVnga&!Q^aEnN3#~FE~y;m_l=axu;20Vf0V{ zC^modHk5%XJtiuC=EAH#7tyZ4NkiiSaj59U3MLDC|C>H3qdq;(*W+Y)SWKEd!=-fS z9i<=o7nKKAR#+oljA!$|m`bK>?uf07AT!RE(UDELikA6-p?75&j%>B43DzvqfT5V1Z7k+?8FefxBm>Wz^2O;Vi#Aq+-x8Y+pj)a(nmct7Lq6o~6WsgP*z)~gpRMUzmqHs0z25p~3-F)McfT?G$0#Jye| z8RND>1tp=A>bm08RK!pl(-gHOf@D=ecv zianR~p86vx?7qK6SiQ}QH<|7g2x0ZjuZD$Q;`GlG`5{1MF`nqDU}*P1L6tlI+cP0Y zL_s96x7WRsmB=d8v9TE?vIaWq_5ANemkwlwqQ9(|Ia4WA%43 zCG;5>eH+~&xm^iN=p>qcexdF4^^fpj$$a8tKt|8Xbc?dQi=Ut4k!6WvKwFFYtRYJFd|3<%J{tNvo zA0M02%-Zp-!=(107r8Wv6-0Zi0(A|Mi&fHo4E*m3cp!s5gY~cRf~Fwelj%a3!wJNE zDr@YH1jKu&Gcm#YN=+k)wWo&T$Us|jCNH&Fdbw!r&x~Mand0fdq~;m*Rp_FS&zkYN zu`f8G=Zc3Qt#((blRB^!me9vC&B8pI=B%2Vhuge|G*z$IsQ3LWHgRsjWp?B^BnRJQ zaK(!>BQX@7J^q~brbs*$Dpg8~{Z^c9lx`D@bbk+)Gcj5zyAcz;v&O#@%o`&^Ehyq7 z!s4KM6NyAix-GR&yj?_CWpM7hZ?whUvx3YW71w6UcA-x$&L3;8)C;+yfospF8%0b7 z2X5N3G%f8Q_upfgFxnWCTD)^qR57?$Br^l!FWoa?aE$KjXzKJHa)o!gpai45+EBtb z7Jp>rDUIg^eV!VVj@AUfBVlLIe1P`PS$ou#IplR({{u{2fiJD)iEXj)51(YrS@WKA z?xX^jS$e!zArZUpp~`g_%A{ui0~ieLbgKh+J(V?N&ysqS<0jLiUUQELnvbh{POx%? zsK&knUgZ$ObzqyF6vuk{-M;tl8ars$NgOgG#uxN}6$jVCc9@re| z1y%Wu2&4^N=KV7C2eSUhKJZcna{&Ysc03&$ILw%`g-~E%U$?# z#k6!UEkC8Nv)1oR^nO!i-szAG`>^c?%Fp`T?jkdL6(@`L z_Nlk00LqjG?;RZb<*WZf1d8#?R3h(-sGD&6k8 ziuGoJg5v-wqaC*j$**47E;3Z?_+F5FwRnskr>it^dR3=W=i(x`_RjlHkF3EQH>SBg zYeOFQ%Gd+>qE6G_*A+Xb!9gb0VMmxCcBjp^hTZeRfb`W1L918A?2GRor_nZHHMF&qO&=tB1w_%XByHY?e>8_v(Yu>W_9&CjT`U- zWA7kFsdzRfz*qlFXUaiSg?Ubo)_Ap9+yR-oTKpUxuq1QHM#*cqUBX8%Y<#DQ1yh{L zfVc2p=*HFL{ONV~x5fYGJ5Ps31G|Mxs!cRy(*o(V{OLEkI|?r zqX8gmt{daz?8@o!zMUyjvLJWDXpz6acWn}I9vI)Y&8HMe!rQNH&>d&aHoOZkGR-vm!aShS1*njPo*G>b%MZ$!4cE=CAx~88$HB!pP zT;sZ2CgSc^AcH)RkvV)kB^4@KwL56%4)c|`(;*ty=_`_06D=STH>P6xxD0BReCXf* zQnvckfzQ~-bwB*@L$`dlk+5gfri!F5S0uajhZ`bd6Q?+;I%pj3$G}V9m|>qSJzL(G zX5*d=SXhsRv%@m7eCMh80kZEG$;fBPXqkReq}VshX#6h{GRY}zu`NfiB@ss?46cYu zi)WU`kg%gNi9RPO`1pDk{P$lZ3Fy7MT?;-^JU3kV_>7~ahaSauXheTJqoI-p#**`+ zITL*CHX(9!_g44B-#v@_1G&nVrOw%$&cFJX6r$muN{E2HB>E5ezl9J)lHdW6IE@Yc zJ8?Sm--y$TS4BRSDFVmpLSA(awPJK02!c#f~gnqxtt+92G&;gukrf}ew9LBr$+^`{R#2ft3<{`{XRF#kjG zMfR8jXQaK9OZ3$A*(YXpmqX^JiYSPYfivVPEF{o|EV#a9XZyE4h>DalJtlek<;Jt2 zXOG-mIo#(jnf;{rPkDOmnZ?#G5+;eaeihoKNkNMd`Taoy&Utx?vVD?eC@?3FZS$!oug9Pru8 z1U=;GF}88xU!QTjV`DfL1>cB@t4ybj?sW@F71wcgVp)x~)B`x@?Ygxf97~rPgrnCF zKqCqEY$}etCaduLf%@2u&|^g?WN)&GNFVr;--x z3s$r+_KgYsEhRbEgG5+(RX1uCxR7F}2)38`9=86hk2t%6?Q(Q%-YOeUo8d`~Rgs-V zCuCYsSc}$p-OBcdzZt3_Vbacqst1slsLWbuy*9f7<5zX{dr#M0lk=&oXBh>^Yx8Nl zU*5LF-PN5`o5W$wwM-j6W8Fwpbf%++so9jLC8iy~IEu-Tl z#hAV@)vB#Ilqp5>VXBUxg4^xCNcg4LETkFEyizHtz1a;@RX>J;%nWzBkr)+8rH=(~ zo_{w!Ug!$QTgsve6Ixx`?2_1Y&a@X^E1LKw(fhHG4){m{rHIzO4+oY(Mv}_&{(Eo; eB+%~To=~X$A+O6PW(sb+%pBXoL{-bLiT?w1omN-? literal 29467 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%0AaD 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 T9S5<@vmHI@;eVa*yPf$TYTP0d diff --git a/framework/assets/css/style-rtl.min.css b/framework/assets/css/style-rtl.min.css old mode 100644 new mode 100755 diff --git a/framework/assets/css/style.min.css b/framework/assets/css/style.min.css old mode 100644 new mode 100755 diff --git a/framework/assets/images/checkerboard.png b/framework/assets/images/checkerboard.png old mode 100644 new mode 100755 diff --git a/framework/assets/images/wp-logo.svg b/framework/assets/images/wp-logo.svg old mode 100644 new mode 100755 diff --git a/framework/assets/images/wp-plugin-logo.svg b/framework/assets/images/wp-plugin-logo.svg old mode 100644 new mode 100755 diff --git a/framework/assets/js/main.min.js b/framework/assets/js/main.min.js old mode 100644 new mode 100755 diff --git a/framework/assets/js/plugins.min.js b/framework/assets/js/plugins.min.js old mode 100644 new mode 100755 diff --git a/framework/classes/abstract.class.php b/framework/classes/abstract.class.php old mode 100644 new mode 100755 diff --git a/framework/classes/admin-options.class.php b/framework/classes/admin-options.class.php old mode 100644 new mode 100755 diff --git a/framework/classes/fields.class.php b/framework/classes/fields.class.php old mode 100644 new mode 100755 diff --git a/framework/fields/accordion/accordion.php b/framework/fields/accordion/accordion.php old mode 100644 new mode 100755 diff --git a/framework/fields/background/background.php b/framework/fields/background/background.php old mode 100644 new mode 100755 diff --git a/framework/fields/backup/backup.php b/framework/fields/backup/backup.php old mode 100644 new mode 100755 diff --git a/framework/fields/border/border.php b/framework/fields/border/border.php old mode 100644 new mode 100755 diff --git a/framework/fields/button_set/button_set.php b/framework/fields/button_set/button_set.php old mode 100644 new mode 100755 diff --git a/framework/fields/callback/callback.php b/framework/fields/callback/callback.php old mode 100644 new mode 100755 diff --git a/framework/fields/checkbox/checkbox.php b/framework/fields/checkbox/checkbox.php old mode 100644 new mode 100755 diff --git a/framework/fields/code_editor/code_editor.php b/framework/fields/code_editor/code_editor.php old mode 100644 new mode 100755 diff --git a/framework/fields/color/color.php b/framework/fields/color/color.php old mode 100644 new mode 100755 diff --git a/framework/fields/color_group/color_group.php b/framework/fields/color_group/color_group.php old mode 100644 new mode 100755 diff --git a/framework/fields/content/content.php b/framework/fields/content/content.php old mode 100644 new mode 100755 diff --git a/framework/fields/date/date.php b/framework/fields/date/date.php old mode 100644 new mode 100755 diff --git a/framework/fields/datetime/datetime.php b/framework/fields/datetime/datetime.php old mode 100644 new mode 100755 diff --git a/framework/fields/dimensions/dimensions.php b/framework/fields/dimensions/dimensions.php old mode 100644 new mode 100755 diff --git a/framework/fields/fieldset/fieldset.php b/framework/fields/fieldset/fieldset.php old mode 100644 new mode 100755 diff --git a/framework/fields/gallery/gallery.php b/framework/fields/gallery/gallery.php old mode 100644 new mode 100755 diff --git a/framework/fields/group/group.php b/framework/fields/group/group.php old mode 100644 new mode 100755 diff --git a/framework/fields/heading/heading.php b/framework/fields/heading/heading.php old mode 100644 new mode 100755 diff --git a/framework/fields/icon/fa4-icons.php b/framework/fields/icon/fa4-icons.php old mode 100644 new mode 100755 diff --git a/framework/fields/icon/fa5-icons.php b/framework/fields/icon/fa5-icons.php old mode 100644 new mode 100755 diff --git a/framework/fields/icon/icon.php b/framework/fields/icon/icon.php old mode 100644 new mode 100755 diff --git a/framework/fields/image_select/image_select.php b/framework/fields/image_select/image_select.php old mode 100644 new mode 100755 diff --git a/framework/fields/index.php b/framework/fields/index.php old mode 100644 new mode 100755 diff --git a/framework/fields/link/link.php b/framework/fields/link/link.php old mode 100644 new mode 100755 diff --git a/framework/fields/link_color/link_color.php b/framework/fields/link_color/link_color.php old mode 100644 new mode 100755 diff --git a/framework/fields/map/map.php b/framework/fields/map/map.php old mode 100644 new mode 100755 diff --git a/framework/fields/media/media.php b/framework/fields/media/media.php old mode 100644 new mode 100755 diff --git a/framework/fields/notice/notice.php b/framework/fields/notice/notice.php old mode 100644 new mode 100755 diff --git a/framework/fields/number/number.php b/framework/fields/number/number.php old mode 100644 new mode 100755 diff --git a/framework/fields/palette/palette.php b/framework/fields/palette/palette.php old mode 100644 new mode 100755 diff --git a/framework/fields/radio/radio.php b/framework/fields/radio/radio.php old mode 100644 new mode 100755 diff --git a/framework/fields/repeater/repeater.php b/framework/fields/repeater/repeater.php old mode 100644 new mode 100755 diff --git a/framework/fields/select/select.php b/framework/fields/select/select.php old mode 100644 new mode 100755 diff --git a/framework/fields/slider/slider.php b/framework/fields/slider/slider.php old mode 100644 new mode 100755 diff --git a/framework/fields/sortable/sortable.php b/framework/fields/sortable/sortable.php old mode 100644 new mode 100755 diff --git a/framework/fields/sorter/sorter.php b/framework/fields/sorter/sorter.php old mode 100644 new mode 100755 diff --git a/framework/fields/spacing/spacing.php b/framework/fields/spacing/spacing.php old mode 100644 new mode 100755 diff --git a/framework/fields/spinner/spinner.php b/framework/fields/spinner/spinner.php old mode 100644 new mode 100755 diff --git a/framework/fields/subheading/subheading.php b/framework/fields/subheading/subheading.php old mode 100644 new mode 100755 diff --git a/framework/fields/submessage/submessage.php b/framework/fields/submessage/submessage.php old mode 100644 new mode 100755 diff --git a/framework/fields/switcher/switcher.php b/framework/fields/switcher/switcher.php old mode 100644 new mode 100755 diff --git a/framework/fields/tabbed/tabbed.php b/framework/fields/tabbed/tabbed.php old mode 100644 new mode 100755 diff --git a/framework/fields/text/text.php b/framework/fields/text/text.php old mode 100644 new mode 100755 diff --git a/framework/fields/textarea/textarea.php b/framework/fields/textarea/textarea.php old mode 100644 new mode 100755 diff --git a/framework/fields/typography/google-fonts.php b/framework/fields/typography/google-fonts.php old mode 100644 new mode 100755 diff --git a/framework/fields/typography/typography.php b/framework/fields/typography/typography.php old mode 100644 new mode 100755 diff --git a/framework/fields/upload/upload.php b/framework/fields/upload/upload.php old mode 100644 new mode 100755 diff --git a/framework/fields/wp_editor/wp_editor.php b/framework/fields/wp_editor/wp_editor.php old mode 100644 new mode 100755 diff --git a/framework/functions/actions.php b/framework/functions/actions.php old mode 100644 new mode 100755 diff --git a/framework/functions/customize.php b/framework/functions/customize.php old mode 100644 new mode 100755 diff --git a/framework/functions/helpers.php b/framework/functions/helpers.php old mode 100644 new mode 100755 diff --git a/framework/functions/sanitize.php b/framework/functions/sanitize.php old mode 100644 new mode 100755 diff --git a/framework/functions/validate.php b/framework/functions/validate.php old mode 100644 new mode 100755 diff --git a/framework/functions/walker.php b/framework/functions/walker.php old mode 100644 new mode 100755 diff --git a/framework/index.php b/framework/index.php old mode 100644 new mode 100755 diff --git a/framework/languages/zh_CN.mo b/framework/languages/zh_CN.mo old mode 100644 new mode 100755 diff --git a/framework/languages/zh_CN.po b/framework/languages/zh_CN.po old mode 100644 new mode 100755 index 4121676..6c4bfc3 --- a/framework/languages/zh_CN.po +++ b/framework/languages/zh_CN.po @@ -1,672 +1,672 @@ -# Copyright (C) 2021 Wp_china_yes -# This file is distributed under the same license as the Wp_china_yes Framework package. -msgid "" -msgstr "" -"POT-Creation-Date: 2021-06-25 12:32:35+00:00\n" -"PO-Revision-Date: 2021-08-19 12:18+0800\n" -"Last-Translator: Seaton Jiang \n" -"Language-Team: \n" -"Language: zh_CN\n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: 8bit\n" -"X-Generator: Poedit 2.4.3\n" -"Project-Id-Version: \n" - -#: classes/admin-options.class.php:226 -msgid "Error while saving the changes." -msgstr "保存失败" - -#: classes/admin-options.class.php:286 -msgid "Settings successfully imported." -msgstr "导入成功" - -#: classes/admin-options.class.php:298 classes/admin-options.class.php:314 -msgid "Default settings restored." -msgstr "恢复完成" - -#: classes/admin-options.class.php:385 -msgid "Settings saved." -msgstr "保存成功" - -#: classes/admin-options.class.php:565 -msgid "You have unsaved changes, save your changes!" -msgstr "配置发生改变,请勿忘记保存!" - -#: classes/admin-options.class.php:567 -msgid "show all settings" -msgstr "显示所有设置" - -#: classes/admin-options.class.php:569 fields/icon/icon.php:57 -#: fields/map/map.php:23 -msgid "Search..." -msgstr "请输入关键词" - -#: classes/admin-options.class.php:572 classes/admin-options.class.php:695 -msgid "Save" -msgstr "保存配置" - -#: classes/admin-options.class.php:572 classes/admin-options.class.php:695 -msgid "Saving..." -msgstr "正在保存" - -#: classes/admin-options.class.php:573 classes/admin-options.class.php:696 -msgid "Reset Section" -msgstr "恢复此页" - -#: classes/admin-options.class.php:573 classes/admin-options.class.php:696 -msgid "Are you sure to reset this section options?" -msgstr "单击「确定」进行恢复,当前页面的配置将会丢失!" - -#: classes/admin-options.class.php:574 classes/admin-options.class.php:697 -msgid "Reset All" -msgstr "恢复全部" - -#: classes/admin-options.class.php:574 classes/admin-options.class.php:697 -#: classes/comment-options.class.php:216 classes/metabox-options.class.php:294 -#: fields/backup/backup.php:31 -msgid "Reset" -msgstr "恢复默认" - -#: classes/admin-options.class.php:574 classes/admin-options.class.php:697 -msgid "Are you sure you want to reset all settings to default values?" -msgstr "单击「确定」进行恢复,所有页面的配置都将丢失!" - -#: classes/admin-options.class.php:672 classes/comment-options.class.php:199 -#: classes/metabox-options.class.php:277 fields/button_set/button_set.php:56 -#: fields/checkbox/checkbox.php:76 fields/radio/radio.php:75 -#: fields/select/select.php:113 functions/actions.php:41 -msgid "No data available." -msgstr "没有可用数据" - -#: classes/comment-options.class.php:217 classes/metabox-options.class.php:295 -msgid "update post" -msgstr "更新文章" - -#: classes/comment-options.class.php:217 classes/metabox-options.class.php:295 -msgid "Cancel" -msgstr "取消" - -#: classes/setup.class.php:592 -msgid "Are you sure?" -msgstr "单击「确定」进行下一步操作,该操作可能会丢失部分配置!" - -#: classes/setup.class.php:593 -msgid "Please enter %s or more characters" -msgstr "请输入 %s 或更多字符" - -#: classes/setup.class.php:594 -msgid "Searching..." -msgstr "搜索中..." - -#: classes/setup.class.php:595 -msgid "No results found." -msgstr "未找到结果。" - -#: classes/setup.class.php:696 -msgid "Oops! Not allowed." -msgstr "哎呀!不允许。" - -#: classes/setup.class.php:768 classes/setup.class.php:772 -msgid "Field not found!" -msgstr "没有找到任何数据" - -#: classes/shortcode-options.class.php:253 fields/group/group.php:23 -msgid "Add New" -msgstr "新增" - -#: classes/shortcode-options.class.php:290 functions/actions.php:16 -#: functions/actions.php:68 functions/actions.php:106 functions/actions.php:141 -#: functions/actions.php:170 -msgid "Error: Invalid nonce verification." -msgstr "错误: 无效的nonce验证。" - -#: fields/background/background.php:36 fields/media/media.php:59 -msgid "Not selected" -msgstr "未选择" - -#: fields/background/background.php:72 fields/date/date.php:31 -msgid "From" -msgstr "从" - -#: fields/background/background.php:90 fields/date/date.php:32 -msgid "To" -msgstr "到" - -#: fields/background/background.php:108 -msgid "Direction" -msgstr "方向" - -#: fields/background/background.php:114 -msgid "Gradient Direction" -msgstr "渐变方向" - -#: fields/background/background.php:115 -msgid "⇓ top to bottom" -msgstr "⇓ 从上到下" - -#: fields/background/background.php:116 -msgid "⇒ left to right" -msgstr "⇒从左到右" - -#: fields/background/background.php:117 -msgid "⇘ corner top to right" -msgstr "⇘ 右上角" - -#: fields/background/background.php:118 -msgid "⇙ corner top to left" -msgstr "⇘ 左上角" - -#: fields/background/background.php:161 -msgid "Background Position" -msgstr "背景位置" - -#: fields/background/background.php:162 -msgid "Left Top" -msgstr "左上" - -#: fields/background/background.php:163 -msgid "Left Center" -msgstr "左中" - -#: fields/background/background.php:164 -msgid "Left Bottom" -msgstr "左下" - -#: fields/background/background.php:165 -msgid "Center Top" -msgstr "中上" - -#: fields/background/background.php:166 -msgid "Center Center" -msgstr "居中" - -#: fields/background/background.php:167 -msgid "Center Bottom" -msgstr "中下" - -#: fields/background/background.php:168 -msgid "Right Top" -msgstr "右上" - -#: fields/background/background.php:169 -msgid "Right Center" -msgstr "右中" - -#: fields/background/background.php:170 -msgid "Right Bottom" -msgstr "右下" - -#: fields/background/background.php:184 -msgid "Background Repeat" -msgstr "背景重复" - -#: fields/background/background.php:185 -msgid "Repeat" -msgstr "重复" - -#: fields/background/background.php:186 -msgid "No Repeat" -msgstr "不重复" - -#: fields/background/background.php:187 -msgid "Repeat Horizontally" -msgstr "水平重复" - -#: fields/background/background.php:188 -msgid "Repeat Vertically" -msgstr "垂直重复" - -#: fields/background/background.php:202 -msgid "Background Attachment" -msgstr "背景附件" - -#: fields/background/background.php:203 -msgid "Scroll" -msgstr "滚动" - -#: fields/background/background.php:204 -msgid "Fixed" -msgstr "固定" - -#: fields/background/background.php:218 -msgid "Background Size" -msgstr "背景大小" - -#: fields/background/background.php:219 -msgid "Cover" -msgstr "覆盖" - -#: fields/background/background.php:220 -msgid "Contain" -msgstr "包含" - -#: fields/background/background.php:221 -msgid "Auto" -msgstr "自动" - -#: fields/background/background.php:235 -msgid "Background Origin" -msgstr "背景起源" - -#: fields/background/background.php:236 fields/background/background.php:254 -msgid "Padding Box" -msgstr "框内边距" - -#: fields/background/background.php:237 fields/background/background.php:253 -msgid "Border Box" -msgstr "边框" - -#: fields/background/background.php:238 fields/background/background.php:255 -msgid "Content Box" -msgstr "内容框" - -#: fields/background/background.php:252 -msgid "Background Clip" -msgstr "背景剪辑" - -#: fields/background/background.php:269 -msgid "Background Blend Mode" -msgstr "背景混合模式" - -#: fields/background/background.php:270 fields/link_color/link_color.php:36 -#: fields/typography/typography.php:186 -msgid "Normal" -msgstr "正常" - -#: fields/background/background.php:271 -msgid "Multiply" -msgstr "乘" - -#: fields/background/background.php:272 -msgid "Screen" -msgstr "屏幕" - -#: fields/background/background.php:273 -msgid "Overlay" -msgstr "覆盖" - -#: fields/background/background.php:274 -msgid "Darken" -msgstr "变黑" - -#: fields/background/background.php:275 -msgid "Lighten" -msgstr "减轻" - -#: fields/background/background.php:276 -msgid "Color Dodge" -msgstr "颜色减淡" - -#: fields/background/background.php:277 -msgid "Saturation" -msgstr "饱和度" - -#: fields/background/background.php:278 -msgid "Color" -msgstr "颜色" - -#: fields/background/background.php:279 -msgid "Luminosity" -msgstr "光度" - -#: fields/backup/backup.php:26 -msgid "Import" -msgstr "导入" - -#: fields/backup/backup.php:29 -msgid "Export & Download" -msgstr "导出和下载" - -#: fields/border/border.php:25 fields/spacing/spacing.php:25 -msgid "top" -msgstr "顶部" - -#: fields/border/border.php:26 fields/spacing/spacing.php:26 -msgid "right" -msgstr "右" - -#: fields/border/border.php:27 fields/spacing/spacing.php:27 -msgid "bottom" -msgstr "底部" - -#: fields/border/border.php:28 fields/spacing/spacing.php:28 -msgid "left" -msgstr "左" - -#: fields/border/border.php:29 fields/spacing/spacing.php:29 -msgid "all" -msgstr "所有" - -#: fields/border/border.php:51 fields/typography/typography.php:214 -msgid "Solid" -msgstr "实线" - -#: fields/border/border.php:52 fields/typography/typography.php:217 -msgid "Dashed" -msgstr "虚线" - -#: fields/border/border.php:53 fields/typography/typography.php:216 -msgid "Dotted" -msgstr "点线" - -#: fields/border/border.php:54 fields/typography/typography.php:215 -msgid "Double" -msgstr "双线" - -#: fields/border/border.php:55 -msgid "Inset" -msgstr "插入" - -#: fields/border/border.php:56 -msgid "Outset" -msgstr "开始" - -#: fields/border/border.php:57 -msgid "Groove" -msgstr "凹槽" - -#: fields/border/border.php:58 -msgid "ridge" -msgstr "凸出" - -#: fields/border/border.php:59 fields/typography/typography.php:199 -#: fields/typography/typography.php:213 -msgid "None" -msgstr "无" - -#: fields/dimensions/dimensions.php:22 -msgid "width" -msgstr "宽度" - -#: fields/dimensions/dimensions.php:23 -msgid "height" -msgstr "高度" - -#: fields/gallery/gallery.php:20 -msgid "Add Gallery" -msgstr "添加图库" - -#: fields/gallery/gallery.php:21 -msgid "Edit Gallery" -msgstr "编辑图库" - -#: fields/gallery/gallery.php:22 -msgid "Clear" -msgstr "清除" - -#: fields/group/group.php:35 fields/repeater/repeater.php:27 -msgid "Error: Field ID conflict." -msgstr "错误:字段ID冲突。" - -#: fields/group/group.php:46 fields/group/group.php:87 -#: fields/repeater/repeater.php:48 fields/repeater/repeater.php:76 -msgid "Are you sure to delete this item?" -msgstr "确定要删除这个项目吗?" - -#: fields/group/group.php:121 fields/repeater/repeater.php:89 -msgid "You cannot add more." -msgstr "无法添加更多" - -#: fields/group/group.php:122 fields/repeater/repeater.php:90 -msgid "You cannot remove more." -msgstr "无法删除更多" - -#: fields/icon/icon.php:20 fields/icon/icon.php:53 -msgid "Add Icon" -msgstr "添加图标" - -#: fields/icon/icon.php:21 -msgid "Remove Icon" -msgstr "删除图标" - -#: fields/link/link.php:20 -msgid "Add Link" -msgstr "添加链接" - -#: fields/link/link.php:21 -msgid "Edit Link" -msgstr "编辑链接" - -#: fields/link/link.php:22 -msgid "Remove Link" -msgstr "移除链接" - -#: fields/link_color/link_color.php:37 -msgid "Hover" -msgstr "悬停" - -#: fields/link_color/link_color.php:38 -msgid "Active" -msgstr "启用" - -#: fields/link_color/link_color.php:39 -msgid "Visited" -msgstr "访问" - -#: fields/link_color/link_color.php:40 -msgid "Focus" -msgstr "焦点" - -#: fields/map/map.php:24 -msgid "Latitude" -msgstr "纬度" - -#: fields/map/map.php:25 -msgid "Longitude" -msgstr "经度" - -#: fields/media/media.php:25 fields/upload/upload.php:25 -msgid "Upload" -msgstr "上传" - -#: fields/media/media.php:26 fields/upload/upload.php:26 -msgid "Remove" -msgstr "删除" - -#: fields/sorter/sorter.php:21 -msgid "Enabled" -msgstr "启用" - -#: fields/sorter/sorter.php:22 -msgid "Disabled" -msgstr "禁用" - -#: fields/switcher/switcher.php:20 -msgid "On" -msgstr "启用" - -#: fields/switcher/switcher.php:21 -msgid "Off" -msgstr "禁用" - -#: fields/typography/typography.php:96 -msgid "Font Family" -msgstr "字体" - -#: fields/typography/typography.php:97 -msgid "Select a font" -msgstr "选择字体" - -#: fields/typography/typography.php:105 -msgid "Backup Font Family" -msgstr "备份字体系列" - -#: fields/typography/typography.php:119 fields/typography/typography.php:132 -#: fields/typography/typography.php:145 fields/typography/typography.php:160 -#: fields/typography/typography.php:176 fields/typography/typography.php:189 -#: fields/typography/typography.php:203 fields/typography/typography.php:221 -msgid "Default" -msgstr "默认" - -#: fields/typography/typography.php:130 -msgid "Font Style" -msgstr "字体样式" - -#: fields/typography/typography.php:144 fields/typography/typography.php:145 -msgid "Load Extra Styles" -msgstr "加载额外样式" - -#: fields/typography/typography.php:158 -msgid "Subset" -msgstr "子集" - -#: fields/typography/typography.php:168 -msgid "Text Align" -msgstr "文本对齐" - -#: fields/typography/typography.php:170 -msgid "Inherit" -msgstr "继承" - -#: fields/typography/typography.php:171 -msgid "Left" -msgstr "左侧" - -#: fields/typography/typography.php:172 -msgid "Center" -msgstr "居中" - -#: fields/typography/typography.php:173 -msgid "Right" -msgstr "右侧" - -#: fields/typography/typography.php:174 -msgid "Justify" -msgstr "两端对齐" - -#: fields/typography/typography.php:175 -msgid "Initial" -msgstr "初始" - -#: fields/typography/typography.php:184 -msgid "Font Variant" -msgstr "字体变体" - -#: fields/typography/typography.php:187 -msgid "Small Caps" -msgstr "小写" - -#: fields/typography/typography.php:188 -msgid "All Small Caps" -msgstr "所有字母小写" - -#: fields/typography/typography.php:197 -msgid "Text Transform" -msgstr "文本转换" - -#: fields/typography/typography.php:200 -msgid "Capitalize" -msgstr "大写" - -#: fields/typography/typography.php:201 -msgid "Uppercase" -msgstr "大写" - -#: fields/typography/typography.php:202 -msgid "Lowercase" -msgstr "小写" - -#: fields/typography/typography.php:211 -msgid "Text Decoration" -msgstr "文本装饰" - -#: fields/typography/typography.php:218 -msgid "Wavy" -msgstr "波浪" - -#: fields/typography/typography.php:219 -msgid "Overline" -msgstr "上划线" - -#: fields/typography/typography.php:220 -msgid "Line-through" -msgstr "删除线" - -#: fields/typography/typography.php:233 -msgid "Font Size" -msgstr "字体大小" - -#: fields/typography/typography.php:245 -msgid "Line Height" -msgstr "线高度" - -#: fields/typography/typography.php:257 -msgid "Letter Spacing" -msgstr "字母间距" - -#: fields/typography/typography.php:269 -msgid "Word Spacing" -msgstr "字间距" - -#: fields/typography/typography.php:284 -msgid "Font Color" -msgstr "字体颜色" - -#: fields/typography/typography.php:295 -msgid "Custom Style" -msgstr "自定义样式" - -#: fields/typography/typography.php:362 -msgid "Custom Web Fonts" -msgstr "自定义 Web 字体" - -#: fields/typography/typography.php:368 -msgid "Safe Web Fonts" -msgstr "Web 安全字体" - -#: fields/typography/typography.php:388 -msgid "Google Web Fonts" -msgstr "Google Web 字体" - -#: functions/actions.php:72 functions/actions.php:110 -msgid "Error: Invalid key." -msgstr "错误:无效密钥。" - -#: functions/actions.php:114 -msgid "Error: The response is not a valid JSON response." -msgstr "错误:响应不是有效的 JSON 响应。" - -#: functions/actions.php:174 -msgid "Error: Invalid term ID." -msgstr "错误:无效的项目ID。" - -#: functions/actions.php:180 -msgid "Error: You do not have permission to do that." -msgstr "错误:您无权这样做。" - -#: functions/validate.php:14 functions/validate.php:86 -msgid "Please enter a valid email address." -msgstr "请输入正确的电子邮件地址。" - -#: functions/validate.php:32 functions/validate.php:106 -msgid "Please enter a valid number." -msgstr "请输入有效的数字" - -#: functions/validate.php:50 functions/validate.php:126 -msgid "This field is required." -msgstr "这是必填栏。" - -#: functions/validate.php:68 functions/validate.php:146 -msgid "Please enter a valid URL." -msgstr "请输入有效网址" - -#. Plugin Name of the plugin/theme -msgid "Wp_china_yes Framework" -msgstr "Wp_china_yes Framework" - -#. Plugin URI of the plugin/theme -msgid "http://wp_china_yesframework.com/" -msgstr "http://wp_china_yesframework.com/" - -#. Description of the plugin/theme -msgid "A Simple and Lightweight WordPress Option Framework for Themes and Plugins" -msgstr "一个简单且轻量的 WordPress 主题和插件选项框架" - -#. Author of the plugin/theme -msgid "Wp_china_yes" -msgstr "Wp_china_yes" - -#. Author URI of the plugin/theme -msgid "http://wp_china_yesthemes.com/" -msgstr "http://wp_china_yesthemes.com/" +# Copyright (C) 2021 Wp_china_yes +# This file is distributed under the same license as the Wp_china_yes Framework package. +msgid "" +msgstr "" +"POT-Creation-Date: 2021-06-25 12:32:35+00:00\n" +"PO-Revision-Date: 2021-08-19 12:18+0800\n" +"Last-Translator: Seaton Jiang \n" +"Language-Team: \n" +"Language: zh_CN\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"X-Generator: Poedit 2.4.3\n" +"Project-Id-Version: \n" + +#: classes/admin-options.class.php:226 +msgid "Error while saving the changes." +msgstr "保存失败" + +#: classes/admin-options.class.php:286 +msgid "Settings successfully imported." +msgstr "导入成功" + +#: classes/admin-options.class.php:298 classes/admin-options.class.php:314 +msgid "Default settings restored." +msgstr "恢复完成" + +#: classes/admin-options.class.php:385 +msgid "Settings saved." +msgstr "保存成功" + +#: classes/admin-options.class.php:565 +msgid "You have unsaved changes, save your changes!" +msgstr "配置发生改变,请勿忘记保存!" + +#: classes/admin-options.class.php:567 +msgid "show all settings" +msgstr "显示所有设置" + +#: classes/admin-options.class.php:569 fields/icon/icon.php:57 +#: fields/map/map.php:23 +msgid "Search..." +msgstr "请输入关键词" + +#: classes/admin-options.class.php:572 classes/admin-options.class.php:695 +msgid "Save" +msgstr "保存配置" + +#: classes/admin-options.class.php:572 classes/admin-options.class.php:695 +msgid "Saving..." +msgstr "正在保存" + +#: classes/admin-options.class.php:573 classes/admin-options.class.php:696 +msgid "Reset Section" +msgstr "恢复此页" + +#: classes/admin-options.class.php:573 classes/admin-options.class.php:696 +msgid "Are you sure to reset this section options?" +msgstr "单击「确定」进行恢复,当前页面的配置将会丢失!" + +#: classes/admin-options.class.php:574 classes/admin-options.class.php:697 +msgid "Reset All" +msgstr "恢复全部" + +#: classes/admin-options.class.php:574 classes/admin-options.class.php:697 +#: classes/comment-options.class.php:216 classes/metabox-options.class.php:294 +#: fields/backup/backup.php:31 +msgid "Reset" +msgstr "恢复默认" + +#: classes/admin-options.class.php:574 classes/admin-options.class.php:697 +msgid "Are you sure you want to reset all settings to default values?" +msgstr "单击「确定」进行恢复,所有页面的配置都将丢失!" + +#: classes/admin-options.class.php:672 classes/comment-options.class.php:199 +#: classes/metabox-options.class.php:277 fields/button_set/button_set.php:56 +#: fields/checkbox/checkbox.php:76 fields/radio/radio.php:75 +#: fields/select/select.php:113 functions/actions.php:41 +msgid "No data available." +msgstr "没有可用数据" + +#: classes/comment-options.class.php:217 classes/metabox-options.class.php:295 +msgid "update post" +msgstr "更新文章" + +#: classes/comment-options.class.php:217 classes/metabox-options.class.php:295 +msgid "Cancel" +msgstr "取消" + +#: classes/setup.class.php:592 +msgid "Are you sure?" +msgstr "单击「确定」进行下一步操作,该操作可能会丢失部分配置!" + +#: classes/setup.class.php:593 +msgid "Please enter %s or more characters" +msgstr "请输入 %s 或更多字符" + +#: classes/setup.class.php:594 +msgid "Searching..." +msgstr "搜索中..." + +#: classes/setup.class.php:595 +msgid "No results found." +msgstr "未找到结果。" + +#: classes/setup.class.php:696 +msgid "Oops! Not allowed." +msgstr "哎呀!不允许。" + +#: classes/setup.class.php:768 classes/setup.class.php:772 +msgid "Field not found!" +msgstr "没有找到任何数据" + +#: classes/shortcode-options.class.php:253 fields/group/group.php:23 +msgid "Add New" +msgstr "新增" + +#: classes/shortcode-options.class.php:290 functions/actions.php:16 +#: functions/actions.php:68 functions/actions.php:106 functions/actions.php:141 +#: functions/actions.php:170 +msgid "Error: Invalid nonce verification." +msgstr "错误: 无效的nonce验证。" + +#: fields/background/background.php:36 fields/media/media.php:59 +msgid "Not selected" +msgstr "未选择" + +#: fields/background/background.php:72 fields/date/date.php:31 +msgid "From" +msgstr "从" + +#: fields/background/background.php:90 fields/date/date.php:32 +msgid "To" +msgstr "到" + +#: fields/background/background.php:108 +msgid "Direction" +msgstr "方向" + +#: fields/background/background.php:114 +msgid "Gradient Direction" +msgstr "渐变方向" + +#: fields/background/background.php:115 +msgid "⇓ top to bottom" +msgstr "⇓ 从上到下" + +#: fields/background/background.php:116 +msgid "⇒ left to right" +msgstr "⇒从左到右" + +#: fields/background/background.php:117 +msgid "⇘ corner top to right" +msgstr "⇘ 右上角" + +#: fields/background/background.php:118 +msgid "⇙ corner top to left" +msgstr "⇘ 左上角" + +#: fields/background/background.php:161 +msgid "Background Position" +msgstr "背景位置" + +#: fields/background/background.php:162 +msgid "Left Top" +msgstr "左上" + +#: fields/background/background.php:163 +msgid "Left Center" +msgstr "左中" + +#: fields/background/background.php:164 +msgid "Left Bottom" +msgstr "左下" + +#: fields/background/background.php:165 +msgid "Center Top" +msgstr "中上" + +#: fields/background/background.php:166 +msgid "Center Center" +msgstr "居中" + +#: fields/background/background.php:167 +msgid "Center Bottom" +msgstr "中下" + +#: fields/background/background.php:168 +msgid "Right Top" +msgstr "右上" + +#: fields/background/background.php:169 +msgid "Right Center" +msgstr "右中" + +#: fields/background/background.php:170 +msgid "Right Bottom" +msgstr "右下" + +#: fields/background/background.php:184 +msgid "Background Repeat" +msgstr "背景重复" + +#: fields/background/background.php:185 +msgid "Repeat" +msgstr "重复" + +#: fields/background/background.php:186 +msgid "No Repeat" +msgstr "不重复" + +#: fields/background/background.php:187 +msgid "Repeat Horizontally" +msgstr "水平重复" + +#: fields/background/background.php:188 +msgid "Repeat Vertically" +msgstr "垂直重复" + +#: fields/background/background.php:202 +msgid "Background Attachment" +msgstr "背景附件" + +#: fields/background/background.php:203 +msgid "Scroll" +msgstr "滚动" + +#: fields/background/background.php:204 +msgid "Fixed" +msgstr "固定" + +#: fields/background/background.php:218 +msgid "Background Size" +msgstr "背景大小" + +#: fields/background/background.php:219 +msgid "Cover" +msgstr "覆盖" + +#: fields/background/background.php:220 +msgid "Contain" +msgstr "包含" + +#: fields/background/background.php:221 +msgid "Auto" +msgstr "自动" + +#: fields/background/background.php:235 +msgid "Background Origin" +msgstr "背景起源" + +#: fields/background/background.php:236 fields/background/background.php:254 +msgid "Padding Box" +msgstr "框内边距" + +#: fields/background/background.php:237 fields/background/background.php:253 +msgid "Border Box" +msgstr "边框" + +#: fields/background/background.php:238 fields/background/background.php:255 +msgid "Content Box" +msgstr "内容框" + +#: fields/background/background.php:252 +msgid "Background Clip" +msgstr "背景剪辑" + +#: fields/background/background.php:269 +msgid "Background Blend Mode" +msgstr "背景混合模式" + +#: fields/background/background.php:270 fields/link_color/link_color.php:36 +#: fields/typography/typography.php:186 +msgid "Normal" +msgstr "正常" + +#: fields/background/background.php:271 +msgid "Multiply" +msgstr "乘" + +#: fields/background/background.php:272 +msgid "Screen" +msgstr "屏幕" + +#: fields/background/background.php:273 +msgid "Overlay" +msgstr "覆盖" + +#: fields/background/background.php:274 +msgid "Darken" +msgstr "变黑" + +#: fields/background/background.php:275 +msgid "Lighten" +msgstr "减轻" + +#: fields/background/background.php:276 +msgid "Color Dodge" +msgstr "颜色减淡" + +#: fields/background/background.php:277 +msgid "Saturation" +msgstr "饱和度" + +#: fields/background/background.php:278 +msgid "Color" +msgstr "颜色" + +#: fields/background/background.php:279 +msgid "Luminosity" +msgstr "光度" + +#: fields/backup/backup.php:26 +msgid "Import" +msgstr "导入" + +#: fields/backup/backup.php:29 +msgid "Export & Download" +msgstr "导出和下载" + +#: fields/border/border.php:25 fields/spacing/spacing.php:25 +msgid "top" +msgstr "顶部" + +#: fields/border/border.php:26 fields/spacing/spacing.php:26 +msgid "right" +msgstr "右" + +#: fields/border/border.php:27 fields/spacing/spacing.php:27 +msgid "bottom" +msgstr "底部" + +#: fields/border/border.php:28 fields/spacing/spacing.php:28 +msgid "left" +msgstr "左" + +#: fields/border/border.php:29 fields/spacing/spacing.php:29 +msgid "all" +msgstr "所有" + +#: fields/border/border.php:51 fields/typography/typography.php:214 +msgid "Solid" +msgstr "实线" + +#: fields/border/border.php:52 fields/typography/typography.php:217 +msgid "Dashed" +msgstr "虚线" + +#: fields/border/border.php:53 fields/typography/typography.php:216 +msgid "Dotted" +msgstr "点线" + +#: fields/border/border.php:54 fields/typography/typography.php:215 +msgid "Double" +msgstr "双线" + +#: fields/border/border.php:55 +msgid "Inset" +msgstr "插入" + +#: fields/border/border.php:56 +msgid "Outset" +msgstr "开始" + +#: fields/border/border.php:57 +msgid "Groove" +msgstr "凹槽" + +#: fields/border/border.php:58 +msgid "ridge" +msgstr "凸出" + +#: fields/border/border.php:59 fields/typography/typography.php:199 +#: fields/typography/typography.php:213 +msgid "None" +msgstr "无" + +#: fields/dimensions/dimensions.php:22 +msgid "width" +msgstr "宽度" + +#: fields/dimensions/dimensions.php:23 +msgid "height" +msgstr "高度" + +#: fields/gallery/gallery.php:20 +msgid "Add Gallery" +msgstr "添加图库" + +#: fields/gallery/gallery.php:21 +msgid "Edit Gallery" +msgstr "编辑图库" + +#: fields/gallery/gallery.php:22 +msgid "Clear" +msgstr "清除" + +#: fields/group/group.php:35 fields/repeater/repeater.php:27 +msgid "Error: Field ID conflict." +msgstr "错误:字段ID冲突。" + +#: fields/group/group.php:46 fields/group/group.php:87 +#: fields/repeater/repeater.php:48 fields/repeater/repeater.php:76 +msgid "Are you sure to delete this item?" +msgstr "确定要删除这个项目吗?" + +#: fields/group/group.php:121 fields/repeater/repeater.php:89 +msgid "You cannot add more." +msgstr "无法添加更多" + +#: fields/group/group.php:122 fields/repeater/repeater.php:90 +msgid "You cannot remove more." +msgstr "无法删除更多" + +#: fields/icon/icon.php:20 fields/icon/icon.php:53 +msgid "Add Icon" +msgstr "添加图标" + +#: fields/icon/icon.php:21 +msgid "Remove Icon" +msgstr "删除图标" + +#: fields/link/link.php:20 +msgid "Add Link" +msgstr "添加链接" + +#: fields/link/link.php:21 +msgid "Edit Link" +msgstr "编辑链接" + +#: fields/link/link.php:22 +msgid "Remove Link" +msgstr "移除链接" + +#: fields/link_color/link_color.php:37 +msgid "Hover" +msgstr "悬停" + +#: fields/link_color/link_color.php:38 +msgid "Active" +msgstr "启用" + +#: fields/link_color/link_color.php:39 +msgid "Visited" +msgstr "访问" + +#: fields/link_color/link_color.php:40 +msgid "Focus" +msgstr "焦点" + +#: fields/map/map.php:24 +msgid "Latitude" +msgstr "纬度" + +#: fields/map/map.php:25 +msgid "Longitude" +msgstr "经度" + +#: fields/media/media.php:25 fields/upload/upload.php:25 +msgid "Upload" +msgstr "上传" + +#: fields/media/media.php:26 fields/upload/upload.php:26 +msgid "Remove" +msgstr "删除" + +#: fields/sorter/sorter.php:21 +msgid "Enabled" +msgstr "启用" + +#: fields/sorter/sorter.php:22 +msgid "Disabled" +msgstr "禁用" + +#: fields/switcher/switcher.php:20 +msgid "On" +msgstr "启用" + +#: fields/switcher/switcher.php:21 +msgid "Off" +msgstr "禁用" + +#: fields/typography/typography.php:96 +msgid "Font Family" +msgstr "字体" + +#: fields/typography/typography.php:97 +msgid "Select a font" +msgstr "选择字体" + +#: fields/typography/typography.php:105 +msgid "Backup Font Family" +msgstr "备份字体系列" + +#: fields/typography/typography.php:119 fields/typography/typography.php:132 +#: fields/typography/typography.php:145 fields/typography/typography.php:160 +#: fields/typography/typography.php:176 fields/typography/typography.php:189 +#: fields/typography/typography.php:203 fields/typography/typography.php:221 +msgid "Default" +msgstr "默认" + +#: fields/typography/typography.php:130 +msgid "Font Style" +msgstr "字体样式" + +#: fields/typography/typography.php:144 fields/typography/typography.php:145 +msgid "Load Extra Styles" +msgstr "加载额外样式" + +#: fields/typography/typography.php:158 +msgid "Subset" +msgstr "子集" + +#: fields/typography/typography.php:168 +msgid "Text Align" +msgstr "文本对齐" + +#: fields/typography/typography.php:170 +msgid "Inherit" +msgstr "继承" + +#: fields/typography/typography.php:171 +msgid "Left" +msgstr "左侧" + +#: fields/typography/typography.php:172 +msgid "Center" +msgstr "居中" + +#: fields/typography/typography.php:173 +msgid "Right" +msgstr "右侧" + +#: fields/typography/typography.php:174 +msgid "Justify" +msgstr "两端对齐" + +#: fields/typography/typography.php:175 +msgid "Initial" +msgstr "初始" + +#: fields/typography/typography.php:184 +msgid "Font Variant" +msgstr "字体变体" + +#: fields/typography/typography.php:187 +msgid "Small Caps" +msgstr "小写" + +#: fields/typography/typography.php:188 +msgid "All Small Caps" +msgstr "所有字母小写" + +#: fields/typography/typography.php:197 +msgid "Text Transform" +msgstr "文本转换" + +#: fields/typography/typography.php:200 +msgid "Capitalize" +msgstr "大写" + +#: fields/typography/typography.php:201 +msgid "Uppercase" +msgstr "大写" + +#: fields/typography/typography.php:202 +msgid "Lowercase" +msgstr "小写" + +#: fields/typography/typography.php:211 +msgid "Text Decoration" +msgstr "文本装饰" + +#: fields/typography/typography.php:218 +msgid "Wavy" +msgstr "波浪" + +#: fields/typography/typography.php:219 +msgid "Overline" +msgstr "上划线" + +#: fields/typography/typography.php:220 +msgid "Line-through" +msgstr "删除线" + +#: fields/typography/typography.php:233 +msgid "Font Size" +msgstr "字体大小" + +#: fields/typography/typography.php:245 +msgid "Line Height" +msgstr "线高度" + +#: fields/typography/typography.php:257 +msgid "Letter Spacing" +msgstr "字母间距" + +#: fields/typography/typography.php:269 +msgid "Word Spacing" +msgstr "字间距" + +#: fields/typography/typography.php:284 +msgid "Font Color" +msgstr "字体颜色" + +#: fields/typography/typography.php:295 +msgid "Custom Style" +msgstr "自定义样式" + +#: fields/typography/typography.php:362 +msgid "Custom Web Fonts" +msgstr "自定义 Web 字体" + +#: fields/typography/typography.php:368 +msgid "Safe Web Fonts" +msgstr "Web 安全字体" + +#: fields/typography/typography.php:388 +msgid "Google Web Fonts" +msgstr "Google Web 字体" + +#: functions/actions.php:72 functions/actions.php:110 +msgid "Error: Invalid key." +msgstr "错误:无效密钥。" + +#: functions/actions.php:114 +msgid "Error: The response is not a valid JSON response." +msgstr "错误:响应不是有效的 JSON 响应。" + +#: functions/actions.php:174 +msgid "Error: Invalid term ID." +msgstr "错误:无效的项目ID。" + +#: functions/actions.php:180 +msgid "Error: You do not have permission to do that." +msgstr "错误:您无权这样做。" + +#: functions/validate.php:14 functions/validate.php:86 +msgid "Please enter a valid email address." +msgstr "请输入正确的电子邮件地址。" + +#: functions/validate.php:32 functions/validate.php:106 +msgid "Please enter a valid number." +msgstr "请输入有效的数字" + +#: functions/validate.php:50 functions/validate.php:126 +msgid "This field is required." +msgstr "这是必填栏。" + +#: functions/validate.php:68 functions/validate.php:146 +msgid "Please enter a valid URL." +msgstr "请输入有效网址" + +#. Plugin Name of the plugin/theme +msgid "Wp_china_yes Framework" +msgstr "Wp_china_yes Framework" + +#. Plugin URI of the plugin/theme +msgid "http://wp_china_yesframework.com/" +msgstr "http://wp_china_yesframework.com/" + +#. Description of the plugin/theme +msgid "A Simple and Lightweight WordPress Option Framework for Themes and Plugins" +msgstr "一个简单且轻量的 WordPress 主题和插件选项框架" + +#. Author of the plugin/theme +msgid "Wp_china_yes" +msgstr "Wp_china_yes" + +#. Author URI of the plugin/theme +msgid "http://wp_china_yesthemes.com/" +msgstr "http://wp_china_yesthemes.com/" diff --git a/helpers.php b/helpers.php old mode 100644 new mode 100755 index c5fa9c0..2b770f1 --- a/helpers.php +++ b/helpers.php @@ -20,6 +20,7 @@ function get_settings() { 'plane' => 'off', 'plane_rule' => [], 'monitor' => true, + 'memory' => true, 'hide' => false, 'custom_name' => 'WP-China-Yes', ] ); From f9a7968c00cb7572c8ee61663091d276e625f3f9 Mon Sep 17 00:00:00 2001 From: feng Date: Thu, 2 Jan 2025 15:28:13 +0800 Subject: [PATCH 31/36] =?UTF-8?q?=E8=A1=A5=E5=85=85=E7=89=88=E6=9D=83?= =?UTF-8?q?=E5=A3=B0=E6=98=8E=E5=8F=8A=E6=9B=B4=E6=96=B0=E6=97=A5=E5=BF=97?= =?UTF-8?q?=20TXT?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- changelog.txt | 325 ++++++++++++++++++++++++++++++++++++++++++++++++++ copyright.txt | 28 +++++ 2 files changed, 353 insertions(+) create mode 100644 changelog.txt create mode 100644 copyright.txt diff --git a/changelog.txt b/changelog.txt new file mode 100644 index 0000000..b4ecb47 --- /dev/null +++ b/changelog.txt @@ -0,0 +1,325 @@ +IMPORTANT: +----------------------------------------------------------------------------------------- +Please be sure to read the Important Update Notes before you update: +https://wpcy.com/document/important-update-information/ +We are always proactive in preventing security issues, however nobody can assume they will never come up. +This is why we highly recommend to stay up to date with each new theme version and plugins. + +重要提示: +----------------------------------------------------------------------------------------- +在更新之前,请务必阅读重要更新说明: +https://wpcy.com/document/important-update-information/ + +我们始终致力于积极防范安全问题,但没有人能完全避免潜在风险。 +因此,我们强烈建议您密切关注每个主题和插件的新版本更新,以确保安全性和功能的最佳状态。 +----------------------------------------------------------------------------------------- +v3.8 - 2025-01-01 +----------------------------------------------------------------------------------------- + +* 文派叶子 v3.8 重大更新!全新UI 设计更接近 WordPress 原生体验。 + +1. 替换业务域名 WP-China-Yes.com 为新域名 WPCY.COM ; +2. 修复 adminCDN 支持 jsDelivr 加速无效等问题; +3. 新增 Bootstrap CDN 转接至 adminCDN 加速支持; +4. 新增 Windfonts 中文排版优化:支持段首空格 2em; +5. 新增 Windfonts 中文排版优化:支持文本内容对齐; +6. 新增 [脉云维护] 菜单并支持WP系统状态监控,可在页脚位置显示内存、CPU用量等信息; +7. 新增 [欢迎使用] 用户引导页面,更清晰的功能指导和简介。 +8. 新增 [建站工具] 文派·寻鹿建站套件展示页面,内容待完善。 +9. 优化 [萌芽加速] 设置,与 WordPress 程序端加速选项分离便于添加后续项目; +10. 优化 [关于插件] 页面更简约的赞助商 Logo 和贡献者名单展示。 +11. 补充 changelog.txt 文本文件,跟随插件副本分发。 +12. 补充 copyright.txt 版权文件,跟随插件副本分发。 + +----------------------------------------------------------------------------------------- +v3.7.1 - 2024-11-19 +----------------------------------------------------------------------------------------- + +1. 性能优化 +2. 修复监控无法关闭的问题 + +----------------------------------------------------------------------------------------- +v3.6.5 - 2024-08-23 +----------------------------------------------------------------------------------------- + +1. 优化 CLI 判断 +2. 回退替换钩子修改 + +----------------------------------------------------------------------------------------- +v3.6.4 - 2024-08-23 +----------------------------------------------------------------------------------------- + +1. WP-CLI 下不运行 adminCDN 部分,防止影响缓冲区。 +2. 部分文案调整支持多语言。 + +----------------------------------------------------------------------------------------- +v3.6.3 - 2024-08-23 +----------------------------------------------------------------------------------------- + +1. 为自动监控功能添加开关 +2. adminCDN 支持 jsDelivr 加速 +3. Windfonts 支持优化模式开关 + +**adminCDN 的 jsd 加速默认屏蔽 gh 端点,如有主题插件作者需要使用请联系加白。** + +----------------------------------------------------------------------------------------- +v3.6.2 - 2024-03-09 +----------------------------------------------------------------------------------------- + +1. UI 重构 +2. 修复市场加速导致 Beta 测试插件失效的问题 +3. 更新接口及测试 URL + +----------------------------------------------------------------------------------------- +v3.6.1 - 2024-03-08 +----------------------------------------------------------------------------------------- + +1. 重构全部代码 +2. 应用市场调整为[文派开源](https://wenpai.org) +3. 加速服务调整为[萌芽加速](https://admincdn.com) +4. 头像调整为[初认头像](https://cravatar.com) +5. 支持自动检测节点可用性 + +----------------------------------------------------------------------------------------- +发展历史 +----------------------------------------------------------------------------------------- + +- 2019 年 2022 年 @薇晓朵 为 WP 中文本地化项目提供各项赞助支持,期间陆续数十万的资金。 +- 2022 年起至 2023 年 3 月,原有 LitePress 及 WP 中文本土化社区项目进入维护状态,不再活跃; +- 2023 年 3 月由 @薇晓朵(Weixiaoduo.com)联系原项目团队咨询相关发展情况,得知已无继续开发此项目的意向。 +- 此时文派开源(WenPai.org)项目也处于筹备启动基础设施建设阶段。 + +----------------------------------------------------------------------------------------- +项目重启 +----------------------------------------------------------------------------------------- + +- 了解到此项目实际情况并商议后,文派(广州)科技有限公司决定收购此项目并启动旗下————文派开源(WenPai.org)。 +- 2023 年 4 月 10 日文派科技公布收购 LitePress 社区声明 https://wpcy.com/news/acquisition-announcement +- 2023 年 4 月 25 日 WP-China-Yes 发布中文品牌词——“文派叶子”,寓意生生不息。 +- 2023 年 5 月 LitePress 、Cravatar 、WP-China-Yes 等项目重启,进入正式交接重启开发阶段。 + +----------------------------------------------------------------------------------------- +投资机构:汉中菲比斯网络技术有限公司 +----------------------------------------------------------------------------------------- + +投资项目:文派(WordPress)中国生态基础设施建设、文派开源中国本土化 WordPress 发行版及社区建设。 +投资金额:一百万人民币(一期) +基础资源:三百个 WP 行业属性稀缺域名资源,以及 “文派” 品牌、商标、软著、专利等知识产权。 + +----------------------------------------------------------------------------------------- +委托机构:文派(广州)科技有限公司 +----------------------------------------------------------------------------------------- + +技术支持:薇晓朵团队 - Weixiaoduo.com +营销支持:莫蒂奇团队 - Modiqi.com + +----------------------------------------------------------------------------------------- + +oooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooo +oooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooo +oooooooooooooooooooooooooooooooooooooooooo&&B&oooooooooooooooooooooooooooooooooooooooo +oooooooooooooooooooooooooooooooooooo#B&oo&#B#ooooooooooooooooooooooooooooooooooooooooo +oooooooooooooooooooooooooooooooooooBG&o#BBB&oooooooooooooooooooooooooooooooooooooooooo +ooooooooooooooooooooooooooooooooo#BGGBG#&ooooooooooooooooooooooooooooooooooooooooooooo +oooooooooooooooooooooooooooooo#BGGGGGG&ooooooooooooooooooooooooooooooooooooooooooooooo +oooooooooooooooooooooooooooooo&&#GGGGGB&oooooooooooooooooooooooooooooooooooooooooooooo +oooooooooooooooooooooooooooooooooBGGGGGGGB##&&&&&#####&&oooooooooooooooooooooooooooooo +ooooooooooooooooooooooooooooooooo&GGGGGGGGGGGGGGGGGGGGGGBB#ooooooooooooooooooooooooooo +oooooooooooooooooooooooooooooooooo#GGGGGGGGGGGGGGGGGGGGGG&#ooooooooooooooooooooooooooo +ooooooooooooooooooooooooooooooooooo#GGGGGGGGGGGGGGGGGGGG#ooooooooooooooooooooooooooooo +ooooooooooooooooooooooooooooooooooooo#BGGGGGGGBB##&BGGGGB&oooooooooooooooooooooooooooo +oooooooooooooooooooooooooooooooooooooooGGG&ooooooooo#GGBBGB&oooooooooooooooooooooooooo +oooooooooooooooooooooooooooooooooooooo#GBGooooooooooo&GBooG#oooooooooooooooooooooooooo +ooooooooooooooooooooooooooooooooooooooooG#oooooooooooB#ooo##oooooooooooooooooooooooooo +ooooooooooooooooooooooooooooooooooooooo#G#ooooooooooo&G&oo##oooooooooooooooooooooooooo +oooooooooooooooooooooooooooooooooooooooB#&&oooooooooB#oooo##oooooooooooooooooooooooooo +oooooooooooooooooooooooooooooooooooooooooooooooooooo#&oooooooooooooooooooooooooooooooo +oooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooo +oooooooooooooooooooooooooo##———— www.feibisi.com ————##ooooooooooooooooooooooooooooooo +ooooooooooooooooooooooooooo####菲比斯 · 品味简单生活####ooooooooooooooooooooooooooooooo +oooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooo +oooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooo +ooooooooooo(此项目于 2023 年 4 月重启,由菲比斯公司提供了初始一百万启动投资。)ooooooooooo +oooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooo +oooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooo + +----------------------------------------------------------------------------------------- +2022 年 ~ 2023 年 3 月 +----------------------------------------------------------------------------------------- + +此项目及 LitePress 社区发展已停滞,前景不明。 + +----------------------------------------------------------------------------------------- +v3.5.5 - 2022-11-15 此为前团队发布最后一版。 +----------------------------------------------------------------------------------------- + +修复 +1. 仓库源替换代码优先级过低被覆盖的问题 + +重构 +1. 去掉 CDNJS 功能; +2. 修改 WP China 标志为 LitePress +3. 替换各种加速节点链接为 LitePress 维护的地址 + +----------------------------------------------------------------------------------------- +v3.5.4 - 2024-03-08 +----------------------------------------------------------------------------------------- + +特性 +1. CDNJS加速功能 + +----------------------------------------------------------------------------------------- +v3.5.3 - 2024-03-08 +----------------------------------------------------------------------------------------- + +修复 +1. 核心功能无法在 Cron 环境中运行的问题 + +----------------------------------------------------------------------------------------- +v3.5.2 - 2024-03-08 +----------------------------------------------------------------------------------------- + +修复 +1. 留下测试代码 +2. 当未拦截到 API 请求时直接返回 WordPress 到底是什么响应值,而不是 false,该问题会导致其他插件无法调用 pre_http_request 过滤器 + +----------------------------------------------------------------------------------------- +v3.5.1 - 2021-10-01 +----------------------------------------------------------------------------------------- + +修复 +1. 不为 LitePress 替换后台资源 +2. 完善Cravatar头像夺取机制 + +----------------------------------------------------------------------------------------- +v3.5.0 - 2021-09-05 +----------------------------------------------------------------------------------------- + +特性 +1. 将“本土应用市场”更改为“LitePress 应用市场”,进而对接 LitePress 翻译平台 +2. “参与翻译”按钮全局生效 + +----------------------------------------------------------------------------------------- +v3.4.1 - 2021-08-15 +----------------------------------------------------------------------------------------- + +修复 +1. 不为处于RC版本的WordPress替换后台静态资源 +2. 替换默认头像处的Gravatar字样 +3. 替换个人资料卡中的头像设置说明 + +----------------------------------------------------------------------------------------- +v3.4.0 - 2021-07-27 +----------------------------------------------------------------------------------------- + +特性 +1. 将 Gravatar 头像替换方案由反代更改为 Cravatar(任何开发者均可在自己的产品中集成 Cravatar 头像服务) +修复 +2. 修复了某些情况下无法替换 Gravatar 头像的问题 + + +----------------------------------------------------------------------------------------- +v3.4.0 - 2021-07-27 +----------------------------------------------------------------------------------------- + +1. 修复:管理后台加速功能因用户反馈问题较多,故暂时默认关闭 +2. 修复:后台加速功能误对处于测试状态的WordPress起作用的问题 + +----------------------------------------------------------------------------------------- +v3.3.1 - 2020-10-28 +----------------------------------------------------------------------------------------- + +1. 修复:管理后台加速功能因用户反馈问题较多,故暂时默认关闭 +2. 修复:后台加速功能误对处于测试状态的WordPress起作用的问题 + +----------------------------------------------------------------------------------------- +v3.3.0 - 2020-10-14 +----------------------------------------------------------------------------------------- + +1. 特性:当使用“本土应用市场”时为插件列表中的所有插件追加“翻译校准”链接 + +----------------------------------------------------------------------------------------- +v3.2.0 - 2020-10-07 +----------------------------------------------------------------------------------------- + +1. 特性:支持谷歌前端公共库加速 +2. 特性:细化管理界面设置的颗粒度 + +----------------------------------------------------------------------------------------- +v3.1.3 - 2020-09-18 +----------------------------------------------------------------------------------------- + +1. 修复:多站点模式下可以在子站点激活插件的BUG +2. 修复:多站点模式下无法保存配置的BUG + +----------------------------------------------------------------------------------------- +v3.1.2 - 2020-08-30 +----------------------------------------------------------------------------------------- + +1. 修复:兼容WordPress多站点模式(只在主控上显示设置项) +2. 修复:插件更新后设置项被覆盖的问题 + +----------------------------------------------------------------------------------------- +v3.1.1 - 2020-08-27 +----------------------------------------------------------------------------------------- + +特性 +1. 增加管理后台加速功能,原理是将WordPress核心依赖的静态文件切换为公共资源,这将极大的加快管理后台访问速度^_^ +2. 增加”不接管应用市场“选项 + +修复 +1. 对AJAX加载的场景做了较为详尽的适配,节约每一点服务器资源 + +----------------------------------------------------------------------------------------- +v3.0.0 - 2020-08-15 +----------------------------------------------------------------------------------------- + +1. 使用WordPress默认组件重写设置页面 +2. 增加Gravatar加速支持 +3. 增加谷歌字体加速支持 +4. 对接本土应用市场,这个应用市场与本土翻译平台深度整合,可以大家进行基于AI翻译+人工辅助调整的全量汉化支持(技术试验) +5. “仓库源-主源”更名为“官方应用市场镜像” +6. 移除“自定义源”功能 +7. 移除“资源” +8. 删除仪表盘赞助商列表 + +----------------------------------------------------------------------------------------- +v2.1.0 - 2020-04-11 +----------------------------------------------------------------------------------------- + +1. 取消社区源选择功能,只保留主源和备源 +2. 禁止设置页的tab +3. 在仪表盘上放置了赞助者名单展示小部件(可关闭) + +----------------------------------------------------------------------------------------- +v2.0.3 - 2020-03-20 +----------------------------------------------------------------------------------------- + +1. 修复修改仓库源后刷新页面无法正确展示源信息的问题 + +----------------------------------------------------------------------------------------- +v2.0.2 - 2020-03-18 +----------------------------------------------------------------------------------------- + +1. RepairAPI接口编写的不规范的问题#7 + +----------------------------------------------------------------------------------------- +v2.0.1 - 2020-03-18 +----------------------------------------------------------------------------------------- + +1. 修复插件无法在使用子目录部署的 WordPress 上运行的问题#6 + +----------------------------------------------------------------------------------------- +v2.0.0 - 2020-03-12 +----------------------------------------------------------------------------------------- + +从这个版本开始WP-China-是第一次拥有了图形化设置界面 + +1. 社区资源 +2. 来源支持 + +----------------------------------------------------------------------------------------- +v1.0.1 - 2020-03-12 +----------------------------------------------------------------------------------------- + +1. 核心功能 diff --git a/copyright.txt b/copyright.txt new file mode 100644 index 0000000..558b6d2 --- /dev/null +++ b/copyright.txt @@ -0,0 +1,28 @@ +----------------------------------------------------------------------------------------- +**Copyright © 2025 WenPai.cn (Guangzhou) Technology Co., Ltd.** +----------------------------------------------------------------------------------------- + +**Compliance Terms** +Everyone is free to use Wenpai open-source software. However, in China, when using Wenpai software, you must adhere to the GPL open-source license, respect the intellectual property rights of others, and prioritize compliance with Chinese laws in case of any conflicts. + +**Fork Declaration** +To ensure the long-term availability of various Wenpai (WordPress) infrastructure components, individuals with the necessary capabilities are welcome to establish their own service sources or fork Wenpai Leaf 🍃 (WPCY) to create their own versions. + +**The Only Requirement:** +While strictly adhering to the GPL license, you must respect all lawful rights of Wenpai Technology, including (but not limited to) copyrights, trademarks, patents, intellectual property, goodwill, and more. + +----------------------------------------------------------------------------------------- +**版权所有 © 2025 年 文派(广州)科技有限公司** +----------------------------------------------------------------------------------------- + +**合规条款** +任何人都可以自由使用文派开源软件,但在中国,当您使用文派软件时,您应在遵守 GPL 开源协议的同时,尊重他人的知识产权,同时有违背中国法律的情况时皆以中国法律为准。 + +**分叉声明** +为保障各项文派 (WordPress) 基础设施的长久可用性,欢迎有能力的人自建各类服务源以及分叉文派叶子🍃(WPCY)来制作您自己的版本; + +**唯一要求:** +在严格遵守 GPL 协议的前提下,尊重文派科技的各项合法权益,包括 (不限于) 版权、商标、专利、知识产权、商誉等… + + + From 6083aa805749796dbe558c150b0520009de8f7b0 Mon Sep 17 00:00:00 2001 From: feng Date: Wed, 5 Feb 2025 10:39:35 +0800 Subject: [PATCH 32/36] Update readme.md --- readme.md | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/readme.md b/readme.md index fd4c790..0a32308 100644 --- a/readme.md +++ b/readme.md @@ -46,3 +46,7 @@ ## 赞助商 + +--- + +**Copyright © 2025 · WPCY.COM , All Rights Reserved. 文派 (广州) 科技有限公司;** From bfec4c147e7c56fab5babdcd02c35af0a9f87433 Mon Sep 17 00:00:00 2001 From: feng Date: Wed, 5 Feb 2025 10:58:27 +0800 Subject: [PATCH 33/36] Update readme.md --- readme.md | 13 +++++++------ 1 file changed, 7 insertions(+), 6 deletions(-) diff --git a/readme.md b/readme.md index 0a32308..1fc4ced 100644 --- a/readme.md +++ b/readme.md @@ -1,14 +1,15 @@ -# WP-China-Yes +## 开源 WordPress 中国网站加速器。 -开源 WordPress 中国网站加速器。 - -文派叶子 🍃(WP-China-Yes)是中国 WordPress 生态基础设施软件,犹如落叶新芽,生生不息。 +文派叶子 🍃(WPCY.COM)是中国 WordPress 生态基础设施软件,犹如落叶新芽,生生不息。专为解决困扰了中国互联网数十年的特色问题而存在。此为文派开源(WenPai.org)的一部分。 - + ## 简介 -文派叶子 🍃(WPCY)是一款不可多得的 WordPress 系统底层优化和生态基础设施软件。项目起源于 2019 年,专为解决困扰了中国互联网数十年的特色问题而存在。此为文派开源(WenPai.org)的一部分。 +文派叶子 🍃(WPCY.COM)是一款不可多得的 WordPress 系统底层优化和生态基础设施软件。文派(WordPress)中国本土化项目始于 2019 年,由 文派叶子🍃(WPCY) 插件开启,其前身为 WP-China-Yes。 + +2023 年 4 月,文派科技完成对该项目的收购,并对其进行了全面的品牌重塑。 + ## 功能 From 8beff870f24e65108e7a3f346e2a8b1e48a99d3f Mon Sep 17 00:00:00 2001 From: feibisi <666641+feibisi@users.noreply.github.com> Date: Wed, 5 Feb 2025 03:05:14 +0000 Subject: [PATCH 34/36] docs: Update CHANGELOG --- CHANGELOG.md | 17 +++++++++++++++++ 1 file changed, 17 insertions(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index d8c5dfa..35fbcc0 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -2,6 +2,23 @@ All notable changes to `WP-China-Yes` will be documented in this file. +## v3.8 - 2025-02-05 + +* 文派叶子 v3.8 重大更新!全新UI 设计更接近 WordPress 原生体验。 + +1. 替换业务域名 WP-China-Yes.com 为新域名 WPCY.COM ; +2. 修复 adminCDN 支持 jsDelivr 加速无效等问题; +3. 新增 Bootstrap CDN 转接至 adminCDN 加速支持; +4. 新增 Windfonts 中文排版优化:支持段首空格 2em; +5. 新增 Windfonts 中文排版优化:支持文本内容对齐; +6. 新增 [脉云维护] 菜单并支持WP系统状态监控,可在页脚位置显示内存、CPU用量等信息; +7. 新增 [欢迎使用] 用户引导页面,更清晰的功能指导和简介。 +8. 新增 [建站工具] 文派·寻鹿建站套件展示页面,内容待完善。 +9. 优化 [萌芽加速] 设置,与 WordPress 程序端加速选项分离便于添加后续项目; +10. 优化 [关于插件] 页面更简约的赞助商 Logo 和贡献者名单展示。 +11. 补充 changelog.txt 文本文件,跟随插件副本分发。 +12. 补充 copyright.txt 版权文件,跟随插件副本分发。 + ## v3.7.1 - 2024-11-19 1. 性能优化 From 70af2db0f5612e71ab71c03b46cb4e14a772dcc5 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E8=8E=AB=E8=92=82=E5=A5=87?= <130886204+modiqi@users.noreply.github.com> Date: Thu, 8 May 2025 01:47:19 +0800 Subject: [PATCH 35/36] Update wp-china-yes.php MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 更新插件名称 --- wp-china-yes.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/wp-china-yes.php b/wp-china-yes.php index 597557f..9f05e67 100755 --- a/wp-china-yes.php +++ b/wp-china-yes.php @@ -1,6 +1,6 @@ Date: Tue, 29 Jul 2025 17:58:24 +0800 Subject: [PATCH 36/36] Add new service modules and enhance initialization Added new service classes: Maintenance, Acceleration, Adblock, Avatar, Database, Fonts, Performance, and related templates and assets. Updated Service/Base.php to conditionally instantiate service classes only if they exist. Improved Service/Memory.php and Service/Monitor.php with better settings handling and update logic. Enhanced Service/Setting.php to simplify framework title usage. These changes modularize features and improve plugin extensibility and reliability. --- Service/123-Maintenance.php | 169 ++++ Service/Acceleration.php | 256 +++++ Service/Adblock.php | 46 + Service/Avatar.php | 98 ++ Service/Base.php | 48 +- Service/Comments.php | 0 Service/Database.php | 92 ++ Service/Fonts.php | 131 +++ Service/Mail.php | 0 Service/Maintenance.php | 136 +++ Service/Media.php | 0 Service/Memory.php | 31 +- Service/Monitor.php | 343 +++---- Service/Performance.php | 2 + Service/Setting.php | 1101 +++++++++++++++++---- Service/Super.php | 484 ++++----- assets/css/setting.css | 29 +- assets/images/wpcy-logo.png | Bin 0 -> 32163 bytes assets/js/script.js | 33 + changelog.txt | 0 composer.json | 0 composer.lock | 0 copyright.txt | 64 +- framework/classes/admin-options.class.php | 27 +- templates/about-section.php | 48 + templates/maintenance-default.php | 20 + templates/website-section.php | 21 + templates/welcome-section.php | 56 ++ wp-china-yes.php | 27 +- 29 files changed, 2617 insertions(+), 645 deletions(-) create mode 100755 Service/123-Maintenance.php create mode 100755 Service/Acceleration.php create mode 100755 Service/Adblock.php create mode 100755 Service/Avatar.php create mode 100755 Service/Comments.php create mode 100755 Service/Database.php create mode 100755 Service/Fonts.php create mode 100755 Service/Mail.php create mode 100755 Service/Maintenance.php create mode 100755 Service/Media.php create mode 100755 Service/Performance.php create mode 100755 assets/images/wpcy-logo.png create mode 100755 assets/js/script.js mode change 100644 => 100755 changelog.txt mode change 100644 => 100755 composer.json mode change 100644 => 100755 composer.lock mode change 100644 => 100755 copyright.txt create mode 100755 templates/about-section.php create mode 100755 templates/maintenance-default.php create mode 100755 templates/website-section.php create mode 100755 templates/welcome-section.php diff --git a/Service/123-Maintenance.php b/Service/123-Maintenance.php new file mode 100755 index 0000000..77e3be5 --- /dev/null +++ b/Service/123-Maintenance.php @@ -0,0 +1,169 @@ +settings = get_settings(); + + // 仅在调试模式下输出调试信息 + if (defined('WP_DEBUG') && WP_DEBUG) { + error_log('Maintenance Settings Raw: ' . print_r($this->settings, true)); + error_log('Maintenance Mode Value: ' . var_export($this->settings['maintenance_mode'], true)); + } + + // 如果维护模式启用,挂载相关钩子 + if ($this->settings['maintenance_mode']) { + add_action('template_redirect', [$this, 'check_maintenance_mode'], 1); + add_action('admin_bar_menu', [$this, 'add_admin_bar_notice'], 100); + add_action('init', [$this, 'check_ajax_maintenance'], 1); + } + } + + public function check_ajax_maintenance() { + if (wp_doing_ajax() && !current_user_can('manage_options')) { + wp_die('维护模式已启用'); + } + } + + public function check_maintenance_mode() { + // 如果是命令行环境,直接返回 + if (php_sapi_name() === 'cli') { + return; + } + + // 如果是管理员,直接返回 + if (current_user_can('manage_options')) { + return; + } + + // 检查是否是允许的页面 + global $pagenow; + if (in_array($pagenow, $this->allowed_pages)) { + return; + } + + // 检查是否是后台请求 + if (is_admin()) { + return; + } + + // 检查是否是 REST API 请求 + if (defined('REST_REQUEST') && REST_REQUEST) { + return; + } + + // 检查是否是 AJAX 请求 + if (wp_doing_ajax()) { + return; + } + + // 显示维护页面 + $this->show_maintenance_page(); + } + + private function show_maintenance_page() { + $maintenance_settings = $this->settings['maintenance_settings'] ?? []; + + $title = $maintenance_settings['maintenance_title'] ?? '网站维护中'; + $heading = $maintenance_settings['maintenance_heading'] ?? '网站维护中'; + $message = $maintenance_settings['maintenance_message'] ?? '网站正在进行例行维护,请稍后访问。感谢您的理解与支持!'; + + // 添加基本的样式 + $style = ' + + '; + + $output = $style . sprintf( + '

        +

        %s

        +

        %s

        +
        %s
        +
        ', + esc_html($heading), + esc_html($title), + wp_kses_post($message) + ); + + // 设置维护模式响应头 + if (!headers_sent()) { + header('HTTP/1.1 503 Service Temporarily Unavailable'); + header('Status: 503 Service Temporarily Unavailable'); + header('Retry-After: 3600'); + header('Content-Type: text/html; charset=utf-8'); + } + + // 确保输出被清空 + if (ob_get_level()) { + ob_end_clean(); + } + + wp_die($output, $title, [ + 'response' => 503, + 'back_link' => false + ]); + } + + public function add_admin_bar_notice($wp_admin_bar) { + if (!current_user_can('manage_options')) { + return; + } + + // 添加调试信息 + if (defined('WP_DEBUG') && WP_DEBUG) { + error_log('Admin bar notice added for maintenance mode.'); + } + + $wp_admin_bar->add_node([ + 'id' => 'maintenance-mode-notice', + 'title' => '维护模式已启用', + 'href' => admin_url('admin.php?page=wp-china-yes#tab=脉云维护') + ]); + } +} \ No newline at end of file diff --git a/Service/Acceleration.php b/Service/Acceleration.php new file mode 100755 index 0000000..f2c481b --- /dev/null +++ b/Service/Acceleration.php @@ -0,0 +1,256 @@ +settings = get_settings(); + $this->init(); + } + + /** + * 初始化 admincdn 功能 + */ + private function init() { + if (!empty($this->settings['admincdn'])) { + add_action('wp_head', function () { + echo "\n"; + }, 1); + } + + $this->load_admincdn(); + } + + /** + * 加载 admincdn 功能 + */ + private function load_admincdn() { + // 确保 $this->settings 中包含必要的键 + $this->settings['admincdn_files'] = $this->settings['admincdn_files'] ?? []; + $this->settings['admincdn_public'] = $this->settings['admincdn_public'] ?? []; + $this->settings['admincdn_dev'] = $this->settings['admincdn_dev'] ?? []; + + // WordPress 核心静态文件链接替换 + if (is_admin() && !(defined('DOING_AJAX') && DOING_AJAX)) { + if ( + in_array('admin', (array) $this->settings['admincdn']) && + !stristr($GLOBALS['wp_version'], 'alpha') && + !stristr($GLOBALS['wp_version'], 'beta') && + !stristr($GLOBALS['wp_version'], 'RC') + ) { + // 禁用合并加载,以便于使用公共资源节点 + global $concatenate_scripts; + $concatenate_scripts = false; + + $this->page_str_replace('init', 'preg_replace', [ + '~' . home_url('/') . '(wp-admin|wp-includes)/(css|js)/~', + sprintf('https://wpstatic.admincdn.com/%s/$1/$2/', $GLOBALS['wp_version']) + ]); + } + } + + // 前台静态加速 + if (in_array('frontend', (array) $this->settings['admincdn_files'])) { + $this->page_str_replace('template_redirect', 'preg_replace', [ + '#(?<=[(\"\'])(?:' . quotemeta(home_url()) . ')?/(?:((?:wp-content|wp-includes)[^\"\')]+\.(css|js)[^\"\')]+))(?=[\"\')])#', + 'https://public.admincdn.com/$0' + ]); + } + + // Google 字体替换 + if (in_array('googlefonts', (array) $this->settings['admincdn_public'])) { + $this->page_str_replace('init', 'str_replace', [ + 'fonts.googleapis.com', + 'googlefonts.admincdn.com' + ]); + } + + // Google 前端公共库替换 + if (in_array('googleajax', (array) $this->settings['admincdn_public'])) { + $this->page_str_replace('init', 'str_replace', [ + 'ajax.googleapis.com', + 'googleajax.admincdn.com' + ]); + } + + // CDNJS 前端公共库替换 + if (in_array('cdnjs', (array) $this->settings['admincdn_public'])) { + $this->page_str_replace('init', 'str_replace', [ + 'cdnjs.cloudflare.com/ajax/libs', + 'cdnjs.admincdn.com' + ]); + } + + // jsDelivr 前端公共库替换 + if (in_array('jsdelivr', (array) $this->settings['admincdn_public'])) { + $this->page_str_replace('init', 'str_replace', [ + 'cdn.jsdelivr.net', + 'jsd.admincdn.com' + ]); + } + + // BootstrapCDN 前端公共库替换 + if (in_array('bootstrapcdn', (array) $this->settings['admincdn_public'])) { + $this->page_str_replace('init', 'str_replace', [ + 'maxcdn.bootstrapcdn.com', + 'jsd.admincdn.com' + ]); + } + + // Emoji 资源加速 - 使用 Twitter Emoji + if (in_array('emoji', (array) $this->settings['admincdn_files'])) { + $this->replace_emoji(); + } + + // WordPress.org 预览资源加速 + if (in_array('sworg', (array) $this->settings['admincdn_files'])) { + $this->replace_sworg(); + } + + // React 前端库加速 + if (in_array('react', (array) $this->settings['admincdn_dev'])) { + $this->page_str_replace('init', 'str_replace', [ + 'unpkg.com/react', + 'jsd.admincdn.com/npm/react' + ]); + } + + // jQuery 前端库加速 + if (in_array('jquery', (array) $this->settings['admincdn_dev'])) { + $this->page_str_replace('init', 'str_replace', [ + 'code.jquery.com', + 'jsd.admincdn.com/npm/jquery' + ]); + } + + // Vue.js 前端库加速 + if (in_array('vuejs', (array) $this->settings['admincdn_dev'])) { + $this->page_str_replace('init', 'str_replace', [ + 'unpkg.com/vue', + 'jsd.admincdn.com/npm/vue' + ]); + } + + // DataTables 前端库加速 + if (in_array('datatables', (array) $this->settings['admincdn_dev'])) { + $this->page_str_replace('init', 'str_replace', [ + 'cdn.datatables.net', + 'jsd.admincdn.com/npm/datatables.net' + ]); + } + + // Tailwind CSS 加速 + if (in_array('tailwindcss', (array) $this->settings['admincdn_dev'])) { + $this->page_str_replace('init', 'str_replace', [ + 'unpkg.com/tailwindcss', + 'jsd.admincdn.com/npm/tailwindcss' + ]); + } + } + + /** + * 替换 Emoji 资源 + */ + private function replace_emoji() { + // 禁用 WordPress 默认的 emoji 处理 + remove_action('wp_head', 'print_emoji_detection_script', 7); + remove_action('admin_print_scripts', 'print_emoji_detection_script'); + remove_action('wp_print_styles', 'print_emoji_styles'); + remove_action('admin_print_styles', 'print_emoji_styles'); + remove_filter('the_content_feed', 'wp_staticize_emoji'); + remove_filter('comment_text_rss', 'wp_staticize_emoji'); + remove_filter('wp_mail', 'wp_staticize_emoji_for_email'); + + // 替换 emoji 图片路径 + $this->page_str_replace('init', 'str_replace', [ + 's.w.org/images/core/emoji', + 'jsd.admincdn.com/npm/@twemoji/api/dist' + ]); + + // 替换 wpemojiSettings 配置 + add_action('wp_head', function () { + ?> + + page_str_replace('init', 'str_replace', [ + 'ts.w.org', + 'ts.wenpai.net' + ]); + + // 替换主题预览图片 URL + add_filter('theme_screenshot_url', function ($url) { + if (strpos($url, 'ts.w.org') !== false) { + $url = str_replace('ts.w.org', 'ts.wenpai.net', $url); + } + return $url; + }); + + // 过滤主题 API 响应 + add_filter('themes_api_result', function ($res, $action, $args) { + if (is_object($res) && !empty($res->screenshots)) { + foreach ($res->screenshots as &$screenshot) { + if (isset($screenshot->src)) { + $screenshot->src = str_replace('ts.w.org', 'ts.wenpai.net', $screenshot->src); + } + } + } + return $res; + }, 10, 3); + + // 替换页面内容 + add_action('admin_init', function () { + ob_start(function ($content) { + return str_replace('ts.w.org', 'ts.wenpai.net', $content); + }); + }); + + // 确保前台内容替换 + add_action('template_redirect', function () { + ob_start(function ($content) { + return str_replace('ts.w.org', 'ts.wenpai.net', $content); + }); + }); + } + + /** + * 页面字符串替换 + * + * @param string $hook 钩子名称 + * @param string $replace_func 替换函数 + * @param array $param 替换参数 + */ + private function page_str_replace($hook, $replace_func, $param) { + if (php_sapi_name() == 'cli') { + return; + } + add_action($hook, function () use ($replace_func, $param) { + ob_start(function ($buffer) use ($replace_func, $param) { + $param[] = $buffer; + return call_user_func_array($replace_func, $param); + }); + }, PHP_INT_MAX); + } +} \ No newline at end of file diff --git a/Service/Adblock.php b/Service/Adblock.php new file mode 100755 index 0000000..38fb60e --- /dev/null +++ b/Service/Adblock.php @@ -0,0 +1,46 @@ +settings = get_settings(); + $this->init(); + } + + /** + * 初始化广告拦截功能 + */ + private function init() { + if (!empty($this->settings['adblock']) && $this->settings['adblock'] == 'on') { + add_action('admin_head', [$this, 'load_adblock']); + } + } + + /** + * 加载广告拦截 + */ + public function load_adblock() { + // 处理广告拦截规则 + foreach ((array) $this->settings['adblock_rule'] as $rule) { + if (empty($rule['enable']) || empty($rule['selector'])) { + continue; + } + echo sprintf('', + htmlspecialchars_decode($rule['selector']) + ); + } + } +} \ No newline at end of file diff --git a/Service/Avatar.php b/Service/Avatar.php new file mode 100755 index 0000000..f6c08a7 --- /dev/null +++ b/Service/Avatar.php @@ -0,0 +1,98 @@ +settings = get_settings(); + $this->init(); + } + + /** + * 初始化初认头像功能 + */ + private function init() { + if (!empty($this->settings['cravatar'])) { + add_filter('user_profile_picture_description', [$this, 'set_user_profile_picture_for_cravatar'], 1); + add_filter('avatar_defaults', [$this, 'set_defaults_for_cravatar'], 1); + add_filter('um_user_avatar_url_filter', [$this, 'get_cravatar_url'], 1); + add_filter('bp_gravatar_url', [$this, 'get_cravatar_url'], 1); + add_filter('get_avatar_url', [$this, 'get_cravatar_url'], 1); + } + } + + /** + * 获取 Cravatar URL + */ + public function get_cravatar_url($url) { + switch ($this->settings['cravatar']) { + case 'cn': + return $this->replace_avatar_url($url, 'cn.cravatar.com'); + case 'global': + return $this->replace_avatar_url($url, 'en.cravatar.com'); + case 'weavatar': + return $this->replace_avatar_url($url, 'weavatar.com'); + default: + return $url; + } + } + + /** + * 替换头像 URL + */ + public function replace_avatar_url($url, $domain) { + $sources = array( + 'www.gravatar.com', + '0.gravatar.com', + '1.gravatar.com', + '2.gravatar.com', + 's.gravatar.com', + 'secure.gravatar.com', + 'cn.gravatar.com', + 'en.gravatar.com', + 'gravatar.com', + 'sdn.geekzu.org', + 'gravatar.duoshuo.com', + 'gravatar.loli.net', + 'dn-qiniu-avatar.qbox.me' + ); + + return str_replace($sources, $domain, $url); + } + + /** + * 设置 WordPress 讨论设置中的默认 LOGO 名称 + */ + public function set_defaults_for_cravatar($avatar_defaults) { + if ($this->settings['cravatar'] == 'weavatar') { + $avatar_defaults['gravatar_default'] = 'WeAvatar'; + } else { + $avatar_defaults['gravatar_default'] = '初认头像'; + } + + return $avatar_defaults; + } + + /** + * 设置个人资料卡中的头像上传地址 + */ + public function set_user_profile_picture_for_cravatar() { + if ($this->settings['cravatar'] == 'weavatar') { + return '您可以在 WeAvatar 修改您的资料图片'; + } else { + return '您可以在初认头像修改您的资料图片'; + } + } +} \ No newline at end of file diff --git a/Service/Base.php b/Service/Base.php index 4da50cc..2d73d43 100755 --- a/Service/Base.php +++ b/Service/Base.php @@ -11,18 +11,38 @@ defined( 'ABSPATH' ) || exit; */ class Base { - public function __construct() { - // 加速服务 - new Super(); - // 监控服务 - new Monitor(); - // 内存服务 - new Memory(); - // 更新服务 - new Update(); - if ( is_admin() ) { - // 设置服务 - new Setting(); - } - } + public function __construct() { + // 确保所有类文件都存在后再实例化 + if (class_exists(__NAMESPACE__ . '\Super')) { + new Super(); + } + + if (class_exists(__NAMESPACE__ . '\Monitor')) { + new Monitor(); + } + + if (class_exists(__NAMESPACE__ . '\Memory')) { + new Memory(); + } + + if (class_exists(__NAMESPACE__ . '\Update')) { + new Update(); + } + + if (class_exists(__NAMESPACE__ . '\Database')) { + new Database(); + } + + if (class_exists(__NAMESPACE__ . '\Acceleration')) { + new Acceleration(); + } + + if (class_exists(__NAMESPACE__ . '\Maintenance')) { + new Maintenance(); + } + + if ( is_admin() && class_exists(__NAMESPACE__ . '\Setting')) { + new Setting(); + } + } } diff --git a/Service/Comments.php b/Service/Comments.php new file mode 100755 index 0000000..e69de29 diff --git a/Service/Database.php b/Service/Database.php new file mode 100755 index 0000000..f527338 --- /dev/null +++ b/Service/Database.php @@ -0,0 +1,92 @@ +settings = get_settings(); + + // 如果启用了数据库工具,则允许访问数据库修复工具 + if ( ! empty( $this->settings['enable_db_tools'] ) && $this->settings['enable_db_tools'] ) { + define( 'WP_ALLOW_REPAIR', true ); + } + + // 处理调试常量 + $this->handle_debug_constants(); + + // 安全相关常量 + $this->handle_security_constants(); + } + + /** + * 处理调试模式相关常量 + */ + private function handle_debug_constants() { + if ( ! empty( $this->settings['enable_debug'] ) && $this->settings['enable_debug'] ) { + // 只有在常量未定义时才定义 + if ( ! defined( 'WP_DEBUG' ) ) { + define( 'WP_DEBUG', true ); + } + if ( ! empty( $this->settings['debug_options']['wp_debug_log'] ) && ! defined( 'WP_DEBUG_LOG' ) ) { + define( 'WP_DEBUG_LOG', true ); + } + if ( ! empty( $this->settings['debug_options']['wp_debug_display'] ) && ! defined( 'WP_DEBUG_DISPLAY' ) ) { + define( 'WP_DEBUG_DISPLAY', true ); + } + if ( ! empty( $this->settings['debug_options']['script_debug'] ) && ! defined( 'SCRIPT_DEBUG' ) ) { + define( 'SCRIPT_DEBUG', true ); + } + if ( ! empty( $this->settings['debug_options']['save_queries'] ) && ! defined( 'SAVEQUERIES' ) ) { + define( 'SAVEQUERIES', true ); + } + } else { + // 禁用调试模式时的默认值 + if ( ! defined( 'WP_DEBUG' ) ) { + define( 'WP_DEBUG', false ); + } + if ( ! defined( 'WP_DEBUG_LOG' ) ) { + define( 'WP_DEBUG_LOG', false ); + } + if ( ! defined( 'WP_DEBUG_DISPLAY' ) ) { + define( 'WP_DEBUG_DISPLAY', false ); + } + if ( ! defined( 'SCRIPT_DEBUG' ) ) { + define( 'SCRIPT_DEBUG', false ); + } + if ( ! defined( 'SAVEQUERIES' ) ) { + define( 'SAVEQUERIES', false ); + } + } + } + + /** + * 处理安全相关常量 + */ + private function handle_security_constants() { + if ( ! empty( $this->settings['disallow_file_edit'] ) && ! defined( 'DISALLOW_FILE_EDIT' ) ) { + define( 'DISALLOW_FILE_EDIT', $this->settings['disallow_file_edit'] ); + } + if ( ! empty( $this->settings['disallow_file_mods'] ) && ! defined( 'DISALLOW_FILE_MODS' ) ) { + define( 'DISALLOW_FILE_MODS', $this->settings['disallow_file_mods'] ); + } + if ( ! empty( $this->settings['force_ssl_admin'] ) && ! defined( 'FORCE_SSL_ADMIN' ) ) { + define( 'FORCE_SSL_ADMIN', $this->settings['force_ssl_admin'] ); + } + if ( ! empty( $this->settings['force_ssl_login'] ) && ! defined( 'FORCE_SSL_LOGIN' ) ) { + define( 'FORCE_SSL_LOGIN', $this->settings['force_ssl_login'] ); + } + } +} diff --git a/Service/Fonts.php b/Service/Fonts.php new file mode 100755 index 0000000..4c310d2 --- /dev/null +++ b/Service/Fonts.php @@ -0,0 +1,131 @@ +settings = get_settings(); + $this->init(); + } + + /** + * 初始化文风字体功能 + */ + private function init() { + if (!empty($this->settings['windfonts']) && $this->settings['windfonts'] != 'off') { + $this->load_typography(); + } + + if (!empty($this->settings['windfonts']) && $this->settings['windfonts'] == 'optimize') { + add_action('init', function () { + wp_enqueue_style('windfonts-optimize', CHINA_YES_PLUGIN_URL . 'assets/css/fonts.css', [], CHINA_YES_VERSION); + }); + } + + if (!empty($this->settings['windfonts']) && $this->settings['windfonts'] == 'on') { + add_action('wp_head', [$this, 'load_windfonts']); + add_action('admin_head', [$this, 'load_windfonts']); + } + + if (!empty($this->settings['windfonts']) && $this->settings['windfonts'] == 'frontend') { + add_action('wp_head', [$this, 'load_windfonts']); + } + } + + /** + * 加载文风字体 + */ + public function load_windfonts() { + echo << + +HTML; + + $loaded = []; + foreach ((array) $this->settings['windfonts_list'] as $font) { + if (empty($font['enable'])) { + continue; + } + if (empty($font['family'])) { + continue; + } + if (in_array($font['css'], $loaded)) { + continue; + } + echo sprintf(<< + +HTML + , + $font['css'], + htmlspecialchars_decode($font['selector']), + $font['style'], + $font['weight'], + $font['family'] + ); + $loaded[] = $font['css']; + } + } + + /** + * 加载排印优化 + */ + public function load_typography() { + // 支持中文排版段首缩进 2em + if (in_array('indent', (array) $this->settings['windfonts_typography'])) { + add_action('wp_head', function () { + echo ''; + }); + } + + // 支持中文排版两端对齐 + if (in_array('align', (array) $this->settings['windfonts_typography'])) { + add_action('wp_head', function () { + if (is_single()) { // 仅在文章页面生效 + echo ''; + } + }); + } + } +} \ No newline at end of file diff --git a/Service/Mail.php b/Service/Mail.php new file mode 100755 index 0000000..e69de29 diff --git a/Service/Maintenance.php b/Service/Maintenance.php new file mode 100755 index 0000000..996cacf --- /dev/null +++ b/Service/Maintenance.php @@ -0,0 +1,136 @@ +settings = get_settings(); + + // 维护模式检查 + if (!empty($this->settings['maintenance_mode'])) { + add_action('template_redirect', [$this, 'check_maintenance_mode']); + add_action('admin_bar_menu', [$this, 'add_admin_bar_notice'], 100); + } + + // 仪表盘统计信息 + if (!empty($this->settings['disk']) && $this->settings['disk']) { + add_action('dashboard_glance_items', [$this, 'add_dashboard_stats']); + add_action('admin_head', [$this, 'add_admin_css']); + } + + // 添加登录记录钩子 + add_action('wp_login', [$this, 'record_last_login'], 10, 2); + } + + // 添加 CSS 样式 + public function add_admin_css() { + $screen = get_current_screen(); + if ($screen->id === 'dashboard') { + echo ''; + } + } + + public function add_dashboard_stats($items) { + if (!is_array($items)) { + $items = array(); + } + + // 获取显示选项设置 + $display_options = $this->settings['disk_display'] ?? []; + + // 媒体文件统计 + if (in_array('media_num', $display_options)) { + $media_count = wp_count_posts('attachment')->inherit; + $items['media'] = sprintf( + ' %s', + admin_url('upload.php'), + sprintf(_n('%d 个媒体', '%d 个媒体', $media_count), $media_count) + ); + } + + // 管理员统计 + if (in_array('admin_num', $display_options)) { + $admin_count = count(get_users(['role' => 'administrator', 'fields' => 'ID'])); + $items['admins'] = sprintf( + ' %s', + admin_url('users.php?role=administrator'), + sprintf(_n('%d 个管理员', '%d 个管理员', $admin_count), $admin_count) + ); + } + + // 用户总数统计 + if (in_array('user_num', $display_options)) { + $total_users = count(get_users(['fields' => 'ID'])); + $items['users'] = sprintf( + ' %s', + admin_url('users.php'), + sprintf(_n('%d 个用户', '%d 个用户', $total_users), $total_users) + ); + } + + // 磁盘使用统计 + $disk_info = $this->get_disk_usage_info(); + if (in_array('disk_usage', $display_options)) { + $items['disk_usage'] = sprintf( + ' 磁盘用量:%s / %s', + size_format($disk_info['used']), + size_format($disk_info['total']) + ); + } + + if (in_array('disk_limit', $display_options)) { + $items['disk_free'] = sprintf( + ' 剩余空间:%s (%s%%)', + size_format($disk_info['free']), + round(($disk_info['free'] / $disk_info['total']) * 100, 2) + ); + } + + // 上次登录时间 + if (in_array('lastlogin', $display_options)) { + $current_user_id = get_current_user_id(); + $last_login = get_user_meta($current_user_id, 'last_login', true); + $items['lastlogin'] = sprintf( + ' 上次登录:%s', + $last_login ? date('Y.m.d H:i:s', $last_login) : '从未登录' + ); + } + + return $items; + } + + private function get_disk_usage_info() { + $disk_info = get_transient('disk_usage_info'); + if (false === $disk_info) { + $upload_dir = wp_upload_dir(); + $disk_total = disk_total_space($upload_dir['basedir']); + $disk_free = disk_free_space($upload_dir['basedir']); + $disk_used = $disk_total - $disk_free; + + $disk_info = [ + 'used' => $disk_used, + 'total' => $disk_total, + 'free' => $disk_free, + ]; + set_transient('disk_usage_info', $disk_info, HOUR_IN_SECONDS); + } + return $disk_info; + } + + public function record_last_login($user_login, $user) { + update_user_meta($user->ID, 'last_login', time()); + } +} \ No newline at end of file diff --git a/Service/Media.php b/Service/Media.php new file mode 100755 index 0000000..e69de29 diff --git a/Service/Memory.php b/Service/Memory.php index 23a1115..881d379 100755 --- a/Service/Memory.php +++ b/Service/Memory.php @@ -45,10 +45,6 @@ class Memory { // 转换为更直观的名称 switch (strtolower($os)) { case 'linux': - if (file_exists('/etc/os-release')) { - $content = parse_ini_file('/etc/os-release'); - return $content['PRETTY_NAME'] ?? 'Linux'; - } return 'Linux'; case 'darwin': return 'macOS'; @@ -152,8 +148,18 @@ class Memory { */ public function add_footer($content) { $settings = get_settings(); - // 确保 memory_display 是数组,如果不是则使用空数组 - $display_options = is_array($settings['memory_display'] ?? []) ? $settings['memory_display'] : []; + + // 设置默认显示选项 + $default_options = [ + 'memory_usage', + 'wp_limit', + 'server_ip', + ]; + + // 如果设置为空或不是数组,使用默认选项 + $display_options = isset($settings['memory_display']) && is_array($settings['memory_display']) + ? $settings['memory_display'] + : $default_options; // 如果 memory 设置未启用,直接返回原始内容 if (empty($settings['memory'])) { @@ -165,6 +171,7 @@ public function add_footer($content) { $this->os_info = $this->get_os_info(); $footer_parts = []; + // 内存使用量 if (in_array('memory_usage', $display_options)) { @@ -251,4 +258,16 @@ public function add_footer($content) { ); } } + + + /** + * 更新设置 + */ + private function update_settings() { + if ( is_multisite() ) { + update_site_option( 'wp_china_yes', $this->settings ); + } else { + update_option( 'wp_china_yes', $this->settings, true ); + } + } } diff --git a/Service/Monitor.php b/Service/Monitor.php index c6d3b44..4f234cc 100755 --- a/Service/Monitor.php +++ b/Service/Monitor.php @@ -1,171 +1,172 @@ -settings = get_settings(); - wp_clear_scheduled_hook( 'wp_china_yes_maybe_check_store' ); // TODO 下个版本移除 - wp_clear_scheduled_hook( 'wp_china_yes_maybe_check_cravatar' ); // TODO 下个版本移除 - wp_clear_scheduled_hook( 'wp_china_yes_maybe_check_admincdn' ); // TODO 下个版本移除 - if ( $this->settings['monitor'] ) { - // 站点网络下只在主站运行 - if ( is_main_site() ) { - add_action( 'init', [ $this, 'init' ] ); - add_action( 'wp_china_yes_monitor', [ - $this, - 'run_monitor' - ] ); - } - } else { - wp_clear_scheduled_hook( 'wp_china_yes_monitor' ); - } - } - - /** - * 初始化 - */ - public function init() { - if ( ! wp_next_scheduled( 'wp_china_yes_monitor' ) ) { - wp_schedule_event( time(), 'hourly', 'wp_china_yes_monitor' ); - } - } - - /** - * 运行监控 - */ - public function run_monitor() { - if ( $this->settings['store'] != 'off' ) { - $this->maybe_check_store(); - } - if ( $this->settings['cravatar'] != 'off' ) { - $this->maybe_check_cravatar(); - } - if ( ! empty( $this->settings['admincdn'] ) ) { - $this->maybe_check_admincdn(); - } - } - - /** - * 检查应用市场可用性 - */ - public function maybe_check_store() { - $test_url = 'https://api.wenpai.net/china-yes/version-check'; - if ( $this->settings['store'] == 'proxy' ) { - $test_url = 'https://api.wpmirror.com/core/version-check/1.7/'; - } - $response = wp_remote_get( $test_url ); - if ( is_wp_error( $response ) || wp_remote_retrieve_response_code( $response ) != 200 ) { - if ( $this->settings['store'] == 'wenpai' ) { - $this->settings['store'] = 'proxy'; - } elseif ( $this->settings['store'] == 'proxy' ) { - $this->settings['store'] = 'off'; - } - $this->update_settings(); - } - } - - /** - * 检查初认头像可用性 - */ - public function maybe_check_cravatar() { - $test_url = 'https://cn.cravatar.com/avatar/'; - switch ( $this->settings['cravatar'] ) { - case 'global': - $test_url = 'https://en.cravatar.com/avatar/'; - break; - case 'weavatar': - $test_url = 'https://weavatar.com/avatar/'; - break; - } - $response = wp_remote_get( $test_url ); - if ( is_wp_error( $response ) || wp_remote_retrieve_response_code( $response ) != 200 ) { - if ( $this->settings['cravatar'] == 'cn' ) { - $this->settings['cravatar'] = 'global'; - } elseif ( $this->settings['cravatar'] == 'global' ) { - $this->settings['cravatar'] = 'weavatar'; - } elseif ( $this->settings['cravatar'] == 'weavatar' ) { - $this->settings['cravatar'] = 'cn'; - } - $this->update_settings(); - } - } - - /** - * 检查萌芽加速可用性 - */ - public function maybe_check_admincdn() { - // 后台加速 - if ( in_array( 'admin', $this->settings['admincdn'] ) ) { - $response = wp_remote_get( 'https://wpstatic.admincdn.com/6.7/wp-includes/js/wp-sanitize.min.js' ); - if ( is_wp_error( $response ) || wp_remote_retrieve_response_code( $response ) != 200 ) { - $this->settings['admincdn'] = array_values( array_diff( $this->settings['admincdn'], [ 'admin' ] ) ); - $this->update_settings(); - } - } - // 前台加速 - if ( in_array( 'frontend', $this->settings['admincdn'] ) ) { - $url = network_site_url( '/wp-includes/js/wp-sanitize.min.js' ); - $response = wp_remote_get( 'https://public.admincdn.com/' . $url ); - if ( is_wp_error( $response ) || wp_remote_retrieve_response_code( $response ) != 200 ) { - $this->settings['admincdn'] = array_values( array_diff( $this->settings['admincdn'], [ 'frontend' ] ) ); - $this->update_settings(); - } - } - // Google 字体 - if ( in_array( 'googlefonts', $this->settings['admincdn'] ) ) { - $response = wp_remote_get( 'https://googlefonts.admincdn.com/css?family=Roboto:400,700' ); - if ( is_wp_error( $response ) || wp_remote_retrieve_response_code( $response ) != 200 ) { - $this->settings['admincdn'] = array_values( array_diff( $this->settings['admincdn'], [ 'googlefonts' ] ) ); - $this->update_settings(); - } - } - // Google 前端公共库 - if ( in_array( 'googleajax', $this->settings['admincdn'] ) ) { - $response = wp_remote_get( 'https://googleajax.admincdn.com/ajax/libs/jquery/3.7.1/jquery.slim.min.js' ); - if ( is_wp_error( $response ) || wp_remote_retrieve_response_code( $response ) != 200 ) { - $this->settings['admincdn'] = array_values( array_diff( $this->settings['admincdn'], [ 'googleajax' ] ) ); - $this->update_settings(); - } - } - // CDNJS 前端公共库 - if ( in_array( 'cdnjs', $this->settings['admincdn'] ) ) { - $response = wp_remote_get( 'https://cdnjs.admincdn.com/jquery/3.7.1/jquery.slim.min.js' ); - if ( is_wp_error( $response ) || wp_remote_retrieve_response_code( $response ) != 200 ) { - $this->settings['admincdn'] = array_values( array_diff( $this->settings['admincdn'], [ 'cdnjs' ] ) ); - $this->update_settings(); - } - } - // jsDelivr 公共库 - if ( in_array( 'jsdelivr', $this->settings['admincdn'] ) ) { - $response = wp_remote_get( 'https://jsd.admincdn.com/npm/jquery@3.7.1/dist/jquery.slim.min.js' ); - if ( is_wp_error( $response ) || wp_remote_retrieve_response_code( $response ) != 200 ) { - $this->settings['admincdn'] = array_values( array_diff( $this->settings['admincdn'], [ 'jsdelivr' ] ) ); - $this->update_settings(); - } - } - } - - /** - * 更新设置 - */ - private function update_settings() { - if ( is_multisite() ) { - update_site_option( 'wp_china_yes', $this->settings ); - } else { - update_option( 'wp_china_yes', $this->settings, true ); - } - } -} +settings = get_settings(); + wp_clear_scheduled_hook( 'wp_china_yes_maybe_check_store' ); // TODO 下个版本移除 + wp_clear_scheduled_hook( 'wp_china_yes_maybe_check_cravatar' ); // TODO 下个版本移除 + wp_clear_scheduled_hook( 'wp_china_yes_maybe_check_admincdn' ); // TODO 下个版本移除 + if ( $this->settings['monitor'] ) { + // 站点网络下只在主站运行 + if ( is_main_site() ) { + add_action( 'init', [ $this, 'init' ] ); + add_action( 'wp_china_yes_monitor', [ + $this, + 'run_monitor' + ] ); + } + } else { + wp_clear_scheduled_hook( 'wp_china_yes_monitor' ); + } +} + + /** + * 初始化 + */ + public function init() { + if ( ! wp_next_scheduled( 'wp_china_yes_monitor' ) ) { + wp_schedule_event( time(), 'hourly', 'wp_china_yes_monitor' ); + } + } + + /** + * 运行监控 + */ + public function run_monitor() { + if ( $this->settings['store'] != 'off' ) { + $this->maybe_check_store(); + } + if ( $this->settings['cravatar'] != 'off' ) { + $this->maybe_check_cravatar(); + } + if ( ! empty( $this->settings['admincdn'] ) ) { + $this->maybe_check_admincdn(); + } + } + + /** + * 检查应用市场可用性 + */ + public function maybe_check_store() { + $test_url = 'https://api.wenpai.net/china-yes/version-check'; + if ( $this->settings['store'] == 'proxy' ) { + $test_url = 'https://api.wpmirror.com/core/version-check/1.7/'; + } + $response = wp_remote_get( $test_url ); + if ( is_wp_error( $response ) || wp_remote_retrieve_response_code( $response ) != 200 ) { + if ( $this->settings['store'] == 'wenpai' ) { + $this->settings['store'] = 'proxy'; + } elseif ( $this->settings['store'] == 'proxy' ) { + $this->settings['store'] = 'off'; + } + $this->update_settings(); + } + } + + /** + * 检查初认头像可用性 + */ + public function maybe_check_cravatar() { + $test_url = 'https://cn.cravatar.com/avatar/'; + switch ( $this->settings['cravatar'] ) { + case 'global': + $test_url = 'https://en.cravatar.com/avatar/'; + break; + case 'weavatar': + $test_url = 'https://weavatar.com/avatar/'; + break; + } + $response = wp_remote_get( $test_url ); + if ( is_wp_error( $response ) || wp_remote_retrieve_response_code( $response ) != 200 ) { + if ( $this->settings['cravatar'] == 'cn' ) { + $this->settings['cravatar'] = 'global'; + } elseif ( $this->settings['cravatar'] == 'global' ) { + $this->settings['cravatar'] = 'weavatar'; + } elseif ( $this->settings['cravatar'] == 'weavatar' ) { + $this->settings['cravatar'] = 'cn'; + } + $this->update_settings(); + } + } + + /** + * 检查萌芽加速可用性 + */ + public function maybe_check_admincdn() { + // 后台加速 + if ( in_array( 'admin', $this->settings['admincdn'] ) ) { + $response = wp_remote_get( 'https://wpstatic.admincdn.com/6.7/wp-includes/js/wp-sanitize.min.js' ); + if ( is_wp_error( $response ) || wp_remote_retrieve_response_code( $response ) != 200 ) { + $this->settings['admincdn'] = array_values( array_diff( $this->settings['admincdn'], [ 'admin' ] ) ); + $this->update_settings(); + } + } + // 前台加速 + if ( in_array( 'frontend', $this->settings['admincdn'] ) ) { + $url = network_site_url( '/wp-includes/js/wp-sanitize.min.js' ); + $response = wp_remote_get( 'https://public.admincdn.com/' . $url ); + if ( is_wp_error( $response ) || wp_remote_retrieve_response_code( $response ) != 200 ) { + $this->settings['admincdn'] = array_values( array_diff( $this->settings['admincdn'], [ 'frontend' ] ) ); + $this->update_settings(); + } + } + // Google 字体 + if ( in_array( 'googlefonts', $this->settings['admincdn'] ) ) { + $response = wp_remote_get( 'https://googlefonts.admincdn.com/css?family=Roboto:400,700' ); + if ( is_wp_error( $response ) || wp_remote_retrieve_response_code( $response ) != 200 ) { + $this->settings['admincdn'] = array_values( array_diff( $this->settings['admincdn'], [ 'googlefonts' ] ) ); + $this->update_settings(); + } + } + // Google 前端公共库 + if ( in_array( 'googleajax', $this->settings['admincdn'] ) ) { + $response = wp_remote_get( 'https://googleajax.admincdn.com/ajax/libs/jquery/3.7.1/jquery.slim.min.js' ); + if ( is_wp_error( $response ) || wp_remote_retrieve_response_code( $response ) != 200 ) { + $this->settings['admincdn'] = array_values( array_diff( $this->settings['admincdn'], [ 'googleajax' ] ) ); + $this->update_settings(); + } + } + // CDNJS 前端公共库 + if ( in_array( 'cdnjs', $this->settings['admincdn'] ) ) { + $response = wp_remote_get( 'https://cdnjs.admincdn.com/jquery/3.7.1/jquery.slim.min.js' ); + if ( is_wp_error( $response ) || wp_remote_retrieve_response_code( $response ) != 200 ) { + $this->settings['admincdn'] = array_values( array_diff( $this->settings['admincdn'], [ 'cdnjs' ] ) ); + $this->update_settings(); + } + } + // jsDelivr 公共库 + if ( in_array( 'jsdelivr', $this->settings['admincdn'] ) ) { + $response = wp_remote_get( 'https://jsd.admincdn.com/npm/jquery@3.7.1/dist/jquery.slim.min.js' ); + if ( is_wp_error( $response ) || wp_remote_retrieve_response_code( $response ) != 200 ) { + $this->settings['admincdn'] = array_values( array_diff( $this->settings['admincdn'], [ 'jsdelivr' ] ) ); + $this->update_settings(); + } + } + } + + + /** + * 更新设置 + */ + private function update_settings() { + if ( is_multisite() ) { + update_site_option( 'wp_china_yes', $this->settings ); + } else { + update_option( 'wp_china_yes', $this->settings, true ); + } + } +} diff --git a/Service/Performance.php b/Service/Performance.php new file mode 100755 index 0000000..a4abe2d --- /dev/null +++ b/Service/Performance.php @@ -0,0 +1,2 @@ +prefix, [ - 'framework_title' => sprintf( '%s v%s', $this->settings['custom_name'], CHINA_YES_VERSION ), + 'framework_title' => $this->settings['custom_name'], 'menu_hidden' => $this->settings['hide'], 'menu_title' => $this->settings['custom_name'], 'menu_slug' => 'wp-china-yes', @@ -59,24 +59,31 @@ private function get_settings_page_url() { 'async_webfont' => true, 'database' => is_multisite() ? 'network' : '', ] ); - + + // 获取启用的 sections + $enabled_sections = $this->settings['enabled_sections'] ?? ['welcome', 'store', 'admincdn', 'cravatar', 'other', 'about']; + + if (in_array('welcome', $enabled_sections)) { + $settings_page_url = $this->get_settings_page_url(); + ob_start(); + include CHINA_YES_PLUGIN_PATH . 'templates/welcome-section.php'; + $welcome_content = ob_get_clean(); + WP_CHINA_YES::createSection( $this->prefix, [ 'title' => '欢迎使用', 'icon' => 'icon icon-home-1', 'fields' => [ [ 'type' => 'content', - 'content' => - <<

        原生体验

        文派叶子🍃(WP-China-Yes)是一款不可多得的 WordPress 系统底层优化和生态基础设施软件。

        网站加速

        优化加速插件多如牛毛,为何文派叶子如此与众不同?

        进一步了解 ↗

        翻译推送

        高质量翻译中文本地化翻译由文派开源官方提供,欢迎参与改进。

        本地化改进 ↗

        广告屏蔽

        呈现清爽整洁的网站后台,清除侵入式后台广告、无用信息。

        获取广告规则 ↗

        加入我们

        关注文派茶馆 WPTEA.com 公众号以及订阅我们的时事通讯即可接收独家内容、提示和更新。

        -HTML, + 'content' =>$welcome_content, ] ], ] ); - + } + if (in_array('store', $enabled_sections)) { WP_CHINA_YES::createSection( $this->prefix, [ - 'title' => '加速设置', - 'icon' => 'icon icon-flash-1', + 'title' => '应用市场', + 'icon' => 'icon icon-shop', 'fields' => [ [ 'id' => 'store', @@ -94,41 +101,108 @@ HTML, 'wp-china-yes' ), ], [ - 'id' => 'admincdn', - 'type' => 'checkbox', - 'title' => __( '萌芽加速', 'wp-china-yes' ), - 'inline' => true, - 'options' => [ - 'googlefonts' => 'Google 字体', - 'googleajax' => 'Google 前端库', - 'cdnjs' => 'CDNJS 前端库', - 'jsdelivr' => 'jsDelivr 前端库', - 'bootstrapcdn' => 'Bootstrap 前端库' - ], - 'default' => [ - 'admin' => 'admin', - ], - 'subtitle' => '是否启用萌芽加速', - 'desc' => __( '萌芽加速(adminCDN)将 WordPress 插件依赖的静态文件切换为公共资源,解决卡顿、加载慢等问题。您可按需启用加速项目,更多细节控制和功能,请查看推荐设置。', - 'wp-china-yes' ), + 'id' => 'bridge', + 'type' => 'switcher', + 'default' => true, + 'title' => '云桥更新', + 'subtitle' => '是否启用更新加速', + 'desc' => __( '文派云桥(wpbridge)托管更新和应用分发渠道,可解决因 WordPress 社区分裂导致的混乱、旧应用无法更新,频繁 API 请求拖慢网速等问题。', + 'wp-china-yes' ), ], [ - 'id' => 'admincdn', - 'type' => 'checkbox', - 'title' => __( '文件加速', 'wp-china-yes' ), - 'inline' => true, - 'options' => [ - 'admin' => '后台加速', - 'frontend' => '前台加速', - ], - 'default' => [ - 'admin' => 'admin', - ], - 'subtitle' => '是否启用文件加速', - 'desc' => __( '专为 WordPress 系统内置依赖的静态资源进行加速,加快网站访问速度,如遇异常请停用对应选项。', - 'wp-china-yes' ), + 'id' => 'arkpress', + 'type' => 'switcher', + 'default' => false, + 'title' => '联合存储库', + 'subtitle' => '自动监控加速节点可用性', + 'desc' => __( 'ArkPress.org 支持自动监控各加速节点可用性,当节点不可用时自动切换至可用节点或关闭加速,以保证您的网站正常访问', + 'wp-china-yes' ), ], - + ], + ] ); + } + + if (in_array('admincdn', $enabled_sections)) { + WP_CHINA_YES::createSection($this->prefix, [ + 'title' => '萌芽加速', + 'icon' => 'icon icon-flash-1', + 'fields' => [ + [ + 'id' => 'admincdn_public', + 'type' => 'checkbox', + 'title' => __('萌芽加速', 'wp-china-yes'), + 'inline' => true, + 'options' => [ + 'googlefonts' => 'Google 字体', + 'googleajax' => 'Google 前端库', + 'cdnjs' => 'CDNJS 前端库', + 'jsdelivr' => 'jsDelivr 前端库', + 'bootstrapcdn' => 'Bootstrap 前端库', + ], + 'default' => [ + 'googlefonts' => 'googlefonts', + 'googleajax' => '', + 'cdnjs' => '', + 'jsdelivr' => '', + 'bootstrapcdn' => '', + ], + 'subtitle' => '是否启用萌芽加速', + 'desc' => __('萌芽加速(adminCDN)将 WordPress 插件依赖的静态文件切换为公共资源,解决卡顿、加载慢等问题。您可按需启用加速项目,更多细节控制和功能,请查看推荐设置。', + 'wp-china-yes'), + ], + [ + 'id' => 'admincdn_files', + 'type' => 'checkbox', + 'title' => __('文件加速', 'wp-china-yes'), + 'inline' => true, + 'options' => [ + 'admin' => '后台加速', + 'frontend' => '前台加速', + 'emoji' => 'Emoji加速', + 'sworg' => '预览加速', + ], + 'default' => [ + 'admin' => 'admin', + 'frontend' => '', + 'emoji' => 'emoji', + 'sworg' => '', + ], + 'subtitle' => '是否启用文件加速', + 'desc' => __('专为 WordPress 系统内置依赖的静态资源进行加速,加快网站访问速度,如遇异常请停用对应选项。预览加速可在不切换应用市场时加速插件目录预览截图。', + 'wp-china-yes'), + ], + [ + 'id' => 'admincdn_dev', + 'type' => 'checkbox', + 'title' => __('开发加速', 'wp-china-yes'), + 'inline' => true, + 'options' => [ + 'react' => 'React 前端库', + 'jquery' => 'jQuery 前端库', + 'vuejs' => 'Vue.js 前端库', + 'datatables' => 'DataTables 前端库', + 'tailwindcss' => 'Tailwind CSS' + ], + 'default' => [ + 'react' => '', + 'jquery' => 'jquery', + 'vuejs' => '', + 'datatables' => '', + 'tailwindcss' => '', + ], + 'subtitle' => '是否启用文件加速', + 'desc' => __('部分高级 WordPress 插件主题会包含最新前端资源,可在此勾选对应的 adminCDN 子库专项加速。', + 'wp-china-yes'), + ], + ], + ]); +} + + if (in_array('cravatar', $enabled_sections)) { + WP_CHINA_YES::createSection( $this->prefix, [ + 'title' => '初认头像', + 'icon' => 'icon icon-profile-circle', + 'fields' => [ [ 'id' => 'cravatar', 'type' => 'radio', @@ -147,7 +221,9 @@ HTML, ], ], ] ); - + } + + if (in_array('windfonts', $enabled_sections)) { WP_CHINA_YES::createSection( $this->prefix, [ 'title' => '文风字体', 'icon' => 'icon icon-text', @@ -168,28 +244,6 @@ HTML, 'desc' => __( '文风字体(Windfonts)为您的网站增添无限活力。专为中文网页设计,旨在提升用户阅读体验和视觉享受。新手使用请先查看字体使用说明。', 'wp-china-yes' ), ], - [ - 'id' => 'windfonts_typography', - 'type' => 'checkbox', - 'title' => __( '排印优化', 'wp-china-yes' ), - 'inline' => true, - 'options' => [ - 'corner' => '直角括号', - 'space' => '文本空格', - 'punctuation' => '标点显示', - 'indent' => '段首缩进', - 'align' => '两端对齐', - ], - 'default' => '', - 'subtitle' => '是否启用排印优化', - 'desc' => __( '文风字体排印优化可提升中文网页的视觉美感,适用于正式内容的网站。', - 'wp-china-yes' ), - 'dependency' => [ - 'windfonts', - 'any', - 'on,frontend,optimize', - ], - ], [ 'id' => 'windfonts_list', 'type' => 'group', @@ -271,81 +325,407 @@ HTML, ], ], [ - 'type' => 'content', - 'content' => '默认字体适配规则跟随插件更新,插件更新后可删除字体重新添加以获取最新适配规则', + 'id' => 'windfonts_typography', + 'type' => 'checkbox', + 'title' => __( '排印优化', 'wp-china-yes' ), + 'inline' => true, + 'options' => [ + 'corner' => '直角括号', + 'space' => '文本空格', + 'punctuation' => '标点显示', + 'indent' => '段首缩进', + 'align' => '两端对齐', + ], + 'default' => '', + 'subtitle' => '是否启用排印优化', + 'desc' => __( '文风字体排印优化可提升中文网页的视觉美感,适用于正式内容的网站。', + 'wp-china-yes' ), + ], + [ + 'id' => 'windfonts_typography', + 'type' => 'checkbox', + 'title' => __( '英文美化', 'wp-china-yes' ), + 'inline' => true, + 'options' => [ + 'align' => '排版优化', + 'corner' => '去双空格', + 'space' => '避免孤行', + 'punctuation' => '避免寡行', + 'indent' => '中英标点', + ], + 'default' => '', + 'subtitle' => '是否启用英文美化', + 'desc' => __( 'Windfonts 英文优化可提升英文网页的视觉美感,适用于多语内容网站。', + 'wp-china-yes' ), ], ], ] ); + } + if (in_array('motucloud', $enabled_sections)) { WP_CHINA_YES::createSection( $this->prefix, [ - 'title' => '广告屏蔽', - 'icon' => 'icon icon-eye-slash', + 'title' => '墨图云集', + 'icon' => 'icon icon-gallery', 'fields' => [ [ - 'id' => 'adblock', + 'id' => 'motucloud', 'type' => 'radio', - 'title' => __( '广告屏蔽', 'wp-china-yes' ), + 'title' => __( '墨图云集', 'wp-china-yes' ), 'inline' => true, 'options' => [ - 'on' => '启用', - 'off' => '不启用', + 'cn' => '默认线路', + 'global' => '国际线路', + 'weavatar' => '备用源(WeAvatar.com)', + 'off' => '不启用' ], - 'default' => 'off', - 'subtitle' => '是否启用后台广告屏蔽', - 'desc' => __( '文派叶子🍃(WPCY)独家特色功能,让您拥有清爽整洁的 WordPress 后台,清除各类常用插件侵入式后台广告、通知及无用信息,拿回后台控制权。', + 'default' => 'cn', + 'subtitle' => '是否启用墨图云集', + 'desc' => __( '墨图云集(MotuCloud)Gravatar 在中国的完美替代方案,您可以在 Cravatar.com 上传头像,更多选项请安装 WPAavatar 插件。可自选加速线路。', 'wp-china-yes' ), ], - [ - 'id' => 'adblock_rule', - 'type' => 'group', - 'title' => '规则列表', - 'subtitle' => '使用的广告屏蔽规则列表', - 'desc' => __( '支持添加多条广告屏蔽规则', - 'wp-china-yes' ), - - 'button_title' => '添加规则', - 'accordion_title_number' => true, - 'dependency' => [ - 'adblock', - 'any', - 'on', - ], - 'fields' => [ - [ - 'id' => 'name', - 'type' => 'text', - 'title' => __( '规则名称', 'wp-china-yes' ), - 'subtitle' => '自定义规则名称', - 'desc' => __( '自定义规则名称,方便识别', - 'wp-china-yes' ), - 'default' => '默认规则', - ], - [ - 'id' => 'selector', - 'type' => 'textarea', - 'title' => __( '应用元素', 'wp-china-yes' ), - 'subtitle' => '规则应用元素', - 'desc' => __( '设置规则应用的广告元素(CSS 选择器)', - 'wp-china-yes' ), - 'default' => '.wpseo_content_wrapper #sidebar-container, .yoast_premium_upsell, #wpseo-local-seo-upsell, .yoast-settings-section-upsell, #rank_math_review_plugin_notice, #bwp-get-social, .bwp-button-paypal, #bwp-sidebar-right, .tjcc-custom-css #postbox-container-1, .settings_page_wpcustomtaxfilterinadmin #postbox-container-1, #duplicate-post-notice #newsletter-subscribe-form, div[id^="dnh-wrm"], .notice-info.dst-notice, #googleanalytics_terms_notice, .fw-brz-dismiss, div.elementor-message[data-notice_id="elementor_dev_promote"], .notice-success.wpcf7r-notice, .dc-text__block.disable__comment__alert, #ws_sidebar_pro_ad, .pa-new-feature-notice, #redux-connect-message, .frash-notice-email, .frash-notice-rate, #smush-box-pro-features, #wp-smush-bulk-smush-upsell-row, #easy-updates-manager-dashnotice, #metaslider-optin-notice, #extendifysdk_announcement, .ml-discount-ad, .mo-admin-notice, .post-smtp-donation, div[data-dismissible="notice-owa-sale-forever"], .neve-notice-upsell, #pagelayer_promo, #simple-custom-post-order-epsilon-review-notice, .sfsi_new_prmium_follw, div.fs-slug-the-events-calendar[data-id="connect_account"], .tribe-notice-event-tickets-install, div.notice[data-notice="webp-converter-for-media"], .webpLoader__popup.webpPopup, .put-dismiss-notice, .wp-mail-smtp-review-notice, #wp-mail-smtp-pro-banner, body div.promotion.fs-notice, .analytify-review-thumbnail, .analytify-review-notice, .jitm-banner.is-upgrade-premium, div[data-name*="wbcr_factory_notice_adverts"], .sui-subscription-notice, #sui-cross-sell-footer, .sui-cross-sell-modules, .forminator-rating-notice, .sui-dashboard-upsell-upsell, .anwp-post-grid__rate, .cff-settings-cta, .cff-header-upgrade-notice, .cff_notice.cff_review_notice_step_1, .cff_get_pro_highlight, .aal-install-elementor, #ws_sidebar_pro_ad, .bold-timeline-lite-feedback-notice-wrapper, #elementskit-lite-go-pro-noti2ce, #elementskit-lite-_plugin_rating_msg_used_in_day, .yarpp-review-notice, #prli_review_notice, #webdados_invoicexpress_nag, #vc_license-activation-notice, .villatheme-dashboard.updated, #njt-FileBird-review, .notice[data-dismissible="pro_release_notice"], #thwvsf_review_request_notice, .wpdeveloper-review-notice, div[data-notice_type="tinvwl-user-review"], div[data-notice_type="tinvwl-user-premium"], #sg-backup-review-wrapper, .notice-wpmet-jhanda-getgenie-cross-promo, .notice-getgenie-go-pro-noti2ce, .notice-wpmet-jhanda-Summer2023, .thwcfd-review-wrapper, .woo-permalink-manager-banner, div.notice.bundle-notice, div.notice[data-dismissible="notice-owa-upgrade-forever"], .wpsm-acc-r-review-notice, .wpsm_ac_h_i, .edac-review-notice, .notice-iworks-rate, #monterinsights-admin-menu-tooltip, .monsterinsights-floating-bar, #monterinsights-admin-menu-tooltip, .exactmetrics-floating-bar, #metform-unsupported-metform-pro-version, .lwptocRate, .wpsm-tabs-b-review-notice, .quadlayers_woocommerce-direct-checkout_notice_delay, .iworks-rate-notice, #metform-_plugin_rating_msg_used_in_day, [id^="wpmet-jhanda-"], #wpmet-stories, #ti-optml-notice-helper, .menu-icon-dashboard-notice, .catch-bells-admin-notice, .wpdt-bundles-notice, .td-admin-web-services, .cf-plugin-popup, .wpzinc-review-media-library-organizer, .oxi-image-notice', - 'sanitize' => false, - ], - [ - 'id' => 'enable', - 'type' => 'switcher', - 'title' => __( '启用规则', 'wp-china-yes' ), - 'subtitle' => '是否启用该规则', - 'default' => true, - ], - ], - ], - [ - 'type' => 'content', - 'content' => '默认规则跟随插件更新,插件更新后可删除规则重新添加以获取更多最新屏蔽规则,出现异常,请尝试先停用规则排查原因。', - ], ], ] ); + } + if (in_array('fewmail', $enabled_sections)) { + WP_CHINA_YES::createSection( $this->prefix, [ + 'title' => '飞秒邮箱', + 'icon' => 'icon icon-sms-tracking', + 'fields' => [ + [ + 'id' => 'fewmail', + 'type' => 'radio', + 'title' => __( '飞秒邮箱', 'wp-china-yes' ), + 'inline' => true, + 'options' => [ + 'cn' => '默认线路', + 'global' => '国际线路', + 'weavatar' => '备用源(WeAvatar.com)', + 'off' => '不启用' + ], + 'default' => 'cn', + 'subtitle' => '是否启用飞秒邮箱', + 'desc' => __( '飞秒邮箱(FewMail)Gravatar 在中国的完美替代方案,您可以在 Cravatar.com 上传头像,更多选项请安装 WPAavatar 插件。可自选加速线路。', + 'wp-china-yes' ), + ], + ], + ] ); + } + + + if (in_array('wordyeah', $enabled_sections)) { + WP_CHINA_YES::createSection( $this->prefix, [ + 'title' => '无言会语', + 'icon' => 'icon icon-message-text', + 'fields' => [ + [ + 'id' => 'wordyeah', + 'type' => 'radio', + 'title' => __( '无言会语', 'wp-china-yes' ), + 'inline' => true, + 'options' => [ + 'cn' => '审核评论', + 'global' => '强化评论', + 'ban' => '禁用评论', + 'off' => '不启用' + ], + 'default' => 'cn', + 'subtitle' => '是否启用无言会语', + 'desc' => __( '无言会语(WordYeah)Gravatar 在中国的完美替代方案,您可以在 Cravatar.com 上传头像,更多选项请安装 WPAavatar 插件。可自选加速线路。', + 'wp-china-yes' ), + ], + ], + ] ); + } + + + if (in_array('blocks', $enabled_sections)) { + WP_CHINA_YES::createSection( $this->prefix, [ + 'title' => '笔笙区块', + 'icon' => 'icon icon-document-1', + 'fields' => [ + [ + 'id' => 'bisheng', + 'type' => 'radio', + 'title' => __( '笔笙区块', 'wp-china-yes' ), + 'inline' => true, + 'options' => [ + 'cn' => '审核评论', + 'global' => '强化评论', + 'ban' => '禁用评论', + 'off' => '不启用' + ], + 'default' => 'cn', + 'subtitle' => '是否启用笔笙区块', + 'desc' => __( '笔笙区块(Bisheng)Gravatar 在中国的完美替代方案,您可以在 Cravatar.com 上传头像,更多选项请安装 WPAavatar 插件。可自选加速线路。', + 'wp-china-yes' ), + ], + ], + ] ); + } + + + if (in_array('deerlogin', $enabled_sections)) { + WP_CHINA_YES::createSection( $this->prefix, [ + 'title' => '灯鹿用户', + 'icon' => 'icon icon-user-tick', + 'fields' => [ + [ + 'id' => 'deerlogin', + 'type' => 'radio', + 'title' => __( '灯鹿用户', 'wp-china-yes' ), + 'inline' => true, + 'options' => [ + 'cn' => '默认线路', + 'global' => '国际线路', + 'off' => '不启用' + ], + 'default' => 'cn', + 'subtitle' => '是否启用灯鹿用户', + 'desc' => __( '灯鹿用户(DeerLogin)Gravatar 在中国的完美替代方案,您可以在 Cravatar.com 上传头像,更多选项请安装 WPAavatar 插件。可自选加速线路。', + 'wp-china-yes' ), + ], + ], + ] ); + } + + + + if (in_array('waimao', $enabled_sections)) { + WP_CHINA_YES::createSection( $this->prefix, [ + 'title' => '跨飞外贸', + 'icon' => 'icon icon-chart-success', + 'fields' => [ + [ + 'id' => 'waimao', + 'type' => 'radio', + 'title' => __( '灯鹿用户', 'wp-china-yes' ), + 'inline' => true, + 'options' => [ + 'cn' => '默认线路', + 'global' => '国际线路', + 'off' => '不启用' + ], + 'default' => 'cn', + 'subtitle' => '是否启用灯鹿用户', + 'desc' => __( '灯鹿用户(DeerLogin)Gravatar 在中国的完美替代方案,您可以在 Cravatar.com 上传头像,更多选项请安装 WPAavatar 插件。可自选加速线路。', + 'wp-china-yes' ), + ], + ], + ] ); + } + + + + if (in_array('woocn', $enabled_sections)) { + WP_CHINA_YES::createSection( $this->prefix, [ + 'title' => 'Woo电商', + 'icon' => 'icon icon-shopping-cart', + 'fields' => [ + [ + 'id' => 'woocn', + 'type' => 'radio', + 'title' => __( 'Woo电商', 'wp-china-yes' ), + 'inline' => true, + 'options' => [ + 'cn' => '默认线路', + 'global' => '国际线路', + 'off' => '不启用' + ], + 'default' => 'cn', + 'subtitle' => '是否启用灯鹿用户', + 'desc' => __( '灯鹿用户(DeerLogin)Gravatar 在中国的完美替代方案,您可以在 Cravatar.com 上传头像,更多选项请安装 WPAavatar 插件。可自选加速线路。', + 'wp-china-yes' ), + ], + ], + ] ); + } + + + + if (in_array('lelms', $enabled_sections)) { + WP_CHINA_YES::createSection( $this->prefix, [ + 'title' => '乐尔达思', + 'icon' => 'icon icon-teacher', + 'fields' => [ + [ + 'id' => 'lelms', + 'type' => 'radio', + 'title' => __( '乐尔达思', 'wp-china-yes' ), + 'inline' => true, + 'options' => [ + 'cn' => '默认线路', + 'global' => '国际线路', + 'off' => '不启用' + ], + 'default' => 'cn', + 'subtitle' => '是否启用乐尔达思', + 'desc' => __( '乐尔达思(LeLMS)Gravatar 在中国的完美替代方案,您可以在 Cravatar.com 上传头像,更多选项请安装 WPAavatar 插件。可自选加速线路。', + 'wp-china-yes' ), + ], + ], + ] ); + } + + + + if (in_array('wapuu', $enabled_sections)) { + WP_CHINA_YES::createSection( $this->prefix, [ + 'title' => '瓦普文创', + 'icon' => 'icon icon-ticket-discount', + 'fields' => [ + [ + 'id' => 'wapuu', + 'type' => 'radio', + 'title' => __( '瓦普文创', 'wp-china-yes' ), + 'inline' => true, + 'options' => [ + 'cn' => '默认线路', + 'global' => '国际线路', + 'off' => '不启用' + ], + 'default' => 'cn', + 'subtitle' => '是否启用瓦普文创', + 'desc' => __( '瓦普文创(Wapuu)Gravatar 在中国的完美替代方案,您可以在 Cravatar.com 上传头像,更多选项请安装 WPAavatar 插件。可自选加速线路。', + 'wp-china-yes' ), + ], + ], + ] ); + } + + +if (in_array('adblock', $enabled_sections)) { +WP_CHINA_YES::createSection( $this->prefix, [ + 'title' => '广告拦截', + 'icon' => 'icon icon-eye-slash', + 'fields' => [ + [ + 'id' => 'adblock', + 'type' => 'radio', + 'title' => __( '广告拦截', 'wp-china-yes' ), + 'inline' => true, + 'options' => [ + 'on' => '启用', + 'off' => '不启用', + ], + 'default' => 'off', + 'subtitle' => '是否启用后台广告拦截', + 'desc' => __( '文派叶子🍃(WPCY.COM)独家特色功能,让您拥有清爽整洁的 WordPress 后台,清除各类常用插件侵入式后台广告、通知及无用信息,拿回后台控制权。', + 'wp-china-yes' ), + ], + [ + 'id' => 'adblock_rule', + 'type' => 'group', + 'title' => '规则列表', + 'subtitle' => '使用的广告拦截规则列表', + 'desc' => __( '默认规则跟随插件更新,插件更新后可删除规则重新添加以获取更多最新拦截规则,出现异常,请尝试先停用规则排查原因。', + 'wp-china-yes' ), + 'button_title' => '添加规则', + 'accordion_title_number' => true, + 'dependency' => [ + 'adblock', + 'any', + 'on', + ], + 'fields' => [ + [ + 'id' => 'name', + 'type' => 'text', + 'title' => __( '规则名称', 'wp-china-yes' ), + 'subtitle' => '自定义规则名称', + 'desc' => __( '自定义规则名称,方便识别', + 'wp-china-yes' ), + 'default' => '默认规则', + ], + [ + 'id' => 'selector', + 'type' => 'textarea', + 'title' => __( '应用元素', 'wp-china-yes' ), + 'subtitle' => '规则应用元素', + 'desc' => __( '设置规则应用的广告元素(CSS 选择器)', + 'wp-china-yes' ), + 'default' => '.wpseo_content_wrapper', + 'sanitize' => false, + ], + [ + 'id' => 'enable', + 'type' => 'switcher', + 'title' => __( '启用规则', 'wp-china-yes' ), + 'subtitle' => '是否启用该规则', + 'default' => true, + ], + ], + ], + ], +] ); + } + + +if (in_array('notice', $enabled_sections)) { +WP_CHINA_YES::createSection( $this->prefix, [ + 'title' => '通知管理', + 'icon' => 'icon icon-notification-bing', + 'fields' => [ + [ + 'id' => 'notice_block', + 'type' => 'radio', + 'title' => __('通知管理', 'wp-china-yes'), + 'inline' => true, + 'options' => [ + 'on' => '启用', + 'off' => '不启用', + ], + 'default' => 'off', + 'subtitle' => '是否启用后台通知管理', + 'desc' => __('管理和控制 WordPress 后台各类通知的显示。', 'wp-china-yes'), + ], + [ + 'id' => 'disable_all_notices', + 'type' => 'switcher', + 'title' => __('禁用所有通知', 'wp-china-yes'), + 'subtitle' => '一键禁用所有后台通知', + 'default' => false, + 'dependency' => ['notice_block', '==', 'on'], + ], + [ + 'id' => 'notice_control', + 'type' => 'checkbox', + 'title' => __('选择性禁用', 'wp-china-yes'), + 'inline' => true, + 'subtitle' => '选择需要禁用的通知类型', + 'desc' => __('可以按住 Ctrl/Command 键进行多选', 'wp-china-yes'), + 'chosen' => true, + 'multiple' => true, + 'options' => [ + 'core' => '核心更新通知', + 'error' => '错误通知', + 'warning' => '警告通知', + 'info' => '信息通知', + 'success' => '成功通知', + ], + 'dependency' => ['notice_block|disable_all_notices', '==|==', 'on|false'], + 'default' => [], + ], + [ + 'id' => 'notice_method', + 'type' => 'radio', + 'title' => __('禁用方式', 'wp-china-yes'), + 'inline' => true, + 'options' => [ + 'hook' => '移除钩子(推荐)', + 'css' => 'CSS隐藏', + 'both' => '双重保险', + ], + 'default' => 'hook', + 'dependency' => ['notice_block|disable_all_notices', '==|==', 'on|false'], + ], + ], +] ); + } + + + + if (in_array('plane', $enabled_sections)) { WP_CHINA_YES::createSection( $this->prefix, [ 'title' => '飞行模式', 'icon' => 'icon icon-airplane', @@ -371,7 +751,6 @@ HTML, 'subtitle' => '飞行模式使用的 URL 屏蔽规则列表', 'desc' => __( '支持添加多条 URL 屏蔽规则', 'wp-china-yes' ), - 'button_title' => '添加规则', 'accordion_title_number' => true, 'dependency' => [ @@ -411,8 +790,9 @@ HTML, ] ], ] ); + } - +if (in_array('monitor', $enabled_sections)) { WP_CHINA_YES::createSection( $this->prefix, [ 'title' => '脉云维护', 'icon' => 'icon icon-story', @@ -431,7 +811,7 @@ WP_CHINA_YES::createSection( $this->prefix, [ 'type' => 'switcher', 'default' => true, 'title' => '系统监控', - 'subtitle' => '自动监控站点系统运行状态', + 'subtitle' => '自动监控系统运行状态', 'desc' => __( '支持在管理后台页脚中显示系统运行状态,包括内存使用、CPU负载、MySQL版本、调试状态等信息', 'wp-china-yes' ), ], @@ -442,73 +822,399 @@ WP_CHINA_YES::createSection( $this->prefix, [ 'inline' => true, 'options' => [ 'memory_usage' => '内存使用量', - 'wp_limit' => 'WP内存限制', - 'server_ip' => '服务器IP', - 'hostname' => '主机名', + 'wp_limit' => '内存限制', + 'server_ip' => '服务器 IP', + 'hostname' => '主机名称', 'os_info' => '操作系统', - 'php_info' => 'PHP信息', + 'mysql_version'=> 'MySQL版本', 'cpu_usage' => 'CPU使用率', 'debug_status' => '调试状态', - 'mysql_version'=> 'MySQL版本' + 'php_info' => 'PHP 版本' ], 'default' => [ 'memory_usage', 'wp_limit', 'server_ip', - 'os_info', 'php_info', - 'cpu_usage', - 'debug_status', - 'mysql_version' ], 'subtitle' => '选择页脚要显示的信息', 'desc' => __( '为网站维护人员提供参考依据,无需登录服务器即可查看相关信息参数','wp-china-yes' ), 'dependency' => ['memory', '==', 'true'], ], [ - 'type' => 'content', - 'content' => '启用隐藏设置前请务必的保存或收藏当前设置页面 URL,否则您将无法再次进入插件设置页面', + 'id' => 'disk', + 'type' => 'switcher', + 'default' => true, + 'title' => '站点监控', + 'subtitle' => '自动监控站点运行状态', + 'desc' => __( '支持在管理后台页脚中显示系统运行状态,包括内存使用、CPU负载、MySQL版本、调试状态等信息', + 'wp-china-yes' ), + ], + [ + 'id' => 'disk_display', + 'type' => 'checkbox', + 'title' => __( '显示参数', 'wp-china-yes' ), + 'inline' => true, + 'options' => [ + 'disk_usage' => '磁盘用量', + 'disk_limit' => '剩余空间', + 'media_num' => '媒体数量', + 'admin_num' => '管理数量', + 'user_num' => '用户数量', + 'lastlogin' => '上次登录', + ], + 'default' => [ + 'disk_usage', + 'disk_limit', + 'media_num', + 'admin_num', + ], + 'subtitle' => '选择概览要显示的信息', + 'desc' => __( '为网站管理人员提供参考依据,进入后台仪表盘即可查看相关信息参数','wp-china-yes' ), + 'dependency' => ['disk', '==', 'true'], + ], +[ + 'id' => 'maintenance_mode', + 'type' => 'switcher', + 'default' => false, + 'title' => '启用维护模式', + 'subtitle' => '启用或禁用网站维护模式', + 'desc' => __( '启用后,网站将显示维护页面,只有管理员可以访问。', 'wp-china-yes' ), +], +[ + 'id' => 'maintenance_settings', + 'type' => 'fieldset', + 'title' => '维护模式设置', + 'fields' => [ + [ + 'id' => 'maintenance_title', + 'type' => 'text', + 'title' => '页面标题', + 'default' => '网站维护中', + ], + [ + 'id' => 'maintenance_heading', + 'type' => 'text', + 'title' => '主标题', + 'default' => '网站维护中', + ], + [ + 'id' => 'maintenance_message', + 'type' => 'textarea', + 'title' => '维护说明', + 'default' => '网站正在进行例行维护,请稍后访问。感谢您的理解与支持!', + ], + ], + 'dependency' => ['maintenance_mode', '==', 'true'], +] + + ], +] ); + } + + if (in_array('security', $enabled_sections)) { + WP_CHINA_YES::createSection( $this->prefix, [ + 'title' => '雨滴安全', + 'icon' => 'icon icon-shield', + 'fields' => [ + [ + 'id' => 'yoodefender', + 'type' => 'radio', + 'title' => __( '雨滴安全', 'wp-china-yes' ), + 'inline' => true, + 'options' => [ + 'cn' => '默认线路', + 'global' => '国际线路', + 'off' => '不启用' + ], + 'default' => 'cn', + 'subtitle' => '是否启用雨滴安全', + 'desc' => __( '雨滴安全(YooDefender)安全设置可以帮助增强 WordPress 的安全性,请根据实际需求启用相关选项。更多选项请安装 WPBan 插件。可自选加速线路。', + 'wp-china-yes' ), + ], + [ + 'id' => 'disallow_file_edit', + 'type' => 'switcher', + 'title' => __( '禁用文件编辑', 'wp-china-yes' ), + 'subtitle' => '禁用 WordPress 后台的主题和插件编辑器', + 'default' => true, + 'desc' => __( '启用后,用户无法通过 WordPress 后台编辑主题和插件文件。', 'wp-china-yes' ), + ], + [ + 'id' => 'disallow_file_mods', + 'type' => 'switcher', + 'title' => __( '禁用文件修改', 'wp-china-yes' ), + 'subtitle' => '禁止用户安装、更新或删除主题和插件', + 'default' => false, + 'desc' => __( '启用后,用户无法通过 WordPress 后台安装、更新或删除主题和插件。', 'wp-china-yes' ), ], ], ] ); - + } + if (in_array('performance', $enabled_sections)) { WP_CHINA_YES::createSection( $this->prefix, [ - 'title' => '品牌白标', - 'icon' => 'icon icon-password-check', - 'fields' => [ + 'title' => '性能优化', + 'icon' => 'icon icon-speedometer', + 'fields' => [ + [ + 'id' => 'performance', + 'type' => 'switcher', + 'title' => __( '性能优化', 'wp-china-yes' ), + 'subtitle' => '是否启用性能优化', + 'default' => true, + 'desc' => __( '性能优化设置可以帮助提升 WordPress 的运行效率,请根据服务器配置合理调整。', 'wp-china-yes' ), + ], + + [ + 'id' => 'wp_memory_limit', + 'type' => 'text', + 'title' => __( '内存限制', 'wp-china-yes' ), + 'subtitle' => '设置 WordPress 内存限制', + 'default' => '40M', + 'desc' => __( '设置 WordPress 的内存限制,例如 64M、128M、256M 等。', 'wp-china-yes' ), + 'dependency' => ['performance', '==', 'true'], + + ], + [ + 'id' => 'wp_max_memory_limit', + 'type' => 'text', + 'title' => __( '后台内存限制', 'wp-china-yes' ), + 'subtitle' => '设置 WordPress 后台内存限制', + 'default' => '256M', + 'desc' => __( '设置 WordPress 后台的内存限制,例如 128M、256M、512M 等。', 'wp-china-yes' ), + 'dependency' => ['performance', '==', 'true'], + + ], + [ + 'id' => 'wp_post_revisions', + 'type' => 'number', + 'title' => __( '文章修订版本', 'wp-china-yes' ), + 'subtitle' => '控制文章修订版本的数量', + 'default' => -1, // -1 表示启用所有修订版本 + 'desc' => __( '设置为 0 禁用修订版本,或设置为一个固定值(如 5)限制修订版本数量。', 'wp-china-yes' ), + 'dependency' => ['performance', '==', 'true'], + + ], + [ + 'id' => 'autosave_interval', + 'type' => 'number', + 'title' => __( '自动保存间隔', 'wp-china-yes' ), + 'subtitle' => '设置文章自动保存的时间间隔(秒)', + 'default' => 60, + 'desc' => __( '设置文章自动保存的时间间隔,默认是 60 秒。', 'wp-china-yes' ), + 'dependency' => ['performance', '==', 'true'], + + ], + ], + +] ); + } + + if (in_array('brand', $enabled_sections)) { + WP_CHINA_YES::createSection( $this->prefix, [ + 'title' => '品牌白标', + 'icon' => 'icon icon-password-check', + 'fields' => [ + [ + 'id' => 'custom_name', + 'type' => 'text', + 'title' => '品牌白标', + 'subtitle' => '自定义插件显示品牌名', + 'desc' => __( '专为 WordPress 建站服务商和代理机构提供的自定义品牌 OEM 功能,输入您的品牌词启用后生效', 'wp-china-yes' ), + 'default' => "文派叶子", + ], + [ + 'id' => 'header_logo', + 'type' => 'media', + 'title' => '品牌 Logo', + 'subtitle' => '自定义插件显示品牌 Logo', + 'library' => 'image', + 'desc' => '上传或选择媒体库的图片作为品牌 Logo', + 'default' => ['url' => plugins_url('wp-china-yes/assets/images/wpcy-logo.png')], // 设置默认 Logo + ], [ - 'id' => 'custom_name', - 'type' => 'text', - 'title' => '品牌白标', - 'subtitle' => '自定义插件显示品牌名', - 'desc' => __( '专为 WordPress 建站服务商和代理机构提供的自定义品牌 OEM 功能,输入您的品牌词启用后生效', + 'id' => 'hide_option', + 'type' => 'switcher', + 'default' => false, + 'title' => '隐藏设置', + 'subtitle' => '隐藏插件设置信息', + 'desc' => __( '如果您不希望让客户知道本站启用了文派叶子🍃(WPCY.COM)插件及服务,可开启此选项。', 'wp-china-yes' ), - 'default' => "WP-China-Yes", ], - [ - 'type' => 'content', - 'content' => '启用隐藏设置前请务必的保存或收藏当前设置页面 URL,否则您将无法再次进入插件设置页面', - ], - ], - ] ); - + [ + 'id' => 'hide_elements', + 'type' => 'checkbox', + 'title' => '隐藏元素', + 'subtitle' => '选择需要隐藏的元素', + 'desc' => __( '注意:启用[隐藏菜单]前请务必保存或收藏当前设置页面 URL,否则将无法再次进入插件页面', 'wp-china-yes' ), + 'inline' => true, + 'options' => [ + 'hide_logo' => '隐藏 Logo', + 'hide_title' => '隐藏插件名', + 'hide_version' => '隐藏版本号', + 'hide_copyright' => '隐藏版权', + 'hide_menu' => '隐藏菜单', + ], + 'default' => [], // 默认不隐藏任何元素 + 'dependency' => ['hide_option', '==', 'true'], // 只有在 hide 为 true 时显示 + ], + [ + 'id' => 'enable_custom_rss', + 'type' => 'switcher', + 'title' => '品牌新闻', + 'subtitle' => '是否启用定制新闻源', + 'desc' => '启用后,您可以自定义[文派茶馆]新闻源,输入自己的 RSS 源之后即可显示信息流。', + 'default' => false + ], + [ + 'id' => 'custom_rss_url', + 'type' => 'text', + 'title' => '自定义 RSS 源', + 'subtitle' => '添加自定义 RSS 新闻源', + 'desc' => '请输入有效的 RSS Feed URL,长期无更新时会恢复显示默认新闻源。', + 'dependency' => ['enable_custom_rss', '==', true] + ], + [ + 'id' => 'custom_rss_refresh', + 'type' => 'select', + 'title' => 'RSS 刷新频率', + 'options' => [ + '1800' => '30分钟', + '3600' => '1小时', + '7200' => '2小时', + '14400' => '4小时', + '28800' => '8小时' + ], + 'default' => '3600', + 'dependency' => ['enable_custom_rss', '==', true] + ], + [ + 'id' => 'rss_display_options', + 'type' => 'checkbox', + 'inline' => true, + 'title' => 'RSS 显示选项', + 'subtitle' => '选择需要显示的内容', + 'options' => [ + 'show_date' => '显示日期', + 'show_summary' => '显示摘要', + 'show_footer' => '显示页脚', + ], + 'default' => ['show_date', 'show_summary', 'show_footer'], // 默认全部勾选 + 'dependency' => ['enable_custom_rss', '==', true] + ], + + ], +]); + } + WP_CHINA_YES::createSection( $this->prefix, [ 'title' => '其他设置', 'icon' => 'icon icon-setting', 'fields' => [ - [ - 'id' => 'hide', - 'type' => 'switcher', - 'default' => false, - 'title' => '隐藏设置', - 'subtitle' => '隐藏插件设置入口', - 'desc' => __( '如果您不希望让客户知道本站启用了文派叶子🍃(WP-China-Yes)插件及服务,可开启此选项', - 'wp-china-yes' ), - ], - ], + [ + 'id' => 'enable_debug', + 'type' => 'switcher', + 'title' => __( '调试模式', 'wp-china-yes' ), + 'subtitle' => '启用或禁用调试模式', + 'default' => false, + 'desc' => __( '启用后,WordPress 将显示 PHP 错误、警告和通知。临时使用完毕后,请保持禁用此选项。', 'wp-china-yes' ), + ], + [ + 'id' => 'debug_options', + 'type' => 'checkbox', + 'title' => __( '调试选项', 'wp-china-yes' ), + 'subtitle' => '选择要启用的调试功能', + 'dependency' => [ 'enable_debug', '==', 'true' ], + 'options' => [ + 'wp_debug_log' => 'WP_DEBUG_LOG 记录日志', + 'wp_debug_display' => 'WP_DEBUG_DISPLAY 页面显示调试信息', + 'script_debug' => 'SCRIPT_DEBUG 加载未压缩的前端资源', + 'save_queries' => 'SAVEQUERIES 记录数据库查询 ', + ], + 'default' => [ + 'wp_debug_log' => true, + ], + 'desc' => __( '注意:调试模式仅适用于开发和测试环境,不建议在生产环境中长时间启用。选择要启用的调试功能,适用于开发和测试环境。', 'wp-china-yes' ), + ], + [ + 'id' => 'enable_db_tools', + 'type' => 'switcher', + 'title' => __( '数据库工具', 'wp-china-yes' ), + 'subtitle' => '启用或禁用数据库工具', + 'default' => false, + 'desc' => __( '启用后,您可以在下方访问数据库修复工具。定期使用完毕后,请保持禁用此选项。', 'wp-china-yes' ), + ], + [ + 'id' => 'db_tools_link', + 'type' => 'content', + 'title' => __( '数据库修复工具', 'wp-china-yes' ), + 'subtitle' => '打开数据库修复工具', + 'dependency' => [ 'enable_db_tools', '==', 'true' ], + 'content' => '' . esc_html__( '打开数据库修复工具', 'wp-china-yes' ) . '', + ], +[ + 'id' => 'enable_sections', + 'type' => 'switcher', + 'title' => '高级定制', + 'subtitle' => '启用或禁用功能选项卡', + 'default' => true, + 'desc' => __( '启用后,您可以在下方选用文派叶子功能,特别提醒:禁用对应功能后再次启用需重新设置。', 'wp-china-yes' ), +], +[ + 'id' => 'enabled_sections', + 'type' => 'checkbox', + 'title' => '功能选项卡', + 'subtitle' => '选择要显示的功能选项卡', + 'inline' => true, + 'options' => [ + 'store' => '应用市场', + 'admincdn' => '萌芽加速', + 'cravatar' => '初认头像', + 'windfonts' => '文风字体', + 'motucloud' => '墨图云集', + 'fewmail' => '飞秒邮箱', + 'wordyeah' => '无言会语', + 'blocks' => '笔笙区块', + 'deerlogin' => '灯鹿用户', + 'waimao' => '跨飞外贸', + 'woocn' => 'Woo电商', + 'lelms' => '乐尔达思', + 'wapuu' => '瓦普文创', + 'adblock' => '广告拦截', + 'notice' => '通知管理', + 'plane' => '飞行模式', + 'monitor' => '脉云维护', + 'forums' => '赛博论坛', + 'monitor' => '脉云维护', + 'forms' => '重力表单', + 'panel' => '天控面板', + 'security' => '雨滴安全', + 'domain' => '蛋叮域名', + 'performance' => '性能优化', + 'brand' => '品牌白标', + 'sms' => '竹莺短信', + 'chat' => '点洽客服', + 'translate' => '文脉翻译', + 'ecosystem' => '生态系统', + 'deer' => '建站套件', + 'docs' => '帮助文档', + 'about' => '关于插件', + 'welcome' => '欢迎使用' + ], + 'default' => ['welcome', 'store', 'admincdn', 'cravatar', 'other', 'about'], + 'desc' => '选择要在设置页面显示的功能选项卡,未选择的选项卡将被隐藏', + 'dependency' => ['enable_sections', '==', 'true'], +] + + ], ] ); + if (in_array('deer', $enabled_sections)) { + $settings_page_url = $this->get_settings_page_url(); + ob_start(); + include CHINA_YES_PLUGIN_PATH . 'templates/website-section.php'; + $website_content = ob_get_clean(); WP_CHINA_YES::createSection( $this->prefix, [ 'title' => '建站套件', @@ -516,49 +1222,58 @@ WP_CHINA_YES::createSection( $this->prefix, [ 'fields' => [ [ 'type' => 'content', - 'content' => - <<

        开源建站

        文派寻鹿🦌(WP Deer)建站套件是由文派科技官方提供的企业建站产品集合,代码均为 100% GPL 开源,无任何加密隐藏。

        SEO 优化技巧

        WPXYZ.com ↗

        网站政策合规

        WPICP.com ↗

        软件开发工具

        WPSDK.com ↗
        -HTML, + 'content' =>$website_content, ] ], ] ); + } + + + if (in_array('docs', $enabled_sections)) { + WP_CHINA_YES::createSection( $this->prefix, [ + 'title' => '帮助文档', + 'icon' => 'icon icon-lifebuoy', + 'fields' => [ + [ + 'id' => 'docs', + 'type' => 'radio', + 'title' => __( '帮助文档', 'wp-china-yes' ), + 'inline' => true, + 'options' => [ + 'cn' => '默认线路', + 'global' => '国际线路', + 'off' => '不启用' + ], + 'default' => 'cn', + 'subtitle' => '是否启用灯鹿用户', + 'desc' => __( '灯鹿用户(DeerLogin)Gravatar 在中国的完美替代方案,您可以在 Cravatar.com 上传头像,更多选项请安装 WPAavatar 插件。可自选加速线路。', + 'wp-china-yes' ), + ], + ], + ] ); + } - + if (in_array('about', $enabled_sections)) { + $settings_page_url = $this->get_settings_page_url(); + ob_start(); + include CHINA_YES_PLUGIN_PATH . 'templates/about-section.php'; + $about_content = ob_get_clean(); + WP_CHINA_YES::createSection( $this->prefix, [ 'title' => '关于插件', 'icon' => 'icon icon-info-circle', 'fields' => [ [ 'type' => 'content', - 'content' => - <<
        -

        项目简介

        文派(WordPress)中国本土化项目始于 2019 年,由 文派叶子🍃(WPCY) 插件开启,其前身为 WP-China-Yes。 - -

        2023 年 5 月,文派科技完成对该项目的收购,并对其进行了全面的品牌重塑。

        -

        赞助支持

        特别感谢以下企业品牌对文派项目提供的资金资源支持。早期伙伴未来有机会共享文派生态资源,期待社会各界参与。

        开发 & 贡献者

        100% 开源代码,诚邀您一起参与文派 (WordPress) 软件国产化进程,打造属于自己的开源自助建站程序。

        -HTML, + 'content' =>$about_content, ] ], ] ); } - + } + /** * 加载后台资源 */ @@ -582,6 +1297,8 @@ HTML, return $plugins; } ); + + // 插件页设置 add_filter( 'plugin_action_links', function ( $links, $file ) { if ( 'wp-china-yes/wp-china-yes.php' !== $file ) { @@ -595,4 +1312,4 @@ HTML, return $links; }, 10, 2 ); } -} +} \ No newline at end of file diff --git a/Service/Super.php b/Service/Super.php index 7f664ca..8298bef 100755 --- a/Service/Super.php +++ b/Service/Super.php @@ -31,148 +31,152 @@ class Super { /** * 添加「文派茶馆」小组件 */ - if ( is_admin() ) { - add_action( 'wp_dashboard_setup', function () { - global $wp_meta_boxes; +if ( is_admin() ) { + add_action( 'wp_dashboard_setup', function () { + global $wp_meta_boxes; - unset( $wp_meta_boxes['dashboard']['side']['core']['dashboard_primary'] ); - wp_add_dashboard_widget( 'wenpai_tea', '文派茶馆', function () { - echo << -
        + unset( $wp_meta_boxes['dashboard']['side']['core']['dashboard_primary'] ); + wp_add_dashboard_widget( 'wenpai_tea', '文派茶馆', function () { + $default_rss_url = 'https://wptea.com/feed/'; + $custom_rss_url = $this->settings['custom_rss_url'] ?? ''; + $refresh_interval = $this->settings['custom_rss_refresh'] ?? 3600; + + $rss_display_options = $this->settings['rss_display_options'] ?? ['show_date', 'show_summary', 'show_footer']; + if (!is_array($rss_display_options)) { + $rss_display_options = explode(',', $rss_display_options); + } + + // 获取默认的 RSS 源内容 + $default_rss = fetch_feed($default_rss_url); + $default_items = []; + if (!is_wp_error($default_rss)) { + $default_items = $default_rss->get_items(0, 5); + } + + $custom_items = []; + $custom_rss = null; + $custom_rss_latest_date = 0; + + if (!empty($custom_rss_url)) { + $transient_key = 'wenpai_tea_custom_rss_' . md5($custom_rss_url); + $cached_custom_items = get_transient($transient_key); + + if (false === $cached_custom_items) { + $custom_rss = fetch_feed($custom_rss_url); + if (!is_wp_error($custom_rss)) { + $custom_items = $custom_rss->get_items(0, 2); + if (!empty($custom_items)) { + $custom_rss_latest_date = $custom_items[0]->get_date('U'); + } + + set_transient($transient_key, $custom_items, $refresh_interval); + } + } else { + $custom_items = $cached_custom_items; + if (!empty($custom_items)) { + $custom_rss_latest_date = $custom_items[0]->get_date('U'); + } + } + } + + $three_days_ago = time() - (3 * 24 * 60 * 60); + if ($custom_rss_latest_date > $three_days_ago) { + $items = array_merge(array_slice($default_items, 0, 3), $custom_items); + } else { + $items = array_slice($default_items, 0, 5); + } + + if (is_wp_error($custom_rss)) { + $items = array_slice($default_items, 0, 5); + } + + echo << +
        HTML; - wp_widget_rss_output( 'https://wptea.com/feed/', [ - 'items' => 5, - 'show_summary' => 1, - ] ); - echo << -
        - - + foreach ($items as $item) { + echo '
        '; + echo '' . esc_html($item->get_title()) . ''; + if (in_array('show_date', $rss_display_options)) { + echo '' . esc_html($item->get_date('Y.m.d')) . ''; + } + if (in_array('show_summary', $rss_display_options)) { + echo '
        ' . esc_html(wp_trim_words($item->get_description(), 45, '...')) . '
        '; + } + echo '
        '; + } + + echo << +
        HTML; - } ); - } ); - add_action( 'wp_network_dashboard_setup', function () { - global $wp_meta_boxes; - - unset( $wp_meta_boxes['dashboard-network']['side']['core']['dashboard_primary'] ); - wp_add_dashboard_widget( 'wenpai_tea', '文派茶馆', function () { - echo << -
        + if (in_array('show_footer', $rss_display_options)) { + echo << + 文派开源 + | + 支持论坛 + | + 翻译平台 + | + 订阅推送 +

        HTML; - wp_widget_rss_output( 'https://wptea.com/feed/', [ - 'items' => 5, - 'show_summary' => 1, - ] ); - echo << -
        - - + } + echo << + #wenpai_tea .rss-widget { + padding: 0 12px; + } + #wenpai_tea .rss-widget:last-child { + border-bottom: none; + padding-bottom: 8px; + } + #wenpai_tea .rss-item { + margin-bottom: 10px; + padding-bottom: 10px; + border-bottom: 1px solid #eee; + } + #wenpai_tea .rss-item:last-child { + border-bottom: none; + margin-bottom: 0; + padding-bottom: 0; + } + #wenpai_tea .rss-item a { + text-decoration: none; + display: block; + margin-bottom: 5px; + } + #wenpai_tea .rss-date { + color: #666; + font-size: 12px; + display: block; + margin-bottom: 8px; + } + #wenpai_tea .rss-summary { + color: #444; + font-size: 13px; + line-height: 1.5; + } + #wenpai_tea .community-events-footer { + margin-top: 15px; + padding-top: 15px; + padding-bottom: 5px; + border-top: 1px solid #eee; + text-align: center; + } + #wenpai_tea .community-events-footer a { + text-decoration: none; + margin: 0 5px; + } + #wenpai_tea .community-events-footer a:hover { + text-decoration: underline; + } + HTML; - } ); - } ); - } - - /** - * WordPress 核心静态文件链接替换 - */ - if ( is_admin() && ! ( defined( 'DOING_AJAX' ) && DOING_AJAX ) ) { - if ( - in_array( 'admin', (array) $this->settings['admincdn'] ) && - ! stristr( $GLOBALS['wp_version'], 'alpha' ) && - ! stristr( $GLOBALS['wp_version'], 'beta' ) && - ! stristr( $GLOBALS['wp_version'], 'RC' ) - ) { - // 禁用合并加载,以便于使用公共资源节点 - global $concatenate_scripts; - $concatenate_scripts = false; - - $this->page_str_replace( 'init', 'preg_replace', [ - '~' . home_url( '/' ) . '(wp-admin|wp-includes)/(css|js)/~', - sprintf( 'https://wpstatic.admincdn.com/%s/$1/$2/', $GLOBALS['wp_version'] ) - ] ); - } - } - - /** - * adminCDN - */ - if ( ! ( defined( 'DOING_AJAX' ) && DOING_AJAX ) ) { - $this->load_admincdn(); - } + }); + }); +} /** * 初认头像 @@ -214,6 +218,14 @@ HTML; add_action( 'admin_head', [ $this, 'load_adblock' ] ); } } +/** + * 通知管理 + */ +if ( ! ( defined( 'DOING_AJAX' ) && DOING_AJAX ) ) { + if ( ! empty( $this->settings['notice_block'] ) && $this->settings['notice_block'] == 'on' ) { + add_action( 'admin_head', [ $this, 'load_notice_management' ] ); + } +} /** * 飞行模式 @@ -223,70 +235,7 @@ HTML; } } - /** - * 加载 adminCDN - */ - public function load_admincdn() { - /** - * 前台静态加速 - */ - if ( in_array( 'frontend', (array) $this->settings['admincdn'] ) ) { - $this->page_str_replace( 'template_redirect', 'preg_replace', [ - '#(?<=[(\"\'])(?:' . quotemeta( home_url() ) . ')?/(?:((?:wp-content|wp-includes)[^\"\')]+\.(css|js)[^\"\')]+))(?=[\"\')])#', - 'https://public.admincdn.com/$0' - ] ); - } - /** - * Google 字体替换 - */ - if ( in_array( 'googlefonts', (array) $this->settings['admincdn'] ) ) { - $this->page_str_replace( 'init', 'str_replace', [ - 'fonts.googleapis.com', - 'googlefonts.admincdn.com' - ] ); - } - - /** - * Google 前端公共库替换 - */ - if ( in_array( 'googleajax', (array) $this->settings['admincdn'] ) ) { - $this->page_str_replace( 'init', 'str_replace', [ - 'ajax.googleapis.com', - 'googleajax.admincdn.com' - ] ); - } - - /** - * CDNJS 前端公共库替换 - */ - if ( in_array( 'cdnjs', (array) $this->settings['admincdn'] ) ) { - $this->page_str_replace( 'init', 'str_replace', [ - 'cdnjs.cloudflare.com/ajax/libs', - 'cdnjs.admincdn.com' - ] ); - } - - /** - * jsDelivr 前端公共库替换 - */ - if ( in_array( 'jsdelivr', (array) $this->settings['admincdn'] ) ) { - $this->page_str_replace( 'init', 'str_replace', [ - 'cdn.jsdelivr.net', - 'jsd.admincdn.com' - ] ); - } - - /** - * BootstrapCDN 前端公共库替换 - */ - if ( in_array( 'bootstrapcdn', (array) $this->settings['admincdn'] ) ) { - $this->page_str_replace( 'init', 'str_replace', [ - 'maxcdn.bootstrapcdn.com', - 'jsd.admincdn.com' - ] ); - } - } /** @@ -470,6 +419,7 @@ HTML // 支持中文排版两端对齐 if ( in_array( 'align', (array) $this->settings['windfonts_typography'] ) ) { add_action( 'wp_head', function () { + if ( is_single() ) { // 仅在文章页面生效 echo ''; + } } ); } } - /** - * 加载广告拦截 - */ - public function load_adblock() { - foreach ( (array) $this->settings['adblock_rule'] as $rule ) { - if ( empty( $rule['enable'] ) ) { - continue; - } - if ( empty( $rule['selector'] ) ) { - continue; - } - echo sprintf( << - %s { - display: none!important; - } - -HTML - , - htmlspecialchars_decode( $rule['selector'] ) - ); - } - } +/** + * 加载广告拦截 + */ +public function load_adblock() { + if (empty($this->settings['adblock']) || $this->settings['adblock'] !== 'on') { + return; + } + + // 处理广告拦截规则 + foreach ( (array) $this->settings['adblock_rule'] as $rule ) { + if ( empty( $rule['enable'] ) || empty( $rule['selector'] ) ) { + continue; + } + echo sprintf( '', + htmlspecialchars_decode( $rule['selector'] ) + ); + } +} + + +/** + * 加载通知管理 + */ +public function load_notice_management() { + // 首先检查是否启用通知管理功能 + if (empty($this->settings['notice_block']) || $this->settings['notice_block'] !== 'on') { + return; + } + + // 检查是否启用全局禁用 + if (!empty($this->settings['disable_all_notices'])) { + $this->disable_all_notices(); + echo ''; + return; + } + + // 处理选择性禁用 + $selected_notices = $this->settings['notice_control'] ?? []; + $notice_method = $this->settings['notice_method'] ?? 'hook'; + + if (!empty($selected_notices)) { + // 处理钩子移除 + if (in_array($notice_method, ['hook', 'both'])) { + $this->disable_selected_notices($selected_notices); + } + + // 处理 CSS 隐藏 + if (in_array($notice_method, ['css', 'both'])) { + $this->apply_notice_css($selected_notices); + } + } +} + +/** + * 应用通知 CSS 隐藏 + */ +private function apply_notice_css($selected_notices) { + $selectors = []; + foreach ($selected_notices as $type) { + switch ($type) { + case 'error': + $selectors[] = '.notice-error,.error'; + break; + case 'warning': + $selectors[] = '.notice-warning'; + break; + case 'success': + $selectors[] = '.notice-success,.updated'; + break; + case 'info': + $selectors[] = '.notice-info'; + break; + case 'core': + $selectors[] = '.update-nag'; + break; + } + } + + if (!empty($selectors)) { + echo ''; + } +} + +/** + * 移除所有管理通知 + */ +private function disable_all_notices() { + remove_all_actions('admin_notices'); + remove_all_actions('all_admin_notices'); + remove_all_actions('user_admin_notices'); + remove_all_actions('network_admin_notices'); +} + +/** + * 禁用选定的通知类型 + */ +private function disable_selected_notices($types) { + if (in_array('core', $types)) { + remove_action('admin_notices', 'update_nag', 3); + remove_action('admin_notices', 'maintenance_nag', 10); + add_filter('pre_site_transient_update_core', '__return_null'); + add_filter('pre_site_transient_update_plugins', '__return_null'); + add_filter('pre_site_transient_update_themes', '__return_null'); + } + +} + + /** * 加载飞行模式 diff --git a/assets/css/setting.css b/assets/css/setting.css index f69d956..f64de46 100755 --- a/assets/css/setting.css +++ b/assets/css/setting.css @@ -82,7 +82,7 @@ margin-right: 0px; } -.wp_china_yes-field.wp_china_yes-field-radio, .wp_china_yes-field-checkbox, .wp_china_yes-field-group, .wp_china_yes-field-switcher, .wp_china_yes-field-text { +.wp_china_yes-field { padding: 8%; background-color: #ffffff; margin: 5% 0; @@ -90,10 +90,32 @@ box-shadow: 0 0 0 1px #ccd0d4, 0 1px 1px 1px rgba(0, 0, 0, .04); } +.wp_china_yes-field.wp_china_yes-field-content { + padding: 0; + background-color: rgba(255, 255, 255, 0); + margin: 0; + border-radius: 0; + box-shadow: unset; +} .wp_china_yes-field-checkbox .wp_china_yes--inline-list li, .wp_china_yes-field-radio .wp_china_yes--inline-list li { margin-right: 20px; } +.wp_china_yes-copyright p { + font-size: 12px; + color: #999; +} +.wp_china_yes-copyright { + float: left; + margin-top: 25px; + margin-bottom: 35px; + text-align: center; + width: 100%; + font-size: 12px; + zoom: 90%; + +} + .wp_china_yes-section { margin: 50px auto; max-width: 1000px; @@ -108,9 +130,8 @@ .wp_china_yes-field+.wp_china_yes-field { border-top: 0px solid #eee; } - -.wp_china_yes-field.wp_china_yes-field-content { - padding: 0px; +.wp_china_yes-field-fieldset .wp_china_yes-fieldset-content { + border: 0px solid #ccd0d4; } .wp_china_yes-section-title { diff --git a/assets/images/wpcy-logo.png b/assets/images/wpcy-logo.png new file mode 100755 index 0000000000000000000000000000000000000000..2f8f1323302f61d28b99dfd6ca012bb7bbaeabfe GIT binary patch literal 32163 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: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 eaCr0oC%^#Ztvv=C<7Qm|0000请先填写 RSS 源地址'); + return; + } + + button.prop("disabled", true); + result.html("测试中..."); + + $.post(ajaxurl, { + action: "test_rss_feed", + _ajax_nonce: '', + feed_url: feedUrl + }) + .done(function(response) { + result.html(response.success ? + '' + response.data + '' : + '' + response.data + '' + ); + }) + .fail(function() { + result.html('测试失败'); + }) + .always(function() { + button.prop("disabled", false); + }); + }); + }); diff --git a/changelog.txt b/changelog.txt old mode 100644 new mode 100755 diff --git a/composer.json b/composer.json old mode 100644 new mode 100755 diff --git a/composer.lock b/composer.lock old mode 100644 new mode 100755 diff --git a/copyright.txt b/copyright.txt old mode 100644 new mode 100755 index 558b6d2..df51603 --- a/copyright.txt +++ b/copyright.txt @@ -1,28 +1,36 @@ ------------------------------------------------------------------------------------------ -**Copyright © 2025 WenPai.cn (Guangzhou) Technology Co., Ltd.** ------------------------------------------------------------------------------------------ - -**Compliance Terms** -Everyone is free to use Wenpai open-source software. However, in China, when using Wenpai software, you must adhere to the GPL open-source license, respect the intellectual property rights of others, and prioritize compliance with Chinese laws in case of any conflicts. - -**Fork Declaration** -To ensure the long-term availability of various Wenpai (WordPress) infrastructure components, individuals with the necessary capabilities are welcome to establish their own service sources or fork Wenpai Leaf 🍃 (WPCY) to create their own versions. - -**The Only Requirement:** -While strictly adhering to the GPL license, you must respect all lawful rights of Wenpai Technology, including (but not limited to) copyrights, trademarks, patents, intellectual property, goodwill, and more. - ------------------------------------------------------------------------------------------ -**版权所有 © 2025 年 文派(广州)科技有限公司** ------------------------------------------------------------------------------------------ - -**合规条款** -任何人都可以自由使用文派开源软件,但在中国,当您使用文派软件时,您应在遵守 GPL 开源协议的同时,尊重他人的知识产权,同时有违背中国法律的情况时皆以中国法律为准。 - -**分叉声明** -为保障各项文派 (WordPress) 基础设施的长久可用性,欢迎有能力的人自建各类服务源以及分叉文派叶子🍃(WPCY)来制作您自己的版本; - -**唯一要求:** -在严格遵守 GPL 协议的前提下,尊重文派科技的各项合法权益,包括 (不限于) 版权、商标、专利、知识产权、商誉等… - - - +----------------------------------------------------------------------------------------- +**Copyright © 2025 WenPai.cn (Guangzhou) Technology Co., Ltd.** +----------------------------------------------------------------------------------------- + +**Compliance Terms** +Everyone is free to use WenPai open-source software.However, in China, when using WenPai software, +you must adhere to the GPL open-source license, respect the intellectual property rights of others, +and prioritize compliance with Chinese laws in case of any conflicts. + +**Fork Declaration** +To ensure the long-term availability of various Wenpai (WordPress) infrastructure components, +individuals with the necessary capabilities are welcome to establish their own service sources +or fork WenPai Leaf 🍃 WP-China-Yes (WPCY) to create their own versions. + +**The Only Requirement:** +While strictly adhering to the GPL license, you must respect all lawful rights of WenPai Technology, +including (but not limited to) copyrights, trademarks, patents, intellectual property, goodwill, and more. + +----------------------------------------------------------------------------------------- +**版权所有 © 2025 年 文派(广州)科技有限公司** +----------------------------------------------------------------------------------------- + +**合规条款** +任何人都可以自由使用文派开源软件,但在中国,当您使用文派软件时,您应在遵守 GPL 开源协议的同时, +尊重他人的知识产权,同时有违背中国法律的情况时皆以中国法律为准。 + +**分叉声明** +为保障各项文派 (WordPress) 基础设施的长久可用性, +欢迎有能力的人自建各类服务源以及分叉文派叶子🍃(WPCY)来制作您自己的版本; + +**唯一要求:** +在严格遵守 GPL 协议的前提下,尊重文派科技的各项合法权益, +包括 (不限于) 版权、商标、专利、知识产权、商誉等… + + + diff --git a/framework/classes/admin-options.class.php b/framework/classes/admin-options.class.php index 3a9cb9d..152624f 100755 --- a/framework/classes/admin-options.class.php +++ b/framework/classes/admin-options.class.php @@ -497,9 +497,19 @@ if ( ! class_exists( 'WP_CHINA_YES_Options' ) ) { echo '
        '; echo '
        '; - echo '
        '; - echo '

        '. $this->args['framework_title'] .'

        '; - echo '
        '; +echo '
        '; +$hide_elements = !empty($this->options['hide_elements']) ? $this->options['hide_elements'] : []; +if (!in_array('hide_logo', $hide_elements)) { + $logo_url = !empty($this->options['header_logo']['url']) ? $this->options['header_logo']['url'] : plugins_url('wp-china-yes/assets/images/wpcy-logo.png'); + echo ''; +} +if (!in_array('hide_title', $hide_elements)) { + echo '

        '. $this->args['framework_title'] .'

        '; +} +if (!in_array('hide_version', $hide_elements)) { + echo '   v' . CHINA_YES_VERSION . ''; +} +echo '
        '; echo '
        '; @@ -572,6 +582,12 @@ if ( ! class_exists( 'WP_CHINA_YES_Options' ) ) { echo ''; + echo ''; + + echo '
        '; } @@ -625,8 +641,13 @@ if ( ! class_exists( 'WP_CHINA_YES_Options' ) ) { echo '
        '; + echo ''; + echo '
        '; + echo '
        '; echo ( $has_nav && $nav_type === 'normal' ) ? '
        ' : ''; diff --git a/templates/about-section.php b/templates/about-section.php new file mode 100755 index 0000000..ffbf1ed --- /dev/null +++ b/templates/about-section.php @@ -0,0 +1,48 @@ + +
        + +
        +
        +

        开发 & 贡献者

        +

        100% 开源代码,诚邀您一起参与文派 (WordPress) 软件国产化进程,打造属于自己的开源自助建站程序。

        + + +
        +
        +
        +
        diff --git a/templates/maintenance-default.php b/templates/maintenance-default.php new file mode 100755 index 0000000..9f314bf --- /dev/null +++ b/templates/maintenance-default.php @@ -0,0 +1,20 @@ +// templates/maintenance-default.php + +> + + + + <?php echo esc_html($title); ?> + + + +
        +

        +
        + +
        +
        + + diff --git a/templates/website-section.php b/templates/website-section.php new file mode 100755 index 0000000..9b31c7f --- /dev/null +++ b/templates/website-section.php @@ -0,0 +1,21 @@ + +
        +
        +
        +

        开源建站

        +

        文派寻鹿🦌(WP Deer)建站套件是由文派科技官方提供的企业建站产品集合,代码均为 100% GPL 开源,无任何加密隐藏。

        + +
        +
        +
        +
        +

        SEO 优化技巧

        WPXYZ.com ↗
        +
        +

        网站政策合规

        WPICP.com ↗
        +
        +

        软件开发工具

        WPSDK.com ↗
        +
        +
        +
        diff --git a/templates/welcome-section.php b/templates/welcome-section.php new file mode 100755 index 0000000..b3f8783 --- /dev/null +++ b/templates/welcome-section.php @@ -0,0 +1,56 @@ + +
        +
        +
        +

        原生体验

        +

        文派叶子🍃(WP-China-Yes)是一款不可多得的 WordPress 系统底层优化和生态基础设施软件。

        + +
        +
        +

        特色功能

        + +

        * 100% 兼容 WP 程序及分支发行版本,更多优秀插件待您体验。

        +
        +
        +
        +
        +

        网站加速

        +

        优化加速插件多如牛毛,为何文派叶子如此与众不同?

        进一步了解 ↗
        +
        +

        翻译推送

        +

        高质量翻译中文本地化翻译由文派开源官方提供,欢迎参与改进。

        本地化改进 ↗
        +
        +

        广告屏蔽

        +

        呈现清爽整洁的网站后台,清除侵入式后台广告、无用信息。

        获取广告规则 ↗
        +
        +
        +
        +

        加入我们

        +

        关注文派茶馆 WPTEA.com 公众号以及订阅我们的时事通讯即可接收独家内容、提示和更新。

        +
        + +
        +
        +
        diff --git a/wp-china-yes.php b/wp-china-yes.php index 9f05e67..d45f19b 100755 --- a/wp-china-yes.php +++ b/wp-china-yes.php @@ -1,10 +1,10 @@