Commit inicial - WordPress Análisis de Precios Unitarios

- WordPress core y plugins
- Tema Twenty Twenty-Four configurado
- Plugin allow-unfiltered-html.php simplificado
- .gitignore configurado para excluir wp-config.php y uploads

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude <noreply@anthropic.com>
This commit is contained in:
root
2025-11-03 21:04:30 -06:00
commit a22573bf0b
24068 changed files with 4993111 additions and 0 deletions

View File

@@ -0,0 +1,39 @@
# Thrive Visual Editor
The #1 Landing Page Builder for Deliberate Marketers
## Requirements
* NodeJS - [info here](https://nodejs.org/)
## Before checkout
The folder that you are using for checkout should be called `thrive-visual-editor`.
This is because the folder name should be the same as the plugin main PHP file
## After checkout from git
We use node for installing dependencies in our current project
```bash
npm install
```
We need to make 1 symlink
1. [thrive-dashboard](https://github.com/ThriveThemes/thrive-dashboard) project under `thrive-dashboard` folder name
See `package.json` for running additional scripts
## For developing:
`npm run watch` for developing. This command watches every modification on asset files (*.js, *.scss) and generate the corresponding (*.js..min, *.css) files
For additional details please see `webpack.config.js` file
Make sure you have the following constants in `wp-config.php` file
```
define( 'WP_DEBUG', false );
define( 'TCB_TEMPLATE_DEBUG', true );
define( 'THRIVE_THEME_CLOUD_DEBUG', true );
define( 'TCB_CLOUD_DEBUG', true );
define( 'TL_CLOUD_DEBUG', true );
define( 'TVE_DEBUG', true );`
```

File diff suppressed because one or more lines are too long

View File

@@ -0,0 +1,27 @@
<svg style="position: absolute; width: 0; height: 0; overflow: hidden;" version="1.1" xmlns="http://www.w3.org/2000/svg">
<defs>
<symbol id="icon-move" viewBox="0 0 32 32">
<title>move</title>
<path d="M16 4.8v6.4h-12.8v-6.4h12.8zM17.6 3.2h-16v9.6h16v-9.6z"></path>
<path d="M22.4 8h-1.6v1.6h1.6c3.52 0 6.4 2.88 6.4 6.4s-2.88 6.4-6.4 6.4v1.6c4.48 0 8-3.52 8-8s-3.52-8-8-8z"></path>
<path d="M8 19.2h3.2v1.6h-3.2v-1.6z"></path>
<path d="M16 19.2h-1.6v1.6h1.6v1.6h1.6v-3.2z"></path>
<path d="M1.6 19.2v3.2h1.6v-1.6h1.6v-1.6h-1.6z"></path>
<path d="M8 27.2h3.2v1.6h-3.2v-1.6z"></path>
<path d="M3.2 25.6h-1.6v3.2h3.2v-1.6h-1.6z"></path>
<path d="M16 27.2h-1.6v1.6h3.2v-3.2h-1.6z"></path>
<path d="M19.337 22.731l3.394-3.394 1.131 1.131-3.394 3.394-1.131-1.131z"></path>
<path d="M20.469 22.537l3.394 3.394-1.131 1.131-3.394-3.394 1.131-1.131z"></path>
<path d="M20.8 22.4h1.6v1.6h-1.6v-1.6z"></path>
</symbol>
<symbol id="icon-move-symbol" viewBox="0 0 34 32">
<path d="M28.653 9.143h-14.938c-2.525 0-4.571 2.047-4.571 4.571v4.571c0 2.525 2.047 4.571 4.571 4.571h6.857v2.286h-6.857c-3.787 0-6.857-3.070-6.857-6.857v-4.571c0-3.787 3.070-6.857 6.857-6.857h14.384l-5.241-5.241 1.616-1.616 8.081 8.081-0.196 0.196 0.196 0.196-8.081 8.081-1.616-1.616 5.796-5.796zM18.286 0v2.286h-13.714c-1.262 0-2.286 1.023-2.286 2.286v22.857c0 1.262 1.023 2.286 2.286 2.286h20.571c1.262 0 2.286-1.023 2.286-2.286v-4.571h2.286v4.571c0 2.525-2.047 4.571-4.571 4.571h-20.571c-2.525 0-4.571-2.047-4.571-4.571v-22.857c0-2.525 2.047-4.571 4.571-4.571h13.714z"></path>
</symbol>
<symbol id="icon-duplicate" viewBox="0 0 32 32">
<path d="M13.714 20.571v6.857c0 1.262 1.023 2.286 2.286 2.286h11.429c1.262 0 2.286-1.023 2.286-2.286v-13.714c0-1.262-1.023-2.286-2.286-2.286h-4.571v-2.286h4.571c2.525 0 4.571 2.047 4.571 4.571v13.714c0 2.525-2.047 4.571-4.571 4.571h-11.429c-2.525 0-4.571-2.047-4.571-4.571v-4.571h-6.857c-2.525 0-4.571-2.047-4.571-4.571v-10.286l8-8h8c2.525 0 4.571 2.047 4.571 4.571v4.571h2.286v11.429h-9.143zM13.714 18.286h6.857v-6.857l-6.857 6.857zM18.286 10.286v-5.714c0-1.262-1.023-2.286-2.286-2.286h-6.857l-6.857 6.857v9.143c0 1.262 1.023 2.286 2.286 2.286h6.857v-3.429l6.857-6.857zM9.143 2.286v6.857h-6.857v2.286h9.143v-9.143h-2.286z"></path>
</symbol>
<symbol id="icon-delete" viewBox="0 0 32 32">
<path d="M22.857 6.857h9.143v2.286h-4.571v18.286c0 2.525-2.047 4.571-4.571 4.571h-13.714c-2.525 0-4.571-2.047-4.571-4.571v-18.286h-4.571v-2.286h9.143v-2.286c0-2.525 2.047-4.571 4.571-4.571h4.571c2.525 0 4.571 2.047 4.571 4.571v2.286zM20.571 6.857v-2.286c0-1.262-1.023-2.286-2.286-2.286h-4.571c-1.262 0-2.286 1.023-2.286 2.286v2.286h9.143zM25.143 9.143h-18.286v18.286c0 1.262 1.023 2.286 2.286 2.286h13.714c1.262 0 2.286-1.023 2.286-2.286v-18.286zM11.429 13.714h2.286v11.429h-2.286v-11.429zM18.286 13.714h2.286v11.429h-2.286v-11.429z"></path>
</symbol>
</defs>
</svg>

After

Width:  |  Height:  |  Size: 3.0 KiB

View File

@@ -0,0 +1,456 @@
/* General image grid styles */
.tcb-unsplash-grid {
display: grid;
grid-template-columns: repeat(auto-fill, minmax(250px, 1fr));
grid-gap: 10px;
margin-top: 20px;
margin-right: 40px;
}
.tcb-unsplash-grid-item {
position: relative;
}
.tcb-unsplash-grid-item::before {
content: ""; /* Necessary for creating the pseudo-element */
position: absolute; /* Position it over the image/container */
top: 0;
left: 0;
width: 100%;
height: 100%;
background-color: rgba(0, 0, 0, 0.4); /* Semi-transparent overlay */
opacity: 0; /* Hidden by default */
transition: opacity 0.3s ease; /* Smooth transition effect */
z-index: 1; /* Layer above image */
}
/* Show overlay on hover over the grid item */
.tcb-unsplash-grid-item:hover::before {
opacity: 1; /* Make overlay visible on hover */
}
.tcb-unsplash-image {
width: 100%;
height: 100%;
object-fit: cover;
display: block;
}
/* Image container styling */
.tcb-unsplash-image-container {
opacity: 0; /* Start as invisible */
transition: opacity 0.5s ease-in-out; /* Smooth fade-in */
display: contents;
}
/* Header styling */
.tcb-stock-images {
height: 60px;
background: #f6f7f7;
align-items: center;
padding-left: 40px;
}
.tcb-stock-images h2 {
margin-left: 10px;
color: #000;
}
.tcb-unsplash-header {
display: flex;
align-items: center;
padding: 0 5px 0 10px;
height: 56px;
max-width: 120px;
border-bottom: 4px solid #2B5E92;
}
/* Active menu item styling */
#menu-item-unsplash.active {
background: #f6f7f7;
}
/* Photo count styling */
.tcb-unsplash-total-count {
padding: 10px 29px;
background: #2B5E92;
color: #fff;
border-radius: 30px;
display: flex;
align-items: center;
justify-content: center;
gap: 6px;
max-width: 100px;
height: 10px;
}
/* Search button styling */
#tcb-unsplash-search-btn {
background-color: #2B5E92;
border-top: 1px solid #E2E8EE;
border-right: 1px solid #E2E8EE;
border-bottom: 1px solid #E2E8EE;
border-left: none;
padding: 10.5px;
border-radius: 0 5px 5px 0;
cursor: pointer;
display: flex;
align-items: center;
justify-content: center;
}
#tcb-unsplash-search-btn svg {
fill: #ffffff;
width: 32px;
height: 15px;
}
.tcb-unsplash-search {
display: flex;
align-items: center;
}
#tcb-unsplash-search-input {
height: 38px;
border-radius: 5px 0 0 5px;
border-top: 1px solid #E2E8EE;
border-right: none;
border-bottom: 1px solid #E2E8EE;
border-left: 1px solid #E2E8EE;
width: 160px;
}
/* Top panel styling */
.tcb-unsplash-top {
display: flex;
justify-content: space-between;
align-items: center;
padding-right: 40px;
}
/* Filter styling */
.tcb-unsplash-filters {
display: flex;
margin-top: 20px;
justify-content: space-between;
padding-right: 40px;
font-size: 14px;
}
#tcb-unsplash-category-dropdown {
display: flex;
gap: 10px;
align-items: center;
max-width: 190px;
border: 1px solid #E2E8EE;
}
.tcb-unsplash-category {
display: flex;
gap: 4px;
align-items: center;
}
#tcb-unsplash-category-dropdown:hover {
border: 1px solid #2B5E92;
}
.tcb-unsplash-dropdown-container {
display: flex;
gap: 10px;
align-items: center;
}
.tcb-unsplash-dropdown-container label {
color: #77848F;
}
.tcb-unsplash-filters select {
padding: 0;
border-color: #E2E8EE;
}
/* Button and author block visibility */
.tcb-stock-image-buttons,
.tcb-unsplash-stock-author {
opacity: 0;
z-index: 3;
}
.tcb-unsplash-gear-button {
z-index: 3;
}
.tcb-unsplash-outbound-link {
z-index: 3;
}
.tcb-unsplash-download-button {
z-index: 3;
}
.tcb-unsplash-grid-item:hover .tcb-stock-image-buttons,
.tcb-unsplash-grid-item:hover .tcb-unsplash-stock-author {
opacity: 1;
}
/* Download and gear button positions */
.tcb-unsplash-download-button,
.tcb-unsplash-gear-button {
display: flex; /* Use flexbox for alignment */
align-items: center; /* Vertically center content */
justify-content: center;
position: absolute;
border: none;
cursor: pointer;
transition: background 0.3s;
}
.tcb-unsplash-download-button {
padding: 10px;
background: #2B5E92;
bottom: 10px;
right: 10px;
border-radius: 10%;
}
.tcb-unsplash-gear-button,
.tcb-unsplash-outbound-link {
padding: 5px;
background: #fff;
border-radius: 50%;
}
.tcb-unsplash-gear-button {
top: 10px;
right: 10px;
}
/* Add styles for the outbound link button */
.tcb-unsplash-outbound-link {
position: absolute;
top: 10px;
right: 40px; /* Adjust this to place it next to the gear button */
border: none;
cursor: pointer;
transition: background 0.3s;
}
.tcb-unsplash-download-button svg {
width: 24px;
height: 24px;
}
.tcb-unsplash-gear-button svg,
.tcb-unsplash-outbound-link svg {
width: 14px;
height: 14px;
display: block;
}
/* Author block styling */
.tcb-unsplash-stock-author {
position: absolute;
bottom: 10px;
left: 10px;
display: flex;
align-items: center;
gap: 8px;
padding: 5px;
border-radius: 5px;
}
.tcb-author-image {
border-radius: 50%;
width: 32px;
height: 32px;
}
.tcb-unsplash-stock-author a {
color: #ffffff;
text-decoration: none;
}
.tcb-unsplash-stock-author a:hover,
.tcb-unsplash-stock-author a:focus,
.tcb-unsplash-stock-author a:visited {
text-decoration: underline;
color: #fff;
}
/* Modal styling */
.tcb-unsplash-grid .close-button:hover,
.tcb-unsplash-grid .close-button:focus {
color: #000;
text-decoration: none;
cursor: pointer;
}
/* Loader styles */
#tcb-unsplash-loader img {
margin-top: 50px;
width: 20px;
height: 20px;
}
/* Dropdown styling */
#tcb-unsplash-order-dropdown:hover,
#tcb-unsplash-ordination-dropdown:hover {
border: 1px solid #2B5E92;
}
#tcb-unsplash-order-dropdown,
#tcb-unsplash-ordination-dropdown {
min-width: 120px;
}
#tcb-unsplash-order,
.tcb-unsplash-ordination {
display: flex;
align-items: center;
gap: 4px;
}
/* Form Styles */
.unsplash-gear-popup {
position: absolute;
background: rgba(255, 255, 255, 1);
border: 1px solid #ccc;
border-radius: 4px;
box-shadow: 0px 4px 10px rgba(0, 0, 0, 0.1);
z-index: 1000;
display: flex;
flex-direction: column;
align-items: center;
justify-content: flex-start;
padding: 10px;
box-sizing: border-box;
overflow-y: auto;
overflow-x: hidden;
}
.tcb-stock-library-form {
display: flex;
flex-direction: column;
align-items: center;
width: 100%;
max-height: 100%;
color: #000;
}
.tcb-stock-library-form label {
font-size: 15px;
line-height: 1;
width: 100%;
margin-bottom: 4px; /* Ensure labels have spacing */
}
.tcb-stock-library-form input[type="text"],
.tcb-stock-library-form textarea {
font-size: 14px;
width: 100%; /* Ensure all inputs take full width of the parent */
padding: 5px;
margin-bottom: 10px; /* Ensure uniformity in spacing */
box-sizing: border-box;
color: #77848F;
}
.tcb-stock-library-form textarea {
height: 60px;
}
.tcb-unsplash-grid button.upload,
.tcb-unsplash-grid button.cancel {
font-size: 12px;
padding: 5px 17px;
cursor: pointer;
border-radius: 4px;
border: 1px solid #2B5E92;
}
.tcb-unsplash-grid button.upload {
background-color: #2B5E92;
color: #fff;
}
.tcb-unsplash-grid button.cancel {
background-color: #F6F7F7;
color: #2B5E92;
}
.tcb-unsplash-grid .button-container {
display: flex;
justify-content: space-between; /* Align buttons to the left and right */
width: 100%;
padding-bottom: 10px;
}
.tcb-stock-library-form-field {
width: 100%;
}
#tcb-unsplash-clear-search-btn {
background: none;
border: none;
position: absolute;
margin-left: 140px;
cursor: pointer;
font-size: 16px;
}
input#tcb-unsplash-search-input:focus {
box-shadow: inset 0 0 0 1px #2B5E92;
}
/* Loader container */
#tcb-unsplash-loading-container {
pointer-events: none; /* Allow clicks to pass through */
position: absolute; /* Position the loading container absolutely */
top: 0; /* Align it to the top */
left: 0; /* Align it to the left */
width: 100%; /* Cover the full width of the parent */
height: 100%; /* Cover the full height of the parent */
z-index: 9999; /* Ensure it's on top visually */
display: flex; /* Use flexbox for alignment */
justify-content: center; /* Center horizontally */
align-items: center; /* Center vertically */
}
.tcb-unsplash-grid .loading-background {
width: 74px; /* Fixed width */
height: 74px; /* Fixed height */
background-color: white; /* Background color */
display: flex; /* Flexbox for centering */
justify-content: center; /* Center contents horizontally */
align-items: center; /* Center contents vertically */
border-radius: 3px; /* Optional: rounded corners */
box-shadow: 0 0 5px rgba(0, 0, 0, 0.2); /* Optional: shadow for depth */
display: none;
border-radius: 15px;
}
.tcb-unsplash-grid .loading-background svg {
display: flex;
justify-content: center;
align-items: center;
}
.tcb-unsplash-grid .spin-svg {
animation: spin 2s linear infinite; /* Spinning */
z-index: 9999; /* Ensure it's on top visually */
}
/* Ordination container */
#tcb-unsplash-ordination {
position: absolute;
top: 0;
left: 0;
width: 100%;
height: 100%;
display: flex;
align-items: center;
justify-content: center;
z-index: 10;
display: none; /* Initially hidden */
}

File diff suppressed because one or more lines are too long

Binary file not shown.

After

Width:  |  Height:  |  Size: 23 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 24 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 33 KiB

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

View File

@@ -0,0 +1,424 @@
<?php
/**
* Created by PhpStorm.
* User: Ovidiu
* Date: 3/3/2017
* Time: 1:11 PM
*/
if ( ! defined( 'ABSPATH' ) ) {
exit; // Silence is golden.
}
/**
* Thrive Architect admin class.
*/
class TCB_Admin {
/**
* Define namespace for the rest endpoints
*/
const TCB_REST_NAMESPACE = 'tcb/v1';
/**
* The single instance of the class.
*
* @var TCB_Admin singleton instance.
*/
protected static $_instance = null;
public function __construct() {
add_action( 'init', [ $this, 'includes' ] );
add_filter( 'tve_dash_admin_product_menu', [ $this, 'add_to_dashboard_menu' ] );
/**
* Add admin scripts and styles
*/
add_action( 'admin_enqueue_scripts', [ $this, 'enqueue_scripts' ] );
add_filter( 'tve_dash_features', [ $this, 'dashboard_add_features' ] );
add_action( 'admin_footer', [ $this, 'admin_page_loader' ] );
/* admin TCB edit button */
add_action( 'edit_form_after_title', [ $this, 'admin_edit_button' ] );
add_action( 'admin_footer', [ $this, 'tcb_architect_gutenberg_switch' ] );
add_filter( 'admin_body_class', [ $this, 'wp_editor_body_class' ], 10, 4 );
add_action( 'save_post', [ $this, 'maybe_disable_tcb_editor' ] );
}
/**
* Main TCB Admin Instance.
* Ensures only one instance of TCB Admin is loaded or can be loaded.
*
* @return TCB_Admin
*/
public static function instance() {
if ( empty( self::$_instance ) ) {
self::$_instance = new self();
}
return self::$_instance;
}
/**
* Includes required files
*/
public function includes() {
require_once 'includes/tcb-admin-functions.php';
require_once 'includes/class-tcb-admin-ajax.php';
}
/**
* Push the Thrive Quiz Builder to Thrive Dashboard menu
*
* @param array $menus items already in Thrive Dashboard.
*
* @return array
*/
public function add_to_dashboard_menu( $menus = [] ) {
$cap = tcb_has_external_cap( true );
if ( $cap ) {
$menus['tcb'] = array(
'parent_slug' => '',
'page_title' => __( 'Content Templates', 'thrive-cb' ),
'menu_title' => __( 'Content Templates', 'thrive-cb' ),
'capability' => $cap,
'menu_slug' => 'tcb_admin_dashboard',
'function' => [ $this, 'dashboard' ],
);
}
return $menus;
}
/**
* Output TCB Admin dashboard
*/
public function dashboard() {
include $this->admin_path( 'includes/views/dashboard.phtml' );
}
public function enqueue_scripts( $hook ) {
$accepted_hooks = apply_filters( 'tcb_admin_accepted_admin_pages', [
'thrive-dashboard_page_tcb_admin_dashboard', // Visible in Thrive Dashboard side menu
'admin_page_tcb_admin_dashboard', // Not visible in Thrive Dashboard side menu
] );
/* if classic editor plugin is activated ( `should_load_blocks()` => false ), load styles on post.php and post-new.php */
$should_load = tve_should_load_blocks() || $hook === 'post.php' || $hook === 'post-new.php';
if ( $should_load && tve_is_post_type_editable( get_post_type( get_the_ID() ) ) ) {
$this->enqueue_post_editor();
return;
}
if ( ! in_array( $hook, $accepted_hooks, true ) ) {
return;
}
if ( tve_in_architect() && ! tve_tcb__license_activated() ) {
return;
}
$js_suffix = TCB_Utils::get_js_suffix();
/**
* Enqueue dash scripts
*/
tve_dash_enqueue();
/**
* Specific admin styles
*/
tve_enqueue_style( 'tcb-admin-style', $this->admin_url( 'assets/css/tcb-admin-styles.css' ) );
tve_enqueue_script( 'tcb-admin-js', $this->admin_url( 'assets/js/tcb-admin' . $js_suffix ), [
'jquery',
'backbone',
] );
wp_localize_script( 'tcb-admin-js', 'TVE_Admin', tcb_admin_get_localization() );
/**
* Output the main templates for backbone views used in dashboard.
*/
add_action( 'admin_print_footer_scripts', [ $this, 'render_backbone_templates' ] );
}
/**
* make sure all the features required by TCB are shown in the dashboard
*
* @param array $features
*
* @return array
*/
public function dashboard_add_features( $features ) {
if ( tcb_has_external_cap() ) {
$features['smart_site'] = true;
$features['font_manager'] = true;
$features['icon_manager'] = true;
$features['api_connections'] = true;
$features['general_settings'] = true;
$features['notification_manager'] = true;
}
return $features;
}
/**
* Render backbone templates
*/
public function render_backbone_templates() {
$templates = tve_dash_get_backbone_templates( $this->admin_path( 'includes/views/templates' ), 'templates' );
tve_dash_output_backbone_templates( $templates );
}
/**
* Full admin path to file if specified
*
* @param string $file to be appended to the plugin path.
*
* @return string
*/
public function admin_path( $file = '' ) {
return plugin_dir_path( __FILE__ ) . ltrim( $file, '\\/' );
}
/**
* Full plugin url to file if specified
*
* @param string $file to be appended to the plugin url.
*
* @return string
*/
public function admin_url( $file = '' ) {
return tve_editor_url( 'admin' ) . '/' . ltrim( $file, '\\/' );
}
/**
* Enqueue and localize scripts on the admin post edit page.
*/
public function enqueue_post_editor() {
$js_suffix = TCB_Utils::get_js_suffix();
$post_id = get_the_ID();
wp_enqueue_style( 'wp-pointer' );
wp_enqueue_script( 'wp-pointer' );
tve_enqueue_script( 'tcb-admin-edit-post', tve_editor_js( '/admin' . $js_suffix ) );
wp_localize_script( 'tcb-admin-edit-post', 'TCB_Post_Edit_Data', array_merge( tcb_admin_get_localization(), array(
'post_id' => $post_id,
'post_format' => get_post_format( $post_id ),
'landing_page' => tve_post_is_landing_page(),
) ) );
tve_enqueue_style( 'tcb-admin-style', $this->admin_url( 'assets/css/tcb-admin-styles.css' ) );
}
/**
* Include the HTML for a loading overlay on admin pages.
*/
public function admin_page_loader() {
tcb_template( 'admin/page-loader' );
}
/**
* output TCB editor button in the admin area
*/
public function admin_edit_button() {
$post_type = get_post_type();
$post_id = get_the_ID();
$page_for_posts = get_option( 'page_for_posts' );
if ( ! tve_is_post_type_editable( $post_type ) || ! TCB_Product::has_post_access( $post_id ) ) {
return;
}
if ( 'page' === $post_type && $page_for_posts && $post_id == $page_for_posts ) {
tcb_template( 'admin/cannot-edit-blog-page' );
return;
}
$url = tcb_get_editor_url( get_the_ID() );
$post_id = get_the_ID();
$post = get_post( $post_id );
$landing_page = tve_post_is_landing_page( $post_id );
$wp_content = $post->post_content;
/* this means that this post has been saved with TCB at least once */
$tcb_content = tve_get_post_meta( $post_id, 'tve_globals' );
$show_migrate_button = false;
if ( ! $landing_page && ! get_post_meta( $post_id, 'tcb2_ready', true ) ) {
$show_migrate_button = true;
/**
* If this meta does not exist, there are a couple of possible cases:
* 1) post is just being created - no TCB content and no WP content
* 2) no WordPress content, but with TCB content
* 3) WordPress content, but no TCB content - this means the user never saved the post with TCB
*/
if ( empty( $wp_content ) || empty( $tcb_content ) ) {
$show_migrate_button = false;
}
}
tcb_template( 'admin/post-edit-button', array(
'edit_url' => $url,
'post_id' => $post_id,
'show_migrate_button' => $show_migrate_button,
'landing_page' => $landing_page,
'tcb_enabled' => ! $show_migrate_button && $this->tcb_enabled( $post_id ),
'nonce' => wp_create_nonce( 'tcb_revert_content' ),
) );
}
/**
* output TCB editor button in the gutenberg edit page/post admin area
*/
public function tcb_architect_gutenberg_switch() {
$post_id = get_the_ID();
/** prevent to appear if TAR is not active or if the user does not have access*/
if ( apply_filters( 'tcb_gutenberg_switch', ! tve_in_architect() || ! TCB_Product::has_post_access( $post_id ) ) ) {
return false;
}
if ( 'post' !== tve_get_current_screen_key( 'base' ) ) {
return false;
}
$url = tcb_get_editor_url( $post_id );
$post = get_post( $post_id );
$landing_page = tve_post_is_landing_page( $post_id );
$wp_content = $post->post_content;
/* this means that this post has been saved with TCB at least once */
$tcb_content = tve_get_post_meta( $post_id, 'tve_globals' );
$show_migrate_button = false;
if ( ! $landing_page && ! get_post_meta( $post_id, 'tcb2_ready', true ) ) {
$show_migrate_button = true;
/**
* If this meta does not exist, there are a couple of possible cases:
* 1) post is just being created - no TCB content and no WP content
* 2) no WordPress content, but with TCB content
* 3) WordPress content, but no TCB content - this means the user never saved the post with TCB
*/
if ( empty( $wp_content ) || empty( $tcb_content ) ) {
$show_migrate_button = false;
}
}
echo '<script id="thrive-gutenberg-switch" type="text/html">';
tcb_template( 'admin/post-edit-button', array(
'edit_url' => $url,
'post_id' => $post_id,
'show_migrate_button' => $show_migrate_button,
'landing_page' => $landing_page,
'tcb_enabled' => ! $show_migrate_button && $this->tcb_enabled( $post_id ),
'nonce' => wp_create_nonce( 'tcb_revert_content' ),
) );
echo '</script>';
$js_suffix = TCB_Utils::get_js_suffix();
tve_enqueue_script( 'thrive-gutenberg-switch', tve_editor_js( '/gutenberg' . $js_suffix ), [ 'jquery' ] );
}
/**
* For pages where TCB was enabled, add a class to the body in order to hide the default WP tinymce editor for the content
*
* @param string $classes
*
* @return string
*/
public function wp_editor_body_class( $classes ) {
if ( 'post' !== tve_get_current_screen_key( 'base' ) ) {
return $classes;
}
$post_type = get_post_type();
$post_id = get_the_ID();
if ( empty( $post_id ) || empty( $post_type ) ) {
return $classes;
}
if ( ! tve_is_post_type_editable( $post_type ) || ! TCB_Product::has_post_access( $post_id ) ) {
return $classes;
}
$post = tcb_post( $post_id );
$post->maybe_auto_migrate();
if ( $post->editor_enabled() ) {
$classes .= ' tcb-hide-wp-editor';
}
return $classes;
}
/**
* Check to see if a "disable_tcb_editor" input has been submitted - if yes, we disable the tcb editor for this post, and show the default WP content.
*/
public function maybe_disable_tcb_editor() {
global $post;
$tcb_post = tcb_post( $post );
if ( ! empty( $_POST['tcb_disable_editor'] ) && wp_verify_nonce( sanitize_text_field( $_POST['tcb_disable_editor'] ), 'tcb_disable_editor' ) ) {
$tcb_post->disable_editor();
}
}
/**
* Return complete url for route endpoint
*
* @param string $endpoint Rest endpoint.
* @param int $id Specific endpoint.
* @param array $args Additional arguments.
*
* @return string
*/
public function tcm_get_route_url( $endpoint, $id = 0, $args = [] ) {
$url = get_rest_url() . self::TCB_REST_NAMESPACE . '/' . $endpoint;
if ( ! empty( $id ) && is_numeric( $id ) ) {
$url .= '/' . $id;
}
if ( ! empty( $args ) ) {
add_query_arg( $args, $url );
}
return $url;
}
/**
* @param $post_id
*
* @return bool
*/
public function tcb_enabled( $post_id ) {
$editor_enabled = get_post_meta( $post_id, 'tcb_editor_enabled', true );
$editor_disabled = get_post_meta( $post_id, 'tcb_editor_disabled', true );
return ! empty( $editor_enabled ) && empty( $editor_disabled );
}
}
/**
* @return TCB_Admin
*/
function tcb_admin() {
return TCB_Admin::instance();
}
tcb_admin();

View File

@@ -0,0 +1,404 @@
<?php
/**
* Created by PhpStorm.
* User: Ovidiu
* Date: 3/6/2017
* Time: 1:58 PM
*/
if ( ! defined( 'ABSPATH' ) ) {
exit; // Silence is golden
}
class TCB_Admin_Ajax {
const ACTION = 'tcb_admin_ajax_controller';
const NONCE = 'tcb_admin_ajax_request';
/**
* Init the object, during the AJAX request. Adds ajax handlers and verifies nonces
*/
public function init() {
add_action( 'wp_ajax_' . self::ACTION, [ $this, 'handle' ] );
}
/**
* Sets the request's header with server protocol and status
* Sets the request's body with specified $message
*
* @param string $message the error message.
* @param string $status the error status.
*/
protected function error( $message, $status = '404 Not Found' ) {
header( $_SERVER['SERVER_PROTOCOL'] . ' ' . $status ); //phpcs:ignore
echo esc_attr( $message );
wp_die();
}
/**
* Returns the params from $_POST or $_REQUEST
*
* @param int $key the parameter kew.
* @param null $default the default value.
*
* @return mixed|null|$default
*/
protected function param( $key, $default = null ) {
return isset( $_POST[ $key ] ) ? map_deep( $_POST[ $key ], 'sanitize_text_field' ) : ( isset( $_REQUEST[ $key ] ) ? map_deep( $_REQUEST[ $key ], 'sanitize_text_field' ) : $default );
}
/**
* Entry-point for each ajax request
* This should dispatch the request to the appropriate method based on the "route" parameter
*
* @return array|object
*/
public function handle() {
if ( ! check_ajax_referer( self::NONCE, '_nonce', false ) ) {
$this->error( sprintf( __( 'Invalid request.', 'thrive-cb' ) ) );
}
$route = $this->param( 'route' );
$route = preg_replace( '#([^a-zA-Z0-9-_])#', '', $route );
$method_name = $route . '_action';
if ( ! method_exists( $this, $method_name ) ) {
$this->error( sprintf( __( 'Method %s not implemented', 'thrive-cb' ), $method_name ) );
}
wp_send_json( $this->{$method_name}() );
}
/**
* Returns the templates grouped by category.
*
* Retrieves the templates and categories
*
* //todo transform into a rest route
* //todo return separately, not grouped, and do the rest in JS ( skip the complex processing logic )
*
* @return array
*/
public function templates_fetch_action() {
$templates_grouped_by_categories = [];
$method = empty( $_SERVER['HTTP_X_HTTP_METHOD_OVERRIDE'] ) ? 'GET' : sanitize_text_field( $_SERVER['HTTP_X_HTTP_METHOD_OVERRIDE'] );
switch ( $method ) {
case 'GET':
$templates = TCB\UserTemplates\Template::localize();
$templates = array_map( static function ( $template ) {
$template['name'] = $template['label'];
unset( $template['label'] );
return $template;
}, $templates );
$templates = array_reverse( $templates );
if ( $search = $this->param( 'search' ) ) {
$templates = tcb_filter_templates( $templates, $search );
}
$categories = TCB\UserTemplates\Category::get_all();
/* todo: this next section has to be refactored (see function comments), for now it has to stay like this in order to avoid having to rewrite the JS */
$templates_for_category = tcb_admin_get_category_templates( $templates );
foreach ( $categories as $category ) {
/* @var \TCB\UserTemplates\Category */
$category_instance = \TCB\UserTemplates\Category::get_instance_with_id( $category['id'] );
if ( empty( $category_instance->get_meta( 'type' ) ) ) {
$templates_grouped_by_categories[] = [
'id' => $category['id'],
'name' => $category['name'],
'tpl' => empty( $templates_for_category[ $category['id'] ] ) ? [] : $templates_for_category[ $category['id'] ],
];
}
}
$templates_grouped_by_categories[] = [
'id' => 'uncategorized',
'name' => __( 'Uncategorized templates', 'thrive-cb' ),
'tpl' => empty( $templates_for_category['uncategorized'] ) ? [] : $templates_for_category['uncategorized'],
];
$page_template_identifier = \TCB\UserTemplates\Category::PAGE_TEMPLATE_IDENTIFIER;
$templates_grouped_by_categories[] = [
'id' => $page_template_identifier,
'name' => __( 'Page Templates', 'thrive-cb' ),
'tpl' => empty( $templates_for_category[ $page_template_identifier ] ) ? [] : $templates_for_category[ $page_template_identifier ],
];
break;
case 'POST':
case 'PUT':
case 'PATCH':
case 'DELETE':
$this->error( __( 'Invalid call', 'thrive-cb' ) );
break;
default:
break;
}
return $templates_grouped_by_categories;
}
/**
* Category rename and category delete
*
* //todo transform into a rest route
*
* @return array
*/
public function template_category_model_action() {
$model = json_decode( file_get_contents( 'php://input' ), true );
$method = empty( $_SERVER['HTTP_X_HTTP_METHOD_OVERRIDE'] ) ? 'GET' : sanitize_text_field( $_SERVER['HTTP_X_HTTP_METHOD_OVERRIDE'] );
$response = [];
switch ( $method ) {
case 'POST':
case 'PUT':
case 'PATCH':
$categories = TCB\UserTemplates\Category::get_all();
if ( empty( $categories ) ) {
$this->error( __( 'The template category list is empty!', 'thrive-cb' ) );
break;
}
if ( ! is_numeric( $model['id'] ) || empty( $model['name'] ) ) {
$this->error( __( 'Invalid parameters', 'thrive-cb' ) );
break;
}
/* @var TCB\UserTemplates\Category $category_instance */
$category_instance = TCB\UserTemplates\Category::get_instance_with_id( $model['id'] );
$category_instance->rename( $model['name'] );
$response = [
'text' => __( 'The category name was modified!', 'thrive-cb' ),
];
break;
case 'DELETE':
$id = $this->param( 'id', '' );
if ( ! is_numeric( $id ) ) {
$this->error( __( 'Undefined parameter: id', 'thrive-cb' ) );
break;
}
$templates = TCB\UserTemplates\Template::get_all();
// Move existing templates belonging to the deleted category to uncategorized
$templates_grouped_by_category = tcb_admin_get_category_templates( $templates );
if ( ! empty( $templates_grouped_by_category[ $id ] ) ) {
foreach ( $templates_grouped_by_category[ $id ] as $template ) {
if ( isset( $template['id_category'] ) && (int) $template['id_category'] === (int) $id ) {
/* @var \TCB\UserTemplates\Template $template_instance */
$template_instance = TCB\UserTemplates\Template::get_instance_with_id( $template['id'] );
if ( empty( $_POST['extra_setting_check'] ) ) {
$template_instance->update( [ 'id_category' => '' ] );
} else {
$template_instance->delete();
}
}
}
}
/* @var TCB\UserTemplates\Category $category_instance */
$category_instance = TCB\UserTemplates\Category::get_instance_with_id( $id );
$category_instance->delete();
$response = [
'text' => __( 'The category was deleted!', 'thrive-cb' ),
];
break;
case 'GET':
$this->error( __( 'Invalid call', 'thrive-cb' ) );
break;
default:
break;
}
return $response;
}
/**
* Template Category action callback
*
* Strictly for adding new categories
* //todo transform into a rest route
*
* @return array
*/
public function template_category_action() {
$model = json_decode( file_get_contents( 'php://input' ), true );
$method = empty( $_SERVER['HTTP_X_HTTP_METHOD_OVERRIDE'] ) ? 'GET' : sanitize_text_field( $_SERVER['HTTP_X_HTTP_METHOD_OVERRIDE'] );
$response = [];
switch ( $method ) {
case 'POST':
case 'PUT':
case 'PATCH':
if ( empty( $model['category'] ) ) {
$this->error( __( 'Category parameter could not be found!', 'thrive-cb' ) );
break;
}
/* multiple categories can be saved at the same time....for some reason */
foreach ( $model['category'] as $category ) {
TCB\UserTemplates\Category::add( $category );
}
$response = [
'text' => __( 'The category was saved!', 'thrive-cb' ),
];
break;
case 'DELETE':
case 'GET':
$this->error( __( 'Invalid call', 'thrive-cb' ) );
break;
default:
break;
}
return $response;
}
/**
* Template update - name and category
* Template delete
* Template preview
*
* //todo change to rest routes
*
* @return array
*/
public function template_action() {
$model = json_decode( file_get_contents( 'php://input' ), true );
$method = empty( $_SERVER['HTTP_X_HTTP_METHOD_OVERRIDE'] ) ? 'GET' : sanitize_text_field( $_SERVER['HTTP_X_HTTP_METHOD_OVERRIDE'] );
$response = [];
switch ( $method ) {
case 'POST':
case 'PUT':
case 'PATCH':
if ( empty( $model['id'] ) || empty( $model['name'] ) ) {
$this->error( __( 'Invalid parameters', 'thrive-cb' ) );
break;
}
$data_to_update = [
'name' => $model['name'],
];
if ( isset( $model['id_category'] ) ) {
$data_to_update['id_category'] = $model['id_category'];
}
/* @var \TCB\UserTemplates\Template $template_instance */
$template_instance = \TCB\UserTemplates\Template::get_instance_with_id( $model['id'] );
$template_instance->update( $data_to_update );
$response = [ 'text' => __( 'The template saved!', 'thrive-cb' ) ];
break;
case 'DELETE':
$id = $this->param( 'id', '' );
/* @var \TCB\UserTemplates\Template $template_instance */
$template_instance = \TCB\UserTemplates\Template::get_instance_with_id( $id );
$template_instance->delete();
$response = [ 'text' => __( 'The template was deleted!', 'thrive-cb' ) ];
break;
/* template preview */
case 'GET':
$id = $this->param( 'id', '' );
if ( ! is_numeric( $id ) ) {
$this->error( __( 'Undefined parameter: id', 'thrive-cb' ) );
break;
}
/* @var \TCB\UserTemplates\Template $template_instance */
$template_instance = \TCB\UserTemplates\Template::get_instance_with_id( $id );
$response = $template_instance->get();
if ( empty( $response['thumb'] ) ) {
$response['thumb'] = [
'url' => '',
'w' => '',
'h' => '',
];
}
if ( empty( $response['thumb']['url'] ) ) {
$response['thumb']['url'] = TCB_Utils::get_placeholder_url();
}
break;
default:
break;
}
return $response;
}
/**
* upgrade the post_meta key for a post marking it as "migrated" to TCB2.0
* Takes care of 2 things:
* appends wordpress content at the end of tcb content, saves that into the TCB content
* and
* updates the post_content field to a text and images version of all the content
*/
public function migrate_post_content_action() {
$post_id = $this->param( 'post_id' );
$post = tcb_post( $post_id );
$post->migrate();
return [ 'success' => true ];
}
/**
* Enables the TCB-only editor for a post
*/
public function enable_tcb_action() {
tcb_post( $this->param( 'post_id' ) )->enable_editor();
return [ 'success' => true ];
}
/**
* Disable the TCB-only editor for a post
*/
public function disable_tcb_action() {
tcb_post( $this->param( 'post_id' ) )->disable_editor();
return [ 'success' => true ];
}
/**
* Change post status created by Gutenberg so Architect can open it
*/
public function change_post_status_gutenberg_action() {
if ( get_post_status( $this->param( 'post_id' ) ) === 'auto-draft' ) {
$post = array(
'ID' => $this->param( 'post_id' ),
'post_status' => 'draft',
);
wp_update_post( $post );
}
return [ 'success' => true ];
}
}
$tcb_admin_ajax = new TCB_Admin_Ajax();
$tcb_admin_ajax->init();

View File

@@ -0,0 +1,140 @@
<?php
/**
* Created by PhpStorm.
* User: Danut
* Date: 12/9/2015
* Time: 12:21 PM
*/
class TCB_Product extends TVE_Dash_Product_Abstract {
protected $tag = 'tcb';
protected $version = TVE_VERSION;
protected $slug = 'thrive-visual-editor';
protected $title = 'Thrive Architect';
protected $productIds = [];
protected $type = 'plugin';
protected $needs_architect = true;
/**
* Whether or not the current user can open the architect editor based on the current request
* e.g.
* editing a TL form and having TL access
* etc
*
* @param int $post_id if want to check if the current user can edit the current post
*
* @return bool
*/
public static function has_external_access( $post_id = null ) {
$has_external_access = true;
if ( $post_id ) {
$has_external_access = current_user_can( 'edit_post', $post_id );
if ( $has_external_access && isset( $_REQUEST['tar_editor_page'] ) && (int) $_REQUEST['tar_editor_page'] === 1 ) {
/* other plugins ( TL, TA, TU ) check post-related info on the 'tcb_user_has_plugin_edit_cap' hook, so we should setup the global post for them */
global $post;
$post = get_post( $post_id );
setup_postdata( $post );
}
}
/**
* If Architect and plugin or just the plugin can't be used the post isn't available to edit
*/
return $has_external_access && apply_filters( 'tcb_user_has_plugin_edit_cap', static::has_access() );
}
/**
* Whether or not the current user can edit current post and has TAr access
*
* @param int $post_id current post id
*
* @return bool has access or not
*/
public static function has_post_access( $post_id ) {
return current_user_can( 'edit_post', $post_id ) && apply_filters( 'tcb_user_has_post_access', static::has_access() );
}
public function __construct( $data = [] ) {
parent::__construct( $data );
$this->logoUrl = tve_editor_css( 'images/thrive-architect-logo.png' );
$this->logoUrlWhite = tve_editor_css( 'images/thrive-architect-logo-white.png' );
$this->description = __( 'Create beautiful content & conversion optimized landing pages.', 'thrive-cb' );
$this->button = array(
'label' => __( 'View Video Tutorial', 'thrive-cb' ),
'data-source' => 'NgZO13Am6XA',
'active' => true,
'classes' => 'tvd-open-video',
);
$this->moreLinks = array(
'tutorials' => array(
'class' => 'tve-leads-tutorials',
'icon_class' => 'tvd-icon-graduation-cap',
'href' => 'https://thrivethemes.com/thrive-architect-tutorials/',
'target' => '_blank',
'text' => __( 'Tutorials', 'thrive-cb' ),
),
'support' => array(
'class' => 'tve-leads-tutorials',
'icon_class' => 'tvd-icon-life-bouy',
'href' => 'https://thrivethemes.com/support/',
'target' => '_blank',
'text' => __( 'Support', 'thrive-cb' ),
),
);
}
/**
* Reset all TCB data
*
* @return bool|void
*/
public static function reset_plugin() {
$query = new WP_Query( array(
'post_type' => array(
'tcb_lightbox',
TCB_CT_POST_TYPE,
TCB_Symbols_Post_Type::SYMBOL_POST_TYPE,
\TCB\inc\helpers\FormSettings::POST_TYPE,
\TCB\UserTemplates\Template::get_post_type_name(),
\TCB\SavedLandingPages\Saved_Lp::get_post_type_name(),
),
'fields' => 'ids',
'posts_per_page' => '-1',
)
);
$post_ids = $query->posts;
foreach ( $post_ids as $id ) {
wp_delete_post( $id, true );
}
$options = [
'tve_display_save_notification',
'tve_social_fb_app_id',
'tve_comments_disqus_shortname',
'tve_comments_facebook_admins',
'tve_fa_kit',
TCB\UserTemplates\Template::OPTION_KEY,
];
foreach ( $options as $option ) {
delete_option( $option );
}
delete_user_option( get_current_user_id(), 'tcb_pinned_elements' );
}
}

View File

@@ -0,0 +1,260 @@
<?php
/**
* Class TCB_Stock_Library
*
* Handles the stock image library functionality.
*/
class TCB_Stock_Library {
/**
* TCB_Stock_Library constructor.
* Sets up action hooks.
*/
public function __construct() {
// Use higher priority (5) to ensure Thrive loads before Optimole (default 10)
add_action( 'wp_enqueue_media', array( $this, 'enqueue_scripts' ), 5 );
add_action( 'wp_ajax_unsplash_list', array( $this, 'unsplash_list_callback' ) );
add_action( 'wp_ajax_unsplash_download_image', array( $this, 'unsplash_download_image_callback' ) );
add_action( 'wp_ajax_nopriv_unsplash_download_image', array( $this, 'unsplash_download_image_callback' ) );
}
/**
* Enqueue necessary scripts and styles for the stock image library.
*/
public function enqueue_scripts() {
// Only block Optimole when we're in the TAR editor context
if ( $this->is_tar_editor_context() ) {
$this->block_optimole_media_script();
}
$js_suffix = TCB_Utils::get_js_suffix();
tve_enqueue_script( 'unsplash_media_tab_js', tcb_admin()->admin_url( 'assets/js/stock-library' . $js_suffix), array( 'jquery' ), TVE_VERSION, false );
tve_enqueue_style( 'tcb-admin-stock-images', tcb_admin()->admin_url( 'assets/css/tcb-admin-stock-images.css' ), array(), TVE_VERSION, false );
$nonce = wp_create_nonce( 'unsplash_api_nonce' );
wp_localize_script(
'unsplash_media_tab_js',
'unsplashApi',
array(
'ajax_url' => admin_url( 'admin-ajax.php' ),
'nonce' => $nonce,
)
);
}
/**
* Check if we're in the TAR (Thrive Architect) editor context.
*
* @return bool True if we're in the TAR editor context, false otherwise.
*/
private function is_tar_editor_context() {
// Check for the main TAR editor flag (covers most cases)
if ( defined( 'TVE_EDITOR_FLAG' ) && ! empty( $_GET[ TVE_EDITOR_FLAG ] ) ) {
return true;
}
// Check for TAR editor page parameter (covers AJAX requests)
if ( ! empty( $_REQUEST['tar_editor_page'] ) ) {
return true;
}
return false;
}
/**
* Block Optimole's media modal script to prevent conflicts with Thrive's stock library.
*/
private function block_optimole_media_script() {
// Check if Optimole is active and has the DAM class
if ( ! class_exists( 'Optml_Dam' ) ) {
return;
}
// Get the Optimole DAM instance
$optml_dam_instance = null;
if ( class_exists( 'Optml_Main' ) && method_exists( 'Optml_Main', 'instance' ) ) {
$main_instance = Optml_Main::instance();
if ( isset( $main_instance->dam ) ) {
$optml_dam_instance = $main_instance->dam;
}
}
// Remove Optimole's media script hooks
if ( $optml_dam_instance ) {
// Remove the enqueue_media_scripts action
remove_action( 'wp_enqueue_media', array( $optml_dam_instance, 'enqueue_media_scripts' ), 10 );
// Remove print_media_templates action as well
remove_action( 'print_media_templates', array( $optml_dam_instance, 'print_media_template' ), 10 );
}
// Also check for any already enqueued scripts and remove them
static $action_registered = false;
if ( ! $action_registered ) {
add_action( 'wp_print_scripts', array( $this, 'dequeue_optimole_scripts' ), 999 );
$action_registered = true;
}
}
/**
* Dequeue Optimole media scripts if they were already enqueued.
*/
public function dequeue_optimole_scripts() {
wp_dequeue_script( 'optml-media-modal' );
wp_deregister_script( 'optml-media-modal' );
wp_dequeue_style( 'optml-media-modal' );
wp_deregister_style( 'optml-media-modal' );
}
/**
* Handle AJAX request to fetch a list of images from Unsplash.
*/
public function unsplash_list_callback() {
check_ajax_referer( 'unsplash_api_nonce', 'nonce' );
$count = min( isset( $_POST['count'] ) ? intval( $_POST['count'] ) : 10, 30 );
$page = isset( $_POST['page'] ) ? intval( $_POST['page'] ) : 1;
$search = isset( $_POST['search'] ) ? sanitize_text_field( wp_unslash( $_POST['search'] ) ) : '';
$allowed_order_by = array( 'relevant', 'latest', 'oldest' );
$allowed_orientation = array( 'landscape', 'portrait', 'squarish' );
$order_by = isset( $_POST['order_by'] ) && in_array( wp_unslash( $_POST['order_by'] ), $allowed_order_by ) ? sanitize_text_field( wp_unslash( $_POST['order_by'] ) ) : 'relevant';
$orientation = isset( $_POST['orientation'] ) && in_array( wp_unslash( $_POST['orientation'] ), $allowed_orientation ) ? sanitize_text_field( wp_unslash( $_POST['orientation'] ) ) : '';
$api_url = 'https://service-api.thrivethemes.com/api/unsplash/unsplash_service.php?action=list&page=' . $page . '&count=' . $count . '&order_by=' . rawurlencode( $order_by );
if ( ! empty( $search ) ) {
$api_url .= '&keyword=' . rawurlencode( $search ) . '&orientation=' . rawurlencode( $orientation );
}
$response = wp_remote_get( $api_url );
if ( is_wp_error( $response ) ) {
wp_send_json_error( 'Error connecting to the Unsplash API' );
return;
}
$data = json_decode( wp_remote_retrieve_body( $response ), true );
if ( is_null( $data ) || ! isset( $data['results'] ) ) {
wp_send_json_error( 'Invalid JSON response from Unsplash service' );
return;
}
wp_send_json_success(
array(
'total' => $data['total'],
'total_pages' => $data['total_pages'],
'results' => $data['results'],
)
);
}
/**
* Handle AJAX request to download an image from Unsplash.
*/
public function unsplash_download_image_callback() {
check_ajax_referer( 'unsplash_api_nonce', 'nonce' );
$photo_id = isset( $_POST['photo_id'] ) ? sanitize_text_field( wp_unslash( $_POST['photo_id'] ) ) : '';
if ( empty( $photo_id ) ) {
wp_send_json_error( 'No photo ID provided' );
return;
}
$photo_size = 'full';
$download_success = false;
$unsplash_api_url = 'https://service-api.thrivethemes.com/api/unsplash/unsplash_service.php?action=download&photo_id=' . urlencode( $photo_id ) . '&photo_size=' . $photo_size;
$response = wp_remote_get( $unsplash_api_url );
if ( is_wp_error( $response ) ) {
wp_send_json_error( 'Error retrieving image information from Unsplash service.' );
return;
}
$data = json_decode( wp_remote_retrieve_body( $response ), true );
if ( ! isset( $data['download_url'] ) ) {
wp_send_json_error( 'Missing download URL in Unsplash service response.' );
return;
}
$download_url = esc_url_raw( $data['download_url'] );
$title = isset( $_POST['title'] ) ? sanitize_text_field( wp_unslash( $_POST['title'] ) ) : '';
$alt_text = isset( $_POST['alt_text'] ) ? sanitize_text_field( wp_unslash( $_POST['alt_text'] ) ) : ( isset( $data['alt_description'] ) ? sanitize_text_field( $data['alt_description'] ) : '' );
$caption = isset( $_POST['caption'] ) ? sanitize_text_field( wp_unslash( $_POST['caption'] ) ) : '';
$description = isset( $_POST['description'] ) ? sanitize_textarea_field( wp_unslash( $_POST['description'] ) ) : '';
$filename = isset( $_POST['filename'] ) ? sanitize_file_name( wp_unslash( $_POST['filename'] ) ) : ( isset( $photo_id ) ? sanitize_text_field( $photo_id ) : '' );
$image_response = wp_remote_get( $download_url );
if ( is_wp_error( $image_response ) ) {
wp_send_json_error( 'Error downloading image from Unsplash.' );
return;
}
$image_body = wp_remote_retrieve_body( $image_response );
$mime_type = wp_remote_retrieve_header( $image_response, 'content-type' );
if ( ! $image_body ) {
wp_send_json_error( 'Error reading image content from Unsplash.' );
return;
}
$file_extension_map = array(
'image/jpeg' => '.jpg',
'image/png' => '.png',
'image/gif' => '.gif',
);
if ( ! isset( $file_extension_map[ $mime_type ] ) ) {
wp_send_json_error( 'Unsupported image type: ' . $mime_type );
return;
}
$file_extension = $file_extension_map[ $mime_type ];
$filename = sanitize_file_name( $filename . $file_extension );
$upload_dir = wp_upload_dir();
$file_path = $upload_dir['path'] . '/' . $filename;
if ( file_put_contents( $file_path, $image_body ) !== false ) {
$download_success = true;
}
if ( ! $download_success ) {
wp_send_json_error( 'Error saving image to the uploads directory.' );
return;
}
$attachment = array(
'guid' => $upload_dir['url'] . '/' . basename( $file_path ),
'post_mime_type' => $mime_type,
'post_title' => $title,
'post_content' => $description,
'post_status' => 'inherit',
'post_excerpt' => $caption,
);
$attach_id = wp_insert_attachment( $attachment, $file_path );
if ( file_exists( ABSPATH . 'wp-admin/includes/image.php' ) ) {
$attach_data = wp_generate_attachment_metadata( $attach_id, $file_path );
if ( ! $attach_data ) {
wp_send_json_error( 'Error generating attachment metadata.' );
return;
}
} else {
if ( ! wp_update_attachment_metadata( $attach_id, $attach_data ) ) {
wp_send_json_error( 'Error updating attachment metadata.' );
return;
}
return;
}
$attach_data = wp_generate_attachment_metadata( $attach_id, $file_path );
wp_update_attachment_metadata( $attach_id, $attach_data );
update_post_meta( $attach_id, '_wp_attachment_image_alt', $alt_text );
wp_send_json_success(
array(
'message' => 'Image downloaded, added to the media library, and added to Thrive Architect',
'attachment_id' => $attach_id,
)
);
}
}

View File

@@ -0,0 +1,568 @@
<?php
/**
* FileName class-tcb-symbols-rest-controller.php.
*
* @project : thrive-visual-editor
* @developer: Dragos Petcu
*/
class TCB_REST_Symbols_Controller extends WP_REST_Posts_Controller {
public static $version = 1;
/**
* Constructor.
* We are overwriting the post type for this rest controller
*/
public function __construct() {
parent::__construct( TCB_Symbols_Post_Type::SYMBOL_POST_TYPE );
$this->namespace = 'tcb/v' . self::$version;
$this->rest_base = 'symbols';
$this->register_meta_fields();
$this->hooks();
}
/**
* Hooks to change the post rest api
*/
public function hooks() {
add_filter( "rest_prepare_{$this->post_type}", [ $this, 'rest_prepare_symbol' ], 10, 2 );
add_filter( "rest_insert_{$this->post_type}", [ $this, 'rest_insert_symbol' ], 10, 2 );
add_action( "rest_after_insert_{$this->post_type}", [ $this, 'rest_after_insert' ], 10, 2 );
add_action( 'rest_delete_' . TCB_Symbols_Taxonomy::SYMBOLS_TAXONOMY, [ $this, 'rest_delete_category' ], 10, 1 );
add_action( "rest_{$this->post_type}_query", [ $this, 'override_per_page' ], 10, 1 );
}
/**
* Override the per page limit for the rest api in case there are people with over 100 symbols
*
* @param $args
*
* @return mixed
*/
public function override_per_page( $params ) {
if ( isset( $params['posts_per_page'] ) ) {
$params['posts_per_page'] = '300';
}
return $params;
}
/**
* Register additional rest routes for symbols
*/
public function register_routes() {
parent::register_routes();
register_rest_route( $this->namespace, '/' . $this->rest_base . '/cloud', array(
array(
'methods' => WP_REST_Server::READABLE,
'callback' => [ $this, 'get_cloud_items' ],
'permission_callback' => [ $this, 'get_items_permissions_check' ],
),
) );
register_rest_route( $this->namespace, '/' . $this->rest_base . '/cloud/(?P<id>.+)', array(
'args' => array(
'id' => array(
'description' => __( 'Unique identifier for the object.' ),
'type' => 'string',
),
),
array(
'methods' => WP_REST_Server::READABLE,
'callback' => [ $this, 'get_cloud_item' ],
'permission_callback' => [ $this, 'get_items_permissions_check' ],
),
) );
}
/**
* Check to see if the user hase permission to view cloud items
*
* @param WP_REST_Request $request
*
* @return bool
*/
public function get_items_permissions_check( $request ) {
return TCB_Product::has_external_access();
}
/**
* @param WP_REST_Request $request
*
* @return array|WP_Error|WP_REST_Response
*/
public function get_cloud_items( $request ) {
if ( ! ( $type = $request->get_param( 'type' ) ) ) {
return new WP_Error( 'rest_invalid_element_type', __( 'Invalid element type' ), [ 'status' => 500 ] );
}
/** @var TCB_Cloud_Template_Element_Abstract $element */
if ( ! ( $element = tcb_elements()->element_factory( $type ) ) || ! is_a( $element, 'TCB_Cloud_Template_Element_Abstract' ) ) {
return new WP_Error( 'rest_invalid_element_type', __( 'Invalid element type', 'thrive-cb' ) . " ({$type})", [ 'status' => 500 ] );
}
$templates = $element->get_cloud_templates();
if ( is_wp_error( $templates ) ) {
return $templates;
}
$templates = $this->prepare_templates_for_response( $templates );
return new WP_REST_Response( $templates );
}
/**
* Transform the resulted templates array to be used in a backbone collection
*
* @param $templates
*
* @return array
*/
public function prepare_templates_for_response( $templates ) {
$results = [];
foreach ( $templates as $template ) {
$results[] = $template;
}
return $results;
}
/**
* Check to see if the user has permission to view an item from cloud
*
* @return bool
*/
public function get_cloud_item_permission_check() {
return tcb_has_external_cap();
}
/**
* Get symbol template from the cloud
*
* @param $request WP_REST_Request
*
* @return array|WP_Error|WP_REST_Response
*/
public function get_cloud_item( $request ) {
if ( ! ( $type = $request->get_param( 'type' ) ) ) {
return new WP_Error( 'rest_invalid_element_type', __( 'Invalid element type', 'thrive-cb' ), [ 'status' => 500 ] );
}
if ( ! ( $id = $request->get_param( 'id' ) ) ) {
return new WP_Error( 'invalid_id', __( 'Missing template id', 'thrive-cb' ), [ 'status' => 500 ] );
}
/** @var TCB_Cloud_Template_Element_Abstract $element */
if ( ! ( $element = tcb_elements()->element_factory( $type ) ) || ! is_a( $element, 'TCB_Cloud_Template_Element_Abstract' ) ) {
return new WP_Error( 'rest_invalid_element_type', __( 'Invalid element type', 'thrive-cb' ) . " ({$type})", [ 'status' => 500 ] );
}
$data = $element->get_cloud_template_data( $id );
if ( is_wp_error( $data ) ) {
return $data;
}
return new WP_REST_Response( $data );
}
/**
* Checks if a given request has access to create a post.
*
* @param WP_REST_Request $request Full details about the request.
*
* @return true|WP_Error True if the request has access to create items, WP_Error object otherwise.
* @since 4.7.0
*
*/
public function create_item_permissions_check( $request ) {
$parent_response = parent::create_item_permissions_check( $request );
//if we are making a duplicate symbol revert to default, do not check for duplicate titles
if ( isset( $request['old_id'] ) || is_wp_error( $parent_response ) ) {
return $parent_response;
}
return $this->check_duplicate_title( $request );
}
/**
* Checks if a given request has access to update a post.
*
* @param WP_REST_Request $request Full details about the request.
*
* @return true|WP_Error True if the request has access to update the item, WP_Error object otherwise.
* @since 4.7.0
*
*/
public function update_item_permissions_check( $request ) {
$parent_response = parent::update_item_permissions_check( $request );
if ( is_wp_error( $parent_response ) ) {
return $parent_response;
}
return $this->check_duplicate_title( $request );
}
/**
* Check if there already exists a symbol with the same title
*
* @param WP_REST_Request $request
*
* @return bool|WP_Error
*/
public function check_duplicate_title( $request ) {
$post_title = $this->get_post_title_from_request( $request );
if ( $post_title ) {
$post = tve_get_page_by_title( $post_title, TCB_Symbols_Post_Type::SYMBOL_POST_TYPE );
if ( $post && $post->post_status !== 'trash' ) {
return new WP_Error( 'rest_cannot_create_post', __( 'Sorry, you are not allowed to create global elements with the same title', 'thrive-cb' ), [ 'status' => 409 ] );
}
}
return true;
}
/**
* Get post title from request
*
* @param WP_REST_Request $request
*/
public function get_post_title_from_request( $request ) {
$post_title = '';
$schema = $this->get_item_schema();
if ( ! empty( $schema['properties']['title'] ) && isset( $request['title'] ) ) {
if ( is_string( $request['title'] ) ) {
$post_title = $request['title'];
} elseif ( ! empty( $request['title']['raw'] ) ) {
$post_title = $request['title']['raw'];
}
}
return $post_title;
}
/**
* Add the taxonomy data to the rest response
*
* @param WP_REST_Response $response
* @param WP_Post $post
*
* @return mixed
*/
public function rest_prepare_symbol( $response, $post ) {
$taxonomies = $response->data[ TCB_Symbols_Taxonomy::SYMBOLS_TAXONOMY ];
foreach ( $taxonomies as $key => $term_id ) {
$term = get_term_by( 'term_id', $term_id, TCB_Symbols_Taxonomy::SYMBOLS_TAXONOMY );
$response->data[ TCB_Symbols_Taxonomy::SYMBOLS_TAXONOMY ][ $key ] = $term;
}
/* add the thumbnail data */
$default_thumb_data = TCB_Utils::get_placeholder_data();
$response->data['thumb'] = TCB_Utils::get_thumb_data( $post->ID, TCB_Symbols_Post_Type::SYMBOL_THUMBS_FOLDER, $default_thumb_data );
$response->data['edit_url'] = tcb_get_editor_url( $post->ID );
return $response;
}
/**
* After a symbol is created generate a new thumb for it ( if we are duplicating the symbol )
*
* @param WP_Post $post Inserted or updated post object.
* @param WP_REST_Request $request Request object.
*
* @return WP_Error|bool
*/
public function rest_insert_symbol( $post, $request ) {
if ( isset( $request['old_id'] ) ) {
$this->ensure_unique_title( $request, $post );
if ( ! $this->copy_thumb( $request['old_id'], $post->ID ) ) {
return new WP_Error( 'could_not_generate_file', __( 'We were not able to copy the symbol', 'thrive-cb' ), [ 'status' => 500 ] );
};
$old_global_data = get_post_meta( $request['old_id'], 'tve_globals', true );
if ( ! empty( $old_global_data ) ) {
update_post_meta( $post->ID, 'tve_globals', $old_global_data );
}
}
update_post_meta( $post->ID, 'export_id', base_convert( time(), 10, 36 ) );
if ( isset( $request['thumb'] ) ) {
return $this->download_thumb( $request, $post->ID );
}
return true;
}
/**
* Action called after a symbol has been created
*
* @param WP_Post $post Inserted or updated post object.
*
*/
public function rest_after_insert( $post ) {
$head_css = get_post_meta( $post->ID, 'tve_custom_css', true );
/* update css specially when we get css from the cloud */
update_post_meta( $post->ID, 'tve_custom_css', str_replace( '|TEMPLATE_ID|', $post->ID, $head_css ) );
}
/**
* It handles also the case when a symbol is created starting with a template from cloud
*
* @param $request WP_REST_Request
* @param $post_id
*
* @return bool|WP_Error
*/
public function download_thumb( $request, $post_id ) {
$thumb = $request['thumb'];
$path = $thumb['url'];
$upload_dir = wp_upload_dir();
if ( strpos( $path, 'no-template-preview' ) !== false ) {
return new WP_Error( 'could_not_generate_file', __( "The inital thumbnail doesn't exists", 'thrive-cb' ), [ 'status' => 500 ] );
}
if ( strpos( $path, 'http' ) === false ) {
$path = 'http:' . $path;
} else {
$thumb_id = isset( $request['thumb_id'] ) ? $request['thumb_id'] : '';
$path = trailingslashit( $upload_dir['basedir'] ) . TCB_Symbols_Post_Type::SYMBOL_THUMBS_FOLDER . '/' . $thumb_id . '.png';
}
//check first if the directory exists. If not, create it
$dir_path = trailingslashit( $upload_dir['basedir'] ) . TCB_Symbols_Post_Type::SYMBOL_THUMBS_FOLDER;
if ( ! is_dir( $dir_path ) ) {
wp_mkdir_p( $dir_path );
}
$new_path = $dir_path . '/' . $post_id . '.png';
/* add the new thumbnail data to the post meta */
TCB_Utils::save_thumbnail_data( $post_id, $thumb );
return @copy( $path, $new_path );
}
/**
* When we duplicate a post, the duplicate will take the title_{id}, to not have symbols with the same name
*
* @param WP_REST_Request $request
* @param WP_Post $post
*/
public function ensure_unique_title( $request, $post ) {
$post_title = $this->get_post_title_from_request( $request );
$new_title = __( 'Copy of ', 'thrive-cb' ) . $post_title;
$same_title_post = tve_get_page_by_title( $new_title, TCB_Symbols_Post_Type::SYMBOL_POST_TYPE );
if ( $same_title_post && $same_title_post->post_status !== 'trash' ) {
$new_title = $new_title . '_' . $post->ID;
}
$post->post_title = $new_title;
wp_update_post( $post );
}
/**
* Get path for symbol thumbnail
*
* @param int $old_id
* @param int $new_id
*
* @return bool
*/
public function copy_thumb( $old_id, $new_id ) {
$upload_dir = wp_upload_dir();
$old_path = trailingslashit( $upload_dir['basedir'] ) . TCB_Symbols_Post_Type::SYMBOL_THUMBS_FOLDER . '/' . $old_id . '.png';
$new_path = trailingslashit( $upload_dir['basedir'] ) . TCB_Symbols_Post_Type::SYMBOL_THUMBS_FOLDER . '/' . $new_id . '.png';
if ( file_exists( $old_path ) ) {
$thumb_data = TCB_Utils::get_thumb_data( $old_id, TCB_Symbols_Post_Type::SYMBOL_THUMBS_FOLDER );
if ( ! empty( $thumb_data ) ) {
TCB_Utils::save_thumbnail_data( $new_id, $thumb_data );
}
return copy( $old_path, $new_path );
}
return true;
}
/**
* Return symbol html from meta
*
* @param array $postdata
*
* @return mixed
*/
public function get_symbol_html( $postdata ) {
$symbol_id = $postdata['id'];
return get_post_meta( $symbol_id, 'tve_updated_post', true );
}
/**
* Update symbol html from meta
*
* @param string $meta_value
* @param WP_Post $post_obj
* @param string $meta_key
*
* @return bool|int
*/
public function update_symbol_html( $meta_value, $post_obj, $meta_key ) {
/**
* Update the symbol html(form meta value) for a specific meta key
*
* @param string $meta_key
* @param string $meta_value
*/
$meta_value = apply_filters( 'tve_update_symbol_html', $meta_key, $meta_value );
return update_post_meta( $post_obj->ID, $meta_key, $meta_value );
}
/**
* Get symbol css from meta
*
* @param array $postdata
*
* @return mixed
*/
public function get_symbol_css( $postdata ) {
$symbol_id = $postdata['id'];
return get_post_meta( $symbol_id, 'tve_custom_css', true );
}
/**
* Update symbols css from meta
*
* @param string $css existing css
* @param WP_Post $post_obj
* @param string $meta_key
* @param WP_Rest_Request $request
*
* @return bool|int
*/
public function update_symbol_css( $css, $post_obj, $meta_key, $request ) {
//if old_id is sent -> we are in the duplicate cas, and we need to replace the id from the css with the new one
if ( isset( $request['old_id'] ) ) {
$css = str_replace( "_{$request['old_id']}", "_{$post_obj->ID}", $css );
}
return update_post_meta( $post_obj->ID, $meta_key, $css );
}
/**
* Move symbol from one category to another
*
* @param string $new_term_id
* @param WP_Post $post_obj
*
* @return array|bool|WP_Error
*/
public function move_symbol( $new_term_id, $post_obj ) {
if ( (int) $new_term_id === 0 ) {
//if the new category is the uncategorized one, we just have to delete the existing ones
return $this->remove_current_terms( $post_obj );
}
//get the new category and make sure that it exists
$term = get_term_by( 'term_id', $new_term_id, TCB_Symbols_Taxonomy::SYMBOLS_TAXONOMY );
if ( $term ) {
$this->remove_current_terms( $post_obj );
return wp_set_object_terms( $post_obj->ID, $term->name, TCB_Symbols_Taxonomy::SYMBOLS_TAXONOMY );
}
return false;
}
/**
* Remove the symbol from the current category( term )
*
* @param WP_Post $post_obj
*
* @return bool|WP_Error
*/
public function remove_current_terms( $post_obj ) {
$post_terms = wp_get_post_terms( $post_obj->ID, TCB_Symbols_Taxonomy::SYMBOLS_TAXONOMY );
if ( ! empty( $post_terms ) ) {
$term_name = $post_terms[0]->name;
return wp_remove_object_terms( $post_obj->ID, $term_name, TCB_Symbols_Taxonomy::SYMBOLS_TAXONOMY );
}
return true;
}
/**
* Add custom meta fields for comments to use them with the rest api
*/
public function register_meta_fields() {
register_rest_field( $this->get_object_type(), 'tve_updated_post', [
'get_callback' => [ $this, 'get_symbol_html' ],
'update_callback' => [ $this, 'update_symbol_html' ],
] );
register_rest_field( $this->get_object_type(), 'tve_custom_css', [
'get_callback' => [ $this, 'get_symbol_css' ],
'update_callback' => [ $this, 'update_symbol_css' ],
] );
register_rest_field( $this->get_object_type(), 'move_symbol', [
'update_callback' => [ $this, 'move_symbol' ],
] );
}
/**
* After a category is deleted we need to move the symbols to uncategorized
*
* @param WP_Term $term The deleted term.
*/
public function rest_delete_category( $term ) {
$posts = get_posts( array(
'post_type' => TCB_Symbols_Post_Type::SYMBOL_POST_TYPE,
'numberposts' => - 1,
'tax_query' => array(
array(
'taxonomy' => TCB_Symbols_Taxonomy::SYMBOLS_TAXONOMY,
'field' => 'id',
'terms' => $term->term_id,
),
),
) );
if ( ! empty( $posts ) ) {
foreach ( $posts as $post ) {
$this->remove_current_terms( $post );
}
}
}
}

View File

@@ -0,0 +1,83 @@
<?php
/**
* Created by PhpStorm.
* User: Ovidiu
* Date: 3/14/2017
* Time: 10:01 AM
*/
/**
* TCB Javascript translations
*/
return [
'templates' => __( 'Templates', 'thrive-cb' ),
'dashboard' => __( 'Thrive Dashboard', 'thrive-cb' ),
'no_categories' => __( 'Please insert some categories!', 'thrive-cb' ),
'delete_template_txt' => __( 'Are you sure you want to delete the template "%s" ?', 'thrive-cb' ),
'delete_category_txt' => __( 'Are you sure you want to delete the category "%s" ?', 'thrive-cb' ),
'delete_symbol_txt' => __( 'Are you sure you want to delete the symbol "%s" ?', 'thrive-cb' ),
'delete_header_txt' => __( 'Are you sure you want to delete the header "%s" ?', 'thrive-cb' ),
'delete_footer_txt' => __( 'Are you sure you want to delete the footer "%s" ?', 'thrive-cb' ),
'show_more' => __( 'Show more templates', 'thrive-cb' ),
'show_less' => __( 'Show less templates', 'thrive-cb' ),
'symbols' => __( 'Symbols', 'thrive-cb' ),
'templates_symbols' => __( 'Templates & Symbols', 'thrive-cb' ),
'global_elements' => __( 'Global Elements', 'thrive-cb' ),
'category_save' => __( 'The category was saved successfully', 'thrive-cb' ),
'category_not_save' => __( 'There was an error while trying to save your category', 'thrive-cb' ),
'symbol_save' => __( 'The symbol was saved successfully', 'thrive-cb' ),
'header_save' => __( 'The header was saved successfully', 'thrive-cb' ),
'footer_save' => __( 'The footer was saved successfully', 'thrive-cb' ),
'symbol_not_save' => __( 'There was an error while trying to save the symbol', 'thrive-cb' ),
'header_not_save' => __( 'There was an error while trying to save the header', 'thrive-cb' ),
'footer_not_save' => __( 'There was an error while trying to save the footer', 'thrive-cb' ),
'uncategorized_symbols' => __( 'Uncategorized Symbols', 'thrive-cb' ),
'category_deleted' => __( 'The category was deleted', 'thrive-cb' ),
'category_not_deleted' => __( 'An error occurred and the category was not deleted', 'thrive-cb' ),
'symbol_deleted' => __( 'The symbol was deleted', 'thrive-cb' ),
'header_deleted' => __( 'The header was deleted', 'thrive-cb' ),
'footer_deleted' => __( 'The footer was deleted', 'thrive-cb' ),
'symbol_not_deleted' => __( 'An error occurred and the symbol was not deleted', 'thrive-cb' ),
'header_not_deleted' => __( 'An error occurred and the header was not deleted', 'thrive-cb' ),
'footer_not_deleted' => __( 'An error occurred and the footer was not deleted', 'thrive-cb' ),
'create_symbol' => __( 'Create new Symbol', 'thrive-cb' ),
'create_category' => __( 'Create a new Category', 'thrive-cb' ),
'create_header' => __( 'Create New Header', 'thrive-cb' ),
'create_footer' => __( 'Create New Footer', 'thrive-cb' ),
'create_new' => __( 'Create new', 'thrive-cb' ),
'description_category' => __( 'Organize your Symbols into categories for a better overview', 'thrive-cb' ),
'description_symbol' => __( 'Create a new symbol and load it on any page by using Thrive Architect', 'thrive-cb' ),
'save_category_text' => __( 'Save Category', 'thrive-cb' ),
'save_symbol_text' => __( 'Save and edit with Architect', 'thrive-cb' ),
'placeholder_category' => __( 'Enter Category Name', 'thrive-cb' ),
'placeholder_symbol' => __( 'Enter Symbol Name', 'thrive-cb' ),
'symbol_name_required' => __( 'Symbol name is required', 'thrive-cb' ),
'category_name_required' => __( 'Category name is required', 'thrive-cb' ),
'category_created' => __( 'The Category was successfully created!', 'thrive-cb' ),
'category_not_created' => __( 'There was an error while trying to create your category', 'thrive-cb' ),
'symbol_created' => __( 'The Symbol was successfully created!', 'thrive-cb' ),
'symbol_not_created' => __( 'There was an error while trying to create your symbol', 'thrive-cb' ),
'add_as_category' => __( 'Add as Category', 'thrive-cb' ),
'select_category' => __( 'Select Category...', 'thrive-cb' ),
'duplicate_symbol_success' => __( 'The symbol was duplicated', 'thrive-cb' ),
'duplicate_header_success' => __( 'The header was duplicated', 'thrive-cb' ),
'duplicate_footer_success' => __( 'The footer was duplicated', 'thrive-cb' ),
'cannot_duplicate_symbol' => __( 'The symbol could not be duplicated', 'thrive-cb' ),
'cannot_duplicate_header' => __( 'The header could not be duplicated', 'thrive-cb' ),
'cannot_duplicate_footer' => __( 'The footer could not be duplicated', 'thrive-cb' ),
'symbol_moved_success' => __( 'The symbol was moved successfully', 'thrive-cb' ),
'symbol_moved_error' => __( 'There was an error while trying to move the symbol', 'thrive-cb' ),
'search_symbol' => __( 'Search symbols', 'thrive-cb' ),
'search_ct' => __( 'Search templates', 'thrive-cb' ),
'search_headers' => __( 'Search headers', 'thrive-cb' ),
'search_footers' => __( 'Search footers', 'thrive-cb' ),
'symbol_name' => __( 'Symbol Name', 'thrive-cb' ),
'ct_name' => __( 'Template Name', 'thrive-cb' ),
'headers_name' => __( 'Header Name', 'thrive-cb' ),
'footers_name' => __( 'Footer Name', 'thrive-cb' ),
'header_name_required' => __( 'Header name is required', 'thrive-cb' ),
'footer_name_required' => __( 'Footer name is required', 'thrive-cb' ),
'empty_list' => __( 'You have no %s yet. You can start building %s by clicking on the button above.', 'thrive-cb' ),
'text_not_deleted' => __( 'This item could not be deleted', 'thrive-cb' ),
];

View File

@@ -0,0 +1,121 @@
<?php
/**
* Created by PhpStorm.
* User: Ovidiu
* Date: 3/6/2017
* Time: 11:10 AM
*/
/**
* @return array
*/
function tcb_admin_get_localization() {
/** @var TCB_Symbols_Taxonomy $tcb_symbol_taxonomy */
global $tcb_symbol_taxonomy;
$terms = get_terms( [ 'slug' => [ 'headers', 'footers' ] ] );
$terms = array_map( function ( $term ) {
return $term->term_id;
}, $terms );
return array(
'admin_nonce' => wp_create_nonce( TCB_Admin_Ajax::NONCE ),
'dash_url' => admin_url( 'admin.php?page=tve_dash_section' ),
't' => include tcb_admin()->admin_path( 'includes/i18n.php' ),
'symbols_logo' => tcb_admin()->admin_url( 'assets/images/admin-logo.png' ),
'rest_routes' => array(
'symbols' => tcb_admin()->tcm_get_route_url( 'symbols' ),
'symbols_terms' => rest_url( sprintf( '%s/%s', 'wp/v2', TCB_Symbols_Taxonomy::SYMBOLS_TAXONOMY ) ),
'symbols_short_path' => TCB_Admin::TCB_REST_NAMESPACE . '/symbols',
),
'notifications' => TCB\Notifications\Main::get_localized_data(),
'nonce' => TCB_Utils::create_nonce(),
'symbols_tax' => TCB_Symbols_Taxonomy::SYMBOLS_TAXONOMY,
'symbols_tax_terms' => $tcb_symbol_taxonomy->get_symbols_tax_terms(),
'sections_tax_terms' => $tcb_symbol_taxonomy->get_symbols_tax_terms( true ),
'default_terms' => $tcb_symbol_taxonomy->get_default_terms(),
'symbols_number' => count( tcb_elements()->element_factory( 'symbol' )->get_all( [ 'category__not_in' => $terms ] ) ),
'symbols_dash' => admin_url( 'admin.php?page=tcb_admin_dashboard&tab_selected=symbol#templatessymbols' ),
);
}
/**
* @param array $templates
*
* @return array
* todo: we will not need this after we move the category grouping logic to JS ( see the comments in admin-ajax )
*/
function tcb_admin_get_category_templates( $templates = [] ) {
$template_categories = [];
$no_preview_img = TCB_Utils::get_placeholder_url();
foreach ( $templates as $template ) {
if ( empty( $template['image_url'] ) ) {
$template['image_url'] = $no_preview_img;
}
if ( isset( $template['id_category'] ) && is_numeric( $template['id_category'] ) ) {
$category_id = $template['id_category'];
/* @var \TCB\UserTemplates\Category */
$category_instance = \TCB\UserTemplates\Category::get_instance_with_id( $category_id );
switch ( $category_instance->get_meta( 'type' ) ) {
case 'uncategorized':
$group = 'uncategorized';
break;
case 'page_template':
$group = \TCB\UserTemplates\Category::PAGE_TEMPLATE_IDENTIFIER;
break;
default:
$group = $category_id;
break;
}
if ( empty( $template_categories[ $group ] ) ) {
$template_categories[ $group ] = [];
}
$template_categories[ $group ][] = $template;
}
}
return $template_categories;
}
/**
* Filter content templates by their name
*
* @param array $templates
* @param string $search
*
* @return array
*/
function tcb_filter_templates( $templates, $search ) {
$result = [];
foreach ( $templates as $template ) {
if ( stripos( $template['name'], $search ) !== false ) {
$result[] = $template;
}
}
return $result;
}
/**
* Displays an icon using svg format
*
* @param string $icon
* @param bool $return whether to return the icon as a string or to output it directly
*
* @return string|void
*/
function tcb_admin_icon( $icon, $return = false ) {
$html = '<svg class="tcb-admin-icon tcb-admin-icon-' . $icon . '"><use xlink:href="#icon-' . $icon . '"></use></svg>';
if ( false !== $return ) {
return $html;
}
echo $html; // phpcs:ignore
}

View File

@@ -0,0 +1,28 @@
<?php
/**
* Thrive Themes - https://thrivethemes.com
*
* @package thrive-theme
*/
if ( ! defined( 'ABSPATH' ) ) {
exit; // Silence is golden!
}
?>
<?php include TVE_DASH_PATH . '/templates/header.phtml'; ?>
<div class="ls-breadcrumbs">
<a href="<?php echo admin_url( 'admin.php?page=tve_dash_section' ); ?>" class="tvd-breadcrumb-back">
<?php echo __( 'Thrive Dashboard', 'thrive-cb' ); ?>
</a>
<a href="<?php echo admin_url( 'admin.php?page=tve_lightspeed' ); ?>" class="tvd-breadcrumb-back">
<?php echo __( 'Project Lightspeed', 'thrive-cb' ); ?>
</a>
<span>
<?php echo __( 'Asset Optimization', 'thrive-cb' ); ?>
</span>
</div>
<div id="lightspeed-admin-wrapper"></div>

View File

@@ -0,0 +1,4 @@
<div id="tcb-admin-header-wrapper"></div>
<div id="tcb-admin-breadcrumbs-wrapper"></div>
<div id="tcb-admin-dashboard-wrapper"></div>
<?php include TVE_TCB_ROOT_PATH . 'admin/assets/css/fonts/tcb-admin-icons.svg' ?>

View File

@@ -0,0 +1,90 @@
<?php
$screen = get_current_screen();
$post_id = $post ? $post->ID : ( isset( $_GET['post_id'] ) ? $_GET['post_id'] : 0 );
?>
<html>
<body>
<form name="post" action="post.php" method="post" id="post">
<?php wp_nonce_field( 'update-post_' . $post->ID ) ?>
<input type="hidden" name="action" value="editpost"/>
<input type="hidden" name="originalaction" value="editpost"/>
<?php the_block_editor_meta_box_post_form_hidden_fields( $post ) ?>
<div id="poststuff" class="wp-admin wp-core-ui js">
<input style="display:none;margin-bottom: 10px" type="submit" name="save" id="publish" class="button button-primary button-large" value="Update">
<?php do_meta_boxes( $screen->id, 'side', $post ); ?>
<?php do_meta_boxes( $screen->id, 'normal', $post ); ?>
<?php do_meta_boxes( $screen->id, 'column3', $post ); ?>
<?php do_meta_boxes( $screen->id, 'column4', $post ); ?>
</div>
</form>
<script>
addLoadEvent = function ( func ) {
if ( typeof jQuery !== 'undefined' ) {
jQuery( function () {
func();
} );
} else if ( typeof wpOnload !== 'function' ) {
wpOnload = func;
} else {
var oldonload = wpOnload;
wpOnload = function () {
oldonload();
func();
}
}
};
var ajaxurl = '<?php echo esc_js( admin_url( 'admin-ajax.php', 'relative' ) ); ?>',
pagenow = '<?php echo esc_js( $screen->id ); ?>',
typenow = '<?php echo esc_js( $screen->post_type ); ?>',
isRtl = <?php echo (int) is_rtl(); ?>;
window.tcbTriggerSave = function () {
jQuery( '#publish' ).trigger( 'click' );
};
window.destroySortable = function () {
setTimeout( () => {
const $sortable = jQuery( '.meta-box-sortables' );
if ( $sortable.length && typeof $sortable.sortable === 'function' ) {
$sortable.sortable( 'destroy' );
}
}, 1000 );
};
window.removeExtraButtons = function () {
jQuery( '.handle-actions' ).children( ':not(.handlediv):not(.handle-order-higher):not(.handle-order-lower)' ).remove();
};
window.tcbToggleMetaBoxes = function ( metaBoxIds = [] ) {
if ( ! Array.isArray( metaBoxIds ) ) {
metaBoxIds = [];
}
jQuery( `.postbox:not('.hide-if-js')` ).toggleClass( 'very-hidden', metaBoxIds.length > 0 ).addClass( 'closed' );
metaBoxIds.forEach( metaBoxId => {
jQuery( `#${metaBoxId}` ).removeClass( 'closed very-hidden' )
} );
};
//on page load
addLoadEvent( () => {
removeExtraButtons();
document.documentElement.setAttribute( 'dir', 'ltr' )
const settingsHeader = document.querySelector( '#submitdiv .postbox-header h2' )
if ( settingsHeader ) {
settingsHeader.innerHTML = 'General settings';
}
Array.from( document.getElementsByTagName( 'a' ) ).forEach( element => {
element.setAttribute( 'target', '_blank' )
} )
} );
</script>

