Changeset 3454651
- Timestamp:
- 02/05/2026 01:12:54 PM (2 weeks ago)
- Location:
- 3task-glossary/trunk
- Files:
-
- 7 edited
-
3task-glossary.php (modified) (7 diffs)
-
assets/css/admin.css (modified) (22 diffs)
-
assets/css/frontend.css (modified) (2 diffs)
-
includes/class-admin.php (modified) (11 diffs)
-
includes/class-frontend.php (modified) (6 diffs)
-
includes/class-options.php (modified) (1 diff)
-
readme.txt (modified) (7 diffs)
Legend:
- Unmodified
- Added
- Removed
-
3task-glossary/trunk/3task-glossary.php
r3453804 r3454651 4 4 * Plugin URI: https://wordpress.org/plugins/3task-glossary/ 5 5 * Description: Create glossaries, dictionaries & knowledge bases using WordPress pages. A-Z navigation, auto-linking, dark mode. No database, just pages. 6 * Version: 2. 2.06 * Version: 2.3.0 7 7 * Requires at least: 5.8 8 8 * Requires PHP: 7.4 … … 15 15 * 16 16 * @package 3Task_Glossary 17 * @version 2. 2.017 * @version 2.3.0 18 18 */ 19 19 … … 36 36 // Plugin constants (with defined checks for safety). 37 37 if ( ! defined( 'AZGL_VERSION' ) ) { 38 define( 'AZGL_VERSION', '2. 2.0' );38 define( 'AZGL_VERSION', '2.3.0' ); 39 39 } 40 40 if ( ! defined( 'AZGL_PLUGIN_FILE' ) ) { … … 177 177 'includes/class-frontend.php', 178 178 'includes/class-linker.php', 179 'includes/class-widget.php', 179 180 ); 180 181 … … 214 215 deactivate_plugins( AZGL_PLUGIN_BASENAME ); 215 216 wp_die( 216 esc_html__( ' Simple SEOGlossary requires PHP 7.4 or higher.', '3task-glossary' ),217 esc_html__( '3task Glossary requires PHP 7.4 or higher.', '3task-glossary' ), 217 218 'Plugin Activation Error', 218 219 array( 'back_link' => true ) … … 224 225 deactivate_plugins( AZGL_PLUGIN_BASENAME ); 225 226 wp_die( 226 esc_html__( ' Simple SEOGlossary requires WordPress 5.8 or higher.', '3task-glossary' ),227 esc_html__( '3task Glossary requires WordPress 5.8 or higher.', '3task-glossary' ), 227 228 'Plugin Activation Error', 228 229 array( 'back_link' => true ) … … 243 244 'dark_mode' => 'auto', 244 245 'show_credit_link' => false, 245 'credit_link_url' => 'https://w atchguide.net',246 'credit_link_url' => 'https://www.3task.de', 246 247 ); 247 248 add_option( 'azgl_options', $defaults ); -
3task-glossary/trunk/assets/css/admin.css
r3447608 r3454651 1 1 /** 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 4 5 * 5 6 * @package 3Task_Glossary 6 * @since 2. 0.07 * @since 2.3.0 7 8 */ 8 9 9 10 /* ========================================================================== 10 CSS VARIABLES 11 CSS VARIABLES - 3task Design System v1.0 11 12 ========================================================================== */ 12 13 13 14 :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; 19 28 --azgl-accent: #f59e0b; 29 --azgl-accent-pink: #ec4899; 30 --azgl-accent-cyan: #06b6d4; 20 31 --azgl-danger: #ef4444; 21 --azgl-success: #22c55e; 22 32 --azgl-success: #10b981; 33 34 /* Neutrals */ 23 35 --azgl-bg: #f8fafc; 24 36 --azgl-card-bg: #ffffff; 37 --azgl-bg-tertiary: #f1f5f9; 25 38 --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; 28 42 --azgl-text-light: #94a3b8; 29 43 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; 36 53 --azgl-radius: 12px; 37 54 --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); 42 61 } 43 62 … … 108 127 109 128 /* ========================================================================== 110 HEADER - Hero Style129 HEADER - Animated Gradient Hero (3task Design System v1.0) 111 130 ========================================================================== */ 112 131 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 */ 113 300 .azgl-admin-title { 114 301 display: flex; … … 120 307 margin-bottom: 24px; 121 308 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)); 123 310 border-radius: var(--azgl-radius-xl); 124 border: 1px solid var(--azgl-primary-light);311 border: none; 125 312 box-shadow: var(--azgl-shadow-lg); 126 313 position: relative; … … 135 322 width: 200px; 136 323 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%); 138 325 pointer-events: none; 139 326 } … … 144 331 height: 36px; 145 332 color: #fff; 146 background: linear-gradient(135deg, var(--azgl-primary) 0%, var(--azgl-primary-hover) 100%);333 background: rgba(255, 255, 255, 0.2); 147 334 padding: 12px; 148 335 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); 168 337 } 169 338 170 339 /* ========================================================================== 171 TABS NAVIGATION - Modern Pills340 TABS NAVIGATION - 3task Design System v1.0 172 341 ========================================================================== */ 173 342 … … 177 346 border-bottom: none; 178 347 border-radius: var(--azgl-radius-lg) var(--azgl-radius-lg) 0 0; 179 padding: 16px 20px 0 20px;348 padding: 8px 16px 0 16px; 180 349 margin-bottom: 0; 181 350 display: flex; 182 gap: 8px;351 gap: 4px; 183 352 overflow-x: auto; 184 353 scrollbar-width: none; … … 192 361 border: none; 193 362 background: transparent; 194 padding: 1 2px 20px;363 padding: 14px 22px; 195 364 margin: 0 0 -1px 0; 196 365 font-size: 13px; … … 201 370 white-space: nowrap; 202 371 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); 203 381 } 204 382 … … 210 388 width: 0; 211 389 height: 3px; 212 background: var(--azgl-primary);390 background: linear-gradient(90deg, var(--azgl-gradient-start), var(--azgl-gradient-end)); 213 391 border-radius: 3px 3px 0 0; 214 392 transition: var(--azgl-transition); … … 217 395 218 396 .azgl-tabs .nav-tab:hover { 219 background: var(--azgl-bg );397 background: var(--azgl-bg-tertiary); 220 398 color: var(--azgl-primary); 399 } 400 401 .azgl-tabs .nav-tab:hover .tab-icon { 402 transform: scale(1.15); 221 403 } 222 404 … … 229 411 .azgl-tabs .nav-tab-active:focus { 230 412 border: none; 231 background: linear-gradient(180deg, #f0fdf40%, #ffffff 100%);413 background: linear-gradient(180deg, var(--azgl-primary-light) 0%, #ffffff 100%); 232 414 color: var(--azgl-primary); 233 415 font-weight: 600; … … 235 417 } 236 418 419 .azgl-tabs .nav-tab-active .tab-icon { 420 transform: scale(1.1); 421 } 422 237 423 .azgl-tabs .nav-tab-active::after, 238 424 .azgl-tabs .nav-tab-active:hover::after { 239 425 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); 241 452 } 242 453 … … 256 467 257 468 /* ========================================================================== 258 CARDS - Glassmorphism Style469 CARDS - 3task Design System v1.0 259 470 ========================================================================== */ 260 471 … … 266 477 margin-bottom: 24px; 267 478 box-shadow: var(--azgl-shadow); 268 transition: var(--azgl-transition -slow);479 transition: var(--azgl-transition); 269 480 position: relative; 270 481 overflow: hidden; … … 283 494 right: 0; 284 495 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)); 286 497 opacity: 0; 287 498 transition: var(--azgl-transition); … … 296 507 padding-bottom: 16px; 297 508 border-bottom: 2px solid var(--azgl-bg); 298 font-size: 1 8px;509 font-size: 17px; 299 510 font-weight: 700; 300 511 color: var(--azgl-text); … … 311 522 } 312 523 524 .azgl-card h2 .card-icon { 525 font-size: 20px; 526 } 527 313 528 .azgl-card h3 { 314 529 margin: 24px 0 16px 0; … … 323 538 324 539 .azgl-limits-info { 325 background: linear-gradient(135deg, #ecfdf5 0%, #d1fae5100%);326 border: 1px solid # a7f3d0;540 background: linear-gradient(135deg, var(--azgl-primary-light) 0%, #e0e7ff 100%); 541 border: 1px solid #c7d2fe; 327 542 border-radius: var(--azgl-radius); 328 543 padding: 18px 24px; … … 348 563 349 564 .azgl-limits-info a { 350 color: var(--azgl-primary -hover);565 color: var(--azgl-primary); 351 566 font-weight: 600; 352 567 text-decoration: none; … … 400 615 401 616 .azgl-glossaries-table tbody tr:hover { 402 background: linear-gradient(90deg, #f0fdf40%, transparent 100%);617 background: linear-gradient(90deg, var(--azgl-primary-light) 0%, transparent 100%); 403 618 } 404 619 … … 451 666 452 667 .azgl-status-active { 453 background: linear-gradient(135deg, #d 1fae5 0%, #a7f3d0 100%);454 color: var(--azgl-primary-dark);668 background: linear-gradient(135deg, #dcfce7 0%, #bbf7d0 100%); 669 color: #166534; 455 670 } 456 671 … … 2237 2452 } 2238 2453 } 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 1 1 /** 2 * 3task Glossary - Frontend Styles v2. 1.03 * 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 4 4 * 5 5 * @package 3Task_Glossary … … 493 493 } 494 494 } 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 61 61 public function add_admin_menu() { 62 62 add_menu_page( 63 __( ' SEOGlossary', '3task-glossary' ),64 __( ' SEOGlossary', '3task-glossary' ),63 __( '3task Glossary', '3task-glossary' ), 64 __( '3task Glossary', '3task-glossary' ), 65 65 'manage_options', 66 66 'az-glossary', … … 236 236 'link_class' => isset( $_POST['link_class'] ) ? sanitize_html_class( wp_unslash( $_POST['link_class'] ) ) : 'glossary-term', 237 237 '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'] ), 238 241 ); 239 242 // phpcs:enable WordPress.Security.NonceVerification.Missing … … 384 387 */ 385 388 public function render_admin_page() { 389 // Tab configuration with icons (Unicode emojis for DSGVO compliance). 386 390 $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 ), 391 412 ); 392 413 393 414 // Get current tab. 394 415 // 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'; 396 417 if ( ! array_key_exists( $current_tab, $tabs ) ) { 397 $current_tab = ' glossaries';418 $current_tab = 'dashboard'; 398 419 } 399 420 … … 405 426 ?> 406 427 <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> 412 451 </div> 413 452 </div> … … 420 459 421 460 <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 ) : ?> 423 462 <a href="<?php echo esc_url( admin_url( 'admin.php?page=az-glossary&tab=' . $tab_id ) ); ?>" 424 463 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; ?> 426 469 </a> 427 470 <?php endforeach; ?> … … 431 474 <?php 432 475 switch ( $current_tab ) { 476 case 'dashboard': 477 $this->render_dashboard_tab(); 478 break; 433 479 case 'glossaries': 434 480 $this->render_glossaries_tab(); … … 445 491 } 446 492 ?> 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> 447 786 </div> 448 787 </div> … … 592 931 $plugin_language = $this->options->get( 'plugin_language', 'auto' ); 593 932 $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 ); 594 936 ?> 595 937 <div class="azgl-card"> … … 704 1046 <p class="description"> 705 1047 <?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' ); ?> 706 1084 </p> 707 1085 </td> … … 896 1274 <li> 897 1275 <strong><?php esc_html_e( 'Register as glossary:', '3task-glossary' ); ?></strong> 898 <?php esc_html_e( 'Go to SEOGlossary → Glossaries and select your page.', '3task-glossary' ); ?>1276 <?php esc_html_e( 'Go to 3task Glossary → Glossaries and select your page.', '3task-glossary' ); ?> 899 1277 </li> 900 1278 <li> … … 985 1363 </table> 986 1364 </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> 987 1410 <?php 988 1411 } -
3task-glossary/trunk/includes/class-frontend.php
r3453804 r3454651 44 44 add_filter( 'the_content', array( $this, 'process_content' ), 15 ); 45 45 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"; 46 95 } 47 96 … … 81 130 $inline_css = $this->get_color_scheme_css( $color_scheme, $dark_mode ); 82 131 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 } 83 143 } 84 144 … … 178 238 $output .= '</div>'; 179 239 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 180 250 // Credit link (only if supporter mode enabled). 181 251 $output .= $this->render_credit_link(); … … 193 263 */ 194 264 private function render_entry_page( $glossary_id, $glossary, $content ) { 265 global $post; 195 266 $output = ''; 196 267 … … 205 276 } 206 277 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; 208 335 } 209 336 … … 378 505 } 379 506 380 $credit_url = $this->options->get( 'credit_link_url', 'https://w atchguide.net' );507 $credit_url = $this->options->get( 'credit_link_url', 'https://www.3task.de' ); 381 508 382 509 return '<p class="azgl-credit">' . 383 510 '<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>' . 385 512 '</small></p>'; 386 513 } -
3task-glossary/trunk/includes/class-options.php
r3453804 r3454651 60 60 // Supporter mode. 61 61 'show_credit_link' => false, 62 'credit_link_url' => 'https://w atchguide.net',62 'credit_link_url' => 'https://www.3task.de', 63 63 64 64 // Language setting. -
3task-glossary/trunk/readme.txt
r3453804 r3454651 4 4 Requires at least: 5.8 5 5 Tested up to: 6.9 6 Stable tag: 2. 2.06 Stable tag: 2.3.0 7 7 Requires PHP: 7.4 8 8 License: GPLv2 or later … … 45 45 Upgrade to **3task Glossary Pro** for advanced features: 46 46 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!)** 48 The #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/) 58 61 59 62 == Installation == … … 77 80 1. Create a WordPress page (e.g., "Glossary") 78 81 2. Create child pages under it for each entry 79 3. Go to ** SEOGlossary** in admin menu82 3. Go to **3task Glossary** in admin menu 80 83 4. Add your page as a glossary 81 84 5. Visit your glossary page to see the A-Z navigation … … 87 90 1. Create a regular WordPress page (this will be your glossary index) 88 91 2. Create child pages under it (each child page is an entry) 89 3. Go to SEOGlossary menu and add your page as a glossary92 3. Go to 3task Glossary menu and add your page as a glossary 90 93 4. That's it! Your page now shows A-Z navigation and links to all child pages. 91 94 … … 104 107 = How does auto-linking work? = 105 108 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. 107 112 108 113 = Is it SEO-friendly? = … … 128 133 129 134 == 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 130 152 131 153 = 2.2.0 = … … 157 179 == Upgrade Notice == 158 180 181 = 2.3.0 = 182 Major update! New admin dashboard, Schema.org SEO, sidebar widget, reverse links, print styles. Fully DSGVO-compliant. 183 159 184 = 2.2.0 = 160 185 Accessibility 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.