Plugin Directory

Changeset 3064464


Ignore:
Timestamp:
04/04/2024 09:00:44 AM (23 months ago)
Author:
adcaptcha
Message:

Update to version 1.1.0 from GitHub

Location:
adcaptcha
Files:
13 added
13 edited
1 copied

Legend:

Unmodified
Added
Removed
  • adcaptcha/tags/1.1.0/README.md

    r3060548 r3064464  
    2222* Login
    2323* Comments
    24 * ForgotPassword
     24* Forgot Password
    2525* Register
    2626
     
    2929* Login
    3030* Comments
    31 * ForgotPassword
     31* Forgot Password
    3232* Register
    3333
  • adcaptcha/tags/1.1.0/adcaptcha.php

    r3060699 r3064464  
    33 * Plugin Name: adCAPTCHA for WordPress
    44 * Description: Secure your site. Elevate your brand. Boost Ad Revenue.
    5  * Version: 1.0.3
     5 * Version: 1.1.0
    66 * Requires at least: 6.4.2
    77 * Requires PHP: 7.4
     
    2121require_once plugin_dir_path(__FILE__) . 'src/Instantiate.php';
    2222require_once plugin_dir_path(__FILE__) . 'src/Settings/Settings.php';
     23require_once plugin_dir_path(__FILE__) . 'src/Settings/General.php';
     24require_once plugin_dir_path(__FILE__) . 'src/Settings/Plugins.php';
    2325require_once plugin_dir_path(__FILE__) . 'src/Plugin/Login.php';
    2426require_once plugin_dir_path(__FILE__) . 'src/Plugin/Registration.php';
     
    4547    delete_option( 'adcaptcha_success_token' );
    4648    delete_option( 'adcaptcha_render_captcha' );
     49    delete_option( 'adcaptcha_selected_plugins' );
    4750}
    4851
  • adcaptcha/tags/1.1.0/readme.txt

    r3060699 r3064464  
    55Requires at least: 6.0
    66Tested up to: 6.4
    7 Stable tag: 1.0.3
     7Stable tag: 1.1.0
    88Requires PHP: 7.4
    99License: GPLv2 or later
     
    2828* Login
    2929* Comments
    30 * ForgotPassword
     30* Forgot Password
    3131* Register
    3232
     
    3535* Login
    3636* Comments
    37 * ForgotPassword
     37* Forgot Password
    3838* Register
    3939
     
    61611. Login
    62622. Comments
    63 3. ForgotPassword
     633. Forgot Password
    64644. Register
    65 5. Settings
     655. General Settings
     666. Manage Plugins
    6667
    6768== Privacy Notices ==
     
    8889= 1.0.3 =
    8990- Minor patch: update to stable plugin tag version
     91
     92= 1.1.0 =
     93- Feature: add plugin location selection in setting
  • adcaptcha/tags/1.1.0/src/Instantiate.php

    r3060548 r3064464  
    1717
    1818    public function setup() {
     19        $classes = array(
     20            'Wordpress_Login' => new Login(),
     21            'Wordpress_Register' => new Registration(),
     22            'Wordpress_ForgotPassword' => new PasswordReset(),
     23            'Wordpress_Comments' => new Comments(),
     24            'Woocommerce_Login' => new WoocommerceLogin(),
     25            'Woocommerce_ForgotPassword' => new WoocommercePasswordReset(),
     26            'Woocommerce_Register' => new WoocommerceRegistration(),
     27            'ContactForm7_Forms' => new ContactForm7(),
     28            'Mailchimp_Forms' => new MailchimpForms(),
     29        );
     30
     31        $selected_plugins = get_option('adcaptcha_selected_plugins') ? get_option('adcaptcha_selected_plugins') : array();
     32
    1933        $settings = new Settings();
    2034        $settings->setup();
    2135
    2236        if (get_option('adcaptcha_render_captcha') === '1') {
    23             $login = new Login();
    24             $login->setup();
    25 
    26             $registration = new Registration();
    27             $registration->setup();
    28 
    29             $passwordReset = new PasswordReset();
    30             $passwordReset->setup();
    31 
    32 
    33             $comments = new Comments();
    34             $comments->setup();
    35 
    36             $woocommerceLogin = new WoocommerceLogin();
    37             $woocommerceLogin->setup();
    38 
    39             $woocommercePasswordReset = new WoocommercePasswordReset();
    40             $woocommercePasswordReset->setup();
    41 
    42             $woocommerceRegistration = new WoocommerceRegistration();   
    43             $woocommerceRegistration->setup();
    44 
    45             $contactForm7 = new ContactForm7();
    46             $contactForm7->setup();
    47 
    48             $mailchimpForms = new MailchimpForms();
    49             $mailchimpForms->setup();
     37            foreach ($selected_plugins as $selected_plugin) {
     38                if (isset($classes[$selected_plugin])) {
     39                    $classes[$selected_plugin]->setup();
     40                }
     41            }
    5042        }
    5143    }
  • adcaptcha/tags/1.1.0/src/Settings/Settings.php

    r3060548 r3064464  
    2424        wp_enqueue_style('adcaptcha-admin-styles', plugins_url('../styles/settings.css', __FILE__), array(), PLUGIN_VERSION);
    2525    }
    26 
    27     public function verify_input_data($api_key, $placement_id) {
    28         $url = 'https://api.adcaptcha.com/v1/placements/' . $placement_id;
    29         $headers = [
    30             'Content-Type' => 'application/json',
    31             'Authorization' => 'Bearer ' . $api_key,
    32         ];
    33 
    34         $response = wp_remote_get($url, array(
    35             'headers' => $headers,
    36         ));
    37        
    38         if (is_wp_error($response)) {
    39             $error_message = $response->get_error_message();
    40             echo esc_html("Something went wrong: $error_message");
    41         }
    42 
    43         return $response;
    44     }
    4526     
    4627    public function render_adcaptcha_options_page() {
    47         $save_error = false;
    48         $saved_successfully = false;
    49         // Saves the Api Key and Placements ID in the wp db
    50         if ($_SERVER["REQUEST_METHOD"] == "POST") {
    51             $nonce = sanitize_text_field(wp_unslash($_POST['_wpnonce']));
    52             // Verify the nonce
    53             if (!isset($nonce) || !wp_verify_nonce($nonce, 'adcaptcha_form_action')) {
    54                 die('Invalid nonce');
    55             }
    56 
    57             $api_key = sanitize_text_field(wp_unslash($_POST['adcaptcha_option_name']['api_key']));
    58             $placement_id = sanitize_text_field(wp_unslash($_POST['adcaptcha_option_name']['placement_id']));
    59             $response = $this->verify_input_data($api_key, $placement_id);
    60             if ($response['response']['code'] === 200) {
    61                 update_option('adcaptcha_api_key', $api_key);
    62                 update_option('adcaptcha_placement_id', $placement_id);
    63                 update_option('adcaptcha_render_captcha', true);
    64                 $saved_successfully = true;
    65             } else {
    66                 $save_error = true;
    67                 update_option('adcaptcha_render_captcha', false);
    68             }
     28        $tab = filter_input( INPUT_GET, 'tab', FILTER_SANITIZE_FULL_SPECIAL_CHARS );
     29        $tab = isset( $tab ) ? $tab : 'general';
     30        if (!isset($tab) || ($tab !== 'general' && $tab !== 'plugins')) {
     31            $tab = 'general';
    6932        }
    7033
     
    7437                <?php printf('<img src="%s" class="logo"/>', esc_url(untrailingslashit(plugin_dir_url(dirname(dirname(__FILE__)))) . '/assets/logo_gradient.png')); ?>
    7538                <hr>
     39                <nav class="nav">
     40                    <a href="?page=adcaptcha" class="nav-tab
     41                        <?php
     42                            if ( $tab === 'general' ) :
     43                        ?>
     44                    nav-tab-active<?php endif; ?>">General</a>
     45                    <a href="?page=adcaptcha&tab=plugins" class="nav-tab
     46                        <?php
     47                            if ( $tab === 'plugins' ) :
     48                        ?>
     49                    nav-tab-active<?php endif; ?>">Plugins</a>
    7650            </div>
    77             <div class="integrating-description">
    78                 <p>Before integrating, you must have an adCAPTCHA account and gone through the setup process. <a class="dashboard-link link" href="https://app.adcaptcha.com" target="_blank">Dashboard &rarr;</a><a class="documentation-link link" href="https://docs.adcaptcha.com/" target="_blank">Documentation &rarr;</a></p>
    79             </div>
    80             <?php if ($saved_successfully === true) : ?>
    81                 <div style="background-color: #22C55E; color: #ffffff; padding: 10px; border-radius: 5px; margin: 10px 0; max-width: 450px; font-size: 14px;">
    82                     Settings saved successfully. The captcha will now be displayed.
    83                 </div>
    84             <?php endif; ?>
    85             <?php if (get_option('adcaptcha_render_captcha') !== '1' && $saved_successfully !== true || $save_error === true) : ?>
    86                 <div style="background-color: #DC2626; color: #ffffff; padding: 10px; border-radius: 5px; margin: 10px 0; max-width: 800px; font-size: 14px;">
    87                     Placement ID or API Key is Invalid. Please try again. Captcha will not be displayed until the settings are saved successfully.
    88                 </div>
    89             <?php endif; ?>
    90             <form method="post" class="form">
    91                 <?php
    92                     echo '<label for="api_key" class="input-label">API Key</label>';
    93                     echo '<input type="password" id="api_key" class="input-field" name="adcaptcha_option_name[api_key]" value="' . esc_attr(get_option('adcaptcha_api_key')) . '" placeholder="API key">';
    94                 ?>
    95                 <?php
    96                     echo '<label for="placement_id" class="input-label">Placement ID</label>';
    97                     echo '<input type="text" id="placement_id" class="input-field" name="adcaptcha_option_name[placement_id]" value="' . esc_attr(get_option('adcaptcha_placement_id')) . '" placeholder="Placement ID">';
    98                 ?>
    99                 <div class="integrating-description">
    100                     <p>By default the captcha will be placed on the Login, Register, Lost Password and Comments forms.</p>
    101                 </div>
    102                 <?php wp_nonce_field('adcaptcha_form_action'); ?>
    103                 <button type="submit" class="save-button">Save</button>
    104             </form>
     51            <?php
     52                switch ($tab) {
     53                    case 'general':
     54                        $generalSettings = new \AdCaptcha\Settings\General\General();
     55                        $generalSettings->render_general_settings();
     56                        break;
     57                    case 'plugins':
     58                        $pluginsSettings = new \AdCaptcha\Settings\Plugins\Plugins();
     59                        $pluginsSettings->render_Plugins_settings();
     60                        break;
     61                }
     62            ?>
    10563        </div>
    10664        <?php
     
    11371
    11472    public function change_admin_footer_version() {
    115         return 'Version 1.0';
     73        return 'Version 1.1.0';
    11674    }
    11775}
  • adcaptcha/tags/1.1.0/src/styles/settings.css

    r3060548 r3064464  
    55
    66.header {
    7     padding: 35px 20px 35px 20px;
     7    padding: 35px 20px 0px 20px;
    88    margin: 0 20px 0 0;
    99    display: grid;
    10     grid-auto-flow: column;
    1110    justify-content: space-between;
    1211    align-items: center;
     
    2322}
    2423
     24.plugin_logo {
     25    margin-bottom: 20px;
     26    margin-top: 10px;
     27}
     28
    2529.input-field {
    2630    max-width: 500px;
     
    3539}
    3640
     41.checkbox-container{
     42    display: flex;
     43    align-items: center;
     44    margin-bottom: 10px;
     45}
     46
     47.checkbox-label {
     48    font-size: 14px;
     49    margin-left: 5px;
     50    margin-bottom: 3px;
     51}
     52
    3753.form {
    3854    display: flex;
     
    4359}
    4460
    45 .integrating-description {
     61.plugin-form {
     62    display: flex;
     63    flex-direction: column;
     64    margin-bottom: 20px;
     65    margin-right: 36px;
     66}
     67
     68.plugins-layout {
     69    display: flex;
     70    flex-direction: row;
     71    flex-wrap: wrap;
     72}
     73
     74.plugin-container {
     75    background-color: white;
     76    padding: 20px 20px 0px 20px;
     77    width: 320px;
     78    height: 225px;
     79    margin-bottom: 20px;
     80    margin-right: 30px;
     81    border-radius: 5px;
     82}
     83
     84.plugins-container, .integrating-description {
    4685    margin-top: 20px;
     86    margin-left: 20px;
    4787}
    4888
     
    91131    outline: 2px solid var(--accent);
    92132}
     133
     134.nav {
     135    padding: 0 20px;
     136}
     137
     138.nav-tab {
     139    box-shadow: inset 0 -2px #fff;
     140    text-decoration: none;
     141    font-size: 0.875rem;
     142    font-weight: 500;
     143    background: none;
     144    border: none;
     145    margin: 0;
     146    padding: 15px;
     147    transition: box-shadow 0.1s ease;
     148
     149
     150    &.nav-tab-active,
     151    &.nav-tab-active:hover {
     152      box-shadow: inset 0 -2px var(--accent);
     153      color: var(--accent);
     154    }
     155
     156    &:hover {
     157      box-shadow: inset 0 -2px rgba(151, 151, 246, 0.8);
     158    }
     159}
  • adcaptcha/trunk/README.md

    r3060548 r3064464  
    2222* Login
    2323* Comments
    24 * ForgotPassword
     24* Forgot Password
    2525* Register
    2626
     
    2929* Login
    3030* Comments
    31 * ForgotPassword
     31* Forgot Password
    3232* Register
    3333
  • adcaptcha/trunk/adcaptcha.php

    r3060699 r3064464  
    33 * Plugin Name: adCAPTCHA for WordPress
    44 * Description: Secure your site. Elevate your brand. Boost Ad Revenue.
    5  * Version: 1.0.3
     5 * Version: 1.1.0
    66 * Requires at least: 6.4.2
    77 * Requires PHP: 7.4
     
    2121require_once plugin_dir_path(__FILE__) . 'src/Instantiate.php';
    2222require_once plugin_dir_path(__FILE__) . 'src/Settings/Settings.php';
     23require_once plugin_dir_path(__FILE__) . 'src/Settings/General.php';
     24require_once plugin_dir_path(__FILE__) . 'src/Settings/Plugins.php';
    2325require_once plugin_dir_path(__FILE__) . 'src/Plugin/Login.php';
    2426require_once plugin_dir_path(__FILE__) . 'src/Plugin/Registration.php';
     
    4547    delete_option( 'adcaptcha_success_token' );
    4648    delete_option( 'adcaptcha_render_captcha' );
     49    delete_option( 'adcaptcha_selected_plugins' );
    4750}
    4851
  • adcaptcha/trunk/readme.txt

    r3060699 r3064464  
    55Requires at least: 6.0
    66Tested up to: 6.4
    7 Stable tag: 1.0.3
     7Stable tag: 1.1.0
    88Requires PHP: 7.4
    99License: GPLv2 or later
     
    2828* Login
    2929* Comments
    30 * ForgotPassword
     30* Forgot Password
    3131* Register
    3232
     
    3535* Login
    3636* Comments
    37 * ForgotPassword
     37* Forgot Password
    3838* Register
    3939
     
    61611. Login
    62622. Comments
    63 3. ForgotPassword
     633. Forgot Password
    64644. Register
    65 5. Settings
     655. General Settings
     666. Manage Plugins
    6667
    6768== Privacy Notices ==
     
    8889= 1.0.3 =
    8990- Minor patch: update to stable plugin tag version
     91
     92= 1.1.0 =
     93- Feature: add plugin location selection in setting
  • adcaptcha/trunk/src/Instantiate.php

    r3060548 r3064464  
    1717
    1818    public function setup() {
     19        $classes = array(
     20            'Wordpress_Login' => new Login(),
     21            'Wordpress_Register' => new Registration(),
     22            'Wordpress_ForgotPassword' => new PasswordReset(),
     23            'Wordpress_Comments' => new Comments(),
     24            'Woocommerce_Login' => new WoocommerceLogin(),
     25            'Woocommerce_ForgotPassword' => new WoocommercePasswordReset(),
     26            'Woocommerce_Register' => new WoocommerceRegistration(),
     27            'ContactForm7_Forms' => new ContactForm7(),
     28            'Mailchimp_Forms' => new MailchimpForms(),
     29        );
     30
     31        $selected_plugins = get_option('adcaptcha_selected_plugins') ? get_option('adcaptcha_selected_plugins') : array();
     32
    1933        $settings = new Settings();
    2034        $settings->setup();
    2135
    2236        if (get_option('adcaptcha_render_captcha') === '1') {
    23             $login = new Login();
    24             $login->setup();
    25 
    26             $registration = new Registration();
    27             $registration->setup();
    28 
    29             $passwordReset = new PasswordReset();
    30             $passwordReset->setup();
    31 
    32 
    33             $comments = new Comments();
    34             $comments->setup();
    35 
    36             $woocommerceLogin = new WoocommerceLogin();
    37             $woocommerceLogin->setup();
    38 
    39             $woocommercePasswordReset = new WoocommercePasswordReset();
    40             $woocommercePasswordReset->setup();
    41 
    42             $woocommerceRegistration = new WoocommerceRegistration();   
    43             $woocommerceRegistration->setup();
    44 
    45             $contactForm7 = new ContactForm7();
    46             $contactForm7->setup();
    47 
    48             $mailchimpForms = new MailchimpForms();
    49             $mailchimpForms->setup();
     37            foreach ($selected_plugins as $selected_plugin) {
     38                if (isset($classes[$selected_plugin])) {
     39                    $classes[$selected_plugin]->setup();
     40                }
     41            }
    5042        }
    5143    }
  • adcaptcha/trunk/src/Settings/Settings.php

    r3060548 r3064464  
    2424        wp_enqueue_style('adcaptcha-admin-styles', plugins_url('../styles/settings.css', __FILE__), array(), PLUGIN_VERSION);
    2525    }
    26 
    27     public function verify_input_data($api_key, $placement_id) {
    28         $url = 'https://api.adcaptcha.com/v1/placements/' . $placement_id;
    29         $headers = [
    30             'Content-Type' => 'application/json',
    31             'Authorization' => 'Bearer ' . $api_key,
    32         ];
    33 
    34         $response = wp_remote_get($url, array(
    35             'headers' => $headers,
    36         ));
    37        
    38         if (is_wp_error($response)) {
    39             $error_message = $response->get_error_message();
    40             echo esc_html("Something went wrong: $error_message");
    41         }
    42 
    43         return $response;
    44     }
    4526     
    4627    public function render_adcaptcha_options_page() {
    47         $save_error = false;
    48         $saved_successfully = false;
    49         // Saves the Api Key and Placements ID in the wp db
    50         if ($_SERVER["REQUEST_METHOD"] == "POST") {
    51             $nonce = sanitize_text_field(wp_unslash($_POST['_wpnonce']));
    52             // Verify the nonce
    53             if (!isset($nonce) || !wp_verify_nonce($nonce, 'adcaptcha_form_action')) {
    54                 die('Invalid nonce');
    55             }
    56 
    57             $api_key = sanitize_text_field(wp_unslash($_POST['adcaptcha_option_name']['api_key']));
    58             $placement_id = sanitize_text_field(wp_unslash($_POST['adcaptcha_option_name']['placement_id']));
    59             $response = $this->verify_input_data($api_key, $placement_id);
    60             if ($response['response']['code'] === 200) {
    61                 update_option('adcaptcha_api_key', $api_key);
    62                 update_option('adcaptcha_placement_id', $placement_id);
    63                 update_option('adcaptcha_render_captcha', true);
    64                 $saved_successfully = true;
    65             } else {
    66                 $save_error = true;
    67                 update_option('adcaptcha_render_captcha', false);
    68             }
     28        $tab = filter_input( INPUT_GET, 'tab', FILTER_SANITIZE_FULL_SPECIAL_CHARS );
     29        $tab = isset( $tab ) ? $tab : 'general';
     30        if (!isset($tab) || ($tab !== 'general' && $tab !== 'plugins')) {
     31            $tab = 'general';
    6932        }
    7033
     
    7437                <?php printf('<img src="%s" class="logo"/>', esc_url(untrailingslashit(plugin_dir_url(dirname(dirname(__FILE__)))) . '/assets/logo_gradient.png')); ?>
    7538                <hr>
     39                <nav class="nav">
     40                    <a href="?page=adcaptcha" class="nav-tab
     41                        <?php
     42                            if ( $tab === 'general' ) :
     43                        ?>
     44                    nav-tab-active<?php endif; ?>">General</a>
     45                    <a href="?page=adcaptcha&tab=plugins" class="nav-tab
     46                        <?php
     47                            if ( $tab === 'plugins' ) :
     48                        ?>
     49                    nav-tab-active<?php endif; ?>">Plugins</a>
    7650            </div>
    77             <div class="integrating-description">
    78                 <p>Before integrating, you must have an adCAPTCHA account and gone through the setup process. <a class="dashboard-link link" href="https://app.adcaptcha.com" target="_blank">Dashboard &rarr;</a><a class="documentation-link link" href="https://docs.adcaptcha.com/" target="_blank">Documentation &rarr;</a></p>
    79             </div>
    80             <?php if ($saved_successfully === true) : ?>
    81                 <div style="background-color: #22C55E; color: #ffffff; padding: 10px; border-radius: 5px; margin: 10px 0; max-width: 450px; font-size: 14px;">
    82                     Settings saved successfully. The captcha will now be displayed.
    83                 </div>
    84             <?php endif; ?>
    85             <?php if (get_option('adcaptcha_render_captcha') !== '1' && $saved_successfully !== true || $save_error === true) : ?>
    86                 <div style="background-color: #DC2626; color: #ffffff; padding: 10px; border-radius: 5px; margin: 10px 0; max-width: 800px; font-size: 14px;">
    87                     Placement ID or API Key is Invalid. Please try again. Captcha will not be displayed until the settings are saved successfully.
    88                 </div>
    89             <?php endif; ?>
    90             <form method="post" class="form">
    91                 <?php
    92                     echo '<label for="api_key" class="input-label">API Key</label>';
    93                     echo '<input type="password" id="api_key" class="input-field" name="adcaptcha_option_name[api_key]" value="' . esc_attr(get_option('adcaptcha_api_key')) . '" placeholder="API key">';
    94                 ?>
    95                 <?php
    96                     echo '<label for="placement_id" class="input-label">Placement ID</label>';
    97                     echo '<input type="text" id="placement_id" class="input-field" name="adcaptcha_option_name[placement_id]" value="' . esc_attr(get_option('adcaptcha_placement_id')) . '" placeholder="Placement ID">';
    98                 ?>
    99                 <div class="integrating-description">
    100                     <p>By default the captcha will be placed on the Login, Register, Lost Password and Comments forms.</p>
    101                 </div>
    102                 <?php wp_nonce_field('adcaptcha_form_action'); ?>
    103                 <button type="submit" class="save-button">Save</button>
    104             </form>
     51            <?php
     52                switch ($tab) {
     53                    case 'general':
     54                        $generalSettings = new \AdCaptcha\Settings\General\General();
     55                        $generalSettings->render_general_settings();
     56                        break;
     57                    case 'plugins':
     58                        $pluginsSettings = new \AdCaptcha\Settings\Plugins\Plugins();
     59                        $pluginsSettings->render_Plugins_settings();
     60                        break;
     61                }
     62            ?>
    10563        </div>
    10664        <?php
     
    11371
    11472    public function change_admin_footer_version() {
    115         return 'Version 1.0';
     73        return 'Version 1.1.0';
    11674    }
    11775}
  • adcaptcha/trunk/src/styles/settings.css

    r3060548 r3064464  
    55
    66.header {
    7     padding: 35px 20px 35px 20px;
     7    padding: 35px 20px 0px 20px;
    88    margin: 0 20px 0 0;
    99    display: grid;
    10     grid-auto-flow: column;
    1110    justify-content: space-between;
    1211    align-items: center;
     
    2322}
    2423
     24.plugin_logo {
     25    margin-bottom: 20px;
     26    margin-top: 10px;
     27}
     28
    2529.input-field {
    2630    max-width: 500px;
     
    3539}
    3640
     41.checkbox-container{
     42    display: flex;
     43    align-items: center;
     44    margin-bottom: 10px;
     45}
     46
     47.checkbox-label {
     48    font-size: 14px;
     49    margin-left: 5px;
     50    margin-bottom: 3px;
     51}
     52
    3753.form {
    3854    display: flex;
     
    4359}
    4460
    45 .integrating-description {
     61.plugin-form {
     62    display: flex;
     63    flex-direction: column;
     64    margin-bottom: 20px;
     65    margin-right: 36px;
     66}
     67
     68.plugins-layout {
     69    display: flex;
     70    flex-direction: row;
     71    flex-wrap: wrap;
     72}
     73
     74.plugin-container {
     75    background-color: white;
     76    padding: 20px 20px 0px 20px;
     77    width: 320px;
     78    height: 225px;
     79    margin-bottom: 20px;
     80    margin-right: 30px;
     81    border-radius: 5px;
     82}
     83
     84.plugins-container, .integrating-description {
    4685    margin-top: 20px;
     86    margin-left: 20px;
    4787}
    4888
     
    91131    outline: 2px solid var(--accent);
    92132}
     133
     134.nav {
     135    padding: 0 20px;
     136}
     137
     138.nav-tab {
     139    box-shadow: inset 0 -2px #fff;
     140    text-decoration: none;
     141    font-size: 0.875rem;
     142    font-weight: 500;
     143    background: none;
     144    border: none;
     145    margin: 0;
     146    padding: 15px;
     147    transition: box-shadow 0.1s ease;
     148
     149
     150    &.nav-tab-active,
     151    &.nav-tab-active:hover {
     152      box-shadow: inset 0 -2px var(--accent);
     153      color: var(--accent);
     154    }
     155
     156    &:hover {
     157      box-shadow: inset 0 -2px rgba(151, 151, 246, 0.8);
     158    }
     159}
Note: See TracChangeset for help on using the changeset viewer.