View File

@@ -0,0 +1,9 @@
<ul class="clearfix">
<# links.each( function( item, index ) { item.has_link = index < links.size() - 1 #>
<li class="tvd-breadcrumb <#= ( item.has_link ? '' : ' tqb-no-link' ) #>">
<# if ( item.has_link ) { #><a href="<#= item.get_url() #>"><# } #>
<#= _.escape ( item.get ( 'label' ) ) #>
<# if ( item.has_link ) { #></a><# } #>
</li>
<# } ) #>
</ul>

View File

@@ -0,0 +1,19 @@
<div class="tcb-tabs-container">
<div class="tcb-header-tabs">
<div class="tab-item active" data-content="ct" data-tab="templates"><?php echo __( 'Content Templates', 'thrive-cb' ); ?></div>
<div class="tab-item" data-content="symbol" data-tab="symbol"><?php echo __( 'Symbols & Blocks', 'thrive-cb' ); ?></div>
<div class="tab-item" data-content="notifications" data-tab="notifications"><?php echo __( 'Notification Toasts', 'thrive-cb' ); ?></div>
<div class="tab-item" data-content="headers" data-tab="templates"><?php echo __( 'Headers', 'thrive-cb' ); ?></div>
<div class="tab-item" data-content="footers" data-tab="templates"><?php echo __( 'Footers', 'thrive-cb' ); ?></div>
</div>
<div class="tabs-content">
<div class="tcb-tab-content ct-content active" data-content="ct"></div>
<div class="tcb-tab-content symbols-content" data-content="symbol"></div>
<div class="tcb-tab-content notifications-content" data-content="notifications"></div>
<div class="tcb-tab-content headers-content" data-content="headers"></div>
<div class="tcb-tab-content footers-content" data-content="footers"></div>
</div>
<div id="tve-page-loader">
<?php tcb_template( 'loading-spinner.php' ); ?>
</div>
</div>

