Plugin Directory

Changeset 3693658


Ignore:
Timestamp:
09/13/2026 12:45:04 PM (6 weeks ago)
Author:
edutainmentuk
Message:

Release 2.0.1: updated animated banners, improved verification page design, fixed Add Record tab behavior, and enhanced certificate logo support.

Location:
edutain-certificate-validator/trunk
Files:
3 added
1 deleted
11 edited

Legend:

Unmodified
Added
Removed
  • edutain-certificate-validator/trunk/admin/assets/css/admin.css

    r3649741 r3693658  
    11271127}
    11281128
    1129 /* Hero — image-based banner (banner-free.png / banner-pro.png). Uses the
    1130    shared .edcv-wrap width, with the image's aspect ratio locked so it
    1131    scales as one proportional block at its measured 1214x311 natural size. */
     1129/* Shared animated banners retain their original 2172x724 proportions. */
    11321130.edcv-dash-hero {
    11331131        position: relative;
    … …  
    11401138        display: block;
    11411139        width: 100%;
    1142         aspect-ratio: 1214 / 311;
     1140        aspect-ratio: 3 / 1;
    11431141        height: auto;
    11441142        object-fit: contain;
    … …  
    11461144}
    11471145
     1146
    11481147/* Overlaid CTA — sized/positioned as a % of the banner, measured directly
    1149    from the dashed placeholder box baked into banner-free.png (natural
     1148   from the dashed placeholder box baked into banner-free.gif (natural
    11501149   pixel bounds: x 89-463, y ~470-578 of the 1906x700 artwork). */
    11511150.edcv-dash-hero-cta {
    11521151        position: absolute;
    11531152        left: 4.67%;
    1154         top: 67.1%;
    1155         width: 19.6%;
     1153        top: 72%;
     1154        width: 17%;
    11561155        height: 15.4%;
    11571156        box-sizing: border-box;
    … …  
    11591158        align-items: center;
    11601159        justify-content: center;
    1161         background: #7238f3;
    1162         color: #fff;
     1160        background: #ffe600;
     1161        color: #5422b8;
    11631162        font-size: clamp(9px, 1.2vw, 16px);
    11641163        font-weight: 700;
    … …  
    11681167        border: 0;
    11691168        border-radius: 8px;
    1170         box-shadow: 0 4px 14px rgba(114, 56, 243, .35);
     1169        box-shadow: 0 4px 14px rgba(76, 31, 169, .28);
    11711170        transition: transform .25s ease, box-shadow .25s ease, background .25s ease;
    11721171}
    11731172.edcv-dash-hero-cta:hover,
    11741173.edcv-dash-hero-cta:focus {
    1175         background: #601fe8;
    1176         color: #fff;
     1174        background: #ffd500;
     1175        color: #5422b8;
    11771176        transform: scale(1.05);
    1178         box-shadow: 0 8px 22px rgba(114, 56, 243, .5);
     1177        box-shadow: 0 8px 22px rgba(76, 31, 169, .38);
    11791178}
    11801179.edcv-dash-hero-cta:focus-visible {
    1181         outline: 2px solid #fff;
     1180        outline: 2px solid #5422b8;
    11821181        outline-offset: 2px;
    11831182}
  • edutain-certificate-validator/trunk/admin/assets/js/admin.js

    r3649741 r3693658  
    800800        var TAB_STORAGE_KEY = 'edcv_active_tab';
    801801
     802        $(document).on('click', '[data-edcv-force-add-tab]', function () {
     803                try {
     804                        window.sessionStorage.setItem(TAB_STORAGE_KEY, 'add');
     805                } catch (e) {
     806                        // sessionStorage unavailable; the URL parameter still requests Add Data.
     807                }
     808        });
     809
    802810        /**
    803811         * (Re)initialize flatpickr on the Add Data tab's Issue Date field.
  • edutain-certificate-validator/trunk/admin/class-edcv-admin.php

    r3649741 r3693658  
    125125    public static function render_hero_navbar( $active_slug ) {
    126126        $edcv_is_premium = edcv_premium_active();
    127         $edcv_banner_rel = 'admin/assets/images/banner-free.png';
     127        $edcv_banner_rel = 'admin/assets/images/banner-free.gif';
    128128        $edcv_banner_alt = __( 'Edutain Certificate Validator — Upgrade to Pro', 'edutain-certificate-validator' );
    129129        $edcv_nav_tabs = array(
  • edutain-certificate-validator/trunk/admin/partials/admin-dashboard.php

    r3649741 r3693658  
    3535esc_html_e( 'Browse our collection of quick guides and tutorials to get the most out of the plugin.', 'edutain-certificate-validator' );
    3636?></p>
    37                         <a href="https://edutain-certificate-validator.edutainmentuk.com/documentation" target="_blank" rel="noopener" class="edcv-dash-card-btn"><?php
     37                        <a href="https://edutainvalidator.com/documentation/" target="_blank" rel="noopener" class="edcv-dash-card-btn"><?php
    3838esc_html_e( 'View Docs', 'edutain-certificate-validator' );
    3939?></a>
    … …  
    5050?></h3>
    5151                        <p><?php
    52 esc_html_e( 'Quickly read the instructions before using this tool', 'edutain-certificate-validator' );
     52esc_html_e( 'Quickly read the instructions before using this tool.', 'edutain-certificate-validator' );
    5353?></p>
    5454                        <a href="#edcv-instructions" class="edcv-dash-card-btn" data-edcv-help-target="edcv-instructions"><?php
    … …  
    217217                                        <li><span class="dashicons dashicons-yes"></span><?php
    218218    esc_html_e( 'All Features Included', 'edutain-certificate-validator' );
     219    ?></li>
     220                                        <li><span class="dashicons dashicons-yes"></span><?php
     221    esc_html_e( 'QR codes & branded PDFs', 'edutain-certificate-validator' );
     222    ?></li>
     223                                        <li><span class="dashicons dashicons-yes"></span><?php
     224    esc_html_e( 'Expiry, revocation & analytics', 'edutain-certificate-validator' );
    219225    ?></li>
    220226                                        <li><span class="dashicons dashicons-yes"></span><?php
  • edutain-certificate-validator/trunk/admin/partials/admin-data-summary.php

    r3649741 r3693658  
    3838        </div>
    3939        <?php if ( $edcv_summary_dashboard ) : ?>
    40         <a class="edcv-stat-card edcv-stat-card-action" href="<?php echo esc_url( $edcv_summary_add_url ); ?>">
     40        <a class="edcv-stat-card edcv-stat-card-action" href="<?php echo esc_url( $edcv_summary_add_url ); ?>" data-edcv-force-add-tab>
    4141                <span class="edcv-stat-icon dashicons dashicons-plus-alt2" aria-hidden="true"></span>
    4242                <span class="edcv-stat-label"><?php esc_html_e( 'Add record', 'edutain-certificate-validator' ); ?></span>
  • edutain-certificate-validator/trunk/admin/partials/admin-hero-navbar.php

    r3649741 r3693658  
    2020
    2121        <section class="edcv-dash-hero">
    22                 <img class="edcv-dash-hero-img" src="<?php echo esc_url( EDCV_PLUGIN_URL . $edcv_banner_rel ); ?>" alt="<?php echo esc_attr( $edcv_banner_alt ); ?>">
     22                <img class="edcv-dash-hero-img" src="<?php echo esc_url( EDCV_PLUGIN_URL . $edcv_banner_rel ); ?>" alt="<?php echo esc_attr( $edcv_banner_alt ); ?>" width="2172" height="724">
    2323                <?php if ( ! $edcv_is_premium ) : ?>
    2424                        <a class="edcv-dash-hero-cta" href="<?php echo esc_url( $edcv_pricing_url ); ?>">
  • edutain-certificate-validator/trunk/admin/partials/admin-instructions-content.php

    r3649741 r3693658  
    6767        </div>
    6868
    69         <div class="edcv-card edcv-instructions-card">
    70                 <h3><?php esc_html_e( 'Want QR codes on your certificates?', 'edutain-certificate-validator' ); ?></h3>
    71                 <p>
    72                         <?php esc_html_e( 'The Pro version generates a scannable QR code for every certificate that opens its direct verification link.', 'edutain-certificate-validator' ); ?>
    73                         <button type="button" class="button edcv-pro-trigger" data-feature="qr"><?php esc_html_e( 'Learn more', 'edutain-certificate-validator' ); ?> <span class="edcv-pro-badge"><?php esc_html_e( 'Pro', 'edutain-certificate-validator' ); ?></span></button>
    74                 </p>
    75         </div>
     69        <?php if ( ! edcv_premium_active() ) : ?>
     70                <div class="edcv-card edcv-instructions-card">
     71                        <h3><?php esc_html_e( 'Want QR codes on your certificates?', 'edutain-certificate-validator' ); ?></h3>
     72                        <p>
     73                                <?php esc_html_e( 'The Pro version generates a scannable QR code for every certificate that opens its direct verification link.', 'edutain-certificate-validator' ); ?>
     74                                <button type="button" class="button edcv-pro-trigger" data-feature="qr"><?php esc_html_e( 'Learn more', 'edutain-certificate-validator' ); ?> <span class="edcv-pro-badge"><?php esc_html_e( 'Pro', 'edutain-certificate-validator' ); ?></span></button>
     75                        </p>
     76                </div>
     77        <?php endif; ?>
    7678</div>
  • edutain-certificate-validator/trunk/edutain-certificate-validator.php

    r3649741 r3693658  
    55 * Plugin URI:        https://wordpress.org/plugins/edutain-certificate-validator/
    66 * Description:       Upload a CSV of certificates and allow visitors to verify a certificate by its code via a shortcode. Premium features add QR codes, PDF certificates, expiry/revocation, custom fields, email delivery and verification analytics.
    7  * Version:           2.0.0
     7 * Version:           2.0.1
    88 * Requires at least: 5.0
    99 * Requires PHP:      7.2
    … …  
    6363        do_action( 'ecv_fs_loaded' );
    6464    }
    65     define( 'EDCV_VERSION', '2.0.0' );
     65    define( 'EDCV_VERSION', '2.0.1' );
    6666    define( 'EDCV_PLUGIN_DIR', plugin_dir_path( __FILE__ ) );
    6767    define( 'EDCV_PLUGIN_URL', plugin_dir_url( __FILE__ ) );
  • edutain-certificate-validator/trunk/public/assets/css/public.css

    r3649741 r3693658  
    170170}
    171171.edcv-result-meta { color: var(--edcv-muted); font-size: 12.5px; }
    172 .edcv-result-actions { display: flex; gap: 8px; }
    173 .edcv-mini-btn {
     172.edcv-result-footer-branded {
     173        display: grid;
     174        grid-template-columns: minmax(0, 1fr) auto;
     175}
     176.edcv-result-footer-branded .edcv-result-actions {
     177        grid-column: 1 / -1;
     178}
     179.edcv-verification-brand {
     180        display: inline-flex;
     181        align-items: center;
     182        justify-content: flex-end;
     183        gap: 5px;
     184        min-width: 0;
     185        padding: 5px 8px;
     186        border: 1px solid #d8d1fa;
     187        border-radius: 7px;
     188        background: #f7f5ff;
     189        color: #4b5563;
     190        font-size: 12px;
     191        font-weight: 500;
     192        line-height: 1.25;
     193}
     194.edcv-verification-brand img {
     195        display: block;
     196        width: 22px;
     197        height: 22px;
     198        object-fit: contain;
     199}
     200.edcv-verification-brand a {
     201        color: #5422b8;
     202        font-weight: 700;
     203        text-decoration: none;
     204        cursor: pointer;
     205        transition: color .15s ease, text-decoration-color .15s ease;
     206}
     207.edcv-verification-brand a:hover,
     208.edcv-verification-brand a:focus-visible {
     209        color: #7238f3;
     210        text-decoration: underline;
     211        text-underline-offset: 2px;
     212}
     213.edcv-result-actions {
     214        display: flex;
     215        align-items: center;
     216        gap: 9px;
     217        flex-wrap: wrap;
     218}
     219.edcv-result-box .edcv-mini-btn {
     220        display: inline-flex;
     221        align-items: center;
     222        justify-content: center;
     223        gap: 7px;
     224        min-height: 38px;
     225        box-sizing: border-box;
     226        margin: 0;
     227        padding: 8px 13px;
     228        border: 1px solid transparent;
     229        border-radius: 9px;
    174230        background: #fff;
    175         border: 1px solid var(--edcv-border);
    176         border-radius: 8px;
    177         padding: 6px 12px;
     231        box-shadow: 0 2px 5px rgba(17, 24, 39, .06);
     232        font: inherit;
    178233        font-size: 13px;
    179         color: var(--edcv-ink);
     234        font-weight: 650;
     235        line-height: 1.2;
     236        text-decoration: none;
    180237        cursor: pointer;
    181         transition: border-color .15s ease;
    182 }
    183 .edcv-mini-btn:hover { border-color: var(--edcv-ink); }
     238        transition: transform .15s ease, border-color .15s ease, background-color .15s ease, box-shadow .15s ease;
     239}
     240.edcv-result-box .edcv-mini-btn svg {
     241        flex: 0 0 17px;
     242        width: 17px;
     243        height: 17px;
     244        fill: none;
     245        stroke: currentColor;
     246        stroke-width: 1.9;
     247        stroke-linecap: round;
     248        stroke-linejoin: round;
     249}
     250.edcv-result-box .edcv-pro-pdf-btn {
     251        border-color: #7238f3;
     252        background: linear-gradient(135deg, #7238f3, #5b24d6);
     253        color: #fff;
     254        box-shadow: 0 4px 10px rgba(114, 56, 243, .22);
     255}
     256.edcv-result-box .edcv-copy-btn {
     257        border-color: #d8ccff;
     258        background: #f5f1ff;
     259        color: #5422b8;
     260}
     261.edcv-result-box .edcv-print-btn {
     262        border-color: #d9dee7;
     263        background: #fff;
     264        color: #374151;
     265}
     266.edcv-result-box .edcv-mini-btn:hover {
     267        transform: translateY(-1px);
     268        box-shadow: 0 5px 12px rgba(17, 24, 39, .13);
     269}
     270.edcv-result-box .edcv-pro-pdf-btn:hover {
     271        border-color: #5b24d6;
     272        background: linear-gradient(135deg, #642be6, #4d1fbd);
     273        color: #fff;
     274}
     275.edcv-result-box .edcv-copy-btn:hover {
     276        border-color: #bca7ff;
     277        background: #ece5ff;
     278        color: #441996;
     279}
     280.edcv-result-box .edcv-print-btn:hover {
     281        border-color: #aeb7c5;
     282        background: #f8fafc;
     283        color: #111827;
     284}
     285.edcv-result-box .edcv-mini-btn:focus-visible {
     286        outline: 2px solid #7238f3;
     287        outline-offset: 2px;
     288}
     289
     290@media (max-width: 620px) {
     291        .edcv-result-footer-branded { grid-template-columns: 1fr; }
     292        .edcv-verification-brand { justify-self: start; }
     293        .edcv-result-footer-branded .edcv-result-actions { grid-column: 1; }
     294}
    184295
    185296/* Valid-certificate social sharing ------------------------------------------ */
    … …  
    265376
    266377/* Wrapper card on the auto-created page --------------------------------------- */
     378.edcv-validation-page .entry-title,
     379.edcv-validation-page .wp-block-post-title {
     380        width: 100%;
     381        text-align: center;
     382}
     383
    267384.edcv-validate-info {
    268385        background: #fff;
    … …  
    274391        box-shadow: 0 8px 20px rgba(0, 0, 0, .04);
    275392}
    276 .edcv-validate-info h2 { margin: 0 0 8px; }
    277 .edcv-validate-info p { margin: 0 0 10px; color: #374151; }
     393.edcv-validate-info h2 { margin: 0 0 8px; text-align: center; }
     394.edcv-validate-info > p { margin: 0 0 10px; color: #374151; text-align: center; }
    278395
    279396/* Print: show only the verified card ------------------------------------------- */
  • edutain-certificate-validator/trunk/public/class-edcv-public.php

    r3649741 r3693658  
    4646                add_shortcode( 'edcv_validator', array( $this, 'render_shortcode' ) );
    4747                add_action( 'wp_enqueue_scripts', array( $this, 'enqueue_assets' ) );
     48                add_filter( 'body_class', array( $this, 'validation_page_body_class' ) );
    4849                add_action( 'wp_head', array( $this, 'output_certificate_share_metadata' ), 5 );
    4950                add_action( 'wp_ajax_edcv_verify_certificate', array( $this, 'verify_certificate_ajax' ) );
    5051                add_action( 'wp_ajax_nopriv_edcv_verify_certificate', array( $this, 'verify_certificate_ajax' ) );
     52        }
     53
     54        /**
     55         * Add a styling hook to the plugin's automatically created validation page.
     56         *
     57         * @param string[] $classes Existing body classes.
     58         * @return string[]
     59         */
     60        public function validation_page_body_class( $classes ) {
     61                $page_id = absint( get_option( 'edcv_validate_page_id', 0 ) );
     62                if ( $page_id && is_page( $page_id ) ) {
     63                        $classes[] = 'edcv-validation-page';
     64                }
     65
     66                return $classes;
    5167        }
    5268
    … …  
    200216                $verified_on = date_i18n( get_option( 'date_format' ) );
    201217                $status      = $this->certificate_status( $row );
     218                $show_brand  = ! edcv_premium_active();
    202219
    203220                /**
    … …  
    245262                $html .= '</div>';
    246263
    247                 $html .= '<div class="edcv-result-footer">';
     264                $html .= '<div class="edcv-result-footer' . ( $show_brand ? ' edcv-result-footer-branded' : '' ) . '">';
    248265                $html .= '<span class="edcv-result-meta">' . sprintf(
    249266                        /* translators: 1: date, 2: site name */
    … …  
    252269                        esc_html( $site_name )
    253270                ) . '</span>';
    254                 $actions  = '<button type="button" class="edcv-mini-btn" id="edcv-copy-link">' . esc_html__( 'Copy verification link', 'edutain-certificate-validator' ) . '</button>';
    255                 $actions .= '<button type="button" class="edcv-mini-btn" id="edcv-print-card">' . esc_html__( 'Print', 'edutain-certificate-validator' ) . '</button>';
     271                if ( $show_brand ) {
     272                        $html .= '<span class="edcv-verification-brand">'
     273                                . '<span>' . esc_html__( 'Verified with', 'edutain-certificate-validator' ) . '</span>'
     274                                . '<img src="' . esc_url( EDCV_PLUGIN_URL . 'public/assets/images/edcv-verified-logo.png' ) . '" alt="" aria-hidden="true">'
     275                                . '<a href="' . esc_url( 'https://edutainvalidator.com' ) . '">' . esc_html__( 'Edutain Certificate Validator', 'edutain-certificate-validator' ) . '</a>'
     276                                . '</span>';
     277                }
     278                $copy_icon = '<svg viewBox="0 0 24 24" aria-hidden="true" focusable="false"><rect x="8" y="8" width="11" height="11" rx="2"/><path d="M16 8V6a2 2 0 0 0-2-2H6a2 2 0 0 0-2 2v8a2 2 0 0 0 2 2h2"/></svg>';
     279                $print_icon = '<svg viewBox="0 0 24 24" aria-hidden="true" focusable="false"><path d="M7 9V4h10v5M7 18H5a2 2 0 0 1-2-2v-5a2 2 0 0 1 2-2h14a2 2 0 0 1 2 2v5a2 2 0 0 1-2 2h-2"/><rect x="7" y="14" width="10" height="7" rx="1"/><path d="M17 12h.01"/></svg>';
     280                $actions   = '<button type="button" class="edcv-mini-btn edcv-copy-btn" id="edcv-copy-link">' . $copy_icon . '<span>' . esc_html__( 'Copy verification link', 'edutain-certificate-validator' ) . '</span></button>';
     281                $actions  .= '<button type="button" class="edcv-mini-btn edcv-print-btn" id="edcv-print-card">' . $print_icon . '<span>' . esc_html__( 'Print', 'edutain-certificate-validator' ) . '</span></button>';
    256282
    257283                /**
  • edutain-certificate-validator/trunk/readme.txt

    r3655976 r3693658  
    1 === Edutain Certificate Validator – Certificate Verification, QR Code & Digital Credentials ===
    2 Contributors: edutainmentuk
     1=== Edutain Certificate Validator – Certificate Verification, QR Code & Digital Credentials ===
     2Contributors: edutainmentuk, freemius
    33Tags: certificate verification, course certificate, certificate, verification, certificate validation
    44Requires at least: 5.0
    55Tested up to: 7.0
    66Requires PHP: 7.2
    7 Stable tag: 2.0.0
     7Stable tag: 2.0.1
    88License: GPLv2 or later
    99License URI: https://www.gnu.org/licenses/gpl-2.0.html
    … …  
    1717
    1818[Edutain Certificate Validator](https://edutain-certificate-validator.edutainmentuk.com/) is a professional WordPress certificate verification plugin that lets anyone verify a certificate online, in seconds, on your own website. It is a no-code certificate validator built for training providers, educators, online course creators, and organizations that issue certificates.
     19
     20
     21https://www.youtube.com/watch?v=bcZ9-ULFbbw
    1922
    2023
    … …  
    283286
    284287
     288= 2.0.1 =
     289* Updated: replaced the Free and Pro dashboard banners with animated designs.
     290* Added: displayed linked Edutain Certificate Validator branding on Free public verification results.
     291* Added: supported WebP and restricted SVG logos on Pro PDF certificates when the server can process the selected format.
     292* Improved: centered the public verification headings and redesigned the verification action buttons.
     293* Fixed: made the dashboard Add Record button reliably open the Add Data tab.
     294* Changed: displayed the QR code upgrade prompt only when Pro is inactive.
     295* Updated: revised the Agency pricing features, documentation link, and dashboard instruction text.
     296
     297
    285298= 2.0.0 =
    286299* New: added Email as an optional core certificate field for manual entry, CSV import, and record editing.
Note: See TracChangeset for help on using the changeset viewer.