Plugin Directory

Changeset 3454651


Ignore:
Timestamp:
02/05/2026 01:12:54 PM (2 weeks ago)
Author:
3task
Message:

New functions update, fixes

Location:
3task-glossary/trunk
Files:
7 edited

Legend:

Unmodified
Added
Removed
  • 3task-glossary/trunk/3task-glossary.php

    r3453804 r3454651  
    44 * Plugin URI: https://wordpress.org/plugins/3task-glossary/
    55 * Description: Create glossaries, dictionaries & knowledge bases using WordPress pages. A-Z navigation, auto-linking, dark mode. No database, just pages.
    6  * Version: 2.2.0
     6 * Version: 2.3.0
    77 * Requires at least: 5.8
    88 * Requires PHP: 7.4
     
    1515 *
    1616 * @package 3Task_Glossary
    17  * @version 2.2.0
     17 * @version 2.3.0
    1818 */
    1919
     
    3636// Plugin constants (with defined checks for safety).
    3737if ( ! defined( 'AZGL_VERSION' ) ) {
    38     define( 'AZGL_VERSION', '2.2.0' );
     38    define( 'AZGL_VERSION', '2.3.0' );
    3939}
    4040if ( ! defined( 'AZGL_PLUGIN_FILE' ) ) {
     
    177177            'includes/class-frontend.php',
    178178            'includes/class-linker.php',
     179            'includes/class-widget.php',
    179180        );
    180181
     
    214215            deactivate_plugins( AZGL_PLUGIN_BASENAME );
    215216            wp_die(
    216                 esc_html__( 'Simple SEO Glossary requires PHP 7.4 or higher.', '3task-glossary' ),
     217                esc_html__( '3task Glossary requires PHP 7.4 or higher.', '3task-glossary' ),
    217218                'Plugin Activation Error',
    218219                array( 'back_link' => true )
     
    224225            deactivate_plugins( AZGL_PLUGIN_BASENAME );
    225226            wp_die(
    226                 esc_html__( 'Simple SEO Glossary requires WordPress 5.8 or higher.', '3task-glossary' ),
     227                esc_html__( '3task Glossary requires WordPress 5.8 or higher.', '3task-glossary' ),
    227228                'Plugin Activation Error',
    228229                array( 'back_link' => true )
     
    243244                'dark_mode'        => 'auto',
    244245                'show_credit_link' => false,
    245                 'credit_link_url'  => 'https://watchguide.net',
     246                'credit_link_url'  => 'https://www.3task.de',
    246247            );
    247248            add_option( 'azgl_options', $defaults );
  • 3task-glossary/trunk/assets/css/admin.css

    r3447608 r3454651  
    11/**
    2  * 3task Glossary - Admin Styles v2.1.0
    3  * Ultra-Modern Design with Glassmorphism & Animations
     2 * 3task Glossary - Admin Styles v3.0.0
     3 * 3task Plugin Design System v1.0
     4 * DSGVO-konform: System Font Stack, Unicode Emojis
    45 *
    56 * @package 3Task_Glossary
    6  * @since 2.0.0
     7 * @since 2.3.0
    78 */
    89
    910/* ==========================================================================
    10    CSS VARIABLES
     11   CSS VARIABLES - 3task Design System v1.0
    1112   ========================================================================== */
    1213
    1314:root {
    14     --azgl-primary: #10b981;
    15     --azgl-primary-hover: #059669;
    16     --azgl-primary-light: #d1fae5;
    17     --azgl-primary-dark: #065f46;
    18     --azgl-secondary: #6366f1;
     15    /* Primary Gradient (3task Brand) */
     16    --azgl-gradient-start: #6366f1;
     17    --azgl-gradient-mid: #8b5cf6;
     18    --azgl-gradient-end: #d946ef;
     19
     20    /* Legacy Primary (for backwards compatibility) */
     21    --azgl-primary: #6366f1;
     22    --azgl-primary-hover: #4f46e5;
     23    --azgl-primary-light: #e0e7ff;
     24    --azgl-primary-dark: #4338ca;
     25
     26    /* Accent Colors */
     27    --azgl-secondary: #8b5cf6;
    1928    --azgl-accent: #f59e0b;
     29    --azgl-accent-pink: #ec4899;
     30    --azgl-accent-cyan: #06b6d4;
    2031    --azgl-danger: #ef4444;
    21     --azgl-success: #22c55e;
    22 
     32    --azgl-success: #10b981;
     33
     34    /* Neutrals */
    2335    --azgl-bg: #f8fafc;
    2436    --azgl-card-bg: #ffffff;
     37    --azgl-bg-tertiary: #f1f5f9;
    2538    --azgl-border: #e2e8f0;
    26     --azgl-text: #1e293b;
    27     --azgl-text-muted: #64748b;
     39    --azgl-border-medium: #cbd5e1;
     40    --azgl-text: #0f172a;
     41    --azgl-text-muted: #475569;
    2842    --azgl-text-light: #94a3b8;
    2943
    30     --azgl-shadow-sm: 0 1px 2px rgba(0, 0, 0, 0.05);
    31     --azgl-shadow: 0 4px 6px -1px rgba(0, 0, 0, 0.1), 0 2px 4px -2px rgba(0, 0, 0, 0.1);
    32     --azgl-shadow-lg: 0 10px 15px -3px rgba(0, 0, 0, 0.1), 0 4px 6px -4px rgba(0, 0, 0, 0.1);
    33     --azgl-shadow-xl: 0 20px 25px -5px rgba(0, 0, 0, 0.1), 0 8px 10px -6px rgba(0, 0, 0, 0.1);
    34 
    35     --azgl-radius-sm: 6px;
     44    /* Shadows */
     45    --azgl-shadow-sm: 0 1px 2px rgba(0, 0, 0, 0.04);
     46    --azgl-shadow: 0 4px 12px rgba(0, 0, 0, 0.06);
     47    --azgl-shadow-lg: 0 12px 32px rgba(0, 0, 0, 0.08);
     48    --azgl-shadow-xl: 0 24px 48px rgba(0, 0, 0, 0.12);
     49    --azgl-shadow-glow: 0 0 40px rgba(99, 102, 241, 0.15);
     50
     51    /* Border Radius */
     52    --azgl-radius-sm: 8px;
    3653    --azgl-radius: 12px;
    3754    --azgl-radius-lg: 16px;
    38     --azgl-radius-xl: 24px;
    39 
    40     --azgl-transition: all 0.2s cubic-bezier(0.4, 0, 0.2, 1);
    41     --azgl-transition-slow: all 0.3s cubic-bezier(0.4, 0, 0.2, 1);
     55    --azgl-radius-xl: 20px;
     56    --azgl-radius-full: 100px;
     57
     58    /* Transitions */
     59    --azgl-transition: all 0.3s ease;
     60    --azgl-transition-spring: all 0.4s cubic-bezier(0.175, 0.885, 0.32, 1.275);
    4261}
    4362
     
    108127
    109128/* ==========================================================================
    110    HEADER - Hero Style
     129   HEADER - Animated Gradient Hero (3task Design System v1.0)
    111130   ========================================================================== */
    112131
     132.azgl-admin-header {
     133    background: linear-gradient(135deg, var(--azgl-gradient-start), var(--azgl-gradient-mid), var(--azgl-gradient-end));
     134    background-size: 200% 200%;
     135    animation: azgl-gradient-shift 8s ease infinite;
     136    border-radius: var(--azgl-radius-xl);
     137    padding: 32px 40px;
     138    margin-bottom: 24px;
     139    position: relative;
     140    overflow: hidden;
     141    box-shadow: var(--azgl-shadow-lg), var(--azgl-shadow-glow);
     142}
     143
     144@keyframes azgl-gradient-shift {
     145    0%, 100% { background-position: 0% 50%; }
     146    50% { background-position: 100% 50%; }
     147}
     148
     149/* Floating Orbs Pattern */
     150.azgl-admin-header::before,
     151.azgl-admin-header::after {
     152    content: '';
     153    position: absolute;
     154    border-radius: 50%;
     155    background: rgba(255, 255, 255, 0.1);
     156    animation: azgl-float 6s ease-in-out infinite;
     157}
     158
     159.azgl-admin-header::before {
     160    width: 120px;
     161    height: 120px;
     162    top: -30px;
     163    right: 10%;
     164    animation-delay: 0s;
     165}
     166
     167.azgl-admin-header::after {
     168    width: 80px;
     169    height: 80px;
     170    bottom: -20px;
     171    right: 25%;
     172    animation-delay: 2s;
     173}
     174
     175@keyframes azgl-float {
     176    0%, 100% { transform: translateY(0) scale(1); }
     177    50% { transform: translateY(-15px) scale(1.05); }
     178}
     179
     180.azgl-admin-header-content {
     181    display: flex;
     182    align-items: center;
     183    justify-content: space-between;
     184    position: relative;
     185    z-index: 1;
     186}
     187
     188.azgl-admin-header-left {
     189    display: flex;
     190    align-items: center;
     191    gap: 20px;
     192}
     193
     194/* Icon Box with Glassmorphism */
     195.azgl-admin-icon {
     196    width: 64px;
     197    height: 64px;
     198    background: rgba(255, 255, 255, 0.2);
     199    backdrop-filter: blur(10px);
     200    -webkit-backdrop-filter: blur(10px);
     201    border-radius: var(--azgl-radius-lg);
     202    display: flex;
     203    align-items: center;
     204    justify-content: center;
     205    font-size: 32px;
     206    border: 1px solid rgba(255, 255, 255, 0.3);
     207    transition: var(--azgl-transition-spring);
     208    cursor: default;
     209}
     210
     211.azgl-admin-icon:hover {
     212    transform: scale(1.1) rotate(5deg);
     213    background: rgba(255, 255, 255, 0.3);
     214}
     215
     216.azgl-admin-title-text {
     217    display: flex;
     218    flex-direction: column;
     219    gap: 6px;
     220}
     221
     222.azgl-admin-title-text h1 {
     223    font-size: 26px;
     224    font-weight: 800;
     225    color: #ffffff;
     226    margin: 0;
     227    padding: 0;
     228    letter-spacing: -0.5px;
     229    text-shadow: 0 2px 4px rgba(0, 0, 0, 0.1);
     230}
     231
     232.azgl-admin-title-meta {
     233    display: flex;
     234    align-items: center;
     235    gap: 12px;
     236}
     237
     238.azgl-version {
     239    font-size: 11px;
     240    font-weight: 700;
     241    color: rgba(255, 255, 255, 0.9);
     242    background: rgba(255, 255, 255, 0.2);
     243    padding: 4px 12px;
     244    border-radius: var(--azgl-radius-full);
     245    letter-spacing: 0.5px;
     246}
     247
     248.azgl-status-dot {
     249    display: flex;
     250    align-items: center;
     251    gap: 6px;
     252    font-size: 13px;
     253    font-weight: 500;
     254    color: rgba(255, 255, 255, 0.9);
     255}
     256
     257.azgl-status-dot::before {
     258    content: '';
     259    width: 8px;
     260    height: 8px;
     261    background: #4ade80;
     262    border-radius: 50%;
     263    animation: azgl-pulse 2s infinite;
     264}
     265
     266@keyframes azgl-pulse {
     267    0%, 100% { box-shadow: 0 0 0 0 rgba(74, 222, 128, 0.4); }
     268    50% { box-shadow: 0 0 0 6px rgba(74, 222, 128, 0); }
     269}
     270
     271.azgl-admin-header-right {
     272    display: flex;
     273    gap: 12px;
     274}
     275
     276.azgl-header-btn {
     277    display: flex;
     278    align-items: center;
     279    gap: 8px;
     280    padding: 10px 18px;
     281    background: rgba(255, 255, 255, 0.15);
     282    color: #ffffff;
     283    border: 1px solid rgba(255, 255, 255, 0.25);
     284    border-radius: var(--azgl-radius-sm);
     285    font-size: 13px;
     286    font-weight: 500;
     287    text-decoration: none;
     288    transition: var(--azgl-transition);
     289    backdrop-filter: blur(5px);
     290    -webkit-backdrop-filter: blur(5px);
     291}
     292
     293.azgl-header-btn:hover {
     294    background: rgba(255, 255, 255, 0.25);
     295    color: #ffffff;
     296    transform: translateY(-2px);
     297}
     298
     299/* Legacy support for old title class */
    113300.azgl-admin-title {
    114301    display: flex;
     
    120307    margin-bottom: 24px;
    121308    padding: 28px 32px;
    122     background: linear-gradient(135deg, #ffffff 0%, #f0fdf4 100%);
     309    background: linear-gradient(135deg, var(--azgl-gradient-start), var(--azgl-gradient-mid), var(--azgl-gradient-end));
    123310    border-radius: var(--azgl-radius-xl);
    124     border: 1px solid var(--azgl-primary-light);
     311    border: none;
    125312    box-shadow: var(--azgl-shadow-lg);
    126313    position: relative;
     
    135322    width: 200px;
    136323    height: 100%;
    137     background: linear-gradient(135deg, transparent 0%, rgba(16, 185, 129, 0.08) 100%);
     324    background: linear-gradient(135deg, transparent 0%, rgba(255, 255, 255, 0.1) 100%);
    138325    pointer-events: none;
    139326}
     
    144331    height: 36px;
    145332    color: #fff;
    146     background: linear-gradient(135deg, var(--azgl-primary) 0%, var(--azgl-primary-hover) 100%);
     333    background: rgba(255, 255, 255, 0.2);
    147334    padding: 12px;
    148335    border-radius: var(--azgl-radius);
    149     box-shadow: 0 4px 12px rgba(16, 185, 129, 0.4);
    150     animation: azgl-pulse 2s infinite;
    151 }
    152 
    153 @keyframes azgl-pulse {
    154     0%, 100% { box-shadow: 0 4px 12px rgba(16, 185, 129, 0.4); }
    155     50% { box-shadow: 0 4px 20px rgba(16, 185, 129, 0.6); }
    156 }
    157 
    158 .azgl-version {
    159     font-size: 11px;
    160     font-weight: 600;
    161     color: var(--azgl-primary-dark);
    162     background: var(--azgl-primary-light);
    163     padding: 6px 12px;
    164     border-radius: 20px;
    165     margin-left: auto;
    166     letter-spacing: 0.5px;
    167     text-transform: uppercase;
     336    box-shadow: 0 4px 12px rgba(99, 102, 241, 0.4);
    168337}
    169338
    170339/* ==========================================================================
    171    TABS NAVIGATION - Modern Pills
     340   TABS NAVIGATION - 3task Design System v1.0
    172341   ========================================================================== */
    173342
     
    177346    border-bottom: none;
    178347    border-radius: var(--azgl-radius-lg) var(--azgl-radius-lg) 0 0;
    179     padding: 16px 20px 0 20px;
     348    padding: 8px 16px 0 16px;
    180349    margin-bottom: 0;
    181350    display: flex;
    182     gap: 8px;
     351    gap: 4px;
    183352    overflow-x: auto;
    184353    scrollbar-width: none;
     
    192361    border: none;
    193362    background: transparent;
    194     padding: 12px 20px;
     363    padding: 14px 22px;
    195364    margin: 0 0 -1px 0;
    196365    font-size: 13px;
     
    201370    white-space: nowrap;
    202371    position: relative;
     372    display: flex;
     373    align-items: center;
     374    gap: 8px;
     375}
     376
     377/* Tab Icons */
     378.azgl-tabs .nav-tab .tab-icon {
     379    font-size: 16px;
     380    transition: var(--azgl-transition);
    203381}
    204382
     
    210388    width: 0;
    211389    height: 3px;
    212     background: var(--azgl-primary);
     390    background: linear-gradient(90deg, var(--azgl-gradient-start), var(--azgl-gradient-end));
    213391    border-radius: 3px 3px 0 0;
    214392    transition: var(--azgl-transition);
     
    217395
    218396.azgl-tabs .nav-tab:hover {
    219     background: var(--azgl-bg);
     397    background: var(--azgl-bg-tertiary);
    220398    color: var(--azgl-primary);
     399}
     400
     401.azgl-tabs .nav-tab:hover .tab-icon {
     402    transform: scale(1.15);
    221403}
    222404
     
    229411.azgl-tabs .nav-tab-active:focus {
    230412    border: none;
    231     background: linear-gradient(180deg, #f0fdf4 0%, #ffffff 100%);
     413    background: linear-gradient(180deg, var(--azgl-primary-light) 0%, #ffffff 100%);
    232414    color: var(--azgl-primary);
    233415    font-weight: 600;
     
    235417}
    236418
     419.azgl-tabs .nav-tab-active .tab-icon {
     420    transform: scale(1.1);
     421}
     422
    237423.azgl-tabs .nav-tab-active::after,
    238424.azgl-tabs .nav-tab-active:hover::after {
    239425    width: 100%;
    240     background: linear-gradient(90deg, var(--azgl-primary) 0%, #34d399 100%);
     426    background: linear-gradient(90deg, var(--azgl-gradient-start), var(--azgl-gradient-mid), var(--azgl-gradient-end));
     427    animation: azgl-underline-slide 0.3s ease-out;
     428}
     429
     430@keyframes azgl-underline-slide {
     431    from { width: 0; }
     432    to { width: 100%; }
     433}
     434
     435/* Tab Badge for Counts */
     436.azgl-tabs .nav-tab .tab-badge {
     437    font-size: 10px;
     438    font-weight: 700;
     439    padding: 2px 8px;
     440    border-radius: var(--azgl-radius-full);
     441    background: var(--azgl-success);
     442    color: #ffffff;
     443    margin-left: 4px;
     444}
     445
     446.azgl-tabs .nav-tab .tab-badge.badge-warning {
     447    background: var(--azgl-accent);
     448}
     449
     450.azgl-tabs .nav-tab .tab-badge.badge-new {
     451    background: var(--azgl-accent-pink);
    241452}
    242453
     
    256467
    257468/* ==========================================================================
    258    CARDS - Glassmorphism Style
     469   CARDS - 3task Design System v1.0
    259470   ========================================================================== */
    260471
     
    266477    margin-bottom: 24px;
    267478    box-shadow: var(--azgl-shadow);
    268     transition: var(--azgl-transition-slow);
     479    transition: var(--azgl-transition);
    269480    position: relative;
    270481    overflow: hidden;
     
    283494    right: 0;
    284495    height: 4px;
    285     background: linear-gradient(90deg, var(--azgl-primary) 0%, #34d399 50%, var(--azgl-secondary) 100%);
     496    background: linear-gradient(90deg, var(--azgl-gradient-start), var(--azgl-gradient-mid), var(--azgl-gradient-end));
    286497    opacity: 0;
    287498    transition: var(--azgl-transition);
     
    296507    padding-bottom: 16px;
    297508    border-bottom: 2px solid var(--azgl-bg);
    298     font-size: 18px;
     509    font-size: 17px;
    299510    font-weight: 700;
    300511    color: var(--azgl-text);
     
    311522}
    312523
     524.azgl-card h2 .card-icon {
     525    font-size: 20px;
     526}
     527
    313528.azgl-card h3 {
    314529    margin: 24px 0 16px 0;
     
    323538
    324539.azgl-limits-info {
    325     background: linear-gradient(135deg, #ecfdf5 0%, #d1fae5 100%);
    326     border: 1px solid #a7f3d0;
     540    background: linear-gradient(135deg, var(--azgl-primary-light) 0%, #e0e7ff 100%);
     541    border: 1px solid #c7d2fe;
    327542    border-radius: var(--azgl-radius);
    328543    padding: 18px 24px;
     
    348563
    349564.azgl-limits-info a {
    350     color: var(--azgl-primary-hover);
     565    color: var(--azgl-primary);
    351566    font-weight: 600;
    352567    text-decoration: none;
     
    400615
    401616.azgl-glossaries-table tbody tr:hover {
    402     background: linear-gradient(90deg, #f0fdf4 0%, transparent 100%);
     617    background: linear-gradient(90deg, var(--azgl-primary-light) 0%, transparent 100%);
    403618}
    404619
     
    451666
    452667.azgl-status-active {
    453     background: linear-gradient(135deg, #d1fae5 0%, #a7f3d0 100%);
    454     color: var(--azgl-primary-dark);
     668    background: linear-gradient(135deg, #dcfce7 0%, #bbf7d0 100%);
     669    color: #166534;
    455670}
    456671
     
    22372452    }
    22382453}
     2454
     2455/* ==========================================================================
     2456   DASHBOARD COMPONENTS - 3task Design System v1.0
     2457   ========================================================================== */
     2458
     2459/* Stats Grid (4 Columns) */
     2460.azgl-stats-grid {
     2461    display: grid;
     2462    grid-template-columns: repeat(4, 1fr);
     2463    gap: 20px;
     2464    margin-bottom: 32px;
     2465}
     2466
     2467.azgl-stat-card {
     2468    background: var(--azgl-card-bg);
     2469    border-radius: var(--azgl-radius-lg);
     2470    border: 1px solid var(--azgl-border);
     2471    padding: 24px;
     2472    position: relative;
     2473    overflow: hidden;
     2474    transition: var(--azgl-transition);
     2475}
     2476
     2477.azgl-stat-card::before {
     2478    content: '';
     2479    position: absolute;
     2480    top: 0;
     2481    left: 0;
     2482    right: 0;
     2483    height: 4px;
     2484}
     2485
     2486.azgl-stat-card:hover {
     2487    transform: translateY(-8px);
     2488    box-shadow: var(--azgl-shadow-lg), var(--azgl-shadow-glow);
     2489}
     2490
     2491/* Stat Card Color Variants */
     2492.azgl-stat-card.stat-purple::before {
     2493    background: linear-gradient(90deg, var(--azgl-gradient-start), var(--azgl-gradient-mid));
     2494}
     2495
     2496.azgl-stat-card.stat-green::before {
     2497    background: linear-gradient(90deg, #10b981, #34d399);
     2498}
     2499
     2500.azgl-stat-card.stat-blue::before {
     2501    background: linear-gradient(90deg, #3b82f6, #60a5fa);
     2502}
     2503
     2504.azgl-stat-card.stat-orange::before {
     2505    background: linear-gradient(90deg, #f59e0b, #fbbf24);
     2506}
     2507
     2508.azgl-stat-header {
     2509    display: flex;
     2510    align-items: center;
     2511    justify-content: space-between;
     2512    margin-bottom: 16px;
     2513}
     2514
     2515.azgl-stat-icon {
     2516    font-size: 24px;
     2517    transition: var(--azgl-transition-spring);
     2518}
     2519
     2520.azgl-stat-card:hover .azgl-stat-icon {
     2521    transform: scale(1.2) rotate(10deg);
     2522}
     2523
     2524.azgl-stat-trend {
     2525    font-size: 11px;
     2526    font-weight: 700;
     2527    padding: 4px 10px;
     2528    border-radius: var(--azgl-radius-full);
     2529    background: #dcfce7;
     2530    color: #166534;
     2531}
     2532
     2533.azgl-stat-trend.trend-neutral {
     2534    background: var(--azgl-bg-tertiary);
     2535    color: var(--azgl-text-muted);
     2536}
     2537
     2538.azgl-stat-value {
     2539    font-size: 40px;
     2540    font-weight: 800;
     2541    color: var(--azgl-text);
     2542    letter-spacing: -1px;
     2543    line-height: 1;
     2544    margin-bottom: 8px;
     2545}
     2546
     2547.azgl-stat-label {
     2548    font-size: 13px;
     2549    font-weight: 500;
     2550    color: var(--azgl-text-muted);
     2551    text-transform: uppercase;
     2552    letter-spacing: 0.5px;
     2553}
     2554
     2555/* Content Grid (2 Columns) */
     2556.azgl-content-grid {
     2557    display: grid;
     2558    grid-template-columns: 1.8fr 1fr;
     2559    gap: 24px;
     2560}
     2561
     2562/* Quick Actions Grid */
     2563.azgl-quick-actions {
     2564    display: grid;
     2565    grid-template-columns: repeat(2, 1fr);
     2566    gap: 16px;
     2567    margin-bottom: 24px;
     2568}
     2569
     2570.azgl-quick-action {
     2571    display: flex;
     2572    flex-direction: column;
     2573    align-items: center;
     2574    gap: 12px;
     2575    padding: 24px 16px;
     2576    background: var(--azgl-card-bg);
     2577    border: 1px solid var(--azgl-border);
     2578    border-radius: var(--azgl-radius-lg);
     2579    text-decoration: none;
     2580    transition: var(--azgl-transition);
     2581    cursor: pointer;
     2582}
     2583
     2584.azgl-quick-action:hover {
     2585    transform: translateY(-4px);
     2586    box-shadow: var(--azgl-shadow-lg);
     2587    border-color: var(--azgl-primary);
     2588}
     2589
     2590.azgl-quick-action-icon {
     2591    width: 48px;
     2592    height: 48px;
     2593    background: var(--azgl-bg-tertiary);
     2594    border-radius: var(--azgl-radius);
     2595    display: flex;
     2596    align-items: center;
     2597    justify-content: center;
     2598    font-size: 24px;
     2599    transition: var(--azgl-transition);
     2600}
     2601
     2602.azgl-quick-action:hover .azgl-quick-action-icon {
     2603    background: var(--azgl-primary-light);
     2604    transform: scale(1.1);
     2605}
     2606
     2607.azgl-quick-action-label {
     2608    font-size: 13px;
     2609    font-weight: 600;
     2610    color: var(--azgl-text);
     2611    text-align: center;
     2612}
     2613
     2614/* Feature Showcase Box */
     2615.azgl-feature-showcase {
     2616    background: linear-gradient(135deg, var(--azgl-primary-light) 0%, #e0e7ff 100%);
     2617    border: 1px solid #c7d2fe;
     2618    border-radius: var(--azgl-radius-lg);
     2619    padding: 24px;
     2620    position: relative;
     2621    overflow: hidden;
     2622}
     2623
     2624.azgl-feature-showcase::before {
     2625    content: '';
     2626    position: absolute;
     2627    top: -50%;
     2628    right: -20%;
     2629    width: 150px;
     2630    height: 150px;
     2631    background: rgba(99, 102, 241, 0.1);
     2632    border-radius: 50%;
     2633}
     2634
     2635.azgl-feature-showcase-header {
     2636    display: flex;
     2637    align-items: center;
     2638    gap: 10px;
     2639    margin-bottom: 16px;
     2640    position: relative;
     2641}
     2642
     2643.azgl-feature-showcase-badge {
     2644    font-size: 10px;
     2645    font-weight: 700;
     2646    padding: 4px 10px;
     2647    border-radius: var(--azgl-radius-full);
     2648    background: linear-gradient(135deg, var(--azgl-gradient-start), var(--azgl-gradient-end));
     2649    color: #ffffff;
     2650    text-transform: uppercase;
     2651    letter-spacing: 0.5px;
     2652}
     2653
     2654.azgl-feature-showcase h3 {
     2655    font-size: 16px;
     2656    font-weight: 700;
     2657    color: var(--azgl-text);
     2658    margin: 0;
     2659}
     2660
     2661.azgl-feature-tags {
     2662    display: flex;
     2663    flex-wrap: wrap;
     2664    gap: 8px;
     2665    position: relative;
     2666}
     2667
     2668.azgl-feature-tag {
     2669    font-size: 12px;
     2670    font-weight: 500;
     2671    padding: 6px 12px;
     2672    background: rgba(255, 255, 255, 0.8);
     2673    border-radius: var(--azgl-radius-full);
     2674    color: var(--azgl-text);
     2675    display: flex;
     2676    align-items: center;
     2677    gap: 6px;
     2678}
     2679
     2680.azgl-feature-tag .tag-icon {
     2681    font-size: 14px;
     2682}
     2683
     2684/* Onboarding Banner */
     2685.azgl-onboarding {
     2686    background: linear-gradient(135deg, #fef3c7 0%, #fde68a 100%);
     2687    border: 1px solid #fcd34d;
     2688    border-radius: var(--azgl-radius-lg);
     2689    padding: 24px 28px;
     2690    margin-bottom: 24px;
     2691    display: flex;
     2692    align-items: center;
     2693    gap: 20px;
     2694    position: relative;
     2695    overflow: hidden;
     2696}
     2697
     2698.azgl-onboarding::before {
     2699    content: '';
     2700    position: absolute;
     2701    top: -30%;
     2702    right: 5%;
     2703    width: 100px;
     2704    height: 100px;
     2705    background: rgba(251, 191, 36, 0.3);
     2706    border-radius: 50%;
     2707}
     2708
     2709.azgl-onboarding-icon {
     2710    font-size: 32px;
     2711    flex-shrink: 0;
     2712}
     2713
     2714.azgl-onboarding-content {
     2715    flex: 1;
     2716    position: relative;
     2717}
     2718
     2719.azgl-onboarding h3 {
     2720    font-size: 16px;
     2721    font-weight: 700;
     2722    color: #92400e;
     2723    margin: 0 0 6px 0;
     2724}
     2725
     2726.azgl-onboarding p {
     2727    font-size: 14px;
     2728    color: #a16207;
     2729    margin: 0;
     2730    line-height: 1.5;
     2731}
     2732
     2733.azgl-onboarding-btn {
     2734    display: inline-flex;
     2735    align-items: center;
     2736    gap: 8px;
     2737    padding: 10px 20px;
     2738    background: #ffffff;
     2739    color: #92400e;
     2740    border: none;
     2741    border-radius: var(--azgl-radius-sm);
     2742    font-size: 13px;
     2743    font-weight: 600;
     2744    text-decoration: none;
     2745    transition: var(--azgl-transition);
     2746    flex-shrink: 0;
     2747}
     2748
     2749.azgl-onboarding-btn:hover {
     2750    background: #fef3c7;
     2751    transform: translateY(-2px);
     2752    box-shadow: var(--azgl-shadow);
     2753    color: #92400e;
     2754}
     2755
     2756.azgl-onboarding-close {
     2757    position: absolute;
     2758    top: 16px;
     2759    right: 16px;
     2760    background: transparent;
     2761    border: none;
     2762    font-size: 18px;
     2763    color: #92400e;
     2764    cursor: pointer;
     2765    opacity: 0.6;
     2766    transition: var(--azgl-transition);
     2767}
     2768
     2769.azgl-onboarding-close:hover {
     2770    opacity: 1;
     2771}
     2772
     2773/* Glossary List Card Improvements */
     2774.azgl-glossary-item {
     2775    display: flex;
     2776    align-items: center;
     2777    gap: 16px;
     2778    padding: 18px 20px;
     2779    background: var(--azgl-card-bg);
     2780    border: 1px solid var(--azgl-border);
     2781    border-radius: var(--azgl-radius-lg);
     2782    margin-bottom: 12px;
     2783    transition: var(--azgl-transition);
     2784}
     2785
     2786.azgl-glossary-item:hover {
     2787    border-color: var(--azgl-primary);
     2788    box-shadow: var(--azgl-shadow);
     2789    transform: translateX(4px);
     2790}
     2791
     2792.azgl-glossary-avatar {
     2793    width: 48px;
     2794    height: 48px;
     2795    background: linear-gradient(135deg, var(--azgl-gradient-start), var(--azgl-gradient-end));
     2796    border-radius: var(--azgl-radius);
     2797    display: flex;
     2798    align-items: center;
     2799    justify-content: center;
     2800    color: #ffffff;
     2801    font-size: 18px;
     2802    font-weight: 700;
     2803    flex-shrink: 0;
     2804}
     2805
     2806.azgl-glossary-info {
     2807    flex: 1;
     2808    min-width: 0;
     2809}
     2810
     2811.azgl-glossary-title {
     2812    font-size: 15px;
     2813    font-weight: 600;
     2814    color: var(--azgl-text);
     2815    margin: 0 0 4px 0;
     2816    white-space: nowrap;
     2817    overflow: hidden;
     2818    text-overflow: ellipsis;
     2819}
     2820
     2821.azgl-glossary-meta {
     2822    font-size: 13px;
     2823    color: var(--azgl-text-muted);
     2824}
     2825
     2826.azgl-glossary-count {
     2827    font-size: 20px;
     2828    font-weight: 700;
     2829    color: var(--azgl-text);
     2830    padding: 8px 16px;
     2831    background: var(--azgl-bg-tertiary);
     2832    border-radius: var(--azgl-radius-sm);
     2833}
     2834
     2835/* Dashboard Responsive */
     2836@media (max-width: 1200px) {
     2837    .azgl-stats-grid {
     2838        grid-template-columns: repeat(2, 1fr);
     2839    }
     2840
     2841    .azgl-content-grid {
     2842        grid-template-columns: 1fr;
     2843    }
     2844
     2845    .azgl-quick-actions {
     2846        grid-template-columns: repeat(4, 1fr);
     2847    }
     2848}
     2849
     2850@media (max-width: 768px) {
     2851    .azgl-stats-grid {
     2852        grid-template-columns: 1fr;
     2853    }
     2854
     2855    .azgl-quick-actions {
     2856        grid-template-columns: repeat(2, 1fr);
     2857    }
     2858
     2859    .azgl-onboarding {
     2860        flex-direction: column;
     2861        text-align: center;
     2862    }
     2863
     2864    .azgl-admin-header {
     2865        padding: 24px;
     2866    }
     2867
     2868    .azgl-admin-header-content {
     2869        flex-direction: column;
     2870        gap: 20px;
     2871        text-align: center;
     2872    }
     2873
     2874    .azgl-admin-header-left {
     2875        flex-direction: column;
     2876    }
     2877
     2878    .azgl-admin-title-text h1 {
     2879        font-size: 22px;
     2880    }
     2881
     2882    .azgl-admin-header-right {
     2883        width: 100%;
     2884        justify-content: center;
     2885    }
     2886}
     2887
     2888/* ==========================================================================
     2889   SUPPORT & PRO SECTION - 3task Design System v1.0
     2890   ========================================================================== */
     2891
     2892.azgl-support-pro-grid {
     2893    display: grid;
     2894    grid-template-columns: 1fr 1fr;
     2895    gap: 24px;
     2896    margin-top: 24px;
     2897}
     2898
     2899/* Supporter Card - Psychologically Optimized */
     2900.azgl-supporter-card {
     2901    background: linear-gradient(135deg, #ecfdf5 0%, #d1fae5 100%);
     2902    border-color: #6ee7b7;
     2903    position: relative;
     2904}
     2905
     2906.azgl-supporter-header {
     2907    display: flex;
     2908    align-items: center;
     2909    gap: 16px;
     2910    margin-bottom: 20px;
     2911}
     2912
     2913.azgl-supporter-logo {
     2914    width: 56px;
     2915    height: 56px;
     2916    border-radius: var(--azgl-radius);
     2917    box-shadow: 0 4px 12px rgba(16, 185, 129, 0.3);
     2918}
     2919
     2920.azgl-supporter-header h2 {
     2921    margin: 0 0 4px 0;
     2922    padding: 0;
     2923    border: none;
     2924    font-size: 20px;
     2925    font-weight: 700;
     2926    color: #065f46;
     2927}
     2928
     2929.azgl-supporter-subtitle {
     2930    margin: 0;
     2931    font-size: 13px;
     2932    color: #047857;
     2933}
     2934
     2935/* Value Box - Reciprocity Trigger */
     2936.azgl-value-box {
     2937    background: rgba(255, 255, 255, 0.7);
     2938    border: 1px solid #a7f3d0;
     2939    border-radius: var(--azgl-radius);
     2940    padding: 16px;
     2941    margin-bottom: 20px;
     2942}
     2943
     2944.azgl-value-header {
     2945    display: flex;
     2946    align-items: center;
     2947    gap: 8px;
     2948    margin-bottom: 12px;
     2949}
     2950
     2951.azgl-value-icon {
     2952    font-size: 20px;
     2953}
     2954
     2955.azgl-value-title {
     2956    font-size: 14px;
     2957    font-weight: 600;
     2958    color: #065f46;
     2959}
     2960
     2961.azgl-value-items {
     2962    display: flex;
     2963    flex-wrap: wrap;
     2964    gap: 8px 16px;
     2965    margin-bottom: 12px;
     2966}
     2967
     2968.azgl-value-item {
     2969    font-size: 13px;
     2970    color: #047857;
     2971    font-weight: 500;
     2972}
     2973
     2974.azgl-value-worth {
     2975    font-size: 15px;
     2976    font-weight: 700;
     2977    color: #065f46;
     2978    margin: 0;
     2979    padding-top: 12px;
     2980    border-top: 1px dashed #a7f3d0;
     2981}
     2982
     2983/* Give Back Section */
     2984.azgl-give-back {
     2985    background: #ffffff;
     2986    border: 2px solid #10b981;
     2987    border-radius: var(--azgl-radius);
     2988    padding: 20px;
     2989    margin-bottom: 16px;
     2990}
     2991
     2992.azgl-give-back-text {
     2993    font-size: 14px;
     2994    color: var(--azgl-text);
     2995    margin: 0 0 16px 0;
     2996    line-height: 1.5;
     2997}
     2998
     2999.azgl-give-back-text strong {
     3000    color: #065f46;
     3001}
     3002
     3003.azgl-supporter-form {
     3004    margin: 0;
     3005}
     3006
     3007/* Toggle Switch */
     3008.azgl-supporter-toggle {
     3009    display: flex;
     3010    align-items: center;
     3011    gap: 12px;
     3012    cursor: pointer;
     3013    margin-bottom: 16px;
     3014    padding: 12px 16px;
     3015    background: #f0fdf4;
     3016    border-radius: var(--azgl-radius-sm);
     3017    border: 1px solid #a7f3d0;
     3018    transition: var(--azgl-transition);
     3019}
     3020
     3021.azgl-supporter-toggle:hover {
     3022    background: #dcfce7;
     3023}
     3024
     3025.azgl-supporter-toggle input {
     3026    display: none;
     3027}
     3028
     3029.azgl-toggle-slider {
     3030    width: 52px;
     3031    height: 28px;
     3032    background: #d1d5db;
     3033    border-radius: 14px;
     3034    position: relative;
     3035    transition: var(--azgl-transition);
     3036    flex-shrink: 0;
     3037}
     3038
     3039.azgl-toggle-slider::before {
     3040    content: '';
     3041    position: absolute;
     3042    width: 22px;
     3043    height: 22px;
     3044    background: #ffffff;
     3045    border-radius: 50%;
     3046    top: 3px;
     3047    left: 3px;
     3048    transition: var(--azgl-transition);
     3049    box-shadow: 0 2px 4px rgba(0,0,0,0.2);
     3050}
     3051
     3052.azgl-supporter-toggle input:checked + .azgl-toggle-slider {
     3053    background: linear-gradient(135deg, #10b981, #059669);
     3054}
     3055
     3056.azgl-supporter-toggle input:checked + .azgl-toggle-slider::before {
     3057    transform: translateX(24px);
     3058}
     3059
     3060.azgl-toggle-label {
     3061    font-size: 15px;
     3062    font-weight: 600;
     3063    color: var(--azgl-text);
     3064}
     3065
     3066.azgl-supporter-badge {
     3067    display: inline-flex;
     3068    align-items: center;
     3069    gap: 6px;
     3070    background: linear-gradient(135deg, #fbbf24, #f59e0b);
     3071    color: #78350f;
     3072    padding: 4px 12px;
     3073    border-radius: var(--azgl-radius-full);
     3074    font-size: 13px;
     3075    font-weight: 700;
     3076}
     3077
     3078.azgl-supporter-preview {
     3079    background: #f8fafc;
     3080    border: 1px solid var(--azgl-border);
     3081    border-radius: var(--azgl-radius-sm);
     3082    padding: 12px 16px;
     3083    margin-bottom: 16px;
     3084    display: flex;
     3085    align-items: center;
     3086    gap: 12px;
     3087}
     3088
     3089.azgl-preview-label {
     3090    font-size: 12px;
     3091    color: var(--azgl-text-muted);
     3092    font-weight: 500;
     3093}
     3094
     3095.azgl-preview-link {
     3096    font-size: 13px;
     3097    color: #6b7280;
     3098}
     3099
     3100.azgl-preview-link a {
     3101    color: var(--azgl-primary);
     3102    text-decoration: none;
     3103}
     3104
     3105.azgl-supporter-btn-save {
     3106    width: 100%;
     3107    padding: 12px 24px !important;
     3108    font-size: 15px !important;
     3109    font-weight: 600 !important;
     3110    background: linear-gradient(135deg, #10b981, #059669) !important;
     3111    border-color: #059669 !important;
     3112}
     3113
     3114.azgl-supporter-btn-save:hover {
     3115    background: linear-gradient(135deg, #059669, #047857) !important;
     3116    transform: translateY(-1px);
     3117}
     3118
     3119/* Footer with alternatives */
     3120.azgl-supporter-footer {
     3121    padding-top: 16px;
     3122    border-top: 1px solid #a7f3d0;
     3123}
     3124
     3125.azgl-supporter-alternatives {
     3126    display: flex;
     3127    flex-wrap: wrap;
     3128    align-items: center;
     3129    gap: 16px;
     3130    font-size: 13px;
     3131}
     3132
     3133.azgl-supporter-alternatives > span {
     3134    color: var(--azgl-text-muted);
     3135}
     3136
     3137.azgl-alt-action {
     3138    display: inline-flex;
     3139    align-items: center;
     3140    gap: 6px;
     3141    color: #047857;
     3142    text-decoration: none;
     3143    font-weight: 500;
     3144    padding: 6px 12px;
     3145    background: rgba(255,255,255,0.5);
     3146    border-radius: var(--azgl-radius-sm);
     3147    transition: var(--azgl-transition);
     3148}
     3149
     3150.azgl-alt-action:hover {
     3151    background: #ffffff;
     3152    color: #065f46;
     3153}
     3154
     3155/* Pro Card */
     3156.azgl-pro-card {
     3157    background: linear-gradient(135deg, #ede9fe 0%, #ddd6fe 100%);
     3158    border-color: #a78bfa;
     3159    position: relative;
     3160    overflow: hidden;
     3161}
     3162
     3163.azgl-pro-card::before {
     3164    content: '';
     3165    position: absolute;
     3166    top: -50px;
     3167    right: -50px;
     3168    width: 150px;
     3169    height: 150px;
     3170    background: rgba(139, 92, 246, 0.15);
     3171    border-radius: 50%;
     3172}
     3173
     3174.azgl-pro-badge {
     3175    position: absolute;
     3176    top: 20px;
     3177    right: 20px;
     3178    background: linear-gradient(135deg, var(--azgl-gradient-start), var(--azgl-gradient-end));
     3179    color: #ffffff;
     3180    font-size: 11px;
     3181    font-weight: 800;
     3182    padding: 6px 14px;
     3183    border-radius: var(--azgl-radius-full);
     3184    letter-spacing: 1px;
     3185}
     3186
     3187.azgl-pro-card h2 {
     3188    margin: 0 0 8px 0;
     3189    padding: 0;
     3190    border: none;
     3191    font-size: 20px;
     3192    font-weight: 700;
     3193    color: #4c1d95;
     3194}
     3195
     3196.azgl-pro-subtitle {
     3197    font-size: 14px;
     3198    color: #6d28d9;
     3199    margin: 0 0 20px 0;
     3200}
     3201
     3202.azgl-pro-features {
     3203    list-style: none;
     3204    margin: 0 0 24px 0;
     3205    padding: 0;
     3206}
     3207
     3208.azgl-pro-features li {
     3209    display: flex;
     3210    align-items: center;
     3211    gap: 10px;
     3212    padding: 8px 0;
     3213    font-size: 14px;
     3214    color: var(--azgl-text);
     3215}
     3216
     3217.azgl-pro-features .pro-check {
     3218    color: var(--azgl-success);
     3219    font-weight: 700;
     3220}
     3221
     3222.azgl-pro-btn {
     3223    display: inline-flex;
     3224    align-items: center;
     3225    gap: 8px;
     3226    padding: 12px 24px;
     3227    background: linear-gradient(135deg, var(--azgl-gradient-start), var(--azgl-gradient-mid));
     3228    color: #ffffff;
     3229    border: none;
     3230    border-radius: var(--azgl-radius-sm);
     3231    font-size: 14px;
     3232    font-weight: 600;
     3233    text-decoration: none;
     3234    transition: var(--azgl-transition);
     3235    box-shadow: 0 4px 12px rgba(99, 102, 241, 0.3);
     3236}
     3237
     3238.azgl-pro-btn:hover {
     3239    transform: translateY(-2px);
     3240    box-shadow: 0 6px 20px rgba(99, 102, 241, 0.4);
     3241    color: #ffffff;
     3242}
     3243
     3244/* Responsive Support & Pro Grid */
     3245@media (max-width: 1024px) {
     3246    .azgl-support-pro-grid {
     3247        grid-template-columns: 1fr;
     3248    }
     3249}
     3250
     3251/* ==========================================================================
     3252   HELP TAB - PRO FEATURES SECTION
     3253   ========================================================================== */
     3254
     3255.azgl-help-pro-card {
     3256    background: linear-gradient(135deg, #f5f3ff 0%, #ede9fe 100%);
     3257    border-color: #c4b5fd;
     3258}
     3259
     3260.azgl-help-pro-card h2 {
     3261    display: flex;
     3262    align-items: center;
     3263    border: none;
     3264    padding: 0;
     3265    margin-bottom: 12px;
     3266}
     3267
     3268.azgl-help-pro-card > p {
     3269    color: var(--azgl-text-muted);
     3270    margin-bottom: 20px;
     3271}
     3272
     3273.azgl-help-pro-grid {
     3274    display: grid;
     3275    grid-template-columns: repeat(2, 1fr);
     3276    gap: 16px;
     3277}
     3278
     3279.azgl-help-pro-feature {
     3280    display: flex;
     3281    gap: 12px;
     3282    padding: 16px;
     3283    background: rgba(255, 255, 255, 0.7);
     3284    border-radius: var(--azgl-radius);
     3285    border: 1px solid #ddd6fe;
     3286}
     3287
     3288.azgl-help-pro-icon {
     3289    font-size: 24px;
     3290    flex-shrink: 0;
     3291}
     3292
     3293.azgl-help-pro-feature strong {
     3294    display: block;
     3295    font-size: 14px;
     3296    color: var(--azgl-text);
     3297    margin-bottom: 4px;
     3298}
     3299
     3300.azgl-help-pro-feature p {
     3301    font-size: 13px;
     3302    color: var(--azgl-text-muted);
     3303    margin: 0;
     3304    line-height: 1.4;
     3305}
     3306
     3307@media (max-width: 768px) {
     3308    .azgl-help-pro-grid {
     3309        grid-template-columns: 1fr;
     3310    }
     3311}
  • 3task-glossary/trunk/assets/css/frontend.css

    r3447608 r3454651  
    11/**
    2  * 3task Glossary - Frontend Styles v2.1.0
    3  * 6 Color Schemes + Dark Mode + 3 Navigation Styles
     2 * 3task Glossary - Frontend Styles v2.3.0
     3 * 6 Color Schemes + Dark Mode + 3 Navigation Styles + Widget + Print
    44 *
    55 * @package 3Task_Glossary
     
    493493    }
    494494}
     495
     496/* ==========================================================================
     497   SIDEBAR WIDGET - v2.3.0
     498   ========================================================================== */
     499
     500.azgl-widget {
     501    font-size: 14px;
     502}
     503
     504.azgl-widget-az {
     505    display: flex;
     506    flex-wrap: wrap;
     507    gap: 4px;
     508    margin-bottom: 12px;
     509}
     510
     511.azgl-widget-letter {
     512    display: inline-flex;
     513    align-items: center;
     514    justify-content: center;
     515    width: 28px;
     516    height: 28px;
     517    font-size: 12px;
     518    font-weight: 600;
     519    text-decoration: none;
     520    border-radius: 4px;
     521    transition: all 0.2s ease;
     522}
     523
     524.azgl-widget-letter-active {
     525    background: var(--azgl-primary);
     526    color: #ffffff;
     527}
     528
     529.azgl-widget-letter-active:hover {
     530    background: var(--azgl-hover);
     531    color: #ffffff;
     532    transform: scale(1.1);
     533}
     534
     535.azgl-widget-letter-inactive {
     536    background: var(--azgl-bg-inactive);
     537    color: var(--azgl-text-muted);
     538    cursor: default;
     539}
     540
     541.azgl-widget-list {
     542    list-style: none;
     543    margin: 0;
     544    padding: 0;
     545}
     546
     547.azgl-widget-list li {
     548    margin-bottom: 8px;
     549}
     550
     551.azgl-widget-list a {
     552    color: var(--azgl-text);
     553    text-decoration: none;
     554    transition: color 0.2s ease;
     555}
     556
     557.azgl-widget-list a:hover {
     558    color: var(--azgl-primary);
     559}
     560
     561.azgl-widget-link {
     562    margin-top: 12px;
     563    font-size: 13px;
     564}
     565
     566.azgl-widget-link a {
     567    color: var(--azgl-primary);
     568    text-decoration: none;
     569}
     570
     571.azgl-widget-link a:hover {
     572    text-decoration: underline;
     573}
     574
     575/* ==========================================================================
     576   ACTION BUTTONS (Print, etc.) - v2.3.0
     577   ========================================================================== */
     578
     579.azgl-action-buttons {
     580    display: flex;
     581    flex-wrap: wrap;
     582    gap: 12px;
     583    margin-top: 32px;
     584    padding-top: 24px;
     585    border-top: 1px solid var(--azgl-border);
     586}
     587
     588.azgl-print-btn {
     589    display: inline-flex;
     590    align-items: center;
     591    gap: 8px;
     592    padding: 12px 24px;
     593    background: var(--azgl-bg);
     594    color: var(--azgl-text);
     595    border: 1px solid var(--azgl-border);
     596    border-radius: 8px;
     597    font-size: 14px;
     598    font-weight: 500;
     599    cursor: pointer;
     600    transition: all 0.2s ease;
     601}
     602
     603.azgl-print-btn:hover {
     604    background: var(--azgl-primary);
     605    color: #ffffff;
     606    border-color: var(--azgl-primary);
     607    transform: translateY(-2px);
     608    box-shadow: 0 4px 12px rgba(0, 0, 0, 0.15);
     609}
     610
     611.azgl-print-btn .btn-icon {
     612    font-size: 18px;
     613}
     614
     615/* ==========================================================================
     616   REVERSE LINKS SECTION - v2.3.0
     617   ========================================================================== */
     618
     619.azgl-reverse-links {
     620    margin-top: 32px;
     621    padding: 20px;
     622    background: var(--azgl-bg-inactive);
     623    border-radius: 12px;
     624}
     625
     626.azgl-reverse-links h4 {
     627    margin: 0 0 12px 0;
     628    font-size: 14px;
     629    font-weight: 600;
     630    color: var(--azgl-text);
     631    display: flex;
     632    align-items: center;
     633    gap: 8px;
     634}
     635
     636.azgl-reverse-links ul {
     637    list-style: none;
     638    margin: 0;
     639    padding: 0;
     640}
     641
     642.azgl-reverse-links li {
     643    margin-bottom: 8px;
     644    font-size: 14px;
     645}
     646
     647.azgl-reverse-links a {
     648    color: var(--azgl-primary);
     649    text-decoration: none;
     650}
     651
     652.azgl-reverse-links a:hover {
     653    text-decoration: underline;
     654}
     655
     656.azgl-reverse-links .post-type {
     657    font-size: 11px;
     658    color: var(--azgl-text-muted);
     659    background: var(--azgl-bg);
     660    padding: 2px 8px;
     661    border-radius: 4px;
     662    margin-left: 8px;
     663}
     664
     665/* ==========================================================================
     666   PRINT STYLESHEET - v2.3.0
     667   ========================================================================== */
     668
     669@media print {
     670    /* Hide navigation and interactive elements */
     671    .azgl-nav,
     672    .azgl-back-link,
     673    .azgl-action-buttons,
     674    .azgl-print-btn,
     675    .azgl-credit-link,
     676    .azgl-upgrade-link {
     677        display: none !important;
     678    }
     679
     680    /* Reset colors for printing */
     681    .azgl-entries,
     682    .azgl-section,
     683    .azgl-list,
     684    .azgl-item {
     685        background: transparent !important;
     686        color: #000000 !important;
     687        border-color: #cccccc !important;
     688    }
     689
     690    /* Letter headings */
     691    .azgl-letter {
     692        color: #000000 !important;
     693        background: #f0f0f0 !important;
     694        padding: 8px 12px !important;
     695        margin-top: 24px !important;
     696        page-break-after: avoid;
     697        border: 1px solid #cccccc !important;
     698    }
     699
     700    /* Entry items */
     701    .azgl-item {
     702        padding: 8px 0 !important;
     703        border-bottom: 1px dotted #cccccc !important;
     704    }
     705
     706    .azgl-item a {
     707        color: #000000 !important;
     708        text-decoration: none !important;
     709    }
     710
     711    /* Show URL after links */
     712    .azgl-item a::after {
     713        content: " (" attr(href) ")";
     714        font-size: 10px;
     715        color: #666666;
     716    }
     717
     718    /* Prevent orphan sections */
     719    .azgl-section {
     720        page-break-inside: avoid;
     721    }
     722
     723    /* Page margins */
     724    @page {
     725        margin: 2cm;
     726    }
     727
     728    /* Add title at top */
     729    .azgl-entries::before {
     730        content: "Glossary";
     731        display: block;
     732        font-size: 24px;
     733        font-weight: bold;
     734        margin-bottom: 24px;
     735        padding-bottom: 12px;
     736        border-bottom: 2px solid #000000;
     737    }
     738
     739    /* Reverse links for print */
     740    .azgl-reverse-links {
     741        background: transparent !important;
     742        border: 1px solid #cccccc !important;
     743        padding: 12px !important;
     744    }
     745
     746    .azgl-reverse-links h4 {
     747        color: #000000 !important;
     748    }
     749
     750    .azgl-reverse-links a {
     751        color: #000000 !important;
     752    }
     753}
  • 3task-glossary/trunk/includes/class-admin.php

    r3453804 r3454651  
    6161    public function add_admin_menu() {
    6262        add_menu_page(
    63             __( 'SEO Glossary', '3task-glossary' ),
    64             __( 'SEO Glossary', '3task-glossary' ),
     63            __( '3task Glossary', '3task-glossary' ),
     64            __( '3task Glossary', '3task-glossary' ),
    6565            'manage_options',
    6666            'az-glossary',
     
    236236            'link_class'      => isset( $_POST['link_class'] ) ? sanitize_html_class( wp_unslash( $_POST['link_class'] ) ) : 'glossary-term',
    237237            'cache_enabled'   => isset( $_POST['cache_enabled'] ),
     238            // v2.3.0 Advanced Features.
     239            'enable_schema' => isset( $_POST['enable_schema'] ),
     240            'enable_print'  => isset( $_POST['enable_print'] ),
    238241        );
    239242        // phpcs:enable WordPress.Security.NonceVerification.Missing
     
    384387     */
    385388    public function render_admin_page() {
     389        // Tab configuration with icons (Unicode emojis for DSGVO compliance).
    386390        $tabs = array(
    387             'glossaries' => __( 'Glossaries', '3task-glossary' ),
    388             'settings'   => __( 'Settings', '3task-glossary' ),
    389             'design'     => __( 'Design', '3task-glossary' ),
    390             'help'       => __( 'Help', '3task-glossary' ),
     391            'dashboard'  => array(
     392                'label' => __( 'Dashboard', '3task-glossary' ),
     393                'icon'  => '📊',
     394            ),
     395            'glossaries' => array(
     396                'label' => __( 'Glossaries', '3task-glossary' ),
     397                'icon'  => '📚',
     398                'count' => count( $this->options->get( 'glossaries', array() ) ),
     399            ),
     400            'settings'   => array(
     401                'label' => __( 'Settings', '3task-glossary' ),
     402                'icon'  => '⚙️',
     403            ),
     404            'design'     => array(
     405                'label' => __( 'Design', '3task-glossary' ),
     406                'icon'  => '🎨',
     407            ),
     408            'help'       => array(
     409                'label' => __( 'Help', '3task-glossary' ),
     410                'icon'  => '❓',
     411            ),
    391412        );
    392413
    393414        // Get current tab.
    394415        // phpcs:ignore WordPress.Security.NonceVerification.Recommended -- Only reading for tab display
    395         $current_tab = isset( $_GET['tab'] ) ? sanitize_key( $_GET['tab'] ) : 'glossaries';
     416        $current_tab = isset( $_GET['tab'] ) ? sanitize_key( $_GET['tab'] ) : 'dashboard';
    396417        if ( ! array_key_exists( $current_tab, $tabs ) ) {
    397             $current_tab = 'glossaries';
     418            $current_tab = 'dashboard';
    398419        }
    399420
     
    405426        ?>
    406427        <div class="wrap azgl-admin">
    407             <div class="azgl-header">
    408                 <div class="azgl-header-left">
    409                     <span class="dashicons dashicons-book-alt azgl-logo-icon"></span>
    410                     <h1 class="azgl-admin-title"><?php echo esc_html__( 'SEO Glossary', '3task-glossary' ); ?></h1>
    411                     <span class="azgl-version"><?php echo esc_html( 'v' . AZGL_VERSION ); ?></span>
     428            <!-- Animated Gradient Header -->
     429            <div class="azgl-admin-header">
     430                <div class="azgl-admin-header-content">
     431                    <div class="azgl-admin-header-left">
     432                        <div class="azgl-admin-icon">📚</div>
     433                        <div class="azgl-admin-title-text">
     434                            <h1><?php echo esc_html__( '3task Glossary', '3task-glossary' ); ?></h1>
     435                            <div class="azgl-admin-title-meta">
     436                                <span class="azgl-version"><?php echo esc_html( 'v' . AZGL_VERSION ); ?></span>
     437                                <span class="azgl-status-dot"><?php esc_html_e( 'Active', '3task-glossary' ); ?></span>
     438                            </div>
     439                        </div>
     440                    </div>
     441                    <div class="azgl-admin-header-right">
     442                        <a href="https://wordpress.org/support/plugin/3task-glossary/" target="_blank" class="azgl-header-btn">
     443                            <span>📖</span>
     444                            <?php esc_html_e( 'Docs', '3task-glossary' ); ?>
     445                        </a>
     446                        <a href="https://wordpress.org/support/plugin/3task-glossary/" target="_blank" class="azgl-header-btn">
     447                            <span>💬</span>
     448                            <?php esc_html_e( 'Support', '3task-glossary' ); ?>
     449                        </a>
     450                    </div>
    412451                </div>
    413452            </div>
     
    420459
    421460            <nav class="azgl-tabs nav-tab-wrapper">
    422                 <?php foreach ( $tabs as $tab_id => $tab_label ) : ?>
     461                <?php foreach ( $tabs as $tab_id => $tab_data ) : ?>
    423462                    <a href="<?php echo esc_url( admin_url( 'admin.php?page=az-glossary&tab=' . $tab_id ) ); ?>"
    424463                       class="nav-tab <?php echo esc_attr( $current_tab === $tab_id ? 'nav-tab-active' : '' ); ?>">
    425                         <?php echo esc_html( $tab_label ); ?>
     464                        <span class="tab-icon"><?php echo esc_html( $tab_data['icon'] ); ?></span>
     465                        <?php echo esc_html( $tab_data['label'] ); ?>
     466                        <?php if ( ! empty( $tab_data['count'] ) && $tab_data['count'] > 0 ) : ?>
     467                            <span class="tab-badge"><?php echo esc_html( $tab_data['count'] ); ?></span>
     468                        <?php endif; ?>
    426469                    </a>
    427470                <?php endforeach; ?>
     
    431474                <?php
    432475                switch ( $current_tab ) {
     476                    case 'dashboard':
     477                        $this->render_dashboard_tab();
     478                        break;
    433479                    case 'glossaries':
    434480                        $this->render_glossaries_tab();
     
    445491                }
    446492                ?>
     493            </div>
     494        </div>
     495        <?php
     496    }
     497
     498    /**
     499     * Render dashboard tab with stats and quick actions.
     500     *
     501     * @since 2.3.0
     502     */
     503    private function render_dashboard_tab() {
     504        $glossaries   = $this->options->get( 'glossaries', array() );
     505        $total_terms  = 0;
     506        $active_count = 0;
     507
     508        foreach ( $glossaries as $glossary ) {
     509            $total_terms += azgl()->get_entry_count( absint( $glossary['page_id'] ) );
     510            if ( ! empty( $glossary['active'] ) ) {
     511                ++$active_count;
     512            }
     513        }
     514
     515        // Check if user is new (no glossaries yet).
     516        $is_new_user = empty( $glossaries );
     517        ?>
     518
     519        <?php if ( $is_new_user ) : ?>
     520            <!-- Onboarding Banner for New Users -->
     521            <div class="azgl-onboarding">
     522                <span class="azgl-onboarding-icon">👋</span>
     523                <div class="azgl-onboarding-content">
     524                    <h3><?php esc_html_e( 'Welcome to 3task Glossary!', '3task-glossary' ); ?></h3>
     525                    <p><?php esc_html_e( 'Create your first glossary in just 2 steps: Add a parent page, then create child pages for each term.', '3task-glossary' ); ?></p>
     526                </div>
     527                <a href="<?php echo esc_url( admin_url( 'admin.php?page=az-glossary&tab=glossaries' ) ); ?>" class="azgl-onboarding-btn">
     528                    <span>✨</span>
     529                    <?php esc_html_e( 'Create First Glossary', '3task-glossary' ); ?>
     530                </a>
     531            </div>
     532        <?php endif; ?>
     533
     534        <!-- Stats Grid -->
     535        <div class="azgl-stats-grid">
     536            <div class="azgl-stat-card stat-purple">
     537                <div class="azgl-stat-header">
     538                    <span class="azgl-stat-icon">📚</span>
     539                    <?php if ( count( $glossaries ) > 0 ) : ?>
     540                        <span class="azgl-stat-trend">+<?php echo esc_html( count( $glossaries ) ); ?></span>
     541                    <?php endif; ?>
     542                </div>
     543                <div class="azgl-stat-value"><?php echo esc_html( count( $glossaries ) ); ?></div>
     544                <div class="azgl-stat-label"><?php esc_html_e( 'Glossaries', '3task-glossary' ); ?></div>
     545            </div>
     546
     547            <div class="azgl-stat-card stat-green">
     548                <div class="azgl-stat-header">
     549                    <span class="azgl-stat-icon">📝</span>
     550                    <?php if ( $total_terms > 0 ) : ?>
     551                        <span class="azgl-stat-trend">+<?php echo esc_html( $total_terms ); ?></span>
     552                    <?php endif; ?>
     553                </div>
     554                <div class="azgl-stat-value"><?php echo esc_html( $total_terms ); ?></div>
     555                <div class="azgl-stat-label"><?php esc_html_e( 'Terms', '3task-glossary' ); ?></div>
     556            </div>
     557
     558            <div class="azgl-stat-card stat-blue">
     559                <div class="azgl-stat-header">
     560                    <span class="azgl-stat-icon">✅</span>
     561                </div>
     562                <div class="azgl-stat-value"><?php echo esc_html( $active_count ); ?></div>
     563                <div class="azgl-stat-label"><?php esc_html_e( 'Active', '3task-glossary' ); ?></div>
     564            </div>
     565
     566            <div class="azgl-stat-card stat-orange">
     567                <div class="azgl-stat-header">
     568                    <span class="azgl-stat-icon">🔗</span>
     569                    <span class="azgl-stat-trend trend-neutral"><?php esc_html_e( 'v2.3', '3task-glossary' ); ?></span>
     570                </div>
     571                <div class="azgl-stat-value">—</div>
     572                <div class="azgl-stat-label"><?php esc_html_e( 'Reverse Links', '3task-glossary' ); ?></div>
     573            </div>
     574        </div>
     575
     576        <!-- Content Grid -->
     577        <div class="azgl-content-grid">
     578            <!-- Left Column: Glossary List -->
     579            <div class="azgl-card">
     580                <h2>
     581                    <span class="card-icon">📚</span>
     582                    <?php esc_html_e( 'Your Glossaries', '3task-glossary' ); ?>
     583                </h2>
     584
     585                <?php if ( ! empty( $glossaries ) ) : ?>
     586                    <?php foreach ( array_slice( $glossaries, 0, 5 ) as $glossary ) : ?>
     587                        <?php
     588                        $page_id     = absint( $glossary['page_id'] );
     589                        $page        = get_post( $page_id );
     590                        $entry_count = azgl()->get_entry_count( $page_id );
     591                        $initial     = $page ? strtoupper( substr( $page->post_title, 0, 1 ) ) : '?';
     592                        ?>
     593                        <div class="azgl-glossary-item">
     594                            <div class="azgl-glossary-avatar"><?php echo esc_html( $initial ); ?></div>
     595                            <div class="azgl-glossary-info">
     596                                <h3 class="azgl-glossary-title"><?php echo $page ? esc_html( $page->post_title ) : esc_html__( 'Unknown', '3task-glossary' ); ?></h3>
     597                                <span class="azgl-glossary-meta">
     598                                    <?php if ( ! empty( $glossary['active'] ) ) : ?>
     599                                        ● <?php esc_html_e( 'Active', '3task-glossary' ); ?>
     600                                    <?php else : ?>
     601                                        ○ <?php esc_html_e( 'Inactive', '3task-glossary' ); ?>
     602                                    <?php endif; ?>
     603                                </span>
     604                            </div>
     605                            <div class="azgl-glossary-count"><?php echo esc_html( $entry_count ); ?></div>
     606                        </div>
     607                    <?php endforeach; ?>
     608
     609                    <?php if ( count( $glossaries ) > 5 ) : ?>
     610                        <p style="text-align: center; margin-top: 16px;">
     611                            <a href="<?php echo esc_url( admin_url( 'admin.php?page=az-glossary&tab=glossaries' ) ); ?>">
     612                                <?php
     613                                printf(
     614                                    /* translators: %d: number of additional glossaries */
     615                                    esc_html__( 'View all %d glossaries →', '3task-glossary' ),
     616                                    count( $glossaries )
     617                                );
     618                                ?>
     619                            </a>
     620                        </p>
     621                    <?php endif; ?>
     622                <?php else : ?>
     623                    <p style="color: var(--azgl-text-muted); text-align: center; padding: 40px 0;">
     624                        <?php esc_html_e( 'No glossaries yet. Create your first one!', '3task-glossary' ); ?>
     625                    </p>
     626                <?php endif; ?>
     627            </div>
     628
     629            <!-- Right Column: Quick Actions + Feature Showcase -->
     630            <div>
     631                <!-- Quick Actions -->
     632                <div class="azgl-card">
     633                    <h2>
     634                        <span class="card-icon">⚡</span>
     635                        <?php esc_html_e( 'Quick Actions', '3task-glossary' ); ?>
     636                    </h2>
     637                    <div class="azgl-quick-actions">
     638                        <a href="<?php echo esc_url( admin_url( 'admin.php?page=az-glossary&tab=glossaries' ) ); ?>" class="azgl-quick-action">
     639                            <div class="azgl-quick-action-icon">✨</div>
     640                            <span class="azgl-quick-action-label"><?php esc_html_e( 'Add Glossary', '3task-glossary' ); ?></span>
     641                        </a>
     642                        <a href="<?php echo esc_url( admin_url( 'admin.php?page=az-glossary&tab=design' ) ); ?>" class="azgl-quick-action">
     643                            <div class="azgl-quick-action-icon">🎨</div>
     644                            <span class="azgl-quick-action-label"><?php esc_html_e( 'Customize Design', '3task-glossary' ); ?></span>
     645                        </a>
     646                        <a href="<?php echo esc_url( admin_url( 'admin.php?page=az-glossary&tab=settings' ) ); ?>" class="azgl-quick-action">
     647                            <div class="azgl-quick-action-icon">⚙️</div>
     648                            <span class="azgl-quick-action-label"><?php esc_html_e( 'Settings', '3task-glossary' ); ?></span>
     649                        </a>
     650                        <a href="<?php echo esc_url( admin_url( 'admin.php?page=az-glossary&tab=help' ) ); ?>" class="azgl-quick-action">
     651                            <div class="azgl-quick-action-icon">📖</div>
     652                            <span class="azgl-quick-action-label"><?php esc_html_e( 'Documentation', '3task-glossary' ); ?></span>
     653                        </a>
     654                    </div>
     655                </div>
     656
     657                <!-- Feature Showcase - v2.3 Features -->
     658                <div class="azgl-feature-showcase">
     659                    <div class="azgl-feature-showcase-header">
     660                        <span class="azgl-feature-showcase-badge"><?php esc_html_e( 'v2.3 Features', '3task-glossary' ); ?></span>
     661                    </div>
     662                    <h3><?php esc_html_e( 'Included in Free', '3task-glossary' ); ?></h3>
     663                    <div class="azgl-feature-tags">
     664                        <span class="azgl-feature-tag">
     665                            <span class="tag-icon">🔍</span>
     666                            <?php esc_html_e( 'Schema.org SEO', '3task-glossary' ); ?>
     667                        </span>
     668                        <span class="azgl-feature-tag">
     669                            <span class="tag-icon">🔗</span>
     670                            <?php esc_html_e( 'Reverse Links', '3task-glossary' ); ?>
     671                        </span>
     672                        <span class="azgl-feature-tag">
     673                            <span class="tag-icon">🖨️</span>
     674                            <?php esc_html_e( 'Print Styles', '3task-glossary' ); ?>
     675                        </span>
     676                        <span class="azgl-feature-tag">
     677                            <span class="tag-icon">📦</span>
     678                            <?php esc_html_e( 'Sidebar Widget', '3task-glossary' ); ?>
     679                        </span>
     680                    </div>
     681                </div>
     682            </div>
     683        </div>
     684
     685        <!-- Support & Pro Section -->
     686        <div class="azgl-support-pro-grid">
     687            <!-- Supporter Backlink Card - Psychologically Optimized -->
     688            <div class="azgl-card azgl-supporter-card">
     689                <div class="azgl-supporter-header">
     690                    <img src="<?php echo esc_url( AZGL_PLUGIN_URL . 'assets/images/icon-128x128.png' ); ?>" alt="3task Glossary" class="azgl-supporter-logo">
     691                    <div>
     692                        <h2><?php esc_html_e( 'Become a Supporter', '3task-glossary' ); ?></h2>
     693                        <p class="azgl-supporter-subtitle"><?php esc_html_e( 'Join website owners who give back to open source', '3task-glossary' ); ?></p>
     694                    </div>
     695                </div>
     696
     697                <!-- Reciprocity: Show what they GOT for free -->
     698                <div class="azgl-value-box">
     699                    <div class="azgl-value-header">
     700                        <span class="azgl-value-icon">🎁</span>
     701                        <span class="azgl-value-title"><?php esc_html_e( 'What you get for FREE:', '3task-glossary' ); ?></span>
     702                    </div>
     703                    <div class="azgl-value-items">
     704                        <span class="azgl-value-item">✓ <?php esc_html_e( 'Unlimited Glossaries', '3task-glossary' ); ?></span>
     705                        <span class="azgl-value-item">✓ <?php esc_html_e( 'Schema.org SEO', '3task-glossary' ); ?></span>
     706                        <span class="azgl-value-item">✓ <?php esc_html_e( 'Sidebar Widget', '3task-glossary' ); ?></span>
     707                        <span class="azgl-value-item">✓ <?php esc_html_e( '6 Color Themes', '3task-glossary' ); ?></span>
     708                        <span class="azgl-value-item">✓ <?php esc_html_e( 'Dark Mode', '3task-glossary' ); ?></span>
     709                    </div>
     710                    <p class="azgl-value-worth"><?php esc_html_e( 'Worth $99+ — yours free, forever.', '3task-glossary' ); ?></p>
     711                </div>
     712
     713                <!-- The Ask - Framed as giving back -->
     714                <div class="azgl-give-back">
     715                    <p class="azgl-give-back-text">
     716                        <strong><?php esc_html_e( 'Give back with one click:', '3task-glossary' ); ?></strong>
     717                        <?php esc_html_e( 'Add a tiny "Powered by" link to help others discover this plugin.', '3task-glossary' ); ?>
     718                    </p>
     719
     720                    <form method="post" class="azgl-supporter-form">
     721                        <?php wp_nonce_field( 'azgl_admin_action', 'azgl_nonce' ); ?>
     722                        <input type="hidden" name="azgl_action" value="save_supporter">
     723
     724                        <label class="azgl-supporter-toggle">
     725                            <input type="checkbox" name="show_credit_link" value="1" <?php checked( $this->options->get( 'show_credit_link', false ) ); ?>>
     726                            <span class="azgl-toggle-slider"></span>
     727                            <span class="azgl-toggle-label">
     728                                <?php if ( $this->options->get( 'show_credit_link', false ) ) : ?>
     729                                    <span class="azgl-supporter-badge">🏆 <?php esc_html_e( 'Supporter', '3task-glossary' ); ?></span>
     730                                <?php else : ?>
     731                                    <?php esc_html_e( 'Yes, I want to support!', '3task-glossary' ); ?>
     732                                <?php endif; ?>
     733                            </span>
     734                        </label>
     735
     736                        <div class="azgl-supporter-preview">
     737                            <span class="azgl-preview-label"><?php esc_html_e( 'Appears as:', '3task-glossary' ); ?></span>
     738                            <span class="azgl-preview-link">Powered by <a href="#">3task Glossary</a></span>
     739                        </div>
     740
     741                        <button type="submit" class="button button-primary azgl-supporter-btn-save">
     742                            <?php
     743                            if ( $this->options->get( 'show_credit_link', false ) ) {
     744                                esc_html_e( '✓ You\'re a Supporter!', '3task-glossary' );
     745                            } else {
     746                                esc_html_e( 'Become a Supporter', '3task-glossary' );
     747                            }
     748                            ?>
     749                        </button>
     750                    </form>
     751                </div>
     752
     753                <!-- Social Proof + Alternatives -->
     754                <div class="azgl-supporter-footer">
     755                    <div class="azgl-supporter-alternatives">
     756                        <span><?php esc_html_e( 'Other ways to help:', '3task-glossary' ); ?></span>
     757                        <a href="https://wordpress.org/support/plugin/3task-glossary/reviews/#new-post" target="_blank" class="azgl-alt-action">
     758                            <span>⭐</span> <?php esc_html_e( '5-Star Review', '3task-glossary' ); ?>
     759                        </a>
     760                        <a href="https://wordpress.org/support/plugin/3task-glossary/" target="_blank" class="azgl-alt-action">
     761                            <span>💬</span> <?php esc_html_e( 'Answer Questions', '3task-glossary' ); ?>
     762                        </a>
     763                    </div>
     764                </div>
     765            </div>
     766
     767            <!-- Go Pro Card -->
     768            <div class="azgl-card azgl-pro-card">
     769                <div class="azgl-pro-badge"><?php esc_html_e( 'PRO', '3task-glossary' ); ?></div>
     770                <h2><?php esc_html_e( 'Unlock More Power', '3task-glossary' ); ?></h2>
     771                <p class="azgl-pro-subtitle"><?php esc_html_e( 'Take your glossary to the next level', '3task-glossary' ); ?></p>
     772
     773                <ul class="azgl-pro-features">
     774                    <li><span class="pro-check">✓</span> <?php esc_html_e( 'Site-wide Auto-Linking', '3task-glossary' ); ?></li>
     775                    <li><span class="pro-check">✓</span> <?php esc_html_e( 'Hover Tooltips', '3task-glossary' ); ?></li>
     776                    <li><span class="pro-check">✓</span> <?php esc_html_e( 'Search Function', '3task-glossary' ); ?></li>
     777                    <li><span class="pro-check">✓</span> <?php esc_html_e( 'CSV Import/Export', '3task-glossary' ); ?></li>
     778                    <li><span class="pro-check">✓</span> <?php esc_html_e( 'View Statistics', '3task-glossary' ); ?></li>
     779                    <li><span class="pro-check">✓</span> <?php esc_html_e( 'Priority Support', '3task-glossary' ); ?></li>
     780                </ul>
     781
     782                <a href="<?php echo esc_url( azgl()->get_upgrade_url() ); ?>" target="_blank" class="azgl-pro-btn">
     783                    <?php esc_html_e( 'Learn More About Pro', '3task-glossary' ); ?>
     784                    <span>→</span>
     785                </a>
    447786            </div>
    448787        </div>
     
    592931        $plugin_language = $this->options->get( 'plugin_language', 'auto' );
    593932        $languages       = $this->options->get_available_languages();
     933        // v2.3.0 Advanced Features.
     934        $enable_schema = $this->options->get( 'enable_schema', true );
     935        $enable_print  = $this->options->get( 'enable_print', true );
    594936        ?>
    595937        <div class="azgl-card">
     
    7041046                            <p class="description">
    7051047                                <?php esc_html_e( 'Caches glossary entries for 1 hour. Disable for testing.', '3task-glossary' ); ?>
     1048                            </p>
     1049                        </td>
     1050                    </tr>
     1051                </table>
     1052
     1053                <h2>
     1054                    <?php esc_html_e( 'Advanced Features', '3task-glossary' ); ?>
     1055                    <span class="azgl-feature-showcase-badge" style="font-size: 10px; font-weight: 700; padding: 4px 10px; border-radius: 100px; background: linear-gradient(135deg, #6366f1, #d946ef); color: #fff; text-transform: uppercase; letter-spacing: 0.5px; margin-left: 10px; vertical-align: middle;"><?php esc_html_e( 'NEW in v2.3', '3task-glossary' ); ?></span>
     1056                </h2>
     1057
     1058                <table class="form-table">
     1059                    <tr>
     1060                        <th scope="row">
     1061                            <?php esc_html_e( 'Schema.org SEO', '3task-glossary' ); ?>
     1062                        </th>
     1063                        <td>
     1064                            <label>
     1065                                <input type="checkbox" name="enable_schema" value="1" <?php checked( $enable_schema ); ?>>
     1066                                <?php esc_html_e( 'Add DefinedTerm schema markup to glossary entries', '3task-glossary' ); ?>
     1067                            </label>
     1068                            <p class="description">
     1069                                <?php esc_html_e( 'Helps Google understand your glossary terms. Can improve search visibility and enable rich results.', '3task-glossary' ); ?>
     1070                            </p>
     1071                        </td>
     1072                    </tr>
     1073                    <tr>
     1074                        <th scope="row">
     1075                            <?php esc_html_e( 'Print Button', '3task-glossary' ); ?>
     1076                        </th>
     1077                        <td>
     1078                            <label>
     1079                                <input type="checkbox" name="enable_print" value="1" <?php checked( $enable_print ); ?>>
     1080                                <?php esc_html_e( 'Show "Print Glossary" button on glossary pages', '3task-glossary' ); ?>
     1081                            </label>
     1082                            <p class="description">
     1083                                <?php esc_html_e( 'Allows visitors to print a clean, formatted version of your glossary. Great for educational use.', '3task-glossary' ); ?>
    7061084                            </p>
    7071085                        </td>
     
    8961274                    <li>
    8971275                        <strong><?php esc_html_e( 'Register as glossary:', '3task-glossary' ); ?></strong>
    898                         <?php esc_html_e( 'Go to SEO Glossary → Glossaries and select your page.', '3task-glossary' ); ?>
     1276                        <?php esc_html_e( 'Go to 3task Glossary → Glossaries and select your page.', '3task-glossary' ); ?>
    8991277                    </li>
    9001278                    <li>
     
    9851363            </table>
    9861364        </div>
     1365
     1366        <div class="azgl-card azgl-help-pro-card">
     1367            <h2>
     1368                <span style="background: linear-gradient(135deg, var(--azgl-gradient-start), var(--azgl-gradient-end)); color: #fff; padding: 4px 12px; border-radius: 100px; font-size: 12px; margin-right: 10px;">PRO</span>
     1369                <?php esc_html_e( 'Need More Features?', '3task-glossary' ); ?>
     1370            </h2>
     1371
     1372            <p><?php esc_html_e( '3task Glossary Pro unlocks powerful features for professional glossaries:', '3task-glossary' ); ?></p>
     1373
     1374            <div class="azgl-help-pro-grid">
     1375                <div class="azgl-help-pro-feature">
     1376                    <span class="azgl-help-pro-icon">🔗</span>
     1377                    <div>
     1378                        <strong><?php esc_html_e( 'Site-Wide Auto-Linking', '3task-glossary' ); ?></strong>
     1379                        <p><?php esc_html_e( 'Automatically link glossary terms in all your posts and pages.', '3task-glossary' ); ?></p>
     1380                    </div>
     1381                </div>
     1382                <div class="azgl-help-pro-feature">
     1383                    <span class="azgl-help-pro-icon">💬</span>
     1384                    <div>
     1385                        <strong><?php esc_html_e( 'Hover Tooltips', '3task-glossary' ); ?></strong>
     1386                        <p><?php esc_html_e( 'Show term definitions on hover without leaving the page.', '3task-glossary' ); ?></p>
     1387                    </div>
     1388                </div>
     1389                <div class="azgl-help-pro-feature">
     1390                    <span class="azgl-help-pro-icon">🔍</span>
     1391                    <div>
     1392                        <strong><?php esc_html_e( 'Search Function', '3task-glossary' ); ?></strong>
     1393                        <p><?php esc_html_e( 'Let visitors search within your glossary instantly.', '3task-glossary' ); ?></p>
     1394                    </div>
     1395                </div>
     1396                <div class="azgl-help-pro-feature">
     1397                    <span class="azgl-help-pro-icon">📊</span>
     1398                    <div>
     1399                        <strong><?php esc_html_e( 'Statistics & CSV', '3task-glossary' ); ?></strong>
     1400                        <p><?php esc_html_e( 'View analytics and import/export via CSV.', '3task-glossary' ); ?></p>
     1401                    </div>
     1402                </div>
     1403            </div>
     1404
     1405            <a href="<?php echo esc_url( azgl()->get_upgrade_url() ); ?>" target="_blank" class="azgl-pro-btn" style="margin-top: 20px;">
     1406                <?php esc_html_e( 'Learn More About Pro', '3task-glossary' ); ?>
     1407                <span>→</span>
     1408            </a>
     1409        </div>
    9871410        <?php
    9881411    }
  • 3task-glossary/trunk/includes/class-frontend.php

    r3453804 r3454651  
    4444        add_filter( 'the_content', array( $this, 'process_content' ), 15 );
    4545        add_action( 'wp_enqueue_scripts', array( $this, 'enqueue_assets' ) );
     46        add_action( 'wp_head', array( $this, 'output_schema_markup' ) );
     47    }
     48
     49    /**
     50     * Output Schema.org DefinedTerm markup for glossary entries.
     51     *
     52     * @since 2.3.0
     53     */
     54    public function output_schema_markup() {
     55        if ( ! is_singular( 'page' ) ) {
     56            return;
     57        }
     58
     59        // Check if schema is enabled.
     60        if ( ! $this->options->get( 'enable_schema', true ) ) {
     61            return;
     62        }
     63
     64        global $post;
     65        if ( ! $post || ! $post->post_parent ) {
     66            return;
     67        }
     68
     69        // Check if this is a glossary entry (child of glossary page).
     70        $parent_glossary = $this->options->get_glossary( $post->post_parent );
     71        if ( ! $parent_glossary || empty( $parent_glossary['active'] ) ) {
     72            return;
     73        }
     74
     75        $parent_page = get_post( $post->post_parent );
     76        $description = get_the_excerpt( $post );
     77        if ( empty( $description ) ) {
     78            $description = wp_trim_words( wp_strip_all_tags( $post->post_content ), 30, '...' );
     79        }
     80
     81        $schema = array(
     82            '@context'         => 'https://schema.org',
     83            '@type'            => 'DefinedTerm',
     84            'name'             => get_the_title( $post ),
     85            'description'      => $description,
     86            'url'              => get_permalink( $post ),
     87            'inDefinedTermSet' => array(
     88                '@type' => 'DefinedTermSet',
     89                'name'  => $parent_page ? $parent_page->post_title : '',
     90                'url'   => $parent_page ? get_permalink( $parent_page ) : '',
     91            ),
     92        );
     93
     94        echo '<script type="application/ld+json">' . wp_json_encode( $schema, JSON_UNESCAPED_SLASHES | JSON_UNESCAPED_UNICODE ) . '</script>' . "\n";
    4695    }
    4796
     
    81130        $inline_css = $this->get_color_scheme_css( $color_scheme, $dark_mode );
    82131        wp_add_inline_style( 'azgl-frontend', $inline_css );
     132
     133        // Load frontend JS for Print functionality (v2.3.0).
     134        if ( $is_glossary ) {
     135            wp_enqueue_script(
     136                'azgl-frontend',
     137                AZGL_PLUGIN_URL . 'assets/js/frontend.js',
     138                array(),
     139                AZGL_VERSION,
     140                true
     141            );
     142        }
    83143    }
    84144
     
    178238        $output .= '</div>';
    179239
     240        // Action buttons (Print) - only if enabled.
     241        if ( $this->options->get( 'enable_print', true ) ) {
     242            $output .= '<div class="azgl-action-buttons">';
     243            $output .= '<button type="button" class="azgl-print-btn">';
     244            $output .= '<span class="btn-icon">🖨️</span>';
     245            $output .= esc_html__( 'Print Glossary', '3task-glossary' );
     246            $output .= '</button>';
     247            $output .= '</div>';
     248        }
     249
    180250        // Credit link (only if supporter mode enabled).
    181251        $output .= $this->render_credit_link();
     
    193263     */
    194264    private function render_entry_page( $glossary_id, $glossary, $content ) {
     265        global $post;
    195266        $output = '';
    196267
     
    205276        }
    206277
    207         return $output . $content;
     278        $after_content = '';
     279
     280        // Reverse Links (v2.3.0).
     281        $after_content .= $this->render_reverse_links( $post->ID );
     282
     283        return $output . $content . $after_content;
     284    }
     285
     286    /**
     287     * Render reverse links section showing posts that link to this term.
     288     *
     289     * @since 2.3.0
     290     * @param int $post_id Post ID.
     291     * @return string HTML.
     292     */
     293    private function render_reverse_links( $post_id ) {
     294        global $wpdb;
     295
     296        $post_url = get_permalink( $post_id );
     297        $post_url_relative = wp_parse_url( $post_url, PHP_URL_PATH );
     298
     299        // Search for posts that contain a link to this term.
     300        // phpcs:ignore WordPress.DB.DirectDatabaseQuery.DirectQuery, WordPress.DB.DirectDatabaseQuery.NoCaching -- Performance optimized query.
     301        $results = $wpdb->get_results(
     302            $wpdb->prepare(
     303                "SELECT ID, post_title, post_type FROM {$wpdb->posts}
     304                WHERE post_status = 'publish'
     305                AND post_type IN ('post', 'page')
     306                AND ID != %d
     307                AND (post_content LIKE %s OR post_content LIKE %s)
     308                LIMIT 10",
     309                $post_id,
     310                '%' . $wpdb->esc_like( $post_url ) . '%',
     311                '%' . $wpdb->esc_like( $post_url_relative ) . '%'
     312            )
     313        );
     314
     315        if ( empty( $results ) ) {
     316            return '';
     317        }
     318
     319        $output  = '<div class="azgl-reverse-links">';
     320        $output .= '<h4><span>🔗</span> ' . esc_html__( 'This term is mentioned in:', '3task-glossary' ) . '</h4>';
     321        $output .= '<ul>';
     322
     323        foreach ( $results as $result ) {
     324            $type_label = 'page' === $result->post_type ? __( 'Page', '3task-glossary' ) : __( 'Post', '3task-glossary' );
     325            $output    .= '<li>';
     326            $output    .= '<a href="' . esc_url( get_permalink( $result->ID ) ) . '">' . esc_html( $result->post_title ) . '</a>';
     327            $output    .= '<span class="post-type">' . esc_html( $type_label ) . '</span>';
     328            $output    .= '</li>';
     329        }
     330
     331        $output .= '</ul>';
     332        $output .= '</div>';
     333
     334        return $output;
    208335    }
    209336
     
    378505        }
    379506
    380         $credit_url = $this->options->get( 'credit_link_url', 'https://watchguide.net' );
     507        $credit_url = $this->options->get( 'credit_link_url', 'https://www.3task.de' );
    381508
    382509        return '<p class="azgl-credit">' .
    383510               '<small>' . esc_html__( 'Glossary by', '3task-glossary' ) . ' ' .
    384                '<a href="' . esc_url( $credit_url ) . '" target="_blank" rel="noopener">WatchGuide</a>' .
     511               '<a href="' . esc_url( $credit_url ) . '" target="_blank" rel="noopener">3task</a>' .
    385512               '</small></p>';
    386513    }
  • 3task-glossary/trunk/includes/class-options.php

    r3453804 r3454651  
    6060        // Supporter mode.
    6161        'show_credit_link' => false,
    62         'credit_link_url'  => 'https://watchguide.net',
     62        'credit_link_url'  => 'https://www.3task.de',
    6363
    6464        // Language setting.
  • 3task-glossary/trunk/readme.txt

    r3453804 r3454651  
    44Requires at least: 5.8
    55Tested up to: 6.9
    6 Stable tag: 2.2.0
     6Stable tag: 2.3.0
    77Requires PHP: 7.4
    88License: GPLv2 or later
     
    4545Upgrade to **3task Glossary Pro** for advanced features:
    4646
    47 * **6 Color Schemes** - Emerald, Ocean, Sunset, Berry, Slate, Auto + Custom colors
    48 * **3 Navigation Styles** - Buttons, Pills, Minimal + Custom CSS
    49 * **Site-Wide Auto-Linking** - Link glossary terms across your entire website
    50 * **Tooltips** - Show term definitions on hover without leaving the page
    51 * **Search Function** - Let visitors search within your glossary
    52 * **Import/Export** - Bulk create entries via CSV, backup your glossary data
    53 * **Statistics** - See which terms are most viewed
    54 * **Shortcodes** - Embed glossary anywhere with shortcodes
    55 * **Priority Support** - 24-hour response time
    56 
    57 [Upgrade to Pro](https://www.3task.de/3task-glossary-pro/)
     47**🚀 SITE-WIDE AUTO-LINKING (SEO Power Feature!)**
     48The #1 reason to upgrade: Automatically link glossary terms across your ENTIRE website - not just on glossary pages! Every blog post, every page, every custom post type. One glossary term mentioned? Automatic link. Massive internal linking boost for SEO.
     49
     50* **Site-Wide Auto-Linking** - Link glossary terms across ALL posts and pages automatically
     51* **5 Tooltip Themes** - Show definitions on hover (Light, Dark, Gradient, Minimal, Bordered)
     52* **AJAX Live Search** - Visitors find terms instantly while typing
     53* **AI Definition Generator** - Generate definitions with OpenAI, Claude or Gemini (BYOK)
     54* **Synonyms** - Link multiple terms (AI, KI, Artificial Intelligence) to one entry
     55* **CSV Import/Export** - Bulk create hundreds of entries, backup your glossary
     56* **6 Color Schemes** - Emerald, Ocean, Sunset, Berry, Slate + Custom colors
     57* **Schema.org SEO** - DefinedTermSet markup for better search visibility
     58* **Priority Support** - Email support with fast response
     59
     60[Upgrade to Pro](https://www.3task.de/wordpress-plugins/3task-glossary-pro/)
    5861
    5962== Installation ==
     
    77801. Create a WordPress page (e.g., "Glossary")
    78812. Create child pages under it for each entry
    79 3. Go to **SEO Glossary** in admin menu
     823. Go to **3task Glossary** in admin menu
    80834. Add your page as a glossary
    81845. Visit your glossary page to see the A-Z navigation
     
    87901. Create a regular WordPress page (this will be your glossary index)
    88912. Create child pages under it (each child page is an entry)
    89 3. Go to SEO Glossary menu and add your page as a glossary
     923. Go to 3task Glossary menu and add your page as a glossary
    90934. That's it! Your page now shows A-Z navigation and links to all child pages.
    9194
     
    104107= How does auto-linking work? =
    105108
    106 When enabled, the plugin automatically links glossary terms within your glossary pages. Links only appear on glossary pages and their entries (selective mode).
     109**Free version:** Automatically links glossary terms within your glossary pages only.
     110
     111**Pro version:** Site-Wide Auto-Linking! Automatically links glossary terms across your ENTIRE website - every blog post, every page. Huge SEO benefit through internal linking. This is the #1 reason users upgrade to Pro.
    107112
    108113= Is it SEO-friendly? =
     
    128133
    129134== Changelog ==
     135
     136= 2.3.0 =
     137* New: Completely redesigned admin interface with 3task Plugin Design System v1.0
     138* New: Dashboard tab with stats overview (glossaries, terms, active count)
     139* New: Animated gradient header with glassmorphism effects
     140* New: Tab navigation with icons and animated underline
     141* New: Quick Actions grid for faster navigation
     142* New: Schema.org DefinedTerm markup for better SEO (can be disabled in Settings)
     143* New: Sidebar widget with A-Z navigation, recent terms, or popular terms display
     144* New: Reverse Links showing which posts/pages mention a glossary term
     145* New: Print stylesheet for clean A4 printing of glossary pages
     146* New: Onboarding banner for new users
     147* Improved: DSGVO-compliant design (no Google Fonts, uses System Font Stack)
     148* Improved: Responsive layout for all screen sizes
     149
     150= 2.2.1 =
     151* Fixed: Consistent branding - renamed all "SEO Glossary" labels to "3task Glossary" in admin menu and UI
    130152
    131153= 2.2.0 =
     
    157179== Upgrade Notice ==
    158180
     181= 2.3.0 =
     182Major update! New admin dashboard, Schema.org SEO, sidebar widget, reverse links, print styles. Fully DSGVO-compliant.
     183
    159184= 2.2.0 =
    160185Accessibility improvement: Inactive letters now work properly with screen readers. Choose from 4 display modes in Design settings.
Note: See TracChangeset for help on using the changeset viewer.