View File

@@ -0,0 +1,24 @@
<div class="tcb-header <#= header.class #>">
<nav id="tcb-nav">
<# if ( header.class !== '' ) { #>
<div class="tcb-sym-left">
<span><?php echo __( 'Global Elements', 'thrive-cb' ) ?></span>
</div>
<# } #>
<div class="tvd-left">
<a href="<?php echo admin_url( 'admin.php?page=tcb_admin_dashboard' ) ?>" title="<?php echo __( 'Thrive Architect Home', 'thrive-cb' ) ?>">
<img src="<#= header.admin_logo_url #>"/>
</a>
</div>
<ul class="tvd-right">
<li>
<a id="tvd-share-modal" class="tvd-modal-trigger" href="#tvd-modal1"
data-overlay_class="tvd-white-bg" data-opacity=".95">
<span class="tvd-icon-heart"></span>
</a>
</li>
</ul>
</nav>
</div>
<?php include TVE_DASH_PATH . '/templates/share.phtml'; ?>

View File

@@ -0,0 +1,84 @@
<div class="ls-view-title"><?php echo __( 'Advanced Settings', 'thrive-cb' ); ?></div>
<div class="ls-advanced-settings-wrapper">
<p class="ls-advanced-setting-info">
<?php echo __( 'These optimization settings apply to WordPress core or 3rd party assets and may affect 3rd party plugin or theme functionality. Please make sure to thoroughly test your website after activating them.', 'thrive-cb' ); ?>
</p>
<?php if ( class_exists( '\TCB\Lightspeed\Gutenberg', false ) ): ?>
<div class="ls-advanced-gutenberg-settings">
<p class="ls-advanced-setting-disable-gutenberg">
<?php echo __( 'Disable loading Gutenberg scripts and styles on content where we can detect that it\'s not being used', 'thrive-cb' ); ?>
</p>
<div class="ls-option-item">
<input type="checkbox"
id="ls-disable-gutenberg-lp-checkbox"
data-key="<?php echo \TCB\Lightspeed\Gutenberg::DISABLE_GUTENBERG_LP; ?>"
class="noUi-target noUi-ltr noUi-horizontal noUi-background ls-advanced-setting-input"
<#= <?php echo TCB\Lightspeed\Gutenberg::DISABLE_GUTENBERG_LP ?> ? 'checked': '' #>>
<label for="ls-disable-gutenberg-lp-checkbox">
<?php echo __( 'Disable on Thrive Landing Pages', 'thrive-cb' ); ?>
</label>
</div>
<?php if ( tve_dash_is_ttb_active() ): ?>
<div class="ls-option-item">
<input type="checkbox"
id="ls-disable-gutenberg-content-checkbox"
data-key="<?php echo \TCB\Lightspeed\Gutenberg::DISABLE_GUTENBERG; ?>"
class="noUi-target noUi-ltr noUi-horizontal noUi-background ls-advanced-setting-input"
<#= <?php echo TCB\Lightspeed\Gutenberg::DISABLE_GUTENBERG ?> ? 'checked': '' #>>
<label for="ls-disable-gutenberg-content-checkbox">
<?php echo __( 'Disable on all content that uses a Thrive Theme Builder template', 'thrive-cb' ); ?>
</label>
</div>
<?php endif; ?>
</div>
<?php endif; ?>
<?php if ( \TCB\Integrations\WooCommerce\Main::active() ): ?>
<div class="ls-advanced-woocommerce-settings">
<p class="ls-advanced-setting-disable-woocommerce">
<?php echo __( 'Disable loading WooCommerce scripts and styles on content where we can detect that it\'s not being used', 'thrive-cb' ); ?>
</p>
<div class="ls-option-item">
<input type="checkbox"
id="ls-disable-woocommerce-lp-checkbox"
data-key="<?php echo \TCB\Lightspeed\Woocommerce::DISABLE_WOOCOMMERCE_LP; ?>"
class="noUi-target noUi-ltr noUi-horizontal noUi-background ls-advanced-setting-input"
<#= <?php echo TCB\Lightspeed\Woocommerce::DISABLE_WOOCOMMERCE_LP ?> ? 'checked': '' #>>
<label for="ls-disable-woocommerce-lp-checkbox">
<?php echo __( 'Disable on Thrive Landing Pages', 'thrive-cb' ); ?>
</label>
</div>
<?php if ( tve_dash_is_ttb_active() ): ?>
<div class="ls-option-item">
<input type="checkbox"
id="ls-disable-woocommerce-content-checkbox"
data-key="<?php echo \TCB\Lightspeed\Woocommerce::DISABLE_WOOCOMMERCE; ?>"
class="noUi-target noUi-ltr noUi-horizontal noUi-background ls-advanced-setting-input"
<#= <?php echo TCB\Lightspeed\Woocommerce::DISABLE_WOOCOMMERCE ?> ? 'checked': '' #> >
<label for="ls-disable-woocommerce-content-checkbox">
<?php echo __( 'Disable on all content that uses a Thrive Theme Builder template', 'thrive-cb' ); ?>
</label>
</div>
<?php endif; ?>
</div>
<?php endif; ?>
<div class="ls-advanced-emoji-settings">
<p class="ls-advanced-setting-disable-emoji">
<?php echo __( 'Disable emojis', 'thrive-cb' ); ?>
</p>
<div class="ls-option-item">
<input type="checkbox"
id="ls-disable-emoji-lp-checkbox"
data-key="<?php echo \TCB\Lightspeed\Emoji::DISABLE_EMOJI; ?>"
class="noUi-target noUi-ltr noUi-horizontal noUi-background ls-advanced-setting-input"
<#= <?php echo TCB\Lightspeed\Emoji::DISABLE_EMOJI ?> ? 'checked': '' #>>
<label for="ls-disable-emoji-lp-checkbox">
<?php echo __( 'Prevent WordPress from automatically loading emojis in your pages.', 'thrive-cb' ); ?>
</label>
</div>
</div>
<a class="ls-save-advanced-settings tvd-waves-effect tvd-waves-light tvd-btn tvd-btn-green" style="width:300px;"><?php echo __( 'Save', 'thrive-cb' ); ?> </a>
<div class="page-content" style="width:300px; ">
<div class="progress-bar-wrapper" style="display: none;"></div>
</div>
</div>

View File

@@ -0,0 +1,46 @@
<div class="ls-view-title"><?php echo __( 'Font Settings', 'thrive-cb' ); ?></div>
<div class="ls-fonts-wrapper">
<div class="ls-option-item<#= canOptimizeFonts ? '' : ' ls-disabled-item' #>">
<input type="checkbox"
id="ls-enable-optimization-checkbox"
data-key="<?php echo \TCB\Lightspeed\Fonts::ENABLE_FONTS_OPTIMIZATION; ?>"
class="noUi-target noUi-ltr noUi-horizontal noUi-background ls-setting-input" <#= <?php echo TCB\Lightspeed\Fonts::ENABLE_FONTS_OPTIMIZATION ?> ? 'checked': '' #>>
<label for="ls-enable-optimization-checkbox">
<?php echo __( 'Enable Google Fonts Optimization', 'thrive-cb' ); ?>
</label>
<p class="ls-setting-info">
<?php echo __( 'Improves Google Fonts performance and combines multiple font requests for better Core Web Vital results.', 'thrive-cb' ); ?>
<a target="_blank" href="http://help.thrivethemes.com/en/articles/5448042-configuring-the-font-settings-in-project-lightspeed#h_31067c257a"><?php echo __( 'Learn more', 'thrive-cb' ); ?></a>
</p>
</div>
<div class="ls-option-item<#= canLoadFontsAsync ? '' : ' ls-disabled-item' #>">
<input type="checkbox"
id="ls-enable-async-fonts-checkbox"
data-key="<?php echo \TCB\Lightspeed\Fonts::ENABLE_ASYNC_FONTS_LOAD; ?>"
class="noUi-target noUi-ltr noUi-horizontal noUi-background ls-setting-input" <#= <?php echo TCB\Lightspeed\Fonts::ENABLE_ASYNC_FONTS_LOAD ?> ? 'checked': '' #>>
<label for="ls-enable-async-fonts-checkbox">
<?php echo __( 'Load Google Fonts Asynchronously', 'thrive-cb' ); ?>
</label>
<p class="ls-setting-info">
<?php echo __( 'Tells the browser to preload Google Fonts in the background, this can improve Core Web Vitals in some cases.', 'thrive-cb' ); ?>
<a target="_blank" href="http://help.thrivethemes.com/en/articles/5448042-configuring-the-font-settings-in-project-lightspeed#h_31067c257a/"><?php echo __( 'Learn more', 'thrive-cb' ); ?></a>
</p>
</div>
<div class="ls-option-item">
<input type="checkbox"
id="ls-disable-google-fonts-checkbox"
data-key="<?php echo \TCB\Lightspeed\Fonts::DISABLE_GOOGLE_FONTS; ?>"
class="noUi-target noUi-ltr noUi-horizontal noUi-background ls-setting-input" <#= <?php echo TCB\Lightspeed\Fonts::DISABLE_GOOGLE_FONTS ?> ? 'checked': '' #>>
<label for="ls-disable-google-fonts-checkbox">
<?php echo __( 'Disable all Google Fonts loaded by Thrive on your website.', 'thrive-cb' ); ?>
</label>
<p class="ls-setting-info">
<?php echo __( 'Prevent any Google font from loading in a page.', 'thrive-cb' ); ?>
<a target="_blank" href="http://help.thrivethemes.com/en/articles/5448042-configuring-the-font-settings-in-project-lightspeed#h_ac726f97ee">
<?php echo __( 'Learn more', 'thrive-cb' ); ?>
</a>
</p>
</div>
</div>

View File

@@ -0,0 +1,9 @@
<ul id="ls-menu-container"></ul>
<div>
<div id="ls-view-container"></div>
<div class="ls-footer">
<a href="<?php echo admin_url( 'admin.php?page=tve_dash_section' ); ?>" class="tvd-waves-effect tvd-waves-light tvd-btn-small tvd-btn-gray">
<?php echo __( 'Back To Dashboard', 'thrive-cb' ); ?>
</a>
</div>
</div>

View File

@@ -0,0 +1,3 @@
<li class="ls-menu-item<#= url.includes(currentRoute) ? ' active':'' #>">
<a href="<#= url #>"><#= label #></a>
</li>

View File

@@ -0,0 +1,15 @@
<div class="ls-optimization-wrapper">
<div class="page-content grey">
<div class="page-title"><?php echo __( 'Site Analysis Results', 'thrive-cb' ); ?></div>
<div class="page-text-wrapper">
<span class="big-icon success"></span>
<div class="text-title green-color">
<?php echo __( 'All assets on your site are optimized to the latest version', 'thrive-cb' ); ?>
</div>
</div>
<button class="lightspeed-button grey lightspeed-force-optimize">
<?php echo __( 'Rerun asset optimization', 'thrive-cb' ); ?>
</button>
</div>
<div class="page-footer"></div>
</div>

View File

@@ -0,0 +1,68 @@
<div class="ls-optimization-wrapper">
<div class="page-content ">
<svg id="lightspeed-icon" width="70" height="68" viewBox="0 0 70 68">
<g fill="none" fill-rule="evenodd">
<g>
<g>
<path d="M1.247 1.217H69.421V64.521H1.247z" transform="translate(-728 -189) translate(728 189)"/>
<path fill="#2A5082" fill-rule="nonzero" d="M68.39 0C69.279 0 70 .819 70 1.826v62.087c0 1.007-.722 1.826-1.61 1.826h-2.042l-.001-1.218h2.436V1.218H1.217v63.305l2.435-.001v1.218H1.61C.722 65.74 0 64.92 0 63.913V1.826C0 .82.722 0 1.61 0z" transform="translate(-728 -189) translate(728 189)"/>
<path stroke="#2A5082" stroke-width="1.2" d="M63.913 45.652V14.174c0-1.105-.895-2-2-2H8.087c-1.105 0-2 .895-2 2v31.478h0" transform="translate(-728 -189) translate(728 189)"/>
<path fill="#A3D4FF" stroke="#2A5082" stroke-width="1.2" d="M35.03 34.087c15.968 0 28.912 12.945 28.912 28.913 0 .717-.026 1.427-.077 2.13H54.7c.075-.7.113-1.41.113-2.13 0-10.926-8.857-19.783-19.783-19.783-10.925 0-19.782 8.857-19.782 19.783 0 .72.038 1.43.113 2.13H6.194c-.052-.703-.078-1.413-.078-2.13 0-15.968 12.945-28.913 28.913-28.913z" transform="translate(-728 -189) translate(728 189)"/>
<path fill="#2A5082" fill-rule="nonzero" d="M6.61 3.652c.624 0 1.13.507 1.13 1.131 0 .625-.506 1.131-1.13 1.131-.625 0-1.132-.506-1.132-1.13 0-.625.507-1.132 1.131-1.132zm4.976 0c.624 0 1.13.507 1.13 1.131 0 .625-.506 1.131-1.13 1.131-.625 0-1.131-.506-1.131-1.13 0-.625.506-1.132 1.13-1.132zm4.976 0c.625 0 1.131.507 1.131 1.131 0 .625-.506 1.131-1.13 1.131-.625 0-1.132-.506-1.132-1.13 0-.625.507-1.132 1.131-1.132zM5.508 7.913H64.551V9.13H5.508z"
transform="translate(-728 -189) translate(728 189)"/>
<g fill="#2A5082" fill-rule="nonzero">
<g>
<path d="M0 3.652H45.652V4.869H0zM0 0H45.652V1.217H0z" transform="translate(-728 -189) translate(728 189) translate(12.174 19.478)"/>
</g>
</g>
<path fill="#2A5082" fill-rule="nonzero" d="M52.348 4.261H64.52199999999999V5.478H52.348z" transform="translate(-728 -189) translate(728 189)"/>
<g stroke="#2A5082" stroke-linecap="round" stroke-width="1.5">
<path d="M2.243 14.923L2.763 19.159" transform="translate(-728 -189) translate(728 189) translate(9.16 34.391) scale(-1 1) rotate(70 0 13.466)"/>
<path d="M10.732 4.714L13.361 8.196" transform="translate(-728 -189) translate(728 189) translate(9.16 34.391) scale(-1 1) rotate(70 0 -10.75)"/>
<path d="M23.57 1.704L27.563 3.157" transform="translate(-728 -189) translate(728 189) translate(9.16 34.391) scale(-1 1) rotate(70 0 -34.083)"/>
<path d="M37.381 6.55L41.271 5.692" transform="translate(-728 -189) translate(728 189) translate(9.16 34.391) scale(-1 1) rotate(70 0 -50.042)"/>
<path d="M47.83 17.797L50.841 15.136" transform="translate(-728 -189) translate(728 189) translate(9.16 34.391) scale(-1 1) rotate(70 0 -53.992)"/>
</g>
<g fill="#2A5082" fill-rule="nonzero">
<path d="M.162.08c8.85.854 15.664 8.314 15.664 17.268 0 .254-.005.508-.016.76l-.02.379-1.199-.385c.012-.335.018-.586.018-.754 0-8.242-6.21-15.124-14.317-16.03L.162.081z" transform="translate(-728 -189) translate(728 189) translate(36.522 45.894)"/>
<path d="M11.285 10.968c.751 1.506 1.232 3.136 1.414 4.828l.033.34-1.243-.206c.02.019-.066-.4-.259-1.257-.289-1.285-.578-2.196-.892-2.866l-.046-.095.993-.744z" transform="translate(-728 -189) translate(728 189) translate(36.522 45.894)"/>
</g>
<g stroke="#2A5082" stroke-width="1.2" transform="translate(-728 -189) translate(728 189) translate(28.638 50.522)">
<path d="M9.267 18.085c2.417-.002 4.626-2.212 4.627-4.628.002-2.415-2.861-12.24-3.837-12.24-.975 0-5.044 9.403-5.181 11.977-.137 2.574 1.974 4.892 4.391 4.89z" transform="rotate(45 9.382 9.651)"/>
<circle cx="6.391" cy="12.478" r="2.13"/>
</g>
<path fill="#2A5082" fill-rule="nonzero"
d="M7.344 62.08l2.43.15v.85l-2.43-.042v-.959zm55.35-.442l.028.89-2.436.11-.032-.83 2.44-.17zM7.606 59.047l2.44.365-.086.635-2.44-.366.086-.634zm54.777-.45l.092.621-2.418.38-.091-.62 2.417-.38zM8.205 56.055l2.375.59-.147.592-2.376-.592.148-.59zm53.538-.432l.164.586-2.387.665-.163-.586 2.386-.665zM9.138 53.154l2.302.843-.21.572-2.302-.843.21-.572zm51.62-.433l.224.566-2.277.901-.224-.566 2.277-.9zm-48.88-4.937l2.046 1.316-.33.512-2.045-1.316.329-.512zm46.023-.415l.337.507-2.031 1.352-.338-.506 2.032-1.353zM13.7 45.31l1.901 1.544-.384.472-1.9-1.543.383-.473zm42.36-.365l.387.469-1.896 1.568-.388-.47 1.896-1.567zM15.78 43.066l1.707 1.769-.438.423-1.707-1.769.438-.423zm38.151-.345l.442.419-1.702 1.797-.441-.42 1.701-1.796zm-35.825-1.644L19.622 43l-.477.377-1.516-1.923.478-.377zm33.471-.307l.485.368-1.484 1.955-.485-.368 1.484-1.955zm-28.293-2.857l1.06 2.19-.548.265-1.06-2.19.548-.265zm23.06-.201l.554.254-1.018 2.217-.553-.254 1.018-2.217zm-20.244-.95l.816 2.313-.574.202-.816-2.312.574-.203zm17.41-.132l.579.191-.765 2.311-.578-.191.765-2.31zm-14.473-.692l.556 2.392-.593.138-.556-2.392.593-.138zm11.524-.084l.596.125-.503 2.391-.595-.125.502-2.391zm-8.436-.398l.327 2.44-.673.072-.327-2.44.673-.072zm5.457-.034l.723.058-.277 2.424-.723-.058.277-2.424z"
transform="translate(-728 -189) translate(728 189)"/>
</g>
</g>
</g>
</svg>
<div class="page-title"><?php echo __( 'Optimize assets for a blazing fast site', 'thrive-cb' ); ?></div>
<div class="page-text-wrapper">
<div class="text-title blue-color"><?php echo __( 'Asset optimization is vital for a fast site.', 'thrive-cb' ); ?></div>
<div class="text-main">
<div class="text-paragraph">
<?php echo __( 'This optimization tool ensure that assets such as javascript and CSS files are only loaded on pieces content where theyre actually used.', 'thrive-cb' ); ?>
</div>
<div class="text-paragraph">
<?php echo __( 'Your site must be analyzed first to find which assets can be optimized. Please note that site analysis may take 1-2 minutes depending on the size of your site', 'thrive-cb' ); ?>
</div>
<a target="_blank" class="link-text" href="https://help.thrivethemes.com/en/articles/5295426-what-is-the-asset-optimization-tool-how-does-it-work">
<?php echo __( 'Learn more about this tool ' ); ?>
</a>
</div>
</div>
<div class="page-button-wrapper white">
<div class="button-description bold">
<?php echo __( 'Click the button below to get started', 'thrive-cb' ); ?>
</div>
<button class="lightspeed-button blue-color lightspeed-analyze">
<span class="analyze-icon"></span>
<?php echo __( 'Analyze this site', 'thrive-cb' ); ?>
</button>
</div>
</div>
<div class="page-footer"></div>
</div>

