diff --git a/.github/ISSUE_TEMPLATE/bug_report.yml b/.github/ISSUE_TEMPLATE/bug_report.yml new file mode 100644 index 0000000..1d278bc --- /dev/null +++ b/.github/ISSUE_TEMPLATE/bug_report.yml @@ -0,0 +1,101 @@ +name: 报告问题 (Bug Report) +description: 创建一个报告以帮助我们改进 (Create a report to help us improve) +title: "[Bug Report]: " +labels: ["bug"] + +body: + - type: markdown + attributes: + value: | + **请仅使用 简体中文 或 英文 进行填写** + **Please only use Simplified Chinese or English to fill in** + - type: checkboxes + id: checks + attributes: + label: 在提问之前 (Before asking) + description: | + 提问之前,先回答几个小问题。 + Before asking questions, answer a few quick questions. + options: + - label: 我已经搜索了现有的 Issues 和 Discussions (I've searched the existing Issues and Discussions) + required: true + - label: 我已经阅读了 README 中除版本记录以外的所有内容 (I've read everything in the README except the version notes) + required: true + - label: 我在提问题之前至少花费了 5 分钟来思考和准备 (I spend at least 5 minutes thinking and preparing before asking a question) + required: true + - label: 这个问题出现在最新版的 WP-China-Yes 上 (This question appears on the latest version of WP-China-Yes) + required: false + - label: 我使用过旧版的 WP-China-Yes 并且没有出现这个问题 (I've used an older version of WP-China-Yes and didn't have this problem) + required: false + - label: 这个问题出现了至少 3 次 (This question has occurred at least 3 times) + required: false + - type: textarea + id: describe + attributes: + label: 描述问题 (Describe the problem) + description: | + 简明概要地描述你遇到的问题。 + Briefly describe the problem you are having. + validations: + required: true + - type: textarea + id: expected + attributes: + label: 预期行为 (Expected behavior) + description: | + 简明概要地描述你期望发生的事情。 + Briefly describe what you expect to happen. + validations: + required: true + - type: textarea + id: reproduce + attributes: + label: 如何复现 (How to reproduce) + description: | + 重现该问题的详细步骤。 + Detailed steps to reproduce the problem. + value: | + 1. 安装 WP-China-Yes + 2. 设置 '...' + 3. 点击 '...' + 4. 出现问题 + validations: + required: false + - type: textarea + id: logs + attributes: + label: 相关日志 (Related logs) + description: | + 请复制并粘贴任何相关的日志输出。 + Please copy and paste any relevant log output. + 可以把文件拖入这个区域以添加日志文件。 + Files can be dragged into this area to add log files. + 日志文件可通过开启 WordPress 的调试模式获取。 + Log files can be accessed by enabling WordPress debug mode. + render: Text + validations: + required: false + - type: textarea + id: screenshots + attributes: + label: 截图 (Screenshots) + description: | + 如果有,添加屏幕截图可帮助更快定位你的问题。 + If so, adding screenshots can help locate your issue faster. + 可以复制图片后在此区域内粘贴以添加图片。 + Pictures can be copied and pasted in this area to add pictures. + 如有必要,使用马赛克遮盖敏感信息。 + Use a mosaic to obscure sensitive information if necessary. + validations: + required: false + - type: textarea + id: others + attributes: + label: 还有别的吗 (Anything else) + description: | + 运行环境?浏览器?WordPress 版本?相关的配置?链接?参考资料? + Environment? Browser? WordPress version? Related configuration? Link? References? + 任何能让我们对你所遇到的问题有更多了解的东西。 + Anything that can give us more insight into the problem you're having. + validations: + required: false diff --git a/.github/ISSUE_TEMPLATE/config.yml b/.github/ISSUE_TEMPLATE/config.yml new file mode 100644 index 0000000..c117656 --- /dev/null +++ b/.github/ISSUE_TEMPLATE/config.yml @@ -0,0 +1,5 @@ +blank_issues_enabled: false +contact_links: + - name: 讨论、问答和非项目问题 (Discussions, questions, and non-project issues) + url: https://jq.qq.com/?_wv=1027&k=I1oJKSTH + about: 其他不明之处,请移步我们的QQ群 12370907 (For other unclear things, please move to our qq group 12370907) diff --git a/.github/ISSUE_TEMPLATE/feature_request.yml b/.github/ISSUE_TEMPLATE/feature_request.yml new file mode 100644 index 0000000..5e9619d --- /dev/null +++ b/.github/ISSUE_TEMPLATE/feature_request.yml @@ -0,0 +1,55 @@ +name: 功能请求 (Feature request) +description: 为这个项目提出一个想法 (Suggest an idea for this project) +title: "[Feature Request]: " +labels: ["enhancement"] + +body: + - type: markdown + attributes: + value: | + **请仅使用 简体中文 或 英文 进行填写** + **Please only use Simplified Chinese or English to fill in** + - type: checkboxes + attributes: + label: 在提问之前 (Before asking) + description: | + 提问之前,先回答几个小问题。 + Before asking questions, answer a few quick questions. + options: + - label: 我已经搜索了全部 Issues 和 Commits (I have searched all Issues and Commits) + required: true + - label: 它们当中没有我将要提交的新功能 (None of them have new feature that I'm going to submit) + required: true + - type: textarea + id: feature + attributes: + label: 描述功能 (Describe feature) + description: | + 简明概要地描述你的新功能,以及它将解决什么问题。 + Briefly describe your new feature and what problem it will solve. + validations: + required: true + - type: textarea + id: workflow + attributes: + label: 工作流程 (Workflow) + description: | + 请向我们提供有关该功能的实现流程。 + Please provide us with the implementation flow for this feature. + value: | + 1. 新建文件 .... + 2. 添加函数 .... + 3. ... + validations: + required: true + - type: textarea + id: others + attributes: + label: 还有别的吗 (Anything else) + description: | + 运行环境?浏览器?WordPress 版本?相关的配置?链接?参考资料? + Environment? Browser? WordPress version? Related configuration? Link? References? + 任何能让我们对该功能的实现有更多帮助的东西。 + Anything that can help us more with the implementation of this feature. + validations: + required: false diff --git a/.github/workflows/update-changelog.yml b/.github/workflows/update-changelog.yml new file mode 100644 index 0000000..df49076 --- /dev/null +++ b/.github/workflows/update-changelog.yml @@ -0,0 +1,31 @@ +name: "Update Changelog" + +on: + release: + types: [released] + +jobs: + update: + runs-on: ubuntu-latest + + permissions: + contents: write + + steps: + - name: Checkout code + uses: actions/checkout@v4 + with: + ref: master + + - name: Update Changelog + uses: stefanzweifel/changelog-updater-action@v1 + with: + latest-version: ${{ github.event.release.tag_name }} + release-notes: ${{ github.event.release.body }} + + - name: Commit updated CHANGELOG + uses: stefanzweifel/git-auto-commit-action@v5 + with: + branch: master + commit_message: "docs: Update CHANGELOG" + file_pattern: CHANGELOG.md diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..331c58f --- /dev/null +++ b/.gitignore @@ -0,0 +1,2 @@ +.idea +vendor \ No newline at end of file diff --git a/CHANGELOG.md b/CHANGELOG.md new file mode 100644 index 0000000..35fbcc0 --- /dev/null +++ b/CHANGELOG.md @@ -0,0 +1,68 @@ +# Changelog + +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. 性能优化 +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 判断 +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 部分,防止影响缓冲区。 +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. 为自动监控功能添加开关 +2. adminCDN 支持 jsDelivr 加速 +3. Windfonts 支持优化模式开关 + +**adminCDN 的 jsd 加速默认屏蔽 gh 端点,如有主题插件作者需要使用请联系加白。** +**Full Changelog**: https://github.com/WenPai-org/wp-china-yes/compare/v3.6.2...v3.6.3 + +## v3.6.2 - 2024-03-09 + +1. UI 重构 +2. 修复市场加速导致 Beta 测试插件失效的问题 +3. 更新接口及测试 URL + +**Full Changelog**: https://github.com/WenPai-org/wp-china-yes/compare/v3.6.1...v3.6.2 + +## v3.6.1 - 2024-03-08 + +1. 重构全部代码 +2. 应用市场调整为[文派开源](https://wenpai.org) +3. 加速服务调整为[萌芽加速](https://admincdn.com) +4. 头像调整为[初认头像](https://cravatar.com) +5. 支持自动检测节点可用性 + +**Full Changelog**: https://github.com/WenPai-org/wp-china-yes/compare/V3.5.5...v3.6.1 diff --git a/Plugin.php b/Plugin.php new file mode 100755 index 0000000..b1bbad6 --- /dev/null +++ b/Plugin.php @@ -0,0 +1,122 @@ +getMessage() ); + add_action( 'admin_notices', function() use ( $e ) { + echo '

WP-China-Yes initialization error: ' . esc_html( $e->getMessage() ) . '

'; + }); + } + } + + /** + * 插件激活时执行 + */ + public static function activate() { + // 兼容性检测 + self::check(); + } + + /** + * 插件删除时执行 + */ + public static function uninstall() { + // 清除设置 + is_multisite() ? delete_site_option( 'wp_china_yes' ) : delete_option( 'wp_china_yes' ); + } + + /** + * 加载翻译文件 + */ + public function load_textdomain() { + load_plugin_textdomain( 'wp-china-yes', false, dirname( plugin_basename( CHINA_YES_PLUGIN_FILE ) ) . '/languages' ); + } + + /** + * 插件加载时执行 + */ + public function plugins_loaded() { + 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 ); + } + + /** + * 插件兼容性检测函数 + */ + public static function check() { + $notices = []; + if ( version_compare( PHP_VERSION, '7.0.0', '<' ) ) { + deactivate_plugins( 'wp-china-yes/wp-china-yes.php' ); + $notices[] = '

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

'; + } + if ( is_plugin_active( 'wp-china-no/wp-china-no.php' ) ) { + deactivate_plugins( 'wp-china-no/wp-china-no.php' ); + $notices[] = '
+

检测到旧版插件 WP-China-No,已自动禁用!

+
'; + } + if ( is_plugin_active( 'wp-china-plus/wp-china-plus.php' ) ) { + deactivate_plugins( 'wp-china-plus/wp-china-plus.php' ); + $notices[] = '
+

检测到不兼容的插件 WP-China-Plus,已自动禁用!

+
'; + } + if ( is_plugin_active( 'kill-429/kill-429.php' ) ) { + deactivate_plugins( 'kill-429/kill-429.php' ); + $notices[] = '
+

检测到不兼容的插件 Kill 429,已自动禁用!

+
'; + } + if ( defined( 'WP_PROXY_HOST' ) || defined( 'WP_PROXY_PORT' ) ) { + $notices[] = '
+

检测到已在 WordPress 配置文件中设置代理服务器,这可能会导致插件无法正常工作!

