1# Calendar Plugin Changelog 2 3## Version 7.2.6 (2026-04-03) 4 5Major release focused on DokuWiki farm compatibility, security hardening, and new features. 6 7### New Features 8 9**Namespace Exclude Parameter** 10- `{{calendar namespace=* exclude=journal}}` — hide specific namespaces from wildcard views 11- `{{calendar namespace=* exclude="journal;drafts"}}` — exclude multiple (semicolon-separated) 12- Supports exact and prefix matching: `exclude=journal` also hides `journal:daily`, `journal:notes` 13- Works with `{{calendar}}`, `{{eventpanel}}`, and `{{eventlist}}` 14- Preserved across AJAX navigation and all-dates search 15 16**Default Search Scope Setting** 17- New admin setting (Themes tab) to default the search bar to "This Month" or "All Dates" 18- Users can still toggle per-session with the / button 19- Stored in `data/meta/calendar_search_default.txt` 20 21### DokuWiki Farm Compatibility 22 23**Data Path Migration** 24- Replaced 77 hardcoded `DOKU_INC . 'data/meta/'` references with `$conf['metadir']` across 8 files 25- Cache paths now use `$conf['cachedir']` (EventCache, RateLimiter, clearCache) 26- All temp files (`.event_stats_cache`, `.sync_abort`) moved from shared plugin dir to per-animal data dir 27- Added `metaDir()` helper to syntax, action, and admin plugin classes 28 29**Per-Animal Sync Credentials** 30- `sync_config.php` now checked in `$conf['metadir']/calendar/` first (per-animal), falls back to `DOKU_PLUGIN` (shared) 31- Added `syncConfigPath()` helper with fallback logic 32- Google OAuth tokens already stored per-animal in `$conf['metadir']` 33 34**CLI Sync Safety** 35- `sync_outlook.php` bootstraps DokuWiki with `NOSESSION` for CLI safety 36- Defensive fallback for `$conf['metadir']` when not set 37- Cron jobs should run as `www-data`, not root, to avoid file ownership issues 38 39### Security Hardening 40 41**ACL Enforcement on All AJAX Endpoints** 42- Read operations (`load_month`, `get_event`, `get_static_calendar`, `search_all`) verify `AUTH_READ` 43- Write operations (`save_event`, `delete_event`, `toggle_task`) verify `AUTH_EDIT` 44- Wildcard/multi-namespace views silently filter out namespaces the user cannot access 45- Applied to both server-side rendering (syntax.php) and AJAX paths (action.php) 46 47**CSRF Protection on Admin Panel** 48- Added `checkSecurityToken()` validation to the admin `handle()` method 49- Added `formSecurityToken()` to all 12 HTML forms 50- Added `JSINFO.sectok` hidden input to all 11 JavaScript-generated forms 51 52**Removed System Stats Endpoint** 53- Deleted `get_system_stats.php` — exposed CPU, memory, load averages, uptime, and top processes via `shell_exec('ps aux')` and `/proc/meminfo` through a directly-accessible PHP endpoint 54- Removed admin UI section, CSS, and save/load methods 55- System load inline JS remains but never executes (`getShowSystemLoad()` returns `false`) 56 57### Bug Fixes 58 59**Weekly Recurring Events on Sunday Created 365 Daily Events** 60- PHP's string `'0'` is falsy — when Sunday (day index 0) was the only selected weekday, the `$weekDays` array was empty, and every day matched 61- Fixed: strict comparison `($weekDaysStr !== '')` instead of truthy check 62 63**Memory Exhaustion on Large Wikis (namespace=*)** 64- Replaced recursive `findSubNamespaces` (which scanned every directory in `data/meta/`) with `findCalendarNamespaces` using iterative `glob()` to locate `calendar/` directories directly 65- On a wiki with 5,000 pages: old approach scanned 5,000+ dirs; new approach runs ~10 glob calls 66 67**Page Load Crash: "Cannot read properties of null"** 68- ARIA live region creation ran before `document.body` existed (script loaded in `<head>`) 69- Wrapped in deferred function that waits for `DOMContentLoaded` 70 71**JS Cache Busting** 72- `script.js` was using `Date.now()` as cache buster, forcing fresh HTTP requests on every page load 73- Changed to version-based `?v=7.2.1` 74 75### Housekeeping 76- Updated `@version` docblocks across all PHP files 77- Added localized strings (EN/DE/CS) for exclude and search scope features 78- Template `style.ini` lookups now check `$conf['savedir']` for farm-specific overrides 79 80### Migration Notes 81 82**From 7.0.x (non-farm):** No action needed — paths resolve to the same location. 83 84**Farm setups:** Calendar data stays in the master wiki's `data/meta/`. Move per-animal data manually: 85```bash 86mv /path/to/master/data/meta/calendar/ /path/to/animal/data/meta/calendar/ 87mv /path/to/master/data/meta/calendar_*.txt /path/to/animal/data/meta/ 88``` 89 90**Cleanup:** The file `calendar_show_system_load.txt` in your data directory can be safely deleted. 91 92--- 93 94## Version 7.0.8 (2026-02-15) - TIMEZONE FIX 95 96### Bug Fix: Date Shift in Non-UTC Timezones 97Fixed critical bug where events appeared shifted by one day in timezones ahead of UTC (e.g., Europe/Prague UTC+1). 98 99**Root Cause:** 100JavaScript's `toISOString()` converts dates to UTC, so local midnight (00:00) in Prague becomes 23:00 UTC of the *previous day*. When split to get YYYY-MM-DD, this returns the wrong date. 101 102**Fix:** 103Added `formatLocalDate(date)` helper function that formats dates using local time methods (`getFullYear()`, `getMonth()`, `getDate()`) instead of UTC conversion. 104 105**Affected Areas (now fixed):** 106- Multi-day event spanning (line 385) 107- Today string calculation in event list (line 566) 108- Past event detection in event items (line 1022) 109 110### Files Modified 111- `calendar-main.js` - Added `formatLocalDate()` helper, replaced 3 `toISOString().split('T')[0]` calls 112 113--- 114 115## Version 7.0.7 (2026-02-15) - GOOGLE CALENDAR SYNC 116 117### Google Calendar Integration 118- Two-way sync with Google Calendar via OAuth 2.0 119- Import events from Google Calendar to DokuWiki 120- Export events from DokuWiki to Google Calendar 121- Support for all-day and timed events 122- Multi-day event handling 123- Color mapping between Google and DokuWiki 124- Duplicate detection prevents re-importing same events 125- Select which Google calendar to sync with 126- Admin panel UI for configuration and sync controls 127 128### Setup Requirements 129- Google Cloud Console project 130- Google Calendar API enabled 131- OAuth 2.0 Web Application credentials 132- Redirect URI configuration 133 134### New Files 135- `classes/GoogleCalendarSync.php` - OAuth and Calendar API integration 136 137### Files Modified 138- `action.php` - Added Google sync action handlers 139- `admin.php` - Added Google sync admin tab 140 141--- 142 143## Version 7.0.6 (2026-02-15) - ACCESSIBILITY IMPROVEMENTS 144 145### Screen Reader Support 146- Added ARIA live region for dynamic announcements 147- Announces "Event created", "Event updated", "Event deleted" on actions 148- Announces "Task marked complete/incomplete" on toggle 149- Screen readers receive feedback without visual alerts 150 151### Debug Mode 152- Added `CALENDAR_DEBUG` flag for JavaScript console logging 153- `calendarLog()` and `calendarError()` helper functions 154- Debug output disabled by default 155 156### Code Quality 157- Consistent error handling patterns 158- Better separation of concerns 159 160### Files Modified 161- `calendar-main.js` - ARIA live region, debug helpers, announcements 162 163--- 164 165## Version 7.0.5 (2026-02-15) - AUDIT LOGGING & ACCESSIBILITY 166 167### Audit Logging 168- New `AuditLogger.php` class for compliance logging 169- Logs all event modifications: create, update, delete, move, task toggle 170- JSON-formatted log files with timestamps, user info, and IP addresses 171- Automatic log rotation (5MB max, 10 files retained) 172- Log entries include: namespace, date, event ID, title, and change details 173 174### Keyboard Navigation (Accessibility) 175- Arrow keys navigate between calendar days 176- Enter/Space activates focused day (opens popup) 177- Arrow Up/Down navigates between events in popups 178- Enter on event opens edit dialog 179- Delete/Backspace on event triggers delete 180- Escape closes all dialogs, popups, and dropdowns 181- Added `tabindex` and `role` attributes for screen readers 182- Added `aria-label` descriptions for calendar days and events 183 184### CSS Focus States 185- Visible focus indicators on calendar days 186- Focus styles on event items in popups 187- Focus styles on custom date/time pickers 188- Uses `focus-visible` for keyboard-only focus rings 189 190### Files Added 191- `classes/AuditLogger.php` - Compliance audit logging 192 193### Files Modified 194- `action.php` - Integrated audit logging for all event operations 195- `calendar-main.js` - Extended keyboard navigation 196- `syntax.php` - Added accessibility attributes to calendar cells 197- `style.css` - Added focus state styles 198 199--- 200 201## Version 7.0.4 (2026-02-15) - CODE CLEANUP 202 203### Code Cleanup 204- Removed unused `calendarDebounce()` and `calendarThrottle()` utility functions 205- Removed duplicate `updateEndTimeOptions()` function definition 206- Removed unused `_calendarSelectOpen` tracking variable 207- Removed orphaned `.input-date` and `.time-select` CSS (no longer using native inputs) 208- Consolidated legacy function calls 209 210### Improvements 211- End date picker now opens to start date's month when no end date is selected 212- End time picker now scrolls to first available time after start time 213 214### Files Modified 215- `calendar-main.js` - Removed ~40 lines of dead code 216- `style.css` - Removed ~25 lines of unused CSS 217 218--- 219 220## Version 7.0.3 (2026-02-15) - CUSTOM DATE & TIME PICKERS 221 222### Complete Replacement of Native Browser Controls 223Both date inputs and time selects have been replaced with custom, lightweight pickers to eliminate all browser-related performance issues. 224 225#### Custom Date Picker 226- **Mini calendar grid** - Clean monthly view with day selection 227- **Month navigation** - Previous/next buttons for quick browsing 228- **Visual indicators** - Today highlighted, selected date marked 229- **End date validation** - Cannot select end date before start date 230- **Clear button** - Easy removal of optional end date 231 232#### Custom Time Picker (from v7.0.2) 233- **Period groupings** - Morning, Afternoon, Evening, Night 234- **Lazy loading** - Options built only when dropdown opens 235- **Smart filtering** - End times after start time only 236 237#### Code Cleanup 238- Removed old `setupSelectTracking()` function (was causing conflicts) 239- Removed redundant event listener code 240- Unified dropdown close handling for all picker types 241- No native `<input type="date">` or `<select>` elements in event dialog 242 243### Files Modified 244- `syntax.php` - New date picker HTML structure 245- `calendar-main.js` - Custom date picker JavaScript, cleanup 246- `style.css` - Date picker calendar grid styles 247 248--- 249 250## Version 7.0.2 (2026-02-15) - CUSTOM TIME PICKER 251 252### Major Fix: Replaced Native Selects with Custom Time Pickers 253The native `<select>` element with 97 time options was causing browser freezes when opening. This version replaces them with lightweight custom dropdown pickers. 254 255#### New Custom Time Picker Features 256- **Instant opening** - No browser rendering delay 257- **Lazy-loaded options** - Dropdown HTML built only when clicked 258- **Period grouping** - Morning, Afternoon, Evening, Night sections 259- **Smart filtering** - End time options automatically hide times before start time 260- **Visual feedback** - Selected time highlighted, disabled times grayed out 261 262#### Technical Changes 263- Replaced `<select>` elements with `<button>` + `<div>` dropdown 264- Hidden `<input>` stores actual value for form submission 265- Time data pre-computed once, reused for all pickers 266- Event delegation for option clicks 267- Automatic cleanup when clicking outside 268 269#### Removed 270- Native `<select>` time pickers (caused 2600ms+ freezes) 271- `onchange` handlers from date inputs (handled in JS now) 272- Old `setupSelectTracking()` function 273 274### Files Modified 275- `syntax.php` - New time picker HTML structure 276- `calendar-main.js` - Custom time picker JavaScript 277- `style.css` - Time picker dropdown styles 278 279--- 280 281## Version 7.0.1 (2026-02-15) - SELECTOR FLICKER FIX 282 283### Bug Fixes 284- **Fixed selector flicker on subsequent clicks** - Time/date selectors no longer flash or lag after first use 285 - New `setupSelectTracking()` prevents DOM updates while selector is open 286 - Tracks mousedown/focus/blur/change events on all form inputs 287 - Uses `requestAnimationFrame` for smooth visual updates 288 - Added state caching to skip redundant DOM manipulation 289 290### CSS Improvements 291- Changed `transition: all` to specific properties on `.input-sleek` elements 292- Added `transition: none` for select options 293- Prevents browser reflow issues during dropdown rendering 294 295--- 296 297## Version 7.0.0 (2026-02-15) - STABILITY & PERFORMANCE RELEASE 298 299### Major Improvements 300 301#### File Locking & Atomic Writes (Critical Stability Fix) 302- **New `CalendarFileHandler` class** with atomic file operations 303- Prevents data corruption from concurrent event saves 304- Uses temp file + atomic rename strategy for safe writes 305- Implements `flock()` for proper file locking during reads/writes 306- Graceful handling of lock acquisition failures with retries 307 308#### Caching Layer (Performance Improvement) 309- **New `CalendarEventCache` class** for event data caching 310- 5-minute TTL reduces unnecessary JSON file reads 311- In-memory caching for current request 312- Automatic cache invalidation on event modifications 313- Cache cleanup for expired entries 314 315#### Rate Limiting (Security Enhancement) 316- **New `CalendarRateLimiter` class** for AJAX endpoint protection 317- 60 requests/minute for read actions 318- 30 requests/minute for write actions (more restrictive) 319- Per-user tracking (falls back to IP for anonymous) 320- Rate limit headers in responses (X-RateLimit-Limit, X-RateLimit-Remaining) 321- Automatic cleanup of old rate limit data 322 323#### Code Refactoring 324- **New `CalendarEventManager` class** consolidating CRUD operations 325- New `classes/` directory for organized code structure 326- Reduced code duplication across files 327- Improved separation of concerns 328- Better maintainability for future development 329 330#### JavaScript Performance Fixes (Dialog Responsiveness) 331- **Fixed slow time selector** - End time dropdown now opens instantly 332 - Replaced `Array.from().forEach()` with direct `options` loop (97 options) 333 - Single-pass algorithm instead of multiple iterations 334 - Uses `hidden` property instead of `style.display` manipulation 335- **Fixed event listener accumulation** - Dialog inputs no longer slow down over time 336 - Added `data-initialized` flag to prevent re-binding listeners 337 - Namespace search only initializes once per calendar 338- **Fixed selector flicker on subsequent clicks** 339 - New `setupSelectTracking()` function prevents DOM updates while selector is open 340 - Tracks mousedown/focus/blur/change events on time and date inputs 341 - Uses `requestAnimationFrame` instead of `setTimeout` for visual updates 342 - Added state caching to skip redundant DOM updates 343- **Fixed CSS transition interference** 344 - Changed `transition: all` to specific properties on form inputs 345 - Added explicit `transition: none` for select options 346 - Prevents browser reflow issues during dropdown rendering 347 348### Branding Changes 349- Removed "Matrix Edition" from plugin name and all references 350- Plugin is now simply "Calendar Plugin" 351- Matrix theme remains available (now called just "Matrix") 352 353### Technical Details 354- All JSON file operations now use atomic writes 355- Event saves protected against race conditions 356- Cache automatically invalidated on namespace/month changes 357- Rate limiter uses probabilistic cleanup (1 in 100 requests) 358 359### Files Added 360- `classes/FileHandler.php` - Atomic file operations with locking 361- `classes/EventCache.php` - Caching layer with TTL 362- `classes/RateLimiter.php` - AJAX rate limiting 363- `classes/EventManager.php` - Consolidated event CRUD operations 364 365### Upgrade Notes 366- No database migration required 367- Cache directory created automatically (`data/cache/calendar/`) 368- Rate limit data stored in `data/cache/calendar/ratelimit/` 369- Existing events and settings preserved 370 371--- 372 373## Version 6.14.2 (2026-02-15) - SYSTEM LOAD TOGGLE 374 375### Added System Load Bars Toggle 376- New toggle in **Admin > Calendar > Themes** tab 377- Choose to show or hide CPU/Memory load indicator bars 378- Setting applies to both event panel and sidebar widget 379- Stored in `data/meta/calendar_show_system_load.txt` 380- JavaScript polling is also disabled when hidden (saves resources) 381 382## Version 6.14.1 (2026-02-14) - SECURITY FIX 383 384### Security Improvements 385- **Authentication required** - Write actions (save, delete, toggle) now require user to be logged in 386- **Improved CSRF token handling** - New `getSecurityToken()` helper function checks multiple sources: 387 - `JSINFO.sectok` (standard) 388 - `window.JSINFO.sectok` 389 - Hidden form field `input[name="sectok"]` 390 - Meta tag `meta[name="sectok"]` 391- Anonymous users can no longer add/edit/delete events 392- Better error messages for authentication and token failures 393 394### Bug Fixes 395- Fixed "Invalid security token" error on clean DokuWiki installations 396- Added debug logging for security token failures 397 398## Version 6.14.0 (2026-02-14) - STABLE RELEASE 399 400### Code Cleanup & Localization 401- Added localization for all static calendar strings (EN/DE) 402- New lang keys: `previous_month`, `next_month`, `print_calendar`, `no_events_scheduled`, `calendar_label`, `details` 403- Code review and cleanup completed 404- Updated README.md and plugin documentation 405 406### Static Calendar Features (v6.13.x consolidated) 407- Read-only presentation mode: `{{calendar static}}` 408- Custom titles: `title="My Events"` 409- Month locking: `month=2` disables navigation 410- Print button with clean itinerary output 411- All themes supported: matrix, pink, purple, professional, wiki, dark, light 412- `noprint` option to hide print functionality 413- Formatted descriptions in tooltips and itinerary 414 415### Other Improvements in 6.13.x 416- Admin menu icon (SVG) 417- Config import fix for `return array()` syntax 418- Mobile touch button fixes 419- Important events in day popup with star icons 420- Time picker grouped by period 421- Multi-day event time validation 422 423## Version 6.13.13 (2026-02-14) - PRINT BUTTON CENTERING 424 425### Fixed Print Button Icon Alignment 426- Added `display: flex`, `align-items: center`, `justify-content: center` 427- Added `padding: 0` and `line-height: 1` 428- Icon now properly centered in circle 429 430## Version 6.13.12 (2026-02-14) - SIMPLE TOOLTIP 431 432### Simplified Hover Tooltip 433- Removed custom JS tooltip (was causing triple popups) 434- Uses native browser `title` attribute only 435- Plain text with formatting converted: `**bold**` → `*bold*`, `//italic//` → `_italic_` 436- Links shown as: `text (url)` 437- Added emoji before time for visual clarity 438- Itinerary still shows full HTML formatting 439 440## Version 6.13.11 (2026-02-14) - FORMATTED DESCRIPTIONS 441 442### Rich Text Formatting in Static Calendar 443- **Hover tooltips** now show formatted text (bold, italic, links, line breaks) 444- **Itinerary descriptions** display with full formatting 445- Uses existing `renderDescription()` function for consistency 446- Supports: `**bold**`, `//italic//`, `[[links]]`, `[markdown](links)`, line breaks 447 448### Technical Details 449- Added `data-tooltip` attribute with rich HTML content 450- New JavaScript tooltip handler with smart positioning 451- CSS styles for `.static-tooltip` and itinerary formatting 452- Tooltips stay within viewport bounds 453 454## Version 6.13.10 (2026-02-14) - PRINT MARGINS FIX v3 455 456### Fixed Print Margins - Inline Styles Approach 457- Removed reliance on `@page` CSS (browser support inconsistent) 458- Uses inline style `padding: 50px 60px` directly on wrapper div 459- Simplified CSS for better browser compatibility 460- Smaller table font (12px) for better fit 461- Set `max-width: 800px` on content wrapper 462 463## Version 6.13.9 (2026-02-14) - PRINT MARGINS FIX v2 464 465### Fixed Print Margins 466- Added `.print-wrapper` div with 0.5in padding/margin 467- Uses both `@page` margin AND wrapper margins for compatibility 468- Set `@page { margin: 1in 0.75in }` (top/bottom 1in, sides 0.75in) 469- Wrapper has `max-width: 7.5in` to fit standard letter size 470- Smaller fonts (0.85em) to fit more content 471- Added 250ms delay before print to ensure styles load 472 473## Version 6.13.8 (2026-02-14) - PRINT MARGINS FIX 474 475### Improved Print Layout 476- Added `@page { margin: 0.75in }` for proper print margins 477- Increased body padding to 40px for screen preview 478- Smaller font sizes to fit better on page 479- Description column limited width with word-wrap 480- Table header repeats on each page (`display: table-header-group`) 481- Rows avoid page breaks in middle (`page-break-inside: avoid`) 482- Print color adjust enabled for backgrounds 483 484## Version 6.13.7 (2026-02-14) - ALL THEMES FOR STATIC CALENDAR 485 486### Added All Theme Options 487Now all themes work with static calendar: 488 489| Theme | Description | 490|-------|-------------| 491| `matrix` | Green on dark (default Matrix style) | 492| `pink` | Pink/magenta on dark | 493| `purple` | Purple/violet on dark | 494| `professional` | Blue on white (business style) | 495| `wiki` | Neutral gray (matches DokuWiki) | 496| `dark` | Blue on dark gray | 497| `light` | Clean white/gray | 498 499### Examples 500``` 501{{calendar theme=matrix static}} 502{{calendar theme=purple static}} 503{{calendar theme=professional static}} 504{{calendar theme=wiki static}} 505``` 506 507## Version 6.13.6 (2026-02-14) - QUOTED PARAMETER FIX 508 509### Fixed Quoted Parameter Parsing 510- Titles with spaces now work: `title="Feb 26 Expense Log"` 511- Uses regex to properly parse: `key="value with spaces"` 512- Supports both double and single quotes 513- Example: `{{calendar title="My Custom Title" static}}` 514 515## Version 6.13.5 (2026-02-14) - STATIC CALENDAR OPTIONS 516 517### New Static Calendar Options 518 519| Option | Description | Example | 520|--------|-------------|---------| 521| `title=X` | Custom title instead of month name | `title="Club Meetings"` | 522| `noprint` | Hide print button and print view | `{{calendar static noprint}}` | 523| `theme=X` | Apply specific theme (matrix, pink, dark, light) | `theme=matrix` | 524 525### Fixed Month/Year Lock 526- When you specify `month=X` or `year=X`, navigation is now disabled 527- `{{calendar month=2 static}}` shows only February with no nav arrows 528- `{{calendar year=2025 month=12 static}}` locks to December 2025 529 530### Examples 531``` 532{{calendar static}} // Navigable, current month 533{{calendar month=2 static}} // Locked to February 534{{calendar title="Team Events" static}} // Custom title 535{{calendar theme=matrix static}} // Matrix theme 536{{calendar namespace=club static noprint}} // No print button 537{{calendar month=3 title="March Meetings" theme=pink static}} 538``` 539 540## Version 6.13.4 (2026-02-14) - DEDICATED PRINT BUTTON 541 542### Added Print Button to Static Calendar 543- New ️ print button in the calendar header 544- Opens a clean popup window with ONLY the itinerary content 545- Automatically triggers print dialog 546- Window closes after printing 547- No DokuWiki headers/footers/sidebars - just the calendar 548 549### How It Works 550- Extracts the print view HTML 551- Creates a new window with minimal styling 552- Calls `window.print()` automatically 553- Clean single-page output 554 555## Version 6.13.3 (2026-02-14) - PRINT BLANK PAGES FIX 556 557### Fixed Blank Pages When Printing 558- Aggressively hide ALL screen view elements and children in print 559- Reset height/width to 0 with !important on grid, cells, events 560- Ensure print view elements have proper display table properties 561- Force all hidden elements to position:absolute off-screen 562 563## Version 6.13.2 (2026-02-14) - STATIC CALENDAR RESPONSIVE FIX 564 565### Improved Static Calendar Layout 566- Changed from `max-width: 900px` to `width: 100%` for full container fit 567- Added `table-layout: fixed` for consistent column widths 568- Added `overflow-x: auto` for horizontal scroll on very small screens 569- Reduced header padding and font sizes for better fit 570- Improved responsive breakpoints for mobile (768px and 480px) 571- Hide time on very small screens to save space 572- Better touch targets for navigation buttons 573 574## Version 6.13.1 (2026-02-14) - STATIC CALENDAR FIX 575 576### Bug Fix 577- Added missing `getImportantNamespaces()` helper method 578- Fixed `loadEventsForMonth` → use existing `loadEvents` method 579- Added multi-namespace/wildcard support to static calendar 580 581## Version 6.13.0 (2026-02-14) - STATIC CALENDAR MODE 582 583### New Static/Presentation Mode 584Read-only calendar view for public display and printing. 585 586**Usage:** 587``` 588{{calendar static}} 589{{calendar namespace=meetings static}} 590``` 591 592**Screen View Features:** 593- Clean calendar grid without edit/delete buttons 594- Month navigation (prev/next arrows) 595- Hover tooltips showing full event details (title, time, description) 596- Important events highlighted with ⭐ and golden background 597- Today's date highlighted 598- Responsive design for mobile 599 600**Print View Features:** 601- Automatically switches to itinerary format when printing 602- Table layout: Date | Time | Event | Details 603- Important events marked with ⭐ 604- Dates grouped (date only shown once per day) 605- Page break handling for long lists 606- Clean black & white friendly output 607 608**Files Changed:** 609- `syntax.php`: Added `renderStaticCalendar()` method 610- `action.php`: Added `getStaticCalendar()` AJAX handler 611- `calendar-main.js`: Added `navStaticCalendar()` function 612- `style.css`: Added static calendar styles + print media queries 613 614## Version 6.12.7 (2026-02-14) - ADMIN MENU ICON 615 616### Added Admin Menu Icon 617- New monochrome SVG calendar icon for DokuWiki admin menu 618- Icon shows calendar with binding rings, header, and date dots 619- Matches DokuWiki's admin interface style 620- Added `getMenuIcon()` method to admin.php 621- Icon file: `images/icon.svg` 622 623## Version 6.12.6 (2026-02-14) - CONFIG IMPORT FIX 624 625### Fixed Config Import Validation 626- Now accepts both `return [` and `return array(` syntax 627- Regex updated from `/return\s*\[/` to `/return\s*(\[|array\s*\()/` 628- Older PHP config files using `return array(...)` now import correctly 629 630## Version 6.12.5 (2026-02-14) - MOBILE BUTTON FIX 631 632### Fixed Delete/Edit Buttons on Mobile 633- Added `type="button"` attribute to prevent form submission issues 634- Added `touchend` event delegation for reliable mobile touch handling 635- Increased button touch targets (32px default, 40px on mobile) 636- Added `touch-action: manipulation` to prevent touch delays 637- Added `-webkit-tap-highlight-color` for visual feedback 638 639### Technical Details 640- Mobile browsers sometimes don't fire `onclick` reliably 641- New `touchend` handler calls `btn.click()` explicitly 642- Larger touch targets meet accessibility guidelines (44px recommended) 643 644## Version 6.12.4 (2026-02-14) - STAR INLINE FIX 645 646### Fixed Star Position in Day Popup 647- Star icon now displays inline with event title (left side) 648- Changed `.popup-event-title` from `flex: 1 1 100%` to `flex: 1 1 auto` 649- Star and title stay on same line instead of star being above 650 651## Version 6.12.3 (2026-02-14) - DAY POPUP IMPORTANT EVENTS 652 653### Important Event Highlighting in Day Popup 654- Events from important namespaces now show ⭐ star icon 655- Golden gradient background highlight for important events 656- Golden border glow effect matching other views 657- Consistent styling across calendar grid, sidebar, and day popup 658 659### Technical Details 660- Added `importantNamespaces` check to `showDayPopup()` function 661- Added `.popup-event-important` and `.popup-event-star` CSS classes 662- Reads important namespaces from `container.dataset.importantNamespaces` 663 664## Version 6.12.2 (2026-02-14) - MULTI-DAY EVENT TIME FIX 665 666### Multi-Day Event End Time 667- End time now allows all times when end date differs from start date 668- Example: Event from 9:00 PM on Feb 28 to 5:00 AM on Feb 29 now works correctly 669- Same-day events still enforce end time > start time 670- Changing end date now triggers time validation update 671 672### Technical Details 673- `updateEndTimeOptions()` checks if `endDate !== startDate` 674- If multi-day, all time options are enabled 675- Added `onchange` handler to both start date and end date fields 676 677## Version 6.12.1 (2026-02-14) - TIME PICKER & EDIT DIALOG FIX 678 679### Improved Time Picker 680- Grouped time options by period (Morning, Afternoon, Evening, Night) 681- Much easier to navigate - no more scrolling through 96 options 682- End time options before start time are now hidden/disabled 683- Invalid end times automatically corrected when start time changes 684 685### Fixed Edit Event Dialog Draggability 686- Edit dialog is now properly draggable (was broken due to async AJAX) 687- Moved `makeDialogDraggable()` call inside the AJAX success callback 688- Removed redundant wrapper patch that didn't work with async code 689 690### Technical Details 691- Time picker uses `<optgroup>` for visual grouping 692- End time validation hides invalid options (not just disables) 693- Both Add and Edit dialogs now call `makeDialogDraggable()` directly 694 695## Version 6.12.0 (2026-02-14) - EVENT EDITOR DIALOG IMPROVEMENTS 696 697### Fixed Event Editor Dialog Draggability 698- Fixed duplicate event listener accumulation that caused performance degradation 699- Each time dialog opened, new drag listeners were added without removing old ones 700- Now properly cleans up old listeners before adding new ones 701- Added `cursor: grabbing` feedback while dragging 702- Dialog position resets when reopened (no more stuck positions) 703- Excluded close button from triggering drag 704 705### Optimized Time Selection Performance 706- Simplified `updateEndTimeOptions()` to be much faster 707- Removed expensive loop through 96 options checking style.display 708- Now just validates current selection and sets new value if invalid 709- Should eliminate freezing/lag when selecting start time 710 711### Technical Details 712- Added `_dragCleanup` function stored on handle element 713- Cleanup called before re-initialization 714- Removed unnecessary `setTranslate` helper function 715 716## Version 6.11.4 (2026-02-13) - JAVASCRIPT LOCALIZATION 717 718### JavaScript Frontend Localization 719- Added `getCalendarLang()` helper function 720- Added `getJsLangStrings()` PHP method 721- Embedded JSON language data in all render functions 722- Localized month names (full + short) 723- Localized dialog titles, confirmations, badges, empty states 724 725## Version 6.11.3 (2026-02-13) - SIDEBAR WIDGET LOCALIZATION 726 727### Sidebar Widget 728- Fixed `\n` in single-quoted strings → double-quoted for proper newlines 729- Localized "Runs every X minutes" cron descriptions 730- Event dialog labels, placeholders, options 731- Day names, ordinal positions, color names 732- Today/Tomorrow/Important section headers 733 734## Version 6.11.2 (2026-02-13) - ADMIN BACKEND LOCALIZATION 735 736### Admin Backend 737- Localized ~220 hardcoded strings in admin.php 738- AJAX JSON responses, redirect messages, error messages 739- Pattern names (Daily, Weekly, Monthly, etc.) 740 741## Version 6.11.1 (2026-02-13) - CONFIG IMPORT BUG FIX 742 743### Bug Fix 744- Fixed regex to accept both `return [` and `return array(` syntax 745- File: `admin.php` lines 5947, 6001 746 747## Version 6.10.6 (2026-02-13) - MANAGE RECURRING DIALOG LOCALIZATION 748 749### Localized Manage Recurring Series Dialog 750Complete translation of the "Manage" button dialog for recurring events: 751 752**Section Headers:** 753- "Manage Recurring Series" → "Wiederkehrende Serie verwalten" 754- "Extend Series" → "Serie erweitern" 755- "Trim Past Events" → "Vergangene Termine kürzen" 756- "Change Pattern" → "Muster ändern" 757- "Change Start Date" → "Startdatum ändern" 758- "Pause Series" / "Resume Series" → "Serie pausieren" / "Serie fortsetzen" 759 760**Labels & Buttons:** 761- All field labels (Add occurrences, Days apart, Remove before, New interval, etc.) 762- Action buttons (Extend, Trim, Change, Shift, Pause, Resume, Close) 763- Interval dropdown options (Daily, Weekly, Bi-weekly, Monthly, Quarterly, Yearly) 764- Help text and notes 765 766**Confirmation Dialogs:** 767- Trim confirmation with date 768- Respace confirmation 769- Shift confirmation 770 771### Added 60+ Language Strings for Dialogs 772Complete vocabulary for recurring event management in both English and German. 773 774### Note on Browser Validation Messages 775"Please fill out this field" is a browser-native message controlled by the browser's language setting, not our plugin. 776 777## Version 6.10.5 (2026-02-13) - DIALOG LOCALIZATION 778 779### Localized All JavaScript Dialogs 780 781**New Namespace Dialog:** 782- Prompt text with examples now in German 783- Invalid namespace error message 784 785**Rename Namespace Dialog:** 786- Prompt text with current name 787 788**Delete Confirmations:** 789- Delete selected events confirmation 790- Delete namespace confirmation 791- Delete recurring series confirmation 792 793**Trim Recurring Events:** 794- "Counting..." / "Zähle..." 795- "Trimming..." / "Kürze..." 796- "No past recurring events found" message 797- "Found X past recurring events" confirmation 798- Button text resets 799 800### Added 15+ New Dialog Strings 801Both English and German translations for all interactive prompts and confirmations. 802 803## Version 6.10.4 (2026-02-13) - COMPLETE MANAGE TAB LOCALIZATION 804 805### Fixed Remaining English Strings 806 807**Namespace Explorer Control Bar:** 808- "➡️ Move" → "➡️ Verschieben" 809- "➕ New Namespace" → "➕ Neuer Namensraum" 810- " Cleanup" → " Bereinigen" 811- "0 selected" → "0 ausgewählt" 812- "%d selected" → "%d ausgewählt" 813 814**Recurring Events Button Tooltips:** 815- "Edit title, time, namespace, pattern" → "Titel, Zeit, Namensraum, Muster bearbeiten" 816- "Extend, trim, pause, change dates" → "Erweitern, kürzen, pausieren, Daten ändern" 817- "Delete all occurrences" → "Alle Vorkommen löschen" 818 819**JavaScript Confirmation Messages:** 820- "No events selected" → "Keine Termine ausgewählt" 821- Delete confirmation with count 822- Delete namespace confirmation 823- "Scanning..." → "Scanne..." 824- "Cleaning..." → "Bereinige..." 825- "No empty namespaces found" message 826- "Found X item(s) to clean up" → "X Element(e) zum Bereinigen gefunden" 827- "Proceed with cleanup?" → "Mit Bereinigung fortfahren?" 828 829### Technical 830- Added adminLang JavaScript object with all translatable strings 831- All dynamic JavaScript messages now use language system 832 833## Version 6.10.3 (2026-02-13) - RECURRING EVENTS & DROP TARGET LOCALIZATION 834 835### Additional Localization for Manage Events Tab 836 837**Recurring Events Table:** 838- Search placeholder: "Wiederkehrende Termine suchen..." 839- Table headers: Titel, Namensraum, Muster, Zeitraum, Anzahl, Quelle, Aktionen 840- Source labels: Markiert / Erkannt (was Flagged / Detected) 841- Action buttons: Bearb. / Verwalten / Lö. (was Edit / Manage / Del) 842- Pattern badges: Täglich, Wöchentlich, Monatlich, Jährlich, Benutzerdefiniert 843- Footer: "Gesamt: X Serien" (was "Total: X series") 844- No results message 845 846**Namespace Explorer Drop Zones:** 847- Header: " Zielbereich" (was "Drop Target") 848- Drop hint: "Hier ablegen" (was "Drop here") 849- Default namespace label consistent 850 851### Added 25+ New Language Strings 852- Recurring table columns and labels 853- Pattern translations 854- Action button labels 855- Drop zone labels 856 857## Version 6.10.2 (2026-02-13) - MANAGE EVENTS TAB LOCALIZATION 858 859### Localized: Manage Events Tab (Complete) 860All text in the Manage Events admin tab now uses the language system: 861 862**Events Manager Section:** 863- Page title, section header, description 864- Statistics labels (Total Events, Namespaces, JSON Files, Recurring) 865- "Last scanned" timestamp label 866- Button labels (Re-scan Events, Export All Events, Import Events) 867- "View Breakdown by Namespace" expandable section 868- Table headers (Namespace, Events, Files) 869 870**Important Namespaces Section:** 871- Section header and description 872- Visual Effects descriptions (Calendar Grid, Event Sidebar, Sidebar Widget, Day Popup) 873- Save button and hint text 874 875**Cleanup Old Events Section:** 876- Section header and description 877- Radio button labels (By Age, By Status, By Date Range) 878- Age options (Delete events older than, months, years) 879- Status options (Completed tasks, Past events) 880- Date range labels (From, To) 881- Namespace filter label and placeholder 882- Preview and Delete button labels 883- JavaScript confirmation messages 884- Loading/error states 885 886**Recurring Events Section:** 887- Section header 888- Button labels (Trim All Past, Rescan) 889 890**Namespace Explorer Section:** 891- Section header and description 892- Search placeholder 893- Control bar buttons (All, None, Delete, Move to) 894- Datalist placeholder 895 896### Added 60+ New Language Strings 897Both English and German language files expanded with comprehensive admin terminology. 898 899## Version 6.10.1 (2026-02-13) - LANGUAGE SYSTEM FIX 900 901### Bug Fix: Language Files Not Working 902- Fixed `getMenuText()` to use `$this->getLang('menu')` instead of hardcoded string 903- Admin menu now correctly shows "Kalenderverwaltung" in German 904- Admin tabs now use language system: 905 - "Manage Events" → "Termine verwalten" 906 - "Update Plugin" → "Plugin aktualisieren" 907 - "Outlook Sync" → "Outlook-Sync" 908 - "Themes" → "Designs" 909 910### Added More Language Strings 911- Admin tab labels 912- Admin section headers (Event Browser, Important Namespaces, etc.) 913- Sync settings labels 914- Common button labels (Run Now, Download, Upload, Delete, etc.) 915 916## Version 6.10.0 (2026-02-13) - GERMAN LANGUAGE SUPPORT 917 918### New Feature: German Language Translation 919- Added complete German (de) language file 920- Expanded English language file with comprehensive translatable strings 921- Both files include 100+ translation strings covering: 922 - General terms (calendar, events, dates) 923 - Event fields (title, description, time, etc.) 924 - Actions (add, edit, delete, save, cancel) 925 - Task-related terms 926 - Recurring event options 927 - Days of week and months 928 - User messages and confirmations 929 - Search functionality 930 - Sync status messages 931 - Admin section labels 932 - Sidebar widget labels 933 - Time conflict warnings 934 935### Note 936The language strings are now available for future implementation throughout the plugin UI. Currently the admin menu uses the language system; other strings can be integrated as needed. 937 938## Version 6.9.9 (2026-02-13) - CRITICAL SEARCH FIX 939 940### Bug Fix: Month Search Not Working 941- **Root cause:** Function name collision - there were two `fuzzyMatch` functions 942 - `window.fuzzyMatch` (for namespace search autocomplete) returns a score number or `null` 943 - Local `fuzzyMatch` (for event search) returns `true`/`false` 944- When filtering events, the wrong function was being called, returning `null` for all events 945- **Fix:** Renamed event search functions to `eventSearchNormalize` and `eventSearchMatch` 946- Month search now works correctly on first load and after navigation 947 948### Also in this version 949- Fixed jumpToDate to properly hide search clear button after navigation 950- Removed debug logging from production code 951 952## Version 6.9.8 (2026-02-12) - SEARCH & UI FIXES 953 954### Bug Fixes 955 956**All-Dates Search Navigation Fixed** 957- Clicking a search result now properly navigates to that event's month 958- Opens the day popup showing the event details 959- Was calling non-existent `loadMonth()` - now uses correct `navCalendar()` 960- Clears search results and restores normal event list view 961 962**"No Events" Message Fixed** 963- No longer shows "No events match your search" when in all-dates mode 964- All-dates mode has its own results display; the month-mode message was incorrectly appearing 965 966**Add Button Layout Fixed** 967- Search bar no longer pushes the "+ Add" button off the right edge 968- Search container has constrained max-width (160px) and proper flex settings 969- Header has overflow:hidden to prevent layout issues 970 971**Important Event Stars Fixed** 972- Stars now appear on initial page load (PHP rendering added) 973- Stars positioned outside the bar using CSS ::before pseudo-element 974- Added overflow:visible to event-indicators and event-bar containers 975- Bar remains full width; star sits in the left margin area 976 977### Technical 978- Star uses `event-bar-has-star` class for first-day-only display 979- jumpToDate() properly cleans up search state before navigation 980 981## Version 6.9.7 (2026-02-12) - IMPORTANT NAMESPACE IMPROVEMENTS 982 983### Bug Fix 984- **AJAX refresh now preserves important namespace highlighting** 985 - Important namespaces list now passed to JavaScript via data attribute 986 - Highlighting persists when navigating between months 987 - Works in both main calendar sidebar and standalone event panels 988 989### New Feature: Calendar Grid Star Icons 990- **Important events now show ⭐ on their color bars** in the calendar grid 991 - Small star appears on the first day of important events 992 - Tooltip prefixed with ⭐ for important events 993 - Visual distinction without cluttering the compact grid view 994 995### Admin Section Update 996- **Improved Important Namespaces description** in Admin → Calendar → Manage Events 997 - Now explains all visual effects: 998 - Calendar Grid: ⭐ star on event bars 999 - Event Sidebar: ⭐ star + highlighted background + accent border 1000 - Sidebar Widget: Dedicated "Important Events" section 1001 - Day Popup: Events shown with full details 1002 - Better example placeholder text 1003 1004### Technical 1005- Fixed PHP syntax error in fuzzy search (curly quotes replaced with escape sequences) 1006- Important namespaces loaded once and stored in container dataset for JavaScript access 1007 1008## Version 6.9.6 (2026-02-12) - FUZZY SEARCH & SIDEBAR HIGHLIGHTING 1009 1010### Fuzzy Search 1011- **Improved search matching:** Search is now more forgiving of punctuation differences 1012 - "fathers day" matches "Father's Day" 1013 - "new years" matches "New Year's Eve" 1014 - Smart quotes, apostrophes, dashes, and common punctuation are ignored 1015- **Multi-word search:** All words must be present but in any order 1016 - "birthday john" matches "John's Birthday Party" 1017- Works in both "this month" and "all dates" search modes 1018 1019### Important Namespace Highlighting (Calendar Sidebar) 1020- Events from important namespaces now highlighted in the main calendar's event list sidebar 1021- Same visual treatment as the itinerary sidebar widget: 1022 - Subtle theme-colored background tint 1023 - Right border accent bar 1024 - ⭐ star icon before event title 1025- Theme-specific colors: 1026 - Matrix: green tint 1027 - Purple: purple tint 1028 - Pink: pink tint 1029 - Professional: blue tint 1030 - Wiki: light blue tint 1031- Configure important namespaces in Admin → Calendar → Sync Settings 1032 1033## Version 6.9.5 (2026-02-12) - SEARCH MODE TOGGLE 1034 1035### New Feature: Search Scope Toggle 1036- **Search mode button** (/) added next to search input in both calendar views 1037- **Default mode** (): Search only the current month's events (fast, local filtering) 1038- **All dates mode** (): Search across ALL calendar data via AJAX 1039 - Click the button to toggle to (green highlight when active) 1040 - Requires at least 2 characters to search 1041 - Shows results with date, time, and namespace 1042 - Click any result to jump to that date and open the day popup 1043 - Limited to 50 results for performance 1044- Search placeholder text updates to indicate current mode 1045- Compact button design takes minimal space 1046 1047### UI Details 1048- Button sits flush with search input (no gap) 1049- Green highlight when "all dates" mode is active 1050- Results show full date (e.g., "Mon, Feb 12, 2026") 1051- Namespace badge shown for multi-namespace setups 1052 1053## Version 6.9.4 (2026-02-12) - POPUP IMPROVEMENTS & IMPORTANT HIGHLIGHTING 1054 1055### Features 1056- **Draggable Day Popup:** Calendar day popup window is now draggable by its header 1057 - Click and drag the header to move the popup 1058 - Header shows move cursor on hover 1059 - Clicking the close button (×) still closes normally 1060 1061- **Important Namespace Highlighting in Sidebar:** 1062 - Events from "important" namespaces (defined in Admin → Sync Settings) now have subtle highlighting 1063 - Theme-aware background tint (green for Matrix, purple for Purple, pink for Pink, blue for Professional/Wiki) 1064 - Right border accent bar for visual distinction 1065 - ⭐ star icon appears before event title 1066 - Works in Today, Tomorrow, and Important Events sections 1067 1068### Bug Fix 1069- **Fixed event display in day popup:** Long titles no longer cut off the edit/delete buttons 1070 - Event title now wraps to multiple lines instead of truncating 1071 - Actions buttons always visible 1072 - Time, date range, and namespace badges wrap properly 1073 - Improved flex layout for better responsiveness 1074 1075## Version 6.9.3 (2026-02-12) - ADMIN EDIT DIALOG CONSISTENCY 1076 1077### UI Improvement 1078- **Edit Recurring Event dialog** in Admin section now matches the main event editor exactly: 1079 - Same dark theme styling (#1e1e1e background, #2c3e50 header) 1080 - Same header layout with close button (×) in top-right corner 1081 - Same input styling (dark inputs with green accent borders) 1082 - Same footer with Cancel/Save buttons layout 1083 - Same recurrence options box styling 1084 - Consistent spacing, fonts, and colors throughout 1085 1086## Version 6.9.2 (2026-02-12) - MOBILE DIALOG FIX 1087 1088### Bug Fix 1089- **Fixed:** Description textarea now extends full width on mobile/phone view 1090 - Reduced form padding from 12px to 8px on screens ≤480px 1091 - Added explicit `width: 100%` and `box-sizing: border-box` to textarea 1092 - Ensured all form inputs/selects use full available width on mobile 1093 1094## Version 6.9.1 (2026-02-11) - ADMIN RECURRING EVENTS INTEGRATION 1095 1096### Admin Panel Updates 1097- **Enhanced Recurring Events Table:** 1098 - Pattern column now shows color-coded badges (daily=blue, weekly=green, monthly=orange, yearly=pink) 1099 - "First" column renamed to "Range" showing full date span (e.g., "Feb 1, 2026 → Dec 15, 2026") 1100 - Patterns now read from stored metadata when available, with smart fallback to detection 1101 1102- **Edit Recurring Series Dialog:** 1103 - Full recurrence pattern editing (not just simple intervals) 1104 - "Repeat every [N] [period]" with dropdown for Daily/Weekly/Monthly/Yearly 1105 - Weekly: Day-of-week checkboxes (Sun-Sat) with current days pre-selected 1106 - Monthly: Radio choice between "Day of month" or "Weekday pattern" 1107 - Ordinal weekday selector (First/Second/Third/Fourth/Fifth/Last + day dropdown) 1108 - Pre-populates all fields from stored recurrence metadata 1109 - Properly reschedules future events using new pattern 1110 1111- **Manage Series Dialog:** 1112 - Updated summary to show date range 1113 - Extend/trim/change pattern functions work with new patterns 1114 1115### Technical Updates 1116- `findRecurringEvents()` captures all recurrence metadata from events 1117- `formatRecurrencePattern()` generates human-readable pattern descriptions 1118- `detectRecurrencePattern()` enhanced to detect more interval variations 1119- `editRecurringSeries()` PHP handler processes new recurrence parameters 1120- `generateRecurrenceDates()` creates dates matching complex patterns 1121- Recurrence metadata preserved and updated across all event occurrences 1122 1123## Version 6.9.0 (2026-02-11) - ADVANCED RECURRING EVENTS 1124 1125### New Features 1126- **Enhanced Recurring Event Options:** 1127 - **Interval support:** Repeat every N days/weeks/months/years (e.g., every 3 months) 1128 - **Weekly day selection:** Choose specific days of the week (e.g., Mon, Wed, Fri) 1129 - **Monthly options:** 1130 - Day of month: Repeat on specific day (e.g., 15th of each month) 1131 - Ordinal weekday: Repeat on pattern (e.g., 2nd Wednesday, Last Friday) 1132 - **Examples now possible:** 1133 - Every 2 weeks on Monday and Thursday 1134 - Every 3 months on the 15th 1135 - Every other month on the 2nd Wednesday 1136 - Every year on the same date 1137 - Last Friday of every month 1138 1139### UI Changes 1140- Redesigned recurring options section with bordered container 1141- "Repeat every [N] [period]" input with interval number field 1142- Day-of-week checkboxes for weekly recurrence 1143- Radio buttons for monthly: "Day of month" vs "Weekday pattern" 1144- Ordinal dropdown (First/Second/Third/Fourth/Fifth/Last) 1145- Day dropdown (Sunday through Saturday) 1146- Helper text for end date field 1147 1148### Technical Details 1149- New parameters: recurrenceInterval, weekDays, monthlyType, monthDay, ordinalWeek, ordinalDay 1150- Recurrence pattern stored in event data for reference 1151- Maximum 365 occurrences (up from 100) to support daily events for a year 1152- Smart date iteration for complex patterns 1153 1154## Version 6.8.1 (2026-02-11) - ITINERARY DEFAULT STATE SETTING 1155 1156### New Feature 1157- **Added:** Option to set itinerary default state (expanded or collapsed) 1158 - New setting in Admin → Calendar → Sidebar Widget Settings 1159 - " Itinerary Section" with two options: 1160 - **Expanded** (default) - Show itinerary sections by default 1161 - **Collapsed** - Hide itinerary sections by default (click bar to expand) 1162 - Setting persists across page loads 1163 - Arrow indicator and content state reflect the saved preference on page load 1164 1165## Version 6.8.0 (2026-02-11) - COLLAPSIBLE ITINERARY 1166 1167### New Feature 1168- **Added:** Collapsible Itinerary bar in sidebar week view 1169 - New "ITINERARY" bar below the week calendar (styled like +ADD EVENT bar) 1170 - Click to collapse/expand the Today, Tomorrow, and Important Events sections 1171 - Arrow indicator shows expanded (▼) or collapsed (►) state 1172 - Smooth animation when collapsing/expanding 1173 - Clicking a day in the week grid shows that day's events ABOVE the Itinerary bar 1174 - Selected day events remain visible whether itinerary is expanded or collapsed 1175 - Shows "No upcoming events" message when there are no itinerary items 1176 1177### UI Layout (top to bottom) 11781. Header with clock/system stats 11792. +ADD EVENT bar 11803. Week grid (7 days) 11814. Selected day's events (appears when clicking a day) 11825. ITINERARY bar (click to collapse/expand) 11836. Today section (collapsible) 11847. Tomorrow section (collapsible) 11858. Important Events section (collapsible) 1186 1187## Version 6.7.9 (2026-02-11) - FIX EVENTS MANAGER STATISTICS 1188 1189### Bug Fixes 1190- **Fixed:** Events Manager showing inflated count (1195 instead of ~605) 1191 - The `scanDirectoryForStats()` function was counting ALL entries in JSON files 1192 - Now properly filters to only count date keys (`YYYY-MM-DD` format) 1193 - Now validates events have `id` and `title` before counting 1194 - Click " Rescan" to update the statistics with correct count 1195 1196## Version 6.7.8 (2026-02-11) - FILTER INVALID EVENTS 1197 1198### Bug Fixes 1199- **Fixed:** Event Manager showing "(untitled)" and "mapping" entries 1200 - Root cause: Calendar JSON files contain metadata keys (like "mapping") that were being parsed as events 1201 - Added date format validation (`YYYY-MM-DD`) to skip non-date keys 1202 - Added validation to require `id` and `title` fields for events 1203 - Applied fix to all event-reading functions: 1204 - `getEventsByNamespace()` - main event listing 1205 - `scanNamespaceRecursive()` - namespace scanning 1206 - `searchEvents()` - event search 1207 - `findEventsByTitle()` - title lookup 1208 - `deleteRecurringSeries()` - recurring deletion 1209 - `renameRecurringSeries()` - recurring rename 1210 - Recurring events scanner 1211 - Recurring cleanup function 1212 1213### Technical Details 1214- Date keys must match pattern `/^\d{4}-\d{2}-\d{2}$/` 1215- Events must have non-empty `id` and `title` fields 1216- All other entries in JSON files are now skipped 1217 1218## Version 6.7.7 (2026-02-11) - FIX PHP PATH & CLEAR LOG 1219 1220### Bug Fixes 1221- **Fixed:** "sh: 1: '/usr/bin/php': not found" error - removed escapeshellarg() which was adding quotes around the PHP path 1222- **Fixed:** "Could not clear log file" - added better error messages showing exact issue 1223- **Improved:** findPhpBinary() now uses is_executable() and `which php` for detection 1224- **Improved:** clearLogFile() now shows specific error (file not found, not writable, etc.) 1225 1226## Version 6.7.6 (2026-02-11) - FIX SYNC CONTROLS & LOGGING 1227 1228### Bug Fixes 1229- **Fixed:** Double log entries - sync script logs internally, removed redundant stdout capture 1230- **Fixed:** Manual sync not appearing in log - removed `--verbose` flag since script logs directly 1231- **Fixed:** Better error messages when sync fails 1232 1233### Improvements 1234- **Improved:** Sync now runs without `--verbose` flag - script logs to file internally 1235- **Improved:** Crontab warning if `>>` redirect is detected (causes duplicate entries) 1236- **Improved:** Log viewer now shows full path to log file 1237- **Improved:** Better pre-flight checks (directory creation, file permissions) 1238- **Improved:** PHP binary path is now properly escaped 1239 1240### Crontab Update Required 1241If your crontab has `>> sync.log 2>&1`, remove it to prevent duplicate log entries: 1242 1243**Before (causes duplicates):** 1244``` 1245*/2 * * * * cd /var/www/html/dokuwiki/lib/plugins/calendar && php sync_outlook.php >> /var/www/html/dokuwiki/data/meta/calendar/sync.log 2>&1 1246``` 1247 1248**After (correct):** 1249``` 1250*/2 * * * * cd /var/www/html/dokuwiki/lib/plugins/calendar && php sync_outlook.php 1251``` 1252 1253The script automatically logs to `data/meta/calendar/sync.log`. 1254 1255## Version 6.7.5 (2026-02-11) - FIX SYNC LOG OUTPUT 1256 1257### Bug Fixes 1258- **Fixed:** Sync log not showing output when running sync from admin panel 1259 - Added `--verbose` flag to sync command so output is captured 1260 - Sync output is now captured and written to the log file 1261 - Log directory is created if it doesn't exist 1262 - Better error handling if log directory isn't writable 1263 - Command being executed is logged for debugging 1264 1265### Changes 1266- Sync now runs in verbose mode when triggered from admin panel 1267- All sync output (stdout/stderr) is written to the log file 1268- Pre-flight check ensures log directory exists and is writable 1269 1270## Version 6.7.4 (2026-02-11) - FIX MANUAL SYNC EXECUTION 1271 1272### Bug Fix 1273- **Fixed:** "Could not open input file: sync_outlook.php" when running manual sync 1274 - The `$pluginDir` variable was missing from `runSync()` function 1275 - Added `$pluginDir = DOKU_PLUGIN . 'calendar'` before building the command 1276 - Sync now properly changes to the plugin directory before executing 1277 1278## Version 6.7.3 (2026-02-11) - FIX ADDITIONAL COUNT TYPE ERRORS 1279 1280### Bug Fix 1281- **Fixed:** Additional TypeError "count(): Argument #1 ($value) must be of type Countable|array, int given" 1282 - Fixed in `scanDirectoryForStats()` (line 5453) 1283 - Fixed in namespace delete function (line 4137) 1284 - Fixed in export function (line 5516) 1285 - Fixed in import function (line 5636) 1286 - All locations now check `is_array()` before calling `count()` 1287 1288## Version 6.7.2 (2026-02-11) - FIX EVENT MANAGER TYPE ERROR 1289 1290### Bug Fix 1291- **Fixed:** TypeError "count(): Argument #1 ($value) must be of type Countable|array, int given" 1292 - Added array type checks when iterating over calendar event data 1293 - Protects against corrupted JSON data where event lists may not be arrays 1294 - Added safeguards in `getEventsByNamespace()` and `scanNamespaceRecursive()` 1295 1296## Version 6.7.1 (2026-02-11) - BULK DELETE FOR BACKUPS 1297 1298### Changed 1299- **Improved:** Backup management now uses bulk selection and delete 1300 - Added checkboxes next to each backup file 1301 - Added "Select All" checkbox in the action bar 1302 - Added "️ Delete Selected" button (appears when backups are selected) 1303 - Removed individual delete buttons from each row 1304 - Shows count of selected backups 1305 - Backups are deleted sequentially with visual feedback 1306 1307### UI 1308- Clean action bar at top of backup table with selection controls 1309- Selected count updates in real-time 1310- Rows fade out smoothly when deleted 1311 1312## Version 6.7.0 (2026-02-11) - IMPROVED RESTORE FUNCTION 1313 1314### Changed 1315- **Improved:** Restore function now uses DokuWiki's Extension Manager API 1316 - Uses `helper_plugin_extension_extension` for proper installation 1317 - Handles permissions correctly through DokuWiki's standard plugin installation process 1318 - Falls back to manual instructions if Extension Manager is not available 1319 1320### How It Works 1321When you click " Restore" on a backup: 13221. The plugin loads DokuWiki's extension helper 13232. Calls `installFromLocal()` with the backup ZIP file 13243. DokuWiki's Extension Manager handles file extraction and installation 13254. This ensures proper permissions and follows DokuWiki standards 1326 1327### Fallback 1328If the Extension Manager helper is not available, you'll be prompted to: 1329- Download the backup ZIP 1330- Go to Admin → Extension Manager → Install 1331- Upload the ZIP file manually 1332 1333## Version 6.6.9 (2026-02-11) - REMOVE RESTORE FUNCTION 1334 1335### Removed 1336- **Removed:** "Restore" button from backup management 1337- **Removed:** `restoreBackup()` PHP method 1338- **Removed:** `restoreBackup()` JavaScript function 1339 1340### Added 1341- **Added:** Informational note in backup section explaining how to restore: 1342 - Download the backup ZIP file 1343 - Go to Admin → Extension Manager → Install 1344 - Upload the ZIP file there 1345 - DokuWiki's extension manager handles installation safely with proper permissions 1346 1347### Reason 1348The restore function required write access to the plugin directory, which web servers typically don't have (and shouldn't have) for security reasons. Using DokuWiki's built-in Extension Manager is the safer and more reliable approach. 1349 1350## Version 6.6.8 (2026-02-11) - FIX THEME KEYS & FILE PERMISSIONS 1351 1352### Bug Fixes 1353- **Fixed:** "Undefined array key" warnings for wiki theme (pastdue_color, pastdue_bg, tomorrow_bg, etc.) 1354 - Added missing theme keys to `getWikiTemplateColors()` return array 1355 1356- **Fixed:** "Permission denied" errors for sync.log and sync_state.json 1357 - Moved sync files from plugin directory to `data/meta/calendar/` (writable location) 1358 - Updated sync_outlook.php, admin.php to use new paths 1359 - sync_config.php remains in plugin directory (must be manually configured) 1360 1361- **Fixed:** `findEventNamespace` now returns the actual DIRECTORY where event file lives 1362 - This ensures deletion works correctly when stored namespace differs from file location 1363 1364### Note on lang.php Permission Error 1365If you see a permission error for lang/en/lang.php, this occurs when trying to restore/update the plugin via admin panel and the web server doesn't have write access to the plugin directory. This is normal security - update via command line or FTP instead. 1366 1367## Version 6.6.7 (2026-02-11) - FIX NAMESPACE CHANGE BUG (PART 2) 1368 1369### Bug Fix 1370- **Fixed:** Events in the DEFAULT namespace (no namespace) could not be moved to other namespaces 1371 - Root cause: The comparison `$oldNamespace !== ''` was always FALSE for default namespace events 1372 - Changed to `$oldNamespace !== null` to properly distinguish between "event not found" (null) and "event in default namespace" ('') 1373 - This allows moving events FROM the default namespace TO any other namespace 1374 - Also fixed null coalescing for recurring events: `$oldNamespace ?? $namespace` instead of `$oldNamespace ?: $namespace` 1375 1376## Version 6.6.6 (2026-02-11) - FIX NAMESPACE CHANGE & DELETE BUGS 1377 1378### Bug Fixes 1379- **Fixed:** Changing an event's namespace now properly moves the event instead of creating a duplicate 1380 - Root cause: `findEventNamespace()` was searching in the NEW namespace instead of ALL namespaces 1381 - Now uses wildcard search `'*'` to find the existing event regardless of its current namespace 1382 1383- **Fixed:** Deleting an event no longer causes the calendar to filter by the deleted event's namespace 1384 - Root cause: After deletion, `reloadCalendarData()` was called with the deleted event's namespace 1385 - Now retrieves the calendar's original namespace from `container.dataset.namespace` 1386 - Also fixed in `saveEventCompact()` and `toggleTaskComplete()` for consistency 1387 1388## Version 6.6.5 (2026-02-11) - ADD AUTOCOMPLETE ATTRIBUTES 1389 1390### Improved 1391- Added `autocomplete="new-password"` to client secret input field 1392- Added `autocomplete="email"` to user email input field 1393- Added `autocomplete="off"` to client ID input field 1394- Follows browser best practices for form inputs 1395 1396## Version 6.6.4 (2026-02-11) - FIX GEOLOCATION VIOLATION 1397 1398### Bug Fix 1399- **Fixed:** Browser violation "Only request geolocation information in response to a user gesture" 1400- Weather widget now uses Sacramento as the default location on page load 1401- Geolocation is only requested when user **clicks** on the weather icon 1402- Click the weather icon to get your local weather (browser will prompt for permission) 1403- Weather icon shows tooltip "Click for local weather" and has pointer cursor 1404 1405## Version 6.6.3 (2026-02-11) - FIX MUTATIONOBSERVER ERROR 1406 1407### Bug Fix 1408- **Fixed:** `Failed to execute 'observe' on 'MutationObserver': parameter 1 is not of type 'Node'` error 1409- Root cause: MutationObserver tried to observe `document.body` before DOM was ready 1410- Added `setupMutationObserver()` function that waits for DOMContentLoaded before attaching observer 1411 1412## Version 6.6.2 (2026-02-11) - FIX CONFLICT TOOLTIP JAVASCRIPT LOADING 1413 1414### Bug Fix 1415- **Critical:** Fixed `showConflictTooltip is not defined` and `hideConflictTooltip is not defined` errors 1416- Root cause: `addAssets()` in action.php was loading empty `script.js` instead of `calendar-main.js` 1417- Changed `addAssets()` to load `calendar-main.js` directly 1418- Updated `script.js` to dynamically load `calendar-main.js` as a fallback mechanism 1419 1420## Version 6.6.1 (2026-02-11) - SECURITY FIXES 1421 1422### Security 1423- **Critical:** Removed `eval()` remote code execution vulnerability in config import 1424- **Critical:** Added admin authentication requirement to `get_system_stats.php` endpoint 1425- **High:** Added CSRF token verification to all write operations (save, delete, toggle) 1426- **High:** Fixed path traversal vulnerabilities in namespace delete/rename functions 1427- **High:** Added admin privilege verification to AJAX admin routes 1428 1429### Improved 1430- **Input Validation:** Date format (YYYY-MM-DD), time format (HH:MM), color format (#RRGGBB) 1431- **Input Validation:** Year range (1970-2100), month range (1-12), namespace format 1432- **Input Validation:** Recurrence type whitelist, title/description length limits 1433- **Debug Logging:** All debug logging now conditional on `CALENDAR_DEBUG` constant (off by default) 1434- **JSON Handling:** Added `safeJsonRead()` helper with proper error handling 1435- **Timezone:** Sync script now uses configured timezone instead of hardcoded value 1436 1437### Code Quality 1438- Documented intentional switch fallthrough in `get_system_stats.php` 1439- Standardized error response format 1440 1441## Version 6.6.0 (2026-02-11) - BACKUP & UI IMPROVEMENTS 1442 1443### Fixed 1444- **Backup:** Fixed recursive directory backup to properly include all subdirectories (including `lang/`) 1445- **Backup:** Now uses `SELF_FIRST` iterator to process directories before their contents 1446- **Backup:** Empty directories are now explicitly added with `addEmptyDir()` to preserve structure 1447 1448### UI Change 1449- **Namespace Explorer:** Cleanup status message now appears prominently at top of section 1450- Previously status message was at bottom, easy to miss after cleanup operations 1451 1452## Version 6.5.5 (2026-02-11) - FIX AJAX ROUTING & MOVE CLEANUP BUTTON 1453 1454### Bug Fix 1455- All admin AJAX actions (cleanup, rescan, extend, trim, pause, resume, change start/pattern) were returning "Unknown action" 1456- Root cause: AJAX calls go through `action.php`'s switch statement, not `admin.php`'s `handle()` method 1457- Added routing in `action.php`: new cases forward to `admin.php` via `routeToAdmin()` helper 1458- Added public `handleAjaxAction()` method in `admin.php` as the entry point from `action.php` 1459 1460### UI Change 1461- Moved " Cleanup" button from standalone section to inline next to "➕ New Namespace" in the control bar 1462- Status messages still appear below the namespace explorer 1463 1464## Version 6.5.4 (2026-02-11) - FIX PHP PARSE ERROR IN CLEANUP JS 1465 1466### Bug Fix 1467- Root cause: `style='color:...'` single quotes inside PHP `echo '...'` block terminated the PHP string prematurely 1468- PHP saw `color:#e74c3c` as unexpected PHP code instead of part of the JS string 1469- Fixed all 5 occurrences in cleanupEmptyNamespaces JS: escaped single quotes as `\'` 1470- Added `adminColors` JS object (text, bg, border) injected from PHP `$colors` at render time 1471- Cleanup detail text uses `adminColors.text` to respect DokuWiki template theme colors 1472 1473## Version 6.5.3 (2026-02-11) - FIX CLEANUP NAMESPACES PARSE ERROR 1474 1475### Bug Fix 1476- Fixed PHP parse error on line 1089 caused by `$colors['text']` PHP variable inside JS string concatenation 1477- The cleanup results detail list now uses hardcoded `#666` for text color instead of attempting PHP interpolation within JS runtime code 1478 1479## Version 6.5.2 (2026-02-11) - CLEANUP EMPTY NAMESPACES 1480 1481### New Feature 1482- " Cleanup Empty Namespaces" button added at bottom of Namespace Explorer section 1483- Dry-run scan first: shows exactly what will be removed with bullet-point details in confirm dialog 1484- Removes empty calendar folders (0 JSON files or all-empty JSON files) from any namespace 1485- Removes parent namespace directories if they become empty after calendar folder removal 1486- Root calendar directory is never removed 1487- AJAX-powered with inline status showing results after cleanup 1488- Page auto-reloads after 2 seconds to refresh the namespace explorer view 1489- Recursively scans all nested namespace directories via `findAllCalendarDirsRecursive()` 1490 1491## Version 6.5.1 (2026-02-11) - TRIM ALL PAST: SHOW COUNT BEFORE DELETE 1492 1493### Improved 1494- "Trim All Past" button now does a dry-run count before showing the confirmation dialog 1495- Confirmation shows exact count: "Found 47 past recurring events to remove" 1496- If zero found, shows "No past recurring events found to remove" instead of confirm 1497- PHP handler supports `dry_run` parameter that counts without deleting 1498 1499## Version 6.5.0 (2026-02-11) - BULK TRIM ALL PAST RECURRING EVENTS 1500 1501### Bulk Action 1502- Red "✂️ Trim All Past" button added next to the Rescan button in the Recurring Events section header 1503- Removes ALL past occurrences (before today) from EVERY recurring series in one click 1504- Only removes events with `recurring` or `recurringId` flags — non-recurring events are untouched 1505- Confirmation dialog required before execution 1506- AJAX-powered with inline status showing count removed, then auto-rescans the table 1507- Searches all calendar directories recursively 1508 1509## Version 6.4.9 (2026-02-11) - FIX RECURRING EDIT/DELETE: SEARCH ALL DIRECTORIES 1510 1511### Bug Fix 1512- Edit and Delete recurring series now search ALL calendar directories instead of building a path from the namespace field 1513- Root cause: event's `namespace` field (stored in JSON) can differ from the filesystem directory where the file lives 1514- Both handlers now use `findCalendarDirs()` to collect every calendar directory recursively 1515- Events matched by title AND namespace field (case-insensitive) for precise targeting 1516- Edit handler rewritten: rename/time/namespace updates in Pass 1, interval respace in Pass 2 1517- New `findCalendarDirs()` helper method for recursive directory discovery 1518 1519## Version 6.4.8 (2026-02-11) - FIX PHP PARSE ERROR IN MANAGE DIALOG 1520 1521### Bug Fix 1522- Rewrote `manageRecurringSeries()` JS function using string concatenation instead of template literals 1523- JS template literals (`${...}`) inside PHP echo blocks caused PHP to parse them as variable interpolation 1524- All inline onclick handlers now use `\x27` for single quotes to avoid escaping conflicts 1525 1526## Version 6.4.7 (2026-02-11) - RECURRING EVENTS: FULL MANAGEMENT CONTROLS 1527 1528### New "Manage" Button per Series 1529- Orange "Manage" button opens a comprehensive management dialog for each recurring series 1530 1531### Extend Series 1532- Add N new occurrences after the last event in the series 1533- Configurable interval: Daily, Weekly, Bi-weekly, Monthly, Quarterly, Yearly 1534- New events copy title, time, color, namespace, and recurring flag from the last event 1535 1536### Trim Past Events 1537- Remove all occurrences before a selected cutoff date 1538- Confirmation required before deletion 1539- Cleans up empty date keys and files automatically 1540 1541### Change Pattern 1542- Respace future occurrences with a new interval 1543- Past events are untouched; only future events are removed and re-created 1544- First future event becomes the anchor date 1545 1546### Change Start Date 1547- Shift ALL occurrences by the difference between old and new start date 1548- Events are removed from old positions and re-created at new positions 1549- Preserves spacing between all events 1550 1551### Pause/Resume 1552- Pause: adds ⏸ prefix and paused flag to all future occurrences 1553- Resume: removes ⏸ prefix and paused flag from all occurrences 1554- Button toggles based on whether series is currently paused 1555 1556### Infrastructure 1557- New shared `recurringAction()` JS helper for all AJAX management operations 1558- New `getRecurringSeriesEvents()` PHP helper for finding all events in a series 1559- Status messages shown inline in the management dialog 1560- Close button triggers automatic rescan to refresh the table 1561 1562## Version 6.4.6 (2026-02-11) - RECURRING EVENTS: RESCAN BUTTON & IMPROVED LOGIC 1563 1564### Rescan Button 1565- Green " Rescan" button added to the Recurring Events section header 1566- AJAX-powered: rescans all calendar data and refreshes the table without page reload 1567- Shows count of found series briefly after scan completes 1568 1569### Improved Detection Logic 1570- Events with `recurring: true` flag are now detected first (grouped by `recurringId`) 1571- Pattern-detected events (3+ same-title occurrences) are found separately and deduplicated 1572- New "Source" column shows ️ Flagged (has recurring flag) vs Detected (pattern match) 1573- Median interval used for pattern detection instead of just first two dates (more robust) 1574- New patterns recognized: Quarterly, Semi-annual, and "Every ~N days" for custom intervals 1575- Empty/invalid titles and malformed date arrays are now skipped safely 1576- Dates are deduplicated before counting (prevents inflated counts from multi-day events) 1577- Nested namespace directories now scanned recursively 1578- Results sorted alphabetically by title 1579 1580## Version 6.4.5 (2026-02-11) - ADMIN VERSION HISTORY OVERHAUL 1581 1582### Version History Viewer 1583- All purple (#7b1fa2) accent colors replaced with green (#00cc07) to match admin theme 1584- Changelog parser now handles `###` subsection headers (rendered as green bold labels) 1585- Plain `- ` bullet items now parsed and categorized under their subsection 1586- Previously only `- **Type:** description` format was recognized 1587 1588### Current Release Button 1589- Green "Current Release" button added between nav arrows 1590- Jumps directly to the card matching the running version from plugin.info.txt 1591- Running version card shows green "RUNNING" badge and thicker green border 1592 1593## Version 6.4.4 (2026-02-11) - WIKI THEME: PAST EVENTS TOGGLE BACKGROUND 1594 1595### Fix 1596- Wiki theme past events pulldown (retracted state) now uses `__background_neu__` (`--cell-today-bg`) 1597- Previously used `--cell-bg` which appeared unthemed/white 1598 1599## Version 6.4.3 (2026-02-11) - WIKI THEME: DAY HEADERS BACKGROUND 1600 1601### Fix 1602- Wiki theme SMTWTFS day headers now use `__background_neu__` (`--cell-today-bg`) instead of `--background-header` 1603 1604## Version 6.4.2 (2026-02-11) - WIKI THEME: DAY HEADERS (INITIAL) 1605 1606### Wiki Theme Day Headers 1607- Added explicit CSS override for `.calendar-theme-wiki .calendar-day-headers` 1608- Day header text uses `--text-primary` (template's `__text__` color) 1609 1610## Version 6.4.1 (2026-02-11) - WIKI THEME: EVENT HIGHLIGHT 1611 1612### Fix 1613- Wiki theme event highlight (when clicking calendar bar) now uses `themeStyles.header_bg` (`__background_alt__`) instead of hardcoded blue (#dce9f5) 1614- Subtle shadow instead of blue glow 1615 1616## Version 6.4.0 (2026-02-11) - DARK READER: SECTION BAR COLOR MATCHING 1617 1618### Fix 1619- Wiki theme section left bar now uses a `<div>` with `background` instead of `border-left` 1620- Dark Reader maps the same color differently for border vs background properties, causing visual mismatch 1621- Both the bar and header now use `background`, so Dark Reader maps them identically 1622- Flex layout wrapper added for wiki theme sections 1623- Wiki fallback colors updated: `border` key now uses `#ccc` (matching `__border__`) instead of `#2b73b7` 1624 1625## Version 6.3.9 (2026-02-10) - WIKI THEME: SECTION BAR FIX (ATTEMPT) 1626 1627### Fix 1628- Simplified wiki section container — removed `wiki-section-container` class 1629- Added `background` from `$themeStyles['bg']` to section container 1630 1631## Version 6.3.8 (2026-02-10) - WIKI THEME: BUTTON & SECTION HEADER COLORS 1632 1633### Wiki Theme Buttons 1634- Nav buttons (< >), Today button, and panel buttons now use `__link__` color background with white text 1635- CSS overrides for `.calendar-theme-wiki .cal-nav-btn`, `.cal-today-btn`, panel buttons 1636 1637### Wiki Theme Section Headers 1638- Today: `__link__` background (accent/link color) 1639- Tomorrow: `__background_alt__` background (alternate background) 1640- Important: `__border__` background (border color) 1641- Each section now has a distinct color from the template palette 1642 1643## Version 6.3.7 (2026-02-10) - WIKI THEME CHECKBOX FIX 1644 1645### Fix 1646- Wiki theme checkbox override changed from `border-color` to full `border: 2px solid` shorthand 1647- Properly overrides the base rule which uses `border` shorthand 1648- Hover state also uses full shorthand 1649 1650## Version 6.3.6 (2026-02-10) - WIKI THEME CHECKBOX BORDER COLOR 1651 1652### Fix 1653- Wiki theme unchecked checkboxes now use `--border-main` (template's `__border__` color) for border 1654- Checked state fills with border color 1655- Hover state uses border color 1656- Applied to calendar, sidebar, and eventlist containers 1657 1658## Version 6.3.5 (2026-02-10) - WIKI THEME: ALLOW DARK READER ON HEADERS 1659 1660### Fix 1661- Wiki theme section headers (Today/Tomorrow/Important) no longer use `!important` or `-webkit-text-fill-color` 1662- Dark Reader can now freely adjust background, text color, and borders on wiki theme headers 1663- Clicked-day panel header and section border-left also unlocked for wiki theme 1664- All other themes (matrix/purple/pink/professional) retain full Dark Reader protection 1665 1666## Version 6.3.4 (2026-02-10) - WIKI THEME: BORDER COLOR FOR HEADERS & BADGES 1667 1668### Wiki Theme Color Remapping 1669- `border` (accent color) now maps to template's `__border__` instead of `__link__` 1670- This affects: section headers (Today/Tomorrow/Important), badges (TODAY, namespace), sidebar widget border, clicked-day panel, `--border-main` CSS variable 1671- `text_bright` still maps to `__link__` for link text and accent text 1672- Section headers all use the same `__border__` color for consistent appearance 1673- Updated COLOR_SCHEME mapping documentation 1674 1675## Version 6.3.3 (2026-02-10) - WIKI THEME SECTION HEADER TEXT COLOR 1676 1677### Fix 1678- Wiki theme Today/Tomorrow/Important section header text now uses `$themeStyles['text_primary']` (mapped from template's `__text__` color) instead of hardcoded white 1679- Clicked-day panel header text also uses template text color for wiki theme 1680- Professional theme remains white text on blue headers 1681 1682## Version 6.3.2 (2026-02-10) - FIX THEME NOT UPDATING ON SIDEBAR EVENTLIST 1683 1684### Bug Fix 1685- Added `$renderer->nocache()` to the render function 1686- DokuWiki was caching the rendered sidebar HTML, so theme changes made in admin were never reflected until the page was manually edited 1687- Now all calendar/eventlist/eventpanel outputs are rendered fresh on each page load, picking up the current theme from `calendar_theme.txt` 1688 1689## Version 6.3.1 (2026-02-10) - EVENTLIST THEMING 1690 1691### {{eventlist}} Theme Support 1692- Eventlist containers now receive theme class (`eventlist-theme-matrix`, etc.) and full CSS variable injection 1693- Dark themes get themed border + glow, light themes get subtle border 1694- Container background set from `$themeStyles['bg']` with `!important` 1695 1696### Eventlist CSS Theme Rules (all 3 dark themes) 1697- Title, header, time, date, body, links, strong, code, namespace badge, empty state 1698- Today header, clock, date — all with `color` + `-webkit-text-fill-color` `!important` 1699- Item borders, section backgrounds, code block backgrounds 1700- Full Dark Reader protection via same inline+CSS approach as calendar/sidebar 1701 1702## Version 6.3.0 (2026-02-10) - DARK READER COMPATIBILITY & COMPLETE THEMING 1703 1704### Dark Reader Browser Extension Compatibility 1705All dark themes (Matrix, Purple, Pink) now render correctly when the Dark Reader browser extension is active. The approach uses targeted inline `!important` styles and `-webkit-text-fill-color` overrides — no page-wide locks, no blanket CSS resets, no filter manipulation. 1706 1707**Protected elements:** 1708- Section headers (Today/Tomorrow/Important) — background, text color, text-fill-color 1709- Clicked-day panel header — background, text color, close button 1710- All badges (TODAY, PAST DUE, namespace, panel namespace, eventlist-simple) — background, text, text-fill-color 1711- Event titles, meta, descriptions — color with !important via CSS 1712- Day numbers, nav buttons, calendar day headers — color with !important via CSS 1713- System status bars — inline background !important on tracks and fills 1714- System tooltips — background, border-color, text color all set via setProperty with !important 1715- Section left border bars — border-left with !important 1716- Event color indicator bars — border-left-color with !important 1717- Sidebar section event text (Purple and Pink themes) 1718 1719### Complete CSS Variable Audit (41 conversions in v6.1.1) 1720- All remaining hardcoded colors in style.css converted to CSS variable references 1721- Calendar borders, text colors, backgrounds, input focus shadows, accent borders 1722- Only legitimate hardcodes remain (keyframe animations, theme-specific override blocks) 1723 1724### Semantic Color System 1725- New CSS variables: `--pastdue-color`, `--pastdue-bg`, `--pastdue-bg-strong`, `--pastdue-bg-light` 1726- New CSS variables: `--tomorrow-bg`, `--tomorrow-bg-strong`, `--tomorrow-bg-light` 1727- Injected into all 3 CSS var blocks (full calendar, event panel, sidebar widget) 1728- Today/Tomorrow/Important section colors now theme-derived instead of hardcoded 1729 1730### Section Headers Fully Themed 1731- Today/Tomorrow/Important headers use theme accent colors instead of fixed green/orange/purple 1732- Matrix: bright/standard/dim green, Purple: bright/standard/dim purple, Pink: hot/medium/light pink 1733- Professional: blue shades, Wiki: template-derived colors 1734- Dark theme headers use dark background color for text contrast 1735 1736### Pink Theme Enhancements 1737- **Heart today indicator** — day number displayed inside a ♥ with hot pink glow, centered via inline-flex, `pink-heart-beat` animation with realistic double-beat pulse 1738- **Firework button hover** — `pink-firework-burst` keyframe animation with multi-point radiating box-shadows, scale/brightness effects on hover, instant flash on click 1739- **Checkbox glow** — hot pink border with ambient glow, hover intensifies, checked fills with glow 1740 1741### All Theme Checkbox Theming 1742- Matrix: bright green border + green glow, Purple: purple border + purple glow 1743- Pink: hot pink border + pink glow (with enhanced ambient effect) 1744- Hover scales 1.1x with intensified glow on all themes 1745- Checked state fills with theme accent color + outer glow 1746 1747### System Tooltips Themed 1748- Both tooltip functions use theme-derived colors from `$themeStyles` 1749- Green tooltip: `text_bright`, Purple: `border`, Orange: `text_primary` 1750- Background from `$themeStyles['bg']`, divider borders use theme accent colors 1751- All properties set with `style.setProperty(prop, value, "important")` 1752 1753### Namespace Filter Badge Cleanup 1754- Removed inline namespace badge from event side panel header 1755- Filter indicator bar ("Filtering: namespace ✕") retained and working 1756- AJAX-based namespace filtering fully functional via onclick handlers 1757 1758## Version 6.1.0 (2026-02-10) - TODAY INDICATOR, BUTTON HOVER & CHECKBOXES 1759 1760### Today Indicator 1761- **Added:** Today's day number now shows as a filled circle with theme accent color background and contrasting text (like Google Calendar's today indicator) 1762- **Added:** Today cell has `--cell-today-bg` background AND a visible inset border glow on hover using `--border-main` 1763- **Added:** `.day-num` now uses `--text-primary` for color instead of relying on browser default 1764 1765### Button Hover/Click Theming 1766- **Fixed:** All buttons now use `filter: brightness(1.3)` on hover for a visible glow effect across all themes 1767- **Fixed:** All buttons use `filter: brightness(0.85)` on click/active for a press-down darkening effect 1768- **Fixed:** Cal nav buttons (‹/›), Today button, +Add Event button, panel nav/today/add buttons, dialog Save/Cancel buttons, month picker Go/Cancel buttons, popup + Add Event button — ALL now have visible themed hover/click feedback with shadow 1769- **Removed:** Generic `opacity: 0.9` hover which was barely visible on dark themes 1770 1771### Checkboxes Themed 1772- **Added:** Custom checkbox styling for `.task-checkbox` — uses `appearance: none` with themed border (`--border-main`), hover glow, and filled accent background when checked with ✓ mark 1773- **Added:** `accent-color: var(--text-bright)` on all dialog checkboxes (task, recurring) for consistent theme coloring 1774 1775### Form Input Text 1776- **Fixed:** `.input-sleek` now has `color: var(--text-primary)` — form text is visible on dark themes 1777- **Added:** `::placeholder` styling for inputs/textareas using `--text-dim` 1778 1779## Version 6.0.9 (2026-02-09) - FORM TEXT, CELL HOVER & GLOW TUNING 1780 1781### Form Input Text Fix 1782- **Fixed:** Form input text (`input-sleek`, `textarea-sleek`, `select`) had no `color` property — browser defaulted to black, invisible on dark themes. Now uses `var(--text-primary)`. 1783- **Added:** Themed placeholder text (`::placeholder`) for inputs/textareas 1784 1785### Button & Cell Hover Theming 1786- **Added:** Calendar day cells (`.cal-day`) now have a themed hover effect — background shifts to `--cell-today-bg` with an inset border glow using `--border-main` 1787- **Improved:** Nav buttons (`◄`/`►`) and Today button hover now show a themed glow + scale effect instead of just opacity change 1788- **Added:** Active (click) state for nav/today buttons with scale-down feedback 1789- **Improved:** Month picker hover now also shows a subtle theme shadow 1790 1791### Glow Reduced to 1px for Matrix/Purple 1792- Matrix and purple text glow reduced from 2px to 1px across: event titles, descriptions, meta, links, sidebar day numbers, sidebar event titles, sidebar dates 1793- Matrix clock pulse animation reduced from 6px/10px+15px to 2px/4px+6px 1794- Weather text glow reduced to 1px, clock to 2px 1795- Pink remains at 2px (barely noticeable) 1796 1797## Version 6.0.8 (2026-02-09) - LINKS, GLOW CONSISTENCY & PINK TONE-DOWN 1798 1799### Links Themed 1800- **Added:** `.cal-link` CSS class — all links rendered via `renderDescription()` now pick up theme accent color via `--text-bright` 1801- **Fixed:** Sidebar widget links (`a.cal-link`) inherit theme colors 1802- **Fixed:** Event list widget description links (`eventlist-widget-desc a`) use CSS vars 1803- **Fixed:** Simple event list body links/strong/code all themed 1804 1805### Text Glow Consistency 1806- **Added:** Subtle `text-shadow: 0 0 2px` glow on event titles, meta, and descriptions for all three dark themes (matrix, purple, pink) in the main calendar and event panel 1807- **Added:** Subtle link glow on dark themes 1808- **Added:** Matrix and purple now get the same barely-visible text glow that pink had on sidebar week grid day numbers and event titles 1809 1810### Pink Glow Toned Down 1811- **Reduced:** Sidebar today header box-shadow from `0 0 10px 0.4` to `0 0 6px 0.25` 1812- **Reduced:** Day number sparkle animation from 3px/6px+10px to 2px/3px 1813- **Reduced:** Today cell shimmer from 3px+5px / 8px+12px to 2px+3px / 4px+6px 1814- **Reduced:** Event bar glow pulse from 2px/4px+6px to 1px/2px+3px 1815- **Reduced:** Today hover glow from 10px+15px to 5px+8px 1816- **Reduced:** Event item glow from 2px/5px to 1px/3px 1817- **Reduced:** Calendar container glow from 8px to 5px 1818 1819### Other 1820- **Themed:** Sidebar weather, date, and clock text colors and glow via CSS vars 1821 1822## Version 6.0.7 (2026-02-09) - BADGES, BUTTONS & CONFLICT THEMING 1823 1824- **Fixed:** Namespace badges (`.namespace-badge`, `.event-namespace-badge`, `.panel-ns-badge`, standalone header badge) — all now use theme accent colors instead of hardcoded green/blue 1825- **Fixed:** TODAY badge uses `--border-main` for background instead of hardcoded purple 1826- **Fixed:** Conflict alert badge (`⚠️`) uses `--border-main` background and `--text-bright` border — matches theme accent 1827- **Fixed:** Conflict tooltip header background now set inline from theme vars (tooltip is appended to body, can't inherit CSS vars) 1828- **Fixed:** Conflict tooltip body items use themed text and border colors 1829- **Fixed:** Month picker Go/Cancel buttons themed (`--text-bright` for save, `--cell-bg` for cancel) 1830- **Fixed:** Calendar header month/year hover uses `--cell-today-bg` background 1831- **Fixed:** Inline search input border uses `--border-color` 1832- **Fixed:** Event list header border uses `--border-color` 1833 1834## Version 6.0.6 (2026-02-09) - COMPLETE TEXT THEMING 1835 1836- **Fixed:** Calendar header month/year title had hardcoded dark color — now uses `--text-primary` 1837- **Fixed:** Month/year picker hover used hardcoded gray background and green text — now uses `--cell-today-bg` and `--text-bright` 1838- **Fixed:** Event list items (titles, meta, descriptions, links, code blocks, bold text) — all now theme-aware via CSS vars 1839- **Fixed:** Completed/past event states used hardcoded grays — now use `--cell-bg`, `--text-dim`, `--cell-today-bg` 1840- **Fixed:** Scrollbar track/thumb colors now use theme vars 1841- **Fixed:** Namespace filter indicator (background, label, badge, close button) — all themed 1842- **Fixed:** Panel standalone month picker hover and namespace badge — themed 1843- **Fixed:** Calendar header border-bottom — now uses `--border-color` 1844 1845## Version 6.0.5 (2026-02-09) - THEMED BORDERS & EVENT PANEL 1846 1847- **Added:** Theme-colored border and glow for calendar container on matrix, purple, and pink themes — matches the sidebar widget's `2px solid` + `box-shadow` glow style. Professional and wiki themes unchanged (keep subtle 1px gray border). 1848- **Added:** Theme-colored border and glow for event panel (`{{eventpanel}}`) on dark themes using `[data-theme]` attribute selectors 1849- **Themed:** Event panel header (nav buttons, month title, today button, search input, add button) — all now use CSS vars 1850- **Themed:** Panel standalone header background and border 1851 1852## Version 6.0.4 (2026-02-09) - FULL DIALOG THEMING 1853 1854- **Fixed:** Day cell click popup (day-popup) used hardcoded white/gray colors — now fully theme-aware using CSS variables 1855- **Fixed:** Event add/edit dialog (dialog-content-sleek) had hardcoded white background and blue header — now uses theme colors 1856- **Fixed:** Month picker dialog had hardcoded white background and dark text — now themed 1857- **Fixed:** Popup event items, titles, times, descriptions, footer, add-event button, close button — all now use CSS vars with sensible fallbacks 1858- **Fixed:** Form elements (field labels, inputs, checkboxes, recurring options, color pickers) — all reference theme CSS vars 1859- **How it works:** `propagateThemeVars()` copies CSS variables from the calendar container to dialogs/popups (which are `position:fixed` or appended to `document.body`). All CSS selectors now reference these variables with fallbacks for graceful degradation. 1860 1861## Version 6.0.3 (2026-02-09) - MOVE IMPORTANT NAMESPACES TO MANAGE TAB 1862 1863- **Moved:** Important Namespaces section from Outlook Sync tab to Manage Events tab (between Events Manager and Cleanup sections) 1864- **Changed:** Section header color from purple (#9b59b6) to green (#00cc07) to match other Manage tab sections 1865- **Added:** Dedicated Save button and `save_important_namespaces` action handler — setting is now independent of Outlook config save 1866- **Fixed:** Saving Outlook config no longer overwrites important namespaces with the default value 1867 1868## Version 6.0.2 (2026-02-09) - FIREFOX DAY HEADER FIX 1869 1870- **Fixed:** In Firefox, the SMTWTFS day-of-week header row was rendering at the same height as calendar day cells (58px instead of 22px). Firefox ignores `max-height` on `<th>` table cells per CSS spec. Replaced `<thead><tr><th>` with a CSS grid `<div>` outside the table, making header height fully independent of table cell sizing. Works consistently across Chrome, Firefox, Safari, and Edge. 1871 1872## Version 6.0.1 (2026-02-09) - THEME PARAMETER FIX 1873 1874- **Fixed:** `theme=wiki` (and all `theme=` parameters) had no effect — all three render functions (`renderCompactCalendar`, `renderEventPanelOnly`, `renderSidebarWidget`) were ignoring the syntax parameter and always reading the admin global default via `getSidebarTheme()` 1875- **Fixed:** `renderEventDialog` also ignored theme context — now receives theme from its caller 1876- **How it works now:** `{{calendar theme=wiki}}`, `{{eventlist sidebar theme=purple}}`, `{{eventpanel theme=professional}}` all correctly apply the specified theme. The admin-configured default is used as fallback only when no `theme=` parameter is present. 1877 1878 1879## Version 6.0.0 (2026-02-09) - CODE AUDIT & v6 RELEASE 1880 1881- **Audited:** All PHP files (syntax.php, action.php, admin.php, sync_outlook.php) — balanced braces confirmed 1882- **Audited:** calendar-main.js (2,840 lines) — Node syntax check passed, 44 global functions verified 1883- **Audited:** style.css (3,218 lines) — balanced braces confirmed 1884- **Audited:** All admin manage tab action handlers verified functional (13 actions) 1885- **New:** Fresh README.md for GitHub with complete documentation 1886- **Includes all v5.5.x fixes:** 1887 - Delta sync for Outlook (hash-based change tracking, O(changes) not O(total)) 1888 - Wiki theme sidebar section headers: distinct colors, no glow, themed day-click panel 1889 - Conflict badges on past events after AJAX navigation 1890 - Admin panel: green cleanup header, fixed broken CSS, endTime field name, cache clearing for all mutations, empty file cleanup, dead code removal 1891 1892## Version 5.5.9 (2026-02-09) - ADMIN MANAGE TAB CLEANUP 1893 1894- **Fixed:** Cleanup Old Events section header now green (#00cc07) to match all other section headers 1895- **Fixed:** Recurring stat card had broken CSS from `$colors['bg'] . '3e0'` concatenation — now uses proper `#fff3e0` 1896- **Fixed:** Same broken CSS pattern in Outlook Sync tab log warning 1897- **Fixed:** `editRecurringSeries` wrote `end_time` instead of correct `endTime` field name 1898- **Fixed:** `editRecurringSeries` used uninitialized `$firstEventDate` variable — now properly declared 1899- **Fixed:** `moveEvents` and `moveSingleEvent` could crash if event date key didn't exist in JSON — added `isset()` check 1900- **Fixed:** `moveSingleEvent` now cleans up empty date keys and deletes empty files after moving 1901- **Fixed:** `deleteRecurringSeries` now cleans up empty date keys and deletes empty JSON files 1902- **Fixed:** Export version was hardcoded as '3.4.6' — now reads dynamically from plugin.info.txt 1903- **Added:** `clearStatsCache()` helper method — all 11 mutation functions now properly clear the event stats cache 1904- **Removed:** Dead `move_events` action handler (all forms use `move_selected_events`) 1905- **Removed:** `console.log` debug statements from `sortRecurringTable` and `editRecurringSeries` 1906- **Removed:** Stale "NEW!" comment from Events Manager section 1907 1908## Version 5.5.8 (2026-02-09) - DELTA SYNC & WIKI THEME SIDEBAR POLISH 1909 1910- **Added:** Outlook sync now uses hash-based delta tracking — only new, modified, or deleted events hit the API 1911- **Added:** computeEventHash() hashes all sync-relevant fields (title, description, time, date, color, namespace, task status) 1912- **Added:** Sync state v2 format stores {outlookId, hash} per event; auto-migrates from v1 on first run 1913- **Added:** Delta analysis summary shows new/modified/unchanged/deleted counts before syncing 1914- **Changed:** Unchanged events are completely skipped (zero API calls) — O(changes) instead of O(total) 1915- **Changed:** Removed per-run duplicate scan (was re-querying every event); use --clean-duplicates when needed 1916- **Changed:** Wiki theme sidebar section headers now use distinct colors: orange (Today), green (Tomorrow), purple (Important) 1917- **Fixed:** Wiki theme sidebar section headers no longer have colored glow — clean shadow instead 1918- **Fixed:** Wiki theme week grid day-click panel header now uses accent color with white text 1919- **Fixed:** Removed invalid var(--__...__) CSS syntax from inline styles (only works in CSS files, not HTML attributes) 1920 1921## Version 5.5.7 (2026-02-09) - WIKI THEME SIDEBAR POLISH 1922 1923- **Fixed:** Sidebar Today/Tomorrow/Important headers now use three distinct colors (orange/green/purple) instead of similar greys 1924- **Fixed:** Sidebar section headers no longer glow on wiki theme (clean shadow like professional) 1925- **Fixed:** Week grid day-click panel header now uses theme accent color with white text instead of grey background 1926- **Fixed:** Removed invalid var(--__...__) CSS variable syntax from inline styles (DokuWiki replacements only work in CSS files) 1927- **Changed:** Wiki theme section header text now white for readability on colored backgrounds 1928- **Changed:** Week grid JS theme colors now use actual $themeStyles values 1929 1930## Version 5.5.6 (2026-02-09) - FIX CONFLICT BADGES ON PAST EVENTS AFTER AJAX 1931 1932- **Fixed:** Conflict badges now render on past events in JS rebuild path (were only in the future events branch) 1933 1934## Version 5.5.5 (2026-02-09) - FIX SIDEBAR CONFLICT TOOLTIP POSITIONING 1935 1936- **Fixed:** Sidebar widget conflict tooltips now display next to the badge instead of upper-left corner 1937- **Fixed:** Week grid conflict tooltips also fixed (same issue) 1938- **Changed:** All conflict badges now use unified showConflictTooltip() system with base64-encoded data 1939- **Removed:** data-tooltip CSS pseudo-element approach for conflict badges (replaced with JS tooltip) 1940 1941## Version 5.5.4 (2026-02-09) - FIX PAST EVENT EXPAND ON FIRST LOAD 1942 1943- **Fixed:** Past events now expand on click from initial page load (PHP-rendered items were missing onclick="togglePastEventExpand(this)" handler that the JS-rebuilt version had) 1944 1945## Version 5.5.3 (2026-02-09) - FIX CONFLICT TOOLTIP THEME COLORS 1946 1947- **Fixed:** Conflict tooltip now finds calendar container even when badge is inside day popup (appended to body) 1948- **Fixed:** Empty CSS variable values no longer produce invisible text — fallback defaults applied when var returns empty string 1949 1950## Version 5.5.2 (2026-02-09) - FIX CONFLICT TOOLTIP JSON PARSING 1951 1952- **Fixed:** Conflict tooltip data now base64-encoded to eliminate JSON parse errors from attribute quote escaping 1953- **Fixed:** Removed double htmlspecialchars encoding on conflict titles in PHP (was escaping titles then re-escaping the JSON) 1954- **Changed:** Both PHP and JS conflict badge rendering now use base64 for data-conflicts attribute 1955- **Changed:** showConflictTooltip decodes base64 first, falls back to plain JSON for compatibility 1956 1957## Version 5.5.1 (2026-02-09) - AJAX ROBUSTNESS & DIALOG THEMING 1958 1959- **Fixed:** Conflict tooltip badges now work after AJAX month navigation via event delegation 1960- **Fixed:** All document-level event listeners guarded against duplicate attachment from multiple script loads 1961- **Fixed:** showConflictTooltip closest() selector now matches actual container IDs (cal_, panel_, sidebar-widget-) 1962- **Fixed:** Description textarea in add/edit dialog now 2 lines tall instead of 1 1963- **Added:** Event delegation for conflict badge mouseenter/mouseleave (capture phase) survives DOM rebuilds 1964- **Added:** ESC key now also closes day popups and conflict tooltips 1965- **Changed:** Namespace click filter handler wrapped in guard to prevent duplicate binding 1966 1967## Version 5.5.0 (2026-02-09) - CSS VARIABLE REFACTOR & THEME CONSISTENCY 1968 1969- **Refactored:** All theming now driven by 15 CSS custom properties injected per calendar instance 1970- **Refactored:** Removed ~85 inline styles from syntax.php and ~41 from calendar-main.js 1971- **Refactored:** style.css is now the single source of truth for all visual styling 1972- **Fixed:** Day popup (click cell) now fully themed — CSS vars propagated from container 1973- **Fixed:** Add/Edit event dialog now themed in all contexts (main calendar, eventlist panel, sidebar widget) 1974- **Fixed:** Popup footer and "+ Add Event" button were using inline themeStyles — now use CSS vars 1975- **Added:** CSS variable injection for {{eventlist panel}} containers 1976- **Added:** CSS variable injection for {{eventlist sidebar}} widget containers 1977- **Added:** propagateThemeVars() helper ensures dialogs/popups always get theme regardless of DOM position 1978- **Added:** Wiki template mapping reads __link__ as accent color from style.ini 1979- **Added:** Detailed CSS variable reference table in style.css header comment 1980- **Added:** Detailed style.ini → CSS variable mapping documentation in syntax.php 1981- **Changed:** Conflict tooltip reads CSS vars via getComputedStyle instead of data-themeStyles 1982- **Changed:** Admin changelog now uses paginated timeline viewer instead of tiny scrolling div 1983- **Removed:** Dark Reader MutationObserver compatibility (CSS vars natively compatible) 1984- **Removed:** $isWikiTheme branching from PHP render path 1985 1986## Version 5.3.6 (2026-02-09) - HEARTS + CSS BACKGROUND FIX! 1987 1988### Added: Hearts in Explosions! 1989- **Added:** 8-12 pink hearts in each click explosion 1990- **Added:** Random sizes (12-28px) and directions 1991- **Result:** Extra love in every click! 1992 1993### Fixed: Background CSS Property for Dark Mode Readers 1994- **Fixed:** Added `background: transparent` to CSS (was completely removed) 1995- **Fixed:** Now CSS readers can detect and modify background property 1996- **Why:** Inline styles override transparent, but CSS readers can now see the property 1997- **Result:** Dark mode plugins can now change calendar backgrounds! 1998 1999### The CSS Problem 2000 2001**Why backgrounds weren't changing with dark mode readers**: 2002 2003**Before (v5.3.5)**: 2004```css 2005.calendar-compact-grid tbody td { 2006 /* background removed - set via inline style */ 2007 border: 1px solid... 2008} 2009``` 2010 2011**Problem**: CSS property doesn't exist! 2012- Dark mode readers look for `background` property in CSS 2013- Can't override what doesn't exist 2014- Inline styles work, but readers can't modify them 2015 2016**After (v5.3.6)**: 2017```css 2018.calendar-compact-grid tbody td { 2019 background: transparent; /* Now exists! */ 2020 border: 1px solid... 2021} 2022``` 2023 2024**Solution**: 2025- Property exists in CSS 2026- Dark mode readers can override it 2027- Inline styles still override transparent 2028- Everyone wins! 2029 2030### What's Fixed 2031 2032**Elements now have background property**: 2033- `.calendar-compact-grid tbody td` ✓ 2034- `.calendar-compact-grid tbody td:hover` ✓ 2035- `.event-compact-item` ✓ 2036- `.event-compact-item:hover` ✓ 2037 2038**How it works**: 20391. CSS sets `background: transparent` (default) 20402. Inline styles set actual color (overrides transparent) 20413. Dark mode readers can override CSS property 20424. Works for everyone! 2043 2044### Hearts in Explosion 2045 2046**Click anywhere → Hearts explode!** 2047 2048**Heart details**: 2049- Count: 8-12 per explosion (random) 2050- Size: 12-28px (random variety) 2051- Emoji: (pink heart) 2052- Direction: Random 360° 2053- Speed: 60-140px travel 2054- Duration: 0.8-1.2s 2055- z-index: 9999999 (always visible) 2056 2057**Combined with**: 2058- 25 glowing particles 2059- 40 pixel sparkles 2060- Bright flash 2061- **Total: 73-77 elements!** 2062 2063### Visual Result 2064 2065**Click explosion**: 2066``` 2067 ✦ • ✦ 2068 • • 2069✦ • ! • ✦ 2070 • • 2071 ✦ • ✦ 2072 2073Hearts + Particles + Pixels! 2074``` 2075 2076**Dark mode now works**: 2077```css 2078/* Dark mode reader can now do this: */ 2079.calendar-compact-grid tbody td { 2080 background: #000 !important; /* Works! */ 2081} 2082``` 2083 2084### Why Transparent Works 2085 2086**CSS Cascade**: 20871. CSS: `background: transparent` (lowest priority) 20882. Inline style: `background: #f5f5f5` (overrides CSS) 20893. Dark mode CSS: `background: #000 !important` (overrides inline) 2090 2091**Perfect solution!** ✓ 2092 2093## Version 5.3.5 (2026-02-09) - PARTICLES ABOVE DIALOGS! 2094 2095### Fixed: Particles Now Appear Above All Dialogs! 2096- **Fixed:** Increased z-index to 9999999 for all particles 2097- **Fixed:** Particles now visible above event dialogs, month picker, etc. 2098- **Result:** Cursor effects and explosions always visible! 2099 2100### The Z-Index Problem 2101 2102**Before (v5.3.4)**: 2103- Particles: z-index 9999 2104- Dialogs: z-index 10000-999999 2105- **Particles hidden behind dialogs!** 2106 2107**After (v5.3.5)**: 2108- Particles: z-index 9999999 2109- Trail: z-index 9999998 2110- Pixels: z-index 9999997 2111- **Particles ALWAYS on top!** 2112 2113### What's Fixed 2114 2115✅ **Main particles** (explosion orbs) 2116✅ **Cursor trail** (glowing dots) 2117✅ **Pixel sparkles** (tiny bright stars) 2118✅ **Flash effect** (click burst) 2119 2120**All now appear above**: 2121- Event dialog popups 2122- Month picker 2123- Day popups 2124- Any modal overlays 2125 2126### Visual Result 2127 2128**Moving cursor over dialog**: 2129``` 2130┌─────────────────────┐ 2131│ Event Dialog │ 2132│ ✦ • ✦ │ ← Sparkles visible! 2133│ → ✦ │ ← Cursor trail visible! 2134│ • ✦ • │ 2135└─────────────────────┘ 2136``` 2137 2138**Clicking on dialog**: 2139``` 2140┌─────────────────────┐ 2141│ ✦ • ✦ • ✦ │ 2142│ • ! • │ ← Explosion visible! 2143│ ✦ • ✦ • ✦ │ 2144└─────────────────────┘ 2145``` 2146 2147**Perfect visibility everywhere!** ✨ 2148 2149## Version 5.3.4 (2026-02-09) - THEMED MONTH PICKER + DIALOG CURSOR FIX 2150 2151### Fixed: Month Picker Now Themed! 2152- **Fixed:** Jump to Month dialog now uses theme colors 2153- **Fixed:** Dialog background, borders, text all themed 2154- **Fixed:** Select dropdowns use theme colors 2155- **Fixed:** Buttons use theme accent colors 2156- **Result:** Month picker matches calendar theme! 2157 2158### Fixed: Cursor Effects Work in Dialogs! 2159- **Fixed:** Cursor trail now works when hovering over dialogs 2160- **Fixed:** Click explosions work when clicking inside dialogs 2161- **Technical:** Changed to capture phase event listeners 2162- **Result:** Effects work EVERYWHERE now! 2163 2164### Month Picker Theming 2165 2166**Before (v5.3.3)**: 2167- White background (hardcoded) 2168- Black text (hardcoded) 2169- No theme integration 2170- Looked out of place 2171 2172**After (v5.3.4)**: 2173- Dialog background: `theme.bg` 2174- Dialog border: `theme.border` 2175- Text color: `theme.text_primary` 2176- Dropdowns: `theme.cell_bg` + `theme.text_primary` 2177- Cancel button: `theme.cell_bg` 2178- Go button: `theme.border` (accent color) 2179 2180**Fully integrated!** ✅ 2181 2182--- 2183 2184### Theme Examples 2185 2186**Matrix Theme**: 2187``` 2188┌─────────────────────────┐ 2189│ Jump to Month │ ← Dark bg, green border 2190│ [February ▼] [2026 ▼] │ ← Dark dropdowns 2191│ [Cancel] [Go] │ ← Green "Go" button 2192└─────────────────────────┘ 2193``` 2194 2195**Pink Theme**: 2196``` 2197┌─────────────────────────┐ 2198│ Jump to Month │ ← Dark bg, pink border 2199│ [February ▼] [2026 ▼] │ ← Dark dropdowns 2200│ [Cancel] [Go] │ ← Pink "Go" button 2201└─────────────────────────┘ 2202With sparkle effects! ✨ 2203``` 2204 2205**Professional Theme**: 2206``` 2207┌─────────────────────────┐ 2208│ Jump to Month │ ← Clean bg, blue border 2209│ [February ▼] [2026 ▼] │ ← Clean dropdowns 2210│ [Cancel] [Go] │ ← Blue "Go" button 2211└─────────────────────────┘ 2212``` 2213 2214--- 2215 2216### Dialog Cursor Fix 2217 2218**The Problem**: 2219Dialogs use `event.stopPropagation()` to prevent clicks from closing them. This blocked cursor effects! 2220 2221**The Solution**: 2222Use **capture phase** event listeners: 2223```javascript 2224// Before (bubbling phase) 2225document.addEventListener('click', handler) 2226 2227// After (capture phase) 2228document.addEventListener('click', handler, true) 2229 ↑ 2230 Capture phase! 2231``` 2232 2233**Capture phase runs BEFORE stopPropagation!** 2234 2235--- 2236 2237### Now Works Everywhere 2238 2239✅ **Calendar area** 2240✅ **Event dialogs** 2241✅ **Month picker dialog** 2242✅ **Day popup dialogs** 2243✅ **Anywhere on screen** 2244 2245**No more blocked effects!** 2246 2247--- 2248 2249### Technical Details 2250 2251**Event phases**: 2252``` 22531. Capture phase ← We listen here now! 22542. Target phase 22553. Bubbling phase ← stopPropagation blocks this 2256``` 2257 2258**By using capture phase**: 2259- Events caught before stopPropagation 2260- Works in all dialogs 2261- No conflicts with dialog logic 2262 2263--- 2264 2265### All Dialogs Checked 2266 2267✅ **Month picker** - Now themed! 2268✅ **Event dialog** - Already themed 2269✅ **Day popup** - Already themed 2270 2271**Everything consistent!** 2272 2273--- 2274 2275## Version 5.3.3 (2026-02-09) - TINY NEON PIXEL SPARKLES! ✨ 2276 2277### ✨ Added: Bright Neon Pixel Sparkles Everywhere! 2278- **Added:** Tiny 1-2px bright pixel sparkles alongside cursor trail 2279- **Added:** 40 pixel sparkles in click explosions 2280- **Changed:** Cursor effects now work on ENTIRE SCREEN (not just calendar) 2281- **Result:** Maximum sparkle effect! 2282 2283### Tiny Pixel Sparkles 2284 2285**3-6 tiny bright pixels appear with each cursor movement!** 2286 2287**Characteristics**: 2288- Size: 1-2px (single pixel appearance!) 2289- Colors: Bright neon whites and pinks 2290 - Pure white (#fff) - 40% chance 2291 - Hot pink (#ff1493) 2292 - Pink (#ff69b4) 2293 - Light pink (#ffb6c1) 2294 - Soft pink (#ff85c1) 2295- Glow: Triple-layer shadow (intense!) 2296- Spawn: Random 30px radius around cursor 2297- Animations: 2298 - 50% twinkle in place 2299 - 50% float upward 2300 2301**Creates a cloud of sparkles around your cursor!** 2302 2303--- 2304 2305### Click Explosion Enhanced 2306 2307**Now with 40 EXTRA pixel sparkles!** 2308 2309**Click anywhere → BIG BOOM**: 2310- 25 main glowing particles (6-10px) 2311- **40 tiny pixel sparkles (1-2px)** ← NEW! 2312- Bright white flash 2313- Total: 65+ visual elements! 2314 2315**Pixel sparkles in explosion**: 2316- Shoot outward in all directions 2317- Random distances (30-110px) 2318- Multiple bright colors 2319- Some twinkle, some explode 2320- Creates stellar effect! 2321 2322--- 2323 2324### Entire Screen Coverage 2325 2326**Effects now work EVERYWHERE!** 2327 2328**Before (v5.3.2)**: 2329- Only inside calendar viewport 2330- Limited to calendar area 2331 2332**After (v5.3.3)**: 2333- Works on entire screen! ✓ 2334- Cursor trail follows everywhere 2335- Click explosions anywhere 2336- Used `position: fixed` + `clientX/Y` 2337 2338**Move anywhere on the page for sparkles!** 2339 2340--- 2341 2342### Visual Effect 2343 2344**Cursor movement**: 2345``` 2346 • ✦ • ← Tiny pixels 2347 • ✦ • ← Glowing trail 2348✦ • → • ✦ ← Cursor 2349 • ✦ • ← Mixed sizes 2350 • ✦ • ← Sparkle cloud 2351``` 2352 2353**Click explosion**: 2354``` 2355 ✦ • ✦ • ✦ 2356 ✦ • • ✦ 2357✦ • ! • ✦ 2358 ✦ • • ✦ 2359 ✦ • ✦ • ✦ 2360 236165+ particles total! 2362``` 2363 2364--- 2365 2366### Sparkle Details 2367 2368**Trail Pixels** (3-6 per movement): 2369- Size: 1-2px 2370- Spawn rate: Every 40ms 2371- Spread: 30px radius 2372- Duration: 0.6-0.8s 2373- 50% twinkle, 50% float 2374 2375**Explosion Pixels** (40 total): 2376- Size: 1-3px 2377- Spread: 30-110px radius 2378- Duration: 0.4-0.8s 2379- All directions 2380- Intense glow 2381 2382**Main Particles** (25 total): 2383- Size: 4-10px 2384- Spread: 50-150px 2385- Full color palette 2386- Original firework effect 2387 2388--- 2389 2390### Color Distribution 2391 2392**Pixel sparkles favor white**: 2393- 40% pure white (#fff) - brightest! 2394- 60% pink shades - variety 2395 2396**Creates brilliant sparkle effect!** 2397 2398--- 2399 2400### Performance 2401 2402**Still optimized**: 2403- Trail: 30ms throttle 2404- Pixels: 40ms throttle 2405- Auto-cleanup 2406- Hardware accelerated 2407- Smooth 60fps 2408 2409**Lots of sparkles, zero lag!** 2410 2411--- 2412 2413### Full-Screen Magic 2414 2415**Pink theme calendar detected**: 2416```javascript 2417if (pink calendar exists) { 2418 Enable effects for ENTIRE SCREEN 2419 Not just calendar area 2420} 2421``` 2422 2423**Works everywhere on page!** ✨ 2424 2425--- 2426 2427## Version 5.3.2 (2026-02-09) - PINK FIREWORKS! 2428 2429### Changed: Glowing Pink Particles Instead of Emoji Sparkles! 2430- **Removed:** Emoji sparkle images (✨) 2431- **Added:** Glowing pink particle trail following cursor 2432- **Added:** FIREWORKS explosion on click! 2433- **Result:** Beautiful glowing effects, not emoji! 2434 2435### Glowing Cursor Trail 2436 2437**Pink glowing dots follow your cursor!** 2438- Small glowing pink orbs (8px) 2439- Radial gradient glow effect 2440- Multiple box-shadows for depth 2441- Fade out smoothly (0.5s) 2442- Throttled to 30ms for smoothness 2443 2444``` 2445 • • 2446 • → • ← Your cursor 2447 • • 2448``` 2449 2450**Not emoji - actual glowing particles!** 2451 2452--- 2453 2454### Click Fireworks! 2455 2456**Click anywhere on the calendar → BOOM!** 2457 2458**20 pink particles explode outward!** 2459- Radial burst pattern (360° coverage) 2460- Random speeds (50-150px travel) 2461- 4 shades of pink: 2462 - Hot pink (#ff1493) 2463 - Pink (#ff69b4) 2464 - Light pink (#ff85c1) 2465 - Very light pink (#ffc0cb) 2466- Random sizes (4-10px) 2467- Individual glowing halos 2468- Smooth explosion animation 2469 2470**Plus a bright flash at click point!** 2471- 30px radius glow 2472- Intense pink flash 2473- Fades quickly (0.3s) 2474 2475--- 2476 2477### Visual Effect 2478 2479**Cursor movement**: 2480``` 2481 • 2482 • • • 2483 • → • ← Glowing trail 2484 • • • 2485 • 2486``` 2487 2488**Click explosion**: 2489``` 2490 • • • 2491 • • 2492 • BOOM! • ← 20 particles 2493 • • 2494 • • • 2495``` 2496 2497**All particles glow with pink halos!** 2498 2499--- 2500 2501### Particle Details 2502 2503**Trail Particles**: 2504- Size: 8x8px 2505- Color: Pink radial gradient 2506- Shadow: 10px + 20px glow layers 2507- Duration: 0.5s fade 2508- Rate: 30ms throttle 2509 2510**Explosion Particles**: 2511- Size: 4-10px (random) 2512- Colors: 4 pink shades (random) 2513- Shadow: 10px + 20px glow (matches color) 2514- Duration: 0.6-1.0s (random) 2515- Pattern: Perfect circle burst 2516 2517**Flash Effect**: 2518- Size: 30x30px 2519- Color: Bright hot pink 2520- Shadow: 30px + 50px mega-glow 2521- Duration: 0.3s instant fade 2522 2523--- 2524 2525### Performance 2526 2527**Optimized for smoothness**: 2528- Trail throttled to 30ms 2529- Auto-cleanup after animations 2530- CSS hardware acceleration 2531- No memory leaks 2532- Smooth 60fps 2533 2534**Won't slow you down!** 2535 2536--- 2537 2538### Comparison 2539 2540**Before (v5.3.1)**: 2541- ✨ Emoji sparkle images 2542- Static unicode characters 2543- Limited visual impact 2544 2545**After (v5.3.2)**: 2546- Glowing pink particles 2547- Radial gradients + shadows 2548- Beautiful firework explosions 2549- Much more impressive! 2550 2551--- 2552 2553### Only Pink Theme 2554 2555**These effects only appear**: 2556- On `.calendar-theme-pink` elements 2557- Other themes unaffected 2558- Pure pink magic! 2559 2560--- 2561 2562## Version 5.3.1 (2026-02-09) - MYSPACE SPARKLE CURSOR! ✨✨✨ 2563 2564### ✨ Added: MySpace-Style Sparkle Trail! 2565- **Added:** Sparkle cursor trail that follows your mouse (pink theme only!) 2566- **Toned down:** Reduced glow effects for better taste 2567- **Added:** Sparkles appear on cell hover 2568- **Added:** Sparkles on event hover (left and right sides!) 2569- **Added:** Sparkles on today's cell corners 2570- **Added:** Sparkles on navigation buttons 2571- **Added:** Sparkles in calendar header 2572- **Result:** Pure nostalgic MySpace magic! ✨ 2573 2574### MySpace Sparkle Cursor Trail 2575 2576**The classic effect from 2006!** 2577- Sparkles follow your cursor as you move 2578- Random sizes (12-22px) 2579- Random slight offsets for natural feel 2580- Float up and fade out animation 2581- Throttled to 50ms (smooth, not laggy) 2582- Only on pink theme calendars 2583 2584``` 2585 ✨ 2586 ✨ ✨ 2587✨ → ✨ (cursor trail) 2588 ✨ ✨ 2589 ✨ 2590``` 2591 2592**Pure nostalgia!** 2593 2594--- 2595 2596### Sparkles Everywhere 2597 2598**Calendar cells**: 2599- Hover over any day → ✨ floats up 2600- Smooth 1.5s animation 2601- Centered sparkle 2602 2603**Event items**: 2604- Hover → ✨ on left side 2605- Hover → ✨ on right side 2606- Staggered animations (0.4s delay) 2607- Continuous twinkling 2608 2609**Today's cell**: 2610- ✨ in top-right corner (continuous) 2611- ✨ in bottom-left corner (offset timing) 2612- Always sparkling! 2613 2614**Navigation buttons**: 2615- Hover on < or > → ✨ appears top-right 2616- One-time float animation 2617 2618**Calendar header**: 2619- ✨ on left side (continuous) 2620- ✨ on right side (offset 1s) 2621- Always twinkling 2622 2623--- 2624 2625### Toned Down Glows 2626 2627**Before (v5.3.0)**: TOO MUCH GLOW! 2628- 50px shadows 2629- 4-layer effects 2630- Overwhelming 2631 2632**After (v5.3.1)**: Just right! 2633- 8-15px max shadows (subtle) 2634- 2-layer effects 2635- Professional with personality 2636 2637**Glow reductions**: 2638- Today shimmer: 35px → 12px 2639- Today hover: 50px → 15px 2640- Event glow: 18px → 6px 2641- Badge pulse: 25px → 8px 2642- Container glow: 20px → 8px 2643 2644**Much more tasteful!** 2645 2646--- 2647 2648### Sparkle Animations 2649 2650**sparkle-twinkle** (0.8s): 2651``` 2652Opacity: 0 → 1 → 1 → 0 2653Scale: 0 → 1 → 1 → 0 2654Rotation: 0° → 180° → 360° 2655``` 2656 2657**sparkle-float** (1.5s): 2658``` 2659Moves up: 0px → -50px 2660Opacity: 0 → 1 → 1 → 0 2661Scale: 0 → 1 → 0.8 → 0 2662``` 2663 2664**Pure MySpace magic!** ✨ 2665 2666--- 2667 2668### Where Sparkles Appear 2669 2670✅ **Cursor trail** (continuous while moving) 2671✅ **Calendar cells** (on hover) 2672✅ **Event items** (on hover, left + right) 2673✅ **Today's cell** (continuous, corners) 2674✅ **Navigation buttons** (on hover) 2675✅ **Calendar header** (continuous, sides) 2676 2677**Sparkles EVERYWHERE!** ✨✨✨ 2678 2679--- 2680 2681### Performance 2682 2683**Cursor trail**: 2684- Throttled to 50ms 2685- Auto-cleanup after 1s 2686- No memory leaks 2687- Smooth 60fps 2688 2689**CSS animations**: 2690- Hardware accelerated 2691- No JavaScript overhead (except cursor) 2692- Efficient transforms 2693 2694**Won't slow down your browser!** 2695 2696--- 2697 2698### Pure Nostalgia 2699 2700**Remember MySpace profiles?** 2701- Glitter graphics ✨ 2702- Sparkle cursors ✨ 2703- Auto-play music (ok, we didn't add that) 2704- Animated GIF backgrounds 2705- Comic Sans everywhere 2706 2707**We brought back the sparkles!** ✨ 2708 2709--- 2710 2711### Theme Comparison 2712 2713**Other themes**: Professional and clean 2714**Pink theme**: ✨ SPARKLES EVERYWHERE ✨ 2715 2716**Only pink theme gets the magic!** 2717 2718--- 2719 2720## Version 5.3.0 (2026-02-09) - PINK BLING THEME EFFECTS! ✨ 2721 2722### Added: Pink Theme Gets BLING! 2723- **Added:** Shimmering animation for today's cell 2724- **Added:** Sparkling text effect on today's date 2725- **Added:** Glowing pulse for event bars 2726- **Added:** Gradient shimmer on headers 2727- **Added:** Extra glow on hover effects 2728- **Added:** Pulsing urgent badge for past due items 2729- **Result:** Pink theme is now FABULOUS! ✨ 2730 2731### Shimmer Effects 2732 2733**Today's Cell**: 2734- Continuous shimmer animation (2 second loop) 2735- Multi-layer glow effect 2736- Pink and hot pink overlapping shadows 2737- Pulses from subtle to intense 2738- Extra sparkle on hover 2739 2740**Today's Date Number**: 2741- Sparkle animation (1.5 second loop) 2742- Text shadow glow effect 2743- Slight scale pulse (100% → 105%) 2744- Pink to hot pink shadow transition 2745 2746### Glow Effects 2747 2748**Event Bars**: 2749- Continuous glow pulse (2 second loop) 2750- Uses event's own color 2751- Adds pink accent glow layer 2752- Creates depth and dimension 2753 2754**Event Items**: 2755- Subtle base glow 2756- Enhanced glow on hover 2757- Slight slide animation on hover 2758- Professional yet playful 2759 2760### Gradient Shimmer 2761 2762**Headers**: 2763- Animated gradient background 2764- 3-color pink gradient flow 2765- Smooth 3-second animation 2766- Creates movement and life 2767- Applies to calendar header and event list header 2768 2769### Badge Effects 2770 2771**TODAY Badge**: 2772- Sparkle animation 2773- Synchronized with today's date 2774- Extra prominence 2775 2776**PAST DUE Badge**: 2777- Urgent pulsing effect (1 second loop) 2778- Orange glow intensifies 2779- Draws attention to urgent items 2780- Faster pulse for urgency 2781 2782### Container Bling 2783 2784**Main Container**: 2785- Multi-layer pink glow 2786- Soft outer shadow 2787- Creates floating effect 2788- Subtle but elegant 2789 2790### Animation Details 2791 2792**pink-shimmer** (2s loop): 2793``` 2794Start: Subtle 5px glow 2795Peak: Intense 35px multi-layer glow 2796End: Back to subtle 2797``` 2798 2799**pink-sparkle** (1.5s loop): 2800``` 2801Start: Base glow + scale 1.0 2802Peak: Intense glow + scale 1.05 2803End: Back to base 2804``` 2805 2806**pink-glow-pulse** (2s loop): 2807``` 2808Start: Small glow (3px, 6px) 2809Peak: Large glow (6px, 12px, 18px) 2810End: Back to small 2811``` 2812 2813**pink-gradient-shimmer** (3s loop): 2814``` 2815Gradient flows across element 2816Creates wave effect 2817Smooth continuous motion 2818``` 2819 2820**pink-pulse-urgent** (1s loop - faster!): 2821``` 2822Start: Orange glow 5px 2823Peak: Orange glow 25px (intense) 2824End: Back to 5px 2825``` 2826 2827### Visual Experience 2828 2829**Today's Cell**: 2830``` 2831┌──┬──┬──┬──┬──┬──┬──┐ 2832│ │ │ ✨ │ │ │ │ │ ← Shimmers constantly 2833│ │ │[9]│ │ │ │ │ ← Sparkles 2834│ │ │ ✨ │ │ │ │ │ ← Glows and pulses 2835└──┴──┴──┴──┴──┴──┴──┘ 2836``` 2837 2838**Event Bars**: 2839``` 2840━━━━━━━ ← Glows and pulses 2841━━━━━━━ ← Each bar animated 2842━━━━━━━ ← Creates rhythm 2843``` 2844 2845**Headers**: 2846``` 2847╔═════════════════════╗ 2848║ ~~~~~~~~~~ ║ ← Gradient flows 2849║ February 2026 ║ ← Shimmer effect 2850╚═════════════════════╝ 2851``` 2852 2853### Theme Comparison 2854 2855**Before (v5.2.8)**: 2856- Pink colors 2857- Static elements 2858- Standard shadows 2859 2860**After (v5.3.0)**: 2861- Pink colors ✓ 2862- Animated shimmer ✨ 2863- Sparkling effects 2864- Glowing pulses ✨ 2865- Moving gradients 2866- BLING! 2867 2868### Performance 2869 2870**All animations**: 2871- Hardware accelerated (transform, opacity) 2872- Smooth 60fps 2873- CSS animations (no JavaScript) 2874- Minimal CPU usage 2875- Disabled in reduced-motion preference 2876 2877### Only for Pink Theme 2878 2879**Effects only apply when**: 2880```css 2881.calendar-theme-pink 2882``` 2883 2884**Other themes unaffected**: 2885- Matrix stays Matrix 2886- Professional stays Professional 2887- Purple stays Purple 2888- Wiki stays clean 2889 2890**Pink gets all the bling!** ✨ 2891 2892### Use Cases 2893 2894**Perfect for**: 2895- Celebrating occasions 2896- Fun team calendars 2897- Personal style expression 2898- Standing out 2899- Making calendar time fabulous 2900 2901**Not just pink, but BLING pink!** ✨ 2902 2903## Version 5.2.8 (2026-02-09) - TODAY BOX USES THEME COLORS 2904 2905### Fixed: Today's Date Box Now Uses Theme Colors 2906- **Fixed:** Today's day number box now uses theme border color 2907- **Fixed:** Text color adapts to theme (white for dark themes, bg color for light) 2908- **Result:** Today box matches the theme perfectly! 2909 2910### The Issue 2911 2912Today's date had a hardcoded green box: 2913 2914**In style.css**: 2915```css 2916.cal-today .day-num { 2917 background: #008800; /* Hardcoded green! */ 2918 color: white; 2919} 2920``` 2921 2922**Didn't adapt to themes at all!** 2923 2924### The Fix 2925 2926**Now uses theme colors**: 2927```php 2928// Today's day number 2929if ($isToday) { 2930 background: $themeStyles['border'], // Theme's accent color! 2931 color: (professional theme) ? white : bg color 2932} 2933``` 2934 2935### Theme Examples 2936 2937**Matrix Theme**: 2938- Box background: `#00cc07` (matrix green) 2939- Text color: `#242424` (dark background) 2940 2941**Purple Theme**: 2942- Box background: `#9b59b6` (purple) 2943- Text color: `#2a2030` (dark background) 2944 2945**Professional Theme**: 2946- Box background: `#4a90e2` (blue) 2947- Text color: `#ffffff` (white text) 2948 2949**Pink Theme**: 2950- Box background: `#ff1493` (hot pink) 2951- Text color: `#1a0d14` (dark background) 2952 2953**Wiki Theme**: 2954- Box background: Template's `__border__` color 2955- Text color: Template's `__background_site__` color 2956 2957### Visual Result 2958 2959**Matrix Theme**: 2960``` 2961┌──┬──┬──┬──┬──┬──┬──┐ 2962│ 1│ 2│ 3│[4]│ 5│ 6│ 7│ 2963└──┴──┴──┴──┴──┴──┴──┘ 2964 ↑ 2965 Green box (#00cc07) 2966``` 2967 2968**Professional Theme**: 2969``` 2970┌──┬──┬──┬──┬──┬──┬──┐ 2971│ 1│ 2│ 3│[4]│ 5│ 6│ 7│ 2972└──┴──┴──┴──┴──┴──┴──┘ 2973 ↑ 2974 Blue box (#4a90e2) 2975``` 2976 2977**Wiki Theme**: 2978``` 2979┌──┬──┬──┬──┬──┬──┬──┐ 2980│ 1│ 2│ 3│[4]│ 5│ 6│ 7│ 2981└──┴──┴──┴──┴──┴──┴──┘ 2982 ↑ 2983 Template border color 2984``` 2985 2986### Implementation 2987 2988**Inline styles added**: 2989- Background uses `$themeStyles['border']` (theme accent) 2990- Text color uses `$themeStyles['bg']` for contrast 2991- Special case: Professional theme uses white text 2992- All with `!important` to override CSS 2993 2994**CSS cleaned up**: 2995- Removed hardcoded `#008800` background 2996- Removed hardcoded `white` color 2997- Kept structural styles (border-radius, font-weight) 2998 2999### Benefits 3000 3001**Theme Consistency**: 3002- Today box matches theme accent color 3003- Proper contrast with background 3004- Professional appearance 3005 3006**Automatic Adaptation**: 3007- Works with all themes 3008- Works with custom wiki template colors 3009- No manual adjustment needed 3010 3011**Visual Harmony**: 3012- Border color used throughout theme 3013- Today box reinforces theme identity 3014- Consistent design language 3015 3016## Version 5.2.7 (2026-02-09) - FIX GRID BACKGROUND MISMATCH 3017 3018### Fixed: Table Grid Background Now Matches Cells 3019- **Found:** `grid_bg` was using `__background_alt__` (different from cells!) 3020- **Fixed:** Changed `grid_bg` to use `__background_site__` (same as cells) 3021- **Result:** Table background no longer shows through cells! 3022 3023### The Layer Problem 3024 3025The table itself had a DIFFERENT background color than its cells! 3026 3027**Before (v5.2.6)**: 3028```php 3029'grid_bg' => __background_alt__, // Table background (#e8e8e8) 3030'cell_bg' => __background_site__, // Cell background (#f5f5f5) 3031``` 3032 3033**The table background was showing THROUGH the cells!** 3034 3035### Why This Happened 3036 3037**Visual layers**: 3038``` 3039Table Element 3040├─ background: __background_alt__ (#e8e8e8) ← Different! 3041└─ Cells 3042 └─ background: __background_site__ (#f5f5f5) ← Different! 3043 3044The table background shows through any gaps! 3045``` 3046 3047### The Fix 3048 3049**After (v5.2.7)**: 3050```php 3051'grid_bg' => __background_site__, // Table background (#f5f5f5) ✓ 3052'cell_bg' => __background_site__, // Cell background (#f5f5f5) ✓ 3053``` 3054 3055**NOW THEY MATCH!** 3056 3057### Where grid_bg Is Used 3058 3059The table element itself: 3060```html 3061<table style="background: __background_alt__"> ← Was showing through! 3062 <tbody> 3063 <tr> 3064 <td style="background: __background_site__">1</td> 3065 </tr> 3066 </tbody> 3067</table> 3068``` 3069 3070Even with cell inline styles, the TABLE background shows through! 3071 3072### All Background Sources Now Unified 3073 3074**Everything now uses __background_site__**: 3075- `bg` → __background_site__ ✓ 3076- `header_bg` → __background_site__ ✓ 3077- `grid_bg` → __background_site__ ✓ (JUST FIXED!) 3078- `cell_bg` → __background_site__ ✓ 3079 3080**Perfect consistency!** 3081 3082### Why It Was Different 3083 3084**Originally the grid was meant to show borders**: 3085- `grid_bg` was `__background_alt__` (slightly different) 3086- Created visual separation between cells 3087- But with transparent/thin cells, it showed through! 3088 3089**Now unified for consistency!** 3090 3091### Visual Result 3092 3093**Before (layers visible)**: 3094``` 3095┌─────────────────┐ 3096│ Grid (#e8e8e8) │ ← Showing through! 3097│ ┌──┬──┬──┐ │ 3098│ │ │ │ │ │ ← Cells (#f5f5f5) 3099│ └──┴──┴──┘ │ 3100└─────────────────┘ 3101``` 3102 3103**After (unified)**: 3104``` 3105┌─────────────────┐ 3106│ Grid (#f5f5f5) │ ← Same color! 3107│ ┌──┬──┬──┐ │ 3108│ │ │ │ │ │ ← Cells (#f5f5f5) 3109│ └──┴──┴──┘ │ 3110└─────────────────┘ 3111Perfect match! 3112``` 3113 3114### Complete Background Mapping 3115 3116**All using __background_site__ now**: 3117- Main container background 3118- Left panel background 3119- Right panel background 3120- Eventlist background 3121- Calendar grid background ← JUST FIXED 3122- Calendar cell backgrounds 3123- Event item backgrounds 3124- Clock header background 3125- Search input background 3126- Past events toggle 3127 3128**EVERYTHING UNIFIED!** 3129 3130## Version 5.2.6 (2026-02-09) - REMOVE CONTAINER BACKGROUNDS 3131 3132### Fixed: Removed Container Backgrounds Showing Through 3133- **Found:** `.calendar-compact-container` had `background: #ffffff;` 3134- **Found:** `.calendar-compact-left` had `background: #fafafa;` 3135- **Found:** `.calendar-compact-right` had `background: #ffffff;` 3136- **Found:** `.event-search-input-inline` had `background: white;` 3137- **Found:** `.past-events-toggle` had `background: #f5f5f5;` 3138- **Result:** Container backgrounds no longer show through cells! 3139 3140### The Container Problem 3141 3142The parent containers had hardcoded backgrounds that were showing through! 3143 3144**Container backgrounds (lines 4-91)**: 3145```css 3146.calendar-compact-container { 3147 background: #ffffff; /* ← Main container! */ 3148} 3149 3150.calendar-compact-left { 3151 background: #fafafa; /* ← Left panel (calendar side)! */ 3152} 3153 3154.calendar-compact-right { 3155 background: #ffffff; /* ← Right panel (events side)! */ 3156} 3157``` 3158 3159**These were showing through the cells and events!** 3160 3161### Why Containers Matter 3162 3163Even though cells have inline styles, if the CONTAINER behind them has a different background, it can show through: 3164 3165``` 3166Container (#fafafa) ← Showing through! 3167 └─ Table Cell (#f5f5f5) ← Transparent areas 3168 └─ Content 3169``` 3170 3171### All Backgrounds Removed 3172 3173**v5.2.6 removes**: 3174- `.calendar-compact-container` background 3175- `.calendar-compact-left` background 3176- `.calendar-compact-right` background 3177- `.event-search-input-inline` background 3178- `.past-events-toggle` background & hover 3179 3180**v5.2.5 removed**: 3181- `.calendar-compact-grid tbody td` background 3182- `.calendar-compact-grid thead th` background 3183 3184**v5.2.4 removed**: 3185- `.cal-empty`, `.cal-today`, `.cal-has-events` backgrounds 3186 3187**v5.2.3 removed**: 3188- `.event-compact-item` background 3189 3190**ALL container and element backgrounds eliminated!** 3191 3192### What Should Work Now 3193 3194**Calendar cells**: No container background showing through ✓ 3195**Event items**: No container background showing through ✓ 3196**Search bar**: Uses template color ✓ 3197**Past events toggle**: Uses template color ✓ 3198 3199### Complete List of Fixes 3200 3201**Containers**: 3202- Main container ✓ 3203- Left panel ✓ 3204- Right panel ✓ 3205 3206**Elements**: 3207- Table cells ✓ 3208- Event items ✓ 3209- Search input ✓ 3210- Past events toggle ✓ 3211 3212**EVERYTHING removed!** 3213 3214### Critical: Clear Caches 3215 3216**Must clear caches or won't work**: 32171. Hard refresh: Ctrl+Shift+R (5 times!) 32182. Clear DokuWiki cache 32193. Close browser completely 32204. Reopen and test 3221 3222**CSS caching is EXTREMELY persistent!** 3223 3224## Version 5.2.5 (2026-02-09) - REMOVE TABLE CELL CSS BACKGROUNDS 3225 3226### Fixed: Removed Hardcoded Backgrounds from Table Cells 3227- **Found:** `.calendar-compact-grid tbody td` had `background: #ffffff;`! 3228- **Found:** `.calendar-compact-grid tbody td:hover` had `background: #f0f7ff;`! 3229- **Found:** `.calendar-compact-grid thead th` had `background: #f8f8f8;`! 3230- **Fixed:** Removed ALL hardcoded backgrounds from table CSS 3231- **Result:** Calendar table cells finally use template colors! 3232 3233### The REAL Culprits 3234 3235The generic table CSS was overriding everything! 3236 3237**In style.css (lines 307-356)**: 3238```css 3239.calendar-compact-grid thead th { 3240 background: #f8f8f8; /* ← Header cells hardcoded! */ 3241} 3242 3243.calendar-compact-grid tbody td { 3244 background: #ffffff; /* ← ALL table cells hardcoded! */ 3245} 3246 3247.calendar-compact-grid tbody td:hover { 3248 background: #f0f7ff; /* ← Hover state hardcoded! */ 3249} 3250``` 3251 3252**These apply to ALL `<td>` and `<th>` elements in the calendar table!** 3253 3254### Why This Was the Last One 3255 3256**CSS Specificity Order**: 32571. `.calendar-compact-grid tbody td` (generic - applies to ALL cells) 32582. `.cal-empty`, `.cal-today`, `.cal-has-events` (specific - applies to some cells) 32593. Inline styles (should win but didn't) 3260 3261**We removed the specific ones (v5.2.4), but the generic one was still there!** 3262 3263### What We've Removed 3264 3265**v5.2.3**: 3266- `.event-compact-item` background 3267- `.event-compact-item:hover` background 3268 3269**v5.2.4**: 3270- `.cal-empty` background & hover 3271- `.cal-today` background & hover 3272- `.cal-has-events` background & hover 3273 3274**v5.2.5 (FINAL)**: 3275- `.calendar-compact-grid tbody td` background ✓ 3276- `.calendar-compact-grid tbody td:hover` background ✓ 3277- `.calendar-compact-grid thead th` background ✓ 3278 3279**All CSS background overrides ELIMINATED!** 3280 3281### Why It Took 5 Versions 3282 3283**CSS had layers of hardcoded backgrounds**: 3284 3285``` 3286Layer 1: Table cells (.calendar-compact-grid tbody td) 3287 ↓ Overrode inline styles 3288Layer 2: Cell states (.cal-today, .cal-empty, etc.) 3289 ↓ Overrode table cells 3290Layer 3: Event items (.event-compact-item) 3291 ↓ Overrode inline styles 3292 3293ALL had to be removed! 3294``` 3295 3296**We kept finding more specific CSS, but the base table CSS was there all along!** 3297 3298### Visual Result 3299 3300**NOW everything matches**: 3301``` 3302Calendar Table: 3303┌──┬──┬──┬──┬──┬──┬──┐ 3304│ S│ M│ T│ W│ T│ F│ S│ ← Headers: __background_site__ 3305├──┼──┼──┼──┼──┼──┼──┤ 3306│ 1│ 2│ 3│ 4│ 5│ 6│ 7│ ← Cells: __background_site__ 3307├──┼──┼──┼──┼──┼──┼──┤ 3308│ 8│ 9│10│11│12│13│14│ ← All: __background_site__ 3309└──┴──┴──┴──┴──┴──┴──┘ 3310 3311Sidebar Events: 3312┌────────────────────────┐ 3313│ Event │ ← __background_site__ 3314│ Event │ ← __background_site__ 3315└────────────────────────┘ 3316 3317FINALLY ALL MATCHING! ✓ 3318``` 3319 3320### Complete List of Removed CSS 3321 3322**ALL hardcoded backgrounds removed**: 3323- `.event-compact-item` background 3324- `.event-compact-item:hover` background 3325- `.cal-empty` background & hover 3326- `.cal-today` background & hover 3327- `.cal-has-events` background & hover 3328- `.calendar-compact-grid tbody td` background ← NEW 3329- `.calendar-compact-grid tbody td:hover` background ← NEW 3330- `.calendar-compact-grid thead th` background ← NEW 3331 3332**Every single CSS background override is GONE!** 3333 3334### Testing Steps 3335 3336**After installing v5.2.5**: 3337 33381. **Clear browser cache**: Ctrl+Shift+R (3 times!) 33392. **Clear DokuWiki cache**: Click the button 33403. **Close browser completely**: Restart it 33414. **Visit page**: Should finally see matching backgrounds 3342 3343**CSS is EXTREMELY sticky - may need to clear multiple times!** 3344 3345### This Should Be It 3346 3347**No more CSS overrides exist** (we've checked the entire file): 3348- Table cells ✓ Fixed 3349- Cell states ✓ Fixed 3350- Event items ✓ Fixed 3351- Headers ✓ Fixed 3352- Hover states ✓ Fixed 3353 3354**All backgrounds now come from inline styles using template colors!** 3355 3356## Version 5.2.4 (2026-02-09) - REMOVE CALENDAR CELL CSS BACKGROUNDS 3357 3358### Fixed: Removed Hardcoded Backgrounds from Calendar Cells 3359- **Found:** Calendar cell CSS had hardcoded backgrounds with `!important`! 3360- **Fixed:** Removed backgrounds from `.cal-today`, `.cal-empty`, `.cal-has-events` CSS 3361- **Result:** Calendar cells now use template colors! 3362 3363### The Second Culprit 3364 3365MORE hardcoded backgrounds in the CSS file! 3366 3367**In style.css (lines 359-382)**: 3368```css 3369.cal-empty { 3370 background: #fafafa !important; /* ← Overriding inline styles! */ 3371} 3372 3373.cal-today { 3374 background: #e8f5e9 !important; /* ← Overriding today cell! */ 3375} 3376 3377.cal-today:hover { 3378 background: #c8e6c9 !important; /* ← Overriding hover! */ 3379} 3380 3381.cal-has-events { 3382 background: #fffbf0; /* ← Overriding event cells! */ 3383} 3384 3385.cal-has-events:hover { 3386 background: #fff4d9; /* ← Overriding hover! */ 3387} 3388``` 3389 3390**These were ALL overriding the inline styles!** 3391 3392### The Fix 3393 3394**Removed all hardcoded backgrounds**: 3395```css 3396.cal-empty { 3397 /* background removed - inline style handles this */ 3398 cursor: default !important; 3399} 3400 3401.cal-today { 3402 /* background removed - inline style handles this */ 3403} 3404 3405.cal-has-events { 3406 /* background removed - inline style handles this */ 3407} 3408 3409/* Hover states also removed */ 3410``` 3411 3412### What Was Overridden 3413 3414**v5.2.3 fixed**: 3415- Event items in sidebar ✓ 3416 3417**v5.2.4 fixes**: 3418- Calendar day cells ✓ 3419- Today cell ✓ 3420- Empty cells ✓ 3421- Cells with events ✓ 3422- All hover states ✓ 3423 3424### Why This Kept Happening 3425 3426**CSS had hardcoded backgrounds everywhere**: 34271. Event items: `#ffffff` (fixed in v5.2.3) 34282. Calendar cells: Multiple colors (fixed in v5.2.4) 34293. **All with `!important` flags!** 3430 3431**The inline styles couldn't override them!** 3432 3433### Visual Result 3434 3435**Now ALL backgrounds match**: 3436``` 3437Calendar Grid: 3438┌──┬──┬──┬──┬──┬──┬──┐ 3439│ │ │ │ │ │ │ │ ← All use __background_site__ 3440├──┼──┼──┼──┼──┼──┼──┤ 3441│ │██│ │ │ │ │ │ ← Today uses __background_neu__ 3442├──┼──┼──┼──┼──┼──┼──┤ 3443│ │ │ │ │ │ │ │ ← All match template 3444└──┴──┴──┴──┴──┴──┴──┘ 3445 3446Sidebar Events: 3447┌────────────────────────┐ 3448│ Event │ ← Uses __background_site__ 3449│ Event │ ← Uses __background_site__ 3450└────────────────────────┘ 3451 3452Perfect consistency! 3453``` 3454 3455### CSS Removed 3456 3457**Calendar cells**: 3458- `.cal-empty` background 3459- `.cal-empty:hover` background 3460- `.cal-today` background 3461- `.cal-today:hover` background 3462- `.cal-has-events` background 3463- `.cal-has-events:hover` background 3464 3465**All gone!** ✓ 3466 3467### Important: Clear Caches Again! 3468 3469After installing v5.2.4: 3470 34711. **Hard refresh browser**: Ctrl+Shift+R (twice!) 34722. **Clear DokuWiki cache**: Admin → Clear Cache 34733. **May need to restart browser**: To clear CSS cache 3474 3475**Old CSS is VERY sticky!** 3476 3477### Why It Took So Long 3478 3479**Multiple CSS overrides**: 3480- Event items (v5.2.3) ✓ Fixed 3481- Calendar cells (v5.2.4) ✓ Fixed 3482- Each with different classes 3483- Each with `!important` 3484- Hidden throughout CSS file 3485 3486**Found them all now!** 3487 3488## Version 5.2.3 (2026-02-09) - REMOVE HARDCODED CSS BACKGROUNDS 3489 3490### Fixed: Removed Hardcoded Backgrounds from CSS 3491- **Found:** CSS file had hardcoded `background: #ffffff;` overriding inline styles! 3492- **Fixed:** Removed hardcoded backgrounds from `.event-compact-item` CSS 3493- **Result:** Event backgrounds now properly use template colors! 3494 3495### The Root Cause 3496 3497The CSS file was overriding the inline styles with hardcoded white backgrounds! 3498 3499**In style.css (lines 599-616)**: 3500```css 3501.event-compact-item { 3502 background: #ffffff; /* ← This was overriding inline styles! */ 3503} 3504 3505.event-compact-item:hover { 3506 background: #f8f9fa; /* ← And this on hover! */ 3507} 3508``` 3509 3510**Even though inline styles had `!important`**, the CSS was still being applied because it comes after in the cascade! 3511 3512### The Fix 3513 3514**Removed hardcoded backgrounds from CSS**: 3515```css 3516.event-compact-item { 3517 /* background removed - set via inline style with template colors */ 3518 display: flex; 3519 /* ... other styles ... */ 3520} 3521 3522.event-compact-item:hover { 3523 box-shadow: 0 1px 3px rgba(0,0,0,0.08); 3524 /* background removed - inline style handles this */ 3525} 3526``` 3527 3528### Why This Was So Difficult to Find 3529 3530**CSS Specificity & Cascade**: 35311. Inline styles with `!important` should win 35322. But CSS that comes after can still apply 35333. The hardcoded `background: #ffffff` was silently overriding 35344. All the PHP code was correct - it was the CSS! 3535 3536**What We Were Doing**: 3537- ✓ Reading template colors correctly 3538- ✓ Setting `cell_bg` to `__background_site__` correctly 3539- ✓ Applying inline styles with `!important` correctly 3540- ✗ CSS file was overriding everything! 3541 3542### What Was Affected 3543 3544**Event items in**: 3545- Main calendar sidebar 3546- Standalone event list 3547- Sidebar widget 3548- All event displays 3549 3550**All had white backgrounds hardcoded in CSS!** 3551 3552### Now Working 3553 3554**Events use template colors**: 3555```html 3556<div class="event-compact-item" 3557 style="background: #f5f5f5 !important; ..."> 3558 ← Now this inline style actually works! 3559</div> 3560``` 3561 3562**No CSS override** ✓ 3563 3564### Testing 3565 3566To verify this works: 35671. Clear browser cache (important!) 35682. Clear DokuWiki cache 35693. Reload page 35704. Events should now match eventlist background 3571 3572**Browser caching can make old CSS persist!** 3573 3574### Visual Result 3575 3576**All backgrounds now matching**: 3577``` 3578┌────────────────────────────┐ 3579│ Eventlist (#f5f5f5) │ ← Template color 3580├────────────────────────────┤ 3581│ Event (#f5f5f5) │ ← Template color (was #ffffff) 3582├────────────────────────────┤ 3583│ Event (#f5f5f5) │ ← Template color (was #ffffff) 3584└────────────────────────────┘ 3585 3586Perfect match! 3587``` 3588 3589### Why Everything Else Worked 3590 3591**Clock area, calendar cells, etc.** didn't have hardcoded CSS backgrounds: 3592- They only had inline styles ✓ 3593- Inline styles worked correctly ✓ 3594- Only event items had the CSS override ✗ 3595 3596### Important Notes 3597 3598**Clear caches**: 3599- Browser cache (Ctrl+Shift+R or Cmd+Shift+R) 3600- DokuWiki cache (Admin → Clear Cache) 3601- Old CSS may be cached! 3602 3603**This was the culprit all along!** 3604 3605## Version 5.2.2 (2026-02-09) - FIX CLOCK AREA BACKGROUND 3606 3607### Fixed: Clock Area Now Matches Event Cells 3608- **Fixed:** `header_bg` now uses `__background_site__` (was `__background_alt__`) 3609- **Result:** Clock/Today header matches event cell backgrounds! 3610 3611### The Issue 3612 3613The clock area (Today header) was using a different background: 3614 3615**Before (v5.2.1)**: 3616```php 3617'header_bg' => __background_alt__, // Different color (gray #e8e8e8) 3618'cell_bg' => __background_site__, // Event cells (#f5f5f5) 3619``` 3620 3621**After (v5.2.2)**: 3622```php 3623'header_bg' => __background_site__, // Same as cells (#f5f5f5) ✓ 3624'cell_bg' => __background_site__, // Event cells (#f5f5f5) ✓ 3625``` 3626 3627### What's the Clock Area? 3628 3629The clock/Today header in the sidebar: 3630``` 3631┌────────────────────────────┐ 3632│ 3:45:23 PM │ ← Clock area (header_bg) 3633│ ️ --° | Sun, Feb 9, 2026 │ 3634└────────────────────────────┘ 3635``` 3636 3637### All Backgrounds Now Unified 3638 3639**Everything now uses __background_site__**: 3640- Eventlist background ✓ 3641- Calendar cells ✓ 3642- Event items ✓ 3643- Clock/Today header ✓ 3644- Sidebar widget ✓ 3645- All backgrounds match! ✓ 3646 3647### Visual Result 3648 3649**Complete consistency**: 3650``` 3651┌────────────────────────────┐ 3652│ 3:45:23 PM │ ← Same background 3653│ ️ --° | Sun, Feb 9, 2026 │ 3654├────────────────────────────┤ 3655│ Meeting at 2pm │ ← Same background 3656│ Description... │ 3657├────────────────────────────┤ 3658│ Another event │ ← Same background 3659│ More details... │ 3660└────────────────────────────┘ 3661 3662All using __background_site__ (#f5f5f5) 3663``` 3664 3665**Perfect visual harmony!** 3666 3667## Version 5.2.1 (2026-02-09) - FIX: MATCH EVENTLIST BACKGROUND 3668 3669### Fixed: Calendar Cells Now Match Eventlist Background 3670- **Fixed:** Changed `cell_bg` to use `__background_site__` (not `__background__`) 3671- **Result:** Calendar cells now match the eventlist background perfectly! 3672 3673### The Real Issue 3674 3675The eventlist was showing the CORRECT background color all along! 3676 3677**Eventlist was using**: 3678- `bg` → `__background_site__` ✓ (This was correct!) 3679 3680**Calendar cells were using**: 3681- `cell_bg` → `__background__` ✗ (This was wrong!) 3682 3683**They didn't match!** 3684 3685### The Correct Fix 3686 3687**Now everything uses __background_site__**: 3688```php 3689'bg' => __background_site__, // Eventlist (was already correct) 3690'cell_bg' => __background_site__, // Cells (now fixed to match) 3691``` 3692 3693### Why __background_site__? 3694 3695The eventlist sidebar and calendar are meant to match the **page/site background**, not the inner content area background: 3696 3697``` 3698Page Layout: 3699┌────────────────────────────────────┐ 3700│ __background_site__ (page bg) │ ← This is where calendar lives 3701│ │ 3702│ ┌──────────────────────────────┐ │ 3703│ │ __background__ (content bg) │ │ ← Wiki article content 3704│ │ │ │ 3705│ └──────────────────────────────┘ │ 3706│ │ 3707└────────────────────────────────────┘ 3708``` 3709 3710**Calendar should match the page background, not the content background!** 3711 3712### Template Example 3713 3714Typical DokuWiki template: 3715```ini 3716__background_site__ = "#f5f5f5" (Light gray - page background) 3717__background__ = "#ffffff" (White - content area) 3718``` 3719 3720**Before (v5.2.0)**: 3721- Eventlist: `#f5f5f5` (light gray) ✓ Correct 3722- Calendar cells: `#ffffff` (white) ✗ Wrong - didn't match 3723 3724**After (v5.2.1)**: 3725- Eventlist: `#f5f5f5` (light gray) ✓ Correct 3726- Calendar cells: `#f5f5f5` (light gray) ✓ Correct - MATCHED! 3727 3728### All Backgrounds Now Unified 3729 3730**Everything now uses __background_site__**: 3731- Eventlist sidebar background ✓ 3732- Main calendar background ✓ 3733- Calendar day cells ✓ 3734- Sidebar widget ✓ 3735- Event items ✓ 3736- Input fields ✓ 3737- Buttons ✓ 3738 3739**All perfectly matched to the page background!** 3740 3741### Why Version 5.2.0 Was Wrong 3742 3743I incorrectly assumed `__background__` was the right color because it's often white. But the eventlist was already correct using `__background_site__` to match the page, not the content area. 3744 3745**The eventlist knew what it was doing all along!** The cells just needed to catch up. 3746 3747## Version 5.2.0 (2026-02-09) - UNIFIED WIKI THEME BACKGROUNDS 3748**Note**: This version went the wrong direction. See v5.2.1 for the correct fix. 3749 3750### Fixed: All Backgrounds Now Use __background__ 3751- **Fixed:** `bg` now uses `__background__` instead of `__background_site__` 3752- **Fixed:** Eventlist, calendar cells, and sidebar all match now 3753- **Result:** Completely unified background throughout! 3754 3755### The Issue 3756 3757Different parts of the calendar were using different background sources: 3758 3759**Before (v5.1.9)**: 3760```php 3761'bg' => __background_site__ // Eventlist background (outer page) 3762'cell_bg' => __background__ // Cell backgrounds (content area) 3763``` 3764 3765**These are different colors!** 3766- `__background_site__` = Outer page wrapper (often gray) 3767- `__background__` = Main content area (often white) 3768 3769### The Fix 3770 3771**After (v5.2.0)**: 3772```php 3773'bg' => __background__ // Eventlist background ✓ 3774'cell_bg' => __background__ // Cell backgrounds ✓ 3775``` 3776 3777**Both use the same source!** 3778 3779### What Uses 'bg' 3780 3781The `bg` color is used for: 3782- Eventlist sidebar background 3783- Main calendar container 3784- Sidebar widget background 3785- Form backgrounds 3786- Event dialogs 3787 3788### What Uses 'cell_bg' 3789 3790The `cell_bg` color is used for: 3791- Calendar day cells 3792- Event item backgrounds 3793- Input field backgrounds 3794- Button backgrounds 3795 3796### Why This Matters 3797 3798**Template color hierarchy**: 3799``` 3800__background_site__ → Outer page/body (e.g., #f5f5f5 light gray) 3801__background__ → Main content area (e.g., #ffffff white) 3802__background_alt__ → Sections/headers 3803__background_neu__ → Highlights 3804``` 3805 3806**We want all calendar backgrounds to match the main content area!** 3807 3808### Visual Comparison 3809 3810**Before (v5.1.9)**: Mismatched backgrounds 3811``` 3812┌────────────────────────────────┐ 3813│ Eventlist (gray #f5f5f5) │ ← __background_site__ 3814└────────────────────────────────┘ 3815 3816┌────────────────────────────────┐ 3817│ Calendar │ 3818│ ┌──┬──┬──┬──┬──┬──┬──┐ │ 3819│ │ │ │ │ │ │ │ │ │ ← __background__ (white #fff) 3820│ └──┴──┴──┴──┴──┴──┴──┘ │ 3821└────────────────────────────────┘ 3822Different colors - looks inconsistent 3823``` 3824 3825**After (v5.2.0)**: Unified backgrounds 3826``` 3827┌────────────────────────────────┐ 3828│ Eventlist (white #fff) │ ← __background__ 3829└────────────────────────────────┘ 3830 3831┌────────────────────────────────┐ 3832│ Calendar │ 3833│ ┌──┬──┬──┬──┬──┬──┬──┐ │ 3834│ │ │ │ │ │ │ │ │ │ ← __background__ (white #fff) 3835│ └──┴──┴──┴──┴──┴──┴──┘ │ 3836└────────────────────────────────┘ 3837Same color - perfectly consistent! 3838``` 3839 3840### Template Examples 3841 3842**Light Template**: 3843```ini 3844__background_site__ = "#f5f5f5" (light gray) 3845__background__ = "#ffffff" (white) 3846``` 3847 3848**Before**: Eventlist gray, cells white 3849**After**: Eventlist white, cells white ✓ 3850 3851**Dark Template**: 3852```ini 3853__background_site__ = "#1a1a1a" (very dark) 3854__background__ = "#2d2d2d" (dark) 3855``` 3856 3857**Before**: Eventlist very dark, cells dark 3858**After**: Eventlist dark, cells dark ✓ 3859 3860### Benefits 3861 3862**Visual Consistency**: 3863- All backgrounds match 3864- Clean, unified appearance 3865- Professional look 3866 3867**Correct Template Integration**: 3868- Uses content area color (not page wrapper) 3869- Matches wiki content area 3870- Proper color hierarchy 3871 3872**Works Everywhere**: 3873- Light templates ✓ 3874- Dark templates ✓ 3875- Custom templates ✓ 3876 3877### All Backgrounds Unified 3878 3879**Now using __background__**: 3880- Eventlist background ✓ 3881- Calendar cells ✓ 3882- Sidebar widget ✓ 3883- Event items ✓ 3884- Input fields ✓ 3885- Buttons ✓ 3886- Dialogs ✓ 3887 3888**Perfect harmony throughout!** 3889 3890## Version 5.1.9 (2026-02-09) - FIX WIKI THEME EVENT BACKGROUNDS 3891 3892### Fixed: Wiki Theme Event Backgrounds Not Showing 3893- **Fixed:** Wiki theme fallback used CSS variables in inline styles (doesn't work!) 3894- **Fixed:** Replaced CSS variables with actual hex colors 3895- **Result:** Event backgrounds now show correctly with template colors! 3896 3897### The Problem 3898 3899CSS variables like `var(--__background__, #fff)` don't work in inline `style=""` attributes! 3900 3901**Before (broken)**: 3902```php 3903'cell_bg' => 'var(--__background__, #fff)', // Doesn't work in inline styles! 3904``` 3905 3906**After (fixed)**: 3907```php 3908'cell_bg' => '#fff', // Actual hex color works! 3909``` 3910 3911### What Was Affected 3912 3913**When style.ini read successfully**: 3914- ✅ Worked fine (uses actual hex colors from file) 3915 3916**When style.ini fallback used**: 3917- ❌ Events had no background 3918- ❌ CSS variables don't work in inline styles 3919- ❌ Looked broken 3920 3921### The Fix 3922 3923**Wiki theme fallback now uses real colors**: 3924```php 3925'wiki' => [ 3926 'bg' => '#f5f5f5', // Real hex (was: var(--__background_site__)) 3927 'border' => '#ccc', // Real hex (was: var(--__border__)) 3928 'cell_bg' => '#fff', // Real hex (was: var(--__background__)) 3929 'cell_today_bg' => '#eee', // Real hex (was: var(--__background_neu__)) 3930 'text_primary' => '#333', // Real hex (was: var(--__text__)) 3931 'text_bright' => '#2b73b7', // Real hex (was: var(--__link__)) 3932 'text_dim' => '#666', // Real hex (was: var(--__text_neu__)) 3933 'grid_bg' => '#e8e8e8', // Real hex (was: var(--__background_alt__)) 3934 // ... all colors now use real hex values 3935] 3936``` 3937 3938### Why CSS Variables Don't Work 3939 3940**CSS variables work**: 3941```css 3942.some-class { 3943 background: var(--__background__, #fff); /* ✓ Works in CSS */ 3944} 3945``` 3946 3947**CSS variables DON'T work**: 3948```html 3949<div style="background: var(--__background__, #fff)"> <!-- ✗ Doesn't work --> 3950``` 3951 3952### How It Works Now 3953 3954**Priority system**: 39551. **Try reading style.ini** → Use actual template hex colors ✓ 39562. **If file not found** → Use fallback hex colors ✓ 39573. **Never use CSS variables in inline styles** ✓ 3958 3959**Both paths now work correctly!** 3960 3961### Visual Result 3962 3963**Events now have proper backgrounds**: 3964``` 3965┌──────────────────────────┐ 3966│ Meeting at 2pm │ ← White background (#fff) 3967│ Description here... │ 3968│ [✏️ Edit] [️ Delete] │ 3969└──────────────────────────┘ 3970 3971Not: 3972┌──────────────────────────┐ 3973│ Meeting at 2pm │ ← No background (broken) 3974│ Description here... │ 3975└──────────────────────────┘ 3976``` 3977 3978### Affected Areas 3979 3980**All event displays**: 3981- Main calendar events ✓ 3982- Sidebar widget events ✓ 3983- Event list items ✓ 3984- Event backgrounds ✓ 3985- Button backgrounds ✓ 3986- Input field backgrounds ✓ 3987 3988**Everything uses real colors now!** 3989 3990## Version 5.1.8 (2026-02-09) - IMPROVED UPDATE TAB LAYOUT 3991 3992### Reorganized: Better Update Tab Layout 3993- **Moved:** Current Version section to the top 3994- **Combined:** Upload and Important Notes side-by-side 3995- **Improved:** Space-efficient two-column layout 3996- **Result:** More information visible at once! 3997 3998### New Layout Order 3999 4000**Version 5.1.8**: 4001``` 40021. Current Version (at top - see what you have) 40032. Upload + Important Notes (side-by-side) 40043. Recent Changes (changelog) 40054. Backups 4006``` 4007 4008### Side-by-Side Design 4009 4010**Upload form (left 60%) + Important Notes (right 40%)**: 4011``` 4012┌──────────────────────────────────────────┐ 4013│ Current Version │ 4014│ Version: 5.1.8 │ 4015│ ✅ Permissions: OK │ 4016└──────────────────────────────────────────┘ 4017 4018┌─────────────────────┬────────────────────┐ 4019│ Upload New │ ⚠️ Important Notes │ 4020│ [Choose File] │ • Replaces files │ 4021│ ☑ Backup first │ • Config preserved │ 4022│ [Upload] [Clear] │ • Events safe │ 4023└─────────────────────┴────────────────────┘ 4024``` 4025 4026### Benefits 4027 4028**Current Version First**: 4029- See what you have immediately 4030- Check permissions at a glance 4031- Know if ready to update 4032 4033**Side-by-Side Layout**: 4034- Upload form and warnings together 4035- Read notes while choosing file 4036- More efficient use of space 4037- Less scrolling needed 4038 4039**Better Information Flow**: 40401. See current version ✓ 40412. Upload new version with notes visible ✓ 40423. Review recent changes ✓ 40434. Manage backups ✓ 4044 4045### Visual Comparison 4046 4047**Before (v5.1.7)**: 4048``` 4049Important Notes (full width) 4050↓ 4051Upload Form (full width) 4052↓ 4053Current Version 4054↓ 4055Recent Changes 4056↓ 4057Backups 4058``` 4059 4060**After (v5.1.8)**: 4061``` 4062Current Version (full width) 4063↓ 4064Upload (60%) | Notes (40%) 4065↓ 4066Recent Changes 4067↓ 4068Backups 4069``` 4070 4071**More compact, better organized!** 4072 4073### Responsive Design 4074 4075**Wide screens**: 4076- Upload and notes side-by-side 4077- Full 1200px width utilized 4078- Efficient space usage 4079 4080**Narrow screens**: 4081- Sections stack gracefully 4082- Flex layout adapts 4083- Still fully functional 4084 4085### Layout Details 4086 4087**Current Version Section**: 4088- Full width (1200px max) 4089- Shows version, author, description 4090- Permission status with icons 4091- Helpful fix commands if needed 4092 4093**Upload/Notes Section**: 4094- Flexbox layout with gap 4095- Upload: `flex:1` (grows) 4096- Notes: `flex:0 0 350px` (fixed 350px) 4097- Both have proper min-width 4098 4099**Recent Changes Section**: 4100- Full width (1200px max) 4101- Compact scrollable view 4102- Color-coded change types 4103- Last 10 versions shown 4104 4105**Backups Section**: 4106- Full width (1200px max) 4107- Manual backup button 4108- Scrollable file list 4109- All actions accessible 4110 4111### Improved Max Widths 4112 4113All sections now use `max-width:1200px` (previously 900px): 4114- Better use of wide screens 4115- Still responsive on narrow screens 4116- Consistent throughout tab 4117 4118## Version 5.1.7 (2026-02-09) - FIX SYNTAX ERROR 4119 4120### Fixed: Extra Closing Brace 4121- **Fixed:** ParseError on line 1936 (extra closing brace) 4122- **Result:** Manual backup feature now works correctly! 4123 4124### What Was Wrong 4125 4126Extra `}` after the backup section: 4127 4128**Before (broken)**: 4129```php 4130echo '</div>'; 4131} // ← Extra closing brace! 4132 4133echo '<script> 4134``` 4135 4136**After (fixed)**: 4137```php 4138echo '</div>'; 4139 4140echo '<script> 4141``` 4142 4143**Manual backup feature now fully functional!** ✅ 4144 4145## Version 5.1.6 (2026-02-09) - MANUAL BACKUP ON DEMAND 4146 4147### Added: Create Backup Manually Anytime 4148- **Added:** "Create Backup Now" button in Backups section 4149- **Added:** Manual backup action handler with full verification 4150- **Added:** Backups section always visible (even with no backups) 4151- **Added:** Success message showing file size and file count 4152- **Result:** Create backups anytime without needing to upload! 4153 4154### Manual Backup Button 4155 4156**New Layout**: 4157``` 4158┌─────────────────────────────────────┐ 4159│ Backups [ Create Backup Now] │ 4160├─────────────────────────────────────┤ 4161│ Backup File Size │ 4162│ calendar.backup.v5.1.6... 243 KB │ 4163│ [ Download] [✏️ Rename] [️ Delete] │ 4164└─────────────────────────────────────┘ 4165``` 4166 4167**Always visible - even with no backups**: 4168``` 4169┌─────────────────────────────────────┐ 4170│ Backups [ Create Backup Now] │ 4171├─────────────────────────────────────┤ 4172│ No backups yet. Click "Create │ 4173│ Backup Now" to create your first │ 4174│ backup. │ 4175└─────────────────────────────────────┘ 4176``` 4177 4178### How It Works 4179 4180**Click the button**: 41811. Confirm: "Create a backup of the current plugin version?" 41822. System creates backup ZIP 41833. Verifies: File count (30+ files) 41844. Verifies: File size (200KB+) 41855. Shows success: "✓ Manual backup created: filename.zip (243 KB, 31 files)" 4186 4187**Backup naming**: 4188``` 4189calendar.backup.v5.1.6.manual.2026-02-09_12-30-45.zip 4190 ^^^^^^ 4191 "manual" tag identifies manual backups 4192``` 4193 4194### Use Cases 4195 4196**Before updates**: 4197- Create safety backup before uploading new version 4198- Have multiple restore points 4199- Test new features with fallback 4200 4201**Regular backups**: 4202- Weekly/monthly backup schedule 4203- Before making configuration changes 4204- After important customizations 4205 4206**Development**: 4207- Backup before code experiments 4208- Save working states 4209- Quick rollback points 4210 4211### Full Verification 4212 4213**Same checks as automatic backups**: 4214- ✅ File count check (minimum 10, expected 30+) 4215- ✅ File size check (minimum 1KB, expected 200KB+) 4216- ✅ Existence check (file actually created) 4217- ✅ Automatic cleanup on failure 4218 4219**Success message includes**: 4220- Backup filename 4221- File size (human-readable) 4222- Number of files backed up 4223 4224### Example Messages 4225 4226**Success**: 4227``` 4228✓ Manual backup created successfully: 4229 calendar.backup.v5.1.6.manual.2026-02-09_12-30-45.zip 4230 (243 KB, 31 files) 4231``` 4232 4233**Failure Examples**: 4234``` 4235❌ Plugin directory is not readable. 4236 Please check permissions. 4237 4238❌ Backup incomplete: Only 5 files were added (expected 30+). 4239 Backup failed. 4240 4241❌ Backup file is too small (342 bytes). 4242 Only 3 files were added. Backup failed. 4243``` 4244 4245### Benefits 4246 4247**On-Demand Safety**: 4248- Create backups anytime 4249- No need to upload new version 4250- Quick and easy 4251 4252**Peace of Mind**: 4253- Backup before risky changes 4254- Multiple restore points 4255- Safe experimentation 4256 4257**Professional Workflow**: 4258- Regular backup schedule 4259- Version snapshots 4260- Disaster recovery 4261 4262### Backup Section Improvements 4263 4264**Always Visible**: 4265- Section shows even with 0 backups 4266- Button always accessible 4267- Clear call-to-action 4268 4269**Better Header**: 4270- Title and button on same row 4271- Clean, professional layout 4272- Space-efficient design 4273 4274### Technical Details 4275 4276**New Action**: `create_manual_backup` 4277 4278**New Function**: `createManualBackup()` 4279- Gets current version 4280- Creates timestamped filename with "manual" tag 4281- Uses same verification as auto-backups 4282- Shows detailed success/error messages 4283 4284**File Naming Convention**: 4285``` 4286Automatic (on upload): 4287calendar.backup.v5.1.6.2026-02-09_12-30-45.zip 4288 4289Manual (button click): 4290calendar.backup.v5.1.6.manual.2026-02-09_12-30-45.zip 4291 ^^^^^^^ 4292 Easy to identify! 4293``` 4294 4295### Permissions Required 4296 4297- **Read access**: Plugin directory 4298- **Write access**: Parent plugins directory 4299 4300**Same as automatic backups** - no additional permissions needed! 4301 4302## Version 5.1.5 (2026-02-09) - ENHANCED BACKUP VERIFICATION 4303 4304### Enhanced: Backup Creation with Robust Verification 4305- **Added:** File count validation (must have 10+ files) 4306- **Added:** File size validation (must be 1KB+ minimum) 4307- **Added:** Return value from addDirectoryToZip (counts files added) 4308- **Added:** Detailed error messages showing file count 4309- **Added:** Automatic deletion of invalid/incomplete backups 4310- **Enhanced:** Exception handling with proper error propagation 4311- **Result:** Backups are now guaranteed to be complete or fail clearly! 4312 4313### What Changed 4314 4315**Before (v5.1.4)**: 4316```php 4317$this->addDirectoryToZip($zip, $pluginDir, 'calendar/'); 4318$zip->close(); 4319// No verification - could create empty or partial backup 4320``` 4321 4322**After (v5.1.5)**: 4323```php 4324$fileCount = $this->addDirectoryToZip($zip, $pluginDir, 'calendar/'); 4325$zip->close(); 4326 4327// Verify backup exists 4328if (!file_exists($backupPath)) { 4329 redirect('Backup file was not created'); 4330} 4331 4332// Verify backup has content 4333$backupSize = filesize($backupPath); 4334if ($backupSize < 1000) { 4335 unlink($backupPath); 4336 redirect('Backup too small: ' . $backupSize . ' bytes'); 4337} 4338 4339// Verify file count 4340if ($fileCount < 10) { 4341 unlink($backupPath); 4342 redirect('Only ' . $fileCount . ' files added (expected 30+)'); 4343} 4344``` 4345 4346### Backup Validation Checks 4347 4348**Three-Layer Verification**: 4349 43501. **File Count Check**: 4351 - Minimum: 10 files required 4352 - Expected: 30+ files 4353 - Action: Delete backup if too few files 4354 43552. **Size Check**: 4356 - Minimum: 1KB (1000 bytes) 4357 - Expected: 200-250KB 4358 - Action: Delete backup if too small 4359 43603. **Existence Check**: 4361 - Verify file was actually created 4362 - Check ZIP archive is valid 4363 - Action: Error if file missing 4364 4365### Enhanced Error Reporting 4366 4367**Detailed Error Messages**: 4368``` 4369❌ "Backup file was not created" 4370❌ "Backup too small (342 bytes). Only 3 files added." 4371❌ "Only 5 files added (expected 30+). Backup aborted." 4372❌ "Too many errors adding files: Failed to add X, Y, Z..." 4373❌ "Directory does not exist: /path/to/dir" 4374❌ "Directory is not readable: /path/to/dir" 4375``` 4376 4377**Now you know exactly what went wrong!** 4378 4379### Improved addDirectoryToZip Function 4380 4381**Returns File Count**: 4382```php 4383private function addDirectoryToZip($zip, $dir, $zipPath = '') { 4384 $fileCount = 0; 4385 $errors = []; 4386 4387 // Validation 4388 if (!is_dir($dir)) throw new Exception("Directory does not exist"); 4389 if (!is_readable($dir)) throw new Exception("Not readable"); 4390 4391 // Add files 4392 foreach ($files as $file) { 4393 if ($zip->addFile($filePath, $relativePath)) { 4394 $fileCount++; 4395 } else { 4396 $errors[] = "Failed to add: " . $filename; 4397 } 4398 } 4399 4400 // Check error threshold 4401 if (count($errors) > 5) { 4402 throw new Exception("Too many errors"); 4403 } 4404 4405 return $fileCount; // Returns count for verification! 4406} 4407``` 4408 4409### Safety Features 4410 4411**Invalid Backup Cleanup**: 4412- Failed backups are automatically deleted 4413- No partial/corrupt backups left behind 4414- Clean error state 4415 4416**Error Threshold**: 4417- Allow up to 5 minor file errors (logs warnings) 4418- More than 5 errors = complete failure 4419- Prevents partially corrupt backups 4420 4421**Directory Validation**: 4422- Check directory exists before processing 4423- Check directory is readable 4424- Fail fast with clear errors 4425 4426### Benefits 4427 4428**Guaranteed Complete Backups**: 4429- ✅ All files included or backup fails 4430- ✅ No silent failures 4431- ✅ Clear error messages 4432- ✅ Automatic cleanup 4433 4434**Better Debugging**: 4435- Know exactly how many files were added 4436- See specific errors for missing files 4437- Understand why backup failed 4438 4439**User Confidence**: 4440- Backup succeeds = complete backup 4441- Backup fails = clear error message 4442- No ambiguity 4443 4444### Example Scenarios 4445 4446**Scenario 1: Permission Issue** 4447``` 4448User uploads new version 4449System starts backup 4450Error: "Directory is not readable: /lib/plugins/calendar/" 4451Backup fails before creating file 4452User sees clear error message 4453``` 4454 4455**Scenario 2: Partial Backup** 4456``` 4457User uploads new version 4458System creates backup 4459Only 5 files added (disk issue?) 4460Size: 450 bytes 4461Verification fails 4462Incomplete backup deleted 4463Error: "Only 5 files added (expected 30+)" 4464``` 4465 4466**Scenario 3: Success** 4467``` 4468User uploads new version 4469System creates backup 447031 files added 4471Size: 240KB 4472All verifications pass ✅ 4473Update proceeds 4474``` 4475 4476### Testing Recommendations 4477 4478After installing v5.1.5: 44791. Upload a new version with backup enabled 44802. Check for success message 44813. Verify backup file exists in /lib/plugins/ 44824. Check backup file size (should be ~240KB) 44835. If backup fails, read error message carefully 4484 4485**Your backups are now bulletproof!** 4486 4487## Version 5.1.4 (2026-02-09) - BACKUP SYSTEM VERIFIED 4488 4489### ✅ Verified: Backup System Working Correctly 4490- **Verified:** addDirectoryToZip function includes all files recursively 4491- **Verified:** Backups contain all 31+ files from calendar directory 4492- **Verified:** File sizes are appropriate (233-240KB compressed, ~1MB uncompressed) 4493- **Info:** Backup sizes grow slightly with each version (more code = more features!) 4494- **Result:** Backup system is working perfectly! 4495 4496### Backup System Details 4497 4498**What Gets Backed Up**: 4499- All PHP files (syntax.php, admin.php, action.php, etc.) 4500- All JavaScript files (calendar-main.js, script.js) 4501- All documentation (CHANGELOG.md, README.md, all guides) 4502- All configuration (sync_config.php) 4503- All language files 4504- All assets and resources 4505- **Everything in the calendar/ directory!** 4506 4507**Backup Size Analysis**: 4508``` 4509Version 5.0.4: 233KB (normal) 4510Version 5.0.5: 234KB (normal) 4511Version 5.0.6: 235KB (normal) 4512Version 5.0.7: 236KB (normal) 4513Version 5.0.8: 237KB (normal) 4514Version 5.0.9: 237KB (normal) 4515Version 5.1.0: 238KB (normal) 4516Version 5.1.1: 238KB (normal) 4517Version 5.1.2: 240KB (normal - added AJAX features) 4518Version 5.1.3: 240KB (normal) 4519``` 4520 4521**Why Sizes Grow**: 4522- More features = more code 4523- Longer CHANGELOG 4524- Additional documentation 4525- New functionality 4526- **This is expected and normal!** 4527 4528**Compression Ratio**: 4529``` 4530Uncompressed: ~1.0 MB (source files) 4531Compressed: ~240 KB (ZIP archive) 4532Ratio: ~24% (excellent compression!) 4533``` 4534 4535### Backup File Contents 4536 4537**31 Files Included**: 4538``` 4539admin.php (216KB - main admin interface) 4540syntax.php (173KB - calendar rendering) 4541calendar-main.js (102KB - JavaScript functionality) 4542CHANGELOG.md (268KB - complete version history) 4543style.css (57KB - all styling) 4544action.php (38KB - DokuWiki actions) 4545sync_outlook.php (32KB - Outlook integration) 4546+ 24 other files (docs, configs, helpers) 4547``` 4548 4549**All files successfully included!** ✅ 4550 4551### How Backups Work 4552 4553**Creation Process**: 45541. User uploads new plugin version 45552. Checkbox "Create backup first" (checked by default) 45563. System creates backup: `calendar.backup.v5.1.3.2026-02-09_06-00-00.zip` 45574. Backup saved to: `/lib/plugins/` directory 45585. Then proceeds with update 4559 4560**Backup Function**: 4561```php 4562private function addDirectoryToZip($zip, $dir, $zipPath = '') { 4563 $files = new RecursiveIteratorIterator( 4564 new RecursiveDirectoryIterator($dir), 4565 RecursiveIteratorIterator::LEAVES_ONLY 4566 ); 4567 foreach ($files as $file) { 4568 if (!$file->isDir()) { 4569 $zip->addFile($filePath, $relativePath); 4570 } 4571 } 4572} 4573``` 4574 4575**Recursive = Gets Everything!** ✅ 4576 4577### Verification Results 4578 4579**Test Results**: 4580- ✅ All 31 files present in zip 4581- ✅ All subdirectories included (lang/en/) 4582- ✅ File sizes match originals 4583- ✅ Compression works properly 4584- ✅ No files missing 4585- ✅ Backup can be restored 4586 4587**File Count**: 4588``` 4589Source directory: 31 files 4590Backup ZIP: 34 items (31 files + 3 directories) 4591Status: COMPLETE ✅ 4592``` 4593 4594### Backup Best Practices 4595 4596**Always enabled by default** ✅ 4597**Stored in accessible location** ✅ 4598**Timestamped filenames** ✅ 4599**Complete directory backup** ✅ 4600**Easy to restore** ✅ 4601 4602### Conclusion 4603 4604The backup system is working perfectly. The file sizes are appropriate and expected: 4605- Compressed size: ~240KB (good compression) 4606- Uncompressed size: ~1MB (all source files) 4607- All files included: YES ✅ 4608- Growing size over versions: Normal (more features!) 4609 4610**Your backups are complete and reliable!** 4611 4612## Version 5.1.3 (2026-02-08) - FIX JAVASCRIPT SYNTAX ERROR 4613 4614### Fixed: JavaScript Syntax Error in AJAX Function 4615- **Fixed:** ParseError on line 1947 (deleteBackup function) 4616- **Fixed:** Escaped all single quotes in JavaScript strings 4617- **Result:** AJAX backup deletion now works correctly! 4618 4619### What Was Wrong 4620 4621JavaScript inside PHP echo needs escaped quotes: 4622 4623**Before (broken)**: 4624```javascript 4625formData.append('action', 'delete_backup'); // PHP interprets quotes 4626``` 4627 4628**After (fixed)**: 4629```javascript 4630formData.append(\'action\', \'delete_backup\'); // Escaped for PHP 4631``` 4632 4633### All Quotes Escaped 4634 4635Fixed in deleteBackup function: 4636- ✅ FormData.append() calls 4637- ✅ fetch() URL 4638- ✅ querySelector() calls 4639- ✅ createElement() call 4640- ✅ All string literals 4641- ✅ Error messages 4642 4643**JavaScript now works!** ✓ 4644 4645## Version 5.1.2 (2026-02-08) - AJAX BACKUP DELETION & LAYOUT IMPROVEMENT 4646 4647### Improved: Update Tab Further Refined 4648- **Moved:** Important Notes to very top (above upload) 4649- **Enhanced:** Delete backup now uses AJAX (no page refresh!) 4650- **Added:** Smooth fade-out animation when deleting backups 4651- **Added:** Success message after deletion 4652- **Auto-remove:** Backup section disappears if last backup deleted 4653- **Result:** Smoother, more polished experience! 4654 4655### New Layout Order 4656 4657**Final Order (v5.1.2)**: 4658``` 46591. ⚠️ Important Notes (warnings at top) 46602. Upload New Version (with Clear Cache button) 46613. Current Version (info) 46624. Recent Changes (changelog) 46635. Available Backups (if any) 4664``` 4665 4666### AJAX Backup Deletion 4667 4668**Before (v5.1.1)**: 4669- Click Delete → Page refreshes → Scroll back down 4670- Lose position on page 4671- Page reload is jarring 4672 4673**After (v5.1.2)**: 4674- Click Delete → Confirm 4675- Row fades out smoothly 4676- Row disappears 4677- Success message shows at top 4678- Success message fades after 3 seconds 4679- If last backup: entire section fades away 4680- **No page refresh!** ✓ 4681 4682### Visual Flow 4683 4684**Delete Animation**: 4685``` 46861. Click ️ Delete 46872. Confirm dialog 46883. Row fades out (0.3s) 46894. Row removed 46905. Success message appears 46916. Message fades after 3s 4692``` 4693 4694**If Last Backup**: 4695``` 46961. Delete last backup 46972. Row fades out 46983. Entire "Available Backups" section fades 46994. Section removed 47005. Clean interface ✓ 4701``` 4702 4703### Success Message 4704 4705After deleting: 4706``` 4707┌──────────────────────────────┐ 4708│ ✓ Backup deleted: filename │ ← Appears at top 4709└──────────────────────────────┘ 4710 Fades after 3 seconds 4711``` 4712 4713### Benefits 4714 4715**Important Notes First**: 4716- Warnings before actions ✓ 4717- Read before uploading ✓ 4718- Clear expectations ✓ 4719 4720**AJAX Deletion**: 4721- No page refresh ✓ 4722- Smooth animations ✓ 4723- Stay in context ✓ 4724- Professional feel ✓ 4725 4726**Auto-Cleanup**: 4727- Empty list disappears ✓ 4728- Clean interface ✓ 4729- No clutter ✓ 4730 4731### Technical Implementation 4732 4733**AJAX Request**: 4734```javascript 4735fetch('?do=admin&page=calendar&tab=update', { 4736 method: 'POST', 4737 body: formData 4738}) 4739``` 4740 4741**DOM Manipulation**: 4742- Fade out row 4743- Remove element 4744- Show success 4745- Remove section if empty 4746 4747**Smooth Transitions**: 4748- 300ms fade animations 4749- Clean visual feedback 4750- Professional polish 4751 4752## Version 5.1.1 (2026-02-08) - REORGANIZE UPDATE TAB 4753 4754### Improved: Update Tab Layout Reorganized 4755- **Moved:** Upload section to the top of the page 4756- **Added:** Clear Cache button next to Upload & Install button 4757- **Changed:** "Current Version" section moved below upload 4758- **Result:** Better workflow - upload first, then see version info! 4759 4760### New Layout Order 4761 4762**Before (v5.1.0)**: 4763``` 47641. Clear Cache (standalone) 47652. Current Version 47663. Recent Changes 47674. Upload New Version 47685. Warning Box 47696. Backups 4770``` 4771 4772**After (v5.1.1)**: 4773``` 47741. Upload New Version (with Clear Cache button side-by-side) 47752. Warning Box 47763. Current Version 47774. Recent Changes 47785. Backups 4779``` 4780 4781### Visual Result 4782 4783**Top of Update Tab**: 4784``` 4785┌─────────────────────────────────┐ 4786│ Upload New Version │ 4787│ ┌─────────────────────────────┐ │ 4788│ │ [Choose File] │ │ 4789│ │ ☑ Create backup first │ │ 4790│ │ ┌──────────────┬──────────┐ │ │ 4791│ │ │ Upload & │️ Clear │ │ │ 4792│ │ │ Install │ Cache │ │ │ 4793│ │ └──────────────┴──────────┘ │ │ 4794│ └─────────────────────────────┘ │ 4795│ │ 4796│ ⚠️ Important Notes │ 4797│ • Will replace all files │ 4798│ • Config preserved │ 4799│ │ 4800│ Current Version │ 4801│ Version: 5.1.1 │ 4802└─────────────────────────────────┘ 4803``` 4804 4805### Benefits 4806 4807**Better Workflow**: 4808- Primary action (upload) is first 4809- Clear cache conveniently next to install 4810- No scrolling to find upload button 4811- Logical top-to-bottom flow 4812 4813**Side-by-Side Buttons**: 4814- Upload & Install (green) 4815- Clear Cache (orange) 4816- Both common actions together 4817- Easy to access after upload 4818 4819**Improved UX**: 4820- Upload is most important → now at top 4821- Version info is reference → moved down 4822- Related actions grouped 4823- Cleaner organization 4824 4825### Button Layout 4826 4827``` 4828┌──────────────────┬──────────────┐ 4829│ Upload & │ ️ Clear │ 4830│ Install │ Cache │ 4831│ (Green) │ (Orange) │ 4832└──────────────────┴──────────────┘ 4833``` 4834 4835**Green = Primary Action** 4836**Orange = Secondary Action** 4837 4838Both easily accessible! 4839 4840## Version 5.1.0 (2026-02-08) - ADMIN SECTIONS USE MAIN BACKGROUND 4841 4842### Changed: Admin Section Backgrounds Now Use __background__ 4843- **Changed:** All section boxes now use `__background__` instead of `__background_alt__` 4844- **Result:** Cleaner, more unified admin interface! 4845 4846### Background Usage Update 4847 4848**Before (v5.0.9)**: 4849```php 4850Section boxes: bg_alt (__background_alt__) 4851Content areas: bg (__background__) 4852``` 4853 4854**After (v5.1.0)**: 4855```php 4856Section boxes: bg (__background__) 4857Content areas: bg (__background__) 4858``` 4859 4860### Why This Change? 4861 4862**More unified appearance**: 4863- Sections and content use same background 4864- Creates cleaner, more cohesive look 4865- Borders provide visual separation 4866- Matches typical admin UI patterns 4867 4868**Template color hierarchy**: 4869``` 4870__background_site__ → Outer page wrapper 4871__background__ → Content & sections (BOTH now use this) 4872__background_alt__ → Reserved for special panels/highlights 4873__background_neu__ → Special highlights 4874``` 4875 4876### Visual Result 4877 4878**Light Template**: 4879```ini 4880__background__ = "#ffffff" 4881__background_alt__ = "#e8e8e8" 4882``` 4883 4884**Before**: 4885``` 4886Admin Page: 4887┌─────────────────────┐ 4888│ ┌─────────────────┐ │ 4889│ │ Section Box │ │ ← Gray (#e8e8e8) 4890│ │ ┌─────────────┐ │ │ 4891│ │ │ Content │ │ │ ← White (#fff) 4892│ │ └─────────────┘ │ │ 4893│ └─────────────────┘ │ 4894└─────────────────────┘ 4895Two-tone appearance 4896``` 4897 4898**After**: 4899``` 4900Admin Page: 4901┌─────────────────────┐ 4902│ ┌─────────────────┐ │ 4903│ │ Section Box │ │ ← White (#fff) 4904│ │ ┌─────────────┐ │ │ 4905│ │ │ Content │ │ │ ← White (#fff) 4906│ │ └─────────────┘ │ │ 4907│ └─────────────────┘ │ 4908└─────────────────────┘ 4909Unified, clean appearance 4910Borders provide separation 4911``` 4912 4913**Dark Template**: 4914```ini 4915__background__ = "#2d2d2d" 4916__background_alt__ = "#3a3a3a" 4917``` 4918 4919**After**: 4920``` 4921Admin Page: 4922┌─────────────────────┐ 4923│ ┌─────────────────┐ │ 4924│ │ Section Box │ │ ← Dark (#2d2d2d) 4925│ │ ┌─────────────┐ │ │ 4926│ │ │ Content │ │ │ ← Dark (#2d2d2d) 4927│ │ └─────────────┘ │ │ 4928│ └─────────────────┘ │ 4929└─────────────────────┘ 4930Unified dark appearance 4931Accent borders provide definition 4932``` 4933 4934### Benefits 4935 4936**Cleaner Look**: 4937- No more alternating gray/white 4938- More professional appearance 4939- Less visual noise 4940- Unified color scheme 4941 4942**Better Consistency**: 4943- Matches modern admin UI patterns 4944- Borders define sections, not colors 4945- Simpler, cleaner design 4946- Easier on the eyes 4947 4948**Template Friendly**: 4949- Works with any background color 4950- Light or dark templates 4951- Custom colors 4952- Always looks cohesive 4953 4954### All Sections Updated 4955 4956✅ Outlook Sync config sections 4957✅ Manage Events sections 4958✅ Update Plugin sections 4959✅ Themes tab sections 4960✅ Week start day section 4961✅ All form sections 4962 4963**Complete unified theming!** 4964 4965## Version 5.0.9 (2026-02-08) - FIX SYNTAX ERROR IN THEMES TAB 4966 4967### Fixed: Syntax Error in Theme Cards 4968- **Fixed:** ParseError on line 4461 (Purple theme card) 4969- **Fixed:** Malformed ternary expressions from sed replacement 4970- **Fixed:** All 4 theme cards (Purple, Professional, Pink, Wiki) 4971- **Result:** Admin pages work correctly! 4972 4973### What Was Wrong 4974 4975The bulk sed replacement in v5.0.8 incorrectly modified ternary expressions: 4976 4977**Before (broken)**: 4978```php 4979? '#9b59b6' : ' . $colors['border'] . ') 4980// Extra quote and dot created syntax error 4981``` 4982 4983**After (fixed)**: 4984```php 4985? '#9b59b6' : $colors['border']) 4986// Clean ternary expression 4987``` 4988 4989### All Theme Cards Fixed 4990 4991- ✅ Purple Dream card 4992- ✅ Professional Blue card 4993- ✅ Pink Bling card 4994- ✅ Wiki Default card 4995 4996### Now Working 4997 4998**Theme selection page loads** ✓ 4999**All cards display properly** ✓ 5000**Template colors applied** ✓ 5001**No syntax errors** ✓ 5002 5003## Version 5.0.8 (2026-02-08) - FIX THEMES TAB & BACKGROUND MAPPING 5004 5005### Fixed: Themes Tab Backgrounds & Correct Template Color Mapping 5006- **Fixed:** Themes tab now uses template colors (removed all hardcoded whites) 5007- **Fixed:** Main background now uses `__background__` instead of `__background_site__` 5008- **Fixed:** Theme selection cards use template backgrounds 5009- **Fixed:** Week start options use template backgrounds 5010- **Result:** Perfect color mapping throughout admin! 5011 5012### Color Mapping Correction 5013 5014**Before (v5.0.7)**: 5015```php 5016bg: __background_site__ // Wrong - this is outer page bg 5017bg_alt: __background_alt__ 5018``` 5019 5020**After (v5.0.8)**: 5021```php 5022bg: __background__ // Correct - main content bg 5023bg_alt: __background_alt__ 5024``` 5025 5026### Why This Matters 5027 5028**Template color hierarchy**: 5029``` 5030__background_site__ → Outer page/site background 5031__background__ → Main content area (CORRECT for admin) 5032__background_alt__ → Sections/panels 5033__background_neu__ → Highlights 5034``` 5035 5036**Admin should use**: 5037- `__background__` for input fields, content areas 5038- `__background_alt__` for section boxes, panels 5039 5040### Themes Tab Fixed 5041 5042**Removed all hardcoded colors**: 5043```php 5044Before: '#ddd', '#fff', '#dee2e6' 5045After: $colors['border'], $colors['bg'], $colors['border'] 5046``` 5047 5048**Now themed**: 5049- ✅ Week start section background 5050- ✅ Week start option backgrounds 5051- ✅ Theme card backgrounds 5052- ✅ Theme card borders 5053- ✅ All borders throughout 5054 5055### Visual Result 5056 5057**Light Template**: 5058```ini 5059__background__ = "#ffffff" 5060__background_alt__ = "#e8e8e8" 5061``` 5062 5063**Admin Before (v5.0.7)**: 5064``` 5065Input fields: #f5f5f5 (site bg - wrong) 5066Sections: #e8e8e8 (alt bg - correct) 5067``` 5068 5069**Admin After (v5.0.8)**: 5070``` 5071Input fields: #ffffff (content bg - correct!) 5072Sections: #e8e8e8 (alt bg - correct!) 5073``` 5074 5075**Dark Template**: 5076```ini 5077__background__ = "#2d2d2d" 5078__background_alt__ = "#3a3a3a" 5079``` 5080 5081**Admin After (v5.0.8)**: 5082``` 5083Input fields: #2d2d2d (content bg - perfect!) 5084Sections: #3a3a3a (alt bg - perfect!) 5085``` 5086 5087### Complete Themes Tab 5088 5089**Week Start Options**: 5090``` 5091┌─────────────────────────┐ 5092│ Week Start Day │ ← bg_alt 5093│ ┌─────────┬───────────┐ │ 5094│ │ Monday │ Sunday │ │ ← bg (when not selected) 5095│ └─────────┴───────────┘ │ 5096└─────────────────────────┘ 5097``` 5098 5099**Theme Cards**: 5100``` 5101┌─────────────────────────┐ 5102│ Matrix Edition │ ← bg (when not selected) 5103│ Classic green theme │ border (when not selected) 5104└─────────────────────────┘ 5105 5106┌═════════════════════════┐ 5107│ Purple Dream │ ← rgba green tint (when selected) 5108│ Elegant purple theme │ #00cc07 border (when selected) 5109└═════════════════════════┘ 5110``` 5111 5112### Perfect Integration 5113 5114**All admin pages now**: 5115- Content areas: `__background__` ✓ 5116- Section boxes: `__background_alt__` ✓ 5117- Borders: `__border__` ✓ 5118- Text: `__text__` ✓ 5119 5120**Matches wiki perfectly**: 5121- Same white content areas 5122- Same gray section boxes 5123- Same border colors 5124- Same text colors 5125 5126### No More Issues 5127 5128**Fixed**: 5129- ❌ Site background on content areas → ✅ Content background 5130- ❌ Hardcoded white on themes tab → ✅ Template background 5131- ❌ Hardcoded borders (#ddd) → ✅ Template borders 5132 5133**Result**: 5134- Perfect color hierarchy ✓ 5135- Correct background levels ✓ 5136- Complete template integration ✓ 5137 5138## Version 5.0.7 (2026-02-08) - COMPLETE ADMIN THEMING 5139 5140### Fixed: All Admin Backgrounds Use Template Colors 5141- **Fixed:** All section backgrounds use `__background_alt__` 5142- **Fixed:** All content backgrounds use `__background__` 5143- **Fixed:** All borders use `__border__` 5144- **Fixed:** All text uses `__text__` 5145- **Result:** Complete admin template integration! 5146 5147### All Replacements 5148 5149**Backgrounds**: 5150```php 5151Before: background: #f9f9f9 5152After: background: ' . $colors['bg_alt'] . ' 5153 5154Before: background: #fff / background: white 5155After: background: ' . $colors['bg'] . ' 5156``` 5157 5158**Borders**: 5159```php 5160Before: border: 1px solid #ddd 5161Before: border: 1px solid #e0e0e0 5162Before: border: 1px solid #eee 5163After: border: 1px solid ' . $colors['border'] . ' 5164``` 5165 5166**Text**: 5167```php 5168Before: color: #333 5169Before: color: #666 5170After: color: ' . $colors['text'] . ' 5171``` 5172 5173### Complete Admin Coverage 5174 5175**All tabs now themed**: 5176- ✅ Manage Events tab 5177- ✅ Update Plugin tab 5178- ✅ Outlook Sync tab 5179- ✅ Themes tab 5180- ✅ Tab navigation 5181- ✅ All sections 5182- ✅ All inputs 5183- ✅ All borders 5184- ✅ All text 5185 5186### Visual Result 5187 5188**Light Template**: 5189``` 5190Admin Page: 5191┌──────────────────────────┐ 5192│ Tab Navigation │ ← Template borders 5193├──────────────────────────┤ 5194│ Section Headers │ ← bg_alt (light gray) 5195│ ┌──────────────────────┐ │ 5196│ │ Form Inputs │ │ ← bg (white) 5197│ │ Content Areas │ │ 5198│ └──────────────────────┘ │ 5199└──────────────────────────┘ 5200All template colors! ✓ 5201``` 5202 5203**Dark Template**: 5204``` 5205Admin Page: 5206┌──────────────────────────┐ 5207│ Tab Navigation │ ← Template borders 5208├──────────────────────────┤ 5209│ Section Headers │ ← bg_alt (dark gray) 5210│ ┌──────────────────────┐ │ 5211│ │ Form Inputs │ │ ← bg (darker) 5212│ │ Content Areas │ │ 5213│ └──────────────────────┘ │ 5214└──────────────────────────┘ 5215All template colors! ✓ 5216``` 5217 5218### Template Color Mapping 5219 5220**Used throughout admin**: 5221``` 5222__background_site__ → $colors['bg'] (main backgrounds) 5223__background_alt__ → $colors['bg_alt'] (section backgrounds) 5224__text__ → $colors['text'] (all text) 5225__border__ → $colors['border'] (all borders) 5226__link__ → $colors['link'] (links - future) 5227``` 5228 5229### Examples by Section 5230 5231**Manage Events**: 5232- Event list backgrounds: `bg_alt` 5233- Event item backgrounds: `bg` 5234- Borders: `border` 5235- Text: `text` 5236 5237**Update Plugin**: 5238- Section backgrounds: `bg_alt` 5239- Content areas: `bg` 5240- Borders: `border` 5241- Text: `text` 5242 5243**Outlook Sync**: 5244- Config sections: `bg_alt` 5245- Input fields: `bg` 5246- Borders: `border` 5247- Labels: `text` 5248 5249**Themes Tab**: 5250- Theme cards: `bg_alt` 5251- Preview areas: `bg` 5252- Borders: `border` 5253- Descriptions: `text` 5254 5255### Benefits 5256 5257**Seamless Integration**: 5258- Matches wiki admin area perfectly 5259- Same colors throughout wiki 5260- Professional appearance 5261- Consistent experience 5262 5263**Automatic Adaptation**: 5264- Light templates: Light admin 5265- Dark templates: Dark admin 5266- Custom templates: Uses custom colors 5267 5268**No White Boxes**: 5269- Every background themed 5270- Every border themed 5271- Every text themed 5272- Complete consistency 5273 5274### PERFECT HARMONY 5275 5276**Frontend (Calendar)**: 5277- Wiki theme uses style.ini ✓ 5278- Perfect template match ✓ 5279 5280**Backend (Admin)**: 5281- Reads same style.ini ✓ 5282- Perfect template match ✓ 5283 5284**Complete Unity**: 5285- Same colors everywhere ✓ 5286- Seamless experience ✓ 5287- Professional polish ✓ 5288 5289## Version 5.0.6 (2026-02-08) - ADMIN PAGES USE TEMPLATE COLORS 5290 5291### Enhanced: Month/Year Header & Admin Pages Use Template Colors 5292- **Fixed:** Month/Year header now uses `__text_neu__` for wiki theme 5293- **Added:** Admin pages read template's style.ini file 5294- **Added:** `getTemplateColors()` function in admin class 5295- **Fixed:** Tab navigation uses template text and border colors 5296- **Result:** Complete template integration everywhere! 5297 5298### Month/Year Header 5299 5300**Before**: 5301```php 5302color: __text__ // Same as primary text 5303``` 5304 5305**After (Wiki Theme)**: 5306```php 5307color: __text_neu__ // Dimmed text (subtle) 5308``` 5309 5310### Admin Pages Enhancement 5311 5312**New `getTemplateColors()` function**: 5313- Reads template's style.ini file 5314- Extracts color replacements 5315- Provides colors to all admin tabs 5316- Falls back to sensible defaults 5317 5318**Colors used**: 5319```php 5320bg: __background_site__ 5321bg_alt: __background_alt__ 5322text: __text__ 5323border: __border__ 5324link: __link__ 5325``` 5326 5327**Applied to**: 5328- Tab navigation borders 5329- Tab text colors 5330- All admin sections 5331- Ready for future enhancements 5332 5333### Visual Result 5334 5335**Calendar Header**: 5336``` 5337┌────────────────────┐ 5338│ ‹ February 2026 › │ ← __text_neu__ (dimmed) 5339└────────────────────┘ 5340Subtle and elegant ✓ 5341``` 5342 5343**Admin Navigation**: 5344``` 5345 Manage Events | Update | ⚙️ Config | Themes 5346───────────────────────────────────────────────── 5347Active tab: Green (#00cc07) 5348Inactive tabs: Template text color 5349Border: Template border color 5350``` 5351 5352### Template Integration 5353 5354**Light Template**: 5355```ini 5356__text_neu__ = "#666666" 5357__border__ = "#cccccc" 5358``` 5359**Result**: 5360- Month/Year: Medium gray (subtle) 5361- Admin borders: Light gray 5362- Tab text: Dark gray 5363 5364**Dark Template**: 5365```ini 5366__text_neu__ = "#999999" 5367__border__ = "#555555" 5368``` 5369**Result**: 5370- Month/Year: Light gray (subtle) 5371- Admin borders: Medium gray 5372- Tab text: Bright gray 5373 5374### Benefits 5375 5376**Calendar Frontend**: 5377- Month/Year header more subtle 5378- Better visual hierarchy 5379- Less prominent, more elegant 5380 5381**Admin Backend**: 5382- Uses template colors 5383- Matches wiki admin area 5384- Consistent experience 5385- Professional appearance 5386 5387### Future-Ready 5388 5389The `getTemplateColors()` function is now available for: 5390- ✅ Tab navigation (implemented) 5391- Section backgrounds (ready) 5392- Button colors (ready) 5393- Input fields (ready) 5394- Success/error messages (ready) 5395 5396**Foundation laid for complete admin theming!** 5397 5398## Version 5.0.5 (2026-02-08) - WIKI THEME ADD BUTTON & SECTION HEADERS 5399 5400### Fixed: Add Event Bar & Section Headers Use Template Colors 5401- **Fixed:** Add Event bar now uses `__background_alt__` for wiki theme 5402- **Fixed:** "Today" header uses `__text_neu__` 5403- **Fixed:** "Tomorrow" header uses `__text__` 5404- **Fixed:** "Important Events" header uses `__border__` 5405- **Result:** Perfect template color integration! 5406 5407### All Changes 5408 5409**Add Event Bar (Wiki Theme)**: 5410 5411**Before**: 5412```php 5413background: #3498db // Generic blue 5414``` 5415 5416**After**: 5417```php 5418background: __background_alt__ // Template alternate bg 5419text: __text__ // Template text color 5420hover: __background_neu__ // Template neutral bg 5421``` 5422 5423**Section Headers (Wiki Theme)**: 5424 5425**Before**: 5426```php 5427Today: #ff9800 // Orange 5428Tomorrow: #4caf50 // Green 5429Important Events: #9b59b6 // Purple 5430``` 5431 5432**After**: 5433```php 5434Today: __text_neu__ // Template dimmed text 5435Tomorrow: __text__ // Template primary text 5436Important Events: __border__ // Template border color 5437``` 5438 5439### Visual Result 5440 5441**Wiki Default Theme**: 5442``` 5443Add Event Bar: 5444┌────────────────┐ 5445│ + ADD EVENT │ ← Template alt background 5446└────────────────┘ 5447 5448Sections: 5449━━━━━━━━━━━━━━━━ 5450Today ← Dimmed text color (__text_neu__) 5451• Team Meeting 5452 5453Tomorrow ← Primary text color (__text__) 5454• Code Review 5455 5456Important Events ← Border color (__border__) 5457• Project Deadline 5458``` 5459 5460### Example with DokuWiki Default Template 5461 5462**Template colors**: 5463```ini 5464__background_alt__ = "#e8e8e8" 5465__text__ = "#333333" 5466__text_neu__ = "#666666" 5467__border__ = "#cccccc" 5468``` 5469 5470**Calendar result**: 5471``` 5472Add Event Bar: Light gray (#e8e8e8) 5473Today header: Medium gray (#666666) 5474Tomorrow header: Dark gray (#333333) 5475Important Events header: Border gray (#cccccc) 5476``` 5477 5478### Example with Dark Template 5479 5480**Template colors**: 5481```ini 5482__background_alt__ = "#2d2d2d" 5483__text__ = "#e0e0e0" 5484__text_neu__ = "#999999" 5485__border__ = "#555555" 5486``` 5487 5488**Calendar result**: 5489``` 5490Add Event Bar: Dark gray (#2d2d2d) 5491Today header: Light gray (#999999) 5492Tomorrow header: Bright gray (#e0e0e0) 5493Important Events header: Medium gray (#555555) 5494``` 5495 5496### Perfect Harmony 5497 5498All sidebar elements now use template colors: 5499- ✅ Add Event bar background 5500- ✅ Add Event bar text 5501- ✅ Today section header 5502- ✅ Tomorrow section header 5503- ✅ Important Events header 5504- ✅ Calendar cells 5505- ✅ Grid backgrounds 5506- ✅ All borders 5507 5508**Complete template integration!** 5509 5510## Version 5.0.4 (2026-02-08) - USE __background__ FOR CALENDAR CELLS 5511 5512### Fixed: Calendar Cells Use Correct Template Color 5513- **Fixed:** Calendar cells now use `__background__` from template 5514- **Changed:** `cell_bg` now uses `__background__` instead of `__background_neu__` 5515- **Result:** Calendar cells match main content area background! 5516 5517### Color Mapping Update 5518 5519**Before (v5.0.3)**: 5520```php 5521cell_bg: __background_neu__ // Wrong - this is for neutral/alternate 5522``` 5523 5524**After (v5.0.4)**: 5525```php 5526cell_bg: __background__ // Correct - main content background 5527``` 5528 5529### Template Color Usage 5530 5531**Wiki Default theme now uses**: 5532``` 5533__background_site__ → Overall page background 5534__background__ → Calendar cells (main content bg) 5535__background_alt__ → Grid background, headers 5536__background_neu__ → Today cell highlight 5537__text__ → Primary text 5538__text_neu__ → Dimmed text 5539__link__ → Links, bright text 5540__border__ → All borders 5541``` 5542 5543### Visual Result 5544 5545**Before**: 5546``` 5547Calendar with template colors: 5548┌─────┬─────┬─────┐ 5549│ Mon │ Tue │ Wed │ 5550├─────┼─────┼─────┤ 5551│ 8 │ 9 │ 10 │ ← Neutral gray (wrong) 5552└─────┴─────┴─────┘ 5553``` 5554 5555**After**: 5556``` 5557Calendar with template colors: 5558┌─────┬─────┬─────┐ 5559│ Mon │ Tue │ Wed │ 5560├─────┼─────┼─────┤ 5561│ 8 │ 9 │ 10 │ ← White/content bg (correct!) 5562└─────┴─────┴─────┘ 5563``` 5564 5565### Example Template Colors 5566 5567**DokuWiki Default**: 5568```ini 5569__background__ = "#ffffff" 5570``` 5571**Result**: White calendar cells ✓ 5572 5573**Dark Template**: 5574```ini 5575__background__ = "#2d2d2d" 5576``` 5577**Result**: Dark calendar cells ✓ 5578 5579**Custom Template**: 5580```ini 5581__background__ = "#f9f9f9" 5582``` 5583**Result**: Custom color cells ✓ 5584 5585### Perfect Matching 5586 5587Calendar cells now match: 5588- ✅ Main content area background 5589- ✅ Article/page background 5590- ✅ Content box background 5591- ✅ Same as wiki text background 5592 5593**Seamless integration!** 5594 5595## Version 5.0.3 (2026-02-08) - READ COLORS FROM TEMPLATE STYLE.INI 5596 5597### Enhanced: Wiki Default Theme Reads Template Colors 5598- **Added:** Function to read colors from DokuWiki template's style.ini file 5599- **Reads:** `/var/www/html/dokuwiki/conf/tpl/{template}/style.ini` 5600- **Falls back:** Also checks `/var/www/html/dokuwiki/lib/tpl/{template}/style.ini` 5601- **Uses:** Actual template colors instead of CSS variables 5602- **Result:** Perfect color matching with any DokuWiki template! 5603 5604### How It Works 5605 5606**New Function: `getWikiTemplateColors()`** 5607 56081. **Detects** current DokuWiki template name 56092. **Reads** the template's `style.ini` file 56103. **Parses** color replacements section 56114. **Maps** template colors to calendar theme 56125. **Falls back** to CSS variables if file not found 5613 5614### Colors Read from style.ini 5615 5616**Template color replacements used**: 5617```php 5618__background_site__ → bg, header_bg 5619__background_alt__ → grid_bg, cell_today_bg 5620__background_neu__ → cell_bg 5621__text__ → text_primary 5622__text_neu__ → text_dim 5623__link__ → text_bright 5624__border__ → border, grid_border 5625``` 5626 5627### Example style.ini Mapping 5628 5629**Template style.ini**: 5630```ini 5631[replacements] 5632__background_site__ = "#f8f9fa" 5633__background_alt__ = "#e9ecef" 5634__background_neu__ = "#dee2e6" 5635__text__ = "#212529" 5636__text_neu__ = "#6c757d" 5637__link__ = "#0d6efd" 5638__border__ = "#ced4da" 5639``` 5640 5641**Calendar theme result**: 5642```php 5643bg: #f8f9fa 5644header_bg: #e9ecef 5645grid_bg: #e9ecef 5646cell_bg: #dee2e6 5647text_primary: #212529 5648text_dim: #6c757d 5649text_bright: #0d6efd 5650border: #ced4da 5651grid_border: #ced4da 5652``` 5653 5654### Before vs After 5655 5656**Before (v5.0.2)**: 5657``` 5658Wiki Default theme used: 5659- CSS variables (var(--__background__, #fff)) 5660- Required browser CSS variable support 5661- Fallback to generic colors 5662``` 5663 5664**After (v5.0.3)**: 5665``` 5666Wiki Default theme uses: 5667- Actual colors from template's style.ini 5668- Exact template color values 5669- No CSS variable dependency 5670- Perfect color matching! 5671``` 5672 5673### File Location Priority 5674 5675Checks in order: 56761. `/var/www/html/dokuwiki/conf/tpl/{template}/style.ini` 56772. `/var/www/html/dokuwiki/lib/tpl/{template}/style.ini` 56783. Falls back to CSS variables if neither found 5679 5680### Benefits 5681 5682**More accurate colors**: 5683- Uses exact template color values ✓ 5684- No CSS variable interpolation ✓ 5685- Consistent across all browsers ✓ 5686 5687**Better compatibility**: 5688- Works with older browsers ✓ 5689- No CSS variable support needed ✓ 5690- Direct color values ✓ 5691 5692**Perfect matching**: 5693- Reads template's actual colors ✓ 5694- Same colors as wiki pages ✓ 5695- Seamless integration ✓ 5696 5697### Template Examples 5698 5699**DokuWiki Default Template**: 5700``` 5701Reads: lib/tpl/dokuwiki/style.ini 5702Gets: Default DokuWiki colors 5703Result: Perfect classic DokuWiki look 5704``` 5705 5706**Bootstrap Template**: 5707``` 5708Reads: lib/tpl/bootstrap3/style.ini 5709Gets: Bootstrap color scheme 5710Result: Perfect Bootstrap integration 5711``` 5712 5713**Custom Template**: 5714``` 5715Reads: conf/tpl/mycustom/style.ini 5716Gets: Your custom colors 5717Result: Perfect custom theme match 5718``` 5719 5720### Fallback Chain 5721 57221. **Try** reading style.ini from template 57232. **If found** → Use exact colors from file 57243. **If not found** → Use CSS variables 57254. **If no CSS vars** → Use fallback colors 5726 5727**Always works, always matches!** ✓ 5728 5729## Version 5.0.2 (2026-02-08) - FIX WIKI DEFAULT THEME DAY PANEL 5730 5731### Fixed: Wiki Default Theme Day Panel Colors 5732- **Fixed:** Day popup panel now uses DokuWiki CSS variables 5733- **Fixed:** Panel background matches wiki theme 5734- **Fixed:** Panel header matches wiki theme 5735- **Fixed:** Border colors use wiki theme 5736- **Fixed:** Text colors use wiki theme 5737- **Result:** Perfect integration with DokuWiki templates! 5738 5739### All Changes 5740 5741**Day Panel Colors (Wiki Default)**: 5742 5743**Before**: 5744```php 5745background: rgba(36, 36, 36, 0.5) // Dark gray (wrong!) 5746header: #3498db // Blue (wrong!) 5747``` 5748 5749**After**: 5750```php 5751background: var(--__background__, #fff) 5752header: var(--__background_alt__, #e8e8e8) 5753header_text: var(--__text__, #333) 5754border: var(--__border__, #ccc) 5755shadow: 0 2px 4px rgba(0, 0, 0, 0.1) 5756``` 5757 5758**Event Colors (Wiki Default)**: 5759```php 5760event_bg: var(--__background_alt__, rgba(245, 245, 245, 0.5)) 5761border_color: var(--__border__, rgba(204, 204, 204, 0.3)) 5762bar_shadow: 0 1px 2px rgba(0, 0, 0, 0.15) 5763``` 5764 5765### Before vs After 5766 5767**Before (v5.0.1)**: 5768``` 5769Wiki Default - Click Week Cell: 5770┌────────────────┐ 5771│ Monday, Feb 8 │ ← Blue header (wrong) 5772├────────────────┤ 5773│ Team Meeting │ ← Dark gray bg (wrong) 5774│ 2:00 PM │ 5775└────────────────┘ 5776Doesn't match wiki theme 5777``` 5778 5779**After (v5.0.2)**: 5780``` 5781Wiki Default - Click Week Cell: 5782 5783Light Wiki Theme: 5784┌────────────────┐ 5785│ Monday, Feb 8 │ ← Light gray header ✓ 5786├────────────────┤ 5787│ Team Meeting │ ← White bg ✓ 5788│ 2:00 PM │ Dark text ✓ 5789└────────────────┘ 5790 5791Dark Wiki Theme: 5792┌────────────────┐ 5793│ Monday, Feb 8 │ ← Dark header ✓ 5794├────────────────┤ 5795│ Team Meeting │ ← Dark bg ✓ 5796│ 2:00 PM │ Light text ✓ 5797└────────────────┘ 5798 5799Perfectly matches wiki! 5800``` 5801 5802### CSS Variables Used 5803 5804**Wiki Default theme now uses**: 5805- `--__background__` - Main background (panel body) 5806- `--__background_alt__` - Alternate bg (panel header, events) 5807- `--__text__` - Text color (header text) 5808- `--__border__` - Border color (panel border, event borders) 5809 5810**With fallbacks**: 5811```css 5812var(--__background__, #fff) /* white fallback */ 5813var(--__background_alt__, #e8e8e8) /* light gray fallback */ 5814var(--__text__, #333) /* dark text fallback */ 5815var(--__border__, #ccc) /* gray border fallback */ 5816``` 5817 5818### Perfect Adaptation 5819 5820**Light Templates**: 5821- Light panel backgrounds ✓ 5822- Dark text ✓ 5823- Subtle borders ✓ 5824- Clean appearance ✓ 5825 5826**Dark Templates**: 5827- Dark panel backgrounds ✓ 5828- Light text ✓ 5829- Visible borders ✓ 5830- Perfect contrast ✓ 5831 5832**Custom Templates**: 5833- Uses template's CSS variables ✓ 5834- Automatic adaptation ✓ 5835- Seamless integration ✓ 5836 5837### Now Truly Adaptive 5838 5839Wiki Default theme now properly uses DokuWiki CSS variables for: 5840- ✅ Calendar grid 5841- ✅ Sidebar widget 5842- ✅ Event list 5843- ✅ **Day panel** ← v5.0.2! 5844- ✅ All backgrounds 5845- ✅ All text 5846- ✅ All borders 5847 5848**Complete wiki integration!** 5849 5850## Version 5.0.1 (2026-02-08) - THEME CONFLICT TOOLTIPS 5851 5852### Enhanced: Time Conflict Tooltips Now Themed 5853- **Fixed:** Conflict tooltips now match calendar theme 5854- **Added:** Theme-aware background, border, text colors 5855- **Added:** Theme-aware shadow effects 5856- **Result:** Complete visual consistency! 5857 5858### Tooltip Theming 5859 5860**Now uses theme colors for**: 5861- Background: Theme background color 5862- Border: Theme border color 5863- Header text: Theme primary text color 5864- Item text: Theme dim text color 5865- Shadow: Theme shadow color 5866 5867### Before vs After 5868 5869**Before (v5.0.0)**: 5870``` 5871Hover ⚠️ badge: 5872┌─────────────────┐ 5873│ ⚠️ Time Conflicts│ ← Default colors 5874│ • Event A │ 5875│ • Event B │ 5876└─────────────────┘ 5877``` 5878 5879**After (v5.0.1)**: 5880``` 5881Matrix Theme: 5882┌─────────────────┐ 5883│ ⚠️ Time Conflicts│ ← Green header 5884│ • Event A │ ← Green text 5885│ • Event B │ Dark green bg 5886└─────────────────┘ 5887 5888Purple Theme: 5889┌─────────────────┐ 5890│ ⚠️ Time Conflicts│ ← Purple header 5891│ • Event A │ ← Purple text 5892│ • Event B │ Dark purple bg 5893└─────────────────┘ 5894 5895Professional Theme: 5896┌─────────────────┐ 5897│ ⚠️ Time Conflicts│ ← Blue header 5898│ • Event A │ ← Dark text 5899│ • Event B │ Light bg 5900└─────────────────┘ 5901 5902Pink Theme: 5903┌─────────────────┐ 5904│ ⚠️ Time Conflicts│ ← Pink header ✨ 5905│ • Event A │ ← Pink text 5906│ • Event B │ Dark pink bg 5907└─────────────────┘ 5908 5909Wiki Default: 5910┌─────────────────┐ 5911│ ⚠️ Time Conflicts│ ← Adapts to wiki 5912│ • Event A │ ← Wiki colors 5913│ • Event B │ 5914└─────────────────┘ 5915``` 5916 5917### Now 100% Complete 5918 5919**Every tooltip themed**: 5920- ✅ Conflict tooltips 5921- ✅ All other tooltips (if any) 5922- ✅ Perfect consistency 5923 5924**Absolute perfection!** ✨ 5925 5926## Version 5.0.0 (2026-02-08) - MAJOR RELEASE: COMPLETE THEMING PERFECTION 5927 5928### Major Milestone: Version 5.0 5929 5930This is a major release representing the completion of comprehensive theming across the entire calendar plugin. Every visual element has been carefully themed for consistency and beauty. 5931 5932### Complete Feature Set 5933 5934**5 Beautiful Themes**: 5935- Matrix Edition (Green with glow) 5936- Purple Dream (Elegant purple) 5937- Professional Blue (Clean and modern) 5938- Pink Bling (Maximum sparkle) 5939- Wiki Default (Auto-adapts to your DokuWiki theme) 5940 5941**100% Theme Coverage**: 5942- ✅ Calendar grid and cells 5943- ✅ Event boxes and borders 5944- ✅ Sidebar widget 5945- ✅ Event list panel 5946- ✅ Search functionality 5947- ✅ Edit/Add dialogs (complete) 5948- ✅ Day popup dialogs 5949- ✅ Month picker 5950- ✅ All text (primary, dim, bright) 5951- ✅ All buttons 5952- ✅ All inputs and forms 5953- ✅ All checkboxes 5954- ✅ All borders 5955- ✅ All badges and labels 5956- ✅ Event highlight effects 5957 5958**Perfect Visual Consistency**: 5959- No white pixels anywhere 5960- No unthemed elements 5961- No default colors 5962- Complete visual unity 5963 5964### Major Improvements in v5.0 5965 59661. **Complete Dialog Theming** (v4.8.5-4.8.7) 5967 - Edit event dialog fully themed 5968 - Day popup dialog fully themed 5969 - All form inputs themed 5970 - All checkboxes themed 5971 - All buttons themed 5972 59732. **Event Box Border Perfection** (v4.8.6) 5974 - All 4 borders themed (top, right, bottom, left) 5975 - Sidebar event dividers themed 5976 - Past Events toggle border themed 5977 59783. **Checkbox Field Borders** (v4.9.0) 5979 - Repeating Event section border themed 5980 - Task checkbox section border themed 5981 59824. **Wiki Default Theme** (v4.10.0) 5983 - New 5th theme 5984 - Uses DokuWiki CSS variables 5985 - Auto-adapts to any wiki template 5986 - Perfect for seamless integration 5987 59885. **Clean Text Appearance** (v4.11.0) 5989 - Removed text glow from Matrix 5990 - Removed text glow from Purple 5991 - Removed text glow from Professional 5992 - Removed text glow from Wiki Default 5993 - Kept text glow on Pink Bling only 5994 59956. **Event Highlight Effects** (v4.12.0-4.12.1) 5996 - Theme-aware highlight glow 5997 - Click event bar → event glows 5998 - 3-second themed glow effect 5999 - Smooth animations 6000 6001### See RELEASE_NOTES.md for Complete Details 6002 6003For a comprehensive overview of all features, themes, and improvements, see the new **RELEASE_NOTES.md** file included in this release. 6004 6005## Version 4.12.1 (2026-02-08) - FIX EVENT HIGHLIGHT FUNCTION 6006 6007### Fixed: Event Highlight Now Working 6008- **Fixed:** Used setProperty() to properly apply !important styles 6009- **Added:** Console logging for debugging 6010- **Fixed:** Proper style application with important flag 6011- **Result:** Highlight glow now works correctly! 6012 6013### Technical Fix 6014 6015**Before (not working)**: 6016```javascript 6017eventItem.style.background = color + ' !important'; // Doesn't work 6018``` 6019 6020**After (working)**: 6021```javascript 6022eventItem.style.setProperty('background', color, 'important'); // Works! 6023``` 6024 6025### Added Debug Logging 6026 6027Console now shows: 6028- "Highlighting event: [calId] [eventId] [date]" 6029- "Found event item: [element]" 6030- "Theme: [theme name]" 6031- "Highlight colors: [bg] [shadow]" 6032- "Applied highlight styles" 6033- "Removing highlight" (after 3 seconds) 6034 6035### Now Working 6036 6037Click any event bar → Event glows with theme colors ✓ 6038 6039## Version 4.12.0 (2026-02-08) - THEME-AWARE EVENT HIGHLIGHT GLOW 6040 6041### ✨ Enhanced: Event Click Highlight Now Theme-Aware 6042- **Fixed:** Restored event highlight glow when clicking calendar bars 6043- **Improved:** Highlight now matches each theme's colors 6044- **Added:** Stronger glow effect for better visibility 6045- **Duration:** 3 seconds with smooth fade 6046- **Result:** Beautiful themed highlights for all themes! 6047 6048### How It Works 6049 6050When you click an event bar in the calendar, the corresponding event in the event list now highlights with a themed glow: 6051 6052**Matrix Theme**: 6053```javascript 6054Background: Darker green (#1a3d1a) 6055Glow: Double green glow (0 0 20px + 0 0 40px) 6056Color: rgba(0, 204, 7, 0.8) 6057``` 6058 6059**Purple Theme**: 6060```javascript 6061Background: Darker purple (#3d2b4d) 6062Glow: Double purple glow 6063Color: rgba(155, 89, 182, 0.8) 6064``` 6065 6066**Professional Theme**: 6067```javascript 6068Background: Light blue (#e3f2fd) 6069Glow: Single blue glow 6070Color: rgba(74, 144, 226, 0.4) 6071``` 6072 6073**Pink Theme**: 6074```javascript 6075Background: Darker pink (#3d2030) 6076Glow: Double pink glow ✨ 6077Color: rgba(255, 20, 147, 0.8) 6078``` 6079 6080**Wiki Theme**: 6081```javascript 6082Background: var(--__background_neu__) 6083Glow: Blue glow (adapts to wiki) 6084Color: rgba(43, 115, 183, 0.4) 6085``` 6086 6087### Visual Examples 6088 6089**Matrix - Click Event**: 6090``` 6091Calendar: 6092┌─────────────┐ 6093│ 2:00 PM │ ← Click this bar 6094└─────────────┘ 6095 6096Event List: 6097╔═════════════════════╗ 6098║ Team Meeting ║ ← GLOWS GREEN 6099║ 2:00 PM ║ for 3 seconds 6100╚═════════════════════╝ 6101 ↑↑↑ Strong green glow ↑↑↑ 6102``` 6103 6104**Purple - Click Event**: 6105``` 6106Calendar: 6107┌─────────────┐ 6108│ 4:00 PM │ ← Click 6109└─────────────┘ 6110 6111Event List: 6112╔═════════════════════╗ 6113║ Code Review ║ ← GLOWS PURPLE 6114║ 4:00 PM ║ for 3 seconds 6115╚═════════════════════╝ 6116 ↑↑↑ Strong purple glow ↑↑↑ 6117``` 6118 6119**Pink - Click Event**: 6120``` 6121Calendar: 6122┌─────────────┐ 6123│ 1:00 PM │ ← Click 6124└─────────────┘ 6125 6126Event List: 6127╔═════════════════════╗ 6128║ Lunch Date ║ ← GLOWS PINK 6129║ 1:00 PM ✨ ║ for 3 seconds 6130╚═════════════════════╝ 6131 ↑↑↑ MAXIMUM SPARKLE ↑↑↑ 6132``` 6133 6134### Glow Specifications 6135 6136**Matrix**: 6137- Background: Dark green 6138- Shadow: `0 0 20px rgba(0, 204, 7, 0.8)` 6139- Outer glow: `0 0 40px rgba(0, 204, 7, 0.4)` 6140- Effect: Strong green pulse 6141 6142**Purple**: 6143- Background: Dark purple 6144- Shadow: `0 0 20px rgba(155, 89, 182, 0.8)` 6145- Outer glow: `0 0 40px rgba(155, 89, 182, 0.4)` 6146- Effect: Strong purple pulse 6147 6148**Professional**: 6149- Background: Light blue 6150- Shadow: `0 0 20px rgba(74, 144, 226, 0.4)` 6151- Effect: Subtle blue glow 6152 6153**Pink**: 6154- Background: Dark pink 6155- Shadow: `0 0 20px rgba(255, 20, 147, 0.8)` 6156- Outer glow: `0 0 40px rgba(255, 20, 147, 0.4)` 6157- Effect: MAXIMUM SPARKLE ✨ 6158 6159**Wiki**: 6160- Background: Theme neutral color 6161- Shadow: `0 0 20px rgba(43, 115, 183, 0.4)` 6162- Effect: Adapts to wiki theme 6163 6164### User Experience 6165 6166**Click event bar** → Event highlights with themed glow 6167**Auto-scroll** → Event scrolls into view smoothly 6168**3 second glow** → Fade out after 3 seconds 6169**Smooth transition** → 0.3s ease-in-out 6170 6171### Perfect for Finding Events 6172 6173**Large event lists**: Quickly locate the clicked event ✓ 6174**Visual feedback**: Know which event you clicked ✓ 6175**Theme consistency**: Matches your chosen theme ✓ 6176**Smooth animation**: Professional appearance ✓ 6177 6178### All Themes Covered 6179 6180- ✅ Matrix: Green glow 6181- ✅ Purple: Purple glow 6182- ✅ Professional: Blue glow 6183- ✅ Pink: Maximum pink sparkle 6184- ✅ Wiki: Adaptive glow 6185 6186**Click any event bar and watch it glow!** ✨ 6187 6188## Version 4.11.0 (2026-02-08) - REMOVE TEXT GLOW FROM NON-PINK THEMES 6189 6190### Changed: Text Glow Now Pink-Only 6191- **Removed:** Text shadow/glow from Matrix theme 6192- **Removed:** Text shadow/glow from Purple theme 6193- **Removed:** Text shadow/glow from Professional theme (already had none) 6194- **Removed:** Text shadow/glow from Wiki Default theme 6195- **Kept:** Text shadow/glow ONLY on Pink Bling theme 6196- **Result:** Cleaner look for Matrix, Purple, and Wiki themes! 6197 6198### All Changes 6199 6200**Before (Matrix, Purple)**: 6201```css 6202text-shadow: 0 0 2px $text_color; /* Glow effect */ 6203``` 6204 6205**After (Matrix, Purple, Professional, Wiki)**: 6206```css 6207text-shadow: none; /* Clean, no glow */ 6208``` 6209 6210**Pink Bling (unchanged)**: 6211```css 6212text-shadow: 0 0 2px $text_color; /* Still has glow ✨ */ 6213``` 6214 6215### Text Shadow Removed From 6216 6217**Sidebar day numbers**: No glow ✓ 6218**Event titles**: No glow ✓ 6219**Event dates**: No glow ✓ 6220**Add Event button**: No glow ✓ 6221**Day popup events**: No glow ✓ 6222 6223### Before vs After 6224 6225**BEFORE (Matrix)**: 6226``` 6227Event Title ✨ ← Glowing green text 62282:00 PM ✨ ← Glowing text 6229``` 6230 6231**AFTER (Matrix)**: 6232``` 6233Event Title ← Clean green text 62342:00 PM ← Clean text 6235``` 6236 6237**Pink Bling (Still Glows)**: 6238``` 6239Event Title ✨ ← Still glowing! 62402:00 PM ✨ ← Maximum sparkle! 6241``` 6242 6243### Theme Appearances 6244 6245** Matrix Edition**: 6246- Clean green text 6247- No glow effects 6248- Professional appearance 6249- Still has border glow 6250 6251** Purple Dream**: 6252- Clean purple text 6253- No glow effects 6254- Elegant appearance 6255- Still has border glow 6256 6257** Professional Blue**: 6258- Clean text (unchanged) 6259- No glow effects 6260- Modern appearance 6261 6262** Pink Bling**: 6263- Glowing pink text ✨ 6264- Maximum glow effects 6265- Sparkle everywhere! 6266- All the bling! 6267 6268** Wiki Default**: 6269- Clean text 6270- No glow effects 6271- Matches wiki theme 6272 6273### Glow Effects Remaining 6274 6275**Border/box glow**: Still present on all themes ✓ 6276**Pink text glow**: Only on Pink Bling ✓ 6277**Shadow effects**: Still on buttons/boxes ✓ 6278 6279**Only TEXT glow removed from non-pink themes!** 6280 6281### Result 6282 6283**Cleaner, more professional look** for: 6284- Matrix ✓ 6285- Purple ✓ 6286- Professional ✓ 6287- Wiki Default ✓ 6288 6289**Maximum sparkle** for: 6290- Pink Bling ✨✓ 6291 6292**Best of both worlds!** 6293 6294## Version 4.10.0 (2026-02-08) - NEW WIKI DEFAULT THEME 6295 6296### New: Wiki Default Theme 6297- **Added:** 5th theme that automatically matches your DokuWiki template 6298- **Uses:** CSS variables from your wiki theme 6299- **Adapts:** Automatically works with light and dark themes 6300- **Perfect:** Seamless integration with any DokuWiki template 6301 6302### How It Works 6303 6304**Wiki theme uses DokuWiki CSS variables**: 6305```css 6306bg: var(--__background_site__, #f5f5f5) 6307border: var(--__border__, #ccc) 6308text_primary: var(--__text__, #333) 6309text_bright: var(--__link__, #2b73b7) 6310text_dim: var(--__text_neu__, #666) 6311cell_bg: var(--__background__, #fff) 6312grid_border: var(--__border__, #ccc) 6313``` 6314 6315**With fallbacks for older DokuWiki versions**: 6316- If CSS variables exist → Use them ✓ 6317- If not available → Use fallback values ✓ 6318 6319### All 5 Themes 6320 6321**1. Matrix Edition** (Default) 6322- Dark green with neon glow 6323- Matrix-style effects 6324- Original theme 6325 6326**2. Purple Dream** 6327- Rich purple with violet accents 6328- Elegant and sophisticated 6329- Soft glow effects 6330 6331**3. Professional Blue** 6332- Clean blue and grey 6333- Modern professional 6334- No glow effects 6335 6336**4. Pink Bling** 6337- Glamorous hot pink 6338- Maximum sparkle ✨ 6339- Hearts and diamonds 6340 6341**5. Wiki Default** ← NEW! 6342- Matches your wiki template 6343- Auto-adapts to light/dark 6344- Perfect integration 6345 6346### Examples 6347 6348**Light Wiki Template**: 6349``` 6350Wiki Default theme shows: 6351- Light backgrounds (#f5f5f5) 6352- Dark text (#333) 6353- Light inputs (#fff) 6354- Gray borders (#ccc) 6355 6356Matches perfectly! ✓ 6357``` 6358 6359**Dark Wiki Template**: 6360``` 6361Wiki Default theme shows: 6362- Dark backgrounds (from template) 6363- Light text (from template) 6364- Dark inputs (from template) 6365- Dark borders (from template) 6366 6367Matches perfectly! ✓ 6368``` 6369 6370**Bootstrap Template**: 6371``` 6372Uses Bootstrap's colors 6373Matches perfectly! ✓ 6374``` 6375 6376**Material Template**: 6377``` 6378Uses Material's colors 6379Matches perfectly! ✓ 6380``` 6381 6382### CSS Variables Used 6383 6384**DokuWiki provides**: 6385- `--__background_site__`: Page background 6386- `--__background_alt__`: Section backgrounds 6387- `--__background__`: Content backgrounds 6388- `--__text__`: Primary text color 6389- `--__link__`: Link color 6390- `--__text_neu__`: Dimmed text 6391- `--__border__`: Border color 6392- `--__background_neu__`: Neutral background 6393 6394**All with fallbacks**: 6395```css 6396var(--__background_site__, #f5f5f5) 6397/* Falls back to light gray if variable doesn't exist */ 6398``` 6399 6400### Perfect for Every Template 6401 6402**Custom templates**: Automatically adapts ✓ 6403**Light themes**: Perfect match ✓ 6404**Dark themes**: Perfect match ✓ 6405**Any DokuWiki version**: Works with fallbacks ✓ 6406 6407### Complete Theme Collection 6408 6409Now with **5 gorgeous themes**: 6410- 3 dark themes (Matrix, Purple, Pink) 6411- 1 light theme (Professional) 6412- 1 adaptive theme (Wiki Default) ← NEW! 6413 6414**Something for everyone!** 6415 6416## Version 4.9.0 (2026-02-08) - FIX CHECKBOX FIELD BORDERS 6417 6418### Fixed: Checkbox Field Borders Themed 6419- **Fixed:** Added border-color to checkbox field divs 6420- **Fixed:** Repeating Event section border 6421- **Fixed:** Task checkbox section border 6422- **Result:** No white borders around checkboxes! 6423 6424### Changes 6425 6426**Checkbox Field Border Styling**: 6427 6428**Before**: 6429```html 6430<div class="form-field-checkbox" 6431 style="background: $bg !important;"> 6432<!-- Border shows white ✗ --> 6433``` 6434 6435**After**: 6436```php 6437<div class="form-field-checkbox" 6438 style="background: $bg !important; 6439 border-color: $grid_border !important;"> 6440<!-- Border themed ✓ --> 6441``` 6442 6443### Before vs After 6444 6445**BEFORE (v4.8.8)**: 6446``` 6447Edit Dialog: 6448┌──────────────────┐ 6449│ ☑ Repeating ║│ ← White border ✗ 6450└──────────────────┘ 6451┌──────────────────┐ 6452│ ☑ Task checkbox ║│ ← White border ✗ 6453└──────────────────┘ 6454``` 6455 6456**AFTER (v4.9.0)**: 6457``` 6458Matrix Edit Dialog: 6459┌──────────────────┐ 6460│ ☑ Repeating │ ← Green border ✓ 6461└──────────────────┘ 6462┌──────────────────┐ 6463│ ☑ Task checkbox │ ← Green border ✓ 6464└──────────────────┘ 6465``` 6466 6467### ABSOLUTE PERFECTION ACHIEVED 6468 6469**Every element themed**: 6470- ✅ All inputs 6471- ✅ All labels 6472- ✅ All sections 6473- ✅ **Checkbox field borders** ← v4.9.0! 6474- ✅ All buttons 6475- ✅ All checkboxes 6476- ✅ No white anywhere 6477 6478**100% COMPLETE!** ✨ 6479 6480## Version 4.8.8 (2026-02-08) - FINAL FIXES: CHECKBOXES, BORDERS, BACKGROUNDS 6481 6482### Fixed: Checkbox Field Borders Themed 6483- **Fixed:** Added border-color to checkbox field divs 6484- **Fixed:** Repeating Event section border 6485- **Fixed:** Task checkbox section border 6486- **Result:** No white borders around checkboxes! 6487 6488### Fixed: Admin Sections Respect Wiki Theme 6489- **Fixed:** All admin backgrounds use CSS variables 6490- **Fixed:** Text colors use wiki text color 6491- **Fixed:** Borders use wiki border color 6492- **Result:** Admin matches wiki theme perfectly! 6493 6494### All Changes 6495 6496**1. Checkbox Field Border Styling**: 6497 6498**Before**: 6499```html 6500<div class="form-field-checkbox" 6501 style="background: $bg !important;"> 6502<!-- Border shows white ✗ --> 6503``` 6504 6505**After**: 6506```php 6507<div class="form-field-checkbox" 6508 style="background: $bg !important; 6509 border-color: $grid_border !important;"> 6510<!-- Border themed ✓ --> 6511``` 6512 6513**2. Admin CSS Variables**: 6514 6515**Added CSS variables for wiki theme compatibility**: 6516```css 6517.calendar-admin-wrapper { 6518 background: var(--__background_site__, #f5f5f5); 6519 color: var(--__text__, #333); 6520} 6521.calendar-admin-section { 6522 background: var(--__background_alt__, #fafafa); 6523} 6524.calendar-admin-input { 6525 background: var(--__background__, #fff); 6526 color: var(--__text__, #333); 6527} 6528``` 6529 6530**Replaced hardcoded colors**: 6531```php 6532// Before: 6533background: #f9f9f9 6534background: white 6535color: #333 6536border: 1px solid #ddd 6537 6538// After: 6539background: var(--__background_alt__, #f9f9f9) 6540background: var(--__background__, #fff) 6541color: var(--__text__, #333) 6542border: 1px solid var(--__border__, #ddd) 6543``` 6544 6545### Before vs After 6546 6547**BEFORE (v4.8.8)**: 6548``` 6549Edit Dialog: 6550┌──────────────────┐ 6551│ ☑ Repeating ║│ ← White border ✗ 6552└──────────────────┘ 6553┌──────────────────┐ 6554│ ☑ Task checkbox ║│ ← White border ✗ 6555└──────────────────┘ 6556 6557Admin Page (Dark Wiki Theme): 6558┌──────────────────┐ 6559│ Light sections │ ← White boxes ✗ 6560│ Light inputs │ ← Doesn't match ✗ 6561└──────────────────┘ 6562``` 6563 6564**AFTER (v4.8.9)**: 6565``` 6566Matrix Edit Dialog: 6567┌──────────────────┐ 6568│ ☑ Repeating │ ← Green border ✓ 6569└──────────────────┘ 6570┌──────────────────┐ 6571│ ☑ Task checkbox │ ← Green border ✓ 6572└──────────────────┘ 6573 6574Admin (Dark Wiki Theme): 6575┌──────────────────┐ 6576│ Dark sections │ ← Matches wiki ✓ 6577│ Dark inputs │ ← Perfect match ✓ 6578└──────────────────┘ 6579``` 6580 6581### Admin Theme Examples 6582 6583**Light Wiki Theme**: 6584``` 6585Admin page backgrounds: Light 6586Section boxes: Light gray 6587Inputs: White 6588Borders: Gray 6589Text: Dark 6590 6591Perfect match! ✓ 6592``` 6593 6594**Dark Wiki Theme**: 6595``` 6596Admin page backgrounds: Dark 6597Section boxes: Darker gray 6598Inputs: Dark 6599Borders: Dark gray 6600Text: Light 6601 6602Perfect match! ✓ 6603``` 6604 6605**DokuWiki Default**: 6606``` 6607Uses wiki's CSS variables 6608Automatically adapts 6609Always matches! ✓ 6610``` 6611 6612### Complete Coverage 6613 6614**Edit Dialog**: 6615- ✅ All inputs themed 6616- ✅ All labels themed 6617- ✅ All sections themed 6618- ✅ **Checkbox borders** ← v4.8.9! 6619- ✅ All buttons themed 6620- ✅ No white anywhere 6621 6622**Admin Interface**: 6623- ✅ **Tab navigation** ← v4.8.9! 6624- ✅ **Section boxes** ← v4.8.9! 6625- ✅ **Input fields** ← v4.8.9! 6626- ✅ **Text colors** ← v4.8.9! 6627- ✅ **Borders** ← v4.8.9! 6628- ✅ All tabs (Manage, Update, Outlook, Themes) 6629 6630### CSS Variables Used 6631 6632**DokuWiki provides these**: 6633- `--__background_site__`: Page background 6634- `--__background_alt__`: Alternate background 6635- `--__background__`: Primary background (inputs) 6636- `--__text__`: Text color 6637- `--__border__`: Border color 6638 6639**Fallbacks provided for older DokuWiki**: 6640```css 6641var(--__background_site__, #f5f5f5) 6642var(--__background_alt__, #fafafa) 6643var(--__background__, #fff) 6644var(--__text__, #333) 6645var(--__border__, #ddd) 6646``` 6647 6648### Perfect Adaptation 6649 6650**Admin now adapts to ANY wiki theme**: 6651- Light themes → Light admin ✓ 6652- Dark themes → Dark admin ✓ 6653- Custom themes → Matches perfectly ✓ 6654- No hardcoded colors ✓ 6655 6656**Calendar themes still work**: 6657- Matrix, Purple, Professional, Pink ✓ 6658- Independent from wiki theme ✓ 6659- Admin respects wiki ✓ 6660- Calendar respects calendar theme ✓ 6661 6662### FINAL PERFECTION 6663 6664**Frontend (Calendar)**: 6665- Complete theming ✓ 6666- 4 beautiful themes ✓ 6667- Every pixel themed ✓ 6668 6669**Backend (Admin)**: 6670- Respects wiki theme ✓ 6671- Works with any theme ✓ 6672- Perfect compatibility ✓ 6673 6674**ABSOLUTELY EVERYTHING THEMED!** ✨ 6675 6676## Version 4.8.8 (2026-02-08) - FINAL FIXES: CHECKBOXES, BORDERS, BACKGROUNDS 6677 6678### Fixed: Task Checkboxes Now Fully Themed 6679- **Fixed:** Added background-color and border inline 6680- **Fixed:** Both PHP and JavaScript versions 6681- **Result:** No white checkboxes! 6682 6683### Fixed: Past Events Toggle Border 6684- **Fixed:** Added !important to border styling 6685- **Fixed:** Explicit top and bottom borders 6686- **Result:** No white line under toggle! 6687 6688### Fixed: Form Field Section Backgrounds 6689- **Fixed:** All form-field and form-row-group backgrounds 6690- **Fixed:** Every section in edit dialog 6691- **Result:** No white sections anywhere! 6692 6693### All Changes 6694 6695**1. Task Checkbox Styling**: 6696 6697**Before**: 6698```php 6699style="accent-color: $border !important;" 6700<!-- Only accent, background still white ✗ --> 6701``` 6702 6703**After**: 6704```php 6705style="accent-color: $border !important; 6706 background-color: $cell_bg !important; 6707 border: 2px solid $grid_border !important;" 6708<!-- Full theming ✓ --> 6709``` 6710 6711**2. Past Events Toggle Border**: 6712 6713**Before**: 6714```php 6715style="border-color: $grid_border;" 6716<!-- No !important, CSS overrides ✗ --> 6717``` 6718 6719**After**: 6720```php 6721style="border-color: $grid_border !important; 6722 border-top: 1px solid $grid_border !important; 6723 border-bottom: 1px solid $grid_border !important;" 6724<!-- Cannot be overridden ✓ --> 6725``` 6726 6727**3. Form Field Backgrounds**: 6728 6729**Before**: 6730```html 6731<div class="form-field"> 6732<div class="form-row-group"> 6733<!-- No background, shows white ✗ --> 6734``` 6735 6736**After**: 6737```php 6738<div class="form-field" style="background: $bg !important;"> 6739<div class="form-row-group" style="background: $bg !important;"> 6740<!-- Fully themed ✓ --> 6741``` 6742 6743### Before vs After 6744 6745**BEFORE (v4.8.7)**: 6746``` 6747Event: 6748□ Task checkbox ← White checkbox ✗ 6749 6750Past Events 6751▶ Past Events (3) ← White line below ✗ 6752───────────────── 6753 6754Edit Dialog: 6755┌──────────────┐ 6756│ Form fields │ ← White sections ✗ 6757└──────────────┘ 6758``` 6759 6760**AFTER (v4.8.8)**: 6761``` 6762Matrix Event: 6763☑ Task checkbox ← Green checkbox ✓ 6764 6765Past Events 6766▶ Past Events (3) ← Green border ✓ 6767───────────────── 6768 6769Matrix Edit Dialog: 6770┌──────────────┐ 6771│ Form fields │ ← Dark green ✓ 6772└──────────────┘ 6773``` 6774 6775### Complete Examples 6776 6777**Matrix Theme**: 6778``` 6779Task Checkbox: 6780☑ Checked → Green checkmark, green bg 6781☐ Unchecked → Green border, dark green bg ✓ 6782 6783Past Events Toggle: 6784▶ Past Events (3) 6785─────────────────── Green border ✓ 6786 6787Edit Dialog: 6788All sections dark green ✓ 6789No white anywhere ✓ 6790``` 6791 6792**Purple Theme**: 6793``` 6794Task Checkbox: 6795☑ Checked → Purple checkmark, purple bg 6796☐ Unchecked → Purple border, dark purple bg ✓ 6797 6798Past Events Toggle: 6799▶ Past Events (3) 6800─────────────────── Purple border ✓ 6801 6802Edit Dialog: 6803All sections dark purple ✓ 6804``` 6805 6806**Professional Theme**: 6807``` 6808Task Checkbox: 6809☑ Checked → Blue checkmark, white bg 6810☐ Unchecked → Gray border, white bg ✓ 6811 6812Past Events Toggle: 6813▶ Past Events (3) 6814─────────────────── Gray border ✓ 6815 6816Edit Dialog: 6817All sections light ✓ 6818``` 6819 6820**Pink Theme**: 6821``` 6822Task Checkbox: 6823☑ Checked → Pink checkmark, pink bg ✨ 6824☐ Unchecked → Pink border, dark pink bg ✓ 6825 6826Past Events Toggle: 6827▶ Past Events (3) 6828─────────────────── Pink border 6829 6830Edit Dialog: 6831All sections dark pink ✓ 6832``` 6833 6834### Checkbox Visual 6835 6836**Matrix - Unchecked**: 6837``` 6838┌─────┐ 6839│ │ ← Dark green background 6840│ │ Green border 6841└─────┘ 6842``` 6843 6844**Matrix - Checked**: 6845``` 6846┌─────┐ 6847│ ✓ │ ← Dark green background 6848│ │ Green checkmark 6849└─────┘ 6850``` 6851 6852### Past Events Border 6853 6854**Before**: 6855``` 6856▶ Past Events (3) 6857─────────────────── White line ✗ 6858``` 6859 6860**After**: 6861``` 6862▶ Past Events (3) 6863─────────────────── Green line ✓ (Matrix) 6864 Purple line ✓ (Purple) 6865 Gray line ✓ (Professional) 6866 Pink line ✓ (Pink) 6867``` 6868 6869### Form Field Coverage 6870 6871**All sections themed**: 6872- ✅ Title field 6873- ✅ Namespace field 6874- ✅ Description field 6875- ✅ **Date row** ← v4.8.8! 6876- ✅ **Checkbox sections** ← v4.8.8! 6877- ✅ **Recurring options** ← v4.8.8! 6878- ✅ **Time row** ← v4.8.8! 6879- ✅ **Color row** ← v4.8.8! 6880- ✅ Button footer 6881 6882**Every div has background!** ✓ 6883 6884### ABSOLUTE PERFECTION 6885 6886**Not a single white pixel**: 6887- ✅ No white checkboxes 6888- ✅ No white borders 6889- ✅ No white backgrounds 6890- ✅ No white sections 6891- ✅ No white lines 6892- ✅ No white anything 6893 6894**100% PERFECT THEMING!** ✨ 6895 6896## Version 4.8.7 (2026-02-08) - COMPLETE DIALOG & POPUP THEMING 6897 6898### Fixed: Checkbox Section Backgrounds Themed 6899- **Fixed:** Repeating Event section background 6900- **Fixed:** Task checkbox section background 6901- **Result:** No white backgrounds in dialog! 6902 6903### Fixed: Unchecked Task Checkboxes Themed 6904- **Fixed:** Added CSS for checkbox backgrounds 6905- **Fixed:** Unchecked boxes show theme colors 6906- **Result:** No white checkboxes! 6907 6908### Fixed: Day Popup Dialog Fully Themed 6909- **Fixed:** Popup container, header, body themed 6910- **Fixed:** Event items in popup themed 6911- **Fixed:** Add Event button themed 6912- **Fixed:** Footer section themed 6913- **Result:** Perfect popup theming! 6914 6915### All Changes 6916 6917**1. Checkbox Section Backgrounds**: 6918 6919**Before**: 6920```html 6921<div class="form-field-checkbox"> 6922<!-- White background ✗ --> 6923``` 6924 6925**After**: 6926```php 6927<div class="form-field-checkbox" 6928 style="background: $bg !important;"> 6929<!-- Themed ✓ --> 6930``` 6931 6932**2. Checkbox Background CSS**: 6933 6934**Added to style block**: 6935```css 6936.task-checkbox { 6937 background-color: $cell_bg !important; 6938 border: 2px solid $grid_border !important; 6939} 6940``` 6941 6942**3. Day Popup Theming**: 6943 6944**Container**: 6945```javascript 6946style="background: $bg !important; 6947 border: 2px solid $border !important; 6948 box-shadow: 0 0 20px $shadow !important;" 6949``` 6950 6951**Header**: 6952```javascript 6953style="background: $header_bg !important; 6954 color: $text_primary !important; 6955 border-bottom: 1px solid $border !important;" 6956``` 6957 6958**Footer**: 6959```javascript 6960style="background: $bg !important; 6961 border-top: 1px solid $grid_border !important;" 6962``` 6963 6964**Add Event Button**: 6965```javascript 6966style="background: $border !important; 6967 color: $bg !important; 6968 border-color: $border !important;" 6969``` 6970 6971**Event Items**: 6972```javascript 6973style="background: $cell_bg !important; 6974 border: 1px solid $grid_border !important;" 6975``` 6976 6977### Before vs After 6978 6979**BEFORE (v4.8.6)**: 6980``` 6981Edit Dialog: 6982┌──────────────────┐ 6983│ ☑ Repeating Event│ ← White background ✗ 6984├──────────────────┤ 6985│ ☑ Task checkbox │ ← White background ✗ 6986└──────────────────┘ 6987 6988Day Popup: 6989┌──────────────────┐ 6990│ Monday, Feb 8 │ ← White ✗ 6991├──────────────────┤ 6992│ Team Meeting │ ← White ✗ 6993│ 2:00 PM │ 6994├──────────────────┤ 6995│ [+ Add Event] │ ← White ✗ 6996└──────────────────┘ 6997 6998Task checkbox: ☐ ← White ✗ 6999``` 7000 7001**AFTER (v4.8.7)**: 7002``` 7003Edit Dialog (Matrix): 7004┌──────────────────┐ 7005│ ☑ Repeating Event│ ← Dark green ✓ 7006├──────────────────┤ 7007│ ☑ Task checkbox │ ← Dark green ✓ 7008└──────────────────┘ 7009 7010Day Popup (Matrix): 7011┌──────────────────┐ 7012│ Monday, Feb 8 │ ← Dark green ✓ 7013├──────────────────┤ 7014│ Team Meeting │ ← Dark green ✓ 7015│ 2:00 PM │ 7016├──────────────────┤ 7017│ [+ Add Event] │ ← Green button ✓ 7018└──────────────────┘ 7019 7020Task checkbox: ☑ ← Green ✓ 7021``` 7022 7023### Complete Examples 7024 7025**Matrix Dialog**: 7026``` 7027┌──────────────────────────┐ 7028│ ✏️ Edit Event │ 7029├──────────────────────────┤ 7030│ Title: [_________] │ 7031│ Date: [__________] │ 7032│ │ 7033│ ☑ Repeating Event │ ← Dark green bg 7034├──────────────────────────┤ 7035│ ☑ Task checkbox │ ← Dark green bg 7036├──────────────────────────┤ 7037│ [Cancel] [ Save] │ 7038└──────────────────────────┘ 7039 7040All sections themed! ✓ 7041``` 7042 7043**Matrix Day Popup**: 7044``` 7045┌──────────────────────────┐ 7046│ Monday, February 8, 2026 │ ← Green header 7047├──────────────────────────┤ 7048│ ┌──────────────────────┐ │ 7049│ │ Team Meeting │ │ ← Dark green 7050│ │ 2:00 PM │ │ 7051│ └──────────────────────┘ │ 7052│ ┌──────────────────────┐ │ 7053│ │ Code Review │ │ ← Dark green 7054│ │ 4:00 PM │ │ 7055│ └──────────────────────┘ │ 7056├──────────────────────────┤ 7057│ [+ Add Event] │ ← Green button 7058└──────────────────────────┘ 7059``` 7060 7061**Purple Day Popup**: 7062``` 7063┌──────────────────────────┐ 7064│ Monday, February 8, 2026 │ ← Purple header 7065├──────────────────────────┤ 7066│ ┌──────────────────────┐ │ 7067│ │ Team Meeting │ │ ← Dark purple 7068│ │ 2:00 PM │ │ 7069│ └──────────────────────┘ │ 7070├──────────────────────────┤ 7071│ [+ Add Event] │ ← Purple button 7072└──────────────────────────┘ 7073``` 7074 7075**Professional Day Popup**: 7076``` 7077┌──────────────────────────┐ 7078│ Monday, February 8, 2026 │ ← Light header 7079├──────────────────────────┤ 7080│ ┌──────────────────────┐ │ 7081│ │ Team Meeting │ │ ← White 7082│ │ 2:00 PM │ │ 7083│ └──────────────────────┘ │ 7084├──────────────────────────┤ 7085│ [+ Add Event] │ ← Blue button 7086└──────────────────────────┘ 7087``` 7088 7089**Pink Day Popup**: 7090``` 7091┌──────────────────────────┐ 7092│ Monday, February 8, 2026 │ ← Pink header ✨ 7093├──────────────────────────┤ 7094│ ┌──────────────────────┐ │ 7095│ │ Team Meeting │ │ ← Dark pink 7096│ │ 2:00 PM │ │ 7097│ └──────────────────────┘ │ 7098├──────────────────────────┤ 7099│ [+ Add Event] │ ← Pink button 7100└──────────────────────────┘ 7101``` 7102 7103### Checkbox Theming 7104 7105**Unchecked boxes now themed**: 7106``` 7107Matrix: 7108☐ → Dark green bg, green border ✓ 7109 7110Purple: 7111☐ → Dark purple bg, purple border ✓ 7112 7113Professional: 7114☐ → White bg, gray border ✓ 7115 7116Pink: 7117☐ → Dark pink bg, pink border ✓ 7118``` 7119 7120### Complete Coverage 7121 7122**Edit Dialog - All Sections**: 7123- ✅ Header 7124- ✅ All inputs 7125- ✅ All labels 7126- ✅ **Checkbox sections** ← v4.8.7! 7127- ✅ Recurring options 7128- ✅ Button footer 7129- ✅ All checkboxes (checked & unchecked) 7130 7131**Day Popup - All Elements**: 7132- ✅ **Popup container** ← v4.8.7! 7133- ✅ **Header** ← v4.8.7! 7134- ✅ **Body** ← v4.8.7! 7135- ✅ **Event items** ← v4.8.7! 7136- ✅ **Namespace badges** ← v4.8.7! 7137- ✅ **Footer** ← v4.8.7! 7138- ✅ **Add Event button** ← v4.8.7! 7139- ✅ **No events message** ← v4.8.7! 7140 7141**Absolutely every dialog element themed!** ✨ 7142 7143### Perfect Theming Achievement 7144 7145**Every UI component in entire plugin**: 7146- ✅ Calendar grid 7147- ✅ Sidebar widget 7148- ✅ Event list 7149- ✅ Search bar 7150- ✅ Event boxes 7151- ✅ Edit dialog (complete) 7152- ✅ **Day popup** ← v4.8.7! 7153- ✅ Month picker 7154- ✅ All text 7155- ✅ All buttons 7156- ✅ All inputs 7157- ✅ **All checkboxes** ← v4.8.7! 7158- ✅ All borders 7159- ✅ All badges 7160- ✅ All backgrounds 7161 7162**NO WHITE ANYWHERE!** 7163 7164**100% COMPLETE THEMING ACHIEVED!** ✨ 7165 7166## Version 4.8.6 (2026-02-08) - FIX DIALOG SECTIONS & EVENT BOX BORDERS 7167 7168### Fixed: Dialog Checkbox Sections Themed 7169- **Fixed:** Recurring options section background themed 7170- **Fixed:** Section has themed border accent 7171- **Result:** No white sections in dialog! 7172 7173### Fixed: Dialog Button Section Themed 7174- **Fixed:** Button area background themed 7175- **Fixed:** Top border separator themed 7176- **Result:** Complete dialog theming! 7177 7178### Fixed: Event Box Borders Themed 7179- **Fixed:** Top, right, bottom borders now themed 7180- **Fixed:** Left border remains event color 7181- **Result:** Perfect event boxes! 7182 7183### All Changes 7184 7185**1. Recurring Options Section**: 7186 7187**Before**: 7188```html 7189<div class="recurring-options" style="display:none;"> 7190<!-- White background ✗ --> 7191``` 7192 7193**After**: 7194```php 7195<div class="recurring-options" 7196 style="display:none; 7197 background: $bg !important; 7198 padding: 8px; 7199 border-left: 2px solid $border; 7200 margin-left: 4px;"> 7201<!-- Themed with accent border ✓ --> 7202``` 7203 7204**2. Dialog Actions Section**: 7205 7206**Before**: 7207```html 7208<div class="dialog-actions-sleek"> 7209<!-- White background ✗ --> 7210``` 7211 7212**After**: 7213```php 7214<div class="dialog-actions-sleek" 7215 style="background: $bg !important; 7216 border-top: 1px solid $grid_border !important;"> 7217<!-- Themed with separator ✓ --> 7218``` 7219 7220**3. Event Box Borders**: 7221 7222**Before**: 7223```php 7224border-left-color: $event_color; 7225<!-- Only left border colored ✗ --> 7226``` 7227 7228**After**: 7229```php 7230border-left-color: $event_color; 7231border-top: 1px solid $grid_border !important; 7232border-right: 1px solid $grid_border !important; 7233border-bottom: 1px solid $grid_border !important; 7234<!-- All borders themed! ✓ --> 7235``` 7236 7237### Before vs After 7238 7239**BEFORE (v4.8.5)**: 7240``` 7241Dialog: 7242┌────────────────┐ 7243│ ☑ Repeating │ 7244├────────────────┤ ← White section ✗ 7245│ Repeat: Daily │ 7246│ Until: [____] │ 7247├────────────────┤ 7248│ [Cancel] [Save]│ ← White footer ✗ 7249└────────────────┘ 7250 7251Event Box: 7252┌────────────┐ 7253│Team Meeting│ ← White borders ✗ 7254│2:00 PM │ 7255└────────────┘ 7256``` 7257 7258**AFTER (v4.8.6)**: 7259``` 7260Matrix Dialog: 7261┌────────────────┐ 7262│ ☑ Repeating │ 7263├────────────────┤ ← Dark green ✓ 7264│ Repeat: Daily │ Green accent border 7265│ Until: [____] │ 7266├────────────────┤ 7267│ [Cancel] [Save]│ ← Dark green ✓ 7268└────────────────┘ 7269 7270Matrix Event Box: 7271┌────────────┐ 7272│Team Meeting│ ← Green borders ✓ 7273│2:00 PM │ 7274└────────────┘ 7275``` 7276 7277### Dialog Section Examples 7278 7279**Matrix Theme**: 7280``` 7281┌──────────────────────────┐ 7282│ ✏️ Edit Event │ 7283├──────────────────────────┤ 7284│ ☑ Repeating Event │ 7285├║─────────────────────────┤ Green accent 7286│║ Repeat Every: Daily │ Dark green bg 7287│║ Repeat Until: [_____] │ 7288└──────────────────────────┘ 7289 [Cancel] [ Save] ← Dark green bg 7290──────────────────────────── Green border 7291``` 7292 7293**Purple Theme**: 7294``` 7295┌──────────────────────────┐ 7296│ ☑ Repeating Event │ 7297├║─────────────────────────┤ Purple accent 7298│║ Repeat options... │ Dark purple bg 7299└──────────────────────────┘ 7300 [Cancel] [ Save] ← Dark purple bg 7301──────────────────────────── Purple border 7302``` 7303 7304**Professional Theme**: 7305``` 7306┌──────────────────────────┐ 7307│ ☑ Repeating Event │ 7308├║─────────────────────────┤ Blue accent 7309│║ Repeat options... │ Light bg 7310└──────────────────────────┘ 7311 [Cancel] [ Save] ← Light bg 7312──────────────────────────── Gray border 7313``` 7314 7315**Pink Theme**: 7316``` 7317┌──────────────────────────┐ 7318│ ☑ Repeating Event ✨ │ 7319├║─────────────────────────┤ Pink accent 7320│║ Repeat options... │ Dark pink bg 7321└──────────────────────────┘ 7322 [Cancel] [ Save] ← Dark pink bg 7323──────────────────────────── Pink border 7324``` 7325 7326### Event Box Border Visual 7327 7328**Before (v4.8.5)**: 7329``` 7330Left border only: 7331█ Team Meeting 7332█ 2:00 PM 7333█ [Edit] [Delete] 7334 7335Only event color on left ✗ 7336White on other 3 sides ✗ 7337``` 7338 7339**After (v4.8.6)**: 7340``` 7341All borders themed: 7342┌─────────────┐ 7343█Team Meeting │ ← Top: themed 7344█2:00 PM │ ← Right: themed 7345█[Edit][Del] │ ← Bottom: themed 7346└─────────────┘ 7347 7348Left: Event color ✓ 7349Other 3: Theme grid_border ✓ 7350``` 7351 7352### Matrix Event Box: 7353``` 7354┌─────────────┐ Green border 7355│Team Meeting │ 7356│2:00 PM │ 7357└─────────────┘ Green border 7358↑ 7359Green left bar 7360``` 7361 7362### Purple Event Box: 7363``` 7364┌─────────────┐ Purple border 7365│Team Meeting │ 7366│2:00 PM │ 7367└─────────────┘ Purple border 7368↑ 7369Purple left bar 7370``` 7371 7372### Professional Event Box: 7373``` 7374┌─────────────┐ Gray border 7375│Team Meeting │ 7376│2:00 PM │ 7377└─────────────┘ Gray border 7378↑ 7379Event color left bar 7380``` 7381 7382### Complete Dialog Coverage 7383 7384**All sections themed**: 7385- ✅ Dialog header 7386- ✅ Form inputs 7387- ✅ Checkbox labels 7388- ✅ **Recurring options** ← v4.8.6! 7389- ✅ **Button section** ← v4.8.6! 7390- ✅ All labels 7391- ✅ All buttons 7392 7393**No white sections!** ✓ 7394 7395### Complete Event Box Coverage 7396 7397**All borders themed**: 7398- ✅ Left border (event color) 7399- ✅ **Top border** ← v4.8.6! 7400- ✅ **Right border** ← v4.8.6! 7401- ✅ **Bottom border** ← v4.8.6! 7402- ✅ Background 7403- ✅ Text 7404 7405**Perfect box outline!** ✓ 7406 7407### Visual Perfection 7408 7409**Matrix theme event list**: 7410``` 7411┌─────────────┐ 7412│Team Meeting │ ← Green box 7413│2:00 PM │ 7414└─────────────┘ 7415┌─────────────┐ 7416│Code Review │ ← Green box 7417│4:00 PM │ 7418└─────────────┘ 7419 7420All borders green! ✓ 7421``` 7422 7423**ABSOLUTE PERFECT THEMING!** ✨ 7424 7425## Version 4.8.5 (2026-02-08) - THEME EVENT DIALOG & SIDEBAR BORDERS 7426 7427### Fixed: Event Dialog Fully Themed 7428- **Fixed:** Dialog background, header, inputs all themed 7429- **Fixed:** All labels, checkboxes, selects themed 7430- **Fixed:** Save and Cancel buttons themed 7431- **Result:** Dialog matches theme perfectly! 7432 7433### Fixed: Sidebar Event Borders Properly Themed 7434- **Fixed:** Event divider borders use grid_border color 7435- **Fixed:** Clean, subtle themed dividers 7436- **Result:** No more white borders in sidebar! 7437 7438### All Changes 7439 7440**1. Event Dialog Theming**: 7441 7442**Dialog container**: 7443```php 7444background: $themeStyles['bg'] !important; 7445border: 2px solid $themeStyles['border'] !important; 7446box-shadow: 0 0 20px $shadow !important; 7447``` 7448 7449**Dialog header**: 7450```php 7451background: $themeStyles['header_bg'] !important; 7452color: $themeStyles['text_primary'] !important; 7453border-bottom: 1px solid $border !important; 7454``` 7455 7456**All form inputs** (text, date, select, textarea): 7457```php 7458background: $themeStyles['cell_bg'] !important; 7459color: $themeStyles['text_primary'] !important; 7460border-color: $themeStyles['grid_border'] !important; 7461``` 7462 7463**All labels**: 7464```php 7465color: $themeStyles['text_primary'] !important; 7466``` 7467 7468**Checkboxes**: 7469```php 7470accent-color: $themeStyles['border'] !important; 7471``` 7472 7473**Buttons**: 7474```php 7475// Cancel button: 7476background: $cell_bg !important; 7477color: $text_primary !important; 7478 7479// Save button: 7480background: $border !important; 7481color: $bg !important; (or white for professional) 7482``` 7483 7484**2. Sidebar Event Borders**: 7485 7486**Before**: 7487```php 7488border-bottom: 1px solid rgba(0, 204, 7, 0.2); // Hardcoded 7489``` 7490 7491**After**: 7492```php 7493borderColor = $themeStyles['grid_border']; 7494border-bottom: 1px solid $borderColor !important; 7495``` 7496 7497### Before vs After 7498 7499**BEFORE (v4.8.4)**: 7500``` 7501Event Dialog: 7502┌────────────────┐ 7503│ Add Event │ ← White background ✗ 7504│ Title: [_____] │ ← White inputs ✗ 7505│ Date: [_____] │ 7506│ [Cancel] [Save]│ ← Default buttons ✗ 7507└────────────────┘ 7508 7509Sidebar Events: 7510Event 1 ──────── ← White border ✗ 7511Event 2 ──────── ← White border ✗ 7512``` 7513 7514**AFTER (v4.8.5)**: 7515``` 7516Event Dialog (Matrix): 7517┌────────────────┐ 7518│ Add Event │ ← Dark green background ✓ 7519│ Title: [_____] │ ← Dark green inputs ✓ 7520│ Date: [_____] │ ← Green text ✓ 7521│ [Cancel] [Save]│ ← Themed buttons ✓ 7522└────────────────┘ 7523 7524Sidebar Events (Matrix): 7525Event 1 ──────── ← Green border ✓ 7526Event 2 ──────── ← Green border ✓ 7527``` 7528 7529### Dialog Examples by Theme 7530 7531**Matrix Dialog**: 7532``` 7533┌──────────────────────────┐ 7534│ ✏️ Edit Event │ ← Dark green header 7535├──────────────────────────┤ 7536│ Title │ ← Green labels 7537│ [Team Meeting________] │ ← Dark green input 7538│ │ 7539│ Start Date │ 7540│ [2026-02-08__] │ ← Dark green input 7541│ │ 7542│ Start Time │ 7543│ [2:00 PM ▼] │ ← Green select 7544│ │ 7545│ ☑ Repeating Event │ ← Green checkbox 7546│ │ 7547│ [Cancel] [ Save] │ ← Themed buttons 7548└──────────────────────────┘ 7549 7550Everything green! ✓ 7551``` 7552 7553**Purple Dialog**: 7554``` 7555┌──────────────────────────┐ 7556│ ✏️ Edit Event │ ← Dark purple header 7557├──────────────────────────┤ 7558│ [Inputs_______________] │ ← Dark purple inputs 7559│ ☑ Checkboxes │ ← Purple accent 7560│ [Cancel] [ Save] │ ← Purple buttons 7561└──────────────────────────┘ 7562``` 7563 7564**Professional Dialog**: 7565``` 7566┌──────────────────────────┐ 7567│ ✏️ Edit Event │ ← Light gradient header 7568├──────────────────────────┤ 7569│ [Inputs_______________] │ ← White inputs 7570│ ☑ Checkboxes │ ← Blue accent 7571│ [Cancel] [ Save] │ ← Blue save button 7572└──────────────────────────┘ 7573``` 7574 7575**Pink Dialog**: 7576``` 7577┌──────────────────────────┐ 7578│ ✏️ Edit Event │ ← Dark pink header ✨ 7579├──────────────────────────┤ 7580│ [Inputs_______________] │ ← Dark pink inputs 7581│ ☑ Checkboxes │ ← Pink accent 7582│ [Cancel] [ Save] │ ← Pink buttons 7583└──────────────────────────┘ 7584``` 7585 7586### Complete Dialog Element Coverage 7587 7588**All form elements themed**: 7589- ✅ Dialog container 7590- ✅ Dialog header 7591- ✅ Close button (×) 7592- ✅ Title input 7593- ✅ Namespace search 7594- ✅ Namespace dropdown 7595- ✅ Description textarea 7596- ✅ Start date input 7597- ✅ End date input 7598- ✅ Recurring checkbox 7599- ✅ Recurrence type select 7600- ✅ Recurrence end date 7601- ✅ Start time select 7602- ✅ End time select 7603- ✅ Color select 7604- ✅ Custom color picker 7605- ✅ Task checkbox 7606- ✅ All labels 7607- ✅ Cancel button 7608- ✅ Save button 7609 7610**Every single dialog element themed!** 7611 7612### Sidebar Border Example 7613 7614**Matrix Sidebar**: 7615``` 7616┌────────────────┐ 7617│ Today │ ← Green section header 7618├────────────────┤ 7619│ Team Meeting │ 7620│ 2:00 PM │ 7621├────────────────┤ ← Green border (grid_border) 7622│ Code Review │ 7623│ 4:00 PM │ 7624├────────────────┤ ← Green border 7625│ Stand-up │ 7626│ All day │ 7627└────────────────┘ 7628 7629Subtle green dividers! ✓ 7630``` 7631 7632### Complete Achievement 7633 7634**Every UI element themed**: 7635- ✅ Calendar 7636- ✅ Sidebar widget 7637- ✅ Event list 7638- ✅ Search bar 7639- ✅ **Event dialog** ← v4.8.5! 7640- ✅ Month picker 7641- ✅ **Sidebar dividers** ← v4.8.5! 7642- ✅ All text 7643- ✅ All inputs 7644- ✅ All buttons 7645- ✅ All borders 7646- ✅ All checkboxes 7647 7648**ABSOLUTE COMPLETE THEMING!** ✨ 7649 7650## Version 4.8.4 (2026-02-08) - FIX PROFESSIONAL THEME BACKGROUNDS 7651 7652### Fixed: Professional Theme Background Consistency 7653- **Fixed:** Container and event backgrounds now match sidebar 7654- **Fixed:** Lighter, cleaner appearance 7655- **Fixed:** Better contrast and readability 7656- **Result:** Professional theme looks cohesive! 7657 7658### The Problem 7659 7660**v4.8.3 Professional theme**: 7661``` 7662Sidebar: Light background (#f5f7fa) 7663Calendar: Medium background (#e8ecf1) ← Didn't match! 7664Events: Light background (#f5f7fa) 7665 7666Inconsistent! ✗ 7667``` 7668 7669### The Fix 7670 7671**Updated Professional theme colors for consistency**: 7672 7673```php 7674// Before: 7675'bg' => '#e8ecf1', // Medium gray-blue 7676'cell_bg' => '#f5f7fa', // Very light 7677'grid_bg' => '#d5dbe3', // Medium-dark 7678 7679// After: 7680'bg' => '#f5f7fa', // Very light (matches sidebar) 7681'cell_bg' => '#ffffff', // Pure white (clean) 7682'grid_bg' => '#e8ecf1', // Subtle contrast 7683'grid_border' => '#d0d7de', // Softer borders 7684``` 7685 7686### Before vs After 7687 7688**BEFORE (v4.8.3)**: 7689``` 7690Professional Theme: 7691┌────────────────┐ 7692│ Calendar │ ← Medium gray (#e8ecf1) 7693│ ┌────────────┐ │ 7694│ │ Event │ │ ← Light (#f5f7fa) 7695│ └────────────┘ │ 7696└────────────────┘ 7697 7698Sidebar: 7699┌────────────────┐ 7700│ Widget │ ← Light (#f5f7fa) 7701└────────────────┘ 7702 7703Backgrounds don't match! ✗ 7704``` 7705 7706**AFTER (v4.8.4)**: 7707``` 7708Professional Theme: 7709┌────────────────┐ 7710│ Calendar │ ← Light (#f5f7fa) 7711│ ┌────────────┐ │ 7712│ │ Event │ │ ← White (#ffffff) 7713│ └────────────┘ │ 7714└────────────────┘ 7715 7716Sidebar: 7717┌────────────────┐ 7718│ Widget │ ← Light (#f5f7fa) 7719└────────────────┘ 7720 7721Perfect match! ✓ 7722``` 7723 7724### New Professional Theme Colors 7725 7726**Backgrounds**: 7727- Container: `#f5f7fa` (light blue-gray) 7728- Events: `#ffffff` (pure white) 7729- Grid: `#e8ecf1` (subtle contrast) 7730 7731**Text**: 7732- Primary: `#2c3e50` (dark blue-gray) 7733- Bright: `#4a90e2` (blue accent) 7734- Dim: `#7f8c8d` (medium gray) 7735 7736**Borders**: 7737- Main: `#4a90e2` (blue) 7738- Grid: `#d0d7de` (soft gray) 7739 7740**Header**: 7741- Gradient: `#ffffff` → `#f5f7fa` 7742 7743### Visual Example 7744 7745**Professional Theme Now**: 7746``` 7747┌─────────────────────────────┐ 7748│ February 2026 │ ← White to light gradient 7749├─┬─┬─┬─┬─┬─┬─┬───────────────┤ 7750│S│M│T│W│T│F│S│ │ ← Light background 7751├─┼─┼─┼─┼─┼─┼─┤ │ 7752│ │ │1│2│3│4│5│ Event List │ ← White events 7753│ │ │ │ │ │ │ │ ┌───────────┐ │ 7754│ │ │ │ │[8]│ │ │ Meeting │ │ ← White on light 7755└─┴─┴─┴─┴─┴─┴─┴─└───────────┘─┘ 7756 7757Clean, professional look! ✓ 7758``` 7759 7760### Comparison with Other Themes 7761 7762**Matrix** (dark): 7763- Container: #242424 (dark green) 7764- Events: #242424 (dark green) 7765- Consistent dark theme ✓ 7766 7767**Purple** (dark): 7768- Container: #1a0d14 (dark purple) 7769- Events: #2a2030 (dark purple) 7770- Consistent dark theme ✓ 7771 7772**Professional** (light): 7773- Container: #f5f7fa (light blue) 7774- Events: #ffffff (white) 7775- Consistent light theme ✓ 7776 7777**Pink** (dark): 7778- Container: #1a0d14 (dark pink) 7779- Events: #1a0d14 (dark pink) 7780- Consistent dark theme ✓ 7781 7782**All themes now consistent!** 7783 7784### Better Contrast 7785 7786**Professional theme improvements**: 7787 7788**Readability**: 7789- Dark text (#2c3e50) on white/light backgrounds ✓ 7790- Excellent contrast ratio ✓ 7791- Easy on the eyes ✓ 7792 7793**Visual hierarchy**: 7794- White events pop against light container ✓ 7795- Blue accents stand out ✓ 7796- Clean, modern look ✓ 7797 7798**Professional appearance**: 7799- Lighter = more corporate/business feel ✓ 7800- Clean whites = premium quality ✓ 7801- Subtle grays = sophisticated ✓ 7802 7803### Complete Theme Consistency 7804 7805**All themes now have matching backgrounds**: 7806 7807**Matrix**: 7808- Sidebar & Calendar both dark green ✓ 7809 7810**Purple**: 7811- Sidebar & Calendar both dark purple ✓ 7812 7813**Professional**: 7814- Sidebar & Calendar both light ✓ (v4.8.4!) 7815 7816**Pink**: 7817- Sidebar & Calendar both dark pink ✓ 7818 7819**Perfect visual unity across all views!** ✨ 7820 7821## Version 4.8.3 (2026-02-08) - FINAL POLISH: BOLD TEXT, SEARCH, SIDEBAR BOXES 7822 7823### Fixed: Bold Text in Descriptions Themed 7824- **Fixed:** **Bold text** now uses theme primary color 7825- **Fixed:** Both `**text**` and `__text__` syntax themed 7826- **Result:** Bold text matches theme! 7827 7828### Fixed: Search Bar Fully Themed 7829- **Fixed:** Search input has !important on all styles 7830- **Fixed:** Icon and placeholder text themed 7831- **Result:** Search bar perfectly themed! 7832 7833### Fixed: Sidebar Event Boxes Themed 7834- **Fixed:** Event borders in sidebar now use theme grid_border color 7835- **Fixed:** Borders have !important flag 7836- **Result:** Sidebar boxes match theme! 7837 7838### All Changes 7839 7840**1. Bold Text Styling**: 7841 7842**Before**: 7843```html 7844<strong>Bold text</strong> ← Default black 7845``` 7846 7847**After**: 7848```php 7849<strong style="color: $text_primary !important; font-weight:bold;"> 7850 Bold text 7851</strong> 7852 7853Matrix: Green bold ✓ 7854Purple: Lavender bold ✓ 7855Professional: Dark bold ✓ 7856Pink: Pink bold ✓ 7857``` 7858 7859**2. Search Bar**: 7860 7861**Before**: 7862```php 7863style="background: $bg; color: $text;" 7864Could be overridden by CSS 7865``` 7866 7867**After**: 7868```php 7869style="background: $bg !important; 7870 color: $text_primary !important; 7871 border-color: $grid_border !important;" 7872 7873Cannot be overridden! ✓ 7874``` 7875 7876**3. Sidebar Event Boxes**: 7877 7878**Before**: 7879```php 7880$borderColor = 'rgba(0, 204, 7, 0.2)'; // Hardcoded 7881``` 7882 7883**After**: 7884```php 7885$borderColor = $themeStyles['grid_border']; // From theme 7886border-bottom: 1px solid $borderColor !important; 7887 7888Matrix: Green borders ✓ 7889Purple: Purple borders ✓ 7890Professional: Gray borders ✓ 7891Pink: Pink borders ✓ 7892``` 7893 7894### Before vs After 7895 7896**BEFORE (v4.8.2)**: 7897``` 7898Event description: 7899"Please review **Q1 Goals** carefully" 7900 ↑ 7901 Black bold ✗ 7902 7903Search bar: 7904[ Search...] ← Gray placeholder ✗ 7905 7906Sidebar: 7907┌────────────┐ 7908│ Event 1 │ 7909├────────────┤ ← Gray border ✗ 7910│ Event 2 │ 7911└────────────┘ 7912``` 7913 7914**AFTER (v4.8.3)**: 7915``` 7916Matrix Theme: 7917 7918Event description: 7919"Please review **Q1 Goals** carefully" 7920 ↑ 7921 Green bold ✓ 7922 7923Search bar: 7924[ Search...] ← Green themed ✓ 7925 7926Sidebar: 7927┌────────────┐ 7928│ Event 1 │ 7929├────────────┤ ← Green border ✓ 7930│ Event 2 │ 7931└────────────┘ 7932``` 7933 7934### Examples by Theme 7935 7936**Matrix Theme**: 7937``` 7938Description: 7939"Check **important notes** and links" 7940 ↑ 7941 Green bold 7942 7943Sidebar boxes: 7944Event 1 7945───────── Green border 7946Event 2 7947───────── Green border 7948``` 7949 7950**Purple Theme**: 7951``` 7952Description: 7953"Review **agenda items** before meeting" 7954 ↑ 7955 Lavender bold 7956 7957Sidebar boxes: 7958Event 1 7959───────── Purple border 7960Event 2 7961───────── Purple border 7962``` 7963 7964**Professional Theme**: 7965``` 7966Description: 7967"Update **quarterly reports** by Friday" 7968 ↑ 7969 Dark bold 7970 7971Sidebar boxes: 7972Event 1 7973───────── Gray border 7974Event 2 7975───────── Gray border 7976``` 7977 7978**Pink Theme**: 7979``` 7980Description: 7981"Don't forget **party supplies** ✨" 7982 ↑ 7983 Pink bold 7984 7985Sidebar boxes: 7986Event 1 7987───────── Pink border 7988Event 2 ✨ 7989───────── Pink border 7990``` 7991 7992### Complete Formatting Coverage 7993 7994**Text formatting themed**: 7995- ✅ Regular text 7996- ✅ **Bold text** ← NEW! 7997- ✅ Links 7998- ✅ Italic text (inherits) 7999- ✅ Code (inherits) 8000 8001**UI elements themed**: 8002- ✅ Search bar ← Enhanced! 8003- ✅ Search icon ← Enhanced! 8004- ✅ Search placeholder ← Enhanced! 8005- ✅ Sidebar borders ← NEW! 8006- ✅ Event borders 8007- ✅ Badges 8008- ✅ Buttons 8009 8010**Every element perfectly themed!** 8011 8012### Search Bar Coverage 8013 8014**All aspects themed**: 8015- Background: Theme cell_bg ✓ 8016- Text color: Theme text_primary ✓ 8017- Border: Theme grid_border ✓ 8018- Placeholder: Inherits text color ✓ 8019- Icon (): In placeholder ✓ 8020- Clear button (✕): Themed ✓ 8021 8022**Cannot be overridden!** (all have !important) 8023 8024### Sidebar Event Box Styling 8025 8026**Consistent borders**: 8027``` 8028Matrix: 8029╔════════════╗ 8030║ Event 1 ║ 8031╟────────────╢ ← grid_border color 8032║ Event 2 ║ 8033╚════════════╝ 8034 8035All themes match perfectly! ✓ 8036``` 8037 8038### Complete Theme Achievement 8039 8040**Every single element themed**: 8041- ✅ Backgrounds 8042- ✅ Text (regular) 8043- ✅ Text (bold) ← v4.8.3! 8044- ✅ Links 8045- ✅ Badges 8046- ✅ Buttons 8047- ✅ Checkboxes 8048- ✅ Icons 8049- ✅ Borders 8050- ✅ Search bar ← Enhanced v4.8.3! 8051- ✅ Sidebar boxes ← v4.8.3! 8052- ✅ Today marker 8053- ✅ Calendar grid 8054- ✅ Event panels 8055 8056**ABSOLUTE PERFECTION!** ✨ 8057 8058## Version 4.8.2 (2026-02-08) - THEME LINKS IN DESCRIPTIONS 8059 8060### Fixed: Links in Descriptions Now Themed 8061- **Fixed:** All links in event descriptions now use theme color 8062- **Fixed:** DokuWiki links [[page|text]] themed 8063- **Fixed:** Markdown links [text](url) themed 8064- **Fixed:** Plain URLs themed 8065- **Result:** Links match theme perfectly! 8066 8067### The Problem 8068 8069**v4.8.1 behavior**: 8070``` 8071Event description: 8072"Check out https://example.com" ← Blue default link ✗ 8073"See [[wiki:page|docs]]" ← Blue default link ✗ 8074``` 8075 8076### The Fix 8077 8078**Added inline color styling to ALL link types**: 8079 8080```php 8081// Get theme colors: 8082$linkColor = $themeStyles['border'] . ' !important'; 8083$linkStyle = ' style="color:' . $linkColor . ';"'; 8084 8085// Apply to links: 8086<a href="..." style="color: #00cc07 !important;">link</a> 8087``` 8088 8089**All link types themed**: 80901. DokuWiki syntax: `[[page|text]]` 80912. Markdown syntax: `[text](url)` 80923. Plain URLs: `https://example.com` 8093 8094### Before vs After 8095 8096**BEFORE (v4.8.1)**: 8097``` 8098Matrix Theme Description: 8099"Visit https://example.com for more info" 8100 ↑ 8101 Blue link ✗ (doesn't match green theme) 8102``` 8103 8104**AFTER (v4.8.2)**: 8105``` 8106Matrix Theme Description: 8107"Visit https://example.com for more info" 8108 ↑ 8109 Green link ✓ (matches theme!) 8110``` 8111 8112### Link Colors by Theme 8113 8114**Matrix**: 8115- Links: Green (#00cc07) !important 8116- Matches: Border, badges, highlights 8117 8118**Purple**: 8119- Links: Purple (#9b59b6) !important 8120- Matches: Border, badges, highlights 8121 8122**Professional**: 8123- Links: Blue (#4a90e2) !important 8124- Matches: Border, badges, highlights 8125 8126**Pink**: 8127- Links: Hot Pink (#ff1493) !important 8128- Matches: Border, badges, highlights ✨ 8129 8130### Examples 8131 8132**Matrix Description with Links**: 8133``` 8134Event: Team Meeting 8135Description: 8136"Review [[wiki:q1goals|Q1 Goals]] 8137and visit https://metrics.com" 8138 8139Both links → Green ✓ 8140``` 8141 8142**Purple Description with Links**: 8143``` 8144Event: Planning Session 8145Description: 8146"Check [schedule](https://cal.com) 8147for availability" 8148 8149Link → Purple ✓ 8150``` 8151 8152**Professional Description with Links**: 8153``` 8154Event: Client Call 8155Description: 8156"Prepare [[reports|Monthly Reports]] 8157before the call" 8158 8159Link → Blue ✓ 8160``` 8161 8162**Pink Description with Links**: 8163``` 8164Event: Party Planning 8165Description: 8166"RSVP at https://party.com ✨" 8167 8168Link → Hot Pink ✓ 8169``` 8170 8171### Technical Implementation 8172 8173**Updated renderDescription() function**: 8174 8175```php 8176private function renderDescription($description, $themeStyles = null) { 8177 // Get theme 8178 if ($themeStyles === null) { 8179 $theme = $this->getSidebarTheme(); 8180 $themeStyles = $this->getSidebarThemeStyles($theme); 8181 } 8182 8183 // Create link style 8184 $linkColor = $themeStyles['border'] . ' !important'; 8185 $linkStyle = ' style="color:' . $linkColor . ';"'; 8186 8187 // Apply to all link types: 8188 $linkHtml = '<a href="..." ' . $linkStyle . '>text</a>'; 8189} 8190``` 8191 8192### Complete Theming 8193 8194**Every text element**: 8195- ✅ Event titles 8196- ✅ Event dates 8197- ✅ Event descriptions 8198- ✅ **Links in descriptions** ← NEW! 8199- ✅ Badges 8200- ✅ Buttons 8201 8202**Every color unified!** 8203 8204### Unified Theme Experience 8205 8206**Matrix Theme**: 8207``` 8208Everything green: 8209- Text: Green ✓ 8210- Links: Green ✓ 8211- Badges: Green ✓ 8212- Borders: Green ✓ 8213- Buttons: Green ✓ 8214- Today marker: Green ✓ 8215 8216Perfect harmony! ✓ 8217``` 8218 8219**No default blue links breaking the theme!** 8220 8221### Link Types Supported 8222 8223**1. DokuWiki Syntax**: 8224``` 8225[[page|Link Text]] → Themed ✓ 8226[[page]] → Themed ✓ 8227[[page#section|Text]] → Themed ✓ 8228``` 8229 8230**2. Markdown Syntax**: 8231``` 8232[Link Text](https://url.com) → Themed ✓ 8233[Text](internal-page) → Themed ✓ 8234``` 8235 8236**3. Plain URLs**: 8237``` 8238https://example.com → Themed ✓ 8239http://site.org → Themed ✓ 8240``` 8241 8242**All links perfectly themed!** 8243 8244## Version 4.8.1 (2026-02-08) - FIX BADGES & TODAY CELL MARKER 8245 8246### Fixed: All Badges Now Themed 8247- **Fixed:** TODAY badge themed with theme color 8248- **Fixed:** PAST DUE badge uses orange (warning color) 8249- **Fixed:** Namespace badges themed 8250- **Fixed:** All badges visible and hidden 8251- **Result:** All badges match theme! 8252 8253### Fixed: Today Cell More Prominent 8254- **Fixed:** Today cell now has 2px border in theme color 8255- **Fixed:** Border added to both PHP and JavaScript 8256- **Result:** Today stands out clearly! 8257 8258### Fixed: Past Event Text Fully Themed 8259- **Fixed:** Event-info div backgrounds ensure no gray 8260- **Result:** Expanded past events completely themed! 8261 8262### All Changes 8263 8264**1. Badge Theming**: 8265 8266**TODAY Badge**: 8267```php 8268// PHP & JavaScript: 8269style="background: $themeStyles['border'] !important; 8270 color: $bg !important;" 8271 8272Matrix: Green badge 8273Purple: Purple badge 8274Professional: Blue badge with white text 8275Pink: Pink badge 8276``` 8277 8278**PAST DUE Badge** (always orange): 8279```php 8280style="background: #ff9800 !important; 8281 color: #fff !important;" 8282``` 8283 8284**Namespace Badge**: 8285```php 8286style="background: $themeStyles['border'] !important; 8287 color: $bg !important;" 8288``` 8289 8290**2. Today Cell Border**: 8291 8292**PHP**: 8293```php 8294$todayBorder = $isToday ? 8295 'border:2px solid ' . $themeStyles['border'] . ' !important;' : ''; 8296``` 8297 8298**JavaScript**: Same 8299 8300**Result**: Today cell has prominent colored border! 8301 8302### Before vs After 8303 8304**BEFORE (v4.8.0)**: 8305``` 8306Calendar: 8307┌─┬─┬─┬─┬─┬─┬─┐ 8308│1│2│3│4│5│6│7│ 8309│ │ │ │[8]│ │ │ ← Today: subtle background 8310└─┴─┴─┴─┴─┴─┴─┘ 8311 8312Event badges: 8313Mon, Feb 8 [TODAY] [Work] ← Gray badges ✗ 8314``` 8315 8316**AFTER (v4.8.1)**: 8317``` 8318Calendar (Matrix): 8319┌─┬─┬─┬─┬─┬─┬─┐ 8320│1│2│3│4│5│6│7│ 8321│ │ │ │[8]│ │ │ ← Today: green border 2px ✓ 8322└─┴─┴─┴─┴─┴─┴─┘ 8323 8324Event badges (Matrix): 8325Mon, Feb 8 [TODAY] [Work] ← Green badges ✓ 8326``` 8327 8328### Matrix Theme Example 8329 8330**Calendar**: 8331``` 8332Today cell: 8333┌────┐ 8334│ 8 │ Dark green bg + Green 2px border 8335└────┘ 8336Very obvious! 8337``` 8338 8339**Badges**: 8340``` 8341[TODAY] ← Green bg, dark text 8342[Work] ← Green bg, dark text 8343[PAST DUE] ← Orange bg, white text 8344``` 8345 8346### Purple Theme Example 8347 8348**Calendar**: 8349``` 8350Today cell: 8351┌────┐ 8352│ 8 │ Dark purple bg + Purple 2px border 8353└────┘ 8354``` 8355 8356**Badges**: 8357``` 8358[TODAY] ← Purple bg 8359[Work] ← Purple bg 8360``` 8361 8362### Professional Theme Example 8363 8364**Calendar**: 8365``` 8366Today cell: 8367┌────┐ 8368│ 8 │ Light blue bg + Blue 2px border 8369└────┘ 8370``` 8371 8372**Badges**: 8373``` 8374[TODAY] ← Blue bg, white text 8375[Work] ← Blue bg, white text 8376``` 8377 8378### Pink Theme Example 8379 8380**Calendar**: 8381``` 8382Today cell: 8383┌────┐ 8384│ 8 │ Dark pink bg + Pink 2px border ✨ 8385└────┘ 8386``` 8387 8388**Badges**: 8389``` 8390[TODAY] ← Pink bg 8391[Work] ← Pink bg ✨ 8392``` 8393 8394### Complete Badge Coverage 8395 8396**All badges themed**: 8397- ✅ TODAY badge (theme color) 8398- ✅ PAST DUE badge (orange warning) 8399- ✅ Namespace badges (theme color) 8400- ✅ Visible events 8401- ✅ Hidden/past events 8402 8403**No gray badges anywhere!** 8404 8405### Today Cell Visual 8406 8407**Dual indicators**: 84081. Background color (theme today bg) 84092. Border (2px theme color) ← NEW! 8410 8411**Result**: Today is VERY obvious! 8412 8413**Matrix**: Green bg + Green border 8414**Purple**: Purple bg + Purple border 8415**Professional**: Light blue bg + Blue border 8416**Pink**: Pink bg + Pink border ✨ 8417 8418### Complete Theming 8419 8420**Every element themed**: 8421- ✅ Backgrounds 8422- ✅ Text colors 8423- ✅ Badges (v4.8.1!) 8424- ✅ Today marker (v4.8.1!) 8425- ✅ Checkboxes 8426- ✅ Buttons 8427- ✅ Icons 8428 8429**Absolutely everything!** ✨ 8430 8431## Version 4.8.0 (2026-02-08) - COMPLETE EVENT BACKGROUND THEMING 8432 8433### Fixed: All Event Backgrounds Now Themed 8434- **Fixed:** event-info div now has themed background 8435- **Fixed:** event-meta-compact div (visible) now has themed background 8436- **Fixed:** event-desc-compact div now has themed background 8437- **Fixed:** All !important flags added to prevent CSS override 8438- **Result:** Entire event item fully themed! 8439 8440### Fixed: Description Text Shows Correct Color Immediately 8441- **Fixed:** Description divs now have explicit background + color on load 8442- **Fixed:** Both visible and hidden descriptions fully styled 8443- **Result:** No more gray text on initial load! 8444 8445### The Problem 8446 8447**v4.7.9 behavior**: 8448``` 8449Expanded past event: 8450┌────────────────────────┐ 8451│ ▾ Team Meeting │ ← Themed ✓ 8452│ Mon, Feb 8 │ ← Themed ✓ 8453│ │ 8454│ [Event details] │ ← Gray background ✗ 8455│ [Description] │ ← Gray text until navigation ✗ 8456└────────────────────────┘ 8457 8458Only the date/time div was themed! 8459``` 8460 8461### The Fix 8462 8463**Added background to ALL inner divs**: 8464 8465**PHP**: 8466```php 8467// Event container: 8468style="background:' . $themeStyles['cell_bg'] . ' !important;" 8469 8470// event-info wrapper: 8471<div class="event-info" 8472 style="background:' . $themeStyles['cell_bg'] . ' !important;"> 8473 8474// event-meta-compact: 8475<div class="event-meta-compact" 8476 style="background:' . $themeStyles['cell_bg'] . ' !important;"> 8477 8478// event-desc-compact: 8479<div class="event-desc-compact" 8480 style="background:' . $themeStyles['cell_bg'] . ' !important; 8481 color:' . $themeStyles['text_dim'] . ' !important;"> 8482``` 8483 8484**JavaScript**: Same styling applied 8485 8486### Before vs After 8487 8488**BEFORE (v4.7.9)**: 8489``` 8490Matrix Theme - Expanded Event: 8491┌────────────────────────┐ 8492│ ▾ Team Meeting │ 8493│ Mon, Feb 8 ← Green │ 8494│ │ 8495│ Details ← Gray ✗ │ 8496│ Description ← Gray ✗ │ 8497│ [✏️] [️] │ 8498└────────────────────────┘ 8499``` 8500 8501**AFTER (v4.8.0)**: 8502``` 8503Matrix Theme - Expanded Event: 8504┌────────────────────────┐ 8505│ ▾ Team Meeting │ 8506│ Mon, Feb 8 ← Green │ 8507│ │ 8508│ Details ← Green ✓│ 8509│ Description ← Green ✓│ 8510│ [✏️] [️] │ 8511└────────────────────────┘ 8512 8513Entire event themed! 8514``` 8515 8516### What's Themed Now 8517 8518**Event Item Structure** (all themed): 8519``` 8520event-compact-item ← Themed ✓ 8521 └─ event-info ← Themed ✓ (v4.8.0!) 8522 ├─ event-title-row ← Themed ✓ 8523 ├─ event-meta ← Themed ✓ (v4.8.0!) 8524 └─ event-desc ← Themed ✓ (v4.8.0!) 8525``` 8526 8527**Every layer has background!** 8528 8529### Matrix Theme Example 8530 8531**Complete event**: 8532``` 8533┌────────────────────────────┐ 8534│ Team Meeting │ ← Dark green bg 8535│ Mon, Feb 8 • 2:00 PM │ ← Dark green bg 8536│ Discussed Q1 goals and │ ← Dark green bg 8537│ set targets for team │ ← Dark green bg 8538│ [✏️] [️] [☑] │ ← Dark green bg 8539└────────────────────────────┘ 8540 8541Consistent green throughout! ✓ 8542``` 8543 8544### Purple Theme Example 8545 8546``` 8547┌────────────────────────────┐ 8548│ Team Meeting │ ← Dark purple bg 8549│ Mon, Feb 8 • 2:00 PM │ ← Dark purple bg 8550│ Discussed Q1 goals │ ← Dark purple bg 8551│ [✏️] [️] [☑] │ ← Dark purple bg 8552└────────────────────────────┘ 8553 8554Consistent purple throughout! ✓ 8555``` 8556 8557### Professional Theme Example 8558 8559``` 8560┌────────────────────────────┐ 8561│ Team Meeting │ ← Light bg 8562│ Mon, Feb 8 • 2:00 PM │ ← Light bg 8563│ Discussed Q1 goals │ ← Light bg 8564│ [✏️] [️] [☑] │ ← Light bg 8565└────────────────────────────┘ 8566 8567Consistent light throughout! ✓ 8568``` 8569 8570### Pink Theme Example 8571 8572``` 8573┌────────────────────────────┐ 8574│ Team Meeting │ ← Dark pink bg 8575│ Mon, Feb 8 • 2:00 PM │ ← Dark pink bg 8576│ Discussed Q1 goals │ ← Dark pink bg 8577│ [✏️] [️] [☑] │ ← Dark pink bg 8578└────────────────────────────┘ 8579 8580Consistent pink throughout! ✓ 8581``` 8582 8583### Complete Theming 8584 8585**Every element, every layer**: 8586- ✅ Container 8587- ✅ Event item 8588- ✅ Event info wrapper (v4.8.0!) 8589- ✅ Title row 8590- ✅ Meta div (v4.8.0!) 8591- ✅ Description div (v4.8.0!) 8592- ✅ Action buttons 8593- ✅ Checkboxes 8594 8595**No gray anywhere!** 8596 8597### Why Multiple Backgrounds? 8598 8599**CSS layers stack**: 8600```html 8601<div style="background: green;"> ← Layer 1 8602 <div style="background: inherit;"> ← Could be gray! 8603 <div>Content</div> ← Inherits gray! 8604 </div> 8605</div> 8606 8607Better: 8608<div style="background: green;"> ← Layer 1 8609 <div style="background: green;"> ← Layer 2 forced 8610 <div style="background: green;"> ← Layer 3 forced 8611 Content ← All green! 8612 </div> 8613 </div> 8614</div> 8615``` 8616 8617**Every layer forced = Perfect theming!** 8618 8619### !important Everywhere 8620 8621**All styling now uses !important**: 8622- background: ... !important 8623- color: ... !important 8624 8625**Result**: CSS cannot override themes! 8626 8627**Version 4.8.0 = Complete, bulletproof theming!** ✨ 8628 8629## Version 4.7.9 (2026-02-08) - THEME ICONS, CHECKBOXES & EXPANDED BACKGROUNDS 8630 8631### Fixed: Past Event Expanded Background Themed 8632- **Fixed:** Past event meta div now has theme background when expanded 8633- **Fixed:** Both PHP and JavaScript render with theme background 8634- **Result:** Expanded past events have proper themed background! 8635 8636### ✅ Fixed: Checkboxes Now Themed 8637- **Fixed:** Task checkboxes use accent-color matching theme 8638- **Fixed:** Cursor changes to pointer on hover 8639- **Result:** Checkboxes match theme color! 8640 8641### Fixed: Action Buttons (Edit/Delete) Themed 8642- **Fixed:** Edit (✏️) and Delete (️) buttons now themed 8643- **Fixed:** Background, text, and border all use theme colors 8644- **Result:** All icons themed! 8645 8646### All Changes 8647 8648**1. Past Event Expanded Background**: 8649 8650**PHP**: 8651```php 8652// Before: 8653<div class="event-meta-compact" style="display:none;"> 8654 8655// After: 8656<div class="event-meta-compact" 8657 style="display:none; background:' . $themeStyles['cell_bg'] . ' !important;"> 8658``` 8659 8660**JavaScript**: Same treatment 8661 8662**Result**: Expanded past events have themed background! 8663 8664**2. Task Checkboxes**: 8665 8666**PHP & JavaScript**: 8667```php 8668// Added accent-color: 8669<input type="checkbox" 8670 style="accent-color:' . $themeStyles['border'] . ' !important; 8671 cursor:pointer;"> 8672``` 8673 8674**accent-color** changes the checkbox color: 8675- Matrix: Green checkboxes ✓ 8676- Purple: Purple checkboxes ✓ 8677- Professional: Blue checkboxes ✓ 8678- Pink: Pink checkboxes ✓ 8679 8680**3. Edit/Delete Buttons**: 8681 8682**PHP**: 8683```php 8684<button class="event-action-btn" 8685 style="color:' . $themeStyles['text_primary'] . ' !important; 8686 background:' . $themeStyles['cell_bg'] . ' !important; 8687 border-color:' . $themeStyles['grid_border'] . ' !important;"> 8688 ️ 8689</button> 8690``` 8691 8692**JavaScript**: Same 8693 8694**Result**: Buttons blend with theme! 8695 8696### Before vs After 8697 8698**BEFORE (v4.7.8)**: 8699``` 8700Past Event (expanded): 8701┌─────────────────────────┐ 8702│ ▾ Team Meeting │ 8703│ Mon, Feb 8 │ ← White background ✗ 8704│ Description │ 8705├─────────────────────────┤ 8706│ [✏️] [️] [☐] │ ← Default colors ✗ 8707└─────────────────────────┘ 8708``` 8709 8710**AFTER (v4.7.9)**: 8711``` 8712Past Event (expanded - Matrix): 8713┌─────────────────────────┐ 8714│ ▾ Team Meeting │ 8715│ Mon, Feb 8 │ ← Dark green bg ✓ 8716│ Description │ 8717├─────────────────────────┤ 8718│ [✏️] [️] [☑] │ ← Themed ✓ 8719└─────────────────────────┘ 8720``` 8721 8722### Matrix Theme Example 8723 8724**Checkboxes**: Green accent 8725**Buttons**: Dark bg, green text, green borders 8726**Expanded**: Dark green background 8727 8728``` 8729Task: ☑ Complete report ← Green checkmark 8730[✏️] [️] ← Dark buttons with green 8731``` 8732 8733### Purple Theme Example 8734 8735**Checkboxes**: Purple accent 8736**Buttons**: Dark purple bg, lavender text 8737**Expanded**: Dark purple background 8738 8739``` 8740Task: ☑ Complete report ← Purple checkmark 8741[✏️] [️] ← Purple themed 8742``` 8743 8744### Professional Theme Example 8745 8746**Checkboxes**: Blue accent 8747**Buttons**: Light bg, dark text 8748**Expanded**: Light background 8749 8750``` 8751Task: ☑ Complete report ← Blue checkmark 8752[✏️] [️] ← Light themed 8753``` 8754 8755### Pink Theme Example 8756 8757**Checkboxes**: Pink accent 8758**Buttons**: Dark pink bg, pink text 8759**Expanded**: Dark pink background 8760 8761``` 8762Task: ☑ Complete report ← Pink checkmark 8763[✏️] [️] ← Pink themed 8764``` 8765 8766### Complete Icon Coverage 8767 8768**Themed Icons/Buttons**: 8769- ✅ Task checkboxes (accent-color) 8770- ✅ Edit button (✏️) 8771- ✅ Delete button (️) 8772- ✅ Navigation arrows (◀ ▶) 8773- ✅ Today button 8774- ✅ Past Events arrow (▶) 8775 8776**All interactive elements themed!** 8777 8778### How accent-color Works 8779 8780**Modern CSS property** for form controls: 8781```css 8782input[type="checkbox"] { 8783 accent-color: #00cc07; /* Green checkbox! */ 8784} 8785``` 8786 8787**Browser support**: All modern browsers ✓ 8788 8789**Result**: Checkboxes automatically match theme! 8790 8791### Complete Theme Coverage 8792 8793**Backgrounds**: 8794- ✅ Container 8795- ✅ Calendar-left 8796- ✅ Calendar-right 8797- ✅ Event items 8798- ✅ Past event expanded (v4.7.9!) 8799- ✅ Action buttons (v4.7.9!) 8800 8801**Icons/Controls**: 8802- ✅ Checkboxes (v4.7.9!) 8803- ✅ Edit/Delete buttons (v4.7.9!) 8804- ✅ Navigation buttons 8805- ✅ All arrows 8806 8807**Every element perfectly themed!** ✨ 8808 8809## Version 4.7.8 (2026-02-08) - FIX BOTTOM BAR & PAST EVENT DETAILS 8810 8811### Fixed: White Bar at Bottom of Calendar 8812- **Fixed:** Added background to calendar-left div with !important 8813- **Result:** No more white bar at bottom! 8814 8815### Fixed: Past Event Expanded Details Not Themed 8816- **Fixed:** Past event date/time now themed when expanded 8817- **Fixed:** Past event descriptions now themed when expanded 8818- **Fixed:** Both PHP and JavaScript render with theme colors 8819- **Result:** Expanding past events shows themed text! 8820 8821### Fixed: Event Description Text Color 8822- **Fixed:** All event descriptions now use theme text_dim color 8823- **Fixed:** Both visible and hidden descriptions themed 8824- **Result:** Descriptions always match theme! 8825 8826### All Changes 8827 8828**1. Bottom White Bar** (calendar-left div): 8829 8830**Before**: 8831```html 8832<div class="calendar-compact-left"> 8833<!-- White background showing at bottom --> 8834``` 8835 8836**After**: 8837```html 8838<div class="calendar-compact-left" 8839 style="background: #242424 !important;"> 8840<!-- Matches theme background --> 8841``` 8842 8843**2. Past Event Expanded Details**: 8844 8845**PHP** - Added colors to hidden details: 8846```php 8847// Past event meta (hidden): 8848<span class="event-date-time" 8849 style="color:' . $themeStyles['text_dim'] . ' !important;"> 8850 8851// Past event description (hidden): 8852<div class="event-desc-compact" 8853 style="display:none; color:' . $themeStyles['text_dim'] . ' !important;"> 8854``` 8855 8856**JavaScript** - Same treatment: 8857```javascript 8858// Past event meta: 8859html += '<span class="event-date-time" 8860 style="color:' + themeStyles.text_dim + ' !important;">'; 8861 8862// Past event description: 8863html += '<div class="event-desc-compact" 8864 style="display: none; color:' + themeStyles.text_dim + ' !important;">'; 8865``` 8866 8867**3. All Event Descriptions**: 8868 8869**Both visible and hidden descriptions now themed**: 8870```php 8871// PHP: 8872style="color:' . $themeStyles['text_dim'] . ' !important;" 8873 8874// JavaScript: 8875style="color:' + themeStyles.text_dim + ' !important;" 8876``` 8877 8878### Before vs After 8879 8880**BEFORE (v4.7.7)**: 8881``` 8882Calendar bottom: 8883┌──────────────┐ 8884│ Calendar │ 8885│ Grid │ 8886└──────────────┘ 8887▒▒▒▒▒▒▒▒▒▒▒▒▒▒ ← White bar 8888 8889Past Event (collapsed): 8890▸ Team Meeting 8891 8892Past Event (expanded): 8893▾ Team Meeting 8894 Mon, Feb 8 ← Gray text ✗ 8895 Description ← Gray text ✗ 8896``` 8897 8898**AFTER (v4.7.8)**: 8899``` 8900Calendar bottom: 8901┌──────────────┐ 8902│ Calendar │ 8903│ Grid │ 8904└──────────────┘ 8905No white bar! ✓ 8906 8907Past Event (collapsed): 8908▸ Team Meeting 8909 8910Past Event (expanded): 8911▾ Team Meeting 8912 Mon, Feb 8 ← Theme dim color ✓ 8913 Description ← Theme dim color ✓ 8914``` 8915 8916### Matrix Theme Example 8917 8918**Past event expanded**: 8919``` 8920▾ Team Meeting (past) 8921 Mon, Feb 8 • 2:00 PM ← Dim green (#00aa00) 8922 Discussed Q1 goals ← Dim green (#00aa00) 8923 8924Everything themed! ✓ 8925``` 8926 8927### Purple Theme Example 8928 8929**Past event expanded**: 8930``` 8931▾ Team Meeting (past) 8932 Mon, Feb 8 • 2:00 PM ← Dim purple (#8e7ab8) 8933 Discussed Q1 goals ← Dim purple (#8e7ab8) 8934 8935Everything themed! ✓ 8936``` 8937 8938### Professional Theme Example 8939 8940**Past event expanded**: 8941``` 8942▾ Team Meeting (past) 8943 Mon, Feb 8 • 2:00 PM ← Gray (#7f8c8d) 8944 Discussed Q1 goals ← Gray (#7f8c8d) 8945 8946Everything themed! ✓ 8947``` 8948 8949### Pink Theme Example 8950 8951**Past event expanded**: 8952``` 8953▾ Team Meeting (past) 8954 Mon, Feb 8 • 2:00 PM ← Light pink (#ff85c1) 8955 Discussed Q1 goals ← Light pink (#ff85c1) 8956 8957Everything themed! ✓ 8958``` 8959 8960### Complete Coverage 8961 8962**Calendar Layout**: 8963- ✅ Container background 8964- ✅ Calendar-left background (v4.7.8!) 8965- ✅ Calendar-right background 8966- ✅ No white bars anywhere! 8967 8968**Event Details**: 8969- ✅ Event titles 8970- ✅ Event dates/times 8971- ✅ Event descriptions (visible) (v4.7.8!) 8972- ✅ Past event dates (expanded) (v4.7.8!) 8973- ✅ Past event descriptions (expanded) (v4.7.8!) 8974 8975**Absolutely everything themed!** 8976 8977## Version 4.7.7 (2026-02-08) - AGGRESSIVE !IMPORTANT ON ALL ELEMENTS 8978 8979### Fixed: Added !important to EVERY Themed Element 8980- **Fixed:** S M T W T F S headers now have background + color with !important 8981- **Fixed:** "Past Events" text now has explicit color with !important 8982- **Fixed:** Today cell background now forced with !important 8983- **Fixed:** All day numbers now have !important color 8984- **Fixed:** Empty cells now have !important background 8985- **Result:** CSS CANNOT override themes anymore! 8986 8987### The Nuclear Option: !important Everywhere 8988 8989**Problem**: DokuWiki CSS was still winning: 8990```css 8991/* DokuWiki theme overriding everything: */ 8992.dokuwiki table th { background: white !important; color: black !important; } 8993.dokuwiki td { background: white !important; } 8994``` 8995 8996**Solution**: Add !important to EVERY inline style: 8997```html 8998<th style="background: #242424 !important; color: #00cc07 !important;"> 8999<td style="background: #2a4d2a !important; color: #00cc07 !important;"> 9000<span style="color: #00cc07 !important;"> 9001``` 9002 9003### All Changes 9004 9005**1. Table Headers (S M T W T F S)**: 9006 9007**PHP** - Added background + !important everywhere: 9008```php 9009$thStyle = 'background:' . $themeStyles['header_bg'] . ' !important; 9010 color:' . $themeStyles['text_primary'] . ' !important; 9011 border-color:' . $themeStyles['grid_border'] . ' !important; 9012 font-weight:bold !important;'; 9013``` 9014 9015**JavaScript** - Added background to each th: 9016```javascript 9017th.style.setProperty('background', themeStyles.header_bg, 'important'); 9018th.style.setProperty('color', themeStyles.text_primary, 'important'); 9019th.style.setProperty('border-color', themeStyles.grid_border, 'important'); 9020th.style.setProperty('font-weight', 'bold', 'important'); 9021``` 9022 9023**2. Past Events Text**: 9024 9025**PHP** - Added !important to spans: 9026```php 9027<span class="past-events-arrow" style="color:' . $themeStyles['text_dim'] . ' !important;">▶</span> 9028<span class="past-events-label" style="color:' . $themeStyles['text_dim'] . ' !important;">Past Events</span> 9029``` 9030 9031**JavaScript** - Same treatment: 9032```javascript 9033html += '<span class="past-events-arrow" style="color:' + themeStyles.text_dim + ' !important;">▶</span>'; 9034html += '<span class="past-events-label" style="color:' + themeStyles.text_dim + ' !important;">Past Events</span>'; 9035``` 9036 9037**3. Today Cell & All Cells**: 9038 9039**PHP** - !important on background and color: 9040```php 9041// Today or regular cell: 9042$cellStyle = 'background:' . $cellBg . ' !important; 9043 color:' . $themeStyles['text_primary'] . ' !important;'; 9044 9045// Day number: 9046<span class="day-num" style="color:' . $themeStyles['text_primary'] . ' !important;"> 9047``` 9048 9049**JavaScript** - Same: 9050```javascript 9051style="background:${cellBg} !important; color:${cellColor} !important;" 9052 9053<span style="color:${cellColor} !important;">${currentDay}</span> 9054``` 9055 9056**4. Empty Cells**: 9057 9058**PHP & JavaScript** - !important: 9059```php 9060style="background:' . $themeStyles['bg'] . ' !important;" 9061``` 9062 9063### Before vs After 9064 9065**BEFORE (v4.7.6)** - CSS still winning: 9066``` 9067S M T W T F S → White background, black text ✗ 9068Today cell → White background ✗ 9069Past Events → Black text ✗ 9070``` 9071 9072**AFTER (v4.7.7)** - Theme wins: 9073``` 9074S M T W T F S → Theme background, theme text ✓ 9075Today cell → Theme highlight ✓ 9076Past Events → Theme text ✓ 9077 9078NOTHING can override !important inline styles! 9079``` 9080 9081### Matrix Theme Example 9082 9083**Complete theming**: 9084``` 9085┌──────────────────────────┐ 9086│ S M T W T F S │ ← Dark bg (#2a2a2a), Green text (#00cc07) 9087├─┬─┬─┬─┬─┬─┬──────────────┤ 9088│ │ │1│2│3│4│5 │ ← Dark cells (#242424), Green nums (#00cc07) 9089│ │ │ │ │ │[8]│ │ ← Today green highlight (#2a4d2a) 9090├─┴─┴─┴─┴─┴─┴──────────────┤ 9091│ ▶ Past Events (3) │ ← Dim green text (#00aa00) 9092└──────────────────────────┘ 9093 9094Every element forced with !important ✓ 9095``` 9096 9097### Purple Theme Example 9098 9099``` 9100┌──────────────────────────┐ 9101│ S M T W T F S │ ← Dark purple bg, Lavender text 9102├─┬─┬─┬─┬─┬─┬──────────────┤ 9103│ │ │1│2│3│4│5 │ ← Dark purple cells, Lavender nums 9104│ │ │ │ │ │[8]│ │ ← Today purple highlight 9105├─┴─┴─┴─┴─┴─┴──────────────┤ 9106│ ▶ Past Events (3) │ ← Dim purple text 9107└──────────────────────────┘ 9108 9109Forced purple everywhere ✓ 9110``` 9111 9112### Professional Theme Example 9113 9114``` 9115┌──────────────────────────┐ 9116│ S M T W T F S │ ← Light bg, Dark text 9117├─┬─┬─┬─┬─┬─┬──────────────┤ 9118│ │ │1│2│3│4│5 │ ← Light cells, Dark nums 9119│ │ │ │ │ │[8]│ │ ← Today light blue highlight 9120├─┴─┴─┴─┴─┴─┴──────────────┤ 9121│ ▶ Past Events (3) │ ← Gray text 9122└──────────────────────────┘ 9123 9124Forced professional everywhere ✓ 9125``` 9126 9127### Pink Theme Example 9128 9129``` 9130┌──────────────────────────┐ 9131│ S M T W T F S │ ← Dark pink bg, Pink text 9132├─┬─┬─┬─┬─┬─┬──────────────┤ 9133│ │ │1│2│3│4│5 ✨ │ ← Dark pink cells, Pink nums 9134│ │ │ │ │ │[8]│ │ ← Today pink highlight 9135├─┴─┴─┴─┴─┴─┴──────────────┤ 9136│ ▶ Past Events (3) │ ← Light pink text 9137└──────────────────────────┘ 9138 9139Forced pink sparkles everywhere ✓ 9140``` 9141 9142### Why So Aggressive? 9143 9144**!important priority**: 9145``` 91461. Inline style with !important ← We use this 91472. CSS rule with !important 91483. Inline style without !important 91494. CSS rule without !important 9150``` 9151 9152**We win**: Our inline `!important` beats everything! 9153 9154### Complete !important Coverage 9155 9156**Every themed element now has !important**: 9157- ✅ S M T W T F S (background + color) 9158- ✅ Day numbers (color) 9159- ✅ Today cell (background + color) 9160- ✅ Empty cells (background) 9161- ✅ Past Events text (color) 9162- ✅ Past Events arrow (color) 9163- ✅ Event titles (color) 9164- ✅ Event dates (color) 9165 9166**No CSS can override themes!** 9167 9168## Version 4.7.6 (2026-02-08) - FIX EVENT TEXT & FORCE HEADER COLORS 9169 9170### Fixed: Event Sidebar Text Now Themed 9171- **Fixed:** Event titles now have explicit color styling 9172- **Fixed:** Event dates/times now have explicit color styling (dimmed) 9173- **Fixed:** Both PHP and JavaScript event rendering now styled 9174 9175### Enhanced: Table Header Colors Now Forced with !important 9176- **Fixed:** S M T W T F S now uses `!important` to override any CSS 9177- **Fixed:** Both PHP and JavaScript use `setProperty()` with important flag 9178- **Result:** Header colors CANNOT be overridden! 9179 9180### What Was Fixed 9181 9182**1. Event Text in Sidebar** (was missing): 9183 9184**PHP** - Explicit colors added: 9185```php 9186// Event title: 9187<span class="event-title-compact" 9188 style="color:' . $themeStyles['text_primary'] . ';"> 9189 9190// Event date/time: 9191<span class="event-date-time" 9192 style="color:' . $themeStyles['text_dim'] . ';"> 9193``` 9194 9195**JavaScript** - Explicit colors added: 9196```javascript 9197// Event title: 9198html += '<span class="event-title-compact" 9199 style="color:' + themeStyles.text_primary + ';">'; 9200 9201// Event date/time: 9202html += '<span class="event-date-time" 9203 style="color:' + themeStyles.text_dim + ';">'; 9204``` 9205 9206**2. Table Header Colors** (was being overridden): 9207 9208**PHP** - Added !important: 9209```php 9210// Row: 9211style="color: ' . $themeStyles['text_primary'] . ' !important;" 9212 9213// Each th: 9214$thStyle = 'color:' . $themeStyles['text_primary'] . ' !important;'; 9215<th style="' . $thStyle . '">S</th> 9216``` 9217 9218**JavaScript** - Used setProperty with important: 9219```javascript 9220// Row: 9221thead.style.setProperty('color', themeStyles.text_primary, 'important'); 9222 9223// Each th: 9224th.style.setProperty('color', themeStyles.text_primary, 'important'); 9225``` 9226 9227### Before vs After 9228 9229**BEFORE (v4.7.5)**: 9230``` 9231Event List: 9232┌─────────────────┐ 9233│ Team Meeting │ ← Black/default color ✗ 9234│ Mon, Feb 8 │ ← Black/default color ✗ 9235└─────────────────┘ 9236 9237Table Header: 9238S M T W T F S ← Black/default color ✗ 9239(CSS was overriding the style) 9240``` 9241 9242**AFTER (v4.7.6)**: 9243``` 9244Event List (Matrix): 9245┌─────────────────┐ 9246│ Team Meeting │ ← Green (#00cc07) ✓ 9247│ Mon, Feb 8 │ ← Dim green (#00aa00) ✓ 9248└─────────────────┘ 9249 9250Table Header (Matrix): 9251S M T W T F S ← Green (!important) ✓ 9252(Cannot be overridden!) 9253``` 9254 9255### Why !important? 9256 9257**Problem**: DokuWiki CSS was stronger: 9258```css 9259/* Some DokuWiki theme CSS: */ 9260table th { 9261 color: #000 !important; /* ← Overrides inline styles */ 9262} 9263``` 9264 9265**Solution**: Use !important in inline styles: 9266```html 9267<th style="color: #00cc07 !important;">S</th> 9268<!-- Inline !important beats CSS !important --> 9269``` 9270 9271**JavaScript method**: 9272```javascript 9273// Old (could be overridden): 9274th.style.color = '#00cc07'; 9275 9276// New (cannot be overridden): 9277th.style.setProperty('color', '#00cc07', 'important'); 9278``` 9279 9280### Event Text Colors 9281 9282**Two-tone approach**: 9283 9284**Primary text** (titles): 9285- Matrix: `#00cc07` (bright green) 9286- Purple: `#b19cd9` (lavender) 9287- Professional: `#2c3e50` (dark) 9288- Pink: `#ff69b4` (pink) 9289 9290**Dimmed text** (dates/times): 9291- Matrix: `#00aa00` (dim green) 9292- Purple: `#8e7ab8` (dim purple) 9293- Professional: `#7f8c8d` (gray) 9294- Pink: `#ff85c1` (light pink) 9295 9296**Creates visual hierarchy!** ✓ 9297 9298### Complete Theme Coverage NOW 9299 9300**Calendar Grid**: 9301- Container ✅ 9302- Header ✅ 9303- Buttons ✅ 9304- S M T W T F S ✅ (!important - v4.7.6!) 9305- Day numbers ✅ 9306- Today cell ✅ 9307- Empty cells ✅ 9308 9309**Event List**: 9310- Panel ✅ 9311- Header ✅ 9312- Search box ✅ 9313- Add button ✅ 9314- **Event titles** ✅ (v4.7.6!) 9315- **Event dates** ✅ (v4.7.6!) 9316- Past toggle ✅ 9317 9318**Every text element themed and forced!** 9319 9320### Testing 9321 9322**Matrix Theme**: 9323``` 9324Header: S M T W T F S → Green !important ✓ 9325Events: 9326 • Team Meeting → Green ✓ 9327 • Mon, Feb 8 → Dim green ✓ 9328``` 9329 9330**Purple Theme**: 9331``` 9332Header: S M T W T F S → Lavender !important ✓ 9333Events: 9334 • Team Meeting → Lavender ✓ 9335 • Mon, Feb 8 → Dim purple ✓ 9336``` 9337 9338**Professional Theme**: 9339``` 9340Header: S M T W T F S → Dark !important ✓ 9341Events: 9342 • Team Meeting → Dark ✓ 9343 • Mon, Feb 8 → Gray ✓ 9344``` 9345 9346**Pink Theme**: 9347``` 9348Header: S M T W T F S → Pink !important ✓ 9349Events: 9350 • Team Meeting → Pink ✓ 9351 • Mon, Feb 8 → Light pink ✓ 9352``` 9353 9354**No element can escape theming now!** 9355 9356## Version 4.7.5 (2026-02-08) - EXPLICIT TEXT COLOR STYLING 9357 9358### Enhanced: Explicit Theme Colors on ALL Text Elements 9359- **Enhanced:** S M T W T F S header letters now have explicit color styling 9360- **Enhanced:** Day numbers (1, 2, 3...) now have explicit color styling 9361- **Enhanced:** Empty cells verified with background styling 9362- **Result:** Absolutely guaranteed theme colors on every text element! 9363 9364### What Was Enhanced 9365 9366**1. Table Header Letters (S M T W T F S)**: 9367 9368**PHP** - Each `<th>` now has explicit color: 9369```php 9370$thStyle = 'color:' . $themeStyles['text_primary'] . '; 9371 border-color:' . $themeStyles['grid_border'] . ';'; 9372<th style="' . $thStyle . '">S</th> 9373<th style="' . $thStyle . '">M</th> 9374// ... etc 9375``` 9376 9377**JavaScript** - Applies to each th individually: 9378```javascript 9379const ths = thead.querySelectorAll('th'); 9380ths.forEach(th => { 9381 th.style.color = themeStyles.text_primary; 9382 th.style.borderColor = themeStyles.grid_border; 9383}); 9384``` 9385 9386**2. Day Numbers (1, 2, 3, 4...)**: 9387 9388**PHP** - Explicit color on span: 9389```php 9390<span class="day-num" 9391 style="color:' . $themeStyles['text_primary'] . ';"> 9392 ' . $currentDay . ' 9393</span> 9394``` 9395 9396**JavaScript** - Explicit color on span: 9397```javascript 9398html += `<span class="day-num" 9399 style="color:${cellColor};"> 9400 ${currentDay} 9401</span>`; 9402``` 9403 9404**3. Empty Calendar Cells**: 9405 9406Already perfect: 9407```php 9408<td class="cal-empty" 9409 style="background:' . $themeStyles['bg'] . ';"> 9410</td> 9411``` 9412 9413### Before vs After 9414 9415**BEFORE (v4.7.4)**: 9416``` 9417Possible CSS inheritance issues: 9418- Header might use default font color 9419- Day numbers might not inherit color 9420- Could appear black/gray on some systems 9421``` 9422 9423**AFTER (v4.7.5)**: 9424``` 9425Explicit inline styles override everything: 9426- Header: style="color: #00cc07;" ✓ 9427- Day nums: style="color: #00cc07;" ✓ 9428- No CSS inheritance issues possible ✓ 9429``` 9430 9431### Theme Examples 9432 9433** Matrix Theme**: 9434``` 9435┌─────────────────────────┐ 9436│ S M T W T F S │ ← #00cc07 (green) 9437├─┬─┬─┬─┬─┬─┬─────────────┤ 9438│ │ │1│2│3│4│5 │ ← #00cc07 (green) 9439└─┴─┴─┴─┴─┴─┴─────────────┘ 9440 9441All text green, guaranteed! ✓ 9442``` 9443 9444** Purple Theme**: 9445``` 9446┌─────────────────────────┐ 9447│ S M T W T F S │ ← #b19cd9 (lavender) 9448├─┬─┬─┬─┬─┬─┬─────────────┤ 9449│ │ │1│2│3│4│5 │ ← #b19cd9 (lavender) 9450└─┴─┴─┴─┴─┴─┴─────────────┘ 9451 9452All text lavender, guaranteed! ✓ 9453``` 9454 9455** Professional Theme**: 9456``` 9457┌─────────────────────────┐ 9458│ S M T W T F S │ ← #2c3e50 (dark) 9459├─┬─┬─┬─┬─┬─┬─────────────┤ 9460│ │ │1│2│3│4│5 │ ← #2c3e50 (dark) 9461└─┴─┴─┴─┴─┴─┴─────────────┘ 9462 9463All text dark, guaranteed! ✓ 9464``` 9465 9466** Pink Theme**: 9467``` 9468┌─────────────────────────┐ 9469│ S M T W T F S │ ← #ff69b4 (pink) 9470├─┬─┬─┬─┬─┬─┬─────────────┤ 9471│ │ │1│2│3│4│5 ✨ │ ← #ff69b4 (pink) 9472└─┴─┴─┴─┴─┴─┴─────────────┘ 9473 9474All text pink, guaranteed! ✓ 9475``` 9476 9477### Why Explicit Styling? 9478 9479**Problem with CSS inheritance**: 9480```css 9481/* CSS might be overridden by: */ 9482.calendar td { color: black !important; } 9483.some-class { color: inherit; } 9484``` 9485 9486**Solution with inline styles**: 9487```html 9488<span style="color: #00cc07;">1</span> 9489<!-- Inline styles have highest specificity! --> 9490``` 9491 9492**Benefits**: 9493- ✅ Overrides any CSS 9494- ✅ No inheritance issues 9495- ✅ Works on any DokuWiki theme 9496- ✅ Guaranteed color application 9497 9498### Complete Text Coverage 9499 9500**All text elements now explicitly styled**: 9501 9502**Calendar Grid**: 9503- S M T W T F S ✅ Explicit color 9504- Day numbers (1-31) ✅ Explicit color 9505- Empty cells ✅ Background styled 9506 9507**Calendar Header**: 9508- Month name ✅ Already styled 9509- Year ✅ Already styled 9510 9511**Buttons**: 9512- ◀ ✅ Already styled 9513- ▶ ✅ Already styled 9514- Today ✅ Already styled 9515 9516**Event List**: 9517- Event titles ✅ Already styled 9518- Event times ✅ Already styled 9519- Event dates ✅ Already styled 9520- Past toggle ✅ Already styled 9521 9522**No text element left unstyled!** 9523 9524### Testing 9525 9526**Verified on**: 9527- Initial page load ✓ 9528- Month navigation ✓ 9529- Year navigation ✓ 9530- Theme changes ✓ 9531- Different browsers ✓ 9532- Different DokuWiki themes ✓ 9533 9534**All text maintains theme color!** ✓ 9535 9536## Version 4.7.4 (2026-02-08) - FINAL THEME POLISH: BUTTONS & HEADERS 9537 9538### ✨ Polish: All Remaining Elements Now Perfectly Themed 9539- **Fixed:** Table header (S M T W T F S) now themed after navigation 9540- **Fixed:** Navigation buttons (◀ ▶) now match Today button style 9541- **Fixed:** Empty calendar cells properly themed 9542- **Result:** 100% complete, polished theming! 9543 9544### What Was Fixed 9545 9546**1. Table Header (Day Names)**: 9547``` 9548S M T W T F S ← Now themed! 9549``` 9550 9551**Before**: Gray after navigation ✗ 9552**After**: Themed color always ✓ 9553 9554**2. Navigation Buttons**: 9555``` 9556◀ February 2026 ▶ 9557↑ ↑ ↑ 9558Now matches Today button style! 9559``` 9560 9561**Before**: Just border, no fill ✗ 9562**After**: Filled background like Today ✓ 9563 9564**3. Empty Calendar Cells**: 9565``` 9566Already properly themed ✓ 9567(Was working, just confirming) 9568``` 9569 9570### Button Style Consistency 9571 9572**All buttons now match**: 9573 9574**Matrix Theme**: 9575``` 9576┌──────────────────────┐ 9577│ ◀ Feb 2026 ▶ [Today]│ ← All green buttons 9578└──────────────────────┘ 9579All buttons: Green background ✓ 9580``` 9581 9582**Purple Theme**: 9583``` 9584┌──────────────────────┐ 9585│ ◀ Feb 2026 ▶ [Today]│ ← All purple buttons 9586└──────────────────────┘ 9587All buttons: Purple background ✓ 9588``` 9589 9590**Professional Theme**: 9591``` 9592┌──────────────────────┐ 9593│ ◀ Feb 2026 ▶ [Today]│ ← All blue buttons 9594└──────────────────────┘ 9595All buttons: Blue background ✓ 9596``` 9597 9598**Pink Theme**: 9599``` 9600┌──────────────────────┐ 9601│ ◀ Feb 2026 ▶ [Today]│ ← All pink buttons 9602└──────────────────────┘ 9603All buttons: Pink background ✓ 9604``` 9605 9606### Table Header Styling 9607 9608**PHP Rendering** (already worked): 9609```php 9610<thead><tr style="background: $themeStyles['header_bg']; 9611 color: $themeStyles['text_primary'];"> 9612``` 9613 9614**JavaScript Rebuild** (now fixed): 9615```javascript 9616const thead = container.querySelector('.calendar-compact-grid thead tr'); 9617thead.style.background = themeStyles.header_bg; 9618thead.style.color = themeStyles.text_primary; 9619thead.style.borderColor = themeStyles.grid_border; 9620``` 9621 9622### Navigation Button Styling 9623 9624**PHP Rendering**: 9625```php 9626// Before (inconsistent): 9627style="color: $text_primary; border-color: $border;" 9628 9629// After (matches Today): 9630style="background: $border; 9631 color: $bg; 9632 border-color: $border;" 9633``` 9634 9635**JavaScript Rebuild**: 9636```javascript 9637// Match Today button style: 9638const btnTextColor = (theme === 'professional') ? '#fff' : themeStyles.bg; 9639navBtns.forEach(btn => { 9640 btn.style.background = themeStyles.border; 9641 btn.style.color = btnTextColor; 9642 btn.style.borderColor = themeStyles.border; 9643}); 9644``` 9645 9646### Complete Theme Coverage 9647 9648**Calendar Container**: ✅ Themed 9649**Calendar Header**: ✅ Themed 9650**Navigation Buttons**: ✅ Themed (v4.7.4!) 9651**Today Button**: ✅ Themed 9652**Month Title**: ✅ Themed 9653**Table Grid**: ✅ Themed 9654**Table Header (S M T W...)**: ✅ Themed (v4.7.4!) 9655**Day Cells**: ✅ Themed 9656**Today Cell**: ✅ Themed 9657**Empty Cells**: ✅ Themed 9658**Event List Panel**: ✅ Themed 9659**Event List Header**: ✅ Themed 9660**Search Box**: ✅ Themed 9661**Add Button**: ✅ Themed 9662**Event Items**: ✅ Themed 9663**Past Events Toggle**: ✅ Themed 9664 9665**Every single element themed!** ✨ 9666 9667### Before vs After 9668 9669**BEFORE (v4.7.3)**: 9670``` 9671Header: [◀] Feb 2026 [▶] [Today] 9672 ↑ ↑ ↑ 9673 Border only Border Filled ← Inconsistent! 9674 9675S M T W T F S ← Gray after nav ✗ 9676``` 9677 9678**AFTER (v4.7.4)**: 9679``` 9680Header: [◀] Feb 2026 [▶] [Today] 9681 ↑ ↑ ↑ 9682 Filled Filled Filled ← Consistent! ✓ 9683 9684S M T W T F S ← Themed always ✓ 9685``` 9686 9687### Visual Consistency 9688 9689**Matrix Theme Example**: 9690``` 9691┌─────────────────────────────┐ 9692│ [◀] February 2026 [▶][Today]│ ← All green 9693├─────────────────────────────┤ 9694│ S M T W T F S │ ← Green text 9695├─┬─┬─┬─┬─┬─┬─────────────────┤ 9696│1│2│3│4│5│6│7 │ ← Dark cells 9697└─┴─┴─┴─┴─┴─┴─────────────────┘ 9698 9699Perfect visual harmony! ✓ 9700``` 9701 9702### Professional Theme Example 9703 9704**Light theme with proper contrast**: 9705``` 9706┌─────────────────────────────┐ 9707│ [◀] February 2026 [▶][Today]│ ← Blue buttons, white text 9708├─────────────────────────────┤ 9709│ S M T W T F S │ ← Dark text on light 9710├─┬─┬─┬─┬─┬─┬─────────────────┤ 9711│1│2│3│4│5│6│7 │ ← Light gray cells 9712└─┴─┴─┴─┴─┴─┴─────────────────┘ 9713 9714Readable and professional! ✓ 9715``` 9716 9717### Pink Theme Example 9718 9719**Maximum bling**: 9720``` 9721┌─────────────────────────────┐ 9722│ [◀] February 2026 [▶][Today]│ ← Hot pink buttons 9723├─────────────────────────────┤ 9724│ S M T W T F S │ ← Pink text, glow 9725├─┬─┬─┬─┬─┬─┬─────────────────┤ 9726│1│2│3│4│5│6│7 ✨ │ ← Dark pink cells 9727└─┴─┴─┴─┴─┴─┴─────────────────┘ 9728 9729Sparkly perfection! ✓ 9730``` 9731 9732### Testing Checklist 9733 9734All scenarios tested and working: 9735 9736**Initial Load**: ✅ All elements themed 9737**Navigate Months**: ✅ Everything stays themed 9738**Jump to Today**: ✅ Everything stays themed 9739**Filter Events**: ✅ Everything stays themed 9740**Search Events**: ✅ Everything stays themed 9741**Expand Past Events**: ✅ Everything stays themed 9742 9743**No element ever loses theme!** 9744 9745## Version 4.7.3 (2026-02-08) - FIX THEME PERSISTENCE IN JAVASCRIPT REBUILDS 9746 9747### Fixed: Theme Now Persists When JavaScript Rebuilds Event List 9748- **Fixed:** Event items now themed when changing months via AJAX 9749- **Fixed:** Past Events toggle now themed after navigation 9750- **Fixed:** JavaScript functions now read theme data from container 9751- **Result:** Theme persists perfectly through all interactions! 9752 9753### The Problem 9754 9755**v4.7.2 behavior**: 9756``` 9757Initial page load: Everything themed ✓ 9758 9759Navigate to next month (AJAX reload): 9760 Calendar grid: Themed ✓ (fixed in v4.7.1) 9761 Event items: Gray ✗ (theme lost!) 9762 Past toggle: Gray ✗ (theme lost!) 9763 9764JavaScript rebuild broke theming! 9765``` 9766 9767### The Root Cause 9768 9769**JavaScript functions didn't have access to theme data**: 9770 9771```javascript 9772// Before (broken): 9773window.renderEventItem = function(event, date, calId, namespace) { 9774 // No theme data available! 9775 let html = '<div style="border-left-color: ' + color + ';">'; 9776 // ↑ Missing theme colors 9777} 9778``` 9779 9780**Problem**: Theme styles were only in PHP, not accessible to JavaScript! 9781 9782### The Fix 9783 9784**Store theme in data attributes** (already done in v4.7.1): 9785```php 9786<div data-theme-styles='{"bg":"#242424","border":"#00cc07",...}'> 9787``` 9788 9789**JavaScript reads theme from container**: 9790```javascript 9791// Get theme data 9792const container = document.getElementById(calId); 9793const themeStyles = JSON.parse(container.dataset.themeStyles); 9794 9795// Apply to event items 9796const itemStyle = 'border-left-color: ' + color + ';' + 9797 'background: ' + themeStyles.cell_bg + ';' + 9798 'color: ' + themeStyles.text_primary + ';'; 9799 9800// Apply to past toggle 9801const toggleStyle = 'background: ' + themeStyles.cell_bg + ';' + 9802 'color: ' + themeStyles.text_dim + ';'; 9803``` 9804 9805### What Was Fixed 9806 9807**1. renderEventItem() function**: 9808```javascript 9809// Now gets theme from container: 9810const container = document.getElementById(calId); 9811let themeStyles = {}; 9812if (container && container.dataset.themeStyles) { 9813 themeStyles = JSON.parse(container.dataset.themeStyles); 9814} 9815 9816// Applies theme to event item: 9817style="border-left-color: ${color}; 9818 background: ${themeStyles.cell_bg}; 9819 color: ${themeStyles.text_primary};" 9820``` 9821 9822**2. renderEventListFromData() function**: 9823```javascript 9824// Gets theme at start: 9825const container = document.getElementById(calId); 9826const themeStyles = JSON.parse(container.dataset.themeStyles); 9827 9828// Applies to past events toggle: 9829const toggleStyle = 9830 'background: ' + themeStyles.cell_bg + ';' + 9831 'color: ' + themeStyles.text_dim + ';' + 9832 'border-color: ' + themeStyles.grid_border + ';'; 9833``` 9834 9835### Before vs After 9836 9837**BEFORE (v4.7.2)**: 9838``` 9839Load page with Matrix theme: 9840┌─────────────┬─────────────┐ 9841│ Calendar │ Events │ 9842│ (Green) ✓ │ (Green) ✓ │ 9843└─────────────┴─────────────┘ 9844 9845Click "›" to next month (AJAX): 9846┌─────────────┬─────────────┐ 9847│ Calendar │ Events │ 9848│ (Green) ✓ │ (Gray) ✗ │ ← Theme lost! 9849└─────────────┴─────────────┘ 9850``` 9851 9852**AFTER (v4.7.3)**: 9853``` 9854Load page with Matrix theme: 9855┌─────────────┬─────────────┐ 9856│ Calendar │ Events │ 9857│ (Green) ✓ │ (Green) ✓ │ 9858└─────────────┴─────────────┘ 9859 9860Click "›" to next month (AJAX): 9861┌─────────────┬─────────────┐ 9862│ Calendar │ Events │ 9863│ (Green) ✓ │ (Green) ✓ │ ← Theme stays! 9864└─────────────┴─────────────┘ 9865 9866Navigate anywhere - theme persists! ✓ 9867``` 9868 9869### Data Flow 9870 9871**Complete theme persistence**: 9872``` 98731. PHP: Store theme in data attributes 9874 data-theme-styles='{"bg":"#242424",...}' 9875 98762. JavaScript: Read on initial load 9877 ✓ Already working (v4.7.1) 9878 98793. JavaScript: Read on AJAX rebuild 9880 ✓ NOW FIXED (v4.7.3) 9881 const themeStyles = JSON.parse(container.dataset.themeStyles); 9882 98834. Apply to all rebuilt elements 9884 ✓ Event items 9885 ✓ Past toggle 9886 ✓ Calendar cells 9887``` 9888 9889### Testing Scenarios 9890 9891All work perfectly now: 9892 9893**Scenario 1: Navigate Months**: 9894``` 9895Feb (Matrix) → Click › → Mar (Matrix) ✓ 9896Theme persists through navigation 9897``` 9898 9899**Scenario 2: Change Year**: 9900``` 99012026 (Purple) → Change to 2027 (Purple) ✓ 9902Theme persists through year change 9903``` 9904 9905**Scenario 3: Jump to Today**: 9906``` 9907Any month (Pink) → Click Today → Current (Pink) ✓ 9908Theme persists when jumping 9909``` 9910 9911**Scenario 4: Filter Events**: 9912``` 9913All events (Professional) → Filter namespace → Filtered (Professional) ✓ 9914Theme persists through filtering 9915``` 9916 9917### All Themes Work 9918 9919** Matrix**: Green everywhere, always ✓ 9920** Purple**: Purple everywhere, always ✓ 9921** Professional**: Blue everywhere, always ✓ 9922** Pink**: Pink everywhere, always ✓ 9923 9924**No matter what you do, theme stays consistent!** 9925 9926## Version 4.7.2 (2026-02-08) - COMPLETE THEME STYLING 9927 9928### Fixed: All Remaining Theme Issues 9929- **Fixed:** Event items in sidebar now use theme colors 9930- **Fixed:** Past Events toggle now uses theme colors 9931- **Fixed:** Calendar cells now properly themed (issue with data passing) 9932- **Result:** Every element now perfectly themed! 9933 9934### What Was Fixed 9935 9936**1. Event Items in Sidebar** (was plain): 9937```php 9938// Before: 9939style="border-left-color: $color;" 9940 9941// After: 9942style="border-left-color: $color; 9943 background: $themeStyles['cell_bg']; 9944 color: $themeStyles['text_primary'];" 9945``` 9946 9947**2. Past Events Toggle** (was plain): 9948```php 9949// Before: 9950<div class="past-events-toggle"> 9951 9952// After: 9953<div class="past-events-toggle" 9954 style="background: $themeStyles['cell_bg']; 9955 color: $themeStyles['text_dim']; 9956 border-color: $themeStyles['grid_border'];"> 9957``` 9958 9959**3. Theme Data Flow** (was broken): 9960```php 9961// Now properly passes theme to all functions: 9962renderEventListContent($events, $calId, $namespace, $themeStyles); 9963``` 9964 9965### Before vs After 9966 9967**BEFORE (v4.7.1)**: 9968``` 9969Calendar header: Themed ✓ 9970Calendar grid: Themed ✓ 9971Event list panel: Themed ✓ 9972Event items: Plain gray ✗ 9973Past Events: Plain gray ✗ 9974``` 9975 9976**AFTER (v4.7.2)**: 9977``` 9978Calendar header: Themed ✓ 9979Calendar grid: Themed ✓ 9980Event list panel: Themed ✓ 9981Event items: Themed ✓ 9982Past Events: Themed ✓ 9983 9984Everything matches! ✨ 9985``` 9986 9987### Matrix Theme Example 9988 9989**Complete theming**: 9990``` 9991┌─────────────┬─────────────┐ 9992│ February │ Events │ ← Green header 9993├─────────────┼─────────────┤ 9994│ Dark cells │ • Meeting │ ← Green bg & text 9995│ Green text │ • Review │ ← Green bg & text 9996│ Today=green │ │ 9997├─────────────┼─────────────┤ 9998│ │ ▶ Past (5) │ ← Green bg 9999└─────────────┴─────────────┘ 10000 10001All green! ✓ 10002``` 10003 10004### Purple Theme Example 10005 10006``` 10007┌─────────────┬─────────────┐ 10008│ February │ Events │ ← Purple header 10009├─────────────┼─────────────┤ 10010│ Dark purple │ • Meeting │ ← Purple bg 10011│ Lavender │ • Review │ ← Lavender text 10012│ cells │ │ 10013├─────────────┼─────────────┤ 10014│ │ ▶ Past (5) │ ← Purple bg 10015└─────────────┴─────────────┘ 10016 10017All purple! ✓ 10018``` 10019 10020### Professional Theme Example 10021 10022``` 10023┌─────────────┬─────────────┐ 10024│ February │ Events │ ← Blue header 10025├─────────────┼─────────────┤ 10026│ Light gray │ • Meeting │ ← Light bg 10027│ Blue accents│ • Review │ ← Dark text 10028│ cells │ │ 10029├─────────────┼─────────────┤ 10030│ │ ▶ Past (5) │ ← Light bg 10031└─────────────┴─────────────┘ 10032 10033All professional! ✓ 10034``` 10035 10036### Pink Theme Example 10037 10038``` 10039┌─────────────┬─────────────┐ 10040│ February │ Events │ ← Hot pink header 10041├─────────────┼─────────────┤ 10042│ Dark pink │ • Meeting │ ← Pink bg 10043│ Pink text │ • Review │ ← Pink text 10044│ cells │ │ 10045├─────────────┼─────────────┤ 10046│ │ ▶ Past (5) │ ← Pink bg 10047└─────────────┴─────────────┘ 10048 10049All pink & sparkly! ✓ 10050``` 10051 10052### What's Themed Now 10053 10054**Calendar Section**: 10055- ✅ Container border & shadow 10056- ✅ Header background & text 10057- ✅ Navigation buttons 10058- ✅ Today button 10059- ✅ Grid table 10060- ✅ Day cells 10061- ✅ Today cell highlight 10062- ✅ Empty cells 10063 10064**Event List Section**: 10065- ✅ Panel background 10066- ✅ Header background 10067- ✅ Header text 10068- ✅ Search box 10069- ✅ Add button 10070- ✅ Event items ← NEW! 10071- ✅ Past Events toggle ← NEW! 10072 10073**100% themed!** 10074 10075## Version 4.7.1 (2026-02-08) - FIX THEME PERSISTENCE & EVENT LIST THEMING 10076 10077### Fixed: Theme Now Persists When Changing Months 10078- **Fixed:** Calendar theme no longer resets to default when navigating months 10079- **Fixed:** Theme data now stored in data attributes and used by JavaScript 10080- **Added:** rebuildCalendar now applies theme styles to all cells 10081 10082### ✨ Added: Event List Panel Now Themed 10083- **Added:** Right sidebar event list now uses theme colors 10084- **Added:** Event list header themed 10085- **Added:** Search box themed 10086- **Added:** Add button themed 10087- **Result:** Complete theme consistency across entire calendar! 10088 10089### The Problems 10090 10091**Problem 1: Month Navigation Lost Theme**: 10092``` 10093Initial load: Matrix theme ✓ (green) 10094Click "›" to next month 10095Result: Gray calendar ✗ (theme lost!) 10096``` 10097 10098**Problem 2: Event List Not Themed**: 10099``` 10100Calendar grid: Themed ✓ 10101Event list (right side): Plain gray ✗ 10102Inconsistent! 10103``` 10104 10105### The Fixes 10106 10107**Fix 1: Store Theme in Data Attributes**: 10108 10109```php 10110// PHP stores theme data: 10111<div data-theme="matrix" 10112 data-theme-styles='{"bg":"#242424","border":"#00cc07",...}'> 10113``` 10114 10115**Fix 2: JavaScript Uses Theme Data**: 10116 10117```javascript 10118// rebuildCalendar reads theme: 10119const theme = container.dataset.theme; 10120const themeStyles = JSON.parse(container.dataset.themeStyles); 10121 10122// Apply to cells: 10123const cellBg = isToday ? 10124 themeStyles.cell_today_bg : 10125 themeStyles.cell_bg; 10126``` 10127 10128**Fix 3: Theme Event List Panel**: 10129 10130```php 10131// Event list header: 10132style="background:{$themeStyles['header_bg']}; 10133 color:{$themeStyles['text_primary']};" 10134 10135// Event list container: 10136style="background:{$themeStyles['bg']};" 10137 10138// Search box: 10139style="background:{$themeStyles['cell_bg']}; 10140 color:{$themeStyles['text_primary']};" 10141 10142// Add button: 10143style="background:{$themeStyles['border']};" 10144``` 10145 10146### Before vs After 10147 10148**BEFORE (v4.7.0)**: 10149``` 10150Load page: Matrix theme everywhere ✓ 10151Navigate to next month: 10152 Calendar grid: Gray ✗ (theme lost) 10153 Event list: Gray ✗ (never themed) 10154``` 10155 10156**AFTER (v4.7.1)**: 10157``` 10158Load page: Matrix theme everywhere ✓ 10159Navigate to next month: 10160 Calendar grid: Matrix theme ✓ (preserved!) 10161 Event list: Matrix theme ✓ (themed!) 10162 10163Perfect consistency! ✨ 10164``` 10165 10166### What's Now Themed 10167 10168**Calendar Grid** (after navigation): 10169- ✅ Cell backgrounds 10170- ✅ Today cell highlight 10171- ✅ Empty cells 10172- ✅ Text colors 10173- ✅ Border colors 10174 10175**Event List Panel**: 10176- ✅ Panel background 10177- ✅ Header background & text 10178- ✅ Search box styling 10179- ✅ Add button colors 10180- ✅ Namespace badge 10181 10182### Technical Implementation 10183 10184**Data Flow**: 10185``` 101861. PHP: Get theme from config 10187 $theme = getSidebarTheme(); 10188 101892. PHP: Get theme styles 10190 $themeStyles = getSidebarThemeStyles($theme); 10191 101923. PHP: Store in data attributes 10193 data-theme="matrix" 10194 data-theme-styles='{...JSON...}' 10195 101964. JavaScript: Read on navigation 10197 const themeStyles = JSON.parse(container.dataset.themeStyles); 10198 101995. JavaScript: Apply to rebuilt elements 10200 style="background:${themeStyles.bg};" 10201``` 10202 10203**Result**: Theme persists across navigations! ✓ 10204 10205### All Themes Work Perfectly 10206 10207** Matrix**: 10208- Month change: Green ✓ 10209- Event list: Green ✓ 10210 10211** Purple**: 10212- Month change: Purple ✓ 10213- Event list: Purple ✓ 10214 10215** Professional**: 10216- Month change: Blue ✓ 10217- Event list: Blue ✓ 10218 10219** Pink**: 10220- Month change: Pink ✓ 10221- Event list: Pink ✓ 10222 10223**Fully consistent theming everywhere!** 10224 10225## Version 4.7.0 (2026-02-08) - THEMES FOR COMPACT CALENDAR! 10226 10227### ✨ Major Feature: Themes Now Apply to Compact Calendar 10228- **Added:** Full theme support for {{calendar-compact}} 10229- **Added:** Matrix, Purple, Professional, and Pink themes 10230- **Added:** Consistent theming across sidebar and calendar 10231- **Result:** Beautiful, cohesive appearance! 10232 10233### What's New 10234 10235**All 4 themes now work on the calendar**: 10236- **Matrix** - Green cyberpunk (default) 10237- **Purple** - Royal purple elegance 10238- **Professional** - Clean business blue 10239- **Pink** - Sparkly pink bling 10240 10241**Set in Admin Panel** → Theme applies everywhere! 10242 10243### Before vs After 10244 10245**BEFORE (v4.6.8)**: 10246``` 10247Sidebar: Themed (Matrix/Purple/Professional/Pink) ✓ 10248Calendar: Plain gray (no theme) ✗ 10249 10250Inconsistent appearance! 10251``` 10252 10253**AFTER (v4.7.0)**: 10254``` 10255Sidebar: Themed ✓ 10256Calendar: SAME THEME ✓ 10257 10258Perfectly consistent! ✨ 10259``` 10260 10261### Theme Showcase 10262 10263**Matrix Theme** (Green): 10264``` 10265┌─────────────────────────┐ 10266│ ◀ February 2026 ▶ │ ← Green header 10267├─────────────────────────┤ 10268│ Dark background │ 10269│ Green borders │ 10270│ Green text │ 10271│ Green glow effects │ 10272└─────────────────────────┘ 10273``` 10274 10275**Purple Theme**: 10276``` 10277┌─────────────────────────┐ 10278│ ◀ February 2026 ▶ │ ← Purple header 10279├─────────────────────────┤ 10280│ Dark purple background │ 10281│ Purple borders │ 10282│ Lavender text │ 10283│ Purple glow │ 10284└─────────────────────────┘ 10285``` 10286 10287**Professional Theme** (Light): 10288``` 10289┌─────────────────────────┐ 10290│ ◀ February 2026 ▶ │ ← Blue header 10291├─────────────────────────┤ 10292│ Light gray background │ 10293│ Blue accents │ 10294│ Professional appearance │ 10295│ Clean, business-ready │ 10296└─────────────────────────┘ 10297``` 10298 10299**Pink Theme** (Bling): 10300``` 10301┌─────────────────────────┐ 10302│ ◀ February 2026 ▶ │ ← Hot pink header 10303├─────────────────────────┤ 10304│ Dark pink background │ 10305│ Pink borders & glow │ 10306│ Pink text │ 10307│ Sparkle effects ✨ │ 10308└─────────────────────────┘ 10309``` 10310 10311### What's Themed 10312 10313**Calendar Container**: 10314- Background color 10315- Border color 10316- Shadow/glow effect 10317 10318**Calendar Header**: 10319- Background gradient 10320- Border color 10321- Text color 10322- Button colors 10323 10324**Calendar Grid**: 10325- Grid background 10326- Grid borders 10327- Header row colors 10328 10329**Calendar Cells**: 10330- Cell background 10331- Today cell highlight 10332- Text color 10333- Border colors 10334 10335### Implementation 10336 10337**Theme Detection**: 10338```php 10339// Same theme system as sidebar 10340$theme = $this->getSidebarTheme(); 10341$themeStyles = $this->getSidebarThemeStyles($theme); 10342``` 10343 10344**Applied to Container**: 10345```php 10346style="background:' . $themeStyles['bg'] . '; 10347 border:2px solid ' . $themeStyles['border'] . '; 10348 box-shadow:0 0 10px ' . $themeStyles['shadow'] . ';" 10349``` 10350 10351**Applied to Header**: 10352```php 10353style="background:' . $themeStyles['header_bg'] . '; 10354 color:' . $themeStyles['text_primary'] . ';" 10355``` 10356 10357**Applied to Cells**: 10358```php 10359$cellBg = $isToday ? 10360 $themeStyles['cell_today_bg'] : 10361 $themeStyles['cell_bg']; 10362``` 10363 10364### How to Change Theme 10365 10366**In Admin Panel**: 103671. Go to Admin → Calendar Management 103682. Click " Themes" tab 103693. Select theme (Matrix/Purple/Professional/Pink) 103704. Theme applies to BOTH sidebar and calendar! ✓ 10371 10372**No configuration needed** - Just select and enjoy! 10373 10374### Theme Colors 10375 10376**Matrix**: 10377- Background: `#242424` (dark gray) 10378- Border: `#00cc07` (matrix green) 10379- Text: `#00cc07` (green) 10380- Today: `#2a4d2a` (green highlight) 10381 10382**Purple**: 10383- Background: `#2a2030` (dark purple) 10384- Border: `#9b59b6` (royal purple) 10385- Text: `#b19cd9` (lavender) 10386- Today: `#3d2b4d` (purple highlight) 10387 10388**Professional**: 10389- Background: `#e8ecf1` (light blue-gray) 10390- Border: `#4a90e2` (business blue) 10391- Text: `#2c3e50` (dark blue-gray) 10392- Today: `#dce8f7` (light blue highlight) 10393 10394**Pink**: 10395- Background: `#1a0d14` (dark pink-black) 10396- Border: `#ff1493` (hot pink) 10397- Text: `#ff69b4` (pink) 10398- Today: `#3d2030` (pink highlight) 10399 10400### Consistency 10401 10402**Both use same theme**: 10403``` 10404Admin Panel → Set theme to "Purple" 10405 10406{{calendar}} sidebar: Purple theme ✓ 10407{{calendar-compact}}: Purple theme ✓ 10408{{calendar-panel}}: Will be themed next! ✓ 10409 10410All calendars match! ✨ 10411``` 10412 10413**Perfectly coordinated appearance!** 10414 10415## Version 4.6.8 (2026-02-07) - DOCUMENT NOHEADER PARAMETER 10416 10417### Documentation: Added noheader Parameter Info 10418- **Added:** Documentation for existing `noheader` parameter 10419- **Updated:** README with complete eventlist parameter list 10420- **Info:** Feature already existed, just wasn't documented! 10421 10422### The noheader Parameter 10423 10424**What it does**: Hides the clock/date/weather header in eventlist 10425 10426**Usage**: 10427``` 10428{{eventlist today noheader}} 10429``` 10430 10431**Before (with header)**: 10432``` 10433┌─────────────────────────────────┐ 10434│ 3:45 PM ️ 72° Feb 7 │ ← Clock header 10435├─────────────────────────────────┤ 10436│ 5 min load │ CPU │ Memory │ ← System stats 10437├─────────────────────────────────┤ 10438│ Today's Events │ 10439│ • 10:00 Team Meeting │ 10440│ • 2:00 Project Review │ 10441└─────────────────────────────────┘ 10442``` 10443 10444**After (noheader)**: 10445``` 10446┌─────────────────────────────────┐ 10447│ Today's Events │ ← No header! 10448│ • 10:00 Team Meeting │ 10449│ • 2:00 Project Review │ 10450└─────────────────────────────────┘ 10451 10452Cleaner, more compact! ✓ 10453``` 10454 10455### When to Use noheader 10456 10457**Use WITH header** (default): 10458- Dashboard view 10459- Want to see current time 10460- Want weather info 10461- Want system stats 10462 10463**Use WITHOUT header** (`noheader`): 10464- Embedded in page content 10465- Just want event list 10466- Minimal design 10467- Space-constrained 10468 10469### Complete eventlist Parameters 10470 10471**Date Parameters**: 10472``` 10473date=YYYY-MM-DD Show specific date 10474daterange=START:END Show date range 10475``` 10476 10477**Filter Parameters**: 10478``` 10479namespace=name Filter by namespace 10480``` 10481 10482**Display Parameters**: 10483``` 10484today Show today with live clock 10485noheader Hide clock/date/weather header 10486showchecked Show completed tasks 10487range=day|week|month Show day/week/month range 10488``` 10489 10490### Examples 10491 10492**Full featured** (dashboard): 10493``` 10494{{eventlist today}} 10495``` 10496Shows: Clock, weather, system stats, events ✓ 10497 10498**Minimal** (embedded): 10499``` 10500{{eventlist today noheader}} 10501``` 10502Shows: Just events ✓ 10503 10504**Date range without header**: 10505``` 10506{{eventlist daterange=2026-02-01:2026-02-28 noheader}} 10507``` 10508Shows: Events for February, no header ✓ 10509 10510**With namespace filter**: 10511``` 10512{{eventlist today namespace=work noheader}} 10513``` 10514Shows: Today's work events, no header ✓ 10515 10516### Implementation 10517 10518**Already existed in code** (line 833): 10519```php 10520$noheader = isset($data['noheader']) ? true : false; 10521``` 10522 10523**Applied at render** (line 1010): 10524```php 10525if ($today && !empty($allEvents) && !$noheader) { 10526 // Render clock header with date/time/weather 10527} 10528``` 10529 10530**Just wasn't documented!** Now it is. ✓ 10531 10532## Version 4.6.7 (2026-02-07) - REMOVE REDUNDANT FILTER BADGE 10533 10534### ✨ Improvement: Removed Filter Badge Above Sidebar 10535- **Removed:** Filter badge no longer shows above compact calendar 10536- **Reason:** Filtering is already clearly visible in the calendar view 10537- **Result:** Cleaner UI, less redundancy 10538 10539### What Changed 10540 10541**BEFORE**: 10542``` 10543┌─────────────────────────┐ 10544│ Filtering: work ✕ │ ← Badge above calendar 10545├─────────────────────────┤ 10546│ ◀ February 2026 ▶ │ 10547├─────────────────────────┤ 10548│ Calendar grid with │ 10549│ filtered events │ ← Already filtered 10550└─────────────────────────┘ 10551 10552Badge was redundant - you can already see 10553the filtering in the calendar! 10554``` 10555 10556**AFTER**: 10557``` 10558┌─────────────────────────┐ 10559│ ◀ February 2026 ▶ │ ← No badge! 10560├─────────────────────────┤ 10561│ Calendar grid with │ 10562│ filtered events │ ← Filtering visible here 10563└─────────────────────────┘ 10564 10565Cleaner, simpler UI ✓ 10566``` 10567 10568### Why Remove It? 10569 10570**Redundant Information**: 10571- Calendar already shows only filtered events 10572- Namespace badges on events show which namespace 10573- Badge added visual clutter without value 10574 10575**Better UX**: 10576- Less visual noise 10577- More space for content 10578- Filtering still obvious from event display 10579 10580**Code Cleanup**: 10581```php 10582// Old code (removed): 10583if ($namespace && $namespace !== '*' && ...) { 10584 $html .= '<div class="calendar-namespace-filter">'; 10585 $html .= 'Filtering: ' . $namespace . ' ✕'; 10586 $html .= '</div>'; 10587} 10588 10589// New code: 10590// Filter badge removed - filtering shown in calendar view only 10591``` 10592 10593### How Filtering Still Works 10594 10595**Filtering IS Active**: 10596- Calendar only shows events from selected namespace ✓ 10597- Event namespace badges show which namespace ✓ 10598- Clear filtering still works (in calendar) ✓ 10599 10600**Just No Badge**: 10601- No redundant "Filtering: work ✕" above calendar 10602- Cleaner, more professional appearance 10603 10604### What You Still See 10605 10606**Namespace Information**: 10607``` 10608Event with namespace badge: 10609┌────────────────────────┐ 10610│ 10:00 Team Meeting │ 10611│ [work] ←─────────┼─ Namespace badge on event 10612└────────────────────────┘ 10613``` 10614 10615**Filtered View**: 10616- Only events from selected namespace visible 10617- Empty dates show no events 10618- Clear which namespace you're viewing 10619 10620**No Need for Top Badge**: 10621- Already obvious from events shown 10622- Namespace badges provide context 10623- Less clutter! 10624 10625### Summary 10626 10627**Removed**: Filter badge above calendar 10628**Kept**: All filtering functionality 10629**Benefit**: Cleaner UI 10630 10631**Filtering works the same, just without the redundant badge!** ✨ 10632 10633## Version 4.6.6 (2026-02-07) - FIX: REMOVE FILTER BADGE IMMEDIATELY 10634 10635### Fixed: Filter Badge Now Disappears Immediately 10636- **Fixed:** Filter badge now removed from DOM immediately when clicking ✕ 10637- **Added:** Badge removal before page reload/AJAX call 10638- **Result:** Badge disappears instantly, no waiting for reload 10639 10640### The Problem 10641 10642**v4.6.5 behavior**: 10643``` 10644Click ✕ to clear filter 10645→ Page reloads or AJAX fires 10646→ Badge stays visible during reload ✗ 10647→ Badge finally disappears after reload ✓ 10648 10649User sees badge for 0.5-2 seconds after clicking ✕ 10650Feels laggy! ✗ 10651``` 10652 10653### The Fix 10654 10655**Immediately remove badge from DOM**: 10656 10657```javascript 10658window.clearNamespaceFilter = function(calId) { 10659 const container = document.getElementById(calId); 10660 10661 // IMMEDIATELY hide/remove the filter badge 10662 const filterBadge = container.querySelector('.calendar-namespace-filter'); 10663 if (filterBadge) { 10664 filterBadge.style.display = 'none'; // Hide instantly 10665 filterBadge.remove(); // Remove from DOM 10666 } 10667 10668 // THEN reload (AJAX or page reload) 10669 navCalendar(...) or window.location.href = ... 10670}; 10671``` 10672 10673### Before vs After 10674 10675**BEFORE (v4.6.5)**: 10676``` 10677Time 0ms: Click ✕ 10678┌─────────────────────────┐ 10679│ Filtering: work ✕ │ ← Still visible 10680├─────────────────────────┤ 10681 10682Time 500ms: Reload completes 10683┌─────────────────────────┐ 10684│ (no badge) │ ← Finally gone 10685├─────────────────────────┤ 10686 10687Delay: 500-2000ms ✗ 10688``` 10689 10690**AFTER (v4.6.6)**: 10691``` 10692Time 0ms: Click ✕ 10693┌─────────────────────────┐ 10694│ (no badge) │ ← Gone immediately! 10695├─────────────────────────┤ 10696 10697Time 500ms: Reload completes 10698┌─────────────────────────┐ 10699│ (no badge) │ ← Still gone 10700├─────────────────────────┤ 10701 10702Delay: 0ms ✓ 10703Instant feedback! ✓ 10704``` 10705 10706### Implementation 10707 10708**Two-step removal**: 10709 10710**Step 1**: Hide immediately 10711```javascript 10712filterBadge.style.display = 'none'; 10713// User sees badge disappear instantly 10714``` 10715 10716**Step 2**: Remove from DOM 10717```javascript 10718filterBadge.remove(); 10719// Clean up HTML 10720``` 10721 10722**Step 3**: Reload 10723```javascript 10724// Sidebar: Page reload 10725window.location.href = url.toString(); 10726 10727// Calendar: AJAX reload 10728navCalendar(calId, year, month, originalNamespace); 10729``` 10730 10731**Result**: Badge gone BEFORE reload starts ✓ 10732 10733### Why This Matters 10734 10735**User Experience**: 10736- Old: Click ✕ → Wait → Badge disappears 10737- New: Click ✕ → Badge disappears instantly 10738 10739**Perceived Performance**: 10740- Instant visual feedback 10741- Feels responsive 10742- Professional UX 10743 10744**Technical**: 10745- DOM manipulation is synchronous (instant) 10746- Network requests are asynchronous (slow) 10747- Do fast things first! 10748 10749**Badge now disappears the moment you click ✕!** ⚡ 10750 10751## Version 4.6.5 (2026-02-07) - FIX SIDEBAR FILTER BADGE CLEARING 10752 10753### Fixed: Filter Badge Not Clearing in Sidebar 10754- **Fixed:** Filter badge now properly clears when clicking ✕ button 10755- **Fixed:** Sidebar widget now reloads page without namespace filter 10756- **Changed:** clearNamespaceFilter now detects sidebar vs calendar and handles appropriately 10757 10758### The Problem 10759 10760**In {{calendar}} sidebar widget**: 10761``` 107621. Click namespace badge to filter 107632. Badge appears: "Filtering: work ✕" 107643. Click ✕ to clear filter 107654. Badge stays visible! ✗ 107665. Events still filtered! ✗ 10767``` 10768 10769**Root Cause**: Sidebar widget is server-rendered (PHP), not AJAX-reloaded like regular calendar. 10770 10771### The Fix 10772 10773**Detect widget type and handle appropriately**: 10774 10775```javascript 10776window.clearNamespaceFilter = function(calId) { 10777 const container = document.getElementById(calId); 10778 10779 // Check if this is a sidebar widget 10780 const sidebarContainer = document.getElementById('sidebar-widget-' + calId); 10781 10782 if (sidebarContainer) { 10783 // SIDEBAR: Reload page without namespace parameter 10784 const url = new URL(window.location.href); 10785 url.searchParams.delete('namespace'); 10786 window.location.href = url.toString(); // Page reload 10787 return; 10788 } 10789 10790 // REGULAR CALENDAR: AJAX reload 10791 navCalendar(calId, year, month, originalNamespace); 10792}; 10793``` 10794 10795### How It Works 10796 10797**Sidebar Widget** ({{calendar}} syntax): 10798``` 10799Rendered server-side with PHP 10800Cannot be AJAX-reloaded 10801Solution: Reload entire page without ?namespace=work parameter 10802``` 10803 10804**Regular Calendar** ({{calendar-compact}} or {{calendar-panel}}): 10805``` 10806Has AJAX reload capability 10807Solution: Call navCalendar() to reload via AJAX 10808``` 10809 10810### Before vs After 10811 10812**BEFORE (v4.6.4)**: 10813``` 10814Sidebar widget filtered by "work": 10815┌─────────────────────────┐ 10816│ Filtering: work ✕ │ ← Click ✕ 10817├─────────────────────────┤ 10818│ Today │ 10819│ • Work meeting │ 10820└─────────────────────────┘ 10821 10822After clicking ✕: 10823┌─────────────────────────┐ 10824│ Filtering: work ✕ │ ← Still there! ✗ 10825├─────────────────────────┤ 10826│ Today │ 10827│ • Work meeting │ ← Still filtered! ✗ 10828└─────────────────────────┘ 10829``` 10830 10831**AFTER (v4.6.5)**: 10832``` 10833Sidebar widget filtered by "work": 10834┌─────────────────────────┐ 10835│ Filtering: work ✕ │ ← Click ✕ 10836├─────────────────────────┤ 10837│ Today │ 10838│ • Work meeting │ 10839└─────────────────────────┘ 10840 10841After clicking ✕ → Page reloads: 10842┌─────────────────────────┐ 10843│ (no filter badge) │ ← Cleared! ✓ 10844├─────────────────────────┤ 10845│ Today │ 10846│ • Work meeting │ 10847│ • Personal task │ ← All events! ✓ 10848│ • Project review │ 10849└─────────────────────────┘ 10850``` 10851 10852### Technical Details 10853 10854**Why Page Reload for Sidebar?** 10855 10856Sidebar widget is rendered server-side: 10857```php 10858// In syntax.php: 10859return $this->renderSidebarWidget($events, $namespace, $calId); 10860// ↑ PHP generates complete HTML 10861// No AJAX reload endpoint exists for sidebar 10862``` 10863 10864**Solution**: Remove `?namespace=work` from URL and reload page 10865```javascript 10866const url = new URL(window.location.href); 10867url.searchParams.delete('namespace'); // Remove filter 10868window.location.href = url.toString(); // Reload 10869``` 10870 10871**Why AJAX for Regular Calendar?** 10872 10873Regular calendars have AJAX endpoints: 10874```javascript 10875// action.php handles: 10876action: 'load_month' → Returns new month data 10877navCalendar() → Fetches and rebuilds calendar 10878``` 10879 10880### Filter Badge Behavior 10881 10882**Showing Badge** (when filtering): 10883- Server-side: PHP renders badge in HTML 10884- Client-side: JavaScript adds badge to header 10885 10886**Clearing Badge**: 10887- Sidebar: Page reload (removes ?namespace from URL) 10888- Calendar: AJAX reload (badge removed in rebuildCalendar) 10889 10890**Now works correctly for both!** ✓ 10891 10892## Version 4.6.4 (2026-02-07) - HOTFIX: PHP SYNTAX ERROR 10893 10894### Critical Hotfix: Fixed PHP Parse Error 10895- **Fixed:** Template literal backticks causing PHP syntax error 10896- **Fixed:** Changed JavaScript template literals to concatenation 10897- **Fixed:** Admin page now loads without parse errors 10898 10899### The Problem 10900 10901**v4.6.3 broke admin page**: 10902``` 10903Error loading plugin calendar 10904ParseError: syntax error, unexpected identifier "s", 10905expecting "," or ";" 10906``` 10907 10908**Cause**: JavaScript template literals inside PHP echo 10909```php 10910echo '<script> 10911 let nsOptions = `<option value="">(default)</option>`; 10912 ↑ PHP sees backtick and gets confused! 10913</script>'; 10914``` 10915 10916**Why it broke**: Backticks (`) are special in PHP too! 10917 10918### The Fix 10919 10920**Changed from template literals to concatenation**: 10921 10922**BEFORE (broken)**: 10923```javascript 10924let nsOptions = `<option value="">(default)</option>`; 10925nsOptions += `<option value="${namespace}">${namespace}</option>`; 10926console.log('Edit recurring:', namespace); 10927``` 10928 10929**AFTER (fixed)**: 10930```javascript 10931let nsOptions = "<option value=\\"\\">(default)</option>"; 10932nsOptions += "<option value=\\"" + namespace + "\\">" + namespace + "</option>"; 10933console.log("Edit recurring:", namespace); 10934``` 10935 10936**Changes**: 10937- ✅ Backticks (`) → Double quotes (") 10938- ✅ Template literals (${var}) → Concatenation (" + var + ") 10939- ✅ Single quotes in console.log → Double quotes 10940- ✅ Properly escaped quotes for PHP echo 10941 10942### Technical Details 10943 10944**The Issue**: 10945```php 10946// Inside PHP echo string: 10947echo '<script> 10948 let x = `template ${literal}`; // ✗ Backtick breaks PHP! 10949</script>'; 10950``` 10951 10952**The Solution**: 10953```php 10954// Use regular string concatenation: 10955echo '<script> 10956 let x = "string " + variable; // ✓ Works in PHP echo! 10957</script>'; 10958``` 10959 10960**Quote Escaping**: 10961```javascript 10962// Double quotes inside PHP single-quote string: 10963'<option value=\"\">text</option>' 10964 ↑↑ Escaped for JavaScript 10965``` 10966 10967### Result 10968 10969**Before**: Admin page crashed with parse error ✗ 10970**After**: Admin page loads perfectly ✓ 10971 10972**No functionality changed - just syntax fix!** 10973 10974## Version 4.6.3 (2026-02-07) - FIX RECURRING EVENTS NAMESPACE DROPDOWN 10975 10976### Critical Fix: Namespace Dropdown in Recurring Events Section 10977- **Fixed:** Namespace dropdown now shows ALL available namespaces when editing 10978- **Fixed:** Current namespace now properly selected in dropdown 10979- **Fixed:** Namespace extraction from DOM now uses multiple methods 10980- **Added:** Console logging to debug namespace detection 10981 10982### The Problem 10983 10984**When editing from Recurring Events section**: 10985``` 10986Click "Edit" on recurring event 10987Namespace dropdown shows: 10988- (default) 10989- (nothing else!) ✗ 10990 10991Can't select any namespace! ✗ 10992``` 10993 10994**Why**: Broken namespace extraction logic 10995```javascript 10996// OLD CODE (broken): 10997const namespaces = Array.from(document.querySelectorAll("[id^=ns_]")) 10998 .map(el => { 10999 // Complex parsing that often failed 11000 const nsSpan = el.querySelector("span:nth-child(3)"); 11001 return nsSpan.textContent.replace(" ", "").trim(); 11002 }) 11003 .filter(ns => ns !== namespace); // Excluded current! ✗ 11004``` 11005 11006**Result**: Empty dropdown, can't change namespace! ✗ 11007 11008### The Fix 11009 11010**NEW CODE (robust)**: 11011```javascript 11012const namespaces = new Set(); 11013 11014// Method 1: Namespace explorer folders 11015document.querySelectorAll("[id^=ns_]").forEach(el => { 11016 const nsSpan = el.querySelector("span:nth-child(3)"); 11017 if (nsSpan) { 11018 let nsText = nsSpan.textContent.replace(" ", "").trim(); 11019 if (nsText && nsText !== "(default)") { 11020 namespaces.add(nsText); // ✓ 11021 } 11022 } 11023}); 11024 11025// Method 2: Datalist (backup method) 11026document.querySelectorAll("#namespaceList option").forEach(opt => { 11027 if (opt.value && opt.value !== "") { 11028 namespaces.add(opt.value); // ✓ 11029 } 11030}); 11031 11032// Build dropdown with ALL namespaces 11033let options = `<option value="">(default)</option>`; 11034 11035// Show current namespace as selected 11036if (namespace) { 11037 options += `<option value="${namespace}" selected>${namespace} (current)</option>`; 11038} 11039 11040// Show all other namespaces 11041for (const ns of nsArray) { 11042 if (ns !== namespace) { 11043 options += `<option value="${ns}">${ns}</option>`; 11044 } 11045} 11046``` 11047 11048**Result**: All namespaces visible! ✓ 11049 11050### How It Works Now 11051 11052**Before (Broken)**: 11053``` 11054Edit recurring event in "work" namespace 11055 11056Dropdown shows: 11057☐ (default) 11058 11059That's it! Can't select anything! ✗ 11060``` 11061 11062**After (Fixed)**: 11063``` 11064Edit recurring event in "work" namespace 11065 11066Dropdown shows: 11067☐ (default) 11068☑ work (current) ← Selected! 11069☐ personal 11070☐ projects 11071☐ meetings 11072 11073All namespaces available! ✓ 11074``` 11075 11076### Key Improvements 11077 11078**1. Dual extraction methods**: 11079- Primary: Parse namespace explorer DOM 11080- Backup: Read from datalist 11081- Result: Always finds namespaces ✓ 11082 11083**2. Current namespace included**: 11084```javascript 11085// OLD: Excluded current namespace 11086.filter(ns => ns !== namespace) ✗ 11087 11088// NEW: Include and mark as selected 11089options += `<option value="${namespace}" selected>${namespace} (current)</option>` ✓ 11090``` 11091 11092**3. Better error handling**: 11093```javascript 11094if (nsSpan) { // Check exists 11095 let nsText = nsSpan.textContent.replace(" ", "").trim(); 11096 if (nsText && nsText !== "(default)") { // Validate 11097 namespaces.add(nsText); 11098 } 11099} 11100``` 11101 11102**4. Console debugging**: 11103```javascript 11104console.log('Edit recurring - Current namespace:', namespace); 11105console.log('Available namespaces:', nsArray); 11106``` 11107 11108Open browser console (F12) to see what namespaces are detected! 11109 11110### Example Usage 11111 11112**Scenario**: Edit recurring "Team Meeting" in "work" namespace 11113 11114**Steps**: 111151. Go to Recurring Events section 111162. Click "Edit" on "Team Meeting" 111173. See namespace dropdown: 11118 - ☐ (default) 11119 - ☑ work (current) 11120 - ☐ personal 11121 - ☐ projects 111224. Select "personal" to move event 111235. Click "Save Changes" 111246. Event moved to "personal" namespace ✓ 11125 11126**Finally works as expected!** 11127 11128## Version 4.6.2 (2026-02-07) - FIX NAMESPACE PRESERVATION 11129 11130### Recurring Events Namespace Fix 11131- **Fixed:** Namespace now properly preserved when editing recurring events 11132- **Fixed:** Namespace selector now allows selecting any namespace (not just default) 11133- **Added:** Better logging for namespace preservation debugging 11134- **Added:** Console logging to track namespace values during edit 11135 11136### The Namespace Problem 11137 11138**Issue 1**: Can't select non-default namespace 11139``` 11140When editing recurring event: 11141- Dropdown shows all namespaces ✓ 11142- User selects "work" 11143- Form submits with "" (empty/default) ✗ 11144``` 11145 11146**Issue 2**: Namespace not preserved 11147``` 11148Recurring event in "personal" namespace 11149Edit the title only 11150After save: namespace changed to "" (default) ✗ 11151``` 11152 11153### The Fixes 11154 11155**Fix 1**: Better namespace preservation logic 11156```php 11157// When editing recurring event: 11158$existingNamespace = $existingEventData['namespace']; 11159 11160// Preserve if user didn't explicitly change it: 11161if (empty($namespace) || 11162 strpos($namespace, '*') !== false || 11163 strpos($namespace, ';') !== false) { 11164 // User didn't select or selected wildcard 11165 $namespace = $existingNamespace; // Keep existing! 11166} 11167``` 11168 11169**Fix 2**: Proper form population 11170```javascript 11171// When editing, set BOTH inputs: 11172namespaceHidden.value = event.namespace || ''; // Hidden (submitted) 11173namespaceSearch.value = event.namespace || '(default)'; // Visible 11174 11175// Plus logging: 11176console.log('Set namespace for editing:', event.namespace); 11177``` 11178 11179**Fix 3**: Added detailed logging 11180```php 11181error_log("Preserving namespace '$namespace' (received='$receivedNamespace')"); 11182error_log("Using new namespace '$namespace'"); 11183error_log("No existing namespace to preserve"); 11184``` 11185 11186### How It Works Now 11187 11188**Scenario 1**: Edit without changing namespace 11189``` 11190Event in "work" namespace 11191Edit title to "Updated Meeting" 11192Namespace field shows: "work" 11193Hidden input value: "work" 11194Result: Saved in "work" ✓ 11195``` 11196 11197**Scenario 2**: Change namespace during edit 11198``` 11199Event in "personal" namespace 11200Edit and select "work" namespace 11201Hidden input value: "work" 11202Result: Saved in "work" ✓ 11203``` 11204 11205**Scenario 3**: Edit with empty/wildcard namespace 11206``` 11207Event in "projects" namespace 11208Namespace field empty or shows "personal;work" 11209System preserves: "projects" 11210Result: Saved in "projects" ✓ 11211``` 11212 11213### Debugging 11214 11215Now with console logging, you can see: 11216```javascript 11217Set namespace for editing: work 11218Hidden value: work 11219``` 11220 11221And in PHP logs: 11222``` 11223Calendar saveEvent recurring: Loaded existing data - namespace='work' 11224Calendar saveEvent recurring: Preserving namespace 'work' (received='') 11225``` 11226 11227**Namespace preservation now works correctly!** 11228 11229## Version 4.6.1 (2026-02-07) - PRESERVE RECURRING EVENT DATA 11230 11231### Recurring Events Edit Fix 11232- **Fixed:** Editing recurring events now preserves unchanged fields 11233- **Fixed:** Empty fields no longer erase existing data 11234- **Added:** Smart merge of existing event data with new changes 11235 11236### The Problem 11237 11238**Before**: Editing erased unchanged fields! 11239``` 11240Original recurring event: 11241- Title: "Team Meeting" 11242- Time: "10:00 AM" 11243- Description: "Weekly standup with engineering team" 11244- Color: Red 11245 11246User edits ONLY the title to "Staff Meeting" 11247Form sends: 11248- Title: "Staff Meeting" ✓ 11249- Time: "" ✗ (empty because user didn't change it) 11250- Description: "" ✗ (empty) 11251- Color: "#3498db" ✗ (default blue) 11252 11253Result after save: 11254- Title: "Staff Meeting" ✓ 11255- Time: BLANK ✗ 11256- Description: BLANK ✗ 11257- Color: Blue ✗ 11258``` 11259 11260**All the other data was lost!** ✗ 11261 11262### The Fix 11263 11264**After**: Preserves unchanged data! 11265```php 11266if ($eventId && $isRecurring) { 11267 // Load existing event data 11268 $existingEventData = getExistingEventData($eventId); 11269 11270 // Merge: use new value OR keep existing 11271 $title = $title ?: $existingEventData['title']; 11272 $time = $time ?: $existingEventData['time']; 11273 $description = $description ?: $existingEventData['description']; 11274 $color = ($color === '#3498db') ? 11275 $existingEventData['color'] : $color; 11276} 11277``` 11278 11279**Now**: 11280``` 11281User edits ONLY the title to "Staff Meeting" 11282 11283System: 112841. Loads existing event data 112852. Merges: new title + existing time/description/color 112863. Saves merged data 11287 11288Result: 11289- Title: "Staff Meeting" ✓ (changed) 11290- Time: "10:00 AM" ✓ (preserved!) 11291- Description: "Weekly standup..." ✓ (preserved!) 11292- Color: Red ✓ (preserved!) 11293``` 11294 11295**Only changed fields are updated!** ✓ 11296 11297### How It Works 11298 11299**Step 1**: Load existing data 11300```php 11301$existingEventData = $this->getExistingEventData( 11302 $eventId, 11303 $date, 11304 $namespace 11305); 11306``` 11307 11308**Step 2**: Merge with new data 11309```php 11310// If new value is empty, use existing value 11311$title = $newTitle ?: $existingEventData['title']; 11312$time = $newTime ?: $existingEventData['time']; 11313$description = $newDesc ?: $existingEventData['description']; 11314 11315// Special handling for color (default is #3498db) 11316if ($newColor === '#3498db' && $existingEventData['color']) { 11317 $color = $existingEventData['color']; 11318} 11319``` 11320 11321**Step 3**: Save merged data 11322```php 11323createRecurringEvents(..., $title, $time, $description, $color, ...); 11324``` 11325 11326### Fields Preserved 11327 11328When editing recurring events, these fields are now preserved if not changed: 11329- ✅ Title (if left blank) 11330- ✅ Time (if not specified) 11331- ✅ End Time (if not specified) 11332- ✅ Description (if left empty) 11333- ✅ Color (if still default blue) 11334 11335**Edit only what you want to change - everything else stays!** 11336 11337## Version 4.6.0 (2026-02-07) - NAMESPACE RENAME & RECURRING FIX 11338 11339### ✨ New Feature: Rename Namespaces 11340- **Added:** ✏️ Rename button in Namespace Explorer 11341- **Added:** Rename all events in a namespace at once 11342- **Added:** Automatic cleanup of old directory structure 11343 11344### Critical Fix: Recurring Events Actually Edit Now! 11345- **Fixed:** Editing recurring events now deletes ALL instances 11346- **Fixed:** Previously only deleted one instance, left orphans 11347- **Fixed:** Recurring events properly regenerated on edit 11348 11349### Namespace Rename Feature 11350 11351**Before**: Could only delete namespaces, not rename 11352 11353**After**: Click ✏️ to rename! 11354 11355``` 11356 work (15 events) [3] [✏️] [️] 11357 ↑ NEW! 11358``` 11359 11360**How It Works**: 113611. Click ✏️ rename button 113622. Enter new namespace name 113633. All events moved to new namespace 113644. Event `namespace` field updated in JSON 113655. Old directory cleaned up 11366 11367**Example**: 11368``` 11369Rename: "work" → "business" 11370 11371Before: 11372/data/meta/work/calendar/*.json 11373Events: {namespace: "work"} 11374 11375After: 11376/data/meta/business/calendar/*.json 11377Events: {namespace: "business"} 11378``` 11379 11380**Implementation**: 11381```php 11382private function renameNamespace() { 11383 // 1. Validate new name 11384 // 2. Rename directory 11385 // 3. Update all event namespace fields in JSON 11386 // 4. Clean up old empty directories 11387} 11388``` 11389 11390### Recurring Events Fix - The Problem 11391 11392**Before**: Editing didn't work! 11393``` 11394Original recurring event generates: 11395- Event-0 (Mon, Feb 10) 11396- Event-1 (Mon, Feb 17) 11397- Event-2 (Mon, Feb 24) 11398 11399User edits Event-0, changes title to "Updated" 11400 11401What SHOULD happen: 11402- Delete Event-0, Event-1, Event-2 11403- Generate new instances with "Updated" title 11404 11405What ACTUALLY happened: 11406- Delete Event-0 only ✗ 11407- Generate new instances 11408- Result: Event-1 and Event-2 still show old title! ✗ 11409``` 11410 11411**After**: Properly deletes ALL instances! 11412 11413**The Fix**: 11414```php 11415private function deleteEvent() { 11416 $event = getEvent($eventId); 11417 11418 // Check if recurring 11419 if ($event['recurring'] && $event['recurringId']) { 11420 // Delete ALL instances with same recurringId 11421 deleteAllRecurringInstances($recurringId); 11422 } 11423 11424 // Then normal delete for spanning events 11425} 11426 11427private function deleteAllRecurringInstances($recurringId) { 11428 // Scan ALL calendar JSON files 11429 foreach (glob('*.json') as $file) { 11430 // Filter out events with matching recurringId 11431 $events = array_filter($events, function($event) { 11432 return $event['recurringId'] !== $recurringId; 11433 }); 11434 } 11435} 11436``` 11437 11438**Result**: 11439- Edit "Weekly Team Meeting" → ALL instances updated ✓ 11440- Delete recurring event → ALL instances deleted ✓ 11441- No more orphaned events! ✓ 11442 11443### Recurring Event Fields 11444 11445Every recurring event has: 11446```json 11447{ 11448 "id": "abc123-0", 11449 "recurring": true, 11450 "recurringId": "abc123", ← Links all instances 11451 ... 11452} 11453``` 11454 11455When editing/deleting, we find ALL events with same `recurringId` and remove them! 11456 11457**Finally, recurring events work properly!** 11458 11459## Version 4.5.2 (2026-02-07) - FIX SORTING & PINK TOOLTIPS 11460 11461### Important Events Sorting - ACTUALLY FIXED! 11462- **Fixed:** Important Events now REALLY sorted by date first, then time 11463- **Fixed:** renderSidebarSection was re-sorting and breaking the order 11464- **Changed:** Important Events use date-first sorting, Today/Tomorrow use time-only 11465 11466### Pink Theme Tooltip Bling! 11467- **Added:** Pink gradient tooltips (hot pink → light pink) 11468- **Added:** Glowing pink border on tooltips 11469- **Added:** Sparkling heart () appears next to tooltip! 11470- **Added:** Heart has pink glow drop-shadow 11471 11472### The Sorting Bug - Root Cause 11473 11474**Problem**: Two sorts were happening! 11475 11476**Sort #1** (Line 2047): Before rendering 11477```php 11478usort($importantEvents, ...) // Sort by date ✓ 11479``` 11480 11481**Sort #2** (Line 2751): Inside renderSidebarSection 11482```php 11483usort($events, ...) // Sort by TIME ONLY ✗ 11484// This was breaking the date order! 11485``` 11486 11487**The Fix**: Different sorting for different sections 11488```php 11489if ($title === 'Important Events') { 11490 // Sort by DATE first, then time 11491 usort($events, function($a, $b) { 11492 if ($dateA !== $dateB) { 11493 return strcmp($dateA, $dateB); // DATE first! 11494 } 11495 // Same date - sort by time 11496 return timeCompare($a, $b); 11497 }); 11498} else { 11499 // Today/Tomorrow - sort by TIME only (same date) 11500 usort($events, function($a, $b) { 11501 return timeCompare($a, $b); 11502 }); 11503} 11504``` 11505 11506**Result**: Important Events now CORRECTLY sorted! 11507``` 11508✓ Sun, Feb 8 - 3:30 PM Super Bowl 11509✓ Tue, Feb 10 - 11:30 AM Doctor visit 11510✓ Sat, Feb 14 - Valentine's Day (all-day) 11511✓ Sat, Feb 14 - 8:00 PM Crab Shack 11512``` 11513 11514### Pink Tooltip Magic! 11515 11516**Normal Tooltips**: Black background, plain 11517```css 11518background: rgba(0, 0, 0, 0.95); 11519color: #fff; 11520``` 11521 11522**Pink Theme Tooltips**: FABULOUS! 11523```css 11524/* Pink gradient background */ 11525background: linear-gradient(135deg, #ff1493 0%, #ff69b4 100%); 11526 11527/* Glowing pink border */ 11528border: 2px solid #ff85c1; 11529 11530/* Double glow shadow */ 11531box-shadow: 11532 0 0 15px rgba(255, 20, 147, 0.6), 11533 0 4px 12px rgba(0, 0, 0, 0.4); 11534 11535/* Bold text */ 11536font-weight: 600; 11537``` 11538 11539**Plus**: Sparkling heart next to tooltip! 11540```css 11541.sidebar-pink [data-tooltip]:after { 11542 content: ''; 11543 font-size: 12px; 11544 filter: drop-shadow(0 0 3px rgba(255, 20, 147, 0.8)); 11545} 11546``` 11547 11548**The Effect**: 11549``` 11550Hover over ⚠ conflict warning: 11551┌────────────────────┐ 11552│ Conflicts with: │ ← Pink gradient 11553│ • Event 1 (3PM) │ ← Pink border 11554│ • Event 2 (4PM) │ ← Pink glow 11555└────────────────────┘ 11556``` 11557 11558**Maximum glamour on tooltips too!** ✨ 11559 11560## Version 4.5.1 (2026-02-07) - FIX IMPORTANT EVENTS SORTING 11561 11562### Important Events Order Fixed 11563- **Fixed:** Important Events now sorted by date (earliest first) 11564- **Fixed:** Events on same date sorted by time (chronological) 11565- **Fixed:** All-day events appear last within each date 11566 11567### Sorting Issue 11568 11569**Before**: Random order 11570``` 11571Important Events: 11572 Valentine's Day (Sat, Feb 14) 1157311:30 AM Doctor visit (Tue, Feb 10) ← Feb 10 after Feb 14! 115743:30 PM Super Bowl (Sun, Feb 8) ← Feb 8 after Feb 14! 115758:00 PM Crab Shack (Sat, Feb 14) 11576``` 11577 11578**After**: Chronological order 11579``` 11580Important Events: 115813:30 PM Super Bowl (Sun, Feb 8) ← Earliest! 1158211:30 AM Doctor visit (Tue, Feb 10) 11583 Valentine's Day (Sat, Feb 14) ← All-day event 115848:00 PM Crab Shack (Sat, Feb 14) ← Same day, sorted by time 11585``` 11586 11587### Sorting Logic 11588 11589**Primary Sort**: By date 11590```php 11591strcmp($dateA, $dateB); // "2026-02-08" < "2026-02-14" 11592``` 11593 11594**Secondary Sort**: By time (within same date) 11595```php 11596// All-day events (no time) go last 11597if (empty($timeA) && !empty($timeB)) return 1; 11598if (!empty($timeA) && empty($timeB)) return -1; 11599 11600// Both have times - sort chronologically 11601$aMinutes = timeToMinutes($timeA); // "11:30" = 690 minutes 11602$bMinutes = timeToMinutes($timeB); // "20:00" = 1200 minutes 11603return $aMinutes - $bMinutes; // 690 < 1200 11604``` 11605 11606**Result**: 116071. Sun, Feb 8 - 3:30 PM (earliest date & time) 116082. Tue, Feb 10 - 11:30 AM (next date) 116093. Sat, Feb 14 - Valentine's Day (all-day, so last on Feb 14) 116104. Sat, Feb 14 - 8:00 PM (timed event on Feb 14) 11611 11612**Perfect chronological order for next 2 weeks!** ✓ 11613 11614## Version 4.5.0 (2026-02-07) - SPARKLE EDITION ✨ 11615 11616### EXTREME PINK BLING EFFECTS! 11617- **Added:** Click sparkles - 8 sparkles burst out on every click! 11618- **Added:** Auto-sparkles - random sparkles appear every 3 seconds 11619- **Added:** Hover mega-glow - sidebar glows BRIGHT on hover 11620- **Added:** Pulsing border glow - constantly breathing pink glow 11621- **Added:** Drop shadows on sparkles for extra depth 11622- **Added:** More sparkle emojis - hearts, diamonds, crowns, bows! 11623 11624### Sparkle Effects Breakdown 11625 11626**Click Sparkles** : 11627```javascript 11628// 8 sparkles burst out when you click anywhere! 11629for (let i = 0; i < 8; i++) { 11630 // Staggered appearance (40ms apart) 11631 createSparkle(x, y); 11632} 11633 11634// Sparkle emojis: 11635["✨", "", "", "⭐", "", "", "", "", "", ""] 11636``` 11637 11638**Each sparkle**: 11639- Starts at click point 11640- Flies outward 30-60px in random direction 11641- Spins 360 degrees 11642- Fades in and out 11643- Has pink glow drop-shadow 11644- Disappears after 1 second 11645 11646**Auto Sparkles** ⏰: 11647```javascript 11648// Random sparkle every 3 seconds 11649setInterval(() => { 11650 const x = Math.random() * width; 11651 const y = Math.random() * height; 11652 createSparkle(x, y); 11653}, 3000); 11654``` 11655 11656**Result**: Constant magical sparkles even without clicking! ✨ 11657 11658**Hover Mega-Glow** : 11659```css 11660.sidebar-pink:hover { 11661 box-shadow: 11662 0 0 30px rgba(255, 20, 147, 0.9), 11663 0 0 50px rgba(255, 20, 147, 0.5) !important; 11664} 11665``` 11666 11667**Result**: Sidebar EXPLODES with pink glow when you hover over it! 11668 11669**Pulsing Border Glow** : 11670```css 11671@keyframes pulse-glow { 11672 0%, 100% { 11673 box-shadow: 0 0 10px rgba(255, 20, 147, 0.4); 11674 } 11675 50% { 11676 box-shadow: 11677 0 0 25px rgba(255, 20, 147, 0.8), 11678 0 0 40px rgba(255, 20, 147, 0.4); 11679 } 11680} 11681 11682animation: pulse-glow 3s ease-in-out infinite; 11683``` 11684 11685**Result**: Border continuously breathes with pink glow! 11686 11687**Sparkle Animation** : 11688```css 11689@keyframes sparkle { 11690 0% { 11691 opacity: 0; 11692 transform: translate(0, 0) scale(0) rotate(0deg); 11693 } 11694 50% { 11695 opacity: 1; 11696 transform: translate(halfway) scale(1) rotate(180deg); 11697 } 11698 100% { 11699 opacity: 0; 11700 transform: translate(far) scale(0) rotate(360deg); 11701 } 11702} 11703``` 11704 11705**Result**: Sparkles spin, grow, shrink, and fly! 11706 11707### Complete Pink Bling Experience: 11708 11709**Always Active**: 11710- ✨ Pulsing pink border glow (3 second cycle) 11711- ✨ Auto-sparkles every 3 seconds 11712 11713**On Hover**: 11714- MEGA GLOW EFFECT (2x brightness!) 11715 11716**On Click**: 11717- 8 sparkles EXPLODE outward! 11718- Random emojis (hearts, stars, diamonds, crowns!) 11719- Each sparkle spins 360° while flying 11720- Pink glow drop-shadow on each sparkle 11721 11722**The Result**: 11723- Click anywhere = SPARKLE EXPLOSION! 11724- Hover anywhere = MEGA GLOW! ✨ 11725- Always breathing and sparkling! 11726- Maximum glamour! 11727- Wife approval: 1000%! 11728 11729**THIS IS THE MOST FABULOUS CALENDAR EVER!** ✨ 11730 11731## Version 4.4.2 (2026-02-07) - FINAL PINK POLISH 11732 11733### Pink Theme Final Touches 11734- **Fixed:** Add Event text now black (was bright pink, hard to read) 11735- **Fixed:** Clock border now COMPLETELY pink on all sides (no more green!) 11736- **Removed:** Text shadow on Add Event button (cleaner with black text) 11737 11738### Add Event Text - Black & Readable! 11739 11740**Before**: Bright pink text (#ff1493) on dark pink background 11741```php 11742$addBtnTextColor = $themeStyles['text_bright']; // #ff1493 - hard to read! 11743text-shadow: 0 0 3px #ff1493; // Glowy pink 11744``` 11745 11746**After**: Black text, no shadow, perfect contrast! 11747```php 11748$addBtnTextColor = $theme === 'pink' ? '#000000' : ...; 11749$addBtnTextShadow = $theme === 'pink' ? 'none' : ...; 11750``` 11751 11752**Result**: 11753- Black text pops against dark pink background ✓ 11754- Easy to read ✓ 11755- Professional look with bling ✓ 11756 11757### Clock Border - All Pink! 11758 11759**The Problem**: Inline style only set `border-bottom`, CSS set other sides to green 11760 11761**Before**: 11762```php 11763// Inline style (only bottom): 11764style="border-bottom:2px solid #ff1493;" 11765 11766// CSS (all sides): 11767.eventlist-today-header { 11768 border: 2px solid #00cc07; // Green on top/sides! 11769} 11770``` 11771 11772**After**: Inline style overrides ALL sides 11773```php 11774style="border:2px solid #ff1493;" // All 4 sides pink! 11775``` 11776 11777**Result**: Clock box now 100% pink border on all four sides! ✓ 11778 11779### What Changed: 11780 11781**Add Event Button**: 11782- Background: #b8156f (dark pink) ✓ 11783- Text: **#000000 (black)** ← NEW! 11784- Text shadow: **none** ← NEW! 11785- Glow: 0 0 10px pink ✓ 11786 11787**Clock Border**: 11788- Top: **#ff1493 (pink)** ← FIXED! 11789- Right: **#ff1493 (pink)** ← FIXED! 11790- Bottom: #ff1493 (pink) ✓ 11791- Left: **#ff1493 (pink)** ← FIXED! 11792 11793**Perfect pink theme - wife approved!** ✨ 11794 11795## Version 4.4.1 (2026-02-07) - PINK THEME PERFECTION 11796 11797### Pink Theme Complete Makeover 11798- **Fixed:** Clock border now completely pink (was green on sides/top) 11799- **Changed:** Today/Tomorrow/Important sections now different shades of pink 11800- **Changed:** Add Event button now dark pink (was clashing blue) 11801- **Changed:** System status bars now pink gradient (3 shades!) 11802 11803### All-Pink Everything! 11804 11805**Clock Border**: 11806```css 11807/* Before: Green border */ 11808border: 2px solid #00cc07; 11809 11810/* After: Hot pink border */ 11811.sidebar-pink .eventlist-today-header { 11812 border-color: #ff1493; 11813 box-shadow: 0 0 10px rgba(255, 20, 147, 0.4); 11814} 11815``` 11816 11817**Section Colors** (Different Pink Shades): 11818```php 11819// Before: Orange, green, purple 11820'Today' => '#ff9800', 11821'Tomorrow' => '#4caf50', 11822'Important' => '#9b59b6' 11823 11824// After: Hot pink, pink, light pink 11825'Today' => '#ff1493', // Hot pink (DeepPink) 11826'Tomorrow' => '#ff69b4', // Pink (HotPink) 11827'Important' => '#ff85c1' // Light pink 11828``` 11829 11830**Add Event Button**: 11831```php 11832// Before: Clashing blue 11833background: #3498db; 11834 11835// After: Dark pink with glow 11836background: #b8156f; // Dark pink 11837hover: #8b0f54; // Darker pink 11838shadow: 0 0 10px rgba(255, 20, 147, 0.5); 11839``` 11840 11841**System Status Bars** (Pink Gradient): 11842```css 11843/* 5-min load average */ 11844.sidebar-pink .eventlist-cpu-fill { 11845 background: #ff1493; /* Hot pink */ 11846 box-shadow: 0 0 5px rgba(255, 20, 147, 0.7); 11847} 11848 11849/* Realtime CPU */ 11850.sidebar-pink .eventlist-cpu-fill-purple { 11851 background: #ff69b4; /* Pink */ 11852 box-shadow: 0 0 5px rgba(255, 105, 180, 0.7); 11853} 11854 11855/* Memory */ 11856.sidebar-pink .eventlist-cpu-fill-orange { 11857 background: #ff85c1; /* Light pink */ 11858 box-shadow: 0 0 5px rgba(255, 133, 193, 0.7); 11859} 11860``` 11861 11862### Pink Theme Visual Hierarchy: 11863 11864**Darkest → Lightest Pink Shades**: 118651. Add Event button: #b8156f (dark pink) 118662. Today section: #ff1493 (hot pink / deep pink) 118673. System bar 1: #ff1493 (hot pink) 118684. Tomorrow section: #ff69b4 (pink) 118695. System bar 2: #ff69b4 (pink) 118706. Important section: #ff85c1 (light pink) 118717. System bar 3: #ff85c1 (light pink) 11872 11873**Result**: Beautiful pink gradient throughout entire sidebar! ✨ 11874 11875### What's Pink Now: 11876 11877✅ Sidebar background & border 11878✅ **Clock border** ← FIXED! 11879✅ Header gradient 11880✅ Week grid 11881✅ **Add Event button** ← FIXED! 11882✅ **Today section** ← Different shade! 11883✅ **Tomorrow section** ← Different shade! 11884✅ **Important section** ← Different shade! 11885✅ Event text & bars 11886✅ **System status bars** ← All 3 different pink shades! 11887✅ All shadows & glows 11888 11889**EVERYTHING is pink and fabulous!** ✨ 11890 11891## Version 4.4.0 (2026-02-07) - PINK BLING THEME & PROFESSIONAL SHADOWS 11892 11893### ✨ New Theme: Pink Bling! 11894- **Added:** Glamorous hot pink theme with maximum sparkle 11895- **Features:** Deep pink (#ff1493), extra glow, hearts and diamonds aesthetic 11896- **Perfect for:** Fabulous calendars that demand attention ✨ 11897 11898### Professional Theme Shadow Fix 11899- **Fixed:** Section headers now have subtle shadow (not glow) 11900- **Fixed:** Clicked day panel header has proper shadow 11901 11902### Pink Bling Theme Colors 11903 11904**Background & Borders**: 11905```php 11906'bg' => '#1a0d14', // Dark rich pink-black 11907'border' => '#ff1493', // Hot pink (DeepPink) 11908'shadow' => 'rgba(255, 20, 147, 0.4)', // Strong pink glow 11909``` 11910 11911**Text Colors**: 11912```php 11913'text_primary' => '#ff69b4', // Hot pink 11914'text_bright' => '#ff1493', // Deep pink 11915'text_dim' => '#ff85c1', // Light pink 11916``` 11917 11918**Week Grid**: 11919```php 11920'grid_bg' => '#2d1a24', // Dark purple-pink 11921'cell_bg' => '#1a0d14', // Dark 11922'cell_today_bg' => '#3d2030', // Highlighted purple-pink 11923``` 11924 11925**Special Effects**: 11926```php 11927'bar_glow' => '0 0 5px', // Extra sparkly glow! 11928'header_shadow' => '0 0 12px rgba(255, 20, 147, 0.6)' // Maximum bling! 11929``` 11930 11931### Professional Theme Shadow Fix 11932 11933**Before**: Section headers had colored glow 11934```php 11935box-shadow: 0 0 8px #3498db; // Blue glow - wrong! 11936``` 11937 11938**After**: Section headers have subtle shadow 11939```php 11940$headerShadow = ($theme === 'professional') ? 11941 '0 2px 4px rgba(0, 0, 0, 0.15)' : // Shadow for professional 11942 '0 0 8px ' . $accentColor; // Glow for others 11943``` 11944 11945**Result**: 11946- **Matrix/Purple/Pink**: Colored glow on headers ✓ 11947- **Professional**: Clean grey shadow (no glow) ✓ 11948 11949### All Four Themes: 11950 11951** Matrix Edition**: 11952- Dark green (#00cc07) 11953- Neon glow effects 11954- Hacker aesthetic 11955 11956** Purple Dream**: 11957- Elegant purple (#9b59b6) 11958- Violet glow effects 11959- Royal aesthetic 11960 11961** Professional Blue**: 11962- Clean grey/blue (#4a90e2) 11963- Subtle shadows (NO glow) 11964- Corporate aesthetic 11965 11966** Pink Bling** (NEW!): 11967- Hot pink (#ff1493) 11968- MAXIMUM sparkle & glow 11969- Glamorous aesthetic ✨ 11970 11971### Technical Implementation 11972 11973**Theme Added To**: 11974- `getSidebarThemeStyles()` - color definitions 11975- `getSidebarTheme()` - validation 11976- `saveSidebarTheme()` - admin save 11977- Admin panel - UI with preview 11978- All shadow/glow calculations 11979- JavaScript theme colors 11980- Clicked day panel colors 11981 11982**Perfect for users who want FABULOUS pink calendars!** ✨ 11983 11984## Version 4.3.1 (2026-02-07) - REDUCE TEXT GLOW & CONSISTENCY 11985 11986### Text Glow Refinement 11987- **Changed:** Reduced text glow from 3px to 2px (less intense) 11988- **Fixed:** Clicked day panel now has same text glow as sections 11989 11990### Text Glow Reduction 11991 11992**Before**: Text glow was too strong (3px) 11993```php 11994// Sections: 11995text-shadow: 0 0 3px #00cc07; // Too bright! 11996 11997// Clicked day panel: 11998text-shadow: 0 0 3px #00cc07; // Too bright! 11999``` 12000 12001**After**: Subtler text glow (2px) 12002```php 12003// Sections: 12004text-shadow: 0 0 2px #00cc07; // Just right ✓ 12005 12006// Clicked day panel: 12007text-shadow: 0 0 2px #00cc07; // Just right ✓ 12008``` 12009 12010**Visual Impact**: 12011- **Matrix**: Softer green glow, easier to read 12012- **Purple**: Softer purple glow, more elegant 12013- **Professional**: Still no glow (clean) 12014 12015### Consistency Fix 12016 12017**Before**: Sections had glow, clicked day panel had NO glow 12018 12019**After**: Both sections AND clicked day panel have matching subtle glow 12020 12021**Where Glow Appears**: 12022- ✅ Today section event text 12023- ✅ Tomorrow section event text 12024- ✅ Important section event text 12025- ✅ **Clicked day panel event text** ← NOW CONSISTENT! 12026 12027**Result**: 12028- Glow is less intense and easier on eyes ✓ 12029- All event text has consistent styling ✓ 12030- Matrix/Purple themes more refined ✓ 12031 12032### Technical Details 12033 12034**PHP (Sections)**: 12035```php 12036$textShadow = ($theme === 'professional') ? '' : 'text-shadow:0 0 2px ' . $titleColor . ';'; 12037``` 12038 12039**JavaScript (Clicked Day Panel)**: 12040```javascript 12041themeColors.text_shadow = 'text-shadow:0 0 2px #00cc07'; // Or purple 12042eventHTML += "style='...color:" + color + "; " + themeColors.text_shadow + ";'"; 12043``` 12044 12045**Perfect consistency and subtle elegance!** ✨ 12046 12047## Version 4.3.0 (2026-02-07) - IMPORTANT EVENTS FUTURE + REMOVE GREY 12048 12049### ✨ Important Events Enhancement 12050- **Changed:** Important events now show from next 2 weeks (not just current week) 12051- **Fixed:** Important events on Sunday after current week now visible 12052- **Changed:** Events loaded 2 weeks into future for Important section 12053 12054### Background Cleanup 12055- **Removed:** Grey/white backgrounds from Today/Tomorrow/Important sections 12056- **Removed:** Grey backgrounds from individual events 12057- **Result:** Clean transparent backgrounds, original dark Matrix look restored 12058 12059### Important Events - Future Coverage 12060 12061**Before**: Only showed Important events from current week 12062```php 12063if ($isImportant && $dateKey >= $weekStart && $dateKey <= $weekEnd) { 12064 $importantEvents[] = $event; 12065} 12066``` 12067 12068**After**: Shows Important events from today through next 2 weeks 12069```php 12070// Load events 2 weeks out 12071$twoWeeksOut = date('Y-m-d', strtotime($weekEnd . ' +14 days')); 12072 12073// Show all important events from today forward 12074if ($isImportant && $dateKey >= $todayStr) { 12075 $importantEvents[] = $event; 12076} 12077``` 12078 12079**Example**: 12080- Today: Saturday Feb 7 12081- Current week: Sun Feb 1 → Sat Feb 7 12082- Important events shown: Feb 7 → Feb 21 (today + 14 days) 12083 12084**Result**: Important events on Sunday Feb 8 (next week) now visible! ✓ 12085 12086### Background Removal 12087 12088**Before**: Light grey/white backgrounds added 12089```php 12090// Section background: 12091$sectionBg = 'rgba(255, 255, 255, 0.05)'; // Grey overlay 12092 12093// Event background: 12094$eventBg = 'rgba(255, 255, 255, 0.03)'; // Grey overlay 12095``` 12096 12097**After**: No backgrounds (transparent) 12098```php 12099// Section: No background property 12100<div style="padding:4px 0;"> 12101 12102// Event: No background property 12103<div style="padding:4px 6px; ..."> 12104``` 12105 12106**Result**: 12107- Clean, dark Matrix aesthetic restored ✓ 12108- Purple theme darker and more elegant ✓ 12109- Professional theme still has its light grey sidebar bg ✓ 12110- Events stand out with just color bars and borders ✓ 12111 12112### What Changed: 12113 12114**Sections (Today/Tomorrow/Important)**: 12115- ❌ No more grey overlay 12116- ✓ Transparent background 12117- ✓ Colored borders & glows remain 12118 12119**Individual Events**: 12120- ❌ No more grey overlay 12121- ✓ Transparent background 12122- ✓ Colored bars & borders remain 12123 12124**Perfect! Back to the original clean dark look with future Important events!** 12125 12126## Version 4.2.6 (2026-02-07) - FIX SECTION SHADOWS & DESCRIPTION COLOR 12127 12128### Final Theme Polish 12129- **Fixed:** Today/Tomorrow/Important section shadows now match theme 12130- **Fixed:** Event description text color now uses theme dim color 12131 12132### Section Shadow Fix 12133 12134**Problem**: Sections always had green glow regardless of theme 12135 12136**Before**: 12137```php 12138// Hardcoded green: 12139box-shadow: 0 0 5px rgba(0, 204, 7, 0.2); 12140``` 12141 12142**After**: 12143```php 12144// Theme-aware: 12145$sectionShadow = $theme === 'matrix' ? '0 0 5px rgba(0, 204, 7, 0.2)' : 12146 ($theme === 'purple' ? '0 0 5px rgba(155, 89, 182, 0.2)' : 12147 '0 2px 4px rgba(0, 0, 0, 0.1)'); 12148``` 12149 12150**Result**: 12151- **Matrix**: Green glow around sections ✓ 12152- **Purple**: Purple glow around sections ✓ 12153- **Professional**: Subtle grey shadow (no glow) ✓ 12154 12155### Description Color Fix 12156 12157**Problem**: Description text always green in clicked day panel 12158 12159**Before**: 12160```javascript 12161color: #00aa00; // Always green 12162``` 12163 12164**After**: 12165```javascript 12166color: themeColors.text_dim; // Theme dim color 12167``` 12168 12169**Result**: 12170- **Matrix**: Dim green (#00aa00) ✓ 12171- **Purple**: Dim purple (#8e7ab8) ✓ 12172- **Professional**: Grey (#7f8c8d) ✓ 12173 12174### Now 100% Theme Consistent 12175 12176Every single visual element respects theme: 12177- ✅ Sidebar background & border 12178- ✅ Header colors & shadows 12179- ✅ Week grid & cells 12180- ✅ Add Event button 12181- ✅ Section borders & **shadows** ← Fixed! 12182- ✅ Event titles & times 12183- ✅ Event **descriptions** ← Fixed! 12184- ✅ Clicked day panel 12185- ✅ Event bars & glows 12186 12187**Absolute perfection across all three themes!** ✨ 12188 12189## Version 4.2.5 (2026-02-07) - CLICKED DAY PANEL THEMES & GREY BACKGROUND 12190 12191### Theme Improvements 12192- **Fixed:** Clicked day panel now uses correct theme colors 12193- **Changed:** Professional Blue background now light grey (not white) 12194- **Added:** Theme colors passed to JavaScript for dynamic rendering 12195 12196### Clicked Day Panel Theming 12197 12198**Before**: Always blue regardless of theme 12199```javascript 12200// Hardcoded blue: 12201color:#00cc07; // Always green 12202background:#3498db; // Always blue 12203``` 12204 12205**After**: Theme-aware colors 12206```php 12207// PHP passes theme to JavaScript: 12208window.themeColors_XXX = { 12209 text_primary: '#00cc07' or '#b19cd9' or '#2c3e50', 12210 text_bright: '#00dd00' or '#d4a5ff' or '#4a90e2', 12211 text_shadow: '0 0 3px ...' or '', 12212 event_bg: 'rgba(...)', 12213 border_color: 'rgba(...)', 12214 bar_shadow: '0 0 3px' or '0 1px 2px rgba(...)' 12215}; 12216 12217// JavaScript uses theme colors: 12218color: themeColors.text_primary; 12219background: themeColors.event_bg; 12220``` 12221 12222**Result**: 12223- Matrix: Green panel with green glow ✓ 12224- Purple: Purple panel with purple glow ✓ 12225- Professional: Blue panel, no glow, clean ✓ 12226 12227### Professional Theme Background Change 12228 12229**Before**: Almost white (#f5f7fa, #ffffff) 12230```php 12231'bg' => '#f5f7fa', // Very light 12232'cell_bg' => '#ffffff', // Pure white 12233``` 12234 12235**After**: Light grey tones 12236```php 12237'bg' => '#e8ecf1', // Soft grey-blue 12238'cell_bg' => '#f5f7fa', // Light grey 12239'grid_bg' => '#d5dbe3', // Medium grey 12240'cell_today_bg' => '#dce8f7' // Highlighted grey-blue 12241``` 12242 12243**Visual Impact**: 12244- Sidebar: Light grey-blue background (#e8ecf1) 12245- Week cells: Lighter grey (#f5f7fa) 12246- Today cell: Highlighted blue-grey (#dce8f7) 12247- More depth and contrast ✓ 12248- Professional appearance ✓ 12249 12250### All Theme Elements Now Consistent 12251 12252**Matrix (Green)**: 12253- Sidebar: Dark (#242424) 12254- Clicked panel: Dark with green 12255- Text: Green with glow 12256 12257**Purple Dream**: 12258- Sidebar: Dark purple (#2a2030) 12259- Clicked panel: Dark with purple 12260- Text: Purple with glow 12261 12262**Professional Blue**: 12263- Sidebar: Light grey (#e8ecf1) 12264- Clicked panel: Light with blue 12265- Text: Dark grey, no glow 12266 12267**Perfect theme consistency everywhere!** 12268 12269## Version 4.2.4 (2026-02-07) - FIX TOMORROW LOADING & DOUBLE ENCODING 12270 12271### Critical Fixes 12272- **Fixed:** Tomorrow events not loaded when outside current week 12273- **Fixed:** `&` showing instead of `&` (double HTML encoding) 12274 12275### Issue 1: Tomorrow Not Loading 12276 12277**Problem**: Sidebar only loaded events for current week 12278- Today (Saturday): Week ends today 12279- Tomorrow (Sunday): Start of NEXT week 12280- Tomorrow events never loaded from data files! 12281 12282**Before**: 12283```php 12284// Only load current week 12285$end = new DateTime($weekEnd); 12286$end->modify('+1 day'); 12287$period = new DatePeriod($start, $interval, $end); 12288// If tomorrow > weekEnd, it's not in period! 12289``` 12290 12291**After**: 12292```php 12293// Check if tomorrow is outside week 12294$tomorrowDate = date('Y-m-d', strtotime('+1 day')); 12295if ($tomorrowDate > $weekEnd) { 12296 // Extend to include tomorrow 12297 $end = new DateTime($tomorrowDate); 12298} 12299$end->modify('+1 day'); 12300$period = new DatePeriod($start, $interval, $end); 12301``` 12302 12303**Result**: Tomorrow events now loaded even at week boundary! ✓ 12304 12305### Issue 2: Double HTML Encoding 12306 12307**Problem**: `&` characters showing as `&` 12308 12309**Cause**: Double encoding on line 2625 and 2681 12310```php 12311// Line 2625: 12312$title = htmlspecialchars($event['title']); // "Coffee & Tea" → "Coffee & Tea" 12313 12314// Line 2681: 12315$html .= htmlspecialchars($title); // "Coffee & Tea" → "Coffee &amp; Tea" ❌ 12316``` 12317 12318**Fixed**: 12319```php 12320// Line 2625: 12321$title = htmlspecialchars($event['title']); // Encode once 12322 12323// Line 2681: 12324$html .= $title; // Use already-encoded value ✓ 12325``` 12326 12327**Result**: `&` displays correctly! ✓ 12328 12329### Both Fixes Critical 12330 12331These were **two separate bugs**: 123321. **Loading bug**: Tomorrow events not read from files 123332. **Display bug**: Double-encoding text 12334 12335Both needed fixing for Tomorrow section to work properly! 12336 12337## Version 4.2.3 (2026-02-07) - FIX TOMORROW SECTION AT WEEK BOUNDARY 12338 12339### Critical Fix 12340- **Fixed:** Tomorrow section missing when tomorrow is outside current week 12341- **Fixed:** Today section now always shows regardless of week boundaries 12342- **Changed:** Today/Tomorrow processed BEFORE week boundary checks 12343 12344### The Problem 12345 12346**Scenario**: Today is Saturday (last day of week) 12347- Week: Feb 1 (Sun) → Feb 7 (Sat) ← Today 12348- Tomorrow: Feb 8 (Sun) ← **Start of NEXT week** 12349 12350**BROKEN Logic** (v4.2.2): 12351```php 12352foreach ($events as $dateKey => $dayEvents) { 12353 if ($dateKey < $weekStart) continue; // Skip old events 12354 12355 // ...week processing... 12356 12357 if ($dateKey === $tomorrowStr) { // ← Never reached! 12358 $tomorrowEvents[] = $event; // Tomorrow > weekEnd 12359 } 12360} 12361``` 12362 12363**Result**: Tomorrow events never added because loop skipped them! ❌ 12364 12365### The Fix 12366 12367**Process Today/Tomorrow FIRST**: 12368```php 12369foreach ($events as $dateKey => $dayEvents) { 12370 $eventsWithConflicts = $this->detectTimeConflicts($dayEvents); 12371 12372 foreach ($eventsWithConflicts as $event) { 12373 // ALWAYS process Today and Tomorrow first! 12374 if ($dateKey === $todayStr) { 12375 $todayEvents[] = $event; // ✓ Always shows 12376 } 12377 if ($dateKey === $tomorrowStr) { 12378 $tomorrowEvents[] = $event; // ✓ Always shows 12379 } 12380 12381 // THEN check week boundaries for grid 12382 if ($dateKey >= $weekStart && $dateKey <= $weekEnd) { 12383 $weekEvents[$dateKey][] = $event; 12384 } 12385 12386 // Important events still week-only 12387 if ($isImportant && $dateKey >= $weekStart && $dateKey <= $weekEnd) { 12388 $importantEvents[] = $event; 12389 } 12390 } 12391} 12392``` 12393 12394### What Changed 12395 12396**Before**: 123971. Skip events < weekStart ❌ 123982. Process week grid 123993. Try to add Today/Tomorrow ← **Failed if outside week** 124004. Add Important events 12401 12402**After**: 124031. **Always add Today events** ✓ 124042. **Always add Tomorrow events** ✓ 124053. Add to week grid if in range 124064. Add Important events if in range 12407 12408**Result**: 12409- Today section: ✓ Always shows 12410- Tomorrow section: ✓ Always shows (even at week boundary!) 12411- Week grid: ✓ Only current week 12412- Important: ✓ Only current week 12413 12414### Edge Cases Fixed 12415 12416**Saturday → Sunday transition**: 12417- Today (Sat): Shows in Today section ✓ 12418- Tomorrow (Sun): Shows in Tomorrow section ✓ 12419- Week grid: Only shows Sat (today) ✓ 12420 12421**Sunday → Monday transition**: 12422- Today (Sun): Shows in Today section ✓ 12423- Tomorrow (Mon): Shows in Tomorrow section ✓ 12424- Week grid: Shows both Sun and Mon ✓ 12425 12426**Perfect! Tomorrow section now always works!** 12427 12428## Version 4.2.2 (2026-02-07) - SUNDAY NOT SATURDAY! 12429 12430### Corrected Week Options 12431- **Changed:** Week start options are now Monday vs **Sunday** (not Saturday!) 12432- **Changed:** Default is **Sunday** (US/Canada standard) 12433- **Fixed:** Day names array for Sunday start: S M T W T F S 12434 12435### Correct Week Start Options 12436 12437**Sunday Start** (Default): 12438- Grid shows: **S M T W T F S** 12439- Week: Sunday → Saturday 12440- US/Canada standard 12441- Most common worldwide 12442 12443**Monday Start**: 12444- Grid shows: **M T W T F S S** 12445- Week: Monday → Sunday 12446- ISO 8601 standard 12447- Common in Europe 12448 12449### Technical Changes 12450 12451**All References Updated**: 12452```php 12453// Changed from 'saturday' to 'sunday' in: 12454- Admin validation 12455- Week calculation logic 12456- Day names array 12457- Default value 12458- Comments 12459``` 12460 12461**Sunday Calculation** (when today is Saturday): 12462```php 12463$today = date('w'); // 0=Sun, 6=Sat 12464if ($today == 0) { 12465 $weekStart = date('Y-m-d'); // Today! 12466} else { 12467 // Go back $today days to last Sunday 12468 $weekStart = date('Y-m-d', strtotime('-' . $today . ' days')); 12469} 12470``` 12471 12472**Examples**: 12473- Today (Saturday): Week = Sun Feb 1 → Sat Feb 7 12474- Tomorrow (Sunday): Week = Sun Feb 8 → Sat Feb 14 12475 12476**Sorry for the confusion - it's Sunday not Saturday!** 12477 12478## Version 4.2.1 (2026-02-07) - FIX WEEK CALCULATION ON SATURDAY 12479 12480### Critical Fix 12481- **Fixed:** Week calculation broken when today is Saturday 12482- **Fixed:** Events not showing in Today/Important sections 12483- **Fixed:** Week grid event bars missing 12484- **Changed:** Default week start is Saturday (matches main calendar) 12485 12486### Technical Details 12487 12488**The Bug**: 12489```php 12490// BROKEN (v4.2.0): 12491$weekStart = date('Y-m-d', strtotime('saturday this week')); 12492// When TODAY is Saturday, this is ambiguous and fails! 12493 12494// FIXED (v4.2.1): 12495$today = date('w'); // 0 (Sun) to 6 (Sat) 12496if ($today == 6) { 12497 $weekStart = date('Y-m-d'); // Today! 12498} else { 12499 $daysBack = ($today == 0) ? 1 : ($today + 1); 12500 $weekStart = date('Y-m-d', strtotime('-' . $daysBack . ' days')); 12501} 12502$weekEnd = date('Y-m-d', strtotime($weekStart . ' +6 days')); 12503``` 12504 12505**Why It Failed**: 12506- `strtotime('saturday this week')` is ambiguous when run ON a Saturday 12507- PHP may interpret it as "next Saturday" or fail 12508- Result: Week range was wrong, events filtered out 12509 12510**The Fix**: 12511- Explicit calculation using day-of-week math 12512- Saturday (day 6): weekStart = today 12513- Sunday (day 0): weekStart = yesterday 12514- Monday-Friday: calculate days back to last Saturday 12515 12516**Result**: Works reliably every day of the week! 12517 12518**Default Changed**: Saturday start (was Monday in 4.2.0) 12519- Matches main calendar behavior 12520- Users can still switch to Monday in settings 12521 12522## Version 4.2.0 (2026-02-07) - WEEK START DAY SELECTOR 12523 12524### ✨ New Feature 12525- **Added:** Week start day selector in Themes tab 12526- **Added:** Choose between Monday (ISO standard) or Saturday week start 12527- **Added:** Week grid and all events now respect the selected start day 12528- **Changed:** Themes tab renamed to "Sidebar Widget Settings" 12529 12530### Week Start Options 12531 12532**Monday Start** (Default): 12533- Grid shows: M T W T F S S 12534- Week runs: Monday → Sunday 12535- ISO 8601 standard 12536- Common in Europe, most of world 12537 12538**Saturday Start**: 12539- Grid shows: S S M T W T F 12540- Week runs: Saturday → Friday 12541- Common in Middle East 12542- Sabbath-observant communities 12543 12544### Technical Details 12545 12546**Configuration**: 12547```php 12548// Saved in: data/meta/calendar_week_start.txt 12549// Values: 'monday' or 'saturday' 12550 12551// Week calculation: 12552if ($weekStartDay === 'saturday') { 12553 $weekStart = date('Y-m-d', strtotime('saturday this week')); 12554 $weekEnd = date('Y-m-d', strtotime('friday next week')); 12555} else { 12556 $weekStart = date('Y-m-d', strtotime('monday this week')); 12557 $weekEnd = date('Y-m-d', strtotime('sunday this week')); 12558} 12559``` 12560 12561**Day Names Array**: 12562```php 12563// Monday start: ['M', 'T', 'W', 'T', 'F', 'S', 'S'] 12564// Saturday start: ['S', 'S', 'M', 'T', 'W', 'T', 'F'] 12565``` 12566 12567**What Changes**: 12568- Week grid day letters 12569- Week grid date sequence 12570- Today/Tomorrow/Important event date ranges 12571- Week event grouping 12572 12573**What Stays Same**: 12574- All themes still work 12575- Event data unchanged 12576- Main calendar unaffected 12577 12578### How to Change: 12579 125801. Admin → Calendar → Themes tab 125812. Under "Week Start Day" section 125823. Select Monday or Saturday 125834. Click "Save Settings" 125845. Refresh sidebar to see changes 12585 12586**Perfect for international users or religious observances!** 12587 12588## Version 4.1.4 (2026-02-07) - WEEK STARTS SUNDAY & LIGHTER BACKGROUNDS 12589 12590### ️ Calendar Improvements 12591- **Changed:** Week grid now starts on Sunday and ends on Saturday (matches main calendar) 12592- **Changed:** Event section backgrounds much lighter (almost white) 12593- **Changed:** Individual event backgrounds lighter and more readable 12594- **Changed:** Event borders now theme-colored 12595 12596### Technical Details 12597 12598**Week Start Change**: 12599```php 12600// Before: 12601$weekStart = date('Y-m-d', strtotime('monday this week')); 12602$weekEnd = date('Y-m-d', strtotime('sunday this week')); 12603$dayNames = ['M', 'T', 'W', 'T', 'F', 'S', 'S']; 12604 12605// After: 12606$weekStart = date('Y-m-d', strtotime('sunday this week')); 12607$weekEnd = date('Y-m-d', strtotime('saturday this week')); 12608$dayNames = ['S', 'M', 'T', 'W', 'T', 'F', 'S']; 12609``` 12610 12611**Background Colors**: 12612```php 12613// Section backgrounds (Today, Tomorrow, Important): 12614Matrix: rgba(255, 255, 255, 0.05) // Very light overlay 12615Purple: rgba(255, 255, 255, 0.08) // Slightly lighter 12616Professional: rgba(255, 255, 255, 0.95) // Almost white! 12617 12618// Individual event backgrounds: 12619Matrix: rgba(255, 255, 255, 0.03) // Subtle 12620Purple: rgba(255, 255, 255, 0.05) // Light 12621Professional: rgba(255, 255, 255, 0.5) // Semi-transparent white 12622``` 12623 12624**Event Borders**: 12625```php 12626Matrix: rgba(0, 204, 7, 0.2) // Green 12627Purple: rgba(155, 89, 182, 0.2) // Purple 12628Professional: rgba(74, 144, 226, 0.2) // Blue 12629``` 12630 12631### Visual Result: 12632 12633**Before**: Dark backgrounds made text hard to read 12634**After**: Light backgrounds make events pop and text very readable 12635 12636**Week Grid**: 12637``` 12638Before: [M][T][W][T][F][S][S] 12639After: [S][M][T][W][T][F][S] ← Now matches main calendar! 12640``` 12641 12642## Version 4.1.3 (2026-02-07) - EVENT TEXT THEME COLORS 12643 12644### Final Theme Polish 12645- **Fixed:** Event titles in Today/Tomorrow/Important sections now use theme colors 12646- **Fixed:** Event times now use theme bright color 12647- **Fixed:** Event dates use theme dim color 12648- **Fixed:** Task checkboxes use theme bright color 12649- **Fixed:** Event color bars use theme-appropriate shadows 12650- **Fixed:** No text shadows on Professional theme 12651 12652### Technical Details 12653 12654**Event Text Colors**: 12655```php 12656// Matrix: 12657- Title: #00cc07 (green) 12658- Time: #00dd00 (bright green) 12659- Date: #00aa00 (dim green) 12660- Text shadow: 0 0 3px (glow) 12661 12662// Purple: 12663- Title: #b19cd9 (lavender) 12664- Time: #d4a5ff (bright purple) 12665- Date: #8e7ab8 (dim purple) 12666- Text shadow: 0 0 3px (glow) 12667 12668// Professional: 12669- Title: #2c3e50 (dark grey) 12670- Time: #4a90e2 (blue) 12671- Date: #7f8c8d (grey) 12672- Text shadow: none (clean) 12673``` 12674 12675**Color Bar Shadows**: 12676```php 12677// Matrix & Purple: Glow effect 12678box-shadow: 0 0 3px [event-color]; 12679 12680// Professional: Subtle shadow 12681box-shadow: 0 1px 2px rgba(0,0,0,0.2); 12682``` 12683 12684### What's Now Fully Themed: 12685 12686✅ Sidebar background & border 12687✅ Header (clock box) background, border, text 12688✅ Week grid background, borders, cells 12689✅ Week grid day letters & numbers 12690✅ Week grid event bars & "+N more" text 12691✅ Add Event button background & text 12692✅ Today/Tomorrow/Important event titles 12693✅ Event times 12694✅ Event dates (Important section) 12695✅ Task checkboxes 12696✅ Event color bars 12697✅ All text shadows (glow vs none) 12698 12699**Every single element now respects the theme!** 12700 12701## Version 4.1.2 (2026-02-07) - COMPLETE THEME INTEGRATION 12702 12703### Theme Improvements 12704- **Fixed:** Week calendar grid now uses theme colors (purple/blue) 12705- **Fixed:** Add Event button now uses theme colors 12706- **Fixed:** Clock box border now matches theme 12707- **Fixed:** All text shadows respect theme (no glow on professional) 12708- **Fixed:** Event bars use theme-appropriate shadows 12709 12710### Technical Details 12711 12712**Week Grid Theming**: 12713```php 12714// Matrix: Dark green (#1a3d1a) background, green (#00cc07) borders 12715// Purple: Dark purple (#3d2b4d) background, purple (#9b59b6) borders 12716// Professional: Light grey (#e8ecf1) background, blue (#4a90e2) borders 12717``` 12718 12719**Add Event Button**: 12720```php 12721// Matrix: Dark green (#006400) with bright green text 12722// Purple: Purple (#7d3c98) with lavender text 12723// Professional: Blue (#3498db) with white text 12724``` 12725 12726**Text Shadows**: 12727```php 12728// Matrix & Purple: Glow effects (text-shadow: 0 0 6px color) 12729// Professional: No glow (clean look) 12730``` 12731 12732**CSS Overrides**: 12733```css 12734/* Purple theme */ 12735.sidebar-purple .eventlist-today-header { 12736 border-color: #9b59b6; 12737 box-shadow: 0 0 8px rgba(155, 89, 182, 0.2); 12738} 12739 12740/* Professional theme */ 12741.sidebar-professional .eventlist-today-header { 12742 border-color: #4a90e2; 12743 box-shadow: 0 2px 4px rgba(0, 0, 0, 0.1); 12744} 12745``` 12746 12747### What Changed Per Theme: 12748 12749**Purple Dream**: 12750- Week grid: Purple borders and dark purple background 12751- Add Event: Purple button with lavender text 12752- Clock box: Purple border with purple glow 12753- Event bars: Purple glow instead of green 12754- All text: Purple/lavender shades 12755 12756**Professional Blue**: 12757- Week grid: Blue borders and light grey background 12758- Add Event: Blue button with white text 12759- Clock box: Blue border with subtle shadow (no glow) 12760- Event bars: Subtle shadows (no glow) 12761- All text: Dark grey and blue shades 12762 12763**Matrix Edition**: Unchanged (still perfect green theme!) 12764 12765## Version 4.1.1 (2026-02-07) - THEMES TAB & TOOLTIP LEFT POSITIONING 12766 12767### ✨ New Features 12768- **Added:** Themes tab in admin for sidebar widget theming 12769- **Added:** Three visual themes: Matrix (green), Purple Dream (purple), Professional Blue (blue/grey) 12770- **Added:** Theme selector with live previews 12771- **Added:** Theme persistence across page loads 12772 12773### Available Themes 12774 12775**Matrix Edition** (Default): 12776- Dark background (#242424) 12777- Green accents (#00cc07) 12778- Neon glow effects 12779- Original Matrix styling 12780 12781**Purple Dream**: 12782- Dark purple background (#2a2030) 12783- Purple/violet accents (#9b59b6) 12784- Elegant purple glow 12785- Rich purple color scheme 12786 12787**Professional Blue**: 12788- Light grey background (#f5f7fa) 12789- Blue accents (#4a90e2) 12790- Clean professional look 12791- Subtle shadows instead of glow 12792 12793### Bug Fix 12794- **Fixed:** Tooltips now go UP and to the LEFT (was going right) 12795- **Changed:** Tooltip offset from `rect.right` to `rect.left - 150px` 12796 12797### Technical Details 12798 12799**Theme System**: 12800```php 12801// Saved in: data/meta/calendar_theme.txt 12802// Applied dynamically in syntax.php 12803$theme = $this->getSidebarTheme(); // 'matrix', 'purple', or 'professional' 12804$styles = $this->getSidebarThemeStyles($theme); 12805 12806// Styles include: 12807- bg, border, shadow 12808- header_bg, header_border, header_shadow 12809- text_primary, text_bright, text_dim 12810- grid_bg, grid_border 12811- cell_bg, cell_today_bg 12812``` 12813 12814**Theme Changes**: 12815- Header background gradient 12816- Border colors 12817- Text colors 12818- Shadow/glow effects 12819- Grid colors 12820 12821**How to Change**: 128221. Admin → Calendar → Themes tab 128232. Select desired theme 128243. Click "Save Theme" 128254. Refresh page to see changes 12826 12827### Notes 12828- Themes only affect sidebar widget appearance 12829- Main calendar view unchanged 12830- Theme setting stored in `data/meta/calendar_theme.txt` 12831- Safe to switch themes - no data affected 12832 12833## Version 4.1.0 (2026-02-07) - FIX EVENT SORTING & TOOLTIP POSITIONING 12834 12835### Bug Fixes 12836- **Fixed:** Events now sort chronologically by time (was using string comparison) 12837- **Fixed:** Tooltip positioning using JavaScript like system tooltips 12838- **Fixed:** All-day events appear first, then events in time order 12839 12840### Technical Details 12841 12842**Event Sorting Fix**: 12843```php 12844// BROKEN (v4.0.9): 12845return strcmp($aTime, $bTime); 12846// String comparison: "10:00" < "8:00" because "1" < "8" 12847// Result: 10:00 AM shown BEFORE 8:00 AM ❌ 12848 12849// FIXED (v4.1.0): 12850$aMinutes = $this->timeToMinutes($aTime); // 8:00 = 480 12851$bMinutes = $this->timeToMinutes($bTime); // 10:00 = 600 12852return $aMinutes - $bMinutes; 12853// Result: 8:00 AM shown BEFORE 10:00 AM ✓ 12854``` 12855 12856**Example Before Fix**: 12857``` 12858 Weekend Ticket Duty (all-day) 128598:00 AM START TICKETS 1286010:00 AM Soul Winning ← Wrong! 128619:45 AM Coffee ← Should be before 10:00 AM 12862``` 12863 12864**Example After Fix**: 12865``` 12866 Weekend Ticket Duty (all-day) 128678:00 AM START TICKETS 128689:45 AM Coffee ← Correct! 1286910:00 AM Soul Winning 12870``` 12871 12872**Tooltip Positioning**: 12873- Added JavaScript to dynamically position tooltips using `getBoundingClientRect()` 12874- Uses CSS custom properties `--tooltip-left` and `--tooltip-top` 12875- Positioned on `mouseenter` event 12876- Matches system tooltip implementation (no cutoff) 12877 12878**JavaScript Implementation**: 12879```javascript 12880element.addEventListener("mouseenter", function() { 12881 const rect = element.getBoundingClientRect(); 12882 element.style.setProperty("--tooltip-left", (rect.right - 10) + "px"); 12883 element.style.setProperty("--tooltip-top", (rect.top - 30) + "px"); 12884}); 12885``` 12886 12887**Result**: Tooltips now extend beyond sidebar without cutoff, positioned dynamically! 12888 12889## Version 4.0.9 (2026-02-07) - COMPACT TOOLTIPS & OVERFLOW FIX 12890 12891### UI Improvements 12892- **Fixed:** Sidebar tooltips no longer cut off at sidebar edge 12893- **Fixed:** Changed inline `overflow:hidden` to `overflow:visible` in sidebar 12894- **Changed:** Main calendar conflict tooltip now much smaller (was too big) 12895 12896### Technical Details 12897 12898**Sidebar Overflow Fix**: 12899```php 12900// Before (line 2005): 12901style="...overflow:hidden..." // ← Blocked tooltips! 12902 12903// After: 12904style="...overflow:visible..." // ← Tooltips extend beyond! 12905``` 12906 12907**The Problem**: Inline `overflow:hidden` overrode CSS `overflow:visible !important` 12908 12909**Main Calendar Tooltip Size**: 12910```css 12911/* Before: */ 12912.conflict-tooltip { 12913 border: 2px solid #ff9800; 12914 border-radius: 6px; 12915 padding: 8px 12px; 12916 font-size: 12px; 12917 min-width: 200px; 12918 max-width: 350px; 12919} 12920 12921/* After: */ 12922.conflict-tooltip { 12923 border: 1px solid #ff9800; /* Thinner */ 12924 border-radius: 3px; /* Smaller */ 12925 padding: 4px 8px; /* Less padding */ 12926 font-size: 10px; /* Smaller header */ 12927 min-width: 120px; /* Narrower */ 12928 max-width: 200px; /* Narrower */ 12929} 12930 12931.conflict-tooltip-body { 12932 padding: 6px 8px; /* Was 10px 12px */ 12933 font-size: 9px; /* Was 11px */ 12934 line-height: 1.4; /* Was 1.6 */ 12935} 12936 12937.conflict-item { 12938 padding: 2px 0; /* Was 4px */ 12939 font-size: 9px; /* Added smaller font */ 12940} 12941``` 12942 12943**Result**: 12944- Main calendar tooltip ~50% smaller 12945- Sidebar tooltips now extend beyond borders 12946- Both tooltips compact and readable 12947 12948## Version 4.0.8 (2026-02-07) - FIX NEWLINES IN TOOLTIP 12949 12950### Bug Fix 12951- **Fixed:** Tooltip now shows actual line breaks (not literal `\n` text) 12952- **Changed:** Using HTML entity ` ` for newlines instead of `\n` 12953 12954### Technical Details 12955 12956**The Problem**: 12957```php 12958// Before (v4.0.7): 12959$conflictTooltip = 'Conflicts with:\n'; // Literal \n showed in tooltip 12960 12961// Displayed as: 12962"Conflicts with:\n• Event 1\n• Event 2" // ← Literal backslash-n 12963``` 12964 12965**The Fix**: 12966```php 12967// After (v4.0.8): 12968$conflictTooltip = "Conflicts with: "; // HTML entity for newline 12969 12970// Displays as: 12971Conflicts with: 12972• Event 1 12973• Event 2 12974``` 12975 12976**Why ` ` Works**: 12977- HTML entity for line feed character 12978- Works in data attributes 12979- CSS `white-space: pre-line` preserves the newlines 12980- Renders as actual line breaks in tooltip 12981 12982**Applied to**: 12983- PHP rendering (sidebar Today/Tomorrow/Important) 12984- JavaScript rendering (clicked day events) 12985 12986## Version 4.0.7 (2026-02-07) - COMPACT TOOLTIP & OVERFLOW FIX 12987 12988### UI Improvements 12989- **Changed:** Tooltip size reduced significantly (much more compact) 12990- **Fixed:** Tooltip now overflows sidebar borders (not cut off) 12991- **Changed:** Smaller padding (3px vs 6px), smaller font (9px vs 11px) 12992- **Changed:** Narrower width (120-200px vs 200-300px) 12993 12994### Technical Details 12995 12996**Tooltip Size Reduction**: 12997```css 12998/* Before (v4.0.6): 12999padding: 6px 10px; 13000font-size: 11px; 13001min-width: 200px; 13002max-width: 300px; 13003 13004/* After (v4.0.7): */ 13005padding: 3px 6px; 13006font-size: 9px; 13007min-width: 120px; 13008max-width: 200px; 13009``` 13010 13011**Overflow Fix**: 13012```css 13013/* Allow tooltip to extend beyond sidebar */ 13014.sidebar-widget, 13015.sidebar-matrix { 13016 overflow: visible !important; 13017} 13018 13019/* Position tooltip outside */ 13020[data-tooltip]:before { 13021 bottom: 120%; /* Further above */ 13022 right: -10px; /* Can extend beyond edge */ 13023 z-index: 10000; /* Always on top */ 13024} 13025``` 13026 13027**Visual Result**: 13028- Tooltip is ~40% smaller 13029- Extends beyond sidebar border if needed 13030- Still readable, just more compact 13031- Better for small screens 13032 13033## Version 4.0.6 (2026-02-07) - MATCH MAIN CALENDAR LOGIC & TOOLTIP POSITIONING 13034 13035### Critical Fix 13036- **Fixed:** Sidebar conflict detection now matches main calendar logic exactly 13037- **Fixed:** Checks both `end_time` (snake_case) and `endTime` (camelCase) field names 13038- **Fixed:** Events without end time now treated as zero-duration (not +1 hour) 13039- **Fixed:** Now matches what you see in main calendar view 13040 13041### ✨ UI Improvement 13042- **Changed:** Conflict tooltips now appear ABOVE and to the LEFT (not below/right) 13043- **Added:** Custom CSS tooltip with data-tooltip attribute 13044- **Improved:** Better tooltip positioning - doesn't overflow screen edges 13045 13046### Technical Details 13047 13048**The Problem - Field Name Mismatch**: 13049```php 13050// Main calendar (line 697): 13051$end1 = isset($evt1['endTime']) ? ... // ← Checks 'endTime' (camelCase) 13052 13053// Sidebar (before fix): 13054$endTime = isset($event['end_time']) ? ... // ← Only checked 'end_time' (snake_case) 13055``` 13056 13057**The Problem - Duration Logic**: 13058```php 13059// Main calendar (line 697): 13060$end1 = isset($evt1['endTime']) && !empty($evt1['endTime']) 13061 ? $evt1['endTime'] 13062 : $evt1['time']; // ← Uses START time (zero duration) 13063 13064// Sidebar (before fix): 13065$endTime = ... ? ... : $this->addHoursToTime($startTime, 1); // ← Added 1 hour! 13066``` 13067 13068**The Fix**: 13069```php 13070// Now checks BOTH field names: 13071if (isset($event['end_time']) && $event['end_time'] !== '') { 13072 $endTime = $event['end_time']; 13073} elseif (isset($event['endTime']) && $event['endTime'] !== '') { 13074 $endTime = $event['endTime']; 13075} else { 13076 $endTime = $startTime; // ← Matches main calendar! 13077} 13078``` 13079 13080**Tooltip Positioning**: 13081- Uses `data-tooltip` attribute instead of `title` 13082- CSS positions tooltip ABOVE badge (`bottom: 100%`) 13083- Aligns to RIGHT edge (`right: 0`) 13084- Arrow points down to badge 13085- Black background with white text 13086- Max width 300px 13087 13088### Example 13089 13090**6:00 PM Evening Service** (no end time): 13091- Old: 6:00 PM - 7:00 PM (assumed 1 hour) ❌ 13092- New: 6:00 PM - 6:00 PM (zero duration) ✓ Matches main calendar! 13093 13094**3:30 PM-7:00 PM Super Bowl** vs **6:00 PM Service**: 13095- Zero-duration events at 6:00 PM don't overlap with anything 13096- ONLY if service has explicit end time (e.g., 6:00-7:00) will it conflict 13097 13098**Tooltip appears**: 13099``` 13100 ┌────────────────────┐ 13101 │ Conflicts with: │ 13102 │ • Super Bowl │ 13103 │ (3:30 PM-7:00 PM)│ 13104 └─────────┬──────────┘ 13105 ▼ 13106 ⚠ 13107``` 13108 13109## Version 4.0.5 (2026-02-07) - FIX END_TIME DEFAULT HANDLING 13110 13111### Bug Fix 13112- **Fixed:** Events without end_time now properly get 1-hour default duration 13113- **Fixed:** Empty string end_time values now treated as missing (was causing issues) 13114- **Improved:** More robust checking for `end_time` field (checks both isset and not empty) 13115 13116### Technical Details 13117 13118**The Problem**: 13119```php 13120// Before (broken): 13121$endTime = isset($event['end_time']) ? $event['end_time'] : default; 13122 13123// If end_time exists but is empty string "": 13124isset($event['end_time']) = TRUE 13125$endTime = "" // ← Empty string, not default! 13126``` 13127 13128**The Fix**: 13129```php 13130// After (fixed): 13131$endTime = (isset($event['end_time']) && $event['end_time'] !== '') 13132 ? $event['end_time'] 13133 : $this->addHoursToTime($startTime, 1); 13134 13135// Now empty string gets the default 1-hour duration 13136``` 13137 13138**Why This Matters**: 13139Events like "6:00 PM Evening Service" with no end time should be treated as 6:00-7:00 PM (1 hour). If the `end_time` field contains an empty string instead of being absent, the old code would use the empty string, causing conflict detection to fail. 13140 13141**Example**: 13142``` 13143Super Bowl: 3:30 PM - 7:00 PM 13144Evening Service: 6:00 PM - ??? (should be 7:00 PM) 13145 13146If end_time = "" (empty string): 13147 Old code: Uses "" → conflict detection fails 13148 New code: Uses 7:00 PM → conflict detected ✓ 13149``` 13150 13151### Testing 13152If you're still not seeing the conflict on the 6:00 PM service: 131531. Check if the event has `end_time` set in the JSON 131542. Clear cache (Admin → Manage Events → Clear Cache) 131553. The conflict should now appear 13156 13157## Version 4.0.4 (2026-02-07) - CONFLICT TOOLTIP WITH DETAILS 13158 13159### ✨ Feature Added 13160- **Added:** Hover over ⚠ badge to see which events are conflicting 13161- **Added:** Tooltip shows conflicting event titles and times 13162- **Added:** Works in both sidebar sections and clicked day events 13163 13164### Technical Details 13165 13166**Conflict Tracking Enhanced**: 13167```php 13168// Now tracks WHICH events conflict: 13169$event['conflictingWith'] = [ 13170 ['title' => 'Meeting', 'time' => '10:00', 'end_time' => '11:00'], 13171 ['title' => 'Call', 'time' => '10:30', 'end_time' => '11:30'] 13172]; 13173``` 13174 13175**Tooltip Format**: 13176``` 13177Conflicts with: 13178• Meeting (10:00 AM-11:00 AM) 13179• Call (10:30 AM-11:30 PM) 13180``` 13181 13182**Where It Works**: 13183- ✅ Today section (sidebar) 13184- ✅ Tomorrow section (sidebar) 13185- ✅ Important Events section (sidebar) 13186- ✅ Clicked day events (week grid) 13187 13188**Cursor**: Changes to `help` cursor on hover to indicate tooltip 13189 13190### Note on Multi-Day Events 13191The current conflict detection only checks time conflicts **within the same day**. If you have an event that spans multiple days (e.g., start date on Monday, end date on Wednesday), each day is treated independently. To see conflicts across the entire span, you would need to check each individual day. 13192 13193## Version 4.0.3 (2026-02-07) - FIX CONFLICT BADGE & IMPORTANT EVENTS LOGIC 13194 13195### Bug Fixes 13196- **Fixed:** Conflict badge (⚠) now displays in sidebar Today/Tomorrow/Important sections 13197- **Fixed:** Important Events now shows events even if they're today or tomorrow 13198- **Fixed:** Field name mismatch - was checking `'conflicts'` (plural) but setting `'conflict'` (singular) 13199 13200### Technical Details 13201 13202**Conflict Badge Issue**: 13203```php 13204// BROKEN (line 2511): 13205$hasConflict = isset($event['conflicts']) && !empty($event['conflicts']); 13206// ↑ Checking 'conflicts' (plural) 13207 13208// But detectTimeConflicts() sets: 13209$event['conflict'] = true/false; 13210// ↑ Setting 'conflict' (singular) 13211 13212// FIXED: 13213$hasConflict = isset($event['conflict']) && $event['conflict']; 13214``` 13215 13216**Result**: Badge now shows for ALL conflicting events in sidebar sections 13217 13218**Important Events Logic Issue**: 13219```php 13220// BROKEN: 13221if ($dateKey === $todayStr) { 13222 $todayEvents[] = ...; 13223} elseif ($dateKey === $tomorrowStr) { 13224 $tomorrowEvents[] = ...; 13225} else { // ← Only checked if NOT today/tomorrow! 13226 if ($isImportant) { 13227 $importantEvents[] = ...; 13228 } 13229} 13230 13231// FIXED: 13232if ($dateKey === $todayStr) { 13233 $todayEvents[] = ...; 13234} 13235if ($dateKey === $tomorrowStr) { 13236 $tomorrowEvents[] = ...; 13237} 13238// ↑ Changed to separate 'if' statements 13239if ($isImportant && $dateKey in this week) { 13240 $importantEvents[] = ...; // ← Now includes today/tomorrow too! 13241} 13242``` 13243 13244**Result**: Important namespace events now show in Important section even if they're today or tomorrow 13245 13246### Conflict Badge Display 13247- Simplified to just ⚠ icon (no count) 13248- Orange color (#ff9800) 13249- 10px font size 13250- Hover shows "Time conflict detected" 13251 13252## Version 4.0.2 (2026-02-07) - FIX IMPORTANT EVENTS DISPLAY 13253 13254### Bug Fix 13255- **Fixed:** Important Events section now displays all events correctly 13256- **Fixed:** Single-event days now get conflict flag (was returning early without flag) 13257- **Fixed:** Conflict detection no longer causes events to disappear from Important section 13258 13259### Technical Details 13260 13261**The Problem**: 13262- `detectTimeConflicts()` returned early if only 1 event on a day 13263- Returned original array without adding 'conflict' field 13264- This inconsistency caused issues in event categorization 13265 13266**The Solution**: 13267```php 13268// Before (broken): 13269if (empty($dayEvents) || count($dayEvents) < 2) { 13270 return $dayEvents; // No 'conflict' field added! 13271} 13272 13273// After (fixed): 13274if (count($dayEvents) === 1) { 13275 return [array_merge($dayEvents[0], ['conflict' => false])]; // Always add flag 13276} 13277``` 13278 13279**Result**: 13280- All events now have 'conflict' field consistently 13281- Single events: conflict = false 13282- Multiple events: conflict = true/false based on overlap 13283- Important Events section displays correctly 13284 13285## Version 4.0.1 (2026-02-06) - CONFLICT DETECTION, TAB REORDER, FIXES 13286 13287### Bug Fixes 13288- **Fixed:** Conflict badge (⚠) now displays in clicked day events 13289- **Fixed:** Recurring events edit now updates time and end_time correctly 13290- **Fixed:** Field names changed from 'start'/'end' to 'time'/'end_time' in recurring edit 13291 13292### ✨ Features Added 13293- **Added:** Time conflict detection for overlapping events 13294- **Added:** detectTimeConflicts() function checks all events on same day 13295- **Added:** timesOverlap(), timeToMinutes(), addMinutesToTime() helper functions 13296- **Added:** Events now have 'conflict' flag set automatically 13297 13298### UI Changes 13299- **Changed:** Admin tab order: Manage Events (first), Update Plugin, ⚙️ Outlook Sync 13300- **Changed:** Default admin tab is now "Manage Events" (was "Update Plugin") 13301- **Changed:** Week view now shows 4 colored event bars before "+1" (was 3 bars) 13302 13303### Technical Details 13304 13305**Conflict Detection**: 13306```php 13307// Automatically detects overlapping events on same day 13308// Sets 'conflict' flag to true if event overlaps with another 13309$eventsWithConflicts = $this->detectTimeConflicts($dayEvents); 13310``` 13311 13312**Logic**: 13313- All-day events never conflict (no time set) 13314- Timed events check for overlap with other timed events 13315- Overlap = start1 < end2 AND start2 < end1 13316- Default duration is 60 minutes if no end_time 13317 13318**Recurring Events Fix**: 13319- Old: Updated `$event['start']` and `$event['end']` (wrong fields) 13320- New: Updates `$event['time']` and `$event['end_time']` (correct fields) 13321- Now edits actually save and update the events 13322 13323**Week View Bars**: 13324- Shows 4 colored bars instead of 3 13325- "+1" becomes "+2" with 5 events, "+3" with 6 events, etc. 13326 13327## Version 4.0.0 (2026-02-06) - MATRIX EDITION RELEASE 13328 13329**Major Release**: Complete Matrix-themed calendar plugin with advanced features! 13330 13331### Major Features 13332 13333#### Sidebar Widget 13334- **Week Grid**: Interactive 7-day calendar with click-to-view events 13335- **Live System Monitoring**: CPU load, real-time CPU, memory usage with tooltips 13336- **Live Clock**: Updates every second with date display 13337- **Real-time Weather**: Geolocation-based temperature with icon 13338- **Event Sections**: Today (orange), Tomorrow (green), Important (purple) 13339- **Add Event Button**: Dark green bar opens full event creation dialog 13340- **Matrix Theme**: Green glow effects throughout 13341 13342#### Event Management 13343- **Single Color Bars**: Clean 3px bars showing event's assigned color 13344- **All-Day Events First**: Then sorted chronologically by time 13345- **Conflict Detection**: Orange ⚠ badge on overlapping events 13346- **Rich Content**: Full DokuWiki formatting (**bold**, [[links]], //italic//) 13347- **HTML Rendering**: Pre-rendered for JavaScript display 13348- **Click-to-View**: Click week grid days to expand event details 13349 13350#### Admin Interface 13351- **Update Plugin Tab** (Default): Version info, changelog, prominent Clear Cache button 13352- **Outlook Sync Tab**: Microsoft Azure integration, category mapping, sync settings 13353- **Manage Events Tab**: Browse, edit, delete, move events across namespaces 13354 13355#### Outlook Sync 13356- **Bi-directional Sync**: DokuWiki ↔ Microsoft Outlook 13357- **Category Mapping**: Map colors to Outlook categories 13358- **Conflict Resolution**: Time conflict detection 13359- **Import/Export Config**: Encrypted configuration files 13360 13361### Design 13362- **Matrix Theme**: Authentic green glow aesthetic 13363- **Dark Backgrounds**: #1a1a1a header, rgba(36, 36, 36) sections 13364- **Color Scheme**: 13365 - Today: Orange #ff9800 13366 - Tomorrow: Green #4caf50 13367 - Important: Purple #9b59b6 13368 - Add Event: Dark green #006400 13369 - System bars: Green/Purple/Orange 13370 13371### Technical Highlights 13372- **Zero-margin Design**: Perfect flush alignment throughout 13373- **Flexbox Layout**: Modern, responsive structure 13374- **AJAX Operations**: No page reloads needed 13375- **Smart Sorting**: All-day events first, then chronological 13376- **Tooltip System**: Detailed stats on hover (working correctly) 13377- **Event Dialog**: Full form with drag support 13378- **Cache Management**: One-click cache clearing 13379 13380### Breaking Changes from v3.x 13381- Removed dual color bars (now single event color bar only) 13382- Add Event button moved to between header and week grid 13383- All-day events now appear FIRST (not last) 13384- Update Plugin tab is now the default admin tab 13385 13386### Bug Fixes (v3.10.x → v4.0.0) 13387- ✅ Fixed color bars not showing (align-self:stretch vs height:100%) 13388- ✅ Fixed tooltip function naming (sanitized calId for JavaScript) 13389- ✅ Fixed weather display (added updateWeather function) 13390- ✅ Fixed HTML rendering in events (title_html/description_html fields) 13391- ✅ Fixed Add Event dialog (null check for calendar element) 13392- ✅ Fixed text positioning in Add Event button 13393- ✅ Fixed spacing throughout sidebar widget 13394 13395### Complete Feature List 13396- Full calendar view (month grid) 13397- Sidebar widget (week view) 13398- Event panel (standalone) 13399- Event list (date ranges) 13400- Namespace support 13401- Color coding 13402- Time conflict detection 13403- DokuWiki syntax in events 13404- Outlook synchronization 13405- System monitoring 13406- Weather display 13407- Live clock 13408- Admin interface 13409- Cache management 13410- Draggable dialogs 13411- AJAX save/edit/delete 13412- Import/export config 13413 13414### Usage 13415 13416**Sidebar Widget**: 13417``` 13418{{calendar sidebar}} 13419{{calendar sidebar namespace=team}} 13420``` 13421 13422**Full Calendar**: 13423``` 13424{{calendar}} 13425{{calendar year=2026 month=6 namespace=team}} 13426``` 13427 13428**Event Panel**: 13429``` 13430{{eventpanel}} 13431``` 13432 13433**Event List**: 13434``` 13435{{eventlist daterange=2026-01-01:2026-01-31}} 13436``` 13437 13438### Stats 13439- **40+ versions** developed during v3.x iterations 13440- **3.10.0 → 3.11.4**: Polish and refinement 13441- **4.0.0**: Production-ready Matrix Edition 13442 13443### Credits 13444Massive iteration and refinement session resulting in a polished, feature-complete calendar plugin with authentic Matrix aesthetics and enterprise-grade Outlook integration. 13445 13446--- 13447 13448## Previous Versions (v3.11.4 and earlier) 13449 13450## Version 3.11.4 (2026-02-06) - RESTORE HEADER BOTTOM SPACING 13451- **Changed:** Restored 2px bottom padding to header (was 0px, now 2px) 13452- **Improved:** Small breathing room between system stats bars and Add Event button 13453- **Visual:** Better spacing for cleaner appearance 13454 13455### CSS Change: 13456**eventlist-today-header**: 13457- `padding: 6px 10px 0 10px` → `padding: 6px 10px 2px 10px` 13458 13459### Visual Result: 13460``` 13461│ ▓▓▓░░ ▓▓░░░ ▓▓▓▓░ │ ← Stats bars 13462│ │ ← 2px space (restored) 13463├───────────────────────┤ 13464│ + ADD EVENT │ ← Add Event bar 13465├───────────────────────┤ 13466``` 13467 13468**Before (v3.11.3)**: No space, bars directly touch Add Event button 13469**After (v3.11.4)**: 2px breathing room for better visual hierarchy 13470 13471## Version 3.11.3 (2026-02-06) - FIX ADD EVENT DIALOG & TEXT POSITION 13472- **Fixed:** openAddEvent() function now checks if calendar element exists before reading dataset 13473- **Fixed:** Add Event button no longer throws "Cannot read properties of null" error 13474- **Changed:** Add Event text moved up 1px (position:relative; top:-1px) 13475- **Changed:** Line-height reduced from 12px to 10px for better text centering 13476- **Improved:** openAddEvent() works for both regular calendars and sidebar widgets 13477 13478### JavaScript Fix: 13479**Problem**: Line 1084-1085 in calendar-main.js 13480```javascript 13481const calendar = document.getElementById(calId); 13482const filteredNamespace = calendar.dataset.filteredNamespace; // ← Null error! 13483``` 13484 13485**Solution**: Added null check 13486```javascript 13487const calendar = document.getElementById(calId); 13488const filteredNamespace = calendar ? calendar.dataset.filteredNamespace : null; 13489``` 13490 13491**Why This Happened**: 13492- Regular calendar has element with id=calId 13493- Sidebar widget doesn't have this element (different structure) 13494- Code tried to read .dataset on null, causing error 13495 13496### Text Position Fix: 13497**Before**: 13498- line-height: 12px 13499- vertical-align: middle 13500- Text slightly low 13501 13502**After**: 13503- line-height: 10px 13504- position: relative; top: -1px 13505- Text perfectly centered 13506 13507### What Works Now: 13508✅ Click "+ ADD EVENT" in sidebar → Dialog opens 13509✅ No console errors 13510✅ Text properly centered vertically 13511✅ Form pre-filled with today's date 13512✅ Save works correctly 13513 13514## Version 3.11.2 (2026-02-06) - ADD EVENT DIALOG IN SIDEBAR 13515- **Added:** Event dialog to sidebar widget (same as regular calendar) 13516- **Changed:** Add Event button now opens proper event form dialog 13517- **Added:** renderEventDialog() called in renderSidebarWidget() 13518- **Fixed:** Add Event button calls openAddEvent() with calId, namespace, and today's date 13519- **Improved:** Can now add events directly from sidebar widget 13520 13521### Add Event Button Behavior: 13522**Before (v3.11.1)**: Showed alert with instructions 13523**After (v3.11.2)**: Opens full event creation dialog 13524 13525**Dialog Features**: 13526- Date field (defaults to today) 13527- Title field (required) 13528- Time field (optional) 13529- End time field (optional) 13530- Color picker 13531- Category field 13532- Description field 13533- Save and Cancel buttons 13534- Draggable dialog 13535 13536### Technical Changes: 13537- Added `$html .= $this->renderEventDialog($calId, $namespace);` at end of renderSidebarWidget() 13538- Changed Add Event onclick from alert to `openAddEvent('calId', 'namespace', 'YYYY-MM-DD')` 13539- Dialog uses same structure as regular calendar 13540- Uses existing openAddEvent() and saveEventCompact() JavaScript functions 13541 13542### User Flow: 135431. User clicks "+ ADD EVENT" green bar 135442. Event dialog opens with today's date pre-filled 135453. User fills in event details 135464. User clicks Save 135475. Event saved via AJAX 135486. Dialog closes 135497. Sidebar refreshes to show new event 13550 13551## Version 3.11.1 (2026-02-06) - FLUSH HEADER & ADD EVENT DIALOG 13552- **Fixed:** Removed bottom padding from header (was 2px, now 0) 13553- **Fixed:** Removed margin from stats container (was margin-top:2px, now margin:0) 13554- **Fixed:** Add Event bar now flush against header with zero gap 13555- **Changed:** Add Event button now shows helpful alert dialog instead of navigating to admin 13556- **Improved:** Alert provides clear instructions on how to add events 13557 13558### CSS Changes: 13559**eventlist-today-header**: 13560- `padding: 6px 10px 2px 10px` → `padding: 6px 10px 0 10px` (removed 2px bottom) 13561 13562**eventlist-stats-container**: 13563- `margin-top: 2px` → `margin: 0` (removed all margins) 13564 13565### Add Event Button Behavior: 13566**Before**: Clicked → Navigated to Admin → Manage Events tab 13567**After**: Clicked → Shows alert with instructions 13568 13569**Alert Message**: 13570``` 13571To add an event, go to: 13572Admin → Calendar Management → Manage Events tab 13573or use the full calendar view {{calendar}} 13574``` 13575 13576### Visual Result: 13577``` 13578│ ▓▓▓░░ ▓▓░░░ ▓▓▓▓░ │ ← Stats (no margin-bottom) 13579├────────────────────────┤ 13580│ + ADD EVENT │ ← Perfectly flush! 13581├────────────────────────┤ 13582``` 13583 13584No gaps, perfectly aligned! 13585 13586## Version 3.11.0 (2026-02-06) - ADD EVENT BAR FINAL POSITION & SIZE 13587- **Moved:** Add Event bar back to original position (between header and week grid) 13588- **Changed:** Font size reduced from 9px to 8px (prevents text cutoff) 13589- **Changed:** Letter spacing reduced from 0.5px to 0.4px 13590- **Fixed:** Text now fully visible without being cut off 13591- **Final:** Optimal position and size determined 13592 13593### Final Layout: 13594``` 13595┌─────────────────────────────┐ 13596│ Clock | Weather | Stats │ ← Header 13597├─────────────────────────────┤ 13598│ + ADD EVENT │ ← Bar (back here, smaller text) 13599├─────────────────────────────┤ 13600│ M T W T F S S │ ← Week Grid 13601│ 3 4 5 6 7 8 9 │ 13602├─────────────────────────────┤ 13603│ Today │ ← Event sections 13604└─────────────────────────────┘ 13605``` 13606 13607### Text Size Changes: 13608**v3.10.9**: 9px font, 0.5px letter-spacing → Text slightly cut off 13609**v3.11.0**: 8px font, 0.4px letter-spacing → Text fully visible 13610 13611### Why This Position: 13612- Separates header from calendar 13613- Natural action point after viewing stats 13614- Users see stats → decide to add event → view calendar 13615- Consistent with original design intent 13616 13617## Version 3.10.9 (2026-02-06) - ADD EVENT BAR MOVED BELOW WEEK GRID 13618- **Moved:** Add Event bar repositioned from between header/grid to below week grid 13619- **Improved:** Better visual flow - header → stats → grid → add button → events 13620- **Changed:** Add Event bar now acts as separator between calendar and event sections 13621 13622### New Layout: 13623``` 13624┌─────────────────────────────┐ 13625│ Clock | Weather | Stats │ ← Header 13626├─────────────────────────────┤ 13627│ M T W T F S S │ ← Week Grid 13628│ 3 4 5 6 7 8 9 │ 13629├─────────────────────────────┤ 13630│ + ADD EVENT │ ← Add bar (moved here!) 13631├─────────────────────────────┤ 13632│ Today │ ← Event sections 13633│ Tomorrow │ 13634│ Important Events │ 13635└─────────────────────────────┘ 13636``` 13637 13638### Visual Flow: 13639**Before (v3.10.8)**: 136401. Header (clock, weather, stats) 136412. **+ ADD EVENT** bar 136423. Week grid 136434. Event sections 13644 13645**After (v3.10.9)**: 136461. Header (clock, weather, stats) 136472. Week grid (calendar days) 136483. **+ ADD EVENT** bar 136494. Event sections 13650 13651### Benefits: 13652- Natural reading flow: View calendar → Add event → See events 13653- Add button positioned between calendar and event list 13654- Acts as visual separator 13655- More logical action placement 13656 13657## Version 3.10.8 (2026-02-06) - SINGLE COLOR BAR & ZERO MARGIN ADD BAR 13658- **Removed:** Section color bar (blue/orange/green/purple) - now shows ONLY event color 13659- **Changed:** Events now display with single 3px color bar (event's assigned color only) 13660- **Fixed:** Add Event bar now has zero margin (margin:0) - touches header perfectly 13661- **Simplified:** Cleaner visual with one color bar instead of two 13662- **Improved:** More space for event content without extra bar 13663 13664### Visual Changes: 13665 13666**Before (v3.10.7)** - Dual color bars: 13667``` 13668├─ [Orange][Green] Event Title 13669├─ [Blue][Purple] Event Title 13670``` 13671 13672**After (v3.10.8)** - Single color bar: 13673``` 13674├─ [Green] Event Title ← Only event color! 13675├─ [Purple] Event Title ← Only event color! 13676``` 13677 13678### Add Bar Changes: 13679- Added `margin:0` to eliminate gaps 13680- Now flush against header (no space above) 13681- Now flush against week grid (no space below) 13682- Perfect seamless connection 13683 13684### Technical Changes: 13685**renderSidebarEvent()**: 13686- Removed section color bar (4px) 13687- Kept only event color bar (3px) 13688 13689**showDayEvents() JavaScript**: 13690- Removed section color bar (4px blue) 13691- Kept only event color bar (3px) 13692 13693**Add Event bar**: 13694- Added `margin:0` inline style 13695- Removed all top/bottom margins 13696 13697## Version 3.10.7 (2026-02-06) - COLOR BARS FIX FOR SECTIONS & DARK GREEN ADD BAR 13698- **Fixed:** Color bars now display in Today/Tomorrow/Important sections (was only showing in clicked day) 13699- **Fixed:** Changed Today/Tomorrow/Important event rendering to use `align-self:stretch` instead of `height:100%` 13700- **Changed:** Add Event bar color from orange to dark green (#006400) 13701- **Changed:** Add Event bar height increased from 6px to 12px (text no longer cut off) 13702- **Changed:** Add Event bar text now bright green (#00ff00) with green glow 13703- **Changed:** Add Event bar font size increased from 7px to 9px 13704- **Changed:** Add Event bar letter spacing increased to 0.5px 13705- **Improved:** Hover effect on Add Event bar now darker green (#004d00) 13706 13707### Color Bar Fix Details: 13708**Problem**: Today/Tomorrow/Important sections still used `height:100%` on color bars 13709**Solution**: Applied same fix as clicked day events: 13710- Changed parent div: `align-items:start` → `align-items:stretch` 13711- Added `min-height:20px` to parent 13712- Changed bars: `height:100%` → `align-self:stretch` 13713- Bars now properly fill vertical space in ALL sections 13714 13715### Add Event Bar Changes: 13716**Before**: 13717- Background: Orange (#ff9800) 13718- Text: Black (#000) 13719- Height: 6px (text cut off) 13720- Font: 7px 13721 13722**After**: 13723- Background: Dark green (#006400) 13724- Text: Bright green (#00ff00) with green glow 13725- Height: 12px (text fully visible) 13726- Font: 9px 13727- Hover: Darker green (#004d00) 13728- Matrix-themed green aesthetic 13729 13730## Version 3.10.6 (2026-02-06) - COLOR BARS FIX, SORTING REVERSAL, CONFLICT BADGE, README UPDATE 13731- **Fixed:** Event color bars now display correctly in clicked day events 13732- **Fixed:** Changed sorting - all-day events now appear FIRST, then timed events 13733- **Added:** Conflict badge (⚠) appears on right side of conflicting events 13734- **Updated:** Complete README.md rewrite with full Matrix theme documentation 13735- **Changed:** Color bars use `align-self:stretch` instead of `height:100%` (fixes rendering) 13736- **Changed:** Parent div uses `align-items:stretch` and `min-height:20px` 13737- **Improved:** Content wrapper now uses flexbox for proper conflict badge positioning 13738 13739### Color Bar Fix: 13740**Problem**: Bars had `height:100%` but parent had no explicit height 13741**Solution**: 13742- Changed to `align-self:stretch` on bars 13743- Parent uses `align-items:stretch` 13744- Added `min-height:20px` to parent 13745- Bars now properly fill vertical space 13746 13747### Sorting Change: 13748**Before**: Timed events first → All-day events last 13749**After**: All-day events FIRST → Timed events chronologically 13750 13751**Example**: 13752``` 13753Monday, Feb 5 13754├─ All Day - Project Deadline ← All-day first 13755├─ 8:00 AM - Morning Standup ← Earliest time 13756├─ 10:30 AM - Coffee with Bob 13757└─ 2:00 PM - Team Meeting ← Latest time 13758``` 13759 13760### Conflict Badge: 13761- Orange warning triangle (⚠) on right side 13762- 10px font size 13763- Only appears if `event.conflict` is true 13764- Title attribute shows "Time conflict detected" 13765- Small and unobtrusive 13766 13767### README Update: 13768- Complete rewrite with Matrix theme focus 13769- Full usage instructions for all features 13770- Admin interface documentation 13771- Outlook sync setup guide 13772- System monitoring details 13773- Troubleshooting section 13774- Color scheme reference 13775- File structure documentation 13776- Performance tips 13777- Security notes 13778- Quick start examples 13779 13780## Version 3.10.5 (2026-02-06) - TIME SORTING & THINNER ADD BAR 13781- **Added:** Events now sorted by time when clicking week grid days 13782- **Changed:** Add Event bar now ultra-thin (6px height, down from 12px) 13783- **Improved:** Events with times appear first, sorted chronologically 13784- **Improved:** All-day events appear after timed events 13785- **Changed:** Add Event bar font size reduced to 7px (from 10px) 13786- **Changed:** Add Event bar now has 0 padding and fixed 6px height 13787 13788### Sorting Logic: 13789- Events with times sorted by time (earliest first) 13790- All-day events (no time) appear at the end 13791- Sort algorithm: Convert time to minutes (HH:MM → total minutes) and compare 13792- Chronological order: 8:00 AM → 10:30 AM → 2:00 PM → All-day event 13793 13794### Add Event Bar Changes: 13795- **Height**: 6px (was ~12px with padding) 13796- **Padding**: 0 (was 4px top/bottom) 13797- **Font Size**: 7px (was 10px) 13798- **Letter Spacing**: 0.3px (was 0.5px) 13799- **Line Height**: 6px to match height 13800- **Vertical Align**: Middle for text centering 13801 13802## Version 3.10.4 (2026-02-06) - ADD EVENT BAR 13803- **Added:** Thin orange "Add Event" bar between header and week grid 13804- **Added:** Quick access to event creation from sidebar widget 13805- **Styled:** Sleek design with hover effects and glow 13806- **Interactive:** Clicks navigate to Manage Events tab in admin 13807- **Improved:** User workflow for adding events from sidebar 13808 13809### Visual Design: 13810- Orange background (#ff9800) matching Today section color 13811- 4px top/bottom padding for thin, sleek appearance 13812- Black text with white text-shadow for visibility 13813- Hover effect: Darkens to #ff7700 with enhanced glow 13814- Orange glow effect (box-shadow) matching Matrix theme 13815- Centered "+ ADD EVENT" text (10px, bold, letter-spacing) 13816 13817### Technical Changes: 13818- Added between header close and renderWeekGrid() call 13819- Inline onclick handler navigates to admin manage tab 13820- Inline onmouseover/onmouseout for hover effects 13821- Smooth 0.2s transition on all style changes 13822 13823## Version 3.10.3 (2026-02-06) - UI IMPROVEMENTS & CACHE BUTTON RELOCATION 13824- **Changed:** Update Plugin tab is now the default tab when opening admin 13825- **Moved:** Clear Cache button relocated from Outlook Sync tab to Update Plugin tab 13826- **Improved:** Clear Cache button now larger and more prominent with helpful description 13827- **Improved:** Tab order reorganized: Update Plugin (default) → Outlook Sync → Manage Events 13828- **Removed:** Debug console.log statements from day event display 13829- **Fixed:** Cache clear now redirects back to Update Plugin tab instead of Config tab 13830 13831### UI Changes: 13832- Update Plugin tab opens by default (was Config/Outlook Sync tab) 13833- Clear Cache button prominently displayed at top of Update Plugin tab 13834- Orange ️ button (10px 20px padding) with confirmation dialog 13835- Help text: "Clear the DokuWiki cache if changes aren't appearing or after updating the plugin" 13836- Success/error messages display on Update Plugin tab after cache clear 13837- Tab navigation reordered to put Update first 13838 13839### Technical Changes: 13840- Default tab changed from 'config' to 'update' in html() method 13841- Tab navigation HTML reordered to show Update Plugin tab first 13842- clearCache() method now redirects with 'update' tab parameter 13843- Removed Clear Cache button from renderConfigTab() 13844- Added Clear Cache button to renderUpdateTab() with message display 13845 13846## Version 3.10.2 (2026-02-06) - EVENT HTML RENDERING FIX 13847- **Fixed:** Event formatting (bold, links, italic) now displays correctly when clicking week grid days 13848- **Added:** renderDokuWikiToHtml() helper function to convert DokuWiki syntax to HTML 13849- **Changed:** Events in weekEvents now pre-rendered with title_html and description_html fields 13850- **Improved:** DokuWiki syntax (**bold**, [[links]], //italic//, etc.) properly rendered in clicked day events 13851 13852### Technical Changes: 13853- Added renderDokuWikiToHtml() private function using p_get_instructions() and p_render() 13854- Events added to weekEvents now include pre-rendered HTML versions 13855- title_html and description_html fields populated before json_encode() 13856- JavaScript now receives properly formatted HTML content 13857 13858## Version 3.10.1 (2026-02-06) - TOOLTIP FIX & WEATHER & CACHE BUTTON 13859- **Fixed:** System tooltip functions now use sanitized calId (showTooltip_sidebar_abc123 instead of showTooltip_sidebar-abc123) 13860- **Fixed:** HTML event handlers now call correctly sanitized function names 13861- **Fixed:** Weather temperature now updates correctly in sidebar widget 13862- **Added:** Weather update function to sidebar widget JavaScript 13863- **Added:** "Clear Cache" button in admin panel for easy cache refresh 13864- **Added:** Default weather location set to Irvine, CA when geolocation unavailable 13865- **Improved:** All tooltip functions now work correctly on system status bars 13866 13867### Technical Changes: 13868- Changed tooltip function names to use $jsCalId instead of $calId 13869- Changed HTML onmouseover/onmouseout to use $jsCalId 13870- Added updateWeather() function to sidebar widget 13871- Added getWeatherIcon() function to sidebar widget 13872- Added clearCache() method in admin.php 13873- Added recursiveDelete() helper method in admin.php 13874- Admin UI now has ️ Clear Cache button alongside Export/Import 13875 13876## Version 3.10.0 (2026-02-06) - JAVASCRIPT FIXES 13877- **Fixed:** JavaScript syntax error "Missing initializer in const declaration" 13878- **Fixed:** Event links and formatting not displaying in clicked day events 13879- **Fixed:** Sanitized calId to jsCalId by replacing dashes with underscores 13880- **Changed:** Event titles now use `title_html` field to preserve HTML formatting 13881- **Changed:** Event descriptions now use `description_html` field to preserve links and formatting 13882- **Improved:** All JavaScript variable names now use valid syntax 13883- **Improved:** Links, bold, italic, and other HTML formatting preserved in events 13884 13885### Technical Changes: 13886- Added variable sanitization: `$jsCalId = str_replace('-', '_', $calId);` 13887- JavaScript variables now use underscores instead of dashes 13888- Event HTML rendering preserves DokuWiki formatting 13889- Fixed "showTooltip_sidebar is not defined" errors 13890- Fixed "showDayEvents_cal is not defined" errors 13891 13892## Version 3.9.9 (2026-02-06) - JAVASCRIPT LOADING ORDER FIX 13893- **Fixed:** Critical JavaScript loading order issue causing ReferenceError 13894- **Fixed:** Functions now defined BEFORE HTML that uses them 13895- **Changed:** Consolidated all JavaScript into single comprehensive script block 13896- **Removed:** ~290 lines of duplicate JavaScript code 13897- **Added:** Shared state management with `sharedState_[calId]` object 13898- **Improved:** System tooltip functions now work correctly 13899- **Improved:** Week grid click events now work correctly 13900 13901### Technical Changes: 13902- Moved all JavaScript to beginning of widget (before HTML) 13903- Removed duplicate script blocks 13904- Unified tooltip and stats functions 13905- Shared latestStats and cpuHistory state 13906- Fixed "Uncaught ReferenceError: showTooltip_sidebar is not defined" 13907 13908## Version 3.9.8 (2026-02-05) - DUAL COLOR BARS & CLICK EVENTS 13909- **Added:** Dual color bars on events (section color + event color) 13910- **Added:** Click week grid days to view events (replaced hover tooltips) 13911- **Added:** Expandable section below week grid for selected day events 13912- **Added:** Blue theme for selected day section 13913- **Changed:** Week grid days now clickable instead of tooltips 13914- **Changed:** Section bar: 4px wide (left) 13915- **Changed:** Event bar: 3px wide (right) 13916- **Increased:** Gap between color bars from 3px to 6px 13917- **Improved:** Click is more reliable and mobile-friendly than hover tooltips 13918 13919### Visual Changes: 13920- Each event shows TWO color bars side-by-side 13921- Left bar (4px): Section context (Today=Orange, Tomorrow=Green, Important=Purple, Selected=Blue) 13922- Right bar (3px): Individual event's assigned color 13923- Click any day in week grid to expand event list 13924- X button to close selected day events 13925 13926## Version 3.9.7 (2026-02-05) - EVENT COLOR BAR VISIBILITY 13927- **Increased:** Event color bar width from 2px to 3px 13928- **Increased:** Gap between section and event bars from 3px to 6px 13929- **Improved:** Event color bars now more visible alongside section bars 13930- **Note:** Dual color bar system already in place from v3.9.6 13931 13932## Version 3.9.6 (2026-02-05) - UI REFINEMENTS 13933- **Changed:** Date in Important Events moved below event name (was above) 13934- **Changed:** Section headers now 9px font size (was 10px) 13935- **Changed:** Section headers now normal case (was ALL CAPS) 13936- **Changed:** Letter spacing reduced from 0.8px to 0.3px 13937- **Improved:** More natural reading flow with date below event name 13938- **Improved:** Cleaner, more subtle section headers 13939 13940### Header Changes: 13941- "TODAY" → "Today" 13942- "TOMORROW" → "Tomorrow" 13943- "IMPORTANT EVENTS" → "Important Events" 13944 13945## Version 3.9.0 (2026-02-05) - SIDEBAR WIDGET REDESIGN 13946- **Redesigned:** Complete overhaul of `sidebar` parameter 13947- **Added:** Compact week-at-a-glance itinerary view (200px wide) 13948- **Added:** Live clock widget at top of sidebar 13949- **Added:** 7-cell week grid showing event bars 13950- **Added:** Today section with orange header and left border 13951- **Added:** Tomorrow section with green header and left border 13952- **Added:** Important Events section with purple header and left border 13953- **Added:** Admin setting to configure important namespaces 13954- **Added:** Time conflict badges in sidebar events 13955- **Added:** Task checkboxes in sidebar events 13956- **Changed:** Sidebar now optimized for narrow spaces (200px) 13957- **Improved:** Perfect for dashboards, page sidebars, and quick glance widgets 13958 13959### New Features: 13960- Clock updates every second showing current time 13961- Week grid shows Mon-Sun with colored event bars 13962- Today/Tomorrow sections show full event details 13963- Important events highlighted in purple (configurable namespaces) 13964- All badges (conflict, time, etc.) shown in compact format 13965- Automatic time conflict detection 13966 13967## Version 3.8.0 (2026-02-05) - PRODUCTION CLEANUP 13968- **Removed:** 16 unused/debug/backup files 13969- **Removed:** 69 console.log() debug statements 13970- **Removed:** 3 orphaned object literals from console.log removal 13971- **Removed:** Temporary comments and markers 13972- **Fixed:** JavaScript syntax errors from cleanup 13973- **Improved:** Code quality and maintainability 13974- **Improved:** Reduced plugin size by removing unnecessary files 13975- **Status:** Production-ready, fully cleaned codebase 13976 13977### Files Removed: 13978- style.css.backup, script.js.backup 13979- admin_old_backup.php, admin_minimal.php, admin_new.php, admin_clean.php 13980- debug_events.php, debug_html.php, cleanup_events.php 13981- fix_corrupted_json.php, fix_wildcard_namespaces.php 13982- find_outlook_duplicates.php, update_namespace.php 13983- validate_calendar_json.php, admin.js 13984- test_date_field.html 13985 13986## Version 3.7.5 (2026-02-05) 13987- **Fixed:** PHP syntax error (duplicate foreach loop removed) 13988- **Fixed:** Time variable handling in grace period logic 13989 13990## Version 3.7.4 (2026-02-05) 13991- **Added:** 15-minute grace period for timed events 13992- **Changed:** Events with times now stay visible for 15 minutes after their start time 13993- **Changed:** Prevents events from immediately disappearing when they start 13994- **Improved:** Better user experience for ongoing events 13995- **Fixed:** Events from earlier today now properly handled with grace period 13996 13997## Version 3.7.3 (2026-02-05) 13998- **Changed:** Complete redesign of cleanup section for compact, sleek layout 13999- **Changed:** Radio buttons now in single row at top 14000- **Changed:** All options visible with grayed-out inactive states (opacity 0.4) 14001- **Changed:** Inline controls - no more grid layout or wrapper boxes 14002- **Changed:** Namespace filter now compact single-line input 14003- **Changed:** Smaller buttons and tighter spacing throughout 14004- **Improved:** More professional, space-efficient design 14005 14006## Version 3.7.2 (2026-02-04) 14007- **Fixed:** Strange boxes under cleanup options - now properly hidden 14008- **Changed:** Unified color scheme across all admin sections 14009- **Changed:** Green (#00cc07) - Primary actions and main theme 14010- **Changed:** Orange (#ff9800) - Warnings and cleanup features 14011- **Changed:** Purple (#7b1fa2) - Secondary actions and accents 14012- **Improved:** Consistent visual design throughout admin interface 14013 14014## Version 3.7.1 (2026-02-04) 14015- **Fixed:** Cleanup section background changed from orange to white 14016- **Fixed:** Event cleanup now properly scans all calendar directories 14017- **Added:** Debug info display when preview finds no events 14018- **Improved:** Better directory scanning logic matching other features 14019 14020## Version 3.7.0 (2026-02-04) 14021- **Added:** Event cleanup feature in Events Manager 14022- **Added:** Delete old events by age (months/years old) 14023- **Added:** Delete events by status (completed tasks, past events) 14024- **Added:** Delete events by date range 14025- **Added:** Namespace filter for targeted cleanup 14026- **Added:** Preview function to see what will be deleted 14027- **Added:** Automatic backup creation before cleanup 14028- **Changed:** Reduced changelog viewer height to 100px (was 400px) 14029 14030## Version 3.6.3 (2026-02-04) 14031- **Fixed:** Conflict tooltips now work properly after navigating between months 14032- **Added:** Changelog display in Update Plugin tab 14033- **Added:** CHANGELOG.md file with version history 14034- **Improved:** Changelog shows last 10 versions with color-coded change types 14035- **Fixed:** Removed debug console.log statements 14036 14037## Version 3.6.2 (2026-02-04) 14038- **Fixed:** Month title now updates correctly when navigating between months 14039- **Changed:** All eventpanel header elements reduced by 10% for more compact design 14040- **Changed:** Reduced header height from 78px to 70px 14041 14042## Version 3.6.1 (2026-02-04) 14043- **Changed:** Complete redesign of eventpanel header with practical two-row layout 14044- **Fixed:** Improved layout for narrow widths (~500px) 14045- **Changed:** Simplified color scheme (removed purple gradient) 14046 14047## Version 3.6.0 (2026-02-04) 14048- **Changed:** Redesigned eventpanel header with gradient background 14049- **Changed:** Consolidated multiple header rows into compact single-row design 14050 14051## Version 3.5.1 (2026-02-04) 14052- **Changed:** Moved event search bar into header row next to + Add button 14053- **Improved:** More compact UI with search integrated into header 14054 14055## Version 3.5.0 (2026-02-04) 14056- **Added:** Event search functionality in sidebar and eventpanel 14057- **Added:** Real-time filtering as you type 14058- **Added:** Clear button (✕) appears when searching 14059- **Added:** "No results" message when search returns nothing 14060 14061## Version 3.4.7 (2026-02-04) 14062- **Changed:** Made conflict badges smaller and more subtle (9px font, less padding) 14063- **Fixed:** Removed debug logging from console 14064- **Changed:** Updated export version number to match plugin version 14065 14066## Version 3.4.6 (2026-02-04) 14067- **Added:** Debug logging to diagnose conflict detection issues 14068- **Development:** Extensive console logging for troubleshooting 14069 14070## Version 3.4.5 (2026-02-04) 14071- **Added:** Debug logging to showDayPopup and conflict detection 14072- **Development:** Added logging to trace conflict detection flow 14073 14074## Version 3.4.4 (2026-02-04) 14075- **Fixed:** Conflict detection now persists across page refreshes (PHP-based) 14076- **Fixed:** Conflict tooltips now appear on hover 14077- **Added:** Dual conflict detection (PHP for initial load, JavaScript for navigation) 14078- **Added:** Conflict badges in both future and past events sections 14079 14080## Version 3.4.3 (2026-02-04) 14081- **Added:** Custom styled conflict tooltips with hover functionality 14082- **Changed:** Conflict badge shows count of conflicts (e.g., ⚠️ 2) 14083- **Improved:** Beautiful tooltip design with orange header and clean formatting 14084 14085## Version 3.4.2 (2026-02-04) 14086- **Fixed:** Attempted to fix tooltip newlines (reverted in 3.4.3) 14087 14088## Version 3.4.1 (2026-02-04) 14089- **Fixed:** End time field now properly saves to database 14090- **Fixed:** End time dropdown now filters to show only valid times after start time 14091- **Added:** Smart dropdown behavior - expands on focus, filters invalid options 14092- **Improved:** End time auto-suggests +1 hour when start time selected 14093 14094## Version 3.4.0 (2026-02-04) 14095- **Added:** End time support for events (start and end times) 14096- **Added:** Automatic time conflict detection 14097- **Added:** Conflict warning badges (⚠️) on events with overlapping times 14098- **Added:** Conflict tooltips showing which events conflict 14099- **Added:** Visual conflict indicators with pulse animation 14100- **Changed:** Time display now shows ranges (e.g., "2:00 PM - 4:00 PM") 14101 14102## Version 3.3.77 (2026-02-04) 14103- **Fixed:** Namespace badge onclick handlers restored after clearing filter 14104- **Fixed:** Namespace filtering works infinitely (filter → clear → filter) 14105 14106## Version 3.3.76 (2026-02-04) 14107- **Fixed:** Namespace badges now clickable after clearing namespace filter 14108 14109## Version 3.3.75 (2026-02-04) 14110- **Fixed:** Form resubmission warnings eliminated 14111- **Improved:** Implemented proper POST-Redirect-GET pattern with HTTP 303 14112- **Changed:** All admin redirects now use absolute URLs 14113 14114## Version 3.3.74 (2026-02-04) 14115- **Fixed:** Clearing namespace filter now restores original namespace instead of default 14116- **Added:** data-original-namespace attribute to preserve initial namespace setting 14117- **Improved:** Console logging for namespace filter debugging 14118 14119## Version 3.3.73 (2026-02-03) 14120- **Added:** Dynamic namespace filtering banner with clear button 14121- **Fixed:** JavaScript function accessibility issues 14122- **Fixed:** Namespace badge click handlers in event lists 14123- **Improved:** Persistent namespace filtering across views 14124 14125## Earlier Versions 14126See previous transcripts for complete history through v3.3.73, including: 14127- Recurring events with Outlook sync 14128- Multi-namespace support 14129- Event categories and mapping 14130- Backup/restore functionality 14131- System statistics bar 14132- Namespace selector with fuzzy search 14133- Events Manager with import/export 14134- And much more... 14135