View File

@@ -0,0 +1,5 @@
<div class="text-paragraph failed-item">
<span><#= index #></span>
<strong><#= group #></strong>
<span><#= name #></span>
</div>

View File

@@ -0,0 +1,43 @@
<div class="ls-optimization-wrapper">
<div class="page-content grey">
<div class="page-title">
<?php echo __( 'Asset optimization finished!', 'thrive-cb' ); ?>
<div class="page-subtitle"><#= optimizationTime #></div>
</div>
<div class="page-text-wrapper">
<div class="optimization-results-wrapper">
<div class="optimization-result">
<div class="result-wrapper success">
<span class="big-icon success"></span>
<div class="result-description">
<div class="number"><#= optimizedItems #></div>
<div class="description"><?php echo __( 'optimized assets', 'thrive-cb' ); ?></div>
</div>
</div>
</div>
<# if(failedItems > 0) { #>
<div class="optimization-result">
<div class="result-wrapper fail">
<span class="big-icon fail"></span>
<div class="result-description">
<div class="number"><#= failedItems #></div>
<div class="description"><?php echo __( 'failed to optimize*', 'thrive-cb' ); ?></div>
</div>
</div>
<button class="link-text show-failed"><?php echo __( '*View entire failed list', 'thrive-cb' ); ?></button>
</div>
<# } #>
</div>
<div class="failed-items"></div>
<div class="page-button-wrapper">
<div class="divider"></div>
<div class="button-description normal">
<?php echo __( 'Return to the control panel to enable optimized asset loading on your site', 'thrive-cb' ); ?>
</div>
<button class="lightspeed-button blue-color go-to-home">
<?php echo __( 'Go to control panel', 'thrive-cb' ); ?>
</button>
</div>
</div>
</div>
</div>

View File

@@ -0,0 +1,12 @@
<div class="text-paragraph <#= status === 'running' ? 'optimizing':'' #>">
<# if(status === 'optimized') { #>
<span class="small-icon success"></span>
<# } else if(status === 'running') { #>
<span class="spinner is-active"></span>
<# } else if(status === 'fail') { #>
<span class="small-icon fail"></span>
<# } else { #>
<span class="waiting"></span>
<# } #>
<#= items.where( {optimized: true} ).length #> of <#= items.length #>&nbsp;<strong><#= label #></strong>&nbsp;have been optimized.
</div>

View File

@@ -0,0 +1,25 @@
<div class="ls-optimization-wrapper">
<div class="page-content grey">
<div class="page-title"><?php echo __( "Your assets aren't fully optimized", 'thrive-cb' ); ?></div>
<div class="page-text-wrapper">
<span class="big-icon warning"></span>
<div class="text-title red-color"><?php echo __( 'None of your assets are optimized. ', 'thrive-cb' ); ?></div>
<div class="text-main">
<div class="text-paragraph">
<?php echo __( 'Click the button below to migrate to the latest version for additional performance benefits. Once complete, you can disable and enable site optimizations at any time with a single click', 'thrive-cb' ); ?>
</div>
</div>
</div>
<button class="lightspeed-button blue-color lightspeed-optimize">
<?php echo __( 'Optimize my site', 'thrive-cb' ); ?>
</button>
<div class="page-footnote-wrapper">
<div class="footnote-text">
<?php echo __( 'Please note that optimization may take some time to complete depending on the size of your site. Youll see a live update of migration occurring. You can leave it running in the background and come back at any point to see progress.', 'thrive-cb' ); ?>
</div>
<a class="link-text" target="_blank" href="https://help.thrivethemes.com/en/articles/5295426-what-is-the-asset-optimization-tool-how-does-it-work">
<?php echo __( 'Learn more about the migration process', 'thrive-cb' ); ?>
</a>
</div>
</div>
</div>

View File

@@ -0,0 +1,23 @@
<div class="ls-optimization-wrapper">
<div class="page-content grey">
<div class="page-title"><?php echo __( "Some of your site assets aren't fully optimized", 'thrive-cb' ); ?></div>
<div class="page-text-wrapper">
<span class="big-icon continue"></span>
<div class="text-title blue-color">
<?php echo sprintf( __( '%s of %s items have been updated to the latest version.', 'thrive-cb' ),
'<#= optimizedItems #>',
'<#= totalItems #>'
); ?>
</div>
<div class="text-main">
<div class="text-paragraph">
<?php echo __( 'Click the button below to continue until your site is fully optimized.', 'thrive-cb' ); ?>
</div>
</div>
</div>
<button class="lightspeed-button blue-color lightspeed-optimize">
<?php echo __( 'Continue optimization', 'thrive-cb' ); ?>
</button>
</div>
<div class="page-footer"></div>
</div>

View File

@@ -0,0 +1,31 @@
<div class="ls-optimization-wrapper">
<div class="page-header">
<?php echo __( 'Please note this optimization tool will run in the background.<b> Please dont close the page</b> while it is running. If the migration fails before completing then you can rerun the tool and it will automatically continue from where it got to previously', 'thrive-cb' ); ?>
</div>
<div class="page-content white">
<div class="page-title"><?php echo __( 'Asset Optimization in Progress …', 'thrive-cb' ); ?></div>
<div class="page-text-wrapper">
<div class="text-main align-left">
<div class="text-paragraph mt-0 mb-5">
<span class="small-icon estimated-time-icon"></span>
<?php echo sprintf( __( 'Estimated time to completion:&nbsp<b>%s</b>', 'thrive-cb' ), '<span class="optimization-time"> ~ </span>' ); ?>
</div>
<div class="text-paragraph mt-0 mb-5">
<span class="small-icon success"></span>
<?php echo sprintf( __( '<b>%s of %s items</b>&nbsphave been updated to the latest version', 'thrive-cb' ), '<span class="optimized-items"> ~ </span>', '<span class="total-items"> ~ </span>' ); ?>
</div>
<div class="text-paragraph mt-0 red-color failed-optimization-wrapper">
<span class="small-icon fail"></span>
<?php echo sprintf( __( '<b>%s items</b>&nbspfailed to update', 'thrive-cb' ), '<span class="optimization-failed-items"> ~ </span>' ); ?>
</div>
</div>
</div>
<div class="currently-optimizing">
<?php echo __( 'Currently optimizing: ', 'thrive-cb' ); ?><span class="item-in-progress"></span>
</div>
<div class="progress-bar-wrapper"></div>
</div>
<div class="groups-to-optimize"></div>
</div>

View File

@@ -0,0 +1,16 @@
<div class="tvd-switch">
<div class="label-text">
<div class="text">
<?php echo __( 'Display optimized assets on the front end of your site ', 'thrive-cb' ); ?>
</div>
<span class="info-icon"></span>
<div class="info-tooltip" style="display:none">
<?php echo __( 'After your optimized code has been prepared, you can enable or disable it in one click with this toggle. When disabled, your website will fall back to loading the assets it did before optimization. You may need to analyze your site again before enabling.', 'thrive-cb' ); ?>
</div>
</div>
<label>
<input type="checkbox" class="tvd-toggle-input toggle-lightspeed" <#= isEnabled ? 'checked': '' #>>
<span class="tvd-lever"></span>
</label>
</div>

View File

@@ -0,0 +1,4 @@
<div class="progress-bar">
<div class="progress-bar-percentage"><#= progress #>%</div>
<div class="progress-bar-value" style="width: <#= progress #>%;"></div>
</div>

View File

@@ -0,0 +1,49 @@
<?php
if ( ! defined( 'ABSPATH' ) ) {
exit; // Silence is golden!
}
?>
<div class="tcb-modal-content sym-admin-modal">
<span class="tcb-modal-title">
<#= title #>
</span>
<div class="error-container"></div>
<p class="tcb-modal-description">
<#= description #>
</p>
<div class="save-container">
<div class="tvd-input-field">
<input type="text" class="content-title" name="title" placeholder="<#= placeholder #>">
</div>
<# if ( is_symbol && show_category ) { #>
<div class="tvd-input-field align-left category-container">
<label class="tcb-symbol-check" for="add_category">
<input id="add_category" type="checkbox" class="" name="add_category">
<span class="checkmark"></span>
<?php echo __( 'Add symbol to a category', 'thrive-cb' ); ?>
</label>
<div class="category_selection" style="display: none;">
<div class="">
<select id="tcb-save-template-categ-suggest"></select>
<input type="hidden" id="tcb-save-template-category-id" value=""/>
</div>
</div>
</div>
<# } #>
</div>
<div class="tcb-modal-footer">
<button type="button" class="tvd-modal-close">
<?php echo __( 'Cancel', 'thrive-cb' ) ?>
</button>
<a class="tvd-submit tvd-modal-save tvd-right" href="#" target="_blank" >
<#= save_text #>
</a>
</div>
</div>

View File

@@ -0,0 +1,39 @@
<div class="tcb-modal-content tcb-move-symbol">
<span class="tcb-modal-title">
<?php echo __( 'Move template to other category', 'thrive-cb' ) ?>
</span>
<p class="tcb-modal-description">
<?php echo __( 'Select from the dropdown bellow where do you want to move ', 'thrive-cb' ) ?>
</p>
<div class="save-container">
<div>
<label for="tcb-move-input"><?php echo __( 'Current Category ', 'thrive-cb' ) ?></label>
<input type="text" name="tcb-move-input" readonly="readonly" value="<#= model.get('name') #>">
</div>
<div>
<label for="tcb-admin-t-categ-combo" class="tcb-admin-t-categ-combo-label"><?php echo __( 'Select New Category ', 'thrive-cb' ) ?></label>
<select id="tcb-admin-t-categ-combo">
<#
TVE_Admin.globals.templates.each(function(tmodel, index) {
#>
<option value="<#= tmodel.get('id') #>"><#= tmodel.get('name') #></option>
<#
});
#>
</select>
</div>
</div>
<div class="tvd-modal-footer tcb-move-template-footer">
<button type="button" class="tvd-modal-close">
<?php echo __( 'Cancel', 'thrive-cb' ) ?>
</button>
<button type="button" class="tvd-submit tvd-modal-submit tvd-right">
<?php echo __( 'Save', 'thrive-cb' ) ?>
</button>
</div>
</div>

View File

@@ -0,0 +1,39 @@
<div class="tcb-modal-content tcb-move-symbol">
<span class="tcb-modal-title">
<?php echo __( 'Move template to other category', 'thrive-cb' ); ?>
</span>
<p class="tcb-modal-description">
<?php echo __( 'Select from the dropdown bellow where do you want to move ', 'thrive-cb' ) ?>
</p>
<div class="save-container">
<div>
<label for="tcb-move-input"><?php echo __( 'Current Category ', 'thrive-cb' ) ?></label>
<input type="text" name="tcb-move-input" readonly="readonly" value="<#= current_category['name'] #>">
</div>
<div>
<label for="tcb-admin-t-categ-combo" class="tcb-admin-t-categ-combo-label"><?php echo __( 'Select New Category ', 'thrive-cb' ) ?></label>
<select id="tcb-admin-t-categ-combo">
<# categories.each( function(category, index) { #>
<# if ( category.get('term_id') !== current_category['term_id'] ) { #>
<option value="<#= category.get('term_id') #>">
<#= category.get('name') #>
</option>
<# } #>
<# }); #>
</select>
</div>
</div>
<div class="tvd-modal-footer tcb-move-template-footer">
<button type="button" class="tvd-modal-close">
<?php echo __( 'Cancel', 'thrive-cb' ) ?>
</button>
<button type="button" class="tvd-submit tvd-modal-submit tvd-right">
<?php echo __( 'Save', 'thrive-cb' ) ?>
</button>
</div>
</div>

View File

@@ -0,0 +1,36 @@
<div class="tcb-modal-content sym-admin-modal tve-add-new-category">
<span class="tcb-modal-title"><?php echo __( 'Add New Category', 'thrive-cb' ) ?></span>
<p class="tcb-modal-description"><?php echo __( 'Here you can add one or more categories.', 'thrive-cb' ) ?></p>
<div class="tvd-row" id="tcb-categ-input"></div>
<div class="tvd-row">
<div class="tvd-col tvd-s12">
<a href="javascript:void(0)" class="tvd-left tvd-waves-effect tvd-waves-light tvd-btn tvd-btn-small tvd-btn-blue" id="tcb-add-new-category-input">
<?php echo __( 'Add new', 'thrive-cb' ) ?>
</a>
</div>
</div>
<div class="tvd-modal-footer tve-add-new-category-foio">
<button type="button" class="tvd-modal-close">
<?php echo __( 'Cancel', 'thrive-cb' ) ?>
</button>
<button type="button" class="tvd-submit tvd-modal-submit tvd-right">
<?php echo __( 'Save', 'thrive-cb' ) ?>
</button>
</div>
</div>
<div class="row hidden" id="tcb-categ-input-template" style="display: none;">
<div class="tcb-admin-text-element-wrapper">
<div class="tvd-col tvd-s11">
<input type="text" class="tcb-category-input-item" placeholder="<?php echo __( 'Enter the name of the new category', 'thrive-cb' ) ?>">
</div>
<div class="tvd-col tvd-s1">
<span class="tvd-icon-trash-o tvd-pointer tcb-admin-delete-text-element"></span>
</div>
</div>
</div>

View File

@@ -0,0 +1,6 @@
<div class="tcb-modal-tab-elem" data-id="<#= item.get('id') #>" data-type="symbol" data-cloud="<# if ( ! item.get('from_cloud') ) { #>0<# } else { #>1<# } #>">
<span class="tcb-modal-tab-item-title">
<#= ( item.get('title') )? item.get('title').rendered : item.get('post_title') #>
</span>
<div class="tcb-modal-tab-image" style="background-image: url('<#= item.get('thumb').url #>');"></div>
</div>

View File

@@ -0,0 +1,48 @@
<span class="tcb-modal-title"><?php echo __( 'Choose a ', 'thrive-cb' ) ?>
<#= section_name #>
</span>
<div class="tcb-modal-tabs">
<div class="sub-header">
<ul class="tcb-modal-tabs-links">
<li data-tab="create-hf"><?php echo __( 'Create New ', 'thrive-cb' ); ?>
<#= section_name #>
</li>
</ul>
<div class="abs-r">
<input type="text" class='search-sections' name="search-sections" id="search-sections" placeholder="<?php echo __( 'Search ', 'thrive-cb' ); ?><#= section_name + 's' #>&nbsp;&hellip;">
</div>
</div>
</div>
<div class="tcb-modal-tab-container create-hf">
<div class="tcb-modal-tabs-sep">
<span><?php echo __( 'Start with one of our templates' ); ?></span>
<span class="separator"></span>
<span class="tcb-hf-icon" data-direction="top"></span>
</div>
<div class="tcb-tabs-templates">
<div class="our-templates"></div>
</div>
<div class="tcb-modal-tabs-sep">
<span><?php echo __( 'Or use a saved ', 'thrive-cb' ); ?>
<#= section_name #><?php echo __( ' as a Template' ) ?></span>
<span class="separator"></span>
<span class="tcb-hf-icon" data-direction="top"></span>
</div>
<div class="tcb-tabs-templates">
<div class="saved-templates">
<div class="tcb-modal-tab-elem click">
<span class="tcb-modal-tab-item-title"><?php echo __( 'Our Template', 'thrive-cb' ) ?></span>
<div class="tcb-modal-tab-image" style="background-image: url('');"></div>
</div>
</div>
</div>
</div>
<div class="tcb-modal-footer pl-0 pr-0">
<button type="button" class="tcb-modal-close"><?php echo __( 'Cancel', 'thrive-cb' ) ?></button>
<button type="button" disabled="true" class="tcb-hf-right tve-button white-text green"><span class="user-action"><?php echo __( 'Choose ', 'thrive-cb' ) ?></span>
<#= section_name #>
</button>
</div>

View File

@@ -0,0 +1,22 @@
<div class="tcb-modal-tabs step-two mt-0 mb-20">
<span class="tcb-modal-title m-0"><?php echo __( 'Create a new ', 'thrive-cb' ) ?><#= type #></span>
</div>
<div class="error-container"></div>
<div class="tcb-modal-tab-container step-two">
<div class="mt-20">
<div class="tcb-hf-create-title">
<span>
<?php echo __( 'Give a name to your ', 'thrive-cb' ) ?><#= type #>:
</span>
<input type="text" class="item-title" id="dashboard-create-section" placeholder="Your New <#= type.charAt(0).toUpperCase() + type.slice(1) #>'s Name">
</div>
<div class="item-create"></div>
</div>
</div>
<div class="tcb-modal-footer">
<button type="button" class="tcb-hf-back"><?php echo __( 'Back', 'thrive-cb' ) ?></button>
<a href="#" target="_blank" class="tcb-hf-right tve-button white-text green"><?php echo __( 'Add New ', 'thrive-cb' ) ?><#= type #></a>
</div>

View File

@@ -0,0 +1 @@
<div class="sections-create-container"></div>

View File

@@ -0,0 +1,9 @@
<div class="no-search-results" style="display: none;">
<?php echo __( "Oups! We couldn't find anything called " ) ?><span class="search-word"><#= message #></span><?php echo __( '. Maybe search for something else ?' ); ?>
</div>
<div class="no-sections-on-site">
<?php echo __( "You don't have any " ) ?><span class="section-type"><#= type #></span><?php echo __( ' created on the site' ) ?>
</div>
<div class="no-sections-on-cloud">
<?php echo __( "For the moment we don't have any " ) ?><span class="section-type"><#= type #></span><?php echo __( ' created' ) ?>
</div>

View File

@@ -0,0 +1,30 @@
<div class="tvd-modal-content tvd-red tcb-delete-template">
<h3 class="tvd-white-text">
<#= text #>
</h3>
<div class="tvd-v-spacer"></div>
<div class="tvd-row hidden tcb-admin-extra-setting-row">
<div class="tvd-col tvd-s12 tvd-left">
<input type="checkbox" class="noUi-target noUi-ltr noUi-horizontal noUi-background" id="tcb-admin-extra-setting-check">
<label for="tcb-admin-extra-setting-check" class="tvd-white-text"><?php echo __( 'Also delete the saved templates', 'thrive-cb' ); ?></label>
</div>
</div>
</div>
<div class="tvd-modal-footer tvd-red tcb-delete-template">
<div class="tvd-row">
<div class="tvd-col tvd-s12 tvd-m6">
<a href="javascript:void(0)"
class="tvd-btn-flat tvd-btn-flat tvd-btn-flat-secondary tvd-btn-flat-light tvd-left tvd-modal-close">
<?php echo __( "Cancel", 'thrive-cb' ); ?>
</a>
</div>
<div class="tvd-col tvd-s12 tvd-m6">
<a href="javascript:void(0)"
class="tvd-modal-submit tvd-btn-flat tvd-btn-flat-primary tvd-btn-flat-light tvd-right">
<?php echo __( 'Delete', 'thrive-cb' ); ?>
</a>
</div>
</div>
</div>
<a href="javascript:void(0)" class="tvd-modal-action tvd-modal-close tvd-modal-close-x tvd-white-text"><i class="tvd-icon-close2"></i></a>

View File

@@ -0,0 +1,95 @@
<?php
use TCB\Notifications\Main;
$has_saved_custom_content = Main::get_custom_content();
$display_image = ! $has_saved_custom_content ? 'display-image' : '';
$custom_template_id = Main::get_notification_post_id();
?>
<div class="notifications-templates-wrapper active-template">
<div class="templates-type-wrapper">
<div class="templates-type">
<span>
<?php echo __( 'Currently active template', 'thrive-cb' ) ?>
</span>
</div>
</div>
<div class="templates-wrapper">
<div class='notifications-previews-wrapper notifications-default' data-id="0">
<div class="notifications-info">
<div class="notification-title">
<?php echo __( 'Default template', 'thrive-cb' ) ?>
</div>
<span class="info-icon">
<div class="info-tooltip" style="display:none">
<?php echo __( 'The default template cannot be edited, but will<br>load leaner code on your web pages.', 'thrive-cb' ); ?>
</div>
</span>
<div class="active-badge">
<?php echo __( 'Active', 'thrive-cb' ); ?>
</div>
<button class="activate-notification-template click">
<?php echo __( 'Make active', 'thrive-cb' ); ?>
</button>
</div>
<div class='notifications-wrapper'>
<div class='notification-wrapper notification-success display-image'></div>
<div class='notification-wrapper notification-error display-image'></div>
</div>
</div>
</div>
</div>
<div class="notifications-templates-wrapper inactive-templates <?php echo $has_saved_custom_content ? ' other-templates' : '' ?>">
<div class="templates-type-wrapper">
<div class="templates-type">
<span><?php echo __( $has_saved_custom_content ? 'Other available template ' : 'Inactive templates', 'thrive-cb' ) ?></span>
<span class="info-icon">
<div class="info-tooltip" style="display:none">
<?php echo __( 'To activate a template you must<br>first press Edit and then click Save', 'thrive-cb' ); ?>
</div>
</span>
</div>
</div>
<div class="templates-wrapper">
<div class='notifications-previews-wrapper notifications-custom' data-id='<?= $custom_template_id ?>'>
<div class="notifications-info">
<div class="notification-title">
<?php echo __( 'Custom templates', 'thrive-cb' ) ?>
</div>
<span class="info-icon">
<div class="info-tooltip" style="display:none">
<?php echo __( 'Custom notification templates can be visually<br>edited to fit your website brand.', 'thrive-cb' ); ?>
</div>
</span>
<div class="active-badge">
<?php echo __( 'Active', 'thrive-cb' ); ?>
</div>
<button class="activate-notification-template click">
<?php echo __( 'Make active', 'thrive-cb' ); ?>
</button>
</div>
<div class='notifications-wrapper'>
<div class='notification-wrapper notification-success <?= $display_image ?>'>
<?php if ( $has_saved_custom_content ) {
echo Main::get_notification_content( false, 'success', true, true );
} ?>
</div>
<div class='notification-wrapper notification-warning <?= $display_image ?>'>
<?php if ( $has_saved_custom_content ) {
echo Main::get_notification_content( false, 'warning', true, true );
} ?>
</div>
<div class='notification-wrapper notification-error <?= $display_image ?>'>
<?php if ( $has_saved_custom_content ) {
echo Main::get_notification_content( false, 'error', true, true );
} ?>
</div>
<div class='actions-wrapper'>
<a class='edit-notifications' href='<#= editLink #>' target="_blank"><?php echo $has_saved_custom_content ? __( 'Edit template', 'thrive-cb' ) : __( 'Edit and activate template', 'thrive-cb' ) ?></a>
</div>
</div>
</div>
</div>
</div>

View File

@@ -0,0 +1,5 @@
<div class="symbols-categories-list">
<div class="term-item">
<?php echo __('Symbols','thrive-cb') ?>
</div>
</div>

View File

@@ -0,0 +1,11 @@
<div class="category-name">
<span class="cat-name"><#= category.get('name') #></span>
<# if ( category.get('term_id') !== 0 ) { #>
<a data-tooltip="<?php _e( 'Change Name', 'thrive-cb' ); ?>" data-position="top" class="tvd-tooltipped tvd-icon-pencil sym-cat-pen sym-pen edit-category-name"></a>
<a data-tooltip="<?php _e( 'Delete Category', 'thrive-cb' ); ?>" data-position="left" class="tvd-tooltipped sym-icon sym-delete delete-category">
<?php echo tcb_admin_icon( 'delete' ); ?>
</a>
<# } #>
</div>

View File

@@ -0,0 +1 @@
<div class="symbols-container"></div>

View File

@@ -0,0 +1,7 @@
<button class="create-category <# if ( ct_selected ) { #>sym-down<# } #>"><#= create_text #></button>
<# if ( ct_selected ) { #>
<div class="sym-btn-drop sym-move">
<span class="new-symbol"><?php echo __( 'Symbol', 'thrive-cb' ); ?></span>
<span class="new-cat"><?php echo __( 'Category', 'thrive-cb' ); ?></span>
</div>
<# } #>

View File

@@ -0,0 +1,23 @@
<div class="symbol-item modal-item" data-id="<#= item.get('id') #>">
<div class="sym-title-area">
<span class="symbol-title">
<span class="symbol-title-text"><#= item.get('title').rendered #></span>
<a data-tooltip="<?php _e( 'Change Name', 'thrive-cb' ); ?>" data-position="top" class="tvd-tooltipped tvd-icon-pencil sym-pen"></a>
</span>
<div class="sym-right-icons">
<a data-tooltip="<?php _e( 'Move to another Category', 'thrive-cb' ); ?>" data-position="top" class="tvd-tooltipped sym-icon sym-move">
<?php echo tcb_admin_icon( 'move-symbol' ); ?>
</a>
<a data-tooltip="<?php _e( 'Make a Copy', 'thrive-cb' ); ?>" data-position="top" class="tvd-tooltipped sym-icon sym-duplicate">
<?php echo tcb_admin_icon( 'duplicate' ); ?>
</a>
<a data-tooltip="<?php _e( 'Delete Symbol', 'thrive-cb' ); ?>" data-position="top" class="tvd-tooltipped sym-icon sym-delete">
<?php echo tcb_admin_icon( 'delete' ); ?>
</a>
</div>
</div>
<div style="background-image: url('<#= item.get('thumb').url #>');" class="sym-image edit-symbol" data-height="<#= item.get('thumb').h #>" data-width="<#= item.get('thumb').w #>">
<button><?php _e( 'Edit Symbol', 'thrive-cb' ); ?></button>
</div>
</div>

View File

@@ -0,0 +1,10 @@
<# if ( length === 0 ) { #>
<div class="sym-no-sym tcb-masonry-item">
<p><?php echo __( 'You have no symbols added in this category. You can either create a new symbol or move an existing symbol to this category.' ); ?></p>
<button class="sym-button open-create-modal"><?php echo __( 'Create New Symbol', 'thrive-cb' ); ?></button>
</div>
<# } else { #>
<div class="sym-add-item open-create-modal tcb-masonry-item">
<div><a class="sym-icon sym-plus"></a><?php echo __( 'Create New Symbol', 'thrive-cb' ); ?></div>
</div>
<# } #>

View File

@@ -0,0 +1,12 @@
<div class="symbols-error message-inline hf-only-admin">
<div class="tcb-notification">
<div class="tcb-notification-icon tcb-notification-icon-error">
<!-- --><?php //tcb_icon( 'close2' ) ?>
</div>
<div class="tcb-notification-content">
<div>
<pre><#= error_message #></pre>
</div>
</div>
</div>
</div>

View File

@@ -0,0 +1,5 @@
<div class="search-input-container">
<#= input_title #>: <input type="search" placeholder="<#= input_placeholder #>&hellip;" name="search-symbols" class="search-symbols">
</div>

View File

@@ -0,0 +1,20 @@
<div class="symbol-item modal-item" data-id="<#= item.get('id') #>">
<div class="sym-title-area">
<span class="symbol-title">
<span class="symbol-title-text"><#= item.get('title').rendered #></span>
<a data-tooltip="<?php _e( 'Change Name', 'thrive-cb' ); ?>" data-position="top" class="tvd-tooltipped tvd-icon-pencil sym-pen"></a>
</span>
<div class="sym-right-icons">
<a data-tooltip="<?php _e( 'Make a Copy', 'thrive-cb' ); ?>" data-position="top" class="tvd-tooltipped sym-icon sym-duplicate">
<?php echo tcb_admin_icon( 'duplicate' ); ?>
</a>
<a data-tooltip="<?php _e( 'Delete ', 'thrive-cb' ); ?>" data-position="top" class="tvd-tooltipped sym-icon sym-delete">
<?php echo tcb_admin_icon( 'delete' ); ?>
</a>
</div>
</div>
<div style="background-image: url('<#= item.get('thumb').url #>');" class="sym-image edit-symbol" data-height="<#= item.get('thumb').h #>" data-width="<#= item.get('thumb').w #>">
<button><?php _e( 'Edit ', 'thrive-cb' ); ?><#= type.charAt(0).toUpperCase() + type.substr(1) #></button>
</div>
</div>

View File

@@ -0,0 +1 @@
<div class="sections-container"></div>

View File

@@ -0,0 +1,5 @@
<div class="sections-list-items tcb-masonry-grid"></div>
<div class="no-items"></div>
<div class="create-section"><?php echo __( 'Create New', 'thrive-cb' ) ?>
<#= type.charAt( 0 ).toUpperCase() + type.slice( 1, -1 ) #>
</div>

View File

@@ -0,0 +1,4 @@
<input id="tcb-admin-edit-text" data-bind="value" type="text" value="<#= item.get('value') #>">
<label for="tcb-admin-edit-text" <# if ( item.get( 'required' ) ) { #> data-error="<?php echo sprintf( __( '%s is required', 'thrive-cb' ), "<#= item.get( 'label' ) #>" ) ?>" <# } #> class="tvd-active">
<#= ( item.get('show_label') ? item.get('label') : '&nbsp;' ) #>
</label>

View File

@@ -0,0 +1,28 @@
<div class="tvd-row">
<div class="tvd-col tvd-s4">
<span class="tvd-card-title">
<#= model.get('name') #>
</span>
<# if(_.isNumber( model.get( 'id' ) )){ #>
<span data-tooltip="<?php _e( 'Change Text', 'thrive-cb' ); ?>" data-position="top" class="tvd-tooltipped tvd-icon-pencil tvd-pointer tcb-admin-edit-category-name"></span>
<# } #>
</div>
<div class="tvd-col tvd-s8">
<# if(_.isNumber( model.get( 'id' ) )){ #>
<span data-tooltip="<?php _e( 'Delete Category', 'thrive-cb' ); ?>" data-position="left" class="tvd-tooltipped tcb-admin-delete-category-item">
<?php echo tcb_admin_icon( 'delete' ); ?>
</span>
<# } #>
</div>
</div>
<# if ( ! collection_length ) { #>
<p><?php echo __('You have no templates added in this category. You can either save elements in Architect as Content Templates or move existing templates to this category'); ?></p>
<# } #>
<div class="tcb-masonry-grid fill-content tcb-admin-template-t-item"></div>
<div class="tvd-row tcb-admin-show-more-less hidden">
<div class="tvd-col tvd-s12 tvd-center">
<span class="tvd-pointer tcb-admin-show-more-less-btn"><?php echo __( ' Show more templates', 'thrive-cb' ) ?></span>
</div>
</div>

View File

@@ -0,0 +1,19 @@
<div class="tvd-row">
<div class="tvd-col tvd-s12">
<h3>
<#= model.get('name') #>
</h3>
</div>
</div>
<div class="tvd-row">
<div class="tvd-col tvd-s12 tcb-admin-template-preview">
<img src="<#= model.get('thumb') ? model.get('thumb').url : model.get('image_url') #>" alt="Template Image">
</div>
</div>
<div class="tvd-row">
<div class="tvd-col tvd-s12">
<a href="#templatessymbols" class="tvd-btn-flat tvd-btn-flat-primary tvd-btn-flat-dark tvd-waves-effect">
&laquo; <?php echo __( 'Back to templates & symbols', 'thrive-cb' ); ?>
</a>
</div>
</div>

View File

@@ -0,0 +1 @@
<div class="tvd-row" id="tcb-user-template-list"></div>

View File

@@ -0,0 +1,20 @@
<div class="tvd-ct-elem">
<div>
<div class="tcb-admin-template-name">
<span class="tvd-card-title">
<#= model.get('name') #>
</span>
<span data-tooltip="<?php _e( 'Change Text', 'thrive-cb' ); ?>" data-position="top" class="tvd-tooltipped tvd-icon-pencil tvd-pointer tcb-admin-edit-template-name"></span>
</div>
<a data-tooltip="<?php _e( 'Move to another Category', 'thrive-cb' ); ?>" data-position="top" class="tvd-tooltipped">
<?php echo tcb_admin_icon( 'move-symbol' ); ?>
</a>
<a data-tooltip="<?php _e( 'Delete Template', 'thrive-cb' ); ?>" data-position="top" class="tvd-tooltipped tcb-admin-delete-template-item">
<?php echo tcb_admin_icon( 'delete' ); ?>
</a>
</div>
<div class="tcb-admin-image-overlay-wrapper">
<img src="<#= model.get('thumb') && model.get('thumb').url ? model.get('thumb').url : model.get('image_url') #>" class="sym-image" data-height="<#= model.get('thumb').h || 120 #>" data-width="<#= model.get('thumb').w || 250 #>"/>
<a class="tcb-admin-preview-text" href="#template/<#= model.get('id') #>"><?php echo __( 'Preview', 'thrive-cb' ); ?></a>
</div>
</div>

View File

@@ -0,0 +1 @@
<?php return ['dependencies' => ['wp-api-fetch', 'wp-block-editor', 'wp-blocks', 'wp-components', 'wp-data', 'wp-i18n', 'wp-polyfill'], 'version' => 'f4c89192d85a25d9918f4549e44971c5'];

File diff suppressed because one or more lines are too long

View File