+
'; + } + + set_transient( 'wp-china-yes-admin-notices', $notices, 10 ); + } + + /** + * 输出管理后台提示信息 + */ + public function admin_notices() { + $notices = get_transient( 'wp-china-yes-admin-notices' ); + if ( $notices ) { + foreach ( $notices as $notice ) { + echo $notice; + } + delete_transient( 'wp-china-yes-admin-notices' ); + } + } +} 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..2dbdc31 --- /dev/null +++ b/Service/Acceleration.php @@ -0,0 +1,554 @@ +settings = get_settings(); + $this->debug_mode = defined('WP_DEBUG') && WP_DEBUG; + $this->init(); + } + + /** + * 初始化 admincdn 功能 + */ + private function init() { + if (!$this->should_enable()) { + return; + } + + add_action('wp_head', function () { + echo "\n"; + }, 1); + + $this->prepare_replacements(); + $this->start_output_buffer(); + $this->init_version_control(); + } + + /** + * 检查是否应该启用加速功能 + */ + private function should_enable() { + return !empty($this->settings['admincdn']) || + !empty($this->settings['admincdn_files']) || + !empty($this->settings['admincdn_public']); + } + + /** + * 准备所有替换规则 + */ + private function prepare_replacements() { + if ($this->has_admin_acceleration()) { + $this->prepare_admin_replacements(); + } + + if ($this->has_frontend_acceleration()) { + $this->prepare_frontend_replacements(); + } + + if ($this->has_public_library_acceleration()) { + $this->prepare_public_library_replacements(); + } + + if ($this->has_dev_library_acceleration()) { + $this->prepare_dev_library_replacements(); + } + + if ($this->has_special_features()) { + $this->prepare_special_replacements(); + } + } + + /** + * 检查是否启用管理后台加速 + */ + private function has_admin_acceleration() { + return !empty($this->settings['admincdn']) && + in_array('admin', (array) $this->settings['admincdn']); + } + + /** + * 检查是否启用前台加速 + */ + private function has_frontend_acceleration() { + return !empty($this->settings['admincdn_files']) && + in_array('frontend', (array) $this->settings['admincdn_files']); + } + + /** + * 检查是否启用公共库加速 + */ + private function has_public_library_acceleration() { + return !empty($this->settings['admincdn_public']) && + is_array($this->settings['admincdn_public']) && + count($this->settings['admincdn_public']) > 0; + } + + /** + * 检查是否启用开发库加速 + */ + private function has_dev_library_acceleration() { + return !empty($this->settings['admincdn_dev']) && + is_array($this->settings['admincdn_dev']) && + count($this->settings['admincdn_dev']) > 0; + } + + /** + * 检查是否启用特殊功能 + */ + private function has_special_features() { + return !empty($this->settings['admincdn_files']) && + (in_array('emoji', (array) $this->settings['admincdn_files']) || + in_array('sworg', (array) $this->settings['admincdn_files'])); + } + + /** + * 启动统一的输出缓冲 + */ + private function start_output_buffer() { + if ($this->buffer_started || php_sapi_name() == 'cli') { + return; + } + + $hook = is_admin() ? 'admin_init' : 'template_redirect'; + + add_action($hook, function () { + if (!$this->buffer_started) { + ob_start([$this, 'process_buffer']); + $this->buffer_started = true; + } + }, 1); + + add_action('wp_footer', [$this, 'end_buffer'], 999); + add_action('admin_footer', [$this, 'end_buffer'], 999); + } + + /** + * 处理输出缓冲内容 + */ + public function process_buffer($buffer) { + if (empty($buffer)) { + return $buffer; + } + + $start_time = microtime(true); + $buffer_size = strlen($buffer); + $buffer_hash = md5($buffer); + + if (isset(self::$cache[$buffer_hash])) { + $this->log_performance('cache_hit', microtime(true) - $start_time, $buffer_size); + return self::$cache[$buffer_hash]; + } + + $original_buffer = $buffer; + $replacements_made = 0; + + if (!empty($this->regex_patterns)) { + $regex_start = microtime(true); + $this->compile_patterns(); + + foreach ($this->compiled_patterns as $pattern_data) { + $before = $buffer; + $buffer = preg_replace($pattern_data['pattern'], $pattern_data['replacement'], $buffer); + + if (preg_last_error() !== PREG_NO_ERROR) { + $this->log_error('Regex error in pattern: ' . $pattern_data['pattern']); + continue; + } + + if ($before !== $buffer) { + $replacements_made++; + } + } + + $this->log_performance('regex_processing', microtime(true) - $regex_start, count($this->compiled_patterns)); + } + + if (!empty($this->replacements)) { + $str_start = microtime(true); + $searches = array_keys($this->replacements); + $replaces = array_values($this->replacements); + $before = $buffer; + $buffer = str_replace($searches, $replaces, $buffer); + + if ($before !== $buffer) { + $replacements_made++; + } + + $this->log_performance('string_processing', microtime(true) - $str_start, count($this->replacements)); + } + + if (count(self::$cache) < 100) { + self::$cache[$buffer_hash] = $buffer; + } + + $total_time = microtime(true) - $start_time; + $this->log_performance('total_processing', $total_time, $replacements_made); + + if ($this->debug_mode && $replacements_made > 0) { + $buffer .= sprintf( + '', + $replacements_made, + $total_time, + $this->format_bytes($buffer_size) + ); + } + + return $buffer; + } + + /** + * 记录性能数据 + */ + private function log_performance($operation, $time, $count) { + if (!$this->debug_mode) { + return; + } + + $this->performance_data[] = [ + 'operation' => $operation, + 'time' => $time, + 'count' => $count, + 'timestamp' => microtime(true) + ]; + } + + /** + * 记录错误信息 + */ + private function log_error($message) { + if ($this->debug_mode) { + error_log('Acceleration: ' . $message); + } + } + + /** + * 格式化字节数 + */ + private function format_bytes($bytes) { + $units = ['B', 'KB', 'MB', 'GB']; + $bytes = max($bytes, 0); + $pow = floor(($bytes ? log($bytes) : 0) / log(1024)); + $pow = min($pow, count($units) - 1); + $bytes /= pow(1024, $pow); + return round($bytes, 2) . ' ' . $units[$pow]; + } + + /** + * 编译正则表达式模式 + */ + private function compile_patterns() { + if (!empty($this->compiled_patterns)) { + return; + } + + foreach ($this->regex_patterns as $pattern => $replacement) { + if (!$this->is_valid_regex($pattern)) { + error_log('Acceleration: Invalid regex pattern: ' . $pattern); + continue; + } + + $this->compiled_patterns[] = [ + 'pattern' => $pattern, + 'replacement' => $replacement + ]; + } + } + + /** + * 验证正则表达式是否有效 + */ + private function is_valid_regex($pattern) { + return @preg_match($pattern, '') !== false; + } + + /** + * 结束输出缓冲 + */ + public function end_buffer() { + if ($this->buffer_started && ob_get_level()) { + ob_end_flush(); + } + } + + /** + * 准备管理后台替换规则 + */ + private function prepare_admin_replacements() { + if (!is_admin() || (defined('DOING_AJAX') && DOING_AJAX)) { + return; + } + + 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; + + $pattern = '~' . preg_quote(home_url('/'), '~') . '(wp-admin|wp-includes)/(css|js)/~'; + $replacement = sprintf('https://wpstatic.admincdn.com/%s/$1/$2/', $GLOBALS['wp_version']); + $this->regex_patterns[$pattern] = $replacement; + } + } + + /** + * 准备前台替换规则 + */ + private function prepare_frontend_replacements() { + if (in_array('frontend', (array) $this->settings['admincdn_files'])) { + $pattern = '#(?<=[(\"\'])(?:' . quotemeta(home_url()) . ')?/(?:((?:wp-content|wp-includes)[^\"\')]+\.(css|js)[^\"\')]+))(?=[\"\')])#'; + $this->regex_patterns[$pattern] = 'https://public.admincdn.com/$0'; + } + } + + /** + * 准备公共库替换规则 + */ + private function prepare_public_library_replacements() { + $public_libraries = [ + 'googlefonts' => ['fonts.googleapis.com', 'googlefonts.admincdn.com'], + 'googleajax' => ['ajax.googleapis.com', 'googleajax.admincdn.com'], + 'cdnjs' => ['cdnjs.cloudflare.com/ajax/libs', 'cdnjs.admincdn.com'], + 'jsdelivr' => ['cdn.jsdelivr.net', 'jsd.admincdn.com'], + 'bootstrapcdn' => ['maxcdn.bootstrapcdn.com', 'jsd.admincdn.com'], + ]; + + foreach ($public_libraries as $key => $replacement) { + if (in_array($key, (array) $this->settings['admincdn_public'])) { + $this->replacements[$replacement[0]] = $replacement[1]; + } + } + } + + /** + * 准备开发库替换规则 + */ + private function prepare_dev_library_replacements() { + $dev_libraries = [ + 'react' => ['unpkg.com/react', 'jsd.admincdn.com/npm/react'], + 'jquery' => ['code.jquery.com', 'jsd.admincdn.com/npm/jquery'], + 'vuejs' => ['unpkg.com/vue', 'jsd.admincdn.com/npm/vue'], + 'datatables' => ['cdn.datatables.net', 'jsd.admincdn.com/npm/datatables.net'], + 'tailwindcss' => ['unpkg.com/tailwindcss', 'jsd.admincdn.com/npm/tailwindcss'], + ]; + + foreach ($dev_libraries as $key => $replacement) { + if (in_array($key, (array) $this->settings['admincdn_dev'])) { + $this->replacements[$replacement[0]] = $replacement[1]; + } + } + } + + /** + * 准备特殊功能替换规则 + */ + private function prepare_special_replacements() { + if (in_array('emoji', (array) $this->settings['admincdn_files'])) { + $this->prepare_emoji_replacements(); + } + + if (in_array('sworg', (array) $this->settings['admincdn_files'])) { + $this->prepare_sworg_replacements(); + } + } + + /** + * 准备Emoji替换规则 + */ + private function prepare_emoji_replacements() { + 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'); + + $this->replacements['s.w.org/images/core/emoji'] = 'jsd.admincdn.com/npm/@twemoji/api/dist'; + + add_action('wp_head', function () { + ?> + + replacements['ts.w.org'] = 'ts.wenpai.net'; + + add_filter('theme_screenshot_url', function ($url) { + return str_replace('ts.w.org', 'ts.wenpai.net', $url); + }); + + 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); + } + + /** + * 加载 admincdn 功能(保持向后兼容) + */ + private function load_admincdn() { + $this->settings['admincdn_files'] = $this->settings['admincdn_files'] ?? []; + $this->settings['admincdn_public'] = $this->settings['admincdn_public'] ?? []; + $this->settings['admincdn_dev'] = $this->settings['admincdn_dev'] ?? []; + } + + + + /** + * 初始化版本控制功能 + */ + private function init_version_control() { + if (empty($this->settings['admincdn_version_enable'])) { + return; + } + + $version_settings = (array) $this->settings['admincdn_version']; + + if (empty($version_settings)) { + return; + } + + if (in_array('css', $version_settings)) { + add_filter('style_loader_src', [$this, 'version_filter']); + } + + if (in_array('js', $version_settings)) { + add_filter('script_loader_src', [$this, 'version_filter']); + } + } + + /** + * 版本控制过滤器 + */ + public function version_filter($src) { + $version_settings = (array) $this->settings['admincdn_version']; + + $url_parts = wp_parse_url($src); + + if (!isset($url_parts['path'])) { + return $src; + } + + $extension = pathinfo($url_parts['path'], PATHINFO_EXTENSION); + if (!$extension || !in_array($extension, ['css', 'js'])) { + return $src; + } + + if (!in_array($extension, $version_settings)) { + return $src; + } + + if (defined('AUTOVER_DISABLE_' . strtoupper($extension))) { + return $src; + } + + $file_path = rtrim(ABSPATH, '/') . urldecode($url_parts['path']); + if (!is_file($file_path)) { + return $src; + } + + $timestamp_version = filemtime($file_path) ?: filemtime(utf8_decode($file_path)); + if (!$timestamp_version) { + return $src; + } + + if (!isset($url_parts['query'])) { + $url_parts['query'] = ''; + } + + $query = []; + parse_str($url_parts['query'], $query); + + if (in_array('disable_query', $version_settings)) { + unset($query['v']); + unset($query['ver']); + unset($query['version']); + } else { + unset($query['v']); + unset($query['ver']); + + if (in_array('timestamp', $version_settings)) { + $query['ver'] = $timestamp_version; + } else { + $query['ver'] = md5($timestamp_version); + } + } + + $url_parts['query'] = http_build_query($query); + + return $this->build_url($url_parts); + } + + /** + * 构建URL + */ + private function build_url(array $parts) { + return (isset($parts['scheme']) ? "{$parts['scheme']}:" : '') . + ((isset($parts['user']) || isset($parts['host'])) ? '//' : '') . + (isset($parts['user']) ? "{$parts['user']}" : '') . + (isset($parts['pass']) ? ":{$parts['pass']}" : '') . + (isset($parts['user']) ? '@' : '') . + (isset($parts['host']) ? "{$parts['host']}" : '') . + (isset($parts['port']) ? ":{$parts['port']}" : '') . + (isset($parts['path']) ? "{$parts['path']}" : '') . + (isset($parts['query']) ? "?{$parts['query']}" : '') . + (isset($parts['fragment']) ? "#{$parts['fragment']}" : ''); + } + + /** + * 页面字符串替换 + * + * @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..f23f632 --- /dev/null +++ b/Service/Avatar.php @@ -0,0 +1,117 @@ +settings = get_settings(); + $this->init(); + } + + /** + * 初始化初认头像功能 + */ + private function init() { + if (!empty($this->settings['cravatar']) && $this->settings['cravatar'] !== 'off') { + 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); + + add_action('wp_head', [$this, 'add_avatar_preconnect'], 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 '您可以在初认头像修改您的资料图片'; + } + } + + public function add_avatar_preconnect() { + switch ($this->settings['cravatar']) { + case 'cn': + echo '' . "\n"; + echo '' . "\n"; + break; + case 'global': + echo '' . "\n"; + echo '' . "\n"; + break; + case 'weavatar': + echo '' . "\n"; + echo '' . "\n"; + break; + } + } +} \ No newline at end of file diff --git a/Service/Base.php b/Service/Base.php new file mode 100755 index 0000000..a2c2830 --- /dev/null +++ b/Service/Base.php @@ -0,0 +1,61 @@ +init_services(); + } + + private function init_services() { + $core_services = [ + 'Super', + 'Monitor', + 'Memory', + 'Update', + 'Database', + 'Acceleration', + 'Avatar', + 'Fonts', + 'Comments', + 'Media', + 'Performance', + 'Maintenance' + ]; + + foreach ($core_services as $service) { + $this->load_service($service); + } + + if (is_admin()) { + $this->load_service('Setting'); + $this->load_service('Adblock'); + } + } + + private function load_service($service_name) { + $class_name = __NAMESPACE__ . '\\' . $service_name; + + if (class_exists($class_name)) { + try { + $this->services[$service_name] = new $class_name(); + } catch (\Exception $e) { + error_log("WP-China-Yes: Failed to load service {$service_name}: " . $e->getMessage()); + } + } + } + + public function get_service($service_name) { + return $this->services[$service_name] ?? null; + } +} diff --git a/Service/Comments.php b/Service/Comments.php new file mode 100755 index 0000000..d5b4aa7 --- /dev/null +++ b/Service/Comments.php @@ -0,0 +1,411 @@ +settings = get_settings(); + + add_action('wp_enqueue_scripts', [$this, 'force_enqueue_jquery'], 5); + + $this->init(); + } + + public function force_enqueue_jquery() { + if (!is_admin()) { + wp_enqueue_script('jquery'); + } + } + + private function init() { + if (!isset($this->settings['comments_enable']) || !$this->settings['comments_enable']) { + return; + } + + $this->init_role_badge(); + $this->init_remove_website(); + $this->init_validation(); + $this->init_herp_derp(); + $this->init_sticky_moderate(); + } + + private function init_role_badge() { + if (!isset($this->settings['comments_role_badge']) || !$this->settings['comments_role_badge']) { + return; + } + + add_action('wp_enqueue_scripts', [$this, 'enqueue_role_badge_styles']); + add_filter('get_comment_author', [$this, 'add_role_badge'], 10, 3); + add_filter('get_comment_author_link', [$this, 'add_role_badge_to_link']); + } + + private function init_remove_website() { + if (!isset($this->settings['comments_remove_website']) || !$this->settings['comments_remove_website']) { + return; + } + + add_filter('comment_form_default_fields', [$this, 'remove_website_field']); + } + + private function init_validation() { + if (!isset($this->settings['comments_validation']) || !$this->settings['comments_validation']) { + return; + } + + add_action('wp_enqueue_scripts', [$this, 'enqueue_validation_scripts']); + add_action('wp_footer', [$this, 'add_validation_script']); + add_filter('preprocess_comment', [$this, 'validate_comment_content']); + } + + private function init_herp_derp() { + if (!isset($this->settings['comments_herp_derp']) || !$this->settings['comments_herp_derp']) { + return; + } + + add_action('wp_enqueue_scripts', [$this, 'enqueue_herp_derp_scripts']); + add_action('wp_head', [$this, 'add_herp_derp_styles']); + add_filter('comment_text', [$this, 'herp_derp_comment_text'], 40); + } + + private function init_sticky_moderate() { + if (!isset($this->settings['comments_sticky_moderate']) || !$this->settings['comments_sticky_moderate']) { + return; + } + + add_action('admin_enqueue_scripts', [$this, 'enqueue_sticky_moderate_scripts']); + add_filter('comment_row_actions', [$this, 'add_sticky_moderate_actions'], 10, 2); + } + + private $user_role = ''; + + public function enqueue_role_badge_styles() { + wp_add_inline_style('wp-block-library', ' + .comment-author-role-badge { + display: inline-block; + padding: 3px 6px; + margin-left: 0.5em; + margin-right: 0.5em; + background: #e8e8e8; + border-radius: 2px; + color: rgba(0, 0, 0, 0.6); + font-size: 0.75rem; + font-weight: normal; + text-transform: none; + text-align: left; + line-height: 1; + white-space: nowrap; + vertical-align: middle; + } + .comment-author-role-badge--administrator { background: #c1e7f1; } + .comment-author-role-badge--contributor { background: #c1f1d1; } + .comment-author-role-badge--author { background: #fdf5c5; } + .comment-author-role-badge--editor { background: #fdd8c5; } + .comment-author-role-badge--subscriber { background: #e8e8e8; } + .wp-block-comment-author-name .comment-author-role-badge { + display: inline-block; + margin-left: 0.5em; + font-size: 0.75rem; + vertical-align: middle; + } + '); + } + + public function add_role_badge($author, $comment_id, $comment) { + global $wp_roles; + + if ($wp_roles) { + $reply_user_id = $comment->user_id; + if ($reply_user_id && $reply_user = new \WP_User($reply_user_id)) { + if (isset($reply_user->roles[0])) { + $user_role = translate_user_role($wp_roles->roles[$reply_user->roles[0]]['name']); + $this->user_role = '
' . $user_role . '
'; + } + } else { + $this->user_role = ''; + } + } + return $author; + } + + public function add_role_badge_to_link($author_link) { + return $author_link . $this->user_role; + } + + public function remove_website_field($fields) { + if (isset($fields['url'])) { + unset($fields['url']); + } + return $fields; + } + + public function enqueue_validation_scripts() { + if (!is_singular() || !comments_open()) { + return; + } + + wp_enqueue_script('jquery'); + + wp_register_script('wpcy-comments-validation', '', ['jquery'], '1.0.0', true); + wp_enqueue_script('wpcy-comments-validation'); + wp_add_inline_script('wpcy-comments-validation', ' + jQuery(document).ready(function($) { + console.log("WP China Yes Comments: Validation script loaded"); + $("#commentform").on("submit", function(e) { + var author = $("#author").val(); + var email = $("#email").val(); + var comment = $("#comment").val(); + var errors = []; + + if ($("#author").length && (!author || author.length < 2)) { + errors.push("请输入您的姓名(至少2个字符)"); + } + + if ($("#email").length && (!email || !isValidEmail(email))) { + errors.push("请输入有效的邮箱地址"); + } + + if ($("#comment").length && (!comment || comment.length < 20)) { + errors.push("评论内容至少需要20个字符"); + } + + if (errors.length > 0) { + e.preventDefault(); + alert("请修正以下错误:\n" + errors.join("\n")); + return false; + } + }); + + function isValidEmail(email) { + var regex = /^[^\s@]+@[^\s@]+\.[^\s@]+$/; + return regex.test(email); + } + }); + '); + } + + public function add_validation_script() { + if (!is_singular() || !comments_open()) { + return; + } + ?> + + true]); + } + + if (str_contains($commentdata['comment_content'], 'href=')) { + wp_die('评论中不允许包含活动链接,请返回编辑。', '评论验证失败', ['back_link' => true]); + } + + return $commentdata; + } + + public function enqueue_herp_derp_scripts() { + if (!is_singular() || !comments_open()) { + return; + } + + wp_enqueue_script('jquery'); + + wp_register_script('wpcy-comments-herpderp', '', ['jquery'], '1.0.0', true); + wp_enqueue_script('wpcy-comments-herpderp'); + wp_add_inline_script('wpcy-comments-herpderp', ' + jQuery(document).ready(function($) { + console.log("WP China Yes Comments: Herp Derp jQuery ready"); + + function derp(p, herpa) { + if (!p.herp) { + p.herp = p.innerHTML; + var textContent = p.herp.replace(/<[^>]*>/g, ""); + var derpText = ""; + var chars = textContent.split(""); + var inWord = false; + + for (var i = 0; i < chars.length; i++) { + var char = chars[i]; + + if (/[a-zA-Z]/.test(char)) { + if (!inWord) { + if (derpText && !/\s$/.test(derpText)) derpText += " "; + derpText += "阿巴"; + inWord = true; + } + } else if (/[\u4e00-\u9fff]/.test(char)) { + if (inWord && !/\s$/.test(derpText)) derpText += " "; + derpText += Math.random() > 0.5 ? "阿" : "巴"; + inWord = false; + } else if (/\s/.test(char)) { + if (inWord) { + inWord = false; + } + if (derpText && !/\s$/.test(derpText)) { + derpText += " "; + } + } + } + + p.derp = derpText.trim(); + } + p.innerHTML = (herpa ? p.herp : p.derp); + } + + function herpa(derpa) { + $(".herpc").each(function() { + derp(this, !derpa); + }); + } + + function initHerpDerp() { + var commentsContainer = $("#comments, .comments-area, .comment-list, ol.commentlist, .wp-block-comments"); + console.log("Comments containers found:", commentsContainer.length); + + if (commentsContainer.length === 0) { + console.log("No comments container found, trying body"); + var bodyContainer = $("body"); + if (bodyContainer.length > 0) { + var herpDiv = $("
"); + var checkbox = $(""); + var label = $(""); + + herpDiv.append(label).append(checkbox); + + checkbox.on("change", function() { + console.log("Herp derp toggled:", this.checked); + herpa(this.checked); + }); + + bodyContainer.append(herpDiv); + } + return; + } + + var targetContainer = commentsContainer.first(); + console.log("Target container:", targetContainer[0]); + + var herpDiv = $("
"); + var checkbox = $(""); + var label = $(""); + + herpDiv.append(label).append(checkbox); + + checkbox.on("change", function() { + console.log("Herp derp toggled:", this.checked); + herpa(this.checked); + }); + + targetContainer.before(herpDiv); + } + + initHerpDerp(); + }); + '); + } + + public function add_herp_derp_styles() { + if (!is_singular() || !comments_open()) { + return; + } + ?> + + ' . $text . ''; + } + + public function enqueue_sticky_moderate_scripts($hook) { + if ($hook !== 'edit-comments.php') { + return; + } + + wp_enqueue_script('jquery'); + wp_add_inline_script('jquery', ' + jQuery(document).ready(function($) { + $(".comment-sticky-moderate").on("click", function(e) { + e.preventDefault(); + var commentId = $(this).data("comment-id"); + var action = $(this).hasClass("sticky") ? "unsticky" : "sticky"; + + $.post(ajaxurl, { + action: "sticky_moderate_comment", + comment_id: commentId, + sticky_action: action, + nonce: "' . wp_create_nonce('sticky_moderate_nonce') . '" + }, function(response) { + if (response.success) { + location.reload(); + } + }); + }); + }); + '); + + add_action('wp_ajax_sticky_moderate_comment', [$this, 'handle_sticky_moderate_ajax']); + } + + public function add_sticky_moderate_actions($actions, $comment) { + if ($comment->comment_approved == '0') { + $is_sticky = get_comment_meta($comment->comment_ID, '_sticky_moderate', true); + $text = $is_sticky ? '取消置顶' : '置顶审核'; + $class = $is_sticky ? 'sticky' : ''; + + $actions['sticky_moderate'] = sprintf( + '%s', + $class, + $comment->comment_ID, + $text + ); + } + return $actions; + } + + public function handle_sticky_moderate_ajax() { + if (!wp_verify_nonce($_POST['nonce'], 'sticky_moderate_nonce')) { + wp_die('安全验证失败'); + } + + $comment_id = intval($_POST['comment_id']); + $action = sanitize_text_field($_POST['sticky_action']); + + if ($action === 'sticky') { + update_comment_meta($comment_id, '_sticky_moderate', 1); + } else { + delete_comment_meta($comment_id, '_sticky_moderate'); + } + + wp_send_json_success(); + } +} \ No newline at end of file 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/ExampleModernService.php b/Service/ExampleModernService.php new file mode 100644 index 0000000..d735633 --- /dev/null +++ b/Service/ExampleModernService.php @@ -0,0 +1,96 @@ +setupTranslatedContent(); + } + + private function setupTranslatedContent() { + $translatedOptions = [ + 'store_section' => [ + 'title' => $this->t('应用市场'), + 'description' => $this->t('选择您的应用市场加速方式'), + 'options' => [ + 'wenpai' => $this->t('文派开源'), + 'proxy' => $this->t('官方镜像'), + 'off' => $this->t('不启用') + ] + ], + 'acceleration_section' => [ + 'title' => $this->t('萌芽加速'), + 'description' => $this->t('前端资源加速设置'), + 'options' => [ + 'googlefonts' => 'Google 字体', + 'googleajax' => 'Google 前端库', + 'cdnjs' => 'CDNJS 前端库' + ] + ], + 'notification_section' => [ + 'title' => $this->t('通知管理'), + 'description' => $this->t('管理和控制 WordPress 后台各类通知的显示。'), + 'options' => [ + 'disable_all' => $this->t('禁用所有通知'), + 'selective' => $this->t('选择性禁用'), + 'method' => $this->t('禁用方式') + ] + ] + ]; + + $this->processTranslatedOptions($translatedOptions); + } + + private function processTranslatedOptions($options) { + foreach ($options as $section => $data) { + error_log("处理部分: " . $data['title']); + error_log("描述: " . $data['description']); + + foreach ($data['options'] as $key => $value) { + error_log("选项 {$key}: {$value}"); + } + } + } + + private function t($text) { + return TranslationManager::translate($text); + } + + public function demonstrateLazyTranslation() { + $lazyTitle = LazyTranslation::create('应用市场'); + $lazyArray = LazyTranslation::createArray([ + 'title' => '萌芽加速', + 'subtitle' => '文件加速', + 'options' => [ + 'enable' => '启用', + 'disable' => '禁用' + ] + ]); + + return [ + 'lazy_title' => $lazyTitle, + 'lazy_array' => $lazyArray, + 'resolved_title' => (string)$lazyTitle, + 'resolved_array' => LazyTranslation::resolveArray($lazyArray) + ]; + } + + public function getTranslationStatus() { + return [ + 'translations_loaded' => TranslationManager::isLoaded(), + 'init_action_fired' => did_action('init'), + 'plugins_loaded_fired' => did_action('plugins_loaded'), + 'current_hook' => current_action() + ]; + } +} \ No newline at end of file diff --git a/Service/Fonts.php b/Service/Fonts.php new file mode 100755 index 0000000..2389396 --- /dev/null +++ b/Service/Fonts.php @@ -0,0 +1,340 @@ +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']); + } + + $this->init_rtl_mirror(); + } + + /** + * 初始化RTL镜像测试功能 + */ + private function init_rtl_mirror() { + if (empty($this->settings['windfonts_reading_enable'])) { + return; + } + + $reading_setting = $this->settings['windfonts_reading'] ?? 'off'; + + if ($reading_setting === 'global' || $reading_setting === 'frontend') { + $this->load_rtl_mirror($reading_setting); + } + } + + /** + * 加载文风字体 + */ + public function load_windfonts() { + static $license_shown = false; + + if (!$license_shown) { + echo << + +HTML; + $license_shown = true; + } + + $loaded = []; + foreach ((array) $this->settings['windfonts_list'] as $font) { + if (empty($font['enable'])) { + continue; + } + if (empty($font['family'])) { + continue; + } + + $css_url = $this->build_font_css_url($font); + + if (in_array($css_url, $loaded)) { + continue; + } + + $font_family = $this->extract_font_family_name($font['family']); + + echo sprintf(<< + +HTML + , + $css_url, + htmlspecialchars_decode($font['selector']), + $font['style'] ?? 'normal', + $font['weight'] ?? 400, + $font_family + ); + $loaded[] = $css_url; + } + } + + /** + * 构建字体CSS URL + */ + private function build_font_css_url($font) { + $base_url = 'https://app.windfonts.com/api/css'; + $params = []; + + $params['family'] = $font['family']; + + if (!empty($font['subset'])) { + $params['subset'] = $font['subset']; + } + + if (!empty($font['lang'])) { + $params['lang'] = $font['lang']; + } + + return $base_url . '?' . http_build_query($params); + } + + /** + * 提取字体家族名称 + */ + private function extract_font_family_name($family_param) { + if (strpos($family_param, ':') !== false) { + return explode(':', $family_param)[0]; + } + return $family_param; + } + + /** + * 加载排印优化 + */ + public function load_typography() { + $this->load_chinese_typography(); + $this->load_english_typography(); + } + + /** + * 加载中文排印优化 + */ + private function load_chinese_typography() { + $cn_settings = (array) $this->settings['windfonts_typography_cn']; + + if (in_array('indent', $cn_settings)) { + add_action('wp_head', function () { + echo ''; + }); + } + + if (in_array('align', $cn_settings)) { + add_action('wp_head', function () { + if (is_single()) { + echo ''; + } + }); + } + + if (in_array('corner', $cn_settings)) { + add_action('wp_head', function () { + echo ''; + }); + } + + if (in_array('space', $cn_settings)) { + add_action('wp_head', function () { + echo ''; + }); + } + + if (in_array('punctuation', $cn_settings)) { + add_action('wp_head', function () { + echo ''; + }); + } + } + + /** + * 加载英文排印优化 + */ + private function load_english_typography() { + $en_settings = (array) $this->settings['windfonts_typography_en']; + + if (in_array('optimize', $en_settings)) { + add_action('wp_head', function () { + echo ''; + }); + } + + if (in_array('spacing', $en_settings)) { + add_action('wp_head', function () { + echo ''; + }); + } + + if (in_array('orphan', $en_settings)) { + add_action('wp_head', function () { + echo ''; + }); + } + + if (in_array('widow', $en_settings)) { + add_action('wp_head', function () { + echo ''; + }); + } + + if (in_array('punctuation', $en_settings)) { + add_action('wp_head', function () { + echo ''; + }); + } + } + + + + /** + * 加载RTL镜像测试功能 + */ + private function load_rtl_mirror($mode = 'global') { + $rtl_styles = ''; + + if ($mode === 'global') { + add_action('wp_head', function () use ($rtl_styles) { + echo $rtl_styles; + }, 9999); + + add_action('admin_print_styles', function () use ($rtl_styles) { + echo $rtl_styles; + }, 9999); + } elseif ($mode === 'frontend') { + add_action('wp_head', function () use ($rtl_styles) { + echo $rtl_styles; + }, 9999); + } + } + + +} \ No newline at end of file diff --git a/Service/Language.php b/Service/Language.php new file mode 100644 index 0000000..ec62d79 --- /dev/null +++ b/Service/Language.php @@ -0,0 +1,277 @@ +settings = get_settings(); + + if ( $this->is_enabled( $this->settings['waimao_enable'] ?? false ) ) { + if ( $this->is_enabled( $this->settings['waimao_language_split'] ?? false ) ) { + $this->init_language_split(); + } + } + + add_action( 'wp_china_yes_wp_china_yes_save_after', [ $this, 'apply_language_settings' ] ); + + add_action( 'update_option_WPLANG', [ $this, 'sync_frontend_language_to_plugin' ], 10, 2 ); + add_action( 'updated_user_meta', [ $this, 'sync_admin_language_to_plugin' ], 10, 4 ); + add_action( 'admin_init', [ $this, 'sync_plugin_settings_from_wp' ] ); + } + + /** + * 初始化语言分离功能 + */ + private function init_language_split() { + add_filter( 'locale', [ $this, 'set_locale' ], 10, 1 ); + add_filter( 'determine_locale', [ $this, 'determine_locale' ], 10, 1 ); + + if ( $this->is_enabled( $this->settings['waimao_auto_detect'] ?? false ) ) { + add_action( 'init', [ $this, 'auto_detect_language' ], 1 ); + } + } + + /** + * 设置语言环境 + */ + public function set_locale( $locale ) { + if ( is_admin() ) { + return $this->get_admin_locale(); + } else { + return $this->get_frontend_locale(); + } + } + + /** + * 确定语言环境 + */ + public function determine_locale( $locale ) { + if ( is_admin() ) { + return $this->get_admin_locale(); + } else { + return $this->get_frontend_locale(); + } + } + + /** + * 应用语言设置到WordPress系统 + */ + public function apply_language_settings( $data ) { + $this->settings = $data; + + $waimao_enable = $this->settings['waimao_enable'] ?? false; + $language_split = $this->settings['waimao_language_split'] ?? false; + + if ( $this->is_enabled( $waimao_enable ) ) { + if ( $this->is_enabled( $language_split ) ) { + + if ( ! empty( $this->settings['waimao_admin_language'] ) ) { + $user_id = get_current_user_id(); + if ( $user_id ) { + update_user_meta( $user_id, 'locale', $this->settings['waimao_admin_language'] ); + } + } + + if ( isset( $this->settings['waimao_frontend_language'] ) ) { + $old_wplang = get_option( 'WPLANG', '' ); + $new_wplang = $this->settings['waimao_frontend_language']; + + if ( $old_wplang !== $new_wplang ) { + update_option( 'WPLANG', $new_wplang ); + + if ( defined( 'WP_DEBUG' ) && WP_DEBUG ) { + error_log( "WPLANG updated from '{$old_wplang}' to '{$new_wplang}'" ); + } + } + } + } + } + } + + /** + * 检查设置是否启用(处理布尔值和字符串) + */ + private function is_enabled( $value ) { + return $value === true || $value === 'true' || $value === '1' || $value === 1; + } + + /** + * 获取后台语言 + */ + private function get_admin_locale() { + $admin_language = $this->settings['waimao_admin_language'] ?? get_locale(); + return $admin_language; + } + + /** + * 获取前台语言 + */ + private function get_frontend_locale() { + if ( $this->is_enabled( $this->settings['waimao_auto_detect'] ?? false ) ) { + $detected_locale = $this->detect_browser_language(); + if ( $detected_locale ) { + return $detected_locale; + } + } + + $frontend_language = $this->settings['waimao_frontend_language'] ?? get_option('WPLANG', 'en_US'); + return $frontend_language; + } + + /** + * 自动检测语言 + */ + public function auto_detect_language() { + if ( is_admin() ) { + return; + } + + $detected_locale = $this->detect_browser_language(); + if ( $detected_locale ) { + add_filter( 'locale', function() use ( $detected_locale ) { + return $detected_locale; + }, 20 ); + } + } + + /** + * 检测浏览器语言 + */ + private function detect_browser_language() { + if ( ! isset( $_SERVER['HTTP_ACCEPT_LANGUAGE'] ) ) { + return false; + } + + $supported_languages = [ + 'zh-cn' => 'zh_CN', + 'zh-tw' => 'zh_TW', + 'zh-hk' => 'zh_TW', + 'en-us' => 'en_US', + 'en-gb' => 'en_GB', + 'en' => 'en_US', + 'ja' => 'ja', + 'ko' => 'ko_KR', + 'de' => 'de_DE', + 'fr' => 'fr_FR', + 'es' => 'es_ES', + 'ru' => 'ru_RU', + ]; + + $accept_language = strtolower( $_SERVER['HTTP_ACCEPT_LANGUAGE'] ); + $languages = explode( ',', $accept_language ); + + foreach ( $languages as $language ) { + $language = trim( explode( ';', $language )[0] ); + + if ( isset( $supported_languages[ $language ] ) ) { + return $supported_languages[ $language ]; + } + + $language_code = explode( '-', $language )[0]; + if ( isset( $supported_languages[ $language_code ] ) ) { + return $supported_languages[ $language_code ]; + } + } + + return false; + } + + /** + * 获取可用语言列表 + */ + public static function get_available_languages() { + return [ + 'zh_CN' => '简体中文', + 'zh_TW' => '繁体中文', + 'en_US' => 'English (US)', + 'en_GB' => 'English (UK)', + 'ja' => '日本語', + 'ko_KR' => '한국어', + 'de_DE' => 'Deutsch', + 'fr_FR' => 'Français', + 'es_ES' => 'Español', + 'ru_RU' => 'Русский', + ]; + } + + /** + * 检查语言文件是否存在 + */ + public function is_language_available( $locale ) { + if ( $locale === 'en_US' ) { + return true; + } + + $language_file = WP_LANG_DIR . '/wp-' . $locale . '.mo'; + return file_exists( $language_file ); + } + + /** + * 同步前台语言设置到插件 + */ + public function sync_frontend_language_to_plugin( $old_value, $new_value ) { + if ( $this->is_enabled( $this->settings['waimao_enable'] ?? false ) ) { + if ( $this->is_enabled( $this->settings['waimao_language_split'] ?? false ) ) { + $current_settings = get_option( 'wp_china_yes', [] ); + $current_settings['waimao_frontend_language'] = $new_value; + update_option( 'wp_china_yes', $current_settings ); + } + } + } + + /** + * 同步后台语言设置到插件 + */ + public function sync_admin_language_to_plugin( $meta_id, $user_id, $meta_key, $meta_value ) { + if ( $meta_key === 'locale' && $user_id === get_current_user_id() ) { + if ( $this->is_enabled( $this->settings['waimao_enable'] ?? false ) ) { + if ( $this->is_enabled( $this->settings['waimao_language_split'] ?? false ) ) { + $current_settings = get_option( 'wp_china_yes', [] ); + $current_settings['waimao_admin_language'] = $meta_value; + update_option( 'wp_china_yes', $current_settings ); + } + } + } + } + + /** + * 从WordPress系统同步语言设置到插件 + */ + public function sync_plugin_settings_from_wp() { + if ( $this->is_enabled( $this->settings['waimao_enable'] ?? false ) ) { + if ( $this->is_enabled( $this->settings['waimao_language_split'] ?? false ) ) { + $current_settings = get_option( 'wp_china_yes', [] ); + $needs_update = false; + + $wp_frontend_lang = get_option( 'WPLANG', '' ); + if ( $current_settings['waimao_frontend_language'] !== $wp_frontend_lang ) { + $current_settings['waimao_frontend_language'] = $wp_frontend_lang; + $needs_update = true; + } + + $user_locale = get_user_meta( get_current_user_id(), 'locale', true ); + if ( $user_locale && $current_settings['waimao_admin_language'] !== $user_locale ) { + $current_settings['waimao_admin_language'] = $user_locale; + $needs_update = true; + } + + if ( $needs_update ) { + update_option( 'wp_china_yes', $current_settings ); + $this->settings = $current_settings; + } + } + } + } +} \ No newline at end of file diff --git a/Service/LazyTranslation.php b/Service/LazyTranslation.php new file mode 100644 index 0000000..4337266 --- /dev/null +++ b/Service/LazyTranslation.php @@ -0,0 +1,87 @@ +text = $text; + $this->domain = $domain; + $this->context = $context; + } + + public function __toString() { + return $this->resolve(); + } + + public function resolve() { + if (did_action('init')) { + if ($this->context) { + return _x($this->text, $this->context, $this->domain); + } + return __($this->text, $this->domain); + } + + return TranslationManager::getFallback($this->text); + } + + public function getText() { + return $this->text; + } + + public function getDomain() { + return $this->domain; + } + + public function getContext() { + return $this->context; + } + + public static function create($text, $domain = 'wp-china-yes', $context = null) { + return new self($text, $domain, $context); + } + + public static function createArray($texts, $domain = 'wp-china-yes') { + $result = []; + foreach ($texts as $key => $text) { + if (is_string($text)) { + $result[$key] = new self($text, $domain); + } else { + $result[$key] = $text; + } + } + return $result; + } + + public static function resolveArray($array) { + $result = []; + foreach ($array as $key => $value) { + if ($value instanceof self) { + $result[$key] = $value->resolve(); + } elseif (is_array($value)) { + $result[$key] = self::resolveArray($value); + } else { + $result[$key] = $value; + } + } + return $result; + } +} + +function t($text, $domain = 'wp-china-yes', $context = null) { + return LazyTranslation::create($text, $domain, $context); +} + +function tr($text, $domain = 'wp-china-yes', $context = null) { + if (did_action('init')) { + if ($context) { + return _x($text, $context, $domain); + } + return __($text, $domain); + } + return TranslationManager::getFallback($text); +} \ 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..4c198a3 --- /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('%d 个媒体', $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('%d 个管理员', $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('%d 个用户', $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..29bf8c0 --- /dev/null +++ b/Service/Media.php @@ -0,0 +1,90 @@ +settings = get_settings(); + $this->init(); + } + + private function init() { + if (!empty($this->settings['optimize_images'])) { + add_filter('wp_image_editors', [$this, 'set_image_editor']); + add_filter('jpeg_quality', [$this, 'set_jpeg_quality']); + } + + if (!empty($this->settings['lazy_load'])) { + add_filter('wp_lazy_loading_enabled', '__return_true'); + } + + add_filter('wp_get_attachment_image_attributes', [$this, 'add_image_attributes'], 10, 3); + + if (!empty($this->settings['webp_support'])) { + add_filter('wp_generate_attachment_metadata', [$this, 'generate_webp_versions']); + } + } + + public function set_image_editor($editors) { + if (extension_loaded('imagick')) { + array_unshift($editors, 'WP_Image_Editor_Imagick'); + } + return $editors; + } + + public function set_jpeg_quality($quality) { + return intval($this->settings['jpeg_quality'] ?? 85); + } + + public function add_image_attributes($attr, $attachment, $size) { + if (!empty($this->settings['lazy_load']) && !is_admin()) { + $attr['loading'] = 'lazy'; + } + + if (!empty($this->settings['responsive_images'])) { + $attr['sizes'] = '(max-width: 768px) 100vw, (max-width: 1024px) 50vw, 33vw'; + } + + return $attr; + } + + public function generate_webp_versions($metadata) { + if (!function_exists('imagewebp')) { + return $metadata; + } + + $upload_dir = wp_upload_dir(); + $file_path = $upload_dir['basedir'] . '/' . $metadata['file']; + + if (file_exists($file_path)) { + $webp_path = preg_replace('/\.(jpe?g|png)$/i', '.webp', $file_path); + + $image_type = wp_check_filetype($file_path)['type']; + + switch ($image_type) { + case 'image/jpeg': + $image = imagecreatefromjpeg($file_path); + break; + case 'image/png': + $image = imagecreatefrompng($file_path); + break; + default: + return $metadata; + } + + if ($image) { + imagewebp($image, $webp_path, 85); + imagedestroy($image); + } + } + + return $metadata; + } +} \ No newline at end of file diff --git a/Service/Memory.php b/Service/Memory.php new file mode 100755 index 0000000..4b1c51d --- /dev/null +++ b/Service/Memory.php @@ -0,0 +1,273 @@ +WP_DEBUG'; + } + return 'WP_DEBUG'; + } + + /** + * 获取 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'; + } + + /** + * 添加信息到管理界面页脚 + */ +public function add_footer($content) { + $settings = get_settings(); + + // 设置默认显示选项 + $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'])) { + 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', + $this->memory['usage'], + 'of', + $this->memory['limit'], + $this->memory['color'], + $this->memory['percent'] + ); + } + + // WP内存限制 + if (in_array('wp_limit', $display_options)) { + $footer_parts[] = sprintf('%s: %s', + 'WP LIMIT', + $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 版本过低', + '请升级 PHP 至 7.0 或更高版本。' + ), + 'PHP 版本错误', + ['back_link' => true] + ); + } + } + + + /** + * 更新设置 + */ + 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/Migration.php b/Service/Migration.php new file mode 100644 index 0000000..124d0df --- /dev/null +++ b/Service/Migration.php @@ -0,0 +1,110 @@ +settings = get_settings(); + add_action( 'admin_init', [ $this, 'migrate_windfonts_settings' ] ); + } + + public function migrate_windfonts_settings() { + $current_settings = get_option( 'wp_china_yes', [] ); + $needs_migration = false; + + if ( ! empty( $current_settings['windfonts_list'] ) ) { + foreach ( $current_settings['windfonts_list'] as $index => $font ) { + if ( isset( $font['css'] ) && ! isset( $font['subset'] ) ) { + $migrated_font = $this->migrate_font_config( $font ); + $current_settings['windfonts_list'][$index] = $migrated_font; + $needs_migration = true; + } + } + } + + if ( $needs_migration ) { + update_option( 'wp_china_yes', $current_settings ); + } + } + + private function migrate_font_config( $old_font ) { + $new_font = [ + 'family' => $this->extract_family_from_old_config( $old_font ), + 'subset' => $this->extract_subset_from_old_config( $old_font ), + 'lang' => '', + 'weight' => $old_font['weight'] ?? 400, + 'style' => $old_font['style'] ?? 'normal', + 'selector' => $old_font['selector'] ?? '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])', + 'enable' => $old_font['enable'] ?? true, + ]; + + return $new_font; + } + + private function extract_family_from_old_config( $old_font ) { + if ( isset( $old_font['family'] ) ) { + return $old_font['family']; + } + + if ( isset( $old_font['css'] ) ) { + $css_url = $old_font['css']; + + if ( strpos( $css_url, 'syhtcjk' ) !== false ) { + return 'cszt'; + } + + if ( preg_match( '/fonts\/([^\/]+)\//', $css_url, $matches ) ) { + return $matches[1]; + } + } + + return 'cszt'; + } + + private function extract_subset_from_old_config( $old_font ) { + if ( isset( $old_font['css'] ) ) { + $css_url = $old_font['css']; + + if ( strpos( $css_url, '/regular/' ) !== false ) { + return 'regular'; + } + if ( strpos( $css_url, '/bold/' ) !== false ) { + return 'bold'; + } + if ( strpos( $css_url, '/light/' ) !== false ) { + return 'light'; + } + if ( strpos( $css_url, '/medium/' ) !== false ) { + return 'medium'; + } + } + + if ( isset( $old_font['weight'] ) ) { + $weight = intval( $old_font['weight'] ); + if ( $weight <= 200 ) { + return 'thin'; + } elseif ( $weight <= 300 ) { + return 'light'; + } elseif ( $weight <= 500 ) { + return 'regular'; + } elseif ( $weight <= 600 ) { + return 'medium'; + } elseif ( $weight <= 700 ) { + return 'semibold'; + } elseif ( $weight <= 800 ) { + return 'bold'; + } else { + return 'black'; + } + } + + return 'regular'; + } +} \ No newline at end of file diff --git a/Service/ModernSetting.php b/Service/ModernSetting.php new file mode 100644 index 0000000..7adc5bf --- /dev/null +++ b/Service/ModernSetting.php @@ -0,0 +1,234 @@ +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' ] ); + + // 延迟到 init 动作后执行 + add_action( 'init', [ $this, 'admin_init' ], 20 ); + } + + public function admin_init() { + // 确保翻译已加载 + if (!TranslationManager::isLoaded()) { + TranslationManager::getInstance()->loadTranslations(); + } + + $this->setupFramework(); + } + + private function setupFramework() { + $enabled_sections = $this->settings['enable_sections'] ?? []; + + if (in_array('store', $enabled_sections)) { + WP_CHINA_YES::createSection( $this->prefix, [ + 'title' => $this->t('应用市场'), + 'icon' => 'icon icon-shop', + 'fields' => [ + [ + 'id' => 'store', + 'type' => 'radio', + 'title' => $this->t('应用市场'), + 'inline' => true, + 'options' => [ + 'wenpai' => $this->t('文派开源'), + 'proxy' => $this->t('官方镜像'), + 'off' => $this->t('不启用') + ], + 'default' => 'wenpai', + 'subtitle' => '是否启用市场加速', + 'desc' => '文派开源(WenPai.org)中国境内自建托管仓库,同时集成文派翻译平台。官方加速源(WPMirror)直接从 .org 反代至大陆分发;可参考源站说明。', + ], + [ + 'id' => 'bridge', + 'type' => 'switcher', + 'default' => true, + 'title' => '云桥更新', + 'subtitle' => '是否启用更新加速', + 'desc' => '文派云桥(wpbridge)托管更新和应用分发渠道,可解决因 WordPress 社区分裂导致的混乱、旧应用无法更新,频繁 API 请求拖慢网速等问题。', + ], + [ + 'id' => 'arkpress', + 'type' => 'switcher', + 'default' => false, + 'title' => '联合存储库', + 'subtitle' => '自动监控加速节点可用性', + 'desc' => 'ArkPress.org 支持自动监控各加速节点可用性,当节点不可用时自动切换至可用节点或关闭加速,以保证您的网站正常访问', + ], + ], + ] ); + } + + if (in_array('admincdn', $enabled_sections)) { + WP_CHINA_YES::createSection( $this->prefix, [ + 'title' => $this->t('萌芽加速'), + 'icon' => 'icon icon-flash-1', + 'fields' => [ + [ + 'id' => 'admincdn_public', + 'type' => 'checkbox', + 'title' => $this->t('萌芽加速'), + 'inline' => true, + 'options' => [ + 'googlefonts' => 'Google 字体', + 'googleajax' => 'Google 前端库', + 'cdnjs' => 'CDNJS 前端库', + 'jsdelivr' => 'jsDelivr 前端库', + 'bootstrapcdn' => 'Bootstrap 前端库', + ], + 'default' => [ + 'googlefonts' => 'googlefonts', + 'googleajax' => 'googleajax', + 'cdnjs' => 'cdnjs', + 'jsdelivr' => 'jsdelivr', + 'bootstrapcdn' => 'bootstrapcdn', + ], + 'subtitle' => '是否启用前端公共库加速', + 'desc' => '启用后,将自动替换前端页面中的 Google Fonts、Google Ajax、CDNJS、jsDelivr、Bootstrap 等公共库为国内加速节点。', + ], + [ + 'id' => 'admincdn_files', + 'type' => 'checkbox', + 'title' => $this->t('文件加速'), + 'inline' => true, + 'options' => [ + 'gravatar' => 'Gravatar 头像', + 'emoji' => 'Emoji 表情', + 'googlefonts' => 'Google 字体', + ], + 'default' => [ + 'gravatar' => 'gravatar', + 'emoji' => 'emoji', + 'googlefonts' => 'googlefonts', + ], + 'subtitle' => '是否启用文件资源加速', + 'desc' => '启用后,将自动替换 Gravatar 头像、Emoji 表情、Google 字体等文件资源为国内加速节点。', + ], + [ + 'id' => 'admincdn_dev', + 'type' => 'checkbox', + 'title' => $this->t('开发加速'), + 'inline' => true, + 'options' => [ + 'wordpress' => 'WordPress 官方', + 'themes' => '主题仓库', + 'plugins' => '插件仓库', + ], + 'default' => [ + 'wordpress' => 'wordpress', + 'themes' => 'themes', + 'plugins' => 'plugins', + ], + 'subtitle' => '是否启用开发资源加速', + 'desc' => '启用后,将自动替换 WordPress 官方、主题仓库、插件仓库等开发资源为国内加速节点。', + ], + ], + ] ); + } + + // 通知管理部分 + if (in_array('notice', $enabled_sections)) { + WP_CHINA_YES::createSection( $this->prefix, [ + 'title' => $this->t('通知管理'), + 'icon' => 'icon icon-bell', + 'fields' => [ + [ + 'id' => 'notice_block', + 'type' => 'radio', + 'title' => $this->t('通知管理'), + 'inline' => true, + 'options' => [ + 'on' => '启用', + 'off' => '不启用', + ], + 'default' => 'off', + 'subtitle' => '是否启用后台通知管理', + 'desc' => $this->t('管理和控制 WordPress 后台各类通知的显示。'), + ], + [ + 'id' => 'disable_all_notices', + 'type' => 'switcher', + 'title' => $this->t('禁用所有通知'), + 'subtitle' => '一键禁用所有后台通知', + 'default' => false, + 'dependency' => ['notice_block', '==', 'on'], + ], + [ + 'id' => 'notice_control', + 'type' => 'checkbox', + 'title' => $this->t('选择性禁用'), + 'inline' => true, + 'subtitle' => '选择需要禁用的通知类型', + 'desc' => $this->t('可以按住 Ctrl/Command 键进行多选'), + 'chosen' => true, + 'multiple' => true, + 'options' => [ + 'update_nag' => '更新提醒', + 'plugin_update' => '插件更新', + 'theme_update' => '主题更新', + 'core_update' => '核心更新', + 'admin_notices' => '管理员通知', + 'user_admin_notices' => '用户管理通知', + 'network_admin_notices'=> '网络管理通知', + ], + 'dependency' => ['notice_block', '==', 'on'], + ], + [ + 'id' => 'notice_method', + 'type' => 'radio', + 'title' => $this->t('禁用方式'), + 'inline' => true, + 'options' => [ + 'hide' => '隐藏通知', + 'remove' => '移除通知', + ], + 'default' => 'hide', + 'subtitle' => '选择通知的禁用方式', + 'desc' => '隐藏通知:通过 CSS 隐藏通知元素;移除通知:通过 PHP 移除通知钩子。', + 'dependency' => ['notice_block', '==', 'on'], + ], + ], + ] ); + } + } + + private function t($text) { + return TranslationManager::translate($text); + } + + public function admin_menu() { + add_options_page( + 'WP-China-Yes', + 'WP-China-Yes', + 'manage_options', + 'wp-china-yes', + [ $this, 'admin_page' ] + ); + } + + public function admin_page() { + echo '
'; + echo '

WP-China-Yes 设置

'; + echo '

现代化翻译系统已启用

'; + echo '
'; + } + + public function enqueue_admin_assets() { + // 管理员资源加载 + } +} \ No newline at end of file diff --git a/Service/Monitor.php b/Service/Monitor.php new file mode 100755 index 0000000..4f234cc --- /dev/null +++ b/Service/Monitor.php @@ -0,0 +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 ); + } + } +} diff --git a/Service/Performance.php b/Service/Performance.php new file mode 100755 index 0000000..74984d0 --- /dev/null +++ b/Service/Performance.php @@ -0,0 +1,94 @@ +settings = get_settings(); + $this->init(); + } + + private function init() { + add_action('init', [$this, 'optimize_wordpress']); + add_action('wp_enqueue_scripts', [$this, 'optimize_scripts'], 999); + add_action('wp_head', [$this, 'add_performance_hints'], 1); + + if (is_admin()) { + add_action('admin_init', [$this, 'optimize_admin']); + } + } + + public function optimize_wordpress() { + remove_action('wp_head', 'wp_generator'); + remove_action('wp_head', 'wlwmanifest_link'); + remove_action('wp_head', 'rsd_link'); + remove_action('wp_head', 'wp_shortlink_wp_head'); + remove_action('wp_head', 'adjacent_posts_rel_link_wp_head'); + + if (!is_admin()) { + wp_deregister_script('jquery-migrate'); + } + + add_filter('xmlrpc_enabled', '__return_false'); + + add_filter('wp_headers', function($headers) { + if (isset($headers['X-Pingback'])) { + unset($headers['X-Pingback']); + } + return $headers; + }); + + add_filter('emoji_svg_url', '__return_false'); + + if (!empty($this->settings['disable_embeds'])) { + wp_deregister_script('wp-embed'); + } + } + + public function optimize_scripts() { + if (!is_admin() && !empty($this->settings['defer_scripts'])) { + add_filter('script_loader_tag', function($tag, $handle) { + if (is_admin() || strpos($tag, 'defer') !== false) { + return $tag; + } + + $defer_scripts = ['jquery', 'wp-embed']; + if (in_array($handle, $defer_scripts)) { + return str_replace(' src', ' defer src', $tag); + } + + return $tag; + }, 10, 2); + } + } + + public function add_performance_hints() { + echo '' . "\n"; + echo '' . "\n"; + echo '' . "\n"; + echo '' . "\n"; + } + + public function optimize_admin() { + add_filter('heartbeat_settings', function($settings) { + $settings['interval'] = 60; + return $settings; + }); + + if (!empty($this->settings['disable_admin_bar']) && !current_user_can('manage_options')) { + show_admin_bar(false); + } + + add_action('admin_enqueue_scripts', function() { + wp_dequeue_script('thickbox'); + wp_dequeue_style('thickbox'); + }); + } +} \ No newline at end of file diff --git a/Service/Setting.php b/Service/Setting.php new file mode 100755 index 0000000..618a06b --- /dev/null +++ b/Service/Setting.php @@ -0,0 +1,1592 @@ +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' ] ); + $this->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' ); +} + + /** + * 挂载设置项 + */ + public function admin_init() { + WP_CHINA_YES::createOptions( $this->prefix, [ + 'framework_title' => $this->settings['custom_name'], + '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' => true, + 'footer_text' => sprintf( '%s 设置', $this->settings['custom_name'] ), + 'theme' => 'light', + 'enqueue_webfont' => false, + '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' =>$welcome_content, + ] + ], + ] ); + } + if (in_array('store', $enabled_sections)) { + WP_CHINA_YES::createSection( $this->prefix, [ + 'title' => '应用市场', + 'icon' => 'icon icon-shop', + 'fields' => [ + [ + 'id' => 'store', + 'type' => 'radio', + 'title' => '应用市场', + 'inline' => true, + 'options' => [ + 'wenpai' => '文派开源', + 'proxy' => '官方镜像', + 'off' => '不启用' + ], + 'default' => 'wenpai', + 'subtitle' => '是否启用市场加速', + 'desc' => '文派开源(WenPai.org)中国境内自建托管仓库,同时集成文派翻译平台。官方加速源(WPMirror)直接从 .org 反代至大陆分发;可参考源站说明。', + ], + [ + 'id' => 'bridge', + 'type' => 'switcher', + 'default' => true, + 'title' => '云桥更新', + 'subtitle' => '是否启用更新加速', + 'desc' => '文派云桥(wpbridge)托管更新和应用分发渠道,可解决因 WordPress 社区分裂导致的混乱、旧应用无法更新,频繁 API 请求拖慢网速等问题。', + ], + [ + 'id' => 'arkpress', + 'type' => 'switcher', + 'default' => false, + 'title' => '联合存储库', + 'subtitle' => '自动监控加速节点可用性', + 'desc' => 'ArkPress.org 支持自动监控各加速节点可用性,当节点不可用时自动切换至可用节点或关闭加速,以保证您的网站正常访问', + ], + ], + ] ); + } + + 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' => '萌芽加速', + 'inline' => true, + 'options' => [ + 'googlefonts' => 'Google 字体', + 'googleajax' => 'Google 前端库', + 'cdnjs' => 'CDNJS 前端库', + 'jsdelivr' => 'jsDelivr 前端库', + 'bootstrapcdn' => 'Bootstrap 前端库', + ], + 'default' => [ + 'googlefonts' => 'googlefonts', + 'googleajax' => '', + 'cdnjs' => '', + 'jsdelivr' => '', + 'bootstrapcdn' => '', + ], + 'subtitle' => '是否启用萌芽加速', + 'desc' => '萌芽加速(adminCDN)将 WordPress 插件依赖的静态文件切换为公共资源,解决卡顿、加载慢等问题。您可按需启用加速项目,更多细节控制和功能,请查看推荐设置。', + ], + [ + 'id' => 'admincdn_files', + 'type' => 'checkbox', + 'title' => '文件加速', + 'inline' => true, + 'options' => [ + 'admin' => '后台加速', + 'frontend' => '前台加速', + 'emoji' => 'Emoji加速', + 'sworg' => '预览加速', + ], + 'default' => [ + 'admin' => 'admin', + 'frontend' => '', + 'emoji' => 'emoji', + 'sworg' => '', + ], + 'subtitle' => '是否启用文件加速', + 'desc' => tr('专为 WordPress 系统内置依赖的静态资源进行加速,加快网站访问速度,如遇异常请停用对应选项。预览加速可在不切换应用市场时加速插件目录预览截图。', + 'wp-china-yes'), + ], + [ + 'id' => 'admincdn_dev', + 'type' => 'checkbox', + 'title' => '开发加速', + 'inline' => true, + 'options' => [ + 'react' => 'React 前端库', + 'jquery' => 'jQuery 前端库', + 'vuejs' => 'Vue.js 前端库', + 'datatables' => 'DataTables 前端库', + 'tailwindcss' => 'Tailwind CSS' + ], + 'default' => [ + 'react' => '', + 'jquery' => 'jquery', + 'vuejs' => '', + 'datatables' => '', + 'tailwindcss' => '', + ], + 'subtitle' => '是否启用文件加速', + 'desc' => tr('部分高级 WordPress 插件主题会包含最新前端资源,可在此勾选对应的 adminCDN 子库专项加速。', + 'wp-china-yes'), + ], + [ + 'id' => 'admincdn_version_enable', + 'type' => 'switcher', + 'title' => '版本控制', + 'subtitle' => '是否启用版本控制功能', + 'desc' => tr('启用后可为CSS和JS文件自动添加版本号,解决浏览器缓存问题。', + 'wp-china-yes'), + 'default' => false, + 'class' => 'wp_china_yes-field wp_china_yes-field-switcher', + ], + [ + 'id' => 'admincdn_version', + 'type' => 'checkbox', + 'title' => '版本控制选项', + 'inline' => true, + 'options' => [ + 'css' => 'CSS文件版本控制', + 'js' => 'JS文件版本控制', + 'disable_query' => '禁用查询参数版本', + 'timestamp' => '使用时间戳版本', + ], + 'default' => [ + 'css' => 'css', + 'js' => 'js', + 'disable_query' => '', + 'timestamp' => 'timestamp', + ], + 'subtitle' => '详细版本控制配置', + 'desc' => tr('自动为CSS和JS文件添加基于文件修改时间的版本号,解决浏览器缓存问题,确保用户获取最新资源。', + 'wp-china-yes'), + 'dependency' => ['admincdn_version_enable', '==', 'true'], + ], + ], + ]); +} + + if (in_array('cravatar', $enabled_sections)) { + WP_CHINA_YES::createSection( $this->prefix, [ + 'title' => '初认头像', + 'icon' => 'icon icon-profile-circle', + 'fields' => [ + [ + 'id' => 'cravatar', + 'type' => 'radio', + 'title' => '初认头像', + 'inline' => true, + 'options' => [ + 'cn' => '默认线路', + 'global' => '国际线路', + 'weavatar' => '备用源(WeAvatar.com)', + 'off' => '不启用' + ], + 'default' => 'cn', + 'subtitle' => '是否启用头像加速', + 'desc' => tr( '初认头像(Cravatar)Gravatar 在中国的完美替代方案,您可以在 Cravatar.com 上传头像,更多选项请安装 WPAavatar 插件。可自选加速线路。', + 'wp-china-yes' ), + ], + ], + ] ); + } + + if (in_array('windfonts', $enabled_sections)) { + WP_CHINA_YES::createSection( $this->prefix, [ + 'title' => '文风字体', + 'icon' => 'icon icon-text', + 'fields' => [ + [ + 'id' => 'windfonts', + 'type' => 'radio', + 'title' => '文风字体', + 'inline' => true, + 'options' => [ + 'on' => '全局启用', + 'frontend' => '前台启用', + 'optimize' => '本机字体', + 'off' => '不启用', + ], + 'default' => 'off', + 'subtitle' => '是否启用文风字体定制', + 'desc' => tr( '文风字体(Windfonts)为您的网站增添无限活力。专为中文网页设计,旨在提升用户阅读体验和视觉享受。新手使用请先查看字体使用说明。', + 'wp-china-yes' ), + ], + [ + 'id' => 'windfonts_list', + 'type' => 'group', + 'title' => '字体列表', + 'subtitle' => '使用的文风字体列表', + 'desc' => '支持添加多个文风字体,使用新的API接口格式,支持更灵活的字体配置', + 'button_title' => '添加字体', + 'accordion_title_number' => true, + 'dependency' => [ + 'windfonts', + 'any', + 'on,frontend', + ], + 'fields' => [ + [ + 'id' => 'family', + 'type' => 'text', + 'title' => '字体名称', + 'subtitle' => '字体family参数', + 'desc' => tr( '支持多种格式:
FontName - 基础字体名
FontName:wght@400;700 - 指定权重
FontName:lang@zh - 指定语言
FontName:wght@400:lang@zh - 同时指定权重和语言
详见API文档', + 'wp-china-yes' ), + 'default' => 'cszt', + ], + [ + 'id' => 'subset', + 'type' => 'select', + 'title' => '字体子集', + 'subtitle' => '字体变体(优先级高于权重)', + 'options' => [ + '' => '不指定', + 'regular' => 'Regular', + 'bold' => 'Bold', + 'light' => 'Light', + 'medium' => 'Medium', + 'semibold' => 'Semibold', + 'thin' => 'Thin', + 'extralight' => 'Extra Light', + 'extrabold' => 'Extra Bold', + 'black' => 'Black', + ], + 'default' => 'regular', + 'desc' => tr( '直接指定字体变体,优先级大于权重设置', + 'wp-china-yes' ), + ], + [ + 'id' => 'lang', + 'type' => 'select', + 'title' => '语言设置', + 'subtitle' => '字体语言支持', + 'options' => [ + '' => '不指定', + 'zh' => '纯中文字符', + ], + 'desc' => tr( '设置为"纯中文字符"时,字体样式只对中文字符生效', + 'wp-china-yes' ), + ], + [ + 'id' => 'weight', + 'type' => 'number', + 'title' => '字体字重', + 'subtitle' => '字体字重大小(当未指定subset时生效)', + 'desc' => tr( '设置字体权重大小(字体粗细),当指定了subset时此设置无效', + 'wp-china-yes' ), + 'default' => 400, + 'attributes' => [ + 'min' => 100, + 'max' => 900, + 'step' => 100, + ], + 'validate' => 'csf_validate_numeric', + ], + [ + 'id' => 'style', + 'type' => 'select', + 'title' => '字体样式', + 'subtitle' => '字体样式选择', + 'options' => [ + 'normal' => '正常', + 'italic' => '斜体', + 'oblique' => '倾斜', + ], + 'default' => 'normal', + 'desc' => tr( '设置字体样式(正常、斜体、倾斜)', + 'wp-china-yes' ), + ], + [ + 'id' => 'selector', + 'type' => 'textarea', + 'title' => '字体应用', + 'subtitle' => '字体应用元素', + 'desc' => tr( '设置字体应用的元素(CSS 选择器)', + 'wp-china-yes' ), + '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, + ], + [ + 'id' => 'enable', + 'type' => 'switcher', + 'title' => '启用字体', + 'subtitle' => '是否启用该字体', + 'default' => true, + ], + ], + ], + [ + 'id' => 'windfonts_typography_cn', + 'type' => 'checkbox', + 'title' => '中文排印', + 'inline' => true, + 'options' => [ + 'corner' => '直角括号', + 'space' => '文本空格', + 'punctuation' => '标点显示', + 'indent' => '段首缩进', + 'align' => '两端对齐', + ], + 'default' => '', + 'subtitle' => '是否启用中文排印优化', + 'desc' => tr( '文风字体中文排印优化可提升中文网页的视觉美感,适用于正式内容的网站。', + 'wp-china-yes' ), + ], + [ + 'id' => 'windfonts_typography_en', + 'type' => 'checkbox', + 'title' => '英文排印', + 'inline' => true, + 'options' => [ + 'optimize' => '排版优化', + 'spacing' => '去双空格', + 'orphan' => '避免孤行', + 'widow' => '避免寡行', + 'punctuation' => '中英标点', + ], + 'default' => '', + 'subtitle' => '是否启用英文排印优化', + 'desc' => tr( 'Windfonts 英文排印优化可提升英文网页的视觉美感,适用于多语内容网站。', + 'wp-china-yes' ), + ], + [ + 'id' => 'windfonts_reading_enable', + 'type' => 'switcher', + 'title' => 'RTL镜像测试', + 'subtitle' => '是否启用RTL镜像测试功能', + 'desc' => tr( '启用后可以帮助LTR语言使用者测试RTL网站布局效果。', + 'wp-china-yes' ), + 'default' => false, + 'class' => 'wp_china_yes-field wp_china_yes-field-switcher', + ], + [ + 'id' => 'windfonts_reading', + 'type' => 'radio', + 'title' => 'RTL镜像模式', + 'inline' => true, + 'options' => [ + 'global' => '全局启用', + 'frontend' => '前台启用', + 'off' => '不启用', + ], + 'default' => 'off', + 'subtitle' => 'RTL镜像测试模式选择', + 'desc' => tr( 'RTL镜像测试功能可以帮助LTR语言使用者测试RTL网站布局,通过水平镜像让RTL布局看起来像LTR。', + 'wp-china-yes' ), + 'dependency' => ['windfonts_reading_enable', '==', 'true'], + ], + ], + ] ); + } + + if (in_array('motucloud', $enabled_sections)) { + WP_CHINA_YES::createSection( $this->prefix, [ + 'title' => '墨图云集', + 'icon' => 'icon icon-gallery', + 'fields' => [ + [ + 'id' => 'motucloud', + 'type' => 'radio', + 'title' => '墨图云集', + 'inline' => true, + 'options' => [ + 'cn' => '默认线路', + 'global' => '国际线路', + 'weavatar' => '备用源(WeAvatar.com)', + 'off' => '不启用' + ], + 'default' => 'cn', + 'subtitle' => '是否启用墨图云集', + 'desc' => tr( '墨图云集(MotuCloud)Gravatar 在中国的完美替代方案,您可以在 Cravatar.com 上传头像,更多选项请安装 WPAavatar 插件。可自选加速线路。', + 'wp-china-yes' ), + ], + ], + ] ); + } + + if (in_array('fewmail', $enabled_sections)) { + WP_CHINA_YES::createSection( $this->prefix, [ + 'title' => '飞秒邮箱', + 'icon' => 'icon icon-sms-tracking', + 'fields' => [ + [ + 'id' => 'fewmail', + 'type' => 'radio', + 'title' => '飞秒邮箱', + 'inline' => true, + 'options' => [ + 'cn' => '默认线路', + 'global' => '国际线路', + 'weavatar' => '备用源(WeAvatar.com)', + 'off' => '不启用' + ], + 'default' => 'cn', + 'subtitle' => '是否启用飞秒邮箱', + 'desc' => tr( '飞秒邮箱(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' => 'comments_enable', + 'type' => 'switcher', + 'title' => '评论增强', + 'subtitle' => '是否启用评论增强功能', + 'desc' => tr( '启用后可以使用角色徽章、表单验证、阿巴阿巴模式等评论增强功能。', + 'wp-china-yes' ), + 'default' => false, + 'class' => 'wp_china_yes-field wp_china_yes-field-switcher', + ], + [ + 'id' => 'comments_role_badge', + 'type' => 'switcher', + 'title' => '角色徽章', + 'subtitle' => '为评论作者显示角色标识', + 'desc' => tr( '在评论作者名称后显示用户角色徽章(管理员、编辑、作者等),提升评论区权威性。', + 'wp-china-yes' ), + 'default' => true, + 'dependency' => ['comments_enable', '==', 'true'], + ], + [ + 'id' => 'comments_remove_website', + 'type' => 'switcher', + 'title' => '移除网站字段', + 'subtitle' => '从评论表单中移除网站URL字段', + 'desc' => tr( '移除评论表单中的网站字段,减少垃圾评论,简化表单填写。', + 'wp-china-yes' ), + 'default' => false, + 'dependency' => ['comments_enable', '==', 'true'], + ], + [ + 'id' => 'comments_validation', + 'type' => 'switcher', + 'title' => '评论验证', + 'subtitle' => '启用前端表单验证', + 'desc' => tr( '对评论表单进行前端验证,确保评论内容质量,提升用户体验。', + 'wp-china-yes' ), + 'default' => true, + 'dependency' => ['comments_enable', '==', 'true'], + ], + [ + 'id' => 'comments_herp_derp', + 'type' => 'switcher', + 'title' => '阿巴阿巴模式', + 'subtitle' => '启用阿巴阿巴模式', + 'desc' => tr( '提供阿巴阿巴模式切换按钮,可以模糊显示评论内容,增加趣味性。', + 'wp-china-yes' ), + 'default' => false, + 'dependency' => ['comments_enable', '==', 'true'], + ], + [ + 'id' => 'comments_sticky_moderate', + 'type' => 'switcher', + 'title' => '置顶审核', + 'subtitle' => '启用置顶审核功能', + 'desc' => tr( '在后台评论管理中添加置顶审核功能,优化审核流程。', + 'wp-china-yes' ), + 'default' => false, + 'dependency' => ['comments_enable', '==', 'true'], + ], + + ], + ] ); + } + + + if (in_array('blocks', $enabled_sections)) { + WP_CHINA_YES::createSection( $this->prefix, [ + 'title' => '笔笙区块', + 'icon' => 'icon icon-document-1', + 'fields' => [ + [ + 'id' => 'bisheng', + 'type' => 'radio', + 'title' => '笔笙区块', + 'inline' => true, + 'options' => [ + 'cn' => '审核评论', + 'global' => '强化评论', + 'ban' => '禁用评论', + 'off' => '不启用' + ], + 'default' => 'cn', + 'subtitle' => '是否启用笔笙区块', + 'desc' => tr( '笔笙区块(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' => '灯鹿用户', + 'inline' => true, + 'options' => [ + 'cn' => '默认线路', + 'global' => '国际线路', + 'off' => '不启用' + ], + 'default' => 'cn', + 'subtitle' => '是否启用灯鹿用户', + 'desc' => tr( '灯鹿用户(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_enable', + 'type' => 'switcher', + 'title' => '跨飞外贸', + 'subtitle' => '启用外贸网站优化功能', + 'default' => false, + 'desc' => '启用后可以使用专为外贸网站设计的语言切换和优化功能。', + ], + [ + 'id' => 'waimao_language_split', + 'type' => 'switcher', + 'title' => '前后台语言分离', + 'subtitle' => '允许前台和后台使用不同语言', + 'dependency' => ['waimao_enable', '==', 'true'], + 'default' => false, + 'desc' => '启用后,后台将使用个人资料中的语言设置,前台使用WordPress系统语言设置。', + ], + [ + 'id' => 'waimao_admin_language', + 'type' => 'select', + 'title' => '后台语言', + 'subtitle' => '设置后台管理界面语言', + 'dependency' => ['waimao_language_split', '==', 'true'], + 'options' => $this->get_available_languages(), + 'default' => $this->get_current_admin_language(), + 'desc' => '选择后台管理界面使用的语言,将应用到当前用户的个人资料设置。', + ], + [ + 'id' => 'waimao_frontend_language', + 'type' => 'select', + 'title' => '前台语言', + 'subtitle' => '设置前台网站语言', + 'dependency' => ['waimao_language_split', '==', 'true'], + 'options' => $this->get_available_languages(), + 'default' => $this->get_current_frontend_language(), + 'desc' => '选择前台网站使用的语言,将应用到WordPress系统语言设置。', + ], + [ + 'id' => 'waimao_auto_detect', + 'type' => 'switcher', + 'title' => '自动语言检测', + 'subtitle' => '根据访客浏览器语言自动切换', + 'dependency' => ['waimao_language_split', '==', 'true'], + 'default' => false, + 'desc' => '启用后,前台将根据访客的浏览器语言偏好自动选择合适的语言显示。', + ], + ], + ] ); + } + + + + 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电商', + 'inline' => true, + 'options' => [ + 'cn' => '默认线路', + 'global' => '国际线路', + 'off' => '不启用' + ], + 'default' => 'cn', + 'subtitle' => '是否启用灯鹿用户', + 'desc' => tr( '灯鹿用户(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' => '乐尔达思', + 'inline' => true, + 'options' => [ + 'cn' => '默认线路', + 'global' => '国际线路', + 'off' => '不启用' + ], + 'default' => 'cn', + 'subtitle' => '是否启用乐尔达思', + 'desc' => tr( '乐尔达思(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' => '瓦普文创', + 'inline' => true, + 'options' => [ + 'cn' => '默认线路', + 'global' => '国际线路', + 'off' => '不启用' + ], + 'default' => 'cn', + 'subtitle' => '是否启用瓦普文创', + 'desc' => tr( '瓦普文创(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' => '广告拦截', + 'inline' => true, + 'options' => [ + 'on' => '启用', + 'off' => '不启用', + ], + 'default' => 'off', + 'subtitle' => '是否启用后台广告拦截', + 'desc' => tr( '文派叶子🍃(WPCY.COM)独家特色功能,让您拥有清爽整洁的 WordPress 后台,清除各类常用插件侵入式后台广告、通知及无用信息,拿回后台控制权。', + 'wp-china-yes' ), + ], + [ + 'id' => 'adblock_rule', + 'type' => 'group', + 'title' => '规则列表', + 'subtitle' => '使用的广告拦截规则列表', + 'desc' => tr( '默认规则跟随插件更新,插件更新后可删除规则重新添加以获取更多最新拦截规则,出现异常,请尝试先停用规则排查原因。', + 'wp-china-yes' ), + 'button_title' => '添加规则', + 'accordion_title_number' => true, + 'dependency' => [ + 'adblock', + 'any', + 'on', + ], + 'fields' => [ + [ + 'id' => 'name', + 'type' => 'text', + 'title' => '规则名称', + 'subtitle' => '自定义规则名称', + 'desc' => tr( '自定义规则名称,方便识别', + 'wp-china-yes' ), + 'default' => '默认规则', + ], + [ + 'id' => 'selector', + 'type' => 'textarea', + 'title' => '应用元素', + 'subtitle' => '规则应用元素', + 'desc' => tr( '设置规则应用的广告元素(CSS 选择器)', + 'wp-china-yes' ), + 'default' => '.wpseo_content_wrapper', + 'sanitize' => false, + ], + [ + 'id' => 'enable', + 'type' => 'switcher', + 'title' => '启用规则', + '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' => '通知管理', + 'inline' => true, + 'options' => [ + 'on' => '启用', + 'off' => '不启用', + ], + 'default' => 'off', + 'subtitle' => '是否启用后台通知管理', + 'desc' => '管理和控制 WordPress 后台各类通知的显示。', + ], + [ + 'id' => 'disable_all_notices', + 'type' => 'switcher', + 'title' => '禁用所有通知', + 'subtitle' => '一键禁用所有后台通知', + 'default' => false, + 'dependency' => ['notice_block', '==', 'on'], + ], + [ + 'id' => 'notice_control', + 'type' => 'checkbox', + 'title' => '选择性禁用', + 'inline' => true, + 'subtitle' => '选择需要禁用的通知类型', + 'desc' => '可以按住 Ctrl/Command 键进行多选', + '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' => '禁用方式', + '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', + 'fields' => [ + [ + 'id' => 'plane', + 'type' => 'radio', + 'title' => '飞行模式', + 'inline' => true, + 'options' => [ + 'on' => '启用', + 'off' => '不启用', + ], + 'default' => 'off', + 'subtitle' => '是否启用飞行模式', + 'desc' => tr( '飞行模式可屏蔽 WordPress 插件主题在中国无法访问的 API 请求,加速网站前后台访问。注:部分外部请求为产品更新检测,若已屏蔽请定期检测。', + 'wp-china-yes' ), + ], + [ + 'id' => 'plane_rule', + 'type' => 'group', + 'title' => '规则列表', + 'subtitle' => '飞行模式使用的 URL 屏蔽规则列表', + 'desc' => tr( '支持添加多条 URL 屏蔽规则', + 'wp-china-yes' ), + 'button_title' => '添加规则', + 'accordion_title_number' => true, + 'dependency' => [ + 'plane', + 'any', + 'on', + ], + 'fields' => [ + [ + 'id' => 'name', + 'type' => 'text', + 'title' => '规则名称', + 'subtitle' => '自定义规则名称', + 'desc' => tr( '自定义规则名称,方便识别', + 'wp-china-yes' ), + 'default' => '未命名规则', + ], + [ + 'id' => 'url', + 'type' => 'textarea', + 'title' => 'URL', + 'subtitle' => 'URL', + 'desc' => tr( '填入需要屏蔽的 URL 链接,一行一条,注意不要串行', + 'wp-china-yes' ), + 'default' => '', + 'placeholder' => 'example.com', + 'sanitize' => false, + ], + [ + 'id' => 'enable', + 'type' => 'switcher', + 'title' => '启用规则', + 'subtitle' => '是否启用该规则', + 'default' => true, + ], + ], + ] + ], + ] ); + } + +if (in_array('monitor', $enabled_sections)) { +WP_CHINA_YES::createSection( $this->prefix, [ + 'title' => '脉云维护', + 'icon' => 'icon icon-story', + 'fields' => [ + [ + 'id' => 'monitor', + 'type' => 'switcher', + 'default' => true, + 'title' => '节点监控', + 'subtitle' => '自动监控加速节点可用性', + 'desc' => tr( '脉云维护(MainCloud)支持自动监控各加速节点可用性,当节点不可用时自动切换至可用节点或关闭加速,以保证您的网站正常访问', + 'wp-china-yes' ), + ], + [ + 'id' => 'memory', + 'type' => 'switcher', + 'default' => true, + 'title' => '系统监控', + 'subtitle' => '自动监控系统运行状态', + 'desc' => tr( '支持在管理后台页脚中显示系统运行状态,包括内存使用、CPU负载、MySQL版本、调试状态等信息', + 'wp-china-yes' ), + ], + [ + 'id' => 'memory_display', + 'type' => 'checkbox', + 'title' => '显示参数', + 'inline' => true, + 'options' => [ + 'memory_usage' => '内存使用量', + 'wp_limit' => '内存限制', + 'server_ip' => '服务器 IP', + 'hostname' => '主机名称', + 'os_info' => '操作系统', + 'mysql_version'=> 'MySQL版本', + 'cpu_usage' => 'CPU使用率', + 'debug_status' => '调试状态', + 'php_info' => 'PHP 版本' + ], + 'default' => [ + 'memory_usage', + 'wp_limit', + 'server_ip', + 'php_info', + ], + 'subtitle' => '选择页脚要显示的信息', + 'desc' => '为网站维护人员提供参考依据,无需登录服务器即可查看相关信息参数', + 'dependency' => ['memory', '==', 'true'], + ], + [ + 'id' => 'disk', + 'type' => 'switcher', + 'default' => true, + 'title' => '站点监控', + 'subtitle' => '自动监控站点运行状态', + 'desc' => tr( '支持在管理后台页脚中显示系统运行状态,包括内存使用、CPU负载、MySQL版本、调试状态等信息', + 'wp-china-yes' ), + ], + [ + 'id' => 'disk_display', + 'type' => 'checkbox', + 'title' => '显示参数', + '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' => '为网站管理人员提供参考依据,进入后台仪表盘即可查看相关信息参数', + 'dependency' => ['disk', '==', 'true'], + ], +[ + 'id' => 'maintenance_mode', + 'type' => 'switcher', + 'default' => false, + 'title' => '启用维护模式', + 'subtitle' => '启用或禁用网站维护模式', + 'desc' => '启用后,网站将显示维护页面,只有管理员可以访问。', +], +[ + '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' => '雨滴安全', + 'inline' => true, + 'options' => [ + 'cn' => '默认线路', + 'global' => '国际线路', + 'off' => '不启用' + ], + 'default' => 'cn', + 'subtitle' => '是否启用雨滴安全', + 'desc' => tr( '雨滴安全(YooDefender)安全设置可以帮助增强 WordPress 的安全性,请根据实际需求启用相关选项。更多选项请安装 WPBan 插件。可自选加速线路。', + 'wp-china-yes' ), + ], + [ + 'id' => 'disallow_file_edit', + 'type' => 'switcher', + 'title' => '禁用文件编辑', + 'subtitle' => '禁用 WordPress 后台的主题和插件编辑器', + 'default' => true, + 'desc' => '启用后,用户无法通过 WordPress 后台编辑主题和插件文件。', + ], + [ + 'id' => 'disallow_file_mods', + 'type' => 'switcher', + 'title' => '禁用文件修改', + 'subtitle' => '禁止用户安装、更新或删除主题和插件', + 'default' => false, + 'desc' => '启用后,用户无法通过 WordPress 后台安装、更新或删除主题和插件。', + ], + ], +] ); + } + if (in_array('performance', $enabled_sections)) { + WP_CHINA_YES::createSection( $this->prefix, [ + 'title' => '性能优化', + 'icon' => 'icon icon-speedometer', + 'fields' => [ + [ + 'id' => 'performance', + 'type' => 'switcher', + 'title' => '性能优化', + 'subtitle' => '是否启用性能优化', + 'default' => true, + 'desc' => '性能优化设置可以帮助提升 WordPress 的运行效率,请根据服务器配置合理调整。', + ], + + [ + 'id' => 'wp_memory_limit', + 'type' => 'text', + 'title' => '内存限制', + 'subtitle' => '设置 WordPress 内存限制', + 'default' => '40M', + 'desc' => '设置 WordPress 的内存限制,例如 64M、128M、256M 等。', + 'dependency' => ['performance', '==', 'true'], + + ], + [ + 'id' => 'wp_max_memory_limit', + 'type' => 'text', + 'title' => '后台内存限制', + 'subtitle' => '设置 WordPress 后台内存限制', + 'default' => '256M', + 'desc' => '设置 WordPress 后台的内存限制,例如 128M、256M、512M 等。', + 'dependency' => ['performance', '==', 'true'], + + ], + [ + 'id' => 'wp_post_revisions', + 'type' => 'number', + 'title' => '文章修订版本', + 'subtitle' => '控制文章修订版本的数量', + 'default' => -1, // -1 表示启用所有修订版本 + 'desc' => '设置为 0 禁用修订版本,或设置为一个固定值(如 5)限制修订版本数量。', + 'dependency' => ['performance', '==', 'true'], + + ], + [ + 'id' => 'autosave_interval', + 'type' => 'number', + 'title' => '自动保存间隔', + 'subtitle' => '设置文章自动保存的时间间隔(秒)', + 'default' => 60, + 'desc' => '设置文章自动保存的时间间隔,默认是 60 秒。', + '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 功能,输入您的品牌词启用后生效', + 'default' => "文派叶子", + ], + [ + 'id' => 'header_logo', + 'type' => 'media', + 'title' => '品牌 Logo', + 'subtitle' => '自定义插件显示品牌 Logo', + 'library' => 'image', + 'preview' => true, + 'preview_size' => 'thumbnail', + 'preview_width' => 120, + 'preview_height' => 120, + 'button_title' => '上传 Logo', + 'remove_title' => '移除 Logo', + 'placeholder' => '未选择 Logo', + 'desc' => '上传或选择媒体库的图片作为品牌 Logo', + 'default' => [ + 'url' => plugins_url('wp-china-yes/assets/images/wpcy-logo.png'), + 'id' => 0, + 'width' => 120, + 'height' => 120, + 'thumbnail' => plugins_url('wp-china-yes/assets/images/wpcy-logo.png'), + 'alt' => '文派叶子 Logo', + 'title' => '文派叶子', + 'description' => '文派叶子默认Logo' + ], + ], + [ + 'id' => 'hide_option', + 'type' => 'switcher', + 'default' => false, + 'title' => '隐藏设置', + 'subtitle' => '隐藏插件设置信息', + 'desc' => tr( '如果您不希望让客户知道本站启用了文派叶子🍃(WPCY.COM)插件及服务,可开启此选项。', + 'wp-china-yes' ), + ], + + [ + 'id' => 'hide_elements', + 'type' => 'checkbox', + 'title' => '隐藏元素', + 'subtitle' => '选择需要隐藏的界面元素', + 'desc' => '隐藏插件界面中的品牌相关元素,提升白标效果', + 'inline' => true, + 'options' => [ + 'hide_logo' => '隐藏 Logo', + 'hide_title' => '隐藏插件名', + 'hide_version' => '隐藏版本号', + 'hide_copyright' => '隐藏版权信息', + ], + 'default' => [], + 'dependency' => ['hide_option', '==', 'true'], + ], + [ + 'id' => 'hide_menu_confirm', + 'type' => 'checkbox', + 'title' => '隐藏菜单确认', + 'subtitle' => '⚠️ 危险操作:请先保存访问URL', + 'desc' => '当前页面URL:' . (is_multisite() ? network_admin_url('settings.php?page=wp-china-yes') : admin_url('options-general.php?page=wp-china-yes')) . '
隐藏菜单后只能通过此URL访问设置页面', + 'options' => [ + 'confirmed' => '我已保存URL并了解风险,确认要隐藏菜单' + ], + 'default' => [], + 'dependency' => ['hide_option', '==', 'true'], + ], + [ + 'id' => 'hide_menu', + 'type' => 'switcher', + 'title' => '隐藏菜单', + 'subtitle' => '从WordPress后台菜单中隐藏插件入口', + 'desc' => '启用后插件菜单将从后台消失,只能通过直接URL访问', + 'default' => false, + 'dependency' => ['hide_menu_confirm|confirmed', '==', 'confirmed'], + ], + [ + '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,长期无更新时会恢复显示默认新闻源。', + 'default' => 'https://one.weixiaoduo.com/feed', + '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' => '14400', + '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' => 'enable_db_tools', + 'type' => 'switcher', + 'title' => '数据库工具', + 'subtitle' => '启用数据库维护功能', + 'default' => false, + 'desc' => '启用后可访问WordPress内置的数据库修复工具。使用前请备份数据库。', + ], + [ + 'id' => 'db_tools_link', + 'type' => 'content', + 'title' => '数据库修复工具', + 'subtitle' => '访问WordPress数据库修复工具', + 'dependency' => [ 'enable_db_tools', '==', 'true' ], + 'content' => ' +
+

重要提醒:使用数据库修复工具前请务必备份数据库!

+

打开数据库修复工具

+

此工具将在新窗口中打开,修复完成后建议关闭此功能。

+
+ ', + ], + [ + 'id' => 'enable_sections', + 'type' => 'switcher', + 'title' => '功能模块管理', + 'subtitle' => '启用自定义功能选项卡', + 'default' => true, + 'desc' => '启用后可自定义显示的功能模块。注意:禁用功能后重新启用需要重新配置相关设置。', + ], + [ + 'id' => 'quick_select', + 'type' => 'button_set', + 'title' => '快速选择', + 'subtitle' => '一键选择常用配置方案', + 'dependency' => ['enable_sections', '==', 'true'], + 'multiple' => false, + 'options' => [ + 'recommended' => '推荐配置', + 'minimal' => '最小配置', + 'full' => '完整配置', + 'custom' => '自定义配置', + ], + 'default' => 'custom', + 'desc' => '选择预设配置方案,或选择"自定义配置"进行个性化设置。', + ], + [ + 'id' => 'enabled_sections', + 'type' => 'checkbox', + 'title' => '功能选项卡', + 'subtitle' => '选择要显示的功能模块', + 'dependency' => ['enable_sections', '==', 'true'], + 'inline' => true, + 'options' => [ + 'welcome' => '欢迎使用', + 'store' => '应用市场', + 'admincdn' => '萌芽加速', + 'cravatar' => '初认头像', + 'windfonts' => '文风字体', + 'motucloud' => '墨图云集', + 'fewmail' => '飞秒邮箱', + 'wordyeah' => '无言会语', + 'blocks' => '笔笙区块', + 'deerlogin' => '灯鹿用户', + 'waimao' => '跨飞外贸', + 'woocn' => 'Woo电商', + 'lelms' => '乐尔达思', + 'wapuu' => '瓦普文创', + 'adblock' => '广告拦截', + 'notice' => '通知管理', + 'plane' => '飞行模式', + 'monitor' => '脉云维护', + 'forums' => '赛博论坛', + 'forms' => '重力表单', + 'panel' => '天控面板', + 'security' => '雨滴安全', + 'domain' => '蛋叮域名', + 'performance' => '性能优化', + 'brand' => '品牌白标', + 'sms' => '竹莺短信', + 'chat' => '点洽客服', + 'translate' => '文脉翻译', + 'ecosystem' => '生态系统', + 'deer' => '建站套件', + 'docs' => '帮助文档', + 'about' => '关于插件', + 'other' => '其他设置' + ], + 'default' => ['welcome', 'store', 'admincdn', 'cravatar', 'wordyeah', 'other', 'about'], + 'desc' => '选择要显示的功能模块,取消勾选的模块将在设置页面中隐藏。', + ], + [ + 'type' => 'content', + 'dependency' => ['enable_sections', '==', 'true'], + 'content' => ' + + ', + ], + + ], + ] ); + + 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' => '建站套件', + 'icon' => 'icon icon-mouse', + 'fields' => [ + [ + 'type' => 'content', + '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' => '帮助文档', + 'inline' => true, + 'options' => [ + 'cn' => '默认线路', + 'global' => '国际线路', + 'off' => '不启用' + ], + 'default' => 'cn', + 'subtitle' => '是否启用灯鹿用户', + 'desc' => tr( '灯鹿用户(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' =>$about_content, + ] + ], + ] ); + } + + // 备份选项功能 + WP_CHINA_YES::createSection( $this->prefix, [ + 'title' => '备份选项', + 'icon' => 'icon icon-download', + 'fields' => [ + [ + 'type' => 'content', + 'content' => ' +
+
+
+ +

使用说明

+

导出设置:点击"导出"按钮将当前所有插件配置保存为JSON文件,文件会自动下载到您的电脑。

+

导入设置:选择之前导出的JSON备份文件,点击"导入"按钮恢复所有设置。

+
+
+
+ ', + ], + [ + 'type' => 'backup', + 'title' => '备份与恢复操作', + 'subtitle' => '导出当前设置或导入之前保存的配置文件', + 'desc' => '使用上方说明进行备份和恢复操作,确保数据安全。', + ] + ], + ] ); + + } + + /** + * 加载后台资源 + */ + public function enqueue_admin_assets( $hook_suffix ) { + if ( strpos( $hook_suffix, 'wp-china-yes' ) === false ) { + return; + } + wp_enqueue_style( 'wpcy-admin', CHINA_YES_PLUGIN_URL . 'assets/css/setting.css', [], CHINA_YES_VERSION ); + } + + /** + * 挂载设置页面 + */ + public function admin_menu() { + // 自定义名称 + add_filter( 'all_plugins', function ( $plugins ) { + 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; + } ); + + + + // 插件页设置 + add_filter( 'plugin_action_links', function ( $links, $file ) { + if ( 'wp-china-yes/wp-china-yes.php' !== $file ) { + return $links; + } + $settings_link = '' . esc_html( tr( '设置', + 'wp-china-yes' ) ) . ''; + array_unshift( $links, $settings_link ); + + return $links; + }, 10, 2 ); + } + + /** + * 获取WordPress可用语言列表 + */ + private function get_available_languages() { + require_once ABSPATH . 'wp-admin/includes/translation-install.php'; + + $languages = wp_get_available_translations(); + $language_options = [ + '' => 'English (United States)' + ]; + + foreach ( $languages as $locale => $language ) { + $language_options[ $locale ] = $language['native_name']; + } + + return $language_options; + } + + /** + * 获取当前后台语言设置 + */ + private function get_current_admin_language() { + $user_locale = get_user_meta( get_current_user_id(), 'locale', true ); + return $user_locale ?: get_locale(); + } + + /** + * 获取当前前台语言设置 + */ + private function get_current_frontend_language() { + return get_option( 'WPLANG', '' ); + } +} \ No newline at end of file diff --git a/Service/Super.php b/Service/Super.php new file mode 100755 index 0000000..257927c --- /dev/null +++ b/Service/Super.php @@ -0,0 +1,169 @@ +settings = get_settings(); + + if ( is_admin() || wp_doing_cron() ) { + if ( $this->settings['store'] != 'off' ) { + add_filter( 'pre_http_request', [ $this, 'filter_wordpress_org' ], 100, 3 ); + } + } + + new Widget(); + new Language(); + new Migration(); + new Fonts(); + new Comments(); + + 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 ); + } + + if ( ! ( defined( 'DOING_AJAX' ) && DOING_AJAX ) ) { + 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['notice_block'] ) && $this->settings['notice_block'] == 'on' ) { + add_action( 'admin_head', [ $this, 'load_notice_management' ] ); + } + } + + if ( ! empty( $this->settings['plane'] ) && $this->settings['plane'] == 'on' ) { + $this->load_plane(); + } + } + + 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( '', esc_html( $rule['selector'] ) ); + } + } + + public function load_notice_management() { + echo ''; + } + + public function load_plane() { + foreach ( (array) $this->settings['plane_rule'] as $rule ) { + if ( empty( $rule['enable'] ) || empty( $rule['domain'] ) ) { + continue; + } + + add_filter( 'pre_http_request', function ( $preempt, $parsed_args, $url ) use ( $rule ) { + $host = wp_parse_url( $url, PHP_URL_HOST ); + if ( strpos( $host, $rule['domain'] ) !== false ) { + return new WP_Error( 'http_request_failed', 'Blocked by plane mode' ); + } + return $preempt; + }, 10, 3 ); + } + } + + public function filter_wordpress_org( $preempt, $parsed_args, $url ) { + $host = wp_parse_url( $url, PHP_URL_HOST ); + + if ( ! in_array( $host, [ 'api.wordpress.org', 'downloads.wordpress.org' ] ) ) { + return $preempt; + } + + $path = wp_parse_url( $url, PHP_URL_PATH ); + $query = wp_parse_url( $url, PHP_URL_QUERY ); + + if ( $this->settings['store'] == 'cn' ) { + $mirror_url = 'https://api.wenpai.net' . $path; + } else { + $mirror_url = 'https://api.wenpai.net' . $path; + } + + if ( $query ) { + $mirror_url .= '?' . $query; + } + + $parsed_args['timeout'] = 30; + return wp_remote_request( $mirror_url, $parsed_args ); + } + + public function set_user_profile_picture_for_cravatar( $description ) { + return str_replace( 'Gravatar', 'Cravatar', $description ); + } + + public function set_defaults_for_cravatar( $avatar_defaults ) { + $avatar_defaults['cravatar'] = 'Cravatar Logo (Generated)'; + return $avatar_defaults; + } + + public function get_cravatar_url( $url ) { + $sources = [ + 'www.gravatar.com' => 'cn.cravatar.com', + '0.gravatar.com' => 'cn.cravatar.com', + '1.gravatar.com' => 'cn.cravatar.com', + '2.gravatar.com' => 'cn.cravatar.com', + 'secure.gravatar.com' => 'cn.cravatar.com', + 'cn.gravatar.com' => 'cn.cravatar.com', + 'gravatar.com' => 'cn.cravatar.com', + ]; + + if ( $this->settings['cravatar'] == 'global' ) { + $sources = [ + 'www.gravatar.com' => 'www.gravatar.com', + '0.gravatar.com' => 'www.gravatar.com', + '1.gravatar.com' => 'www.gravatar.com', + '2.gravatar.com' => 'www.gravatar.com', + 'secure.gravatar.com' => 'www.gravatar.com', + 'cn.gravatar.com' => 'www.gravatar.com', + 'gravatar.com' => 'www.gravatar.com', + ]; + } + + return str_replace( array_keys( $sources ), array_values( $sources ), $url ); + } + + public function page_str_replace( $hook, $function, $args ) { + add_action( $hook, function () use ( $function, $args ) { + ob_start( function ( $buffer ) use ( $function, $args ) { + return call_user_func_array( $function, array_merge( [ $args[0], $args[1], $buffer ] ) ); + } ); + }, 1 ); + + add_action( 'wp_footer', function () { + if ( ob_get_level() ) { + ob_end_flush(); + } + }, 999 ); + } +} diff --git a/Service/TranslationManager.php b/Service/TranslationManager.php new file mode 100644 index 0000000..741a8c7 --- /dev/null +++ b/Service/TranslationManager.php @@ -0,0 +1,140 @@ + '应用市场', + '萌芽加速' => '萌芽加速', + '文件加速' => '文件加速', + '开发加速' => '开发加速', + '初认头像' => '初认头像', + '文风字体' => '文风字体', + '字体家族' => '字体家族', + '字体链接' => '字体链接', + '字体字重' => '字体字重', + '字体样式' => '字体样式', + '字体应用' => '字体应用', + '启用字体' => '启用字体', + '排印优化' => '排印优化', + '英文美化' => '英文美化', + '墨图云集' => '墨图云集', + '飞秒邮箱' => '飞秒邮箱', + '无言会语' => '无言会语', + '笔笙区块' => '笔笙区块', + '灯鹿用户' => '灯鹿用户', + 'Woo电商' => 'Woo电商', + '乐尔达思' => '乐尔达思', + '瓦普文创' => '瓦普文创', + '广告拦截' => '广告拦截', + '规则名称' => '规则名称', + '应用元素' => '应用元素', + '启用规则' => '启用规则', + '通知管理' => '通知管理', + '管理和控制 WordPress 后台各类通知的显示。' => '管理和控制 WordPress 后台各类通知的显示。', + '禁用所有通知' => '禁用所有通知', + '选择性禁用' => '选择性禁用', + '可以按住 Ctrl/Command 键进行多选' => '可以按住 Ctrl/Command 键进行多选', + '禁用方式' => '禁用方式', + '飞行模式' => '飞行模式', + 'URL' => 'URL', + '显示参数' => '显示参数', + '为网站维护人员提供参考依据,无需登录服务器即可查看相关信息参数' => '为网站维护人员提供参考依据,无需登录服务器即可查看相关信息参数', + '为网站管理人员提供参考依据,进入后台仪表盘即可查看相关信息参数' => '为网站管理人员提供参考依据,进入后台仪表盘即可查看相关信息参数', + '启用后,网站将显示维护页面,只有管理员可以访问。' => '启用后,网站将显示维护页面,只有管理员可以访问。', + '雨滴安全' => '雨滴安全', + '禁用文件编辑' => '禁用文件编辑', + '启用后,用户无法通过 WordPress 后台编辑主题和插件文件。' => '启用后,用户无法通过 WordPress 后台编辑主题和插件文件。', + '禁用文件修改' => '禁用文件修改', + '启用后,用户无法通过 WordPress 后台安装、更新或删除主题和插件。' => '启用后,用户无法通过 WordPress 后台安装、更新或删除主题和插件。', + '性能优化' => '性能优化', + '性能优化设置可以帮助提升 WordPress 的运行效率,请根据服务器配置合理调整。' => '性能优化设置可以帮助提升 WordPress 的运行效率,请根据服务器配置合理调整。', + '内存限制' => '内存限制', + '设置 WordPress 的内存限制,例如 64M、128M、256M 等。' => '设置 WordPress 的内存限制,例如 64M、128M、256M 等。', + '后台内存限制' => '后台内存限制', + '设置 WordPress 后台的内存限制,例如 128M、256M、512M 等。' => '设置 WordPress 后台的内存限制,例如 128M、256M、512M 等。', + '文章修订版本' => '文章修订版本', + '设置为 0 禁用修订版本,或设置为一个固定值(如 5)限制修订版本数量。' => '设置为 0 禁用修订版本,或设置为一个固定值(如 5)限制修订版本数量。', + '自动保存间隔' => '自动保存间隔', + '设置文章自动保存的时间间隔,默认是 60 秒。' => '设置文章自动保存的时间间隔,默认是 60 秒。', + '专为 WordPress 建站服务商和代理机构提供的自定义品牌 OEM 功能,输入您的品牌词启用后生效' => '专为 WordPress 建站服务商和代理机构提供的自定义品牌 OEM 功能,输入您的品牌词启用后生效', + '注意:启用[隐藏菜单]前请务必保存或收藏当前设置页面 URL,否则将无法再次进入插件页面' => '注意:启用[隐藏菜单]前请务必保存或收藏当前设置页面 URL,否则将无法再次进入插件页面', + '调试模式' => '调试模式', + '启用后,WordPress 将显示 PHP 错误、警告和通知。临时使用完毕后,请保持禁用此选项。' => '启用后,WordPress 将显示 PHP 错误、警告和通知。临时使用完毕后,请保持禁用此选项。', + '调试选项' => '调试选项', + '注意:调试模式仅适用于开发和测试环境,不建议在生产环境中长时间启用。选择要启用的调试功能,适用于开发和测试环境。' => '注意:调试模式仅适用于开发和测试环境,不建议在生产环境中长时间启用。选择要启用的调试功能,适用于开发和测试环境。', + '数据库工具' => '数据库工具', + '启用后,您可以在下方访问数据库修复工具。定期使用完毕后,请保持禁用此选项。' => '启用后,您可以在下方访问数据库修复工具。定期使用完毕后,请保持禁用此选项。', + '数据库修复工具' => '数据库修复工具', + '打开数据库修复工具' => '打开数据库修复工具', + '启用后,您可以在下方选用文派叶子功能,特别提醒:禁用对应功能后再次启用需重新设置。' => '启用后,您可以在下方选用文派叶子功能,特别提醒:禁用对应功能后再次启用需重新设置。', + '帮助文档' => '帮助文档', + '文派开源' => '文派开源', + '官方镜像' => '官方镜像', + '不启用' => '不启用' + ]; + } + + public static function translate($text, $domain = 'wp-china-yes') { + if (!self::$loaded) { + return isset(self::$fallbacks[$text]) ? self::$fallbacks[$text] : $text; + } + + if (function_exists('__')) { + $translated = __($text, $domain); + return $translated !== $text ? $translated : (isset(self::$fallbacks[$text]) ? self::$fallbacks[$text] : $text); + } + + return isset(self::$fallbacks[$text]) ? self::$fallbacks[$text] : $text; + } + + public static function translateLazy($text, $domain = 'wp-china-yes') { + return function() use ($text, $domain) { + return self::translate($text, $domain); + }; + } + + public static function isLoaded() { + return self::$loaded; + } + + public static function getFallback($text) { + return isset(self::$fallbacks[$text]) ? self::$fallbacks[$text] : $text; + } +} \ No newline at end of file diff --git a/Service/Update.php b/Service/Update.php new file mode 100755 index 0000000..e102b82 --- /dev/null +++ b/Service/Update.php @@ -0,0 +1,23 @@ +settings = get_settings(); + + /** + * 添加「文派茶馆」小组件 + */ + if ( is_admin() ) { + add_action( 'wp_dashboard_setup', [ $this, 'setup_wenpai_tea_widget' ] ); + } + } + + /** + * 设置文派茶馆小组件 + */ + public function setup_wenpai_tea_widget() { + global $wp_meta_boxes; + + unset( $wp_meta_boxes['dashboard']['side']['core']['dashboard_primary'] ); + wp_add_dashboard_widget( 'wenpai_tea', '文派茶馆', [ $this, 'render_wenpai_tea_widget' ] ); + } + + /** + * 渲染文派茶馆小组件 + */ + public function render_wenpai_tea_widget() { + $default_rss_url = 'https://wptea.com/feed/'; + $custom_rss_url = $this->settings['custom_rss_url'] ?? ''; + $refresh_interval = $this->settings['custom_rss_refresh'] ?? 14400; + + $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; + 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; + if (in_array('show_footer', $rss_display_options)) { + echo << + 文派开源 + | + 支持论坛 + | + 翻译平台 + | + 订阅推送 +

+HTML; + } + 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; + } +} \ No newline at end of file diff --git a/assets/css/fonts.css b/assets/css/fonts.css new file mode 100755 index 0000000..86bde42 --- /dev/null +++ b/assets/css/fonts.css @@ -0,0 +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; +} diff --git a/assets/css/setting.css b/assets/css/setting.css new file mode 100755 index 0000000..14deffb --- /dev/null +++ b/assets/css/setting.css @@ -0,0 +1,621 @@ +#wpcontent { + padding-left: 0px; +} +#wpbody-content { + padding-bottom: 0px; +} +#wpfooter { + display: none; +} + + +@media only screen and (max-width: 1200px) { + .wp_china_yes-nav-normal { + width: 200px; + } + .wp_china_yes-nav-normal+.wp_china_yes-content { + margin-left: 200px; + } + .wp_china_yes-nav-background { + width: 200px; + } +} + +@media only screen and (max-width: 960px) { + .wp_china_yes-field .wp_china_yes-title { + width: 30%; + } + .wp_china_yes-field .wp_china_yes-fieldset { + width: calc(70% - 20px); + } + .wpcy-about__grid.columns-3 { + grid-template-columns: repeat(2, minmax(0, 1fr)); + } +} + +@media only screen and (max-width: 782px) { + .wp_china_yes-nav-normal+.wp_china_yes-content { + margin-left: 0!important; + } + .wp_china_yes-nav-normal { + position: fixed; + top: 32px; + left: -250px; + height: 100vh; + z-index: 9999; + transition: left 0.3s ease; + background: #fff; + box-shadow: 2px 0 5px rgba(0,0,0,0.1); + } + .wp_china_yes-nav-normal.mobile-open { + left: 0; + } + .wp_china_yes-header-inner { + position: relative; + padding: 15px 20px; + } + .wp_china_yes-header-inner h1 { + margin-bottom: 10px; + font-size: 1.3em; + } + .auto-fold #wpcontent { + padding-left: 0px; + } + .wp_china_yes-field-text input, + .wp_china_yes-field-textarea textarea, + .wp_china_yes-field-select select { + width: 100%; + max-width: 100%; + } + .wp_china_yes-field .wp_china_yes-title { + width: 100%; + float: none; + margin-bottom: 10px; + } + .wp_china_yes-field .wp_china_yes-fieldset { + width: 100%; + float: none; + } + .wp_china_yes-field { + padding: 20px; + } + .wp_china_yes-section { + margin: 20px auto; + } +} + +.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: 80px; + margin: 13px; + height: auto; +} + +.contributors-name { + margin-top: 0; + margin-bottom: 0; + padding: 20px 0; + color: #dcdcde; + display: block; + flex-wrap: wrap; + display: flex; + grid-gap: 22px; +} + +.wp_china_yes-content { + position: relative; + background-color: #f1f1f1; +} + +.wp_china_yes-content a { + color: #3858e9; + text-decoration: none; +} + +.wp_china_yes-content a:active, a:focus, a:hover { + color: #2c3338; +} + +.wp_china_yes-options { + background-color: #ffffff; + border-radius: 10px; + text-transform: none; + line-height: 2; +} + +.wp_china_yes-options { + margin-top: 0px; + margin-right: 0px; +} + +.wp_china_yes-field { + 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-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; + 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-fieldset .wp_china_yes-fieldset-content { + border: 0px solid #ccd0d4; +} + +.wp_china_yes-section-title { + padding: 20px 30px; + background-color: #fff; + border-top: 0 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 { + 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 #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 { + font-size: 1.4em; + 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-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: 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; +} + +.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: 1px; +} + +.wp_china_yes-field-group .wp_china_yes-cloneable-content { + 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-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: #5e77ec !important; + border-color: #5e77ec !important; + background: #ffffff !important; +} + +.wp_china_yes-warning-primary:focus, .wp_china_yes-warning-primary:hover { + border-color: #3858e9 !important; + background: #ffffff !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; +} + + +@media screen and (max-width: 600px) { + .wpcy-about__grid { + grid-template-columns: 1fr!important; + } + .wp_china_yes-buttons { + flex-direction: column; + align-items: stretch; + } + .wp_china_yes-buttons .button { + margin: 2px 0; + text-align: center; + } + .sponsor-logos { + grid-template-columns: repeat(3, minmax(0, 1fr)); + } + .sponsor-logos img { + max-width: 60px; + margin: 8px; + } + .wpcy-buttons { + flex-direction: column; + gap: 8px; + } + .components-button { + justify-content: center; + padding: 8px 12px; + min-height: 40px; + } +} + +@media screen and (max-width: 480px) { + .wp_china_yes-header-inner { + padding: 10px 15px; + } + .wp_china_yes-header-inner h1 { + font-size: 1.2em; + line-height: 1.3; + } + .wp_china_yes-field { + padding: 15px; + margin: 10px 0; + } + .wp_china_yes-section { + margin: 10px auto; + max-width: 100%; + } + .wp_china_yes-section-title { + padding: 15px 20px; + } + .sponsor-logos { + grid-template-columns: repeat(2, minmax(0, 1fr)); + } + .wpcy-about__grid .column { + padding: 6%; + } + .column.wpcy-kit-banner { + padding: 4% 4% 2%!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; +} + +/* 移动端菜单按钮样式 */ +.wp_china_yes-mobile-menu-btn { + color: #333; + padding: 5px; + border-radius: 3px; +} + +.wp_china_yes-mobile-menu-btn:hover { + background-color: rgba(0,0,0,0.1); +} + +/* 表单元素响应式优化 */ +@media screen and (max-width: 782px) { + .wp_china_yes-field-checkbox .wp_china_yes--inline-list li, + .wp_china_yes-field-radio .wp_china_yes--inline-list li { + display: block; + margin-right: 0; + margin-bottom: 8px; + } + + .wp_china_yes-field-button_set .wp_china_yes--buttons { + display: flex; + flex-wrap: wrap; + gap: 5px; + } + + .wp_china_yes-field-button_set .wp_china_yes--button { + flex: 1; + min-width: 80px; + text-align: center; + border-radius: 4px !important; + margin-left: 0 !important; + } + + .wp_china_yes-field-color > input { + width: 100%; + max-width: 200px; + } + + .wp_china_yes-field-upload .button { + width: 100%; + margin-bottom: 10px; + } +} + +/* 平板设备优化 */ +@media screen and (min-width: 783px) and (max-width: 960px) { + .wp_china_yes-field-checkbox .wp_china_yes--inline-list li, + .wp_china_yes-field-radio .wp_china_yes--inline-list li { + margin-right: 10px; + } +} + diff --git a/assets/images/qr-banner.jpg b/assets/images/qr-banner.jpg new file mode 100755 index 0000000..4620f3b Binary files /dev/null and b/assets/images/qr-banner.jpg differ diff --git a/assets/images/website-banner.jpg b/assets/images/website-banner.jpg new file mode 100755 index 0000000..d212bdc Binary files /dev/null and b/assets/images/website-banner.jpg differ diff --git a/assets/images/wpcy-logo.png b/assets/images/wpcy-logo.png new file mode 100644 index 0000000..7f0f3de Binary files /dev/null and b/assets/images/wpcy-logo.png differ diff --git a/assets/js/script.js b/assets/js/script.js new file mode 100755 index 0000000..c05088a --- /dev/null +++ b/assets/js/script.js @@ -0,0 +1,72 @@ +jQuery(document).ready(function($) { + // 移动端菜单切换功能 + function initMobileMenu() { + // 添加菜单按钮 + if (!$('.wp_china_yes-mobile-menu-btn').length) { + $('.wp_china_yes-header-inner').prepend( + '' + ); + } + + // 检查屏幕尺寸 + function checkScreenSize() { + if ($(window).width() <= 782) { + $('.wp_china_yes-mobile-menu-btn').show(); + $('.wp_china_yes-nav-normal').removeClass('mobile-open'); + } else { + $('.wp_china_yes-mobile-menu-btn').hide(); + $('.wp_china_yes-nav-normal').removeClass('mobile-open'); + } + } + + // 菜单按钮点击事件 + $(document).on('click', '.wp_china_yes-mobile-menu-btn', function() { + $('.wp_china_yes-nav-normal').toggleClass('mobile-open'); + }); + + // 点击内容区域关闭菜单 + $(document).on('click', '.wp_china_yes-content', function() { + if ($(window).width() <= 782) { + $('.wp_china_yes-nav-normal').removeClass('mobile-open'); + } + }); + + // 窗口大小改变时检查 + $(window).resize(checkScreenSize); + checkScreenSize(); + } + + initMobileMenu(); + + $("#test-rss-feed").click(function() { + var button = $(this); + var result = $("#rss-test-result"); + var feedUrl = $("#custom_rss_url").val(); + + if (!feedUrl) { + result.html('请先填写 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 new file mode 100755 index 0000000..a9b8d77 --- /dev/null +++ b/changelog.txt @@ -0,0 +1,330 @@ +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.1 - 2025-07-29 +----------------------------------------------------------------------------------------- + +* 小版本更新,修复和优化 + +1. 代码优化和性能提升 +2. 修复已知问题 +3. 兼容性改进 + +----------------------------------------------------------------------------------------- +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. 性能优化 +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 头像服务) + +修复 +1. 修复了某些情况下无法替换 Gravatar 头像的问题 +2. 修复:管理后台加速功能因用户反馈问题较多,故暂时默认关闭 +3. 修复:后台加速功能误对处于测试状态的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/composer.json b/composer.json new file mode 100755 index 0000000..dc15555 --- /dev/null +++ b/composer.json @@ -0,0 +1,27 @@ +{ + "name": "wenpai-org/wp-china-yes", + "description": "WordPress Optimized Plugin for Mainland China", + "type": "project", + "require": { + "yahnis-elsts/plugin-update-checker": "^5.2" + }, + "license": "GPL-3.0-or-later", + "autoload": { + "psr-4": { + "WenPai\\ChinaYes\\": "./" + }, + "files": [ + "helpers.php", + "framework/classes/setup.class.php" + ] + }, + "authors": [ + { + "name": "耗子", + "email": "i@haozi.net" + } + ], + "config": { + "optimize-autoloader": true + } +} diff --git a/composer.lock b/composer.lock new file mode 100755 index 0000000..55fa2ae --- /dev/null +++ b/composer.lock @@ -0,0 +1,69 @@ +{ + "_readme": [ + "This file locks the dependencies of your project to a known state", + "Read more about it at https://getcomposer.org/doc/01-basic-usage.md#installing-dependencies", + "This file is @generated automatically" + ], + "content-hash": "46cf14a68ffba471ee1e2f603a301a9c", + "packages": [ + { + "name": "yahnis-elsts/plugin-update-checker", + "version": "v5.5", + "source": { + "type": "git", + "url": "https://github.com/YahnisElsts/plugin-update-checker.git", + "reference": "845d65da93bcff31649ede00d9d73b1beadbb7f0" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/YahnisElsts/plugin-update-checker/zipball/845d65da93bcff31649ede00d9d73b1beadbb7f0", + "reference": "845d65da93bcff31649ede00d9d73b1beadbb7f0", + "shasum": "" + }, + "require": { + "ext-json": "*", + "php": ">=5.6.20" + }, + "type": "library", + "autoload": { + "files": [ + "load-v5p5.php" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Yahnis Elsts", + "email": "whiteshadow@w-shadow.com", + "homepage": "https://w-shadow.com/", + "role": "Developer" + } + ], + "description": "A custom update checker for WordPress plugins and themes. Useful if you can't host your plugin in the official WP repository but still want it to support automatic updates.", + "homepage": "https://github.com/YahnisElsts/plugin-update-checker/", + "keywords": [ + "automatic updates", + "plugin updates", + "theme updates", + "wordpress" + ], + "support": { + "issues": "https://github.com/YahnisElsts/plugin-update-checker/issues", + "source": "https://github.com/YahnisElsts/plugin-update-checker/tree/v5.5" + }, + "time": "2024-10-16T14:25:00+00:00" + } + ], + "packages-dev": [], + "aliases": [], + "minimum-stability": "stable", + "stability-flags": [], + "prefer-stable": false, + "prefer-lowest": false, + "platform": [], + "platform-dev": [], + "plugin-api-version": "2.6.0" +} diff --git a/copyright.txt b/copyright.txt new file mode 100755 index 0000000..2de244a --- /dev/null +++ b/copyright.txt @@ -0,0 +1,54 @@ +----------------------------------------------------------------------------------------- +**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 v3 (or later) 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.COM) to create their own versions. + +**The Only Requirement:** +While strictly adhering to the GPL v3 (or later) license, you must respect all lawful rights of WenPai Technology, +including (but not limited to) copyrights, trademarks, patents, intellectual property, goodwill, and more. + +**Disclaimer:** +This software is provided "as is" without warranty of any kind, express or implied. + +----------------------------------------------------------------------------------------- +**版权所有 © 2025 年 文派(广州)科技有限公司** +----------------------------------------------------------------------------------------- + +**合规条款** +任何人都可以自由使用文派开源软件,但在中国境内使用文派软件时,您应在遵守 GPL v3(或更高版本)开源协议的同时, +尊重他人的知识产权,如有与中国法律冲突的情况,以中国法律为准。 + +**分叉声明** +为保障各项文派(WordPress)基础设施的长久可用性, +欢迎有能力的人自建各类服务源以及分叉文派叶子🍃(WPCY.COM)来制作您自己的版本; + +**唯一要求:** +在严格遵守 GPL v3(或更高版本)协议的前提下,尊重文派科技的各项合法权益, +包括(不限于)版权、商标、专利、知识产权、商誉等… + +**免责声明:** +本软件按"现状"提供,不提供任何明示或暗示的保证。 + +**许可证信息:** +完整的 GPL v3 许可证文本请参见项目根目录下的 license 文件。 +许可证详情:https://www.gnu.org/licenses/gpl-3.0.html + +**联系方式:** +官方网站:https://wpcy.com +项目仓库:https://github.com/WenPai-org/wp-china-yes +菲码源库:https://feicode.com/WenPai-org/wp-china-yes +技术支持:https://wenpai.org + +----------------------------------------------------------------------------------------- + + + diff --git a/framework/assets/css/style-rtl.min.css b/framework/assets/css/style-rtl.min.css new file mode 100755 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 100755 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 100755 index 0000000..f97dade Binary files /dev/null and b/framework/assets/images/checkerboard.png differ diff --git a/framework/assets/images/wp-logo.svg b/framework/assets/images/wp-logo.svg new file mode 100755 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 100755 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 100755 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 100755 index 0000000..152624f --- /dev/null +++ b/framework/classes/admin-options.class.php @@ -0,0 +1,688 @@ + '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, true ); + } + + 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 '
        '; +$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 '
        '; + + $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 '
        '; + + 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 100755 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 100755 index 0000000..48e3890 --- /dev/null +++ b/framework/classes/setup.class.php @@ -0,0 +1,804 @@ + 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 on init action + add_action( 'init', array( 'WP_CHINA_YES_Setup', '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' ); + } + + // 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'; + + // 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 100755 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 100755 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 100755 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 100755 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 100755 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 100755 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 100755 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 100755 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 100755 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 100755 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 100755 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 100755 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 100755 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 100755 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 100755 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 100755 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 100755 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 100755 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 100755 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 100755 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 100755 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() { + ?> + + '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' ) + ) ); + } +} diff --git a/framework/fields/image_select/image_select.php b/framework/fields/image_select/image_select.php new file mode 100755 index 0000000..a853aa7 --- /dev/null +++ b/framework/fields/image_select/image_select.php @@ -0,0 +1,79 @@ +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 100755 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 100755 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 100755 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 100755 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 100755 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 100755 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 100755 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 100755 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 100755 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 100755 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 100755 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 100755 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 100755 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 100755 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 100755 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 100755 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 100755 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 100755 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 100755 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 100755 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 100755 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 100755 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 100755 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 100755 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 100755 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 100755 index 0000000..f22a70e --- /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, true ); + + 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 100755 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 100755 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 100755 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 100755 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 100755 index 0000000..49d255d --- /dev/null +++ b/framework/index.php @@ -0,0 +1 @@ +\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 new file mode 100755 index 0000000..5598592 --- /dev/null +++ b/helpers.php @@ -0,0 +1,85 @@ + 'wenpai', + 'bridge' => true, + 'arkpress' => false, + 'admincdn' => [ 'admin' ], + 'admincdn_public' => [ 'googlefonts' ], + 'admincdn_files' => [ 'admin', 'emoji' ], + 'admincdn_dev' => [ 'jquery' ], + 'admincdn_version_enable' => false, + 'admincdn_version' => [ 'css', 'js', 'timestamp' ], + 'cravatar' => 'cn', + 'windfonts' => 'off', + 'windfonts_list' => [ + [ + 'family' => 'cszt', + 'subset' => 'regular', + 'lang' => '', + 'weight' => 400, + 'style' => 'normal', + 'selector' => '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])', + 'enable' => true, + ] + ], + 'windfonts_typography_cn' => [], + 'windfonts_typography_en' => [], + 'windfonts_reading_enable' => false, + 'windfonts_reading' => 'off', + 'motucloud' => 'off', + 'fewmail' => 'off', + 'comments_enable' => false, + 'comments_role_badge' => true, + 'comments_remove_website' => false, + 'comments_validation' => true, + 'comments_herp_derp' => false, + 'comments_sticky_moderate' => false, + 'wordyeah' => 'off', + 'bisheng' => 'off', + 'deerlogin' => 'off', + 'waimao' => 'off', + 'waimao_enable' => false, + 'waimao_language_split' => false, + 'waimao_admin_language' => 'zh_CN', + 'waimao_frontend_language' => 'en_US', + 'waimao_auto_detect' => false, + 'woocn' => 'off', + 'lelms' => 'off', + 'wapuu' => 'off', + 'adblock' => 'off', + 'adblock_rule' => [], + 'plane' => 'off', + 'plane_rule' => [], + 'monitor' => true, + 'memory' => true, + 'hide' => false, + 'custom_name' => 'WP-China-Yes', + 'enabled_sections' => [ 'welcome', 'store', 'admincdn', 'cravatar', 'other', 'about' ], + 'wp_memory_limit' => '256M', + 'wp_max_memory_limit' => '512M', + 'wp_post_revisions' => 5, + 'autosave_interval' => 300, + 'custom_rss_url' => '', + 'custom_rss_refresh' => 3600, + 'rss_display_options' => [ 'show_date', 'show_summary', 'show_footer' ], + ] ); + } + + return $cached_settings; +} + +function clear_settings_cache() { + static $cached_settings = null; + $cached_settings = null; +} diff --git a/index.php b/index.php deleted file mode 100644 index b3d9bbc..0000000 --- a/index.php +++ /dev/null @@ -1 +0,0 @@ - + Copyright (C) 2007 Free Software Foundation, Inc. Everyone is permitted to copy and distribute verbatim copies of this license document, but changing it is not allowed. diff --git a/readme.md b/readme.md index e946fd9..1fc4ced 100644 --- a/readme.md +++ b/readme.md @@ -1,28 +1,53 @@ -# WP-China-Yes +## 开源 WordPress 中国网站加速器。 + +文派叶子 🍃(WPCY.COM)是中国 WordPress 生态基础设施软件,犹如落叶新芽,生生不息。专为解决困扰了中国互联网数十年的特色问题而存在。此为文派开源(WenPai.org)的一部分。 + + + ## 简介 -一个革命性的插件,从此中国人会拥有针对国内环境专门定制的WordPress,以及一个由中国人主导的社区生态环境 +文派叶子 🍃(WPCY.COM)是一款不可多得的 WordPress 系统底层优化和生态基础设施软件。文派(WordPress)中国本土化项目始于 2019 年,由 文派叶子🍃(WPCY) 插件开启,其前身为 WP-China-Yes。 + +2023 年 4 月,文派科技完成对该项目的收购,并对其进行了全面的品牌重塑。 + + +## 功能 + +- [x] 优化 WordPress 相关服务在中国大陆的访问速度 +- [x] 优化 WordPress 后台加载速度 +- [x] 优化 WordPress 前台加载速度 +- [x] 移除后台无用请求与组件 +- [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] 启用 飞行模式 可屏蔽外部 API 请求 +- [x] 启用 节点监控 可自动切换加速节点 +- [x] 启用 品牌白标 可自定义 OEM 插件品牌 + ## 安装 -如果你期望参与测试,可以直接Clone Master分支中的代码,此处是功能模块基本完整的测试版本。 -若期望用于正式环境请移步[发布列表][1],下载最新稳定版的压缩包后直接访问[http://你的域名/wp-admin/plugin-install.php][2],然后点击页面左上角的“上传插件”,上传安装即可。 +同其他 WordPress 插件一样,**从 Release 页面下载最新版本的插件**(不要直接下载源码!!!),在后台插件管理页面上传并启用即可。 -## 主要特性 -对WordPress核心所依赖的所有官方服务及谷歌字体提供包含中国大陆节点的全球加速支持 +当然,你也可以选择将插件手动上传到`wp-content/plugins`目录下,然后在后台启用。 -为官方仓库的所有插件/主题追加基于机器翻译+人工辅助校准的全量汉化包,插件端支持直接对翻译词条校准并实时生效,校准内容同时也会被上传到wp-china.org用来改善翻译质量 +## 问题反馈 -为官方仓库的所有插件/主题追加中文作品信息显示支持,并支持中文语义化搜索及智能推荐(仍在开发中) +对于 WordPress 相关的问题,可在 [文派支持论坛](https://wenpai.org/support) 提问寻求帮助。 -支持直接选购国内WordPress服务商的优秀作品及服务,享受和官方原版仓库一致的安装/升级体验(仍在开发中) +对于此插件自身问题,可在`Issues`页面提交问题反馈,注意[提问的智慧](https://github.com/ryanhanwu/How-To-Ask-Questions-The-Smart-Way/blob/main/README-zh_CN.md)。 -## 关于繁体中文支持 -目前该项目主要由我一个人开发推进,精力实在有限,暂时不能为繁体中文提供支持,但是未来会尽量覆盖。 -再次声明:现阶段不支持繁体中文无关任何立场问题,单纯就是精力不足,为了项目发展,只能先顾及多数,请一定不要过分解读! +交流QQ群:[1046115671](https://qm.qq.com/q/BATf8KsCje) -[0]: https://wp-china.org +## 赞助商 -[1]: https://github.com/wp-china/wp-china-yes/releases + -[2]: http://你的域名/wp-admin/plugin-install.php +--- + +**Copyright © 2025 · WPCY.COM , All Rights Reserved. 文派 (广州) 科技有限公司;** diff --git a/setting.php b/setting.php deleted file mode 100644 index cc0a812..0000000 --- a/setting.php +++ /dev/null @@ -1,154 +0,0 @@ - - - - -

        - 官方应用市场加速镜像:直接从官方反代并在大陆分发,除了增加对WP-China-Yes插件的更新支持外未做任何更改 -

        -

        - 本土应用市场:与本土翻译平台深度整合,为大家提供基于AI翻译+人工辅助校准的全量作品汉化支持(注意,这仍属于试验阶段,存在可能的接口报错、速度缓慢等问题,问题反馈) -

        - - - -

        - 将WordPress核心所依赖的静态文件切换为公共资源,此选项极大的加快管理后台访问速度 -

        - - - -

        - 为Gravatar头像加速,推荐所有用户启用该选项 -

        - - - -

        - 请只在主题包含谷歌字体的情况下才启用该选项,以免造成不必要的性能损失 -

        - -
        -

        -
        - -
        -
        -

        - WP中国本土化社区的使命是帮助WordPress在中国建立起良好的本土生态环境,以求推进行业整体发展,做大市场蛋糕。
        - 特别感谢知更鸟薇晓朵团队AppNode在项目萌芽期给予的帮助。 -

        - +
        +
        +
        +

        项目简介

        +

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

        +

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

        +

        + +
        +
        +

        赞助支持

        +

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

        + + +
        +
        +
        +
        +

        开发 & 贡献者

        +

        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..f67b80d --- /dev/null +++ b/templates/welcome-section.php @@ -0,0 +1,56 @@ + +
        +
        +
        +

        原生体验

        +

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

        + +
        +
        +

        特色功能

        + +

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

        +
        +
        +
        +
        +

        网站加速

        +

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

        进一步了解 ↗
        +
        +

        翻译推送

        +

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

        本地化改进 ↗
        +
        +

        广告屏蔽

        +

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

        获取广告规则 ↗
        +
        +
        +
        +

        加入我们

        +

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

        +
        + +
        +
        +
        diff --git a/wp-china-yes.php b/wp-china-yes.php old mode 100644 new mode 100755 index 60583f6..c8be84c --- a/wp-china-yes.php +++ b/wp-china-yes.php @@ -1,132 +1,74 @@ 设置'; - array_unshift($links, $settings_link); - - return $links; - }, 10, 2); - - - /** - * 初始化设置项 - */ - if (empty(get_option('wpapi')) || empty(get_option('super_admin')) || empty(get_option('super_gravatar')) || empty(get_option('super_googlefonts'))) { - update_option("wpapi", '2'); - update_option("super_admin", '1'); - update_option("super_gravatar", '1'); - update_option("super_googlefonts", '2'); } - - - /** - * 禁用插件时删除配置 - */ - register_deactivation_hook(__FILE__, function () { - delete_option("wpapi"); - delete_option("super_admin"); - delete_option("super_gravatar"); - delete_option("super_googlefonts"); + + require_once(CHINA_YES_PLUGIN_PATH . 'vendor/autoload.php'); + + // 初始化翻译管理器 + require_once(CHINA_YES_PLUGIN_PATH . 'Service/TranslationManager.php'); + require_once(CHINA_YES_PLUGIN_PATH . 'Service/LazyTranslation.php'); + \WenPai\ChinaYes\Service\TranslationManager::getInstance(); + + // 包含测试文件(仅在开发环境) + if (defined('WP_DEBUG') && WP_DEBUG) { + require_once(CHINA_YES_PLUGIN_PATH . 'test-translation.php'); + } + +} else { + add_action('admin_notices', function() { + echo '

        WPCY.COM: Composer autoloader not found. Please run "composer install".

        '; }); - - - /** - * 菜单注册 - */ - add_action('admin_menu', function () { - add_options_page( - 'WP-China-Yes', - 'WP-China-Yes', - 'manage_options', - 'wp_china_yes', - 'wpcy_options_page_html' - ); - }); - - - /** - * 将WordPress核心所依赖的静态文件访问链接替换为jsDelivr提供的CDN节点 - */ - if (get_option('super_admin') == 1) { - add_action('init', function () { - ob_start(function ($buffer) { - return preg_replace('~'.home_url('/').'(wp-admin|wp-includes)/(css|js)/~', sprintf('https://a2.wp-china-yes.net/WordPress@%s/$1/$2/', $GLOBALS['wp_version']), $buffer); - }); - }); - } + return; } - -if (is_admin()) { - /** - * 替换api.wordpress.org和downloads.wordpress.org为WP-China.org维护的大陆加速节点 - * URL替换代码来自于我爱水煮鱼(http://blog.wpjam.com/)开发的WPJAM Basic插件 - */ - add_filter('pre_http_request', function ($preempt, $r, $url) { - if ((!stristr($url, 'api.wordpress.org') && !stristr($url, 'downloads.wordpress.org')) || get_option('wpapi') == 3) { - return false; - } - if (get_option('wpapi') == 1) { - $url = str_replace('api.wordpress.org', 'api.wp-china-yes.net', $url); - $url = str_replace('downloads.wordpress.org', 'download.wp-china-yes.net', $url); - } else { - $url = str_replace('api.wordpress.org', 'api.w.org.ibadboy.net', $url); - $url = str_replace('downloads.wordpress.org', 'd.w.org.ibadboy.net', $url); - } - - return wp_remote_request($url, $r); - }, 10, 3); -} +// 注册插件激活钩子 +register_activation_hook( CHINA_YES_PLUGIN_FILE, [ Plugin::class, 'activate' ] ); +// 注册插件删除钩子 +register_uninstall_hook( CHINA_YES_PLUGIN_FILE, [ Plugin::class, 'uninstall' ] ); -if (!(defined('DOING_AJAX') && DOING_AJAX)) { - /** - * 替换G家头像为WP-China.org维护的大陆加速节点 - */ - if (get_option('super_gravatar') == 1) { - add_filter('get_avatar', function ($avatar) { - return str_replace([ - 'www.gravatar.com', - '0.gravatar.com', - '1.gravatar.com', - '2.gravatar.com', - 'secure.gravatar.com', - 'cn.gravatar.com' - ], 'gravatar.wp-china-yes.net', $avatar); - }); - } - - - /** - * 替换谷歌字体为WP-China.org维护的大陆加速节点 - */ - if (get_option('super_googlefonts') == 1) { - add_action('init', function () { - ob_start(function ($buffer) { - return str_replace('fonts.googleapis.com', 'googlefonts.wp-china-yes.net', $buffer); - }); - }); - } -} +new Plugin();