@@ -0,0 +1,411 @@
/* global TCB_Post_Edit_Data */
import tarLogo from './logo';
import {getTerm, getPreviewLink, maxNrOfPosts} from './utils';
import {__} from '@wordpress/i18n';
import {
Button,
Icon,
SelectControl,
TextControl,
} from '@wordpress/components';
import apiFetch from '@wordpress/api-fetch';
const createElement = wp.element.createElement;
/**
* Whether or not the blur is triggered by clicking the search icon
* @type {boolean}
*/
let isBlurOverSearch = false;
const renderAddBlock = ( props ) => {
if ( ! props.posts ) {
return __( 'Loading …', 'thrive-cb' );
}
let defaultLabel = 'No matching results';
if ( props.posts && props.posts.length ) {
if ( props.attributes.searchBlockSel ) {
defaultLabel = `-- ${props.posts.length} blocks found --`;
} else {
defaultLabel = `-- Select a block --`;
}
}
const options = [ {value: 0, label: __( defaultLabel, 'thrive-cb' )} ];
props.posts.forEach( ( post ) => {
options.push( {value: post.id, label: post.title.raw} );
} );
return [
createElement(
'div',
{
class: 'tar-new-block-container',
},
tarLogo(),
createElement(
'div',
{
class: 'tar-block-title',
},
createElement( 'h2', {}, 'Thrive Block' )
),
createElement(
'div',
{
class: 'tar-new-block-description',
},
__(
'Select a template from your Thrive Symbols & Blocks Library or create a new one',
'thrive-cb'
)
),
createElement(
'div',
{
class: 'tar-block-content tve-show-saved',
},
createElement(
'div',
{
class: 'tar-block-tabs',
},
createElement(
'a',
{
class: 'tar-block-tab tar-block-tab-saved',
href: 'javascript:void(0)',
onClick: ( event ) => {
const el = event.target.closest(
'.tar-block-content'
);
el.classList.add( 'tve-show-saved' );
el.classList.remove( 'tve-show-create' );
event.stopPropagation();
event.preventDefault();
},
},
__( 'Saved blocks', 'thrive-cb' )
),
createElement(
'a',
{
class: 'tar-block-tab tar-block-tab-create',
href: 'javascript:void(0)',
onClick: ( event ) => {
const el = event.target.closest(
'.tar-block-content'
);
el.classList.add( 'tve-show-create' );
el.classList.remove( 'tve-show-saved' );
event.stopPropagation();
event.preventDefault();
},
},
__( 'Create a new block', 'thrive-cb' )
)
),
createElement(
'div',
{
class: 'tar-block-tabs-content',
},
createElement(
'div',
{
class: 'tar-block-tabs-content-saved',
},
createElement(
'div',
{
class: 'tar-block-search-container',
},
createElement( TextControl, {
placeholder: __(
'Filter block list',
'thrive-cb'
),
isPressEnterToChange: true,
onChange( content ) {
const data = {
searchText: content,
};
props.setAttributes( data );
},
onFocus( event ) {
isBlurOverSearch = false;
const container = event.target.closest(
'.tar-block-search-container'
);
container
.getElementsByClassName(
'tar-block-clear-button'
)[ 0 ]
.classList.add( 'hidden' );
container
.getElementsByClassName(
'tar-block-search-button'
)[ 0 ]
.classList.remove( 'hidden', 'opacity' );
},
onBlur( event ) {
isBlurOverSearch =
event.relatedTarget &&
event.relatedTarget.classList.contains(
'tar-block-search-button'
);
if ( ! isBlurOverSearch ) {
const container = event.target.closest(
'.tar-block-search-container'
),
clearEl = container.getElementsByClassName(
'tar-block-clear-button'
)[ 0 ],
searchEl = container.getElementsByClassName(
'tar-block-search-button'
)[ 0 ];
clearEl.classList.toggle(
'hidden',
! props.attributes.searchText.length
);
searchEl.classList.toggle(
'hidden',
props.attributes.searchText.length
);
searchEl.classList.add(
'opacity'
);
}
},
onKeyDown( event ) {
/**
* On enter press trigger the search
*/
if ( event.which === 13 ) {
props.setAttributes( {
searchText: event.target.value,
searchBlockSel: event.target.value,
} );
}
},
className: 'tar-block-search-input',
value: props.attributes.searchText,
} ),
createElement(
'a',
{
href: 'javascript:void(0)',
class: `tar-block-search-button ${
props.attributes.searchText
? 'hidden'
: 'opacity'
}`,
onClick() {
props.setAttributes( {
searchBlockSel:
props.attributes.searchText,
} );
},
},
createElement( Icon, {icon: 'search'} )
),
createElement(
'a',
{
href: 'javascript:void(0)',
className: `tar-block-clear-button ${
props.attributes.searchText
? ''
: 'hidden'
} `,
onClick() {
props.setAttributes( {
searchText: '',
searchBlockSel: '',
} );
},
},
createElement( Icon, {icon: 'no-alt'} )
)
),
createElement(
'div',
{
class: 'tar-block-select-wrapper',
},
createElement( SelectControl, {
options,
onChange( value ) {
props.setAttributes( {
selectedBlock: parseInt( value ),
} );
},
value: props.attributes.selectedBlock,
} )
),
createElement(
'div',
{
class: `tar-block-number-warning ${
TCB_Post_Edit_Data.symbols_number <
maxNrOfPosts()
? 'hidden'
: ''
}`,
},
createElement( Icon, {icon: 'info'} ),
createElement(
'span',
{},
__(
'Displaying maximum 50 results. Try Filtering the list.',
'thrive-cb'
)
)
)
),
createElement(
'div',
{
class: 'tar-block-tabs-content-create',
},
createElement(
'div',
{
class: 'tar-block-create-description',
},
__(
'Enter a name for your new block:',
'thrive-cb'
)
),
createElement(
'div',
{
class: 'tar-block-create-input',
},
createElement( TextControl, {
type: 'text',
placeholder: __(
'Enter new block title',
'thrive-cb'
),
onChange( content ) {
props.setAttributes( {
blockTitle: content,
} );
},
className: 'tar-block-create-input',
value: props.attributes.blockTitle,
} ),
createElement(
Button,
{
className: 'tar-create-block-button',
type: 'button',
onClick( event ) {
const errorDom = event.target
.closest(
'.tar-new-block-container'
)
.getElementsByClassName(
'tar-block-error'
)[ 0 ],
term = getTerm( 'gutenberg-block' ),
gutenbergTermID = term
? term.term_id
: '';
errorDom.textContent = '';
errorDom.classList.remove(
'tve-show-error'
);
apiFetch( {
path: `/${TCB_Post_Edit_Data.rest_routes.symbols_short_path}`,
method: 'POST',
data: {
title:
props.attributes.blockTitle,
tcb_symbols_tax: gutenbergTermID,
status: 'publish',
},
} )
.then( ( data ) => {
props.setAttributes( {
selectedBlock: parseInt(
data.id
),
previewLink: getPreviewLink(
data.permalink_template
),
editLink: data.edit_url,
} );
window.open(
data.edit_url,
'_blank'
);
} )
.catch( function ( data ) {
errorDom.textContent =
data.message;
errorDom.classList.add(
'tve-show-error'
);
} );
},
},
__( 'Create Block', 'thrive-cb' )
)
),
createElement(
'span',
{
className:
'tar-block-error tar-block-number-warning',
},
'Error'
)
)
)
),
createElement(
'div',
{
class: 'tar-block-go-dash',
},
__( 'Go to the ', 'thrive-cb' ),
createElement(
'a',
{
href: TCB_Post_Edit_Data.symbols_dash,
target: '_blank',
},
__( 'Symbols Dashboard', 'thrive-cb' )
)
)
),
];
};
export default renderAddBlock;

View File

@@ -0,0 +1,121 @@
import {tveOuterHeight, getPreviewLink} from './utils';
import {__} from '@wordpress/i18n';
import {PanelBody, PanelRow} from '@wordpress/components';
import {InspectorControls} from '@wordpress/block-editor';
const createElement = wp.element.createElement;
const previewBlock = ( props ) => {
let previewLink = props.attributes.previewLink;
const selectedPost = props.posts ? props.posts.find(
( post ) =>
Number( post.id ) === Number( props.attributes.selectedBlock )
) : 0;
if ( selectedPost ) {
props.setAttributes( {
previewLink: selectedPost.link,
editLink: selectedPost.edit_url,
} );
}
const editLink = props.attributes.editLink;
if ( previewLink ) {
previewLink = getPreviewLink( previewLink );
}
return [
createElement(
InspectorControls,
null,
createElement(
PanelBody,
{
title: __( 'Block settings', 'thrive-cb' ),
initialOpen: true,
},
createElement(
PanelRow,
{},
createElement(
'a',
{
class:
'thrive-architect-edit-link tcb-enable-editor',
'data-id': props.attributes.selectedBlock,
href: editLink,
target: '_blank',
},
createElement(
'div',
{
class: 'thrive-architect-admin-icon-holder',
},
createElement( 'div', {
class: 'thrive-architect-admin-icon',
} )
),
createElement(
'div',
{
class:
'thrive-architect-admin-text tve-block-edit',
},
__( 'Edit block with Architect', 'thrive-cb' )
)
)
)
)
),
createElement( 'iframe', {
src: previewLink,
id: `architect-block-${props.attributes.selectedBlock}`,
class: `${props.attributes.className} architect-block-preview architect-block-${props.attributes.selectedBlock}`,
scrolling: 'no',
onLoad() {
const iframes = document.getElementsByClassName(
`architect-block-${props.attributes.selectedBlock}`
);
/**
* in case of duplicate / copy-paste
*/
Array.prototype.forEach.call( iframes, ( iframe ) => {
const iframeDocument = iframe.contentDocument,
setHeight = () => {
const height = tveOuterHeight( iframeDocument.body );
iframe.style.setProperty(
'height',
`${height}px`
);
iframe.parentNode.style.setProperty(
'height',
`${height}px`
);
};
iframe.style.setProperty(
'pointer-events',
'none'
);
setHeight();
/**
* in case there is content loaded via ajax calls
*/
setTimeout( () => {
setHeight();
}, 3000 );
if ( iframe.contentWindow.TVE_Dash ) {
iframe.contentWindow.TVE_Dash.forceImageLoad( iframeDocument );
}
} );
},
}
),
];
};
export default previewBlock;

View File

@@ -0,0 +1,83 @@
import { __ } from '@wordpress/i18n';
import { registerBlockType } from '@wordpress/blocks';
import { withSelect } from '@wordpress/data';
import tarLogo from './logo';
import previewBlock from './block-preview';
import renderAddBlock from './add-block';
import { maxNrOfPosts } from './utils';
/* global TCB_Post_Edit_Data */
/* global TAR_Block */
registerBlockType( 'thrive/architect-block', {
title: __( 'Thrive Architect Block', 'thrive-cb' ),
icon: tarLogo,
description: __(
'Add Thrive templates, symbols and blocks to your content!',
'thrive-cb'
),
category: 'thrive',
attributes: {
selectedBlock: {
type: 'number',
default: 0,
},
blockTitle: {
type: 'string',
default: '',
},
searchText: {
type: 'string',
default: '',
},
searchBlockSel: {
type: 'string',
default: '',
},
previewImage: {
type: 'boolean',
default: false,
},
},
example: {
attributes: {
previewImage: true,
},
},
edit: withSelect( function( select, props ) {
const searchTextSel = props.attributes.searchBlockSel,
query = {
per_page: maxNrOfPosts(),
search: searchTextSel,
tcb_symbols_tax_exclude: TCB_Post_Edit_Data.sections_tax_terms.map(
( term ) => term.term_id
),
};
return {
posts: select( 'core' ).getEntityRecords(
'postType',
'tcb_symbol',
query
),
};
} )( function( props ) {
if ( props.attributes.previewImage ) {
return [
wp.element.createElement( 'img', {
src: TAR_Block.block_preview,
} ),
];
}
if ( props.attributes.selectedBlock ) {
return previewBlock( props );
}
return renderAddBlock( props );
} ),
// How our block renders on the frontend
save: () => {
return null;
},
} );

View File

@@ -0,0 +1,55 @@
const createElement = wp.element.createElement;
export default ( function() {
return createElement(
'svg',
{
width: 82,
height: 84,
viewBox: '0 0 82 84',
id: 'tar-logo',
},
createElement(
'defs',
{},
createElement( 'path', {
id: 'bqp31b3asa',
d: 'M0.476 0.473L65.942 0.473 65.942 80.475 0.476 80.475z',
} )
),
createElement(
'g',
{
fill: 'none',
'fill-rule': 'evenodd',
},
createElement(
'g',
{},
createElement(
'g',
{},
createElement(
'g',
{
transform:
'translate(-445 -188) translate(445 188) translate(16)',
},
createElement( 'path', {
fill: '#434343',
d:
'M65.942 80.475h-.932c-10.17 0-19.239-6.417-22.641-16.018L28.638 25.721 20.41 48.926c-2.23.393-4.27.806-5.524 1.078-2.902.607-6.712 1.46-9.536 2.588-1.666.67-3.278 1.335-4.875 2.086L19.687.473h17.9l28.355 80.002z',
mask: 'url(#chmlltq7cb)',
} )
),
createElement( 'path', {
fill: '#58A245',
d:
'M48 52.836c-.852.014-1.177.126-1.785.365-.697.26-1.415.74-1.958 1.215l-1.33 1.265c-.126.124-.125.147-.219.267-2.479 3.064-3.035 3.554-4.983 7.434-.907 1.81-1.945 3.502-3.066 5.17-.771 1.136-1.475 2.284-2.349 3.348-.086.11-.146.16-.232.258-.537.665-1.23 1.263-1.872 1.836-.43.385-.964.755-1.457 1.086-.424.269-.831.566-1.304.812l-.694.37c-.15.087-.196.136-.347.207-.111.05-.225.113-.335.163-.135.061-.26.099-.4.162-2.753 1.375-6.385 2.271-9.53 2.644l-1.937.235c-.563.084-2.103.158-3.517.181-1.18.02-2.268 0-2.619-.063l.215-.542c.456-1.025.969-2.027 1.527-2.994.098-.155.144-.288.256-.457l1.134-1.87 2.837-3.884 2.582-2.664c.073-.072.11-.121.185-.196.11-.096.124-.084.224-.17l.603-.513c.087-.059.123-.095.224-.158.16-.122.23-.194.393-.317l2.748-1.876c.919-.602 1.91-1.152 2.854-1.696l2.975-1.593c1.117-.554 3.04-1.552 4.098-2.002l3.106-1.43c-.45.049-1.033.305-1.456.454-.5.167-.935.316-1.435.48l-2.824 1.002c-1.381.468-2.75 1.088-4.09 1.624l-2.6 1.156c-.968.397-2.485 1.18-3.463 1.73-1.103.606-2.142 1.317-3.223 1.955l-3.598 2.51c-.087.065-.174.122-.26.187L9.04 70.244c-.604.62-1.318 1.216-1.885 1.871-.098.121-.098.146-.221.268-.529.538-.992 1.14-1.448 1.735-.671.895-1.294 1.825-1.866 2.778l-.947 1.775C2.3 79.419.758 83.005.687 83.998L.573 84c-.003-.13-.43-1.76-.553-3.165L0 79.671c0-.033.01-.071.008-.117.1-.757.08-1.257.24-2.218.39-2.647 1.544-5.32 3.047-7.572l1.541-2.175c.43-.569 2.099-2.427 2.595-2.803.482-.38.91-.949 1.429-1.33.223-.167.445-.402.692-.586.258-.193.444-.377.704-.562l1.472-1.076c1.496-1.077 3.104-2.034 4.77-2.865 1.777-.879 3.542-1.6 5.394-2.327 2.414-.945 5.668-1.657 8.154-2.166 2.621-.56 9.261-1.804 12.456-1.856l.686-.012c1.655-.028 4.21.003 4.812.83',
transform: 'translate(-445 -188) translate(445 188)',
} )
)
)
)
);
} );

View File

@@ -0,0 +1,23 @@
const createElement = wp.element.createElement;
export default ( function () {
return createElement(
'svg',
{
width: 26,
height: 18,
viewBox: '0 0 26 18',
id: 'thrive-logo',
},
createElement(
'g',
{
transform: 'translate(-398.000000, -80.000000)',
fill: '#58a245'
},
createElement( 'path', {
d: 'M424,80.4527444 C423.538615,80.4604108 423.362362,80.5211525 423.033016,80.6505972 C422.655847,80.7915415 422.266647,81.0516103 421.972793,81.3084356 L421.251841,81.9936963 C421.183866,82.060925 421.184167,82.0733092 421.133637,82.1387687 C419.790687,83.7979606 419.489313,84.0633369 418.434203,86.1651175 C417.943342,87.1452408 417.380897,88.0619686 416.773637,88.9654276 C416.355864,89.5811007 415.974484,90.2026711 415.501369,90.7791275 C415.454749,90.8389846 415.421965,90.8658171 415.375345,90.9188923 C415.084498,91.2789196 414.709134,91.6032684 414.361441,91.913169 C414.128643,92.1222266 413.8393,92.3224383 413.572514,92.5017148 C413.342724,92.6473769 413.122258,92.808077 412.8663,92.9416498 L412.490334,93.1421563 C412.409126,93.1890395 412.383861,93.2155771 412.302051,93.2542041 C412.241896,93.2810366 412.180539,93.3152407 412.120685,93.3423681 C412.047597,93.3753927 411.980224,93.3957382 411.904129,93.4299422 C410.412898,94.1747652 408.445544,94.6604039 406.741667,94.8623848 L405.692572,94.9897654 C405.387589,95.0348794 404.553547,95.0749807 403.78778,95.0876598 C403.148938,95.0982748 402.559123,95.0873649 402.369336,95.0534557 L402.485735,94.7597726 C402.732669,94.2048412 403.010282,93.6619991 403.31286,93.1380283 C403.365796,93.0542873 403.39076,92.9823408 403.451215,92.8906385 L404.065393,91.8780804 L405.602341,89.773646 L407.000633,88.3308833 C407.040335,88.2916666 407.060186,88.265129 407.101091,88.2247328 C407.160944,88.1725421 407.168163,88.1793239 407.222302,88.1330305 L407.549242,87.8549751 C407.596162,87.8228351 407.615713,87.8030793 407.670152,87.7691701 C407.757076,87.702826 407.795274,87.6639041 407.8834,87.59756 L409.371623,86.5814635 C409.869402,86.2553455 410.406582,85.9572394 410.917594,85.6623768 L412.529134,84.7999037 C413.134289,84.4994387 414.176165,83.9589555 414.748836,83.715399 L416.431358,82.9410899 C416.188033,82.9670378 415.871921,83.105918 415.642431,83.1867104 C415.371435,83.2769384 415.136231,83.3580256 414.865235,83.4461895 L413.335806,83.9893264 C412.587484,84.2429082 411.84638,84.5784619 411.120315,84.8689015 L409.711797,85.4951897 C409.187851,85.7104394 408.36614,86.1344518 407.836179,86.432263 C407.238845,86.7604451 406.675798,87.1455357 406.090495,87.4911146 L404.141187,88.8507261 C404.094267,88.8861096 404.047046,88.9170702 404.000125,88.9521588 L402.897192,89.8821554 C402.569951,90.2177091 402.183158,90.5408785 401.87637,90.8955982 C401.822832,90.9613526 401.823133,90.9749162 401.756361,91.0406706 C401.470026,91.3319948 401.219181,91.6581129 400.971946,91.9803977 C400.608613,92.4654467 400.271146,92.9693669 399.96135,93.4853764 L399.448533,94.4466285 C399.245211,94.8520646 398.410567,96.7946194 398.372369,97.3324487 L398.310409,97.3333333 C398.308906,97.263156 398.077311,96.3803374 398.01084,95.6190022 L398,94.9882911 C397.999711,94.9705993 398.005125,94.9499589 398.004524,94.9251905 C398.058061,94.5150366 398.047835,94.2440579 398.133856,93.7236254 C398.3456,92.2897086 398.970906,90.8419332 399.784797,89.6223815 L400.619742,88.4441105 C400.852239,88.1359791 401.756361,87.1296131 402.025252,86.9255682 C402.286022,86.7200489 402.518519,86.4119175 402.79914,86.204924 C402.920051,86.1149909 403.040059,85.9876102 403.174203,85.8876518 C403.313762,85.7832705 403.414521,85.6839018 403.555282,85.5836485 L404.352931,85.0004103 C405.163213,84.417172 406.03425,83.8988036 406.936568,83.4488433 C407.89874,82.972935 408.855197,82.5825369 409.857972,82.1886005 C411.165732,81.676719 412.92856,81.2910388 414.275119,81.0150474 C415.694766,80.7119286 419.291405,80.0381676 421.02175,80.0095659 L421.393505,80.0033738 C422.290108,79.9883358 423.673662,80.005143 424,80.4527444',
} )
),
);
} );

View File

@@ -0,0 +1,82 @@
/* global TCB_Post_Edit_Data */
import thriveLogo from './thrive-logo';
/**
* Once an block is update try to update the preview in gutenberg too
*/
window.addEventListener(
'storage',
( storageEvent ) => {
if (
storageEvent.key &&
storageEvent.key.includes( 'thrive_symbol' )
) {
const id = storageEvent.key.split( '-' )[ 1 ],
iframes = document.getElementsByClassName(
`architect-block-${id}`
);
/**
* in case of duplicate / copy-paste
*/
Array.prototype.forEach.call( iframes, ( iframe ) => {
iframe.setAttribute(
'src',
`${iframe.getAttribute(
'src'
)}?tcb=${generateRandomString()}`
);
} );
localStorage.removeItem( storageEvent.key );
}
},
false
);
if ( wp.domReady && typeof wp.domReady === 'function' ) {
wp.domReady( function () {
wp.blocks.updateCategory( 'thrive', {icon: thriveLogo} );
} );
}
/**
* Helper functions
*/
export function tveOuterHeight( el ) {
if ( ! el ) {
return 0;
}
let height = el.offsetHeight;
const style = getComputedStyle( el );
height += parseInt( style.marginTop ) + parseInt( style.marginBottom );
return height;
}
export function generateRandomString( radix = 16 ) {
return (
new Date().getTime() + Math.floor( Math.random() * 100000 )
).toString( radix );
}
export function getPreviewLink( link ) {
return `${link}${
link.split( '?' )[ 1 ] ? '&' : '?'
}tve_block_preview=1`;
}
export function getTerm( slug ) {
return TCB_Post_Edit_Data.symbols_tax_terms.find(
( term ) => term.slug === slug
);
}
export function maxNrOfPosts() {
return 50;
}

View File

@@ -0,0 +1,33 @@
<?php
if ( ! defined( 'ABSPATH' ) ) {
exit( 1 );
}
$icon_pack = get_option( 'thrive_icon_pack' );
if ( ! empty( $icon_pack ) && ! empty( $icon_pack['folder'] ) ) {
$css_file = trailingslashit( $icon_pack['folder'] ) . basename( $icon_pack['css'] );
$old_umask = umask( 0 );
if ( is_file( $css_file ) && is_writable( $css_file ) ) {
$file_contents = file_get_contents( $css_file );
$font_family = $icon_pack['fontFamily'];
$file_contents = str_replace( "font-family: '{$font_family}' !important;", "font-family: '{$font_family}';", $file_contents );
$search = "font-family: '{$font_family}';";
$replacement = "font-family: '{$font_family}' !important;";
$position_found = strpos( $file_contents, $search, strpos( $file_contents, 'url' ) );
if ( $position_found ) {
$file_contents = substr_replace( $file_contents, $replacement, $position_found, strlen( $search ) );
}
if ( file_put_contents( $css_file, $file_contents ) ) {
$icon_pack['css_version'] = rand( 1, 9 ) . '.' . str_pad( rand( 1, 99 ), 2, '0', STR_PAD_LEFT );
update_option( 'thrive_icon_pack', $icon_pack );
}
}
}

View File

@@ -0,0 +1,2 @@
<?php
// silence is golden

View File

@@ -0,0 +1,16 @@
<?php
if ( ! defined( 'ABSPATH' ) ) {
exit( 1 );
}
/** @var TD_DB_Migration $installer */
$installer = $this;
$installer->create_table( 'api_error_log', '
`id` INT( 11 ) AUTO_INCREMENT,
`date` DATETIME NULL,
`error_message` VARCHAR( 400 ) NULL,
`api_data` TEXT NULL,
`connection` VARCHAR( 64 ) NULL,
`list_id` VARCHAR( 255 ) NULL,
PRIMARY KEY( `id` )' );

View File

@@ -0,0 +1,8 @@
<?php
if ( ! defined( 'ABSPATH' ) ) {
exit( 1 );
}
/* delete this option, as it was saved incorrectly before this version. This will be rebuilt when users select a menu template */
delete_option( 'tve_menu_item_templates' );

View File

@@ -0,0 +1 @@
@keyframes slide-wobble{0%{transform:translateX(30%);opacity:0}25%{transform:translateX(-15%)}50%{transform:translateX(10%)}75%{transform:translateX(-5%)}100%{transform:translateX(0%);opacity:1}}@keyframes fade-out{0%{transform:translateX(0%);opacity:1}25%{transform:translateX(-5%)}100%{transform:translateX(100%);opacity:0}}html{overflow-y:auto !important;overflow-x:hidden !important}html::-webkit-scrollbar{width:14px;height:8px}html::-webkit-scrollbar-track{background:rgba(0,0,0,0)}html::-webkit-scrollbar-thumb{height:23px;border:4px solid rgba(0,0,0,0);background-clip:padding-box;-webkit-border-radius:7px;background-color:rgba(0,0,0,.15);-webkit-box-shadow:inset -1px -1px 0px rgba(0,0,0,.05),inset 1px 1px 0px rgba(0,0,0,.05)}body{height:auto !important;background:#fff !important}.meta-box-sortables:last-child>div:last-child{margin-bottom:0}#major-publishing-actions,#minor-publishing-actions{display:none !important}#minor-publishing{padding-top:10px !important;padding-bottom:10px !important}#slugdiv .inside,#authordiv .inside,#postcustom .inside{padding-top:10px !important}#poststuff .inside{margin:0 !important;padding-top:1px;border:1px solid #c3c4c7 !important;border-top:none !important}#poststuff .postbox{margin-bottom:0 !important;border:none !important}#poststuff .postbox-header>h2{cursor:pointer !important;padding:16px 12px}#poststuff .very-hidden{display:none !important}#post{margin-bottom:0 !important}#wpfooter{display:none}

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

View File

@@ -0,0 +1 @@
body.tve_editor_page .tve_p_lb_background{z-index:auto;top:0;position:static}.tve_p_lb_content{cursor:pointer}.tve_p_lb_content.edit_mode{outline:1px solid #2ecc71}.tve_p_lb_content.active_highlight{outline:1px solid #1da5e5}#tve_editor .tve_p_lb_control:empty{min-height:40px;border:1px dotted green}#tve_editor .tve_p_lb_control:empty:before{content:"Drag and drop content here";display:block;text-align:center}

File diff suppressed because one or more lines are too long

After

Width:  |  Height:  |  Size: 381 KiB

View File

@@ -0,0 +1,422 @@
<svg style="position: absolute; width: 0; height: 0; overflow: hidden;" version="1.1"
xmlns="http://www.w3.org/2000/svg">
<defs>
<symbol id="tcb-icon-save" viewBox="0 0 448 512">
<path d="M433.941 129.941l-83.882-83.882A48 48 0 0 0 316.118 32H48C21.49 32 0 53.49 0 80v352c0 26.51 21.49 48 48 48h352c26.51 0 48-21.49 48-48V163.882a48 48 0 0 0-14.059-33.941zM288 64v96H96V64h192zm128 368c0 8.822-7.178 16-16 16H48c-8.822 0-16-7.178-16-16V80c0-8.822 7.178-16 16-16h16v104c0 13.255 10.745 24 24 24h208c13.255 0 24-10.745 24-24V64.491a15.888 15.888 0 0 1 7.432 4.195l83.882 83.882A15.895 15.895 0 0 1 416 163.882V432zM224 232c-48.523 0-88 39.477-88 88s39.477 88 88 88 88-39.477 88-88-39.477-88-88-88zm0 144c-30.879 0-56-25.121-56-56s25.121-56 56-56 56 25.121 56 56-25.121 56-56 56z"></path>
</symbol>
<symbol id="tcb-icon-progress_bar" viewBox="0 0 32 32">
<path d="M20.479 15.25h-16.146c-0.414 0-0.75 0.336-0.75 0.75s0.336 0.75 0.75 0.75h16.146c0.414 0 0.75-0.336 0.75-0.75s-0.336-0.75-0.75-0.75z"/>
<path d="M29.408 11.133h-26.816c-1.47 0-2.665 1.196-2.665 2.666v4.403c0 1.47 1.195 2.665 2.665 2.665h26.816c1.47 0 2.665-1.195 2.665-2.665v-4.403c0-1.47-1.195-2.666-2.665-2.666zM30.573 18.202c0 0.643-0.522 1.165-1.165 1.165h-26.816c-0.643 0-1.165-0.523-1.165-1.165v-4.403c0-0.643 0.522-1.166 1.165-1.166h26.816c0.643 0 1.165 0.523 1.165 1.166v4.403z"/>
</symbol>
<symbol id="tcb-icon-countdown" viewBox="0 0 32 32">
<path d="M29.749 4.496h-1.124v-1.921c0-1.289-1.048-2.337-2.337-2.337h-23.963c-1.289 0-2.337 1.048-2.337 2.337v22.835c0 1.289 1.048 2.338 2.337 2.338h1.123v1.922c0 1.289 1.049 2.338 2.338 2.338h23.963c1.289 0 2.337-1.049 2.337-2.338v-22.836c0-1.289-1.048-2.338-2.337-2.338zM2.325 1.737h23.963c0.462 0 0.837 0.375 0.837 0.837v8.707h-1.471v1.961h-5.853c0.101-0.232 0.189-0.463 0.258-0.689 0.149-0.501 0.225-1.030 0.225-1.588 0-1.013-0.26-1.82-0.779-2.419-0.52-0.599-1.209-0.899-2.071-0.899-0.548 0-1.066 0.121-1.551 0.363s-0.986 0.653-1.501 1.233l0.804 1.309c0.435-0.456 0.818-0.772 1.15-0.946 0.331-0.174 0.674-0.262 1.029-0.262 0.443 0 0.791 0.16 1.042 0.481s0.377 0.76 0.377 1.317c0 0.406-0.053 0.786-0.158 1.14-0.090 0.302-0.234 0.624-0.414 0.96h-6.914v-5.418h-1.241l-2.724 2.854 0.748 1.258c0.807-0.872 1.28-1.391 1.422-1.554s0.261-0.313 0.358-0.448c-0.034 0.558-0.051 1.312-0.051 2.263v1.044h-6.904v-1.961h-1.418v-8.705c0-0.462 0.375-0.838 0.837-0.838zM1.488 25.41v-8.435h1.418v-2.233h6.903v5.427h1.488v-5.427h5.943c-0.157 0.222-0.329 0.46-0.522 0.724l-2.388 3.201v1.503h6.277v-1.748h-4.396v-0.084l1.608-2.078c0.468-0.587 0.84-1.087 1.135-1.518h6.699v2.233h1.471v8.435c0 0.462-0.375 0.838-0.837 0.838h-23.962c-0.462 0-0.837-0.376-0.837-0.838zM30.586 29.67c0 0.462-0.375 0.838-0.837 0.838h-23.963c-0.462 0-0.838-0.376-0.838-0.838v-1.922h21.34c1.289 0 2.337-1.049 2.337-2.338v-19.414h1.124c0.462 0 0.837 0.376 0.837 0.838v22.836z"/>
</symbol>
<symbol id="tcb-icon-pricing_box" viewBox="0 0 32 32">
<path d="M25.704 3.432h-3.049v-1.74c0-0.913-0.742-1.656-1.654-1.656h-14.706c-0.912 0-1.654 0.743-1.654 1.656v25.224c0 0.913 0.742 1.655 1.654 1.655h3.050v1.741c0 0.912 0.743 1.653 1.655 1.653h14.704c0.913 0 1.655-0.741 1.655-1.653v-25.225c0-0.913-0.742-1.655-1.655-1.655zM6.295 27.070c-0.085 0-0.154-0.069-0.154-0.155v-25.224c0-0.086 0.069-0.156 0.154-0.156h14.706c0.085 0 0.154 0.070 0.154 0.156v1.74h-10.155c-0.913 0-1.655 0.743-1.655 1.655v21.984h-3.050zM25.859 30.312c0 0.086-0.068 0.153-0.155 0.153h-14.704c-0.085 0-0.155-0.068-0.155-0.153v-25.225c0-0.085 0.070-0.155 0.155-0.155h14.704c0.087 0 0.155 0.068 0.155 0.155v25.225z"/>
<path d="M20.591 20.754c-0.234-0.234-0.537-0.433-0.908-0.597-0.194-0.084-0.593-0.201-1.194-0.351v-3.442c0.39 0.080 0.695 0.244 0.919 0.494s0.37 0.609 0.441 1.078l1.233-0.185c-0.106-0.756-0.42-1.351-0.941-1.784-0.407-0.34-0.958-0.544-1.652-0.61v-0.57h-0.702v0.57c-0.792 0.080-1.389 0.296-1.791 0.65-0.601 0.526-0.902 1.214-0.902 2.063 0 0.478 0.102 0.904 0.308 1.279 0.206 0.376 0.499 0.67 0.879 0.883 0.513 0.287 1.015 0.478 1.506 0.57v3.8c-0.47-0.049-0.872-0.285-1.208-0.709-0.234-0.301-0.398-0.771-0.491-1.413l-1.2 0.226c0.044 0.619 0.202 1.143 0.474 1.571 0.272 0.43 0.594 0.74 0.968 0.933 0.374 0.192 0.859 0.325 1.456 0.401v1.193h0.702v-1.207c0.836-0.040 1.517-0.336 2.043-0.889s0.789-1.242 0.789-2.069c0-0.376-0.063-0.725-0.188-1.048-0.126-0.323-0.307-0.603-0.541-0.837zM17.786 19.653c-0.544-0.164-0.931-0.383-1.158-0.656-0.228-0.274-0.342-0.615-0.342-1.022 0-0.411 0.134-0.768 0.401-1.068s0.633-0.486 1.098-0.557v3.303zM19.64 23.997c-0.303 0.345-0.687 0.546-1.151 0.603v-3.634c0.642 0.207 1.069 0.443 1.284 0.706 0.214 0.263 0.321 0.611 0.321 1.045 0 0.509-0.152 0.935-0.454 1.28z"/>
<path d="M20.828 8.054h-4.952c-0.414 0-0.75 0.336-0.75 0.75s0.336 0.75 0.75 0.75h4.952c0.414 0 0.75-0.336 0.75-0.75s-0.336-0.75-0.75-0.75z"/>
</symbol>
<symbol id="tcb-icon-countdown_evergreen" viewBox="0 0 32 32">
<path d="M29.749 4.496h-1.124v-1.921c0-1.289-1.048-2.337-2.337-2.337h-23.963c-1.289 0-2.337 1.048-2.337 2.337v22.835c0 1.289 1.048 2.338 2.337 2.338h1.123v1.922c0 1.289 1.049 2.338 2.338 2.338h23.963c1.289 0 2.337-1.049 2.337-2.338v-22.836c0-1.289-1.048-2.338-2.337-2.338zM2.325 1.737h23.963c0.462 0 0.837 0.375 0.837 0.837v8.707h-1.471v1.961h-5.853c0.101-0.232 0.189-0.463 0.258-0.689 0.149-0.501 0.225-1.030 0.225-1.588 0-1.013-0.26-1.82-0.779-2.419-0.52-0.599-1.209-0.899-2.071-0.899-0.548 0-1.066 0.121-1.551 0.363s-0.986 0.653-1.501 1.233l0.804 1.309c0.435-0.456 0.818-0.772 1.15-0.946 0.331-0.174 0.674-0.262 1.029-0.262 0.443 0 0.791 0.16 1.042 0.481s0.377 0.76 0.377 1.317c0 0.406-0.053 0.786-0.158 1.14-0.090 0.302-0.234 0.624-0.414 0.96h-6.914v-5.418h-1.241l-2.724 2.854 0.748 1.258c0.807-0.872 1.28-1.391 1.422-1.554s0.261-0.313 0.358-0.448c-0.034 0.558-0.051 1.312-0.051 2.263v1.044h-6.904v-1.961h-1.418v-8.705c0-0.462 0.375-0.838 0.837-0.838zM1.488 25.41v-8.435h1.418v-2.233h6.903v5.427h1.488v-5.427h5.943c-0.157 0.222-0.329 0.46-0.522 0.724l-2.388 3.201v1.503h6.277v-1.748h-4.396v-0.084l1.608-2.078c0.468-0.587 0.84-1.087 1.135-1.518h6.699v2.233h1.471v8.435c0 0.462-0.375 0.838-0.837 0.838h-23.962c-0.462 0-0.837-0.376-0.837-0.838zM30.586 29.67c0 0.462-0.375 0.838-0.837 0.838h-23.963c-0.462 0-0.838-0.376-0.838-0.838v-1.922h21.34c1.289 0 2.337-1.049 2.337-2.338v-19.414h1.124c0.462 0 0.837 0.376 0.837 0.838v22.836z"/>
</symbol>
<symbol id="tcb-icon-search_elem" viewBox="0 0 32 32">
<g>
<path d="M31.4,1.8H0.8C0.4,1.8,0.1,1.4,0.1,1s0.3-0.8,0.8-0.8h30.6c0.4,0,0.8,0.3,0.8,0.8S31.8,1.8,31.4,1.8z"/>
</g>
<g>
<path d="M14.4,7.8H0.8C0.4,7.8,0.1,7.4,0.1,7s0.3-0.8,0.8-0.8h13.6c0.4,0,0.8,0.3,0.8,0.8S14.8,7.8,14.4,7.8z"/>
</g>
<g>
<path d="M12.4,13.8H0.8c-0.4,0-0.8-0.3-0.8-0.8s0.3-0.8,0.8-0.8h11.6c0.4,0,0.8,0.3,0.8,0.8S12.8,13.8,12.4,13.8z"/>
</g>
<g>
<path d="M15.4,19.8H0.8c-0.4,0-0.8-0.3-0.8-0.8s0.3-0.8,0.8-0.8h14.6c0.4,0,0.8,0.3,0.8,0.8S15.8,19.8,15.4,19.8z"/>
</g>
<path d="M31.4,21.4l-4-4.4c1.2-1.2,2-2.9,2-4.8c0-3.7-3-6.7-6.7-6.7c-3.7,0-6.7,3-6.7,6.7s3,6.7,6.7,6.7
c1.3,0,2.5-0.4,3.5-1l4,4.5c0.1,0.2,0.4,0.2,0.6,0.2c0.2,0,0.4-0.1,0.5-0.2C31.6,22.2,31.7,21.7,31.4,21.4z M17.6,12.3
c0-2.9,2.3-5.2,5.2-5.2c2.9,0,5.2,2.3,5.2,5.2s-2.3,5.2-5.2,5.2C19.9,17.4,17.6,15.1,17.6,12.3z"/>
<g>
<path d="M31.4,31.8H0.8c-0.4,0-0.8-0.3-0.8-0.8s0.3-0.8,0.8-0.8h30.6c0.4,0,0.8,0.3,0.8,0.8S31.8,31.8,31.4,31.8z"/>
</g>
<g>
<path d="M25.4,25.8H0.8c-0.4,0-0.8-0.3-0.8-0.8s0.3-0.8,0.8-0.8h24.6c0.4,0,0.8,0.3,0.8,0.8S25.8,25.8,25.4,25.8z"/>
</g>
</symbol>
<symbol id="tcb-icon-sync-regular" viewBox="0 0 512 512">
<path d="M500 8h-27.711c-6.739 0-12.157 5.548-11.997 12.286l2.347 98.575C418.212 52.043 342.256 8 256 8 134.813 8 33.933 94.924 12.296 209.824 10.908 217.193 16.604 224 24.103 224h28.576c5.674 0 10.542-3.982 11.737-9.529C83.441 126.128 161.917 60 256 60c79.545 0 147.942 47.282 178.676 115.302l-126.39-3.009c-6.737-.16-12.286 5.257-12.286 11.997V212c0 6.627 5.373 12 12 12h192c6.627 0 12-5.373 12-12V20c0-6.627-5.373-12-12-12zm-12.103 280h-28.576c-5.674 0-10.542 3.982-11.737 9.529C428.559 385.872 350.083 452 256 452c-79.546 0-147.942-47.282-178.676-115.302l126.39 3.009c6.737.16 12.286-5.257 12.286-11.997V300c0-6.627-5.373-12-12-12H12c-6.627 0-12 5.373-12 12v192c0 6.627 5.373 12 12 12h27.711c6.739 0 12.157-5.548 11.997-12.286l-2.347-98.575C93.788 459.957 169.744 504 256 504c121.187 0 222.067-86.924 243.704-201.824 1.388-7.369-4.308-14.176-11.807-14.176z"/>
</symbol>
<symbol id="tcb-icon-control-switch" viewBox="0 0 11 10">
<path d="M10.828 7.857H4.125v-.893a.525.525 0 0 0-.516-.535H2.58a.525.525 0 0 0-.517.535v.893H.173A.176.176 0 0 0 0 8.036v.357c0 .098.077.178.172.178h1.89v.893c0 .297.23.536.516.536H3.61a.525.525 0 0 0 .516-.536v-.893h6.703c.095 0 .172-.08.172-.178v-.357a.176.176 0 0 0-.172-.179zm-7.39 1.429H2.75V7.143h.688v2.143zm7.39-7.857H5.5V.536A.525.525 0 0 0 4.984 0h-1.03a.525.525 0 0 0-.517.536v.893H.172A.176.176 0 0 0 0 1.607v.357c0 .099.077.179.172.179h3.265v.893c0 .297.23.535.516.535h1.031a.525.525 0 0 0 .516-.535v-.893h5.328c.095 0 .172-.08.172-.179v-.357a.176.176 0 0 0-.172-.178zM4.813 2.857h-.688V.714h.688v2.143zm6.015 1.786h-1.89V3.75a.525.525 0 0 0-.516-.536H7.39a.525.525 0 0 0-.516.536v.893H.172A.176.176 0 0 0 0 4.82v.358c0 .098.077.178.172.178h6.703v.893c0 .297.23.536.516.536h1.03a.525.525 0 0 0 .517-.536v-.893h1.89c.095 0 .172-.08.172-.178V4.82a.176.176 0 0 0-.172-.178zM8.25 6.07h-.688V3.93h.688V6.07z"
fill="#FFF" fill-rule="nonzero"/>
</symbol>
<symbol id="tcb-icon-eye-light" viewBox="0 0 15 10">
<path fill="#94A3B0" fill-rule="nonzero"
d="M7.5 5.833a1.667 1.667 0 0 0 0-3.333c-.026 0-.049.006-.074.008A1.237 1.237 0 0 1 5.84 4.092c0 .026-.008.05-.008.075 0 .92.747 1.666 1.667 1.666zm7.41-1.213C13.496 1.864 10.7 0 7.5 0 4.299 0 1.502 1.866.09 4.62a.842.842 0 0 0 0 .76C1.504 8.136 4.3 10 7.5 10c3.201 0 5.998-1.866 7.41-4.62a.842.842 0 0 0 0-.76zM7.5.833a3.333 3.333 0 1 1 0 6.667 3.333 3.333 0 0 1 0-6.667zm0 8.334C4.704 9.167 2.15 7.57.833 5a7.677 7.677 0 0 1 3.38-3.368 4.128 4.128 0 0 0-.88 2.535 4.167 4.167 0 1 0 8.334 0c0-.96-.337-1.831-.88-2.535A7.677 7.677 0 0 1 14.167 5C12.85 7.57 10.296 9.167 7.5 9.167z"/>
</symbol>
<symbol id="tcb-icon-eye-light-slash" viewBox="0 0 17 14">
<path fill="#94A3B0" fill-rule="nonzero"
d="M16.92 13.268L.61.048a.208.208 0 0 0-.298.034L.047.424A.223.223 0 0 0 .08.731l16.309 13.221a.208.208 0 0 0 .299-.034l.265-.342a.223.223 0 0 0-.033-.308zM8.5 2.625c1.877.002 3.398 1.568 3.4 3.5 0 .591-.157 1.14-.41 1.629l.677.547a4.42 4.42 0 0 0 .583-2.176 4.416 4.416 0 0 0-.897-2.661A7.95 7.95 0 0 1 15.3 7a8.168 8.168 0 0 1-1.8 2.383l.673.545a9.073 9.073 0 0 0 1.884-2.53.908.908 0 0 0 0-.797C14.618 3.708 11.766 1.75 8.5 1.75a8.069 8.069 0 0 0-3.456.777l1.215.985a3.325 3.325 0 0 1 2.24-.887zm1.617 4.015a1.768 1.768 0 0 0-.243-1.56A1.662 1.662 0 0 0 8.5 4.374c-.027 0-.05.007-.076.008.103.284.101.597-.006.88l1.699 1.377zM4.336 5.296a4.34 4.34 0 0 0-.086.829c-.006 1.49.728 2.88 1.946 3.684a4.13 4.13 0 0 0 4.064.289l-.785-.637c-.311.096-.634.164-.975.164-1.877-.002-3.398-1.568-3.4-3.5 0-.067.016-.13.019-.195l-.783-.634zM8.5 11.375c-2.852 0-5.458-1.677-6.8-4.375a8.042 8.042 0 0 1 1.814-2.371l-.687-.557A9.067 9.067 0 0 0 .943 6.6a.908.908 0 0 0 0 .798c1.44 2.893 4.292 4.85 7.557 4.85a8.07 8.07 0 0 0 3.456-.777l-.777-.628a7.246 7.246 0 0 1-2.68.53z"/>
</symbol>
<symbol id="tcb-icon-lock-outline" viewBox="0 0 448 512">
<path d="M224 420c-11 0-20-9-20-20v-64c0-11 9-20 20-20s20 9 20 20v64c0 11-9 20-20 20zm224-148v192c0 26.5-21.5 48-48 48H48c-26.5 0-48-21.5-48-48V272c0-26.5 21.5-48 48-48h16v-64C64 71.6 136-.3 224.5 0 312.9.3 384 73.1 384 161.5V224h16c26.5 0 48 21.5 48 48zM96 224h256v-64c0-70.6-57.4-128-128-128S96 89.4 96 160v64zm320 240V272c0-8.8-7.2-16-16-16H48c-8.8 0-16 7.2-16 16v192c0 8.8 7.2 16 16 16h352c8.8 0 16-7.2 16-16z"></path>
</symbol>
<symbol id="tcb-icon-arrow-down" viewBox="0 0 320 512">
<path d="M151.5 347.8L3.5 201c-4.7-4.7-4.7-12.3 0-17l19.8-19.8c4.7-4.7 12.3-4.7 17 0L160 282.7l119.7-118.5c4.7-4.7 12.3-4.7 17 0l19.8 19.8c4.7 4.7 4.7 12.3 0 17l-148 146.8c-4.7 4.7-12.3 4.7-17 0z"/>
</symbol>
<symbol id="tcb-icon-conditional-display" viewBox="0 0 12 10">
<defs>
<path id="a" d="M0 0h1.473v4.431H8V6H0z"/>
<path id="c" d="M0 0h1.5v4.475H8V6H0z"/>
</defs>
<g fill="none" fill-rule="evenodd">
<rect stroke="#FFF" stroke-width=".7" x="4.35" y=".35" width="7.3" height="5.3" rx="1"/>
<g transform="translate(2 2)">
<mask id="b" fill="#fff">
<use xlink:href="#a"/>
</mask>
<rect stroke="#FFF" stroke-width=".7" mask="url(#b)" x=".35" y=".35" width="7.3" height="5.3" rx="1"/>
</g>
<g transform="translate(0 4)">
<mask id="d" fill="#fff">
<use xlink:href="#c"/>
</mask>
<rect stroke="#FFF" stroke-width=".7" mask="url(#d)" x=".35" y=".35" width="7.3" height="5.3" rx="1"/>
</g>
</g>
</symbol>
<symbol id="tcb-icon-lock-open-outline" viewBox="0 0 384 512">
<path d="M336 256H96v-96c0-70.6 25.4-128 96-128s96 57.4 96 128v20c0 6.6 5.4 12 12 12h8c6.6 0 12-5.4 12-12v-18.5C320 73.1 280.9.3 192.5 0 104-.3 64 71.6 64 160v96H48c-26.5 0-48 21.5-48 48v160c0 26.5 21.5 48 48 48h288c26.5 0 48-21.5 48-48V304c0-26.5-21.5-48-48-48zm16 208c0 8.8-7.2 16-16 16H48c-8.8 0-16-7.2-16-16V304c0-8.8 7.2-16 16-16h288c8.8 0 16 7.2 16 16v160zm-160-32c-8.8 0-16-7.2-16-16v-64c0-8.8 7.2-16 16-16s16 7.2 16 16v64c0 8.8-7.2 16-16 16z"></path>
</symbol>
<symbol id="tcb-icon-menu" viewBox="0 0 2 9">
<path d="M1.054 3.875a.874.874 0 1 0 0 1.75.874.874 0 1 0 0-1.75zM.179 1.469a.874.874 0 1 0 1.75 0 .874.874 0 1 0-1.75 0zm0 6.562a.874.874 0 1 0 1.75 0 .874.874 0 1 0-1.75 0z" fill="#FFF" fill-rule="nonzero"/>
</symbol>
<symbol id="tcb-icon-user_profile" viewBox="0 0 32 32">
<g>
<path class="st0" d="M16,15.23c4.15,0,7.53-3.38,7.53-7.53S20.15,0.18,16,0.18c-4.15,0-7.53,3.38-7.53,7.53S11.85,15.23,16,15.23z
M12.54,12.63c0.12-1.51,1.2-2.89,2.73-3.41c0.3-0.1,0.5-0.38,0.51-0.69c0.01-0.31-0.18-0.6-0.47-0.72
c-0.74-0.3-1.22-1.01-1.22-1.81c0-1.05,0.86-1.92,1.91-1.94c0.01,0,0.03,0,0.04,0c1.05,0.02,1.91,0.89,1.91,1.94
c0,0.8-0.48,1.51-1.22,1.81c-0.29,0.12-0.48,0.4-0.47,0.72c0.01,0.31,0.21,0.59,0.51,0.69c1.35,0.46,2.39,1.93,2.55,3.53
c-0.95,0.62-2.08,0.99-3.3,0.99C14.71,13.73,13.52,13.32,12.54,12.63z M16,1.68c3.32,0,6.03,2.71,6.03,6.03
c0,1.48-0.54,2.83-1.42,3.88c-0.36-1.29-1.13-2.43-2.16-3.16C19.07,7.8,19.44,6.94,19.44,6c0-1.84-1.48-3.37-3.31-3.44
c-0.07-0.01-0.13-0.01-0.19,0c-0.02,0-0.04,0-0.06,0c-1.83,0.07-3.31,1.6-3.31,3.44c0,0.92,0.36,1.77,0.97,2.4
c-1.1,0.71-1.91,1.79-2.29,3.01c-0.8-1.02-1.28-2.31-1.28-3.7C9.97,4.38,12.68,1.68,16,1.68z"/>
<path class="st0" d="M0.02,17.41v4.81h31.95v-4.81H0.02z M30.47,20.72H1.52v-1.81h28.95V20.72z"/>
<path class="st0" d="M0.02,28.69h31.95v-4.81H0.02V28.69z M1.52,25.38h28.95v1.81H1.52V25.38z"/>
<rect y="30.42" width="11.69" height="1.5"/>
</g>
</symbol>
<symbol id="tcb-icon-center" viewBox="0 0 32 32">
<path d="M15 0h2v32h-2v-32z"></path>
<path d="M10 12h12c1.6 0 3 1.4 3 3v2c0 1.6-1.4 3-3 3h-12c-1.6 0-3-1.4-3-3v-2c0-1.6 1.4-3 3-3z"></path>
</symbol>
<symbol id="tcb-icon-float" viewBox="0 0 32 32">
<path d="M4 9.333h8v9.333h-8v-9.333zM4 5.333h24v1.333h-24v-1.333zM28 9.333v1.333h-13.333v-1.333h13.333zM28 13.333v1.333h-13.333v-1.333h13.333zM28 17.333v1.333h-13.333v-1.333h13.333zM4 21.333h18.667v1.333h-18.667v-1.333zM4 25.333h24v1.333h-24v-1.333z"></path>
</symbol>
<symbol id="tcb-icon-justify" viewBox="0 0 32 32">
<path d="M30 0h2v32h-2v-32z"></path>
<path d="M0 0h2v32h-2v-32z"></path>
<path d="M9 12h14c1.6 0 3 1.4 3 3v2c0 1.6-1.4 3-3 3h-14c-1.6 0-3-1.4-3-3v-2c0-1.6 1.4-3 3-3z"></path>
</symbol>
<symbol id="tcb-icon-left" viewBox="0 0 32 32">
<path d="M5 0h2v32h-2v-32z"></path>
<path d="M14 12h10c1.6 0 3 1.4 3 3v2c0 1.6-1.4 3-3 3h-10c-1.6 0-3-1.4-3-3v-2c0-1.6 1.4-3 3-3z"></path>
</symbol>
<symbol id="tcb-icon-right" viewBox="0 0 32 32">
<path d="M25 0h2v32h-2v-32z"></path>
<path d="M8 12h10c1.6 0 3 1.4 3 3v2c0 1.6-1.4 3-3 3h-10c-1.6 0-3-1.4-3-3v-2c0-1.6 1.4-3 3-3z"></path>
</symbol>
<symbol id="tcb-icon-move" viewBox="0 0 512 512">
<path d="M337.782 434.704l-73.297 73.782c-4.686 4.686-12.284 4.686-16.971 0l-73.296-73.782c-4.686-4.686-4.686-12.284 0-16.97l7.07-7.07c4.686-4.686 12.284-4.686 16.971 0L239 451.887h1V272H60.113v1l41.224 40.741c4.686 4.686 4.686 12.284 0 16.971l-7.071 7.07c-4.686 4.686-12.284 4.686-16.97 0L3.515 264.485c-4.686-4.686-4.686-12.284 0-16.971l73.782-73.297c4.686-4.686 12.284-4.686 16.971 0l7.071 7.071c4.686 4.686 4.686 12.284 0 16.971L60.113 239v1H240V60.113h-1l-40.741 41.224c-4.686 4.686-12.284 4.686-16.971 0l-7.07-7.071c-4.686-4.686-4.687-12.284 0-16.97l73.297-73.782c4.686-4.686 12.284-4.686 16.971 0l73.297 73.782c4.686 4.686 4.686 12.284 0 16.971l-7.071 7.071c-4.686 4.686-12.284 4.686-16.971 0L273 60.113h-1V240h179.887v-1l-41.224-40.741c-4.686-4.686-4.686-12.284 0-16.971l7.071-7.07c4.686-4.686 12.284-4.686 16.97 0l73.782 73.297c4.687 4.686 4.686 12.284 0 16.971l-73.782 73.297c-4.686 4.686-12.284 4.686-16.97 0l-7.071-7.07c-4.686-4.686-4.686-12.284 0-16.971L451.887 273v-1H272v179.887h1l40.741-41.224c4.686-4.686 12.284-4.686 16.971 0l7.07 7.071c4.686 4.685 4.686 12.283 0 16.97z"></path>
</symbol>
<symbol id="tcb-icon-play" viewBox="0 0 32 32">
<path fill="#fff" style="fill: var(--color1, #fff)"
d="M29.854 7.969c-1.422-2.431-3.392-4.401-5.748-5.782l-0.075-0.041q-3.677-2.146-8.031-2.146t-8.031 2.146c-2.431 1.422-4.401 3.392-5.782 5.748l-0.041 0.075q-2.146 3.678-2.146 8.031t2.146 8.031c1.422 2.431 3.392 4.401 5.748 5.782l0.075 0.041q3.677 2.146 8.031 2.146t8.031-2.146c2.431-1.422 4.401-3.392 5.782-5.748l0.041-0.075q2.146-3.678 2.146-8.031t-2.146-8.031zM24 17.146l-11.333 6.667c-0.19 0.118-0.42 0.188-0.666 0.188-0 0-0.001 0-0.001 0h0c-0.244-0.003-0.473-0.064-0.675-0.171l0.008 0.004q-0.667-0.396-0.667-1.166v-13.333q0-0.771 0.667-1.167 0.688-0.375 1.333 0.021l11.334 6.667q0.666 0.375 0.666 1.146t-0.666 1.146z"></path>
</symbol>
<symbol id="tcb-icon-video-player" viewBox="0 0 32 32">
<path d="M21.224 18.053l-8-4c-0.155-0.077-0.339-0.070-0.486 0.022s-0.237 0.252-0.237 0.425v8c0 0.173 0.090 0.334 0.237 0.425 0.080 0.050 0.171 0.075 0.263 0.075 0.077 0 0.153-0.018 0.224-0.053l8-4c0.169-0.085 0.276-0.258 0.276-0.447s-0.107-0.362-0.276-0.447zM13.5 21.691v-6.382l6.382 3.191-6.382 3.191z"></path>
<path d="M30 2.5h-28c-1.105 0-2 0.895-2 2v23c0 1.105 0.895 2 2 2h28c1.105 0 2-0.895 2-2v-23c0-1.105-0.895-2-2-2zM31 4.5v4h-4.164l1.34-5h1.825c0.551 0 1 0.449 1 1zM10.64 3.5l-1.339 5h-4.475l1.339-5h4.475zM11.675 3.5h4.465l-1.339 5h-4.465l1.339-5zM17.175 3.5h4.465l-1.34 5h-4.465l1.34-5zM22.675 3.5h4.465l-1.34 5h-4.465l1.34-5zM2 3.5h3.13l-1.339 5h-2.79v-4c0-0.551 0.449-1 1-1zM30 28.5h-28c-0.551 0-1-0.449-1-1v-18h30v18c0 0.551-0.449 1-1 1z"></path>
</symbol>
<symbol id="tcb-icon-audio-player" viewBox="-14 -11.7 28 23.3">
<path d="M0.6-11.7c-0.3,0-0.7,0.1-0.9,0.4l-6.6,5.4H-11c-1.6,0-3,1.3-3,3v5.9c0,1.6,1.3,3,3,3h4.2l6.7,5.4
c0.4,0.4,1,0.5,1.5,0.2c0.5-0.3,0.8-0.8,0.7-1.3v-20.4c0-0.6-0.4-1.1-0.9-1.3C1-11.6,0.8-11.7,0.6-11.7z M0.7-10.2L0.7-10.2
C0.7-10.2,0.7-10.2,0.7-10.2z M-11,4.4c-0.8,0-1.5-0.7-1.5-1.5V-3c0-0.8,0.7-1.5,1.5-1.5h4.4c0.2,0,0.3-0.1,0.5-0.2l6.8-5.5
l0,20.1l-6.7-5.4c-0.1-0.1-0.3-0.2-0.5-0.2H-11z M0.4,10.7L0.4,10.7L0.4,10.7z"/>
<path d="M10-8.2c-0.2,0-0.4,0.1-0.6,0.3C9.2-7.6,9.2-7.2,9.6-6.9c1.8,1.5,2.9,4.1,2.9,6.8c0,2.7-1.2,5.4-3.1,6.9
C9.1,7.1,9,7.6,9.3,7.9C9.5,8.2,10,8.3,10.3,8C12.6,6.2,14,3.1,14-0.1c0-3.2-1.3-6.1-3.5-8C10.4-8.2,10.2-8.2,10-8.2z"/>
<path d="M6-4.2C5.7-4.2,5.5-4.1,5.4-4C5.1-3.6,5.1-3.2,5.5-2.9C6.2-2.2,6.7-1.1,6.7,0c0,1.1-0.5,2.3-1.3,2.9
C5.1,3.2,5,3.7,5.3,4C5.5,4.3,6,4.4,6.3,4.1C7.5,3.2,8.2,1.7,8.2,0C8.2-1.5,7.5-3,6.4-4C6.3-4.1,6.1-4.2,6-4.2z"/>
</symbol>
<symbol id="tcb-icon-post_grid" viewBox="0 0 32 32">
<path d="M14.045 14.54c0.414 0 0.75-0.336 0.75-0.75s-0.336-0.75-0.75-0.75h-13.295c-0.414 0-0.75 0.337-0.75 0.75s0.336 0.75 0.75 0.75h13.295z"></path>
<path d="M31.25 13.040h-13.295c-0.414 0-0.75 0.336-0.75 0.75s0.336 0.75 0.75 0.75h13.295c0.414 0 0.75-0.336 0.75-0.75s-0.336-0.75-0.75-0.75z"></path>
<path d="M13.285-0.033h-11.6c-0.929 0-1.685 0.756-1.685 1.685v7.797c0 0.929 0.756 1.685 1.685 1.685h11.6c0.929 0 1.685-0.756 1.685-1.685v-7.797c0-0.929-0.756-1.685-1.685-1.685zM13.47 9.449c0 0.102-0.083 0.185-0.185 0.185h-11.6c-0.102 0-0.185-0.083-0.185-0.185v-7.797c0-0.102 0.083-0.185 0.185-0.185h11.6c0.102 0 0.185 0.083 0.185 0.185v7.797z"></path>
<path d="M30.315-0.033h-11.6c-0.929 0-1.684 0.756-1.684 1.685v7.797c0 0.929 0.756 1.685 1.684 1.685h11.6c0.93 0 1.685-0.756 1.685-1.685v-7.797c0-0.929-0.756-1.685-1.685-1.685zM30.5 9.449c0 0.102-0.083 0.185-0.185 0.185h-11.6c-0.101 0-0.184-0.083-0.184-0.185v-7.797c0-0.102 0.083-0.185 0.184-0.185h11.6c0.102 0 0.185 0.083 0.185 0.185v7.797z"></path>
<path d="M14.045 30.5h-13.295c-0.414 0-0.75 0.336-0.75 0.75s0.336 0.75 0.75 0.75h13.295c0.414 0 0.75-0.336 0.75-0.75s-0.335-0.75-0.75-0.75z"></path>
<path d="M31.25 30.5h-13.295c-0.414 0-0.75 0.336-0.75 0.75s0.336 0.75 0.75 0.75h13.295c0.414 0 0.75-0.336 0.75-0.75s-0.336-0.75-0.75-0.75z"></path>
<path d="M13.285 17.426h-11.6c-0.929 0-1.685 0.756-1.685 1.685v7.797c0 0.93 0.756 1.686 1.685 1.686h11.6c0.929 0 1.685-0.756 1.685-1.686v-7.797c0-0.929-0.756-1.685-1.685-1.685zM13.47 26.908c0 0.103-0.083 0.186-0.185 0.186h-11.6c-0.102 0-0.185-0.083-0.185-0.186v-7.797c0-0.102 0.083-0.185 0.185-0.185h11.6c0.102 0 0.185 0.083 0.185 0.185v7.797z"></path>
<path d="M30.315 17.426h-11.6c-0.929 0-1.684 0.756-1.684 1.685v7.797c0 0.93 0.756 1.686 1.684 1.686h11.6c0.93 0 1.685-0.756 1.685-1.686v-7.797c0-0.929-0.756-1.685-1.685-1.685zM30.5 26.908c0 0.103-0.083 0.186-0.185 0.186h-11.6c-0.101 0-0.184-0.083-0.184-0.186v-7.797c0-0.102 0.083-0.185 0.184-0.185h11.6c0.104 0 0.185 0.081 0.185 0.185v7.797z"></path>
</symbol>
<symbol id="tcb-icon-content_temp" viewBox="0 0 32 32">
<path d="M26.393 12.581h-20.786v6.837h20.785v-6.837zM24.893 17.918h-17.786v-3.837h17.785v3.837z"></path>
<path d="M25.885 8.962h-19.77c-0.414 0-0.75 0.336-0.75 0.75s0.336 0.75 0.75 0.75h19.77c0.414 0 0.75-0.336 0.75-0.75s-0.336-0.75-0.75-0.75z"></path>
<path d="M25.885 21.538h-19.77c-0.414 0-0.75 0.336-0.75 0.75s0.336 0.75 0.75 0.75h19.77c0.414 0 0.75-0.336 0.75-0.75s-0.336-0.75-0.75-0.75z"></path>
<path d="M1.5 3.602c0-1.159 0.943-2.102 2.137-2.102l-0.035-1.5c-1.986 0-3.602 1.616-3.602 3.602v0.667h1.5v-0.667z"></path>
<path d="M0 18.327h1.5v5.184h-1.5v-5.184z"></path>
<path d="M0 11.913h1.5v5.184h-1.5v-5.184z"></path>
<path d="M0 5.499h1.5v5.184h-1.5v-5.184z"></path>
<path d="M17.694 0h5.185v1.5h-5.185v-1.5z"></path>
<path d="M29.021 1.621l0.504-1.413c-0.387-0.138-0.795-0.208-1.209-0.208h-4.208v1.5h4.208c0.243 0 0.48 0.041 0.705 0.121z"></path>
<path d="M4.867 0h5.184v1.5h-5.184v-1.5z"></path>
<path d="M1.5 28.316v-3.576h-1.5v3.576c0 0.685 0.193 1.351 0.558 1.926l1.267-0.803c-0.213-0.335-0.325-0.722-0.325-1.123z"></path>
<path d="M11.281 0h5.184v1.5h-5.184v-1.5z"></path>
<path d="M14.786 30.418h5.184v1.5h-5.184v-1.5z"></path>
<path d="M30.418 14.154h1.5v5.185h-1.5v-5.185z"></path>
<path d="M2.458 30.079l-0.818 1.258c0.584 0.38 1.263 0.581 1.962 0.581h3.541v-1.5h-3.541c-0.409 0-0.805-0.117-1.144-0.339z"></path>
<path d="M30.418 7.741h1.5v5.184h-1.5v-5.184z"></path>
<path d="M30.418 28.316c0 1.159-0.942 2.102-2.102 2.102h-0.702v1.5h0.702c1.986 0 3.602-1.615 3.602-3.602v-1.334h-1.5v1.334z"></path>
<path d="M30.418 20.568h1.5v5.184h-1.5v-5.184z"></path>
<path d="M8.372 30.418h5.184v1.5h-5.184v-1.5z"></path>
<path d="M30.833 1.024l-1.049 1.073c0.409 0.399 0.634 0.933 0.634 1.504v2.909h1.5v-2.908c0-0.978-0.386-1.893-1.085-2.578z"></path>
<path d="M21.2 30.418h5.184v1.5h-5.184v-1.5z"></path>
</symbol>
<symbol id="tcb-icon-copy" viewBox="0 0 448 512">
<path d="M433.941 65.941l-51.882-51.882A48 48 0 0 0 348.118 0H176c-26.51 0-48 21.49-48 48v48H48c-26.51 0-48 21.49-48 48v320c0 26.51 21.49 48 48 48h224c26.51 0 48-21.49 48-48v-48h80c26.51 0 48-21.49 48-48V99.882a48 48 0 0 0-14.059-33.941zM352 32.491a15.88 15.88 0 0 1 7.431 4.195l51.882 51.883A15.885 15.885 0 0 1 415.508 96H352V32.491zM288 464c0 8.822-7.178 16-16 16H48c-8.822 0-16-7.178-16-16V144c0-8.822 7.178-16 16-16h80v240c0 26.51 21.49 48 48 48h112v48zm128-96c0 8.822-7.178 16-16 16H176c-8.822 0-16-7.178-16-16V48c0-8.822 7.178-16 16-16h144v72c0 13.2 10.8 24 24 24h72v240z"></path>
</symbol>
<symbol id="tcb-icon-trash" viewBox="0 0 512 512">
<path d="M368 64l-33.6-44.8C325.3 7.1 311.1 0 296 0h-80c-15.1 0-29.3 7.1-38.4 19.2L144 64H40c-13.3 0-24 10.7-24 24v2c0 3.3 2.7 6 6 6h20.9l33.2 372.3C78.3 493 99 512 123.9 512h264.2c24.9 0 45.6-19 47.8-43.7L469.1 96H490c3.3 0 6-2.7 6-6v-2c0-13.3-10.7-24-24-24H368zM216 32h80c5 0 9.8 2.4 12.8 6.4L328 64H184l19.2-25.6c3-4 7.8-6.4 12.8-6.4zm188 433.4c-.7 8.3-7.6 14.6-15.9 14.6H123.9c-8.3 0-15.2-6.3-15.9-14.6L75 96h362l-33 369.4z"></path>
</symbol>
<symbol id="tcb-icon-add" viewBox="0 0 32 32">
<path d="M18 4v10h10v4h-10v10h-4v-10h-10v-4h10v-10h4z"></path>
</symbol>
<symbol id="tcb-icon-delete" viewBox="0 0 32 32">
<path d="M22 8c0-2.2-1.8-4-4-4h-4c-2.2 0-4 1.8-4 4h-4v2h20v-2h-4zM12 8c0-1.2 0.8-2 2-2h4c1.2 0 2 0.8 2 2h-8z"></path>
<path d="M8 24c0 2.2 1.8 4 4 4h8c2.2 0 4-1.8 4-4v-12h-16v12z"></path>
</symbol>
<symbol id="tcb-icon-merge" viewBox="0 0 32 32">
<path d="M22.667 27.2l1.867-1.867-4.533-4.533-1.867 1.867zM10 10.667h4.667v7.467l-7.2 7.2 1.867 1.867 8-8v-8.533h4.667l-6-6z"></path>
</symbol>
<symbol id="tcb-icon-split" viewBox="0 0 32 32">
<path d="M18.667 5.333l3.067 3.067-3.867 3.867 1.867 1.867 3.867-3.867 3.067 3.067v-8zM13.333 5.333h-8v8l3.067-3.067 6.267 6.267v10.133h2.667v-11.2l-7.067-7.067z"></path>
</symbol>
<symbol id="tcb-icon-table" viewBox="0 0 32 32">
<path d="M-0.022-0.022v32.045h32.045v-32.045h-32.045zM30.522 10.261h-8.689v-8.783h8.689v8.783zM11.667 20.427v-8.666h8.667v8.666h-8.667zM20.333 21.927v8.596h-8.667v-8.596h8.667zM10.167 20.427h-8.689v-8.666h8.689v8.666zM11.667 10.261v-8.783h8.667v8.783h-8.667zM21.833 11.761h8.689v8.666h-8.689v-8.666zM10.167 1.478v8.783h-8.689v-8.783h8.689zM1.478 21.927h8.689v8.596h-8.689v-8.596zM21.833 30.522v-8.596h8.689v8.596h-8.689z"></path>
</symbol>
<symbol id="tcb-icon-post-list" viewBox="0 0 32 32" fill="#fff">
<path class="st0" d="M10.8,4.2H4.2v6.6h6.6V4.2z M9.3,9.3H5.7V5.7h3.6V9.3z"/>
<path class="st0" d="M31.4,0.1H0.7c-0.4,0-0.8,0.3-0.8,0.8v13.3c0,0.4,0.3,0.8,0.8,0.8h30.7c0.4,0,0.8-0.3,0.8-0.8V0.8
C32.1,0.4,31.8,0.1,31.4,0.1z M30.6,13.4H1.4V1.6h29.2V13.4z"/>
<path class="st0" d="M13.1,6.7h13.7c0.4,0,0.8-0.3,0.8-0.8s-0.3-0.8-0.8-0.8H13.1c-0.4,0-0.8,0.3-0.8,0.8S12.7,6.7,13.1,6.7z"/>
<path class="st0" d="M13.1,9.6h8.7c0.4,0,0.8-0.3,0.8-0.8s-0.3-0.8-0.8-0.8h-8.7c-0.4,0-0.8,0.3-0.8,0.8S12.7,9.6,13.1,9.6z"/>
<path class="st0" d="M10.8,21.4H4.2V28h6.6V21.4z M9.3,26.5H5.7v-3.6h3.6V26.5z"/>
<path class="st0" d="M31.4,17.3H0.7c-0.4,0-0.8,0.3-0.8,0.8v13.3c0,0.4,0.3,0.8,0.8,0.8h30.7c0.4,0,0.8-0.3,0.8-0.8V18
C32.1,17.6,31.8,17.3,31.4,17.3z M30.6,30.6H1.4V18.8h29.2V30.6z"/>
<path class="st0" d="M13.1,23.8h13.7c0.4,0,0.8-0.3,0.8-0.8s-0.3-0.8-0.8-0.8H13.1c-0.4,0-0.8,0.3-0.8,0.8S12.7,23.8,13.1,23.8z"/>
<path class="st0" d="M13.1,26.8h8.7c0.4,0,0.8-0.3,0.8-0.8s-0.3-0.8-0.8-0.8h-8.7c-0.4,0-0.8,0.3-0.8,0.8S12.7,26.8,13.1,26.8z"/>
</symbol>
<symbol id="tcb-icon-image" viewBox="0 0 32 32">
<path d="M29.301 0.049h-26.602c-1.461 0-2.65 1.188-2.65 2.649v26.603c0 1.462 1.189 2.65 2.65 2.65h26.602c1.462 0 2.65-1.189 2.65-2.65v-26.603c0-1.461-1.188-2.649-2.65-2.649zM2.699 1.549h26.602c0.635 0 1.15 0.516 1.15 1.149v23.305l-7.881-8.152-4.18 4.288-6.324-6.262-10.517 10.375v-23.554c0-0.634 0.515-1.149 1.15-1.149zM1.549 29.301v-0.94l10.518-10.377 5.061 4.988 0.238 0.271-6.969 7.208h-7.698c-0.635 0-1.15-0.516-1.15-1.15zM29.301 30.451h-16.817l10.091-10.438 7.812 8.081c0.019 0.020 0.044 0.027 0.065 0.044v1.162c-0.001 0.635-0.517 1.151-1.151 1.151z"></path>
<path d="M21.571 12.57c1.902 0 3.449-1.548 3.449-3.45s-1.547-3.449-3.449-3.449c-1.902 0-3.449 1.547-3.449 3.449s1.547 3.45 3.449 3.45zM21.571 7.171c1.075 0 1.949 0.875 1.949 1.949s-0.874 1.95-1.949 1.95-1.949-0.875-1.949-1.95c0-1.075 0.874-1.949 1.949-1.949z"></path>
</symbol>
<symbol id="tcb-icon-testimonials" viewBox="0 0 32 32">
<path d="M20.405 7.832h-1.349l1.228-3.638h-2.096l-1.639 3.857v3.759h3.856z"></path>
<path d="M14.997 7.832h-1.351l1.23-3.638h-2.097l-1.639 3.857v3.759h3.857z"></path>
<path d="M27.237 17.257c0-0.414-0.336-0.75-0.75-0.75h-21.069c-0.414 0-0.75 0.336-0.75 0.75s0.336 0.75 0.75 0.75h21.069c0.414 0 0.75-0.336 0.75-0.75z"></path>
<path d="M5.418 20.6c-0.414 0-0.75 0.336-0.75 0.75s0.336 0.75 0.75 0.75h14.543c0.414 0 0.75-0.336 0.75-0.75s-0.336-0.75-0.75-0.75h-14.543z"></path>
<path d="M29.313 8.915h-6.739v1.5h6.739c0.626 0 1.136 0.51 1.136 1.137v13.617c0 0.627-0.51 1.137-1.136 1.137h-26.625c-0.627 0-1.137-0.51-1.137-1.137v-13.617c0-0.627 0.51-1.137 1.137-1.137h6.21v-1.5h-6.21c-1.454 0-2.637 1.183-2.637 2.637v13.617c0 1.454 1.183 2.637 2.637 2.637h26.626c1.453 0 2.636-1.183 2.636-2.637v-13.617c-0.001-1.454-1.183-2.637-2.637-2.637z"></path>
</symbol>
<symbol id="tcb-icon-custom_html" viewBox="0 0 32 32">
<path d="M18.985 2.537c-0.409-0.086-0.803 0.176-0.887 0.583l-5.27 25.456c-0.084 0.406 0.177 0.803 0.583 0.887 0.051 0.011 0.102 0.016 0.153 0.016 0.348 0 0.66-0.243 0.733-0.598l5.27-25.457c0.084-0.406-0.176-0.803-0.582-0.887z"></path>
<path d="M31.728 15.567l-6.549-5.415c-0.317-0.263-0.791-0.219-1.056 0.1-0.264 0.319-0.219 0.792 0.101 1.056l5.83 4.821-5.814 4.549c-0.326 0.256-0.384 0.727-0.129 1.053 0.148 0.19 0.368 0.288 0.592 0.288 0.161 0 0.324-0.052 0.461-0.159l6.549-5.124c0.179-0.14 0.285-0.354 0.288-0.58 0.002-0.227-0.098-0.444-0.273-0.589z"></path>
<path d="M7.965 10.252c-0.265-0.318-0.737-0.364-1.056-0.1l-6.547 5.415c-0.175 0.145-0.275 0.361-0.272 0.588s0.109 0.44 0.288 0.58l6.547 5.124c0.137 0.107 0.3 0.159 0.462 0.159 0.223 0 0.443-0.099 0.591-0.288 0.255-0.326 0.198-0.797-0.128-1.053l-5.813-4.549 5.829-4.821c0.319-0.263 0.363-0.736 0.099-1.055z"></path>
</symbol>
<symbol id="tcb-icon-wordpress" viewBox="0 0 32 32">
<path d="M16 0.353c-8.628 0-15.647 7.019-15.647 15.647s7.019 15.647 15.647 15.647c8.628 0 15.647-7.020 15.647-15.647s-7.019-15.647-15.647-15.647zM16 1.853c3.614 0 6.905 1.374 9.408 3.612-0.007-0.001-0.017-0.004-0.023-0.004-2.473-0.254-2.725 1.741-2.502 2.998 0.152 0.866 0.455 1.882 1.649 3.782 1.34 2.137 0.479 5.578 0.479 5.578l-2.15 7.129-4.834-15.58c0.467 0 0.861 0 1.105 0 0.77 0.007 0.984-0.431 0.938-0.717-0.020-0.088-0.1-0.347-0.326-0.448-0.375-0.159-1.779-0.051-3.477-0.051-1.707 0-3.020 0.002-4.038-0.010-0.164 0-0.47 0.145-0.474 0.478-0.004 0.354 0.388 0.807 0.885 0.782 0.535-0.027 1.043-0.020 1.043-0.020s0.019 0 0.055 0l2.057 6.274-2.964 9.337-4.953-15.492c0.45 0 0.831 0 1.074 0 0.765 0.004 0.984-0.431 0.933-0.713-0.010-0.094-0.096-0.352-0.331-0.447-0.37-0.162-1.772-0.057-3.473-0.057-0.956 0-1.472 0.001-1.924 0.002 2.528-3.868 6.888-6.433 11.843-6.433zM1.853 16c0-2.359 0.588-4.58 1.613-6.538 0.018 0.037 0.029 0.060 0.029 0.060s0.025-0.004 0.059-0.004l0.604 1.613 2.077 6.111v0.005l0.006 0.007 4.053 11.683c-4.964-2.201-8.441-7.167-8.441-12.937zM12.52 29.696l4.207-12.278 3.838 11.959c-1.434 0.491-2.967 0.77-4.565 0.77-1.203 0-2.364-0.167-3.48-0.451zM23.046 28.25c1.199-3.713 4.315-13.401 4.772-15.21 0.398-1.584 0.566-2.839 0.504-3.967 1.157 2.050 1.825 4.41 1.825 6.927 0 5.234-2.864 9.803-7.101 12.25z"></path>
</symbol>
<symbol id="tcb-icon-column" viewBox="0 0 32 32">
<path d="M18.5 0.3h-5c-1.2 0-2.3 1-2.3 2.3v27c0 1.2 1 2.3 2.3 2.3h5c1.2 0 2.3-1 2.3-2.3v-27c0-1.3-1.1-2.3-2.3-2.3zM19.3 29.5c0 0.4-0.3 0.8-0.8 0.8h-5c-0.4 0-0.8-0.3-0.8-0.8v-27c0-0.4 0.3-0.8 0.8-0.8h5c0.4 0 0.8 0.3 0.8 0.8v27z"></path>
<path d="M29.5 0h-5c-1.2 0-2.3 1-2.3 2.3v27c0 1.2 1 2.3 2.3 2.3h5c1.2 0 2.3-1 2.3-2.3v-27c-0.1-1.3-1.1-2.3-2.3-2.3zM30.2 29.3c0 0.4-0.3 0.8-0.8 0.8h-5c-0.4 0-0.8-0.3-0.8-0.8v-27c0-0.4 0.3-0.8 0.8-0.8h5c0.4 0 0.8 0.3 0.8 0.8v27z"></path>
<path d="M7.6 0h-5c-1.3 0-2.3 1-2.3 2.3v27c0 1.2 1 2.3 2.3 2.3h5c1.2 0 2.3-1 2.3-2.3v-27c-0.1-1.3-1.1-2.3-2.3-2.3zM8.3 29.3c0 0.4-0.3 0.7-0.7 0.7h-5c-0.4 0-0.8-0.3-0.8-0.8v-27c0-0.4 0.3-0.8 0.8-0.8h5c0.4 0 0.8 0.3 0.8 0.8v27.1z"></path>
</symbol>
<symbol id="tcb-icon-call_2_action" viewBox="0 0 32 32">
<title>call_2_action</title>
<path d="M28.357 0.041h-24.714c-1.986 0-3.602 1.616-3.602 3.602v24.715c0 1.986 1.616 3.602 3.602 3.602h24.715c1.986 0 3.602-1.615 3.602-3.602v-24.716c-0.001-1.986-1.616-3.601-3.603-3.601zM30.459 28.357c0 1.159-0.942 2.102-2.102 2.102h-11.654l-0.001-3.563c0-0.053-0.021-0.099-0.030-0.149l2.151 0.006-2.954-3.658-2.701 3.644 1.947 0.005c-0.010 0.051-0.031 0.099-0.031 0.152l0.001 3.563h-11.442c-1.159 0-2.102-0.942-2.102-2.102v-24.715c0-1.159 0.943-2.102 2.102-2.102h24.715c1.159 0 2.102 0.943 2.102 2.102v24.715z"></path>
<path d="M25.805 15.364h-20.087c-0.998 0-1.809 0.811-1.809 1.809v7.876c0 0.997 0.811 1.809 1.809 1.809h6.155v-1.618h-6.155c-0.105 0-0.191-0.086-0.191-0.191v-7.876c0-0.105 0.086-0.191 0.191-0.191h20.086c0.105 0 0.191 0.086 0.191 0.191v7.876c0 0.106-0.086 0.191-0.191 0.191h-5.89v1.617h5.89c0.997 0 1.809-0.812 1.809-1.809v-7.876c0-0.997-0.811-1.808-1.808-1.808z"></path>
<path d="M15.893 18.281c-0.447 0-0.809 0.362-0.809 0.809v2.115c0 0.446 0.362 0.809 0.809 0.809s0.809-0.362 0.809-0.809v-2.115c0-0.446-0.362-0.809-0.809-0.809z"></path>
<path d="M21.781 23.772c0-0.446-0.362-0.809-0.809-0.809h-2.115c-0.446 0-0.809 0.362-0.809 0.809 0 0.446 0.362 0.809 0.809 0.809h2.115c0.447 0 0.809-0.362 0.809-0.809z"></path>
<path d="M12.93 22.964h-2.115c-0.447 0-0.809 0.362-0.809 0.809 0 0.446 0.362 0.809 0.809 0.809h2.115c0.447 0 0.809-0.362 0.809-0.809s-0.362-0.809-0.809-0.809z"></path>
<path d="M12.663 19.808c-0.338-0.292-0.848-0.258-1.141 0.080s-0.257 0.848 0.080 1.141l1.596 1.387c0.153 0.133 0.342 0.198 0.53 0.198 0.226 0 0.451-0.094 0.611-0.278 0.293-0.337 0.257-0.848-0.080-1.141l-1.596-1.387z"></path>
<path d="M19.976 21.272c0.338-0.293 0.373-0.804 0.080-1.141-0.293-0.338-0.806-0.371-1.141-0.080l-1.595 1.387c-0.337 0.293-0.373 0.804-0.080 1.141 0.16 0.185 0.385 0.278 0.61 0.278 0.189 0 0.378-0.065 0.53-0.198l1.596-1.387z"></path>
<path d="M5.037 10.049h21.465c0.414 0 0.75-0.336 0.75-0.75s-0.336-0.75-0.75-0.75h-21.465c-0.414 0-0.75 0.336-0.75 0.75s0.336 0.75 0.75 0.75z"></path>
<path d="M5.037 13.049h21.465c0.414 0 0.75-0.336 0.75-0.75s-0.336-0.75-0.75-0.75h-21.465c-0.414 0-0.75 0.336-0.75 0.75s0.336 0.75 0.75 0.75z"></path>
<path d="M5.037 7.049h7.465c0.414 0 0.75-0.336 0.75-0.75s-0.336-0.75-0.75-0.75h-7.465c-0.414 0-0.75 0.336-0.75 0.75s0.336 0.75 0.75 0.75z"></path>
</symbol>
<symbol id="tcb-icon-styled_box" viewBox="0 0 32 32">
<title>styled_box</title>
<path fill="#333" style="fill: var(--color3, #333)"
d="M32 32.1h-5.9v-1.5h5.2v0.6h0.7v0.9zM24.8 32.1h-5.2v-1.5h5.2v1.5zM18.4 32.1h-5.2v-1.5h5.2v1.5zM12 32.1h-5.2v-1.5h5.2v1.5zM5.6 32.1h-5.6v-1.1h0.8v-0.4h4.8v1.5zM32 30h-1.5v-5.2h1.5v5.2zM1.5 29.7h-1.5v-5.2h1.5v5.2zM32 23.5h-1.5v-5.2h1.5v5.2zM1.5 23.3h-1.5v-5.2h1.5v5.2zM32 17.1h-1.5v-5.2h1.5v5.2zM1.5 16.9h-1.5v-5.2h1.5v5.2zM32 10.7h-1.5v-5.2h1.5v5.2zM1.5 10.5h-1.5v-5.2h1.5v5.2zM32 4.3h-1.5v-2.7h-1v-1.5h2.5v4.2zM1.5 4.1h-1.5v-4h2.7v1.5h-1.2v2.5zM28.3 1.6h-5.2v-1.5h5.2v1.5zM21.9 1.6h-5.2v-1.5h5.2v1.5zM15.5 1.6h-5.2v-1.5h5.2v1.5zM9.1 1.6h-5.2v-1.5h5.2v1.5z"></path>
<path fill="#333" style="fill: var(--color3, #333)" d="M28 28.1h-24v-24h24v24zM5.5 26.6h21v-21h-21v21z"></path>
<path fill="#f9f7f7" style="fill: var(--color7, #f9f7f7)" d="M9.6 21.1c0 0 1.4-0.7 1.6-2 0.2-1.2 1.1-1.8 1.6-2 0.5-0.1 1.4 0.1 1.4 0.1l0.9 1c0 0-0.2 1.5-0.5 2-0.5 0.7-1.5 1-2.1 1-0.5 0.1-2.9-0.1-2.9-0.1z"></path>
<path fill="#333" style="fill: var(--color3, #333)" d="M12.5 22c-0.8 0-2.8-0.1-2.9-0.1-0.3 0-0.6-0.3-0.7-0.6s0.1-0.7 0.4-0.8c0 0 1.1-0.6 1.3-1.5 0.3-1.4 1.3-2.3 2.1-2.6 0.6-0.2 1.6 0 1.8 0.1 0.2 0 0.3 0.1 0.4 0.2l0.9 1c0.1 0.2 0.2 0.4 0.2 0.6 0 0.4-0.2 1.8-0.6 2.3-0.6 1-1.8 1.4-2.7 1.4-0.1 0-0.1 0-0.2 0zM11.4 20.5c0.5 0 0.9 0 1.2 0 0.5 0 1.2-0.2 1.5-0.7 0.1-0.2 0.2-0.7 0.3-1.4l-0.5-0.6c-0.3-0.1-0.7-0.1-0.9 0-0.3 0.1-0.9 0.5-1.1 1.4 0 0.5-0.2 0.9-0.5 1.3z"></path>
<path fill="#f9f7f7" style="fill: var(--color7, #f9f7f7)" d="M22.6 9.5c-0.5-0.4-1.5 0-1.8 0.3 0 0-6.3 6.8-6.3 6.9l1.2 1.2c0.1 0 6.9-6.4 6.9-6.4 0.8-1 0.4-1.7 0-2z"></path>
<path fill="#333" style="fill: var(--color3, #333)" d="M15.7 18.7c-0.2 0-0.4-0.1-0.5-0.2l-1.2-1.2c-0.2-0.2-0.3-0.5-0.2-0.8 0.1-0.2 0.1-0.3 6.5-7.2 0.5-0.5 1.9-1.2 2.9-0.4 0.7 0.6 1.2 1.7 0.1 3.1 0 0-0.1 0.1-0.1 0.1-6.9 6.5-7 6.5-7.1 6.6-0.3 0-0.4 0-0.4 0zM15.4 16.7l0.2 0.2c1.2-1.1 4.2-3.9 6.3-5.9 0.5-0.6 0.2-0.8 0.1-0.9 0 0 0 0 0 0-0.1-0.1-0.7 0.1-0.8 0.3-1.9 2.1-4.7 5.1-5.8 6.3zM22.5 11.5v0 0z"></path>
</symbol>
<symbol id="tcb-icon-guarantee_box" viewBox="0 0 32 32">
<title>guarantee_box</title>
<path d="M27.977 11.829c0-0.213-0.086-0.418-0.239-0.566l-1.781-1.729 0.837-2.313c0.072-0.2 0.062-0.42-0.031-0.611-0.092-0.191-0.258-0.337-0.459-0.405l-2.381-0.802-0.268-2.445c-0.023-0.209-0.129-0.4-0.293-0.531s-0.378-0.192-0.583-0.167l-2.512 0.29-1.329-2.099c-0.232-0.367-0.716-0.477-1.085-0.248l-2.135 1.332-2.134-1.332c-0.367-0.229-0.852-0.119-1.085 0.247l-1.332 2.1-2.512-0.29c-0.21-0.024-0.418 0.036-0.583 0.167s-0.27 0.322-0.292 0.531l-0.27 2.443-2.381 0.803c-0.201 0.067-0.367 0.213-0.459 0.405s-0.103 0.412-0.031 0.612l0.84 2.312-1.783 1.729c-0.153 0.149-0.24 0.353-0.24 0.567 0 0.213 0.086 0.418 0.24 0.566l1.783 1.731-0.84 2.311c-0.072 0.2-0.062 0.42 0.031 0.612 0.092 0.191 0.258 0.338 0.459 0.405l2.381 0.802 0.269 2.446c0.023 0.209 0.128 0.4 0.292 0.531 0.165 0.132 0.375 0.192 0.583 0.167l2.512-0.291 0.53 0.837c0.001 0.002 0.002 0.003 0.003 0.005l0.115 0.181v9.047c0 0.277 0.146 0.534 0.383 0.677s0.532 0.15 0.777 0.021l3.103-1.649 2.303 1.601c0.135 0.094 0.292 0.141 0.45 0.141 0.125 0 0.251-0.029 0.365-0.090 0.261-0.136 0.424-0.405 0.424-0.699v-9.048l0.646-1.021 2.512 0.291c0.206 0.026 0.419-0.035 0.583-0.167 0.164-0.131 0.27-0.322 0.293-0.531l0.268-2.447 2.381-0.801c0.201-0.067 0.367-0.214 0.459-0.405 0.093-0.191 0.104-0.412 0.031-0.611l-0.837-2.312 1.781-1.731c0.155-0.151 0.241-0.356 0.241-0.569zM18.042 29.669l-1.458-1.014c-0.244-0.17-0.561-0.188-0.821-0.049l-2.369 1.26v-6.337c0.064-0.020 0.13-0.034 0.19-0.071l2.134-1.331 2.135 1.331c0.061 0.038 0.124 0.064 0.189 0.084v6.127zM24.49 13.349c-0.223 0.216-0.298 0.543-0.192 0.835l0.735 2.032-2.093 0.705c-0.291 0.098-0.499 0.356-0.533 0.662l-0.236 2.158-2.216-0.256c-0.297-0.034-0.596 0.106-0.758 0.362l-1.175 1.855-1.887-1.177c-0.256-0.16-0.58-0.16-0.836 0l-1.888 1.178-0.38-0.598c-0.001-0.002-0.001-0.003-0.002-0.005l-0.795-1.255c-0.162-0.255-0.452-0.4-0.758-0.361l-2.215 0.256-0.237-2.158c-0.034-0.306-0.242-0.564-0.533-0.662l-2.092-0.704 0.738-2.032c0.106-0.292 0.031-0.62-0.192-0.836l-1.566-1.52 1.566-1.518c0.223-0.217 0.298-0.544 0.192-0.836l-0.738-2.032 2.092-0.705c0.292-0.098 0.499-0.356 0.533-0.662l0.237-2.158 2.216 0.255c0.305 0.036 0.595-0.106 0.757-0.361l1.178-1.856 1.888 1.178c0.256 0.159 0.58 0.159 0.836 0l1.887-1.177 1.175 1.855c0.162 0.256 0.46 0.399 0.758 0.362l2.216-0.255 0.236 2.157c0.034 0.306 0.242 0.564 0.533 0.662l2.093 0.705-0.735 2.034c-0.105 0.292-0.030 0.619 0.192 0.835l1.565 1.519-1.566 1.519z"></path>
<path d="M15.718 5.435c-3.599 0-6.527 2.868-6.527 6.394 0 3.525 2.928 6.394 6.527 6.394 3.6 0 6.527-2.868 6.527-6.394s-2.928-6.394-6.527-6.394zM15.718 16.723c-2.772 0-5.027-2.195-5.027-4.894s2.255-4.894 5.027-4.894c2.772 0 5.027 2.195 5.027 4.894s-2.255 4.894-5.027 4.894z"></path>
</symbol>
<symbol id="tcb-icon-menu" viewBox="0 0 32 32">
<path d="M23.353 7.514h-14.77c-1.408 0-2.553 1.145-2.553 2.553s1.145 2.553 2.553 2.553h14.77c1.407 0 2.553-1.145 2.553-2.553-0.001-1.408-1.146-2.553-2.553-2.553zM23.353 11.119h-14.77c-0.581 0-1.053-0.472-1.053-1.053s0.472-1.053 1.053-1.053h14.77c0.58 0 1.053 0.472 1.053 1.053-0.001 0.581-0.473 1.053-1.053 1.053z"/>
<path d="M23.353 13.849h-14.77c-1.408 0-2.553 1.145-2.553 2.552 0 1.408 1.145 2.552 2.553 2.552h14.77c1.407 0 2.553-1.145 2.553-2.552-0.001-1.407-1.146-2.552-2.553-2.552zM23.353 17.453h-14.77c-0.581 0-1.053-0.472-1.053-1.052s0.472-1.052 1.053-1.052h14.77c0.58 0 1.053 0.472 1.053 1.052-0.001 0.58-0.473 1.052-1.053 1.052z"/>
<path d="M23.353 20.282h-14.77c-1.408 0-2.553 1.146-2.553 2.553 0 1.408 1.145 2.554 2.553 2.554h14.77c1.407 0 2.553-1.146 2.553-2.554-0.001-1.407-1.146-2.553-2.553-2.553zM23.353 23.889h-14.77c-0.581 0-1.053-0.473-1.053-1.054 0-0.58 0.472-1.053 1.053-1.053h14.77c0.58 0 1.053 0.473 1.053 1.053-0.001 0.581-0.473 1.054-1.053 1.054z"/>
<path d="M29.352-0.009h-26.705c-1.465 0-2.657 1.192-2.657 2.657v26.704c0 1.466 1.192 2.658 2.657 2.658h26.704c1.466 0 2.658-1.192 2.658-2.658v-26.704c0.001-1.465-1.192-2.657-2.657-2.657zM30.51 29.352c0 0.639-0.52 1.158-1.158 1.158h-26.705c-0.638 0-1.157-0.52-1.157-1.158v-26.704c0-0.638 0.519-1.157 1.157-1.157h26.704c0.639 0 1.158 0.519 1.158 1.157v26.704z"/>
</symbol>
<symbol id="icon-arrows-alt-regular" viewBox="0 0 512 512">
<path d="M276 236.075h115.85v-76.15c0-10.691 12.926-16.045 20.485-8.485l96.149 96.149c4.686 4.686 4.686 12.284 0 16.971l-96.149 96.149c-7.56 7.56-20.485 2.206-20.485-8.485v-76.149H275.999v115.776h76.15c10.691 0 16.045 12.926 8.485 20.485l-96.149 96.15c-4.686 4.686-12.284 4.686-16.971 0l-96.149-96.149c-7.56-7.56-2.206-20.485 8.485-20.485H236V276.075H120.149v76.149c0 10.691-12.926 16.045-20.485 8.485L3.515 264.56c-4.686-4.686-4.686-12.284 0-16.971l96.149-96.149c7.56-7.56 20.485-2.206 20.485 8.485v76.15H236V120.15h-76.149c-10.691 0-16.045-12.926-8.485-20.485l96.149-96.149c4.686-4.686 12.284-4.686 16.971 0l96.149 96.149c7.56 7.56 2.206 20.485-8.485 20.485H276v115.925z"></path>
</symbol>
<symbol id="icon-arrows-alt-v-regular" viewBox="0 0 256 512">
<path d="M227.03 388.97H156V123.03h71.03c10.691 0 16.045-12.926 8.485-20.485l-99.029-99.03c-4.686-4.686-12.284-4.686-16.971 0l-99.029 99.03c-7.56 7.56-2.206 20.485 8.485 20.485H100v265.94H28.97c-10.691 0-16.045 12.926-8.485 20.485l99.029 99.03c4.686 4.686 12.284 4.686 16.971 0l99.029-99.03c7.56-7.559 2.206-20.485-8.484-20.485z"></path>
</symbol>
<symbol id="icon-arrows-alt-h-regular" viewBox="0 0 512 512">
<path d="M508.485 247.515l-99.03-99.029c-7.56-7.56-20.485-2.206-20.485 8.485V228H123.03v-71.03c0-10.691-12.926-16.045-20.485-8.485l-99.03 99.029c-4.686 4.686-4.686 12.284 0 16.971l99.03 99.029c7.56 7.56 20.485 2.206 20.485-8.485V284h265.941v71.03c0 10.691 12.926 16.045 20.485 8.485l99.03-99.029c4.686-4.687 4.686-12.285-.001-16.971z"></path>
</symbol>
<symbol id="tcb-icon-undo" viewBox="0 0 512 512">
<path d="M12 8h27.711c6.739 0 12.157 5.548 11.997 12.286l-2.347 98.568C93.925 51.834 170.212 7.73 256.793 8.001 393.18 8.428 504.213 120.009 504 256.396 503.786 393.181 392.835 504 256 504c-63.926 0-122.202-24.187-166.178-63.908-5.113-4.618-5.354-12.561-.482-17.433l19.738-19.738c4.498-4.498 11.753-4.785 16.501-.552C160.213 433.246 205.895 452 256 452c108.322 0 196-87.662 196-196 0-108.322-87.662-196-196-196-79.545 0-147.941 47.282-178.675 115.302l126.389-3.009c6.737-.16 12.286 5.257 12.286 11.997V212c0 6.627-5.373 12-12 12H12c-6.627 0-12-5.373-12-12V20C0 13.373 5.373 8 12 8z"/>
</symbol>
<symbol id="tcb-icon-collapse-regular" viewBox="0 0 10 10">
<path fill="#FFF" d="M7.857 4.643v.714c0 .147-.12.268-.268.268H2.411a.269.269 0 0 1-.268-.268v-.714c0-.147.12-.268.268-.268h5.178c.148 0 .268.12.268.268zM10 1.07V8.93C10 9.52 9.52 10 8.929 10H1.07C.48 10 0 9.52 0 8.929V1.07C0 .48.48 0 1.071 0H8.93C9.52 0 10 .48 10 1.071zM8.929 8.795v-7.59a.134.134 0 0 0-.134-.134h-7.59a.134.134 0 0 0-.134.134v7.59c0 .073.06.134.134.134h7.59c.073 0 .134-.06.134-.134z"/>
</symbol>
<symbol id="tcb-icon-expand-regular" viewBox="0 0 10 10">
<path fill="#FFF"
d="M7.857 4.643v.714c0 .147-.12.268-.268.268H5.625v1.964c0 .148-.12.268-.268.268h-.714a.269.269 0 0 1-.268-.268V5.625H2.411a.269.269 0 0 1-.268-.268v-.714c0-.147.12-.268.268-.268h1.964V2.411c0-.148.12-.268.268-.268h.714c.147 0 .268.12.268.268v1.964h1.964c.148 0 .268.12.268.268zM10 1.07V8.93C10 9.52 9.52 10 8.929 10H1.07C.48 10 0 9.52 0 8.929V1.07C0 .48.48 0 1.071 0H8.93C9.52 0 10 .48 10 1.071zM8.929 8.795v-7.59a.134.134 0 0 0-.134-.134h-7.59a.134.134 0 0 0-.134.134v7.59c0 .073.06.134.134.134h7.59c.073 0 .134-.06.134-.134z"/>
</symbol>
<symbol id="tcb-icon-toggle" viewBox="0 0 32 32">
<path d="M31.327 0h-30.654c-0.414 0-0.75 0.336-0.75 0.75v30.356c0 0.414 0.336 0.75 0.75 0.75h30.654c0.414 0 0.75-0.336 0.75-0.75v-30.356c0-0.414-0.336-0.75-0.75-0.75zM1.423 16.385v-6.647h29.154v6.647h-29.154zM30.577 1.5v6.687h-29.154v-6.687h29.154zM1.423 30.354v-12.43h29.154v12.43h-29.154z"/>
<path d="M3.839 5.472h0.785v0.785c0 0.276 0.224 0.5 0.5 0.5s0.5-0.224 0.5-0.5v-0.785h0.784c0.276 0 0.5-0.224 0.5-0.5s-0.224-0.5-0.5-0.5h-0.784v-0.785c0-0.276-0.224-0.5-0.5-0.5s-0.5 0.224-0.5 0.5v0.785h-0.785c-0.276 0-0.5 0.224-0.5 0.5s0.224 0.5 0.5 0.5z"/>
<path d="M12.514 5.707h14.108c0.414 0 0.75-0.336 0.75-0.75s-0.336-0.75-0.75-0.75h-14.108c-0.414 0-0.75 0.336-0.75 0.75s0.336 0.75 0.75 0.75z"/>
<path d="M26.622 21.604h-14.108c-0.414 0-0.75 0.336-0.75 0.75s0.336 0.75 0.75 0.75h14.108c0.414 0 0.75-0.336 0.75-0.75s-0.336-0.75-0.75-0.75z"/>
<path d="M19.459 24.674h-6.945c-0.414 0-0.75 0.336-0.75 0.75s0.336 0.75 0.75 0.75h6.945c0.414 0 0.75-0.336 0.75-0.75s-0.336-0.75-0.75-0.75z"/>
<path d="M6.408 21.868h-2.569c-0.276 0-0.5 0.224-0.5 0.5s0.224 0.5 0.5 0.5h2.569c0.276 0 0.5-0.224 0.5-0.5s-0.223-0.5-0.5-0.5z"/>
<path d="M6.408 12.658h-0.784v-0.785c0-0.276-0.224-0.5-0.5-0.5s-0.5 0.224-0.5 0.5v0.785h-0.785c-0.276 0-0.5 0.224-0.5 0.5s0.224 0.5 0.5 0.5h0.785v0.785c0 0.276 0.224 0.5 0.5 0.5s0.5-0.224 0.5-0.5v-0.785h0.784c0.276 0 0.5-0.224 0.5-0.5s-0.223-0.5-0.5-0.5z"/>
<path d="M26.622 12.394h-14.108c-0.414 0-0.75 0.336-0.75 0.75s0.336 0.75 0.75 0.75h14.108c0.414 0 0.75-0.336 0.75-0.75s-0.336-0.75-0.75-0.75z"/>
</symbol>
<symbol id="tcb-icon-tabs" viewBox="0 0 32 32">
<path d="M28.357 6.832h-1.788l-2.743-3.868c-0.141-0.198-0.368-0.316-0.611-0.316h-14.465c-0.104 0-0.202 0.021-0.292 0.059-0.079-0.028-0.158-0.059-0.244-0.059h-6.464c-0.965 0-1.75 0.785-1.75 1.75v3.229c0 0.082 0.015 0.16 0.041 0.233v17.288c0 1.986 1.616 3.602 3.602 3.602h24.715c1.986 0 3.602-1.615 3.602-3.602v-14.715c-0.001-1.986-1.616-3.601-3.603-3.601zM15.827 4.148l1.903 2.684h-6.161l-1.903-2.684h6.161zM24.731 6.832h-5.162l-1.903-2.684h5.161l1.904 2.684zM30.459 25.148c0 1.159-0.942 2.102-2.102 2.102h-24.714c-1.159 0-2.102-0.942-2.102-2.102v-17.521c0-0.082-0.015-0.16-0.041-0.233v-2.996c0-0.138 0.112-0.25 0.25-0.25h6.077l2.743 3.868c0.141 0.198 0.369 0.316 0.612 0.316h17.176c1.159 0 2.102 0.943 2.102 2.102v14.714z"/>
<path d="M25.924 17.206h-19.848c-0.414 0-0.75 0.336-0.75 0.75s0.336 0.75 0.75 0.75h19.848c0.414 0 0.75-0.336 0.75-0.75s-0.336-0.75-0.75-0.75z"/>
<path d="M19.466 21.074h-13.39c-0.414 0-0.75 0.336-0.75 0.75s0.336 0.75 0.75 0.75h13.39c0.414 0 0.75-0.336 0.75-0.75s-0.336-0.75-0.75-0.75z"/>
<path d="M25.924 13.338h-19.848c-0.414 0-0.75 0.336-0.75 0.75s0.336 0.75 0.75 0.75h19.848c0.414 0 0.75-0.336 0.75-0.75s-0.336-0.75-0.75-0.75z"/>
</symbol>
<symbol id="tcb-icon-table_contents" viewBox="0 0 32 32">
<path d="M26.908 2.109h-4.403v-0.323c0-0.971-0.789-1.76-1.76-1.76h-10.134c-0.97 0-1.76 0.79-1.76 1.76v0.323h-3.76c-1.527 0-2.77 1.243-2.77 2.77v24.325c0 1.527 1.242 2.771 2.77 2.771h21.817c1.527 0 2.771-1.243 2.771-2.771v-24.325c0-1.527-1.244-2.77-2.771-2.77zM10.352 1.786c0-0.144 0.117-0.26 0.26-0.26h10.134c0.144 0 0.26 0.117 0.26 0.26v2.334c0 0.144-0.116 0.26-0.26 0.26h-10.135c-0.143 0-0.26-0.117-0.26-0.26v-2.334zM28.179 29.204c0 0.7-0.57 1.271-1.271 1.271h-21.817c-0.7 0-1.27-0.57-1.27-1.271v-24.325c0-0.701 0.569-1.27 1.27-1.27h3.761v0.51c0 0.971 0.79 1.76 1.76 1.76h10.134c0.971 0 1.76-0.79 1.76-1.76v-0.51h4.403c0.7 0 1.271 0.57 1.271 1.27v24.325z"/>
<path d="M22.749 19.469h-10.093c-0.445 0-0.805 0.36-0.805 0.805 0 0.444 0.36 0.805 0.805 0.805h10.093c0.444 0 0.805-0.36 0.805-0.805s-0.361-0.805-0.805-0.805z"/>
<path d="M22.749 23.673h-10.093c-0.445 0-0.805 0.36-0.805 0.805 0 0.444 0.36 0.805 0.805 0.805h10.093c0.444 0 0.805-0.36 0.805-0.805s-0.361-0.805-0.805-0.805z"/>
<path d="M22.749 11.063h-10.093c-0.445 0-0.805 0.36-0.805 0.805s0.36 0.805 0.805 0.805h10.093c0.444 0 0.805-0.36 0.805-0.805s-0.361-0.805-0.805-0.805z"/>
<path d="M22.749 15.266h-10.093c-0.445 0-0.805 0.36-0.805 0.805s0.36 0.805 0.805 0.805h10.093c0.444 0 0.805-0.36 0.805-0.805s-0.361-0.805-0.805-0.805z"/>
<path d="M10.841 11.615c0 0.695-0.563 1.258-1.258 1.258s-1.258-0.563-1.258-1.258c0-0.695 0.563-1.258 1.258-1.258s1.258 0.563 1.258 1.258z"/>
<path d="M10.841 15.909c0 0.695-0.563 1.258-1.258 1.258s-1.258-0.563-1.258-1.258c0-0.695 0.563-1.258 1.258-1.258s1.258 0.563 1.258 1.258z"/>
<path d="M10.841 20.202c0 0.695-0.563 1.258-1.258 1.258s-1.258-0.563-1.258-1.258c0-0.695 0.563-1.258 1.258-1.258s1.258 0.563 1.258 1.258z"/>
<path d="M10.841 24.495c0 0.695-0.563 1.258-1.258 1.258s-1.258-0.563-1.258-1.258c0-0.695 0.563-1.258 1.258-1.258s1.258 0.563 1.258 1.258z"/>
</symbol>
<symbol id="tcb-icon-arrows-v-regular" viewBox="0 0 320 512">
<path d="M273.1 347.4c-4.8-4.8-12.5-4.7-17.1.2l-70 73.2V91.2l70 73.2c4.7 4.8 12.4 4.9 17.1.2l19.6-19.6c4.7-4.7 4.7-12.3 0-17L168.5 3.5c-4.7-4.7-12.3-4.7-17 0L27.2 128c-4.7 4.7-4.7 12.3 0 17l19.6 19.6c4.8 4.8 12.5 4.7 17.1-.2l70-73.2v329.6l-70-73.2c-4.7-4.8-12.4-4.9-17.1-.2L27.2 367c-4.7 4.7-4.7 12.3 0 17l124.3 124.5c4.7 4.7 12.3 4.7 17 0L292.8 384c4.7-4.7 4.7-12.3 0-17l-19.7-19.6z"/>
</symbol>
<symbol id="tcb-icon-contact_form" viewBox="0 0 32 32">
<path d="M32 25.2h-31.9v-9.9h31.9v9.9zM1.6 23.7h28.9v-6.9h-28.9v6.9z"/>
<path d="M32 25.2h-32v-9.9h32v9.9zM1.5 23.7h29v-6.9h-29v6.9z"/>
<path d="M32 13.7h-32v-4.9h32v4.9zM1.5 12.2h29v-1.9h-29v1.9z"/>
<path d="M31.9 7.2h-31.9v-4.9h31.9v4.9zM1.5 5.7h28.9v-1.9h-28.9v1.9z"/>
<path d="M32 7.2h-32v-4.9h32v4.9zM1.5 5.7h29v-1.9h-29v1.9z"/>
<path d="M0.1 28.2h8.2v1.5h-8.2v-1.5z"/>
</symbol>
<symbol id="tcb-icon-lead_gen" viewBox="0 0 32 32">
<path d="M31.98 17.5h-31.966v-7.455h31.966v7.455zM1.514 16h28.966v-4.455h-28.966v4.455z"/>
<path d="M28.346 20.15h-24.637c-2.008 0-3.641 1.633-3.641 3.641s1.633 3.642 3.641 3.642h8.193v-1.5h-8.193c-1.181 0-2.141-0.961-2.141-2.142s0.96-2.141 2.141-2.141h24.637c1.18 0 2.141 0.96 2.141 2.141s-0.961 2.142-2.141 2.142h-8.193v1.5h8.193c2.008 0 3.641-1.634 3.641-3.642s-1.633-3.641-3.641-3.641z"/>
<path d="M31.98 7.455h-31.966v-7.455h31.966v7.455zM1.514 5.955h28.966v-4.455h-28.966v4.455z"/>
<path d="M18.662 28.306l-2.809-4.24-2.568 4.228 1.959 0.004 0.002 3.702h1.5l-0.002-3.698z"/>
</symbol>
<symbol id="icon-g" viewBox="0 0 640 512">
<path d="M386.061 228.496c1.834 9.692 3.143 19.384 3.143 31.956C389.204 370.205 315.599 448 204.8 448c-106.084 0-192-85.915-192-192s85.916-192 192-192c51.864 0 95.083 18.859 128.611 50.292l-52.126 50.03c-14.145-13.621-39.028-29.599-76.485-29.599-65.484 0-118.92 54.221-118.92 121.277 0 67.056 53.436 121.277 118.92 121.277 75.961 0 104.513-54.745 108.965-82.773H204.8v-66.009h181.261zm185.406 6.437V179.2h-56.001v55.733h-55.733v56.001h55.733v55.733h56.001v-55.733H627.2v-56.001h-55.733z"/>
</symbol>
<symbol id="icon-fb" viewBox="0 0 264 512">
<path d="M76.7 512V283H0v-91h76.7v-71.7C76.7 42.4 124.3 0 193.8 0c33.3 0 61.9 2.5 70.2 3.6V85h-48.2c-37.8 0-45.1 18-45.1 44.3V192H256l-11.7 91h-73.6v229"/>
</symbol>
<symbol id="icon-t" viewBox="0 0 512 512">
<path d="M459.37 151.716c.325 4.548.325 9.097.325 13.645 0 138.72-105.583 298.558-298.558 298.558-59.452 0-114.68-17.219-161.137-47.106 8.447.974 16.568 1.299 25.34 1.299 49.055 0 94.213-16.568 130.274-44.832-46.132-.975-84.792-31.188-98.112-72.772 6.498.974 12.995 1.624 19.818 1.624 9.421 0 18.843-1.3 27.614-3.573-48.081-9.747-84.143-51.98-84.143-102.985v-1.299c13.969 7.797 30.214 12.67 47.431 13.319-28.264-18.843-46.781-51.005-46.781-87.391 0-19.492 5.197-37.36 14.294-52.954 51.655 63.675 129.3 105.258 216.365 109.807-1.624-7.797-2.599-15.918-2.599-24.04 0-57.828 46.782-104.934 104.934-104.934 30.213 0 57.502 12.67 76.67 33.137 23.715-4.548 46.456-13.32 66.599-25.34-7.798 24.366-24.366 44.833-46.132 57.827 21.117-2.273 41.584-8.122 60.426-16.243-14.292 20.791-32.161 39.308-52.628 54.253z"/>
</symbol>
<symbol id="icon-x" viewBox="0 0 512 512">
<path d="M389.2 48h70.6L305.6 224.2 487 464H345L233.7 318.6 106.5 464H35.8L200.7 275.5 26.8 48H172.4L272.9 180.9 389.2 48zM364.4 421.8h39.1L151.1 88h-42L364.4 421.8z"/>
</symbol>
<symbol id="icon-pin" viewBox="0 0 384 512">
<path d="M204 6.5C101.4 6.5 0 74.9 0 185.6 0 256 39.6 296 63.6 296c9.9 0 15.6-27.6 15.6-35.4 0-9.3-23.7-29.1-23.7-67.8 0-80.4 61.2-137.4 140.4-137.4 68.1 0 118.5 38.7 118.5 109.8 0 53.1-21.3 152.7-90.3 152.7-24.9 0-46.2-18-46.2-43.8 0-37.8 26.4-74.4 26.4-113.4 0-66.2-93.9-54.2-93.9 25.8 0 16.8 2.1 35.4 9.6 50.7-13.8 59.4-42 147.9-42 209.1 0 18.9 2.7 37.5 4.5 56.4 3.4 3.8 1.7 3.4 6.9 1.5 50.4-69 48.6-82.5 71.4-172.8 12.3 23.4 44.1 36 69.3 36 106.2 0 153.9-103.5 153.9-196.8C384 71.3 298.2 6.5 204 6.5z"/>
</symbol>
<symbol id="icon-in" viewBox="0 0 448 512">
<path d="M100.3 480H7.4V180.9h92.9V480zM53.8 140.1C24.1 140.1 0 115.5 0 85.8 0 56.1 24.1 32 53.8 32c29.7 0 53.8 24.1 53.8 53.8 0 29.7-24.1 54.3-53.8 54.3zM448 480h-92.7V334.4c0-34.7-.7-79.2-48.3-79.2-48.3 0-55.7 37.7-55.7 76.7V480h-92.8V180.9h89.1v40.8h1.3c12.4-23.5 42.7-48.3 87.9-48.3 94 0 111.3 61.9 111.3 142.3V480z"/>
</symbol>
<symbol id="icon-xing" viewBox="0 0 384 512">
<path d="M162.7 210c-1.8 3.3-25.2 44.4-70.1 123.5-4.9 8.3-10.8 12.5-17.7 12.5H9.8c-7.7 0-12.1-7.5-8.5-14.4l69-121.3c.2 0 .2-.1 0-.3l-43.9-75.6c-4.3-7.8.3-14.1 8.5-14.1H100c7.3 0 13.3 4.1 18 12.2l44.7 77.5zM382.6 46.1l-144 253v.3L330.2 466c3.9 7.1.2 14.1-8.5 14.1h-65.2c-7.6 0-13.6-4-18-12.2l-92.4-168.5c3.3-5.8 51.5-90.8 144.8-255.2 4.6-8.1 10.4-12.2 17.5-12.2h65.7c8 0 12.3 6.7 8.5 14.1z"/>
</symbol>
<symbol id="icon-yt" viewBox="0 0 576 512">
<path d="M549.655 124.083c-6.281-23.65-24.787-42.276-48.284-48.597C458.781 64 288 64 288 64S117.22 64 74.629 75.486c-23.497 6.322-42.003 24.947-48.284 48.597-11.412 42.867-11.412 132.305-11.412 132.305s0 89.438 11.412 132.305c6.281 23.65 24.787 41.5 48.284 47.821C117.22 448 288 448 288 448s170.78 0 213.371-11.486c23.497-6.321 42.003-24.171 48.284-47.821 11.412-42.867 11.412-132.305 11.412-132.305s0-89.438-11.412-132.305zm-317.51 213.508V175.185l142.739 81.205-142.739 81.201z"/>
</symbol>
<symbol id="icon-ig" viewBox="0 0 448 512">
<path d="M224.1 141c-63.6 0-114.9 51.3-114.9 114.9s51.3 114.9 114.9 114.9S339 319.5 339 255.9 287.7 141 224.1 141zm0 189.6c-41.1 0-74.7-33.5-74.7-74.7s33.5-74.7 74.7-74.7 74.7 33.5 74.7 74.7-33.6 74.7-74.7 74.7zm146.4-194.3c0 14.9-12 26.8-26.8 26.8-14.9 0-26.8-12-26.8-26.8s12-26.8 26.8-26.8 26.8 12 26.8 26.8zm76.1 27.2c-1.7-35.9-9.9-67.7-36.2-93.9-26.2-26.2-58-34.4-93.9-36.2-37-2.1-147.9-2.1-184.9 0-35.8 1.7-67.6 9.9-93.9 36.1s-34.4 58-36.2 93.9c-2.1 37-2.1 147.9 0 184.9 1.7 35.9 9.9 67.7 36.2 93.9s58 34.4 93.9 36.2c37 2.1 147.9 2.1 184.9 0 35.9-1.7 67.7-9.9 93.9-36.2 26.2-26.2 34.4-58 36.2-93.9 2.1-37 2.1-147.8 0-184.8zM398.8 388c-7.8 19.6-22.9 34.7-42.6 42.6-29.5 11.7-99.5 9-132.1 9s-102.7 2.6-132.1-9c-19.6-7.8-34.7-22.9-42.6-42.6-11.7-29.5-9-99.5-9-132.1s-2.6-102.7 9-132.1c7.8-19.6 22.9-34.7 42.6-42.6 29.5-11.7 99.5-9 132.1-9s102.7-2.6 132.1 9c19.6 7.8 34.7 22.9 42.6 42.6 11.7 29.5 9 99.5 9 132.1s2.7 102.7-9 132.1z"/>
</symbol>
<symbol id="icon-bluesky" viewBox="0 0 512 512">
<path d="M111.8 62.2C170.2 105.9 233 194.7 256 242.4c23-47.6 85.8-136.4 144.2-180.2c42.1-31.6 110.3-56 110.3 21.8c0 15.5-8.9 130.5-14.1 149.2C478.2 298 412 314.6 353.1 304.5c102.9 17.5 129.1 75.5 72.5 133.5c-107.4 110.2-154.3-27.6-166.3-62.9l0 0c-1.7-4.9-2.6-7.8-3.3-7.8s-1.6 3-3.3 7.8l0 0c-12 35.3-59 173.1-166.3 62.9c-56.5-58-30.4-116 72.5-133.5C100 314.6 33.8 298 15.7 233.1C10.4 214.4 1.5 99.4 1.5 83.9c0-77.8 68.2-53.4 110.3-21.8z"/>
</symbol>
<symbol id="icon-link" viewBox="0 0 14 15">
<path d="M8.586 5.664c.456.456.775.989.957 1.6.182.61.214 1.226.096 1.845a3.703 3.703 0 0 1-.78 1.668c-.09.11-.483.51-1.175 1.203L6.535 13.13a3.755 3.755 0 0 1-1.723.998 3.795 3.795 0 0 1-1.968 0 3.755 3.755 0 0 1-1.723-.998 3.755 3.755 0 0 1-.998-1.723 3.795 3.795 0 0 1 0-1.968c.173-.657.506-1.231.998-1.723l1.723-1.723c.11-.11.232-.137.369-.082a.3.3 0 0 1 .205.301c0 .346.046.693.137 1.039.018.11-.019.21-.11.3L2.215 8.81a2.149 2.149 0 0 0-.684 1.613c0 .638.224 1.18.67 1.627.447.446.99.67 1.627.67.638 0 1.176-.228 1.613-.684l2.079-2.05c.437-.438.656-.976.656-1.614 0-.638-.219-1.185-.656-1.64a2.165 2.165 0 0 0-.63-.438c-.145-.073-.209-.182-.19-.328.036-.328.172-.61.41-.848l.109-.11c.127-.109.255-.127.383-.054.364.182.692.42.984.711zm4.293-4.293c.492.492.825 1.067.998 1.723a3.795 3.795 0 0 1 0 1.969 3.755 3.755 0 0 1-.998 1.722l-1.723 1.723c-.11.11-.232.137-.369.082a.3.3 0 0 1-.205-.3c0-.347-.046-.694-.137-1.04-.018-.11.019-.21.11-.3l1.23-1.259c.456-.437.684-.975.684-1.613s-.224-1.18-.67-1.627a2.215 2.215 0 0 0-1.627-.67c-.638 0-1.176.228-1.613.684L6.48 4.515c-.437.438-.656.976-.656 1.614 0 .638.219 1.185.656 1.64.183.183.392.329.63.438.145.073.209.182.19.328-.036.328-.172.61-.41.848l-.109.11c-.127.109-.255.127-.383.054a3.766 3.766 0 0 1-.984-.711 3.745 3.745 0 0 1-.957-1.6 3.841 3.841 0 0 1-.096-1.845c.119-.62.379-1.176.78-1.668.09-.11.483-.51 1.175-1.203L7.465 1.37A3.755 3.755 0 0 1 9.187.373a3.795 3.795 0 0 1 1.97 0c.655.173 1.23.506 1.722.998z"/>
</symbol>
<symbol id="tcb-icon-login_elem" viewBox="0 0 30 22">
<path fill="#50565F" fill-rule="nonzero"
d="M1.913 8.748c0-.51.409-.928.909-.928h8.18V2.378c0-.411.489-.62.773-.33l8.044 8.294a.94.94 0 0 1 0 1.315l-8.044 8.294c-.284.29-.773.087-.773-.33v-5.443h-8.18a.921.921 0 0 1-.909-.927V8.748M0 8.736v4.527c0 1.544 1.232 2.796 2.75 2.796h6.417v3.607c0 2.068 2.463 3.117 3.907 1.649l8.118-8.332a2.833 2.833 0 0 0 0-3.962L13.074.684C11.636-.778 9.167.259 9.167 2.333v3.606H2.75C1.232 5.94 0 7.198 0 8.736zM29.652 19.25V2.75c0-1.518-1.285-2.75-2.87-2.75h-7.89c-.395 0-.718.31-.718.688v.458c0 .378.323.687.717.687h7.892c.526 0 .956.413.956.917v16.5c0 .504-.43.917-.956.917H18.89c-.394 0-.717.309-.717.687v.459c0 .378.323.687.717.687h7.892c1.584 0 2.87-1.232 2.87-2.75z"/>
</symbol>
<symbol id="icon-share-alt-light" viewBox="0 0 448 512">
<path d="M352 320c-28.6 0-54.2 12.5-71.8 32.3l-95.5-59.7c9.6-23.4 9.7-49.8 0-73.2l95.5-59.7c17.6 19.8 43.2 32.3 71.8 32.3 53 0 96-43 96-96S405 0 352 0s-96 43-96 96c0 13 2.6 25.3 7.2 36.6l-95.5 59.7C150.2 172.5 124.6 160 96 160c-53 0-96 43-96 96s43 96 96 96c28.6 0 54.2-12.5 71.8-32.3l95.5 59.7c-4.7 11.3-7.2 23.6-7.2 36.6 0 53 43 96 96 96s96-43 96-96c-.1-53-43.1-96-96.1-96zm0-288c35.3 0 64 28.7 64 64s-28.7 64-64 64-64-28.7-64-64 28.7-64 64-64zM96 320c-35.3 0-64-28.7-64-64s28.7-64 64-64 64 28.7 64 64-28.7 64-64 64zm256 160c-35.3 0-64-28.7-64-64s28.7-64 64-64 64 28.7 64 64-28.7 64-64 64z"/>
</symbol>
<symbol id="icon-share-alt-solid" viewBox="0 0 448 512">
<path d="M352 320c-22.608 0-43.387 7.819-59.79 20.895l-102.486-64.054a96.551 96.551 0 0 0 0-41.683l102.486-64.054C308.613 184.181 329.392 192 352 192c53.019 0 96-42.981 96-96S405.019 0 352 0s-96 42.981-96 96c0 7.158.79 14.13 2.276 20.841L155.79 180.895C139.387 167.819 118.608 160 96 160c-53.019 0-96 42.981-96 96s42.981 96 96 96c22.608 0 43.387-7.819 59.79-20.895l102.486 64.054A96.301 96.301 0 0 0 256 416c0 53.019 42.981 96 96 96s96-42.981 96-96-42.981-96-96-96z"/>
</symbol>
<symbol id="icon-pen-regular" viewBox="0 0 512 512">
<path d="M492.2 74.3l-54.5-54.5c-26.4-26.4-69.1-26.4-95.5 0L12.7 349.3.3 461.2c-3.2 29.2 21.5 53.7 50.5 50.5l111.8-12.4 329.6-329.6c26.4-26.4 26.4-69.1 0-95.4zM140.6 453.4l-92.3 10.3 10.3-92.3L294 135.9l82.1 82.1-235.5 235.4zm317.7-317.6L410 184.1 327.9 102l48.3-48.3c7.6-7.6 20-7.6 27.6 0l54.5 54.5c7.6 7.6 7.6 19.9 0 27.6z"/>
</symbol>
<symbol id="icon-unlink-regular" viewBox="0 0 512 512">
<path d="M304.083 388.936c4.686 4.686 4.686 12.284 0 16.971l-65.057 65.056c-54.709 54.711-143.27 54.721-197.989 0-54.713-54.713-54.719-143.27 0-197.989l65.056-65.057c4.686-4.686 12.284-4.686 16.971 0l22.627 22.627c4.686 4.686 4.686 12.284 0 16.971L81.386 311.82c-34.341 34.341-33.451 88.269.597 120.866 32.577 31.187 84.788 31.337 117.445-1.32l65.057-65.056c4.686-4.686 12.284-4.686 16.971 0l22.627 22.626zm-56.568-243.245l64.304-64.304c34.346-34.346 88.286-33.453 120.882.612 31.18 32.586 31.309 84.785-1.335 117.43l-65.056 65.057c-4.686 4.686-4.686 12.284 0 16.971l22.627 22.627c4.686 4.686 12.284 4.686 16.971 0l65.056-65.057c54.711-54.709 54.721-143.271 0-197.99-54.71-54.711-143.27-54.72-197.989 0l-65.057 65.057c-4.686 4.686-4.686 12.284 0 16.971l22.627 22.627c4.685 4.685 12.283 4.685 16.97-.001zm238.343 362.794l22.627-22.627c4.686-4.686 4.686-12.284 0-16.971L43.112 3.515c-4.686-4.686-12.284-4.686-16.971 0L3.515 26.142c-4.686 4.686-4.686 12.284 0 16.971l465.373 465.373c4.686 4.686 12.284 4.686 16.97-.001z"></path>
</symbol>
<symbol id="icon-paintbrush-solid-2" viewBox="0 0 12 12">
<path d="M3.9,7.3C3,7.3,2.1,7.7,1.6,8.9C1.6,9.1,1.4,9.2,1.3,9.2C1,9.2,0.2,8.5,0,8.4C0,10.3,0.9,12,3,12
c1.8,0,3-1,3-2.8C6,9.1,6,9,6,9L3.9,7.3L3.9,7.3z M10.7,0C10.4,0,10,0.2,9.8,0.4C5,4.7,4.5,4.8,4.5,6c0,0.3,0.1,0.6,0.2,0.9l1.5,1.2
c0.2,0,0.3,0.1,0.5,0.1c1.5,0,2.3-1.1,4.9-6C11.8,1.9,12,1.5,12,1.2C12,0.5,11.4,0,10.7,0z"/>
</symbol>
<symbol id="tcb-icon-images" viewBox="0 0 103 80">
<g fill="none" fill-opacity=".5" fill-rule="evenodd">
<g fill="#859199" fill-rule="nonzero">
<g>
<path d="M85.714 68.571v2.858c0 4.733-3.837 8.571-8.571 8.571H8.57C3.838 80 0 76.162 0 71.429V25.714c0-4.734 3.837-8.571 8.571-8.571h2.858v8.571H9.643c-.592 0-1.072.48-1.072 1.072v43.571c0 .592.48 1.072 1.072 1.072H76.07c.592 0 1.072-.48 1.072-1.072v-1.786h8.571zm7.5-60H26.786c-.592 0-1.072.48-1.072 1.072v43.571c0 .592.48 1.072 1.072 1.072h66.428c.592 0 1.072-.48 1.072-1.072V9.643c0-.592-.48-1.072-1.072-1.072zM94.286 0c4.734 0 8.571 3.837 8.571 8.571v45.715c0 4.734-3.837 8.571-8.571 8.571H25.714c-4.734 0-8.571-3.837-8.571-8.571V8.57C17.143 3.838 20.98 0 25.714 0h68.572zM47.143 20c0 3.945-3.198 7.143-7.143 7.143S32.857 23.945 32.857 20s3.198-7.143 7.143-7.143 7.143 3.198 7.143 7.143zM34.286 37.143l7.056-7.056c.837-.837 2.194-.837 3.03 0l7.057 7.056 18.484-18.485c.837-.837 2.194-.837 3.03 0l12.771 12.77v14.286H34.286v-8.571z"
transform="translate(-2229 -363) translate(2229 363)"/>
</g>
</g>
</g>
</symbol>
<symbol id="tcb-icon-database-light" viewBox="0 0 24 28">
<path fill="#6D7882"
d="M12 28c1.679 0 3.34-.146 4.982-.438 2.036-.328 3.643-.856 4.822-1.585C23.268 25.138 24 24.062 24 22.75V5.25c0-1.313-.732-2.388-2.196-3.227-1.179-.729-2.786-1.257-4.822-1.586C15.34.147 13.68 0 12 0c-1.679 0-3.34.146-4.982.438-2.036.328-3.643.856-4.822 1.585C.732 2.862 0 3.937 0 5.25v17.5c0 1.313.732 2.388 2.196 3.227 1.179.729 2.786 1.257 4.822 1.585C8.66 27.855 10.32 28 12 28zm0-17.5c-1.857 0-3.571-.155-5.143-.465-1.571-.31-2.821-.738-3.75-1.285C2.18 8.203 1.714 7.62 1.714 7V5.25c0-.62.465-1.203 1.393-1.75.929-.547 2.179-.975 3.75-1.285C8.43 1.905 10.143 1.75 12 1.75c1.857 0 3.571.155 5.143.465 1.571.31 2.821.738 3.75 1.285.928.547 1.393 1.13 1.393 1.75V7c0 .62-.465 1.203-1.393 1.75-.929.547-2.179.975-3.75 1.285-1.572.31-3.286.465-5.143.465zm0 5.25c-1.857 0-3.571-.155-5.143-.465-1.571-.31-2.821-.738-3.75-1.285-.928-.547-1.393-1.13-1.393-1.75V9.898c1.072.766 2.554 1.368 4.447 1.805 1.785.365 3.732.547 5.839.547s4.054-.182 5.84-.547c1.892-.437 3.374-1.039 4.446-1.805v2.352c0 .62-.465 1.203-1.393 1.75-.929.547-2.179.975-3.75 1.285-1.572.31-3.286.465-5.143.465zM12 21c-1.857 0-3.571-.155-5.143-.465-1.571-.31-2.821-.738-3.75-1.285-.928-.547-1.393-1.13-1.393-1.75v-2.352c1.072.766 2.554 1.368 4.447 1.805 1.785.365 3.732.547 5.839.547s4.054-.182 5.84-.547c1.892-.437 3.374-1.039 4.446-1.805V17.5c0 .62-.465 1.203-1.393 1.75-.929.547-2.179.975-3.75 1.285-1.572.31-3.286.465-5.143.465zm0 5.25c-1.857 0-3.571-.155-5.143-.465-1.571-.31-2.821-.738-3.75-1.285-.928-.547-1.393-1.13-1.393-1.75v-2.352c1.072.766 2.554 1.368 4.447 1.805 1.785.365 3.732.547 5.839.547s4.054-.182 5.84-.547c1.892-.437 3.374-1.039 4.446-1.805v2.352c0 .62-.465 1.203-1.393 1.75-.929.547-2.179.975-3.75 1.285-1.572.31-3.286.465-5.143.465z"/>
</symbol>
<symbol id="tcb-icon-plus-circle-light" viewBox="0 0 512 512">
<path d="M384 250v12c0 6.6-5.4 12-12 12h-98v98c0 6.6-5.4 12-12 12h-12c-6.6 0-12-5.4-12-12v-98h-98c-6.6 0-12-5.4-12-12v-12c0-6.6 5.4-12 12-12h98v-98c0-6.6 5.4-12 12-12h12c6.6 0 12 5.4 12 12v98h98c6.6 0 12 5.4 12 12zm120 6c0 137-111 248-248 248S8 393 8 256 119 8 256 8s248 111 248 248zm-32 0c0-119.9-97.3-216-216-216-119.9 0-216 97.3-216 216 0 119.9 97.3 216 216 216 119.9 0 216-97.3 216-216z"/>
</symbol>
</defs>
</svg>

After

Width:  |  Height:  |  Size: 67 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 4.2 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.2 KiB

View File

@@ -0,0 +1 @@
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 320 512"><path d="M151.5 347.8L3.5 201c-4.7-4.7-4.7-12.3 0-17l19.8-19.8c4.7-4.7 12.3-4.7 17 0L160 282.7l119.7-118.5c4.7-4.7 12.3-4.7 17 0l19.8 19.8c4.7 4.7 4.7 12.3 0 17l-148 146.8c-4.7 4.7-12.3 4.7-17 0z"/></svg>

After

Width:  |  Height:  |  Size: 266 B

View File

@@ -0,0 +1 @@
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 320 512"><path d="M168.5 164.2l148 146.8c4.7 4.7 4.7 12.3 0 17l-19.8 19.8c-4.7 4.7-12.3 4.7-17 0L160 229.3 40.3 347.8c-4.7 4.7-12.3 4.7-17 0L3.5 328c-4.7-4.7-4.7-12.3 0-17l148-146.8c4.7-4.7 12.3-4.7 17 0z"/></svg>

After

Width:  |  Height:  |  Size: 266 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.7 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.5 KiB

View File

@@ -0,0 +1,12 @@
<svg width="100" height="100" viewBox="0 0 100 100" xmlns="http://www.w3.org/2000/svg">
<g fill="none" fill-rule="evenodd">
<path fill="#F0F0F0" d="M0 0h100v100H0z"/>
<path d="M31.747 41.475c2.002-1.622 3.546-3.47 4.63-5.545 1.086-2.074 2.208-5.31 3.367-9.706 2.982 3.362 5.564 5.043 7.746 5.043h16.847c1.445 0 4.244 1.554 8.397 4.663-3.445 10.77-5.96 17.118-7.544 19.044-1.584 1.925-3.932 4.102-7.043 6.529.56 2.563 1.385 4.398 2.475 5.504 1.09 1.105 2.613 3.228 4.568 6.369-3.095 6.113-7.876 9.498-14.34 10.154-6.466.657-11.408-2.992-14.826-10.945 1.603-1.045 3.124-2.617 4.562-4.717a15.968 15.968 0 0 0 2.682-6.896c-4.84-3.446-7.713-6.5-8.618-9.162-.905-2.662-1.873-6.107-2.903-10.335z" fill="#EAEAEA"/>
<path d="M13.01 91.404v-8.338c0-5.523 4.477-10 10-10h12.46c3.732 7.242 8.635 10.863 14.706 10.863 6.072 0 11.133-3.62 15.183-10.863h10.256c5.523 0 10 4.477 10 10V100H13.01v-8.596z" fill="#E3E3E3"/>
<path d="M28.37 43c-1.608-5.882-1.8-11.658-.577-17.328 1.837-8.504 6.86-12.021 8.815-12.995 1.304-.65 3.625-.932 6.963-.847 10.408-1.877 17.93-.57 22.567 3.92 4.636 4.491 7.257 12.156 7.862 22.996-4.499-4.538-8.121-6.638-10.867-6.301-4.118.506-12.096 0-15.533 0-2.29 0-5.305-1.815-9.043-5.445-.807 4.808-1.828 8.187-3.062 10.138-1.235 1.95-3.61 3.905-7.124 5.862z" fill="#BEBEBE"/>
<path d="m43.403 9.748-.454.08.15.003c-3.563-.09-6.084.216-7.66 1-4.125 2.054-8.033 6.717-9.61 14.023-1.278 5.914-1.077 11.94.596 18.057a1.467 1.467 0 0 0 2.129.903c3.714-2.068 6.27-4.17 7.661-6.368l.157-.255c.976-1.646 1.798-4.026 2.49-7.162l.137-.65.265.227c3.01 2.535 5.591 3.827 7.833 3.827l1.189.013 5.946.169 1.077.022c3.294.057 5.743.003 7.518-.215 2.168-.266 5.452 1.637 9.662 5.884.955.963 2.584.228 2.508-1.132-.624-11.19-3.366-19.207-8.322-24.006-4.947-4.79-12.738-6.217-23.272-4.42zm21.235 6.56.274.271c3.52 3.582 5.79 9.316 6.753 17.227l.089.776-.107-.09c-3.519-2.97-6.547-4.337-9.176-4.014-1.508.185-3.672.242-6.56.202l-2.37-.05-5.853-.161-.591-.002c-1.809 0-4.545-1.647-8.036-5.036-.85-.827-2.272-.354-2.47.82l-.182 1.045c-.745 4.076-1.652 6.942-2.673 8.554l-.154.234c-.857 1.244-2.301 2.54-4.334 3.864l-.454.288-.032-.147c-1.075-4.955-1.094-9.818-.06-14.603 1.378-6.38 4.683-10.324 8.04-11.995 1.035-.516 3.162-.774 6.284-.695.099.003.198-.005.296-.023 10.002-1.804 17.072-.576 21.316 3.534z" fill="#979797" fill-rule="nonzero"/>
<path d="M35 72v2.887h-8.296c-7.037 0-12.741 5.557-12.741 12.412V100H11V87.299C11 78.849 18.03 72 26.704 72H35zM64 72v2.887h8.296c7.037 0 12.741 5.557 12.741 12.412V100H88V87.299C88 78.849 80.97 72 72.296 72H64z" fill="#919191" fill-rule="nonzero"/>
<path d="M41.27 61.154a1.455 1.455 0 0 1 2.847.6c-.649 3.077-1.617 5.508-2.931 7.293-.897 1.217-1.982 2.548-3.255 3.993l-.675.755.2.32c3.355 5.235 7.59 7.849 12.802 7.973l.393.005c5.356 0 9.308-2.57 12.005-7.884l.19-.388-.307-.389a118.657 118.657 0 0 1-2.798-3.72l-.49-.682c-1.564-2.185-2.573-4.134-3.016-5.876a1.453 1.453 0 1 1 2.819-.717c.342 1.344 1.193 2.987 2.563 4.903a111.443 111.443 0 0 0 4.058 5.359c.344.423.421 1.003.201 1.502C62.731 81.328 57.595 85 50.651 85c-6.895 0-12.423-3.613-16.459-10.664a1.453 1.453 0 0 1 .192-1.706c1.83-1.986 3.316-3.756 4.459-5.307 1.04-1.41 1.858-3.467 2.428-6.17z" fill="#919191" fill-rule="nonzero"/>
<path d="M71.095 36.18a1.467 1.467 0 1 1 2.876.581C70.229 55.404 62.73 65 51.39 65c-11.292 0-18.44-8.145-21.366-23.905a1.467 1.467 0 1 1 2.884-.538c2.694 14.511 8.83 21.502 18.483 21.502 9.607 0 16.203-8.443 19.703-25.878z" fill="#919191" fill-rule="nonzero"/>
</g>
</svg>

After

Width:  |  Height:  |  Size: 3.5 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 131 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 344 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 369 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 383 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 8.8 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 6.4 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 6.6 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 7.7 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 6.9 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 5.4 KiB

Some files were not shown because too many files have changed in this diff Show More