1# Calendar Plugin Changelog 2 3## Version 7.6.0 (2026-04-05) 4 5Major release: multi-day event bar alignment, extended range parameter, CSRF compatibility fix, farm compatibility, and security hardening. 6 7### New Features 8 9**Extended Range Parameter for Event Lists** 10- `{{eventlist range=>3m}}` — show events for the next 3 months 11- `{{eventlist range=>100d}}` — next 100 days 12- `{{eventlist range=>2w}}` — next 2 weeks 13- `{{eventlist range=>1y}}` — next 1 year 14- Supports units: `d` (days), `w` (weeks), `m` (months), `y` (years) 15- Headers are localized (EN/DE/CS) 16- All extended ranges include a 30-day lookback for past-due tasks 17 18**Multi-Day Event Bar Alignment** 19- Events spanning multiple days now display as continuous bars at consistent vertical positions across the calendar grid 20- Stable slot assignment algorithm: multi-day events reserve a row across all days they span 21- Single-day events fill remaining slots, sorted by time 22- Invisible spacer elements maintain alignment on days where a slot is unused 23- Algorithm runs in both PHP (initial page load) and JS (AJAX navigation) 24 25**Namespace Exclude Parameter** 26- `{{calendar namespace=* exclude=journal}}` — hide specific namespaces from wildcard views 27- `{{calendar namespace=* exclude="journal;drafts"}}` — exclude multiple (semicolon-separated) 28- Supports exact and prefix matching: `exclude=journal` also hides `journal:daily`, `journal:notes` 29- Works with `{{calendar}}`, `{{eventpanel}}`, and `{{eventlist}}` 30- Preserved across AJAX navigation and all-dates search 31 32**Default Search Scope Setting** 33- New admin setting (Themes tab) to default the search bar to "This Month" or "All Dates" 34- Users can still toggle per-session with the / button 35- Stored in `data/meta/calendar_search_default.txt` 36 37### DokuWiki Farm Compatibility 38 39**Data Path Migration** 40- Replaced 77 hardcoded `DOKU_INC . 'data/meta/'` references with `$conf['metadir']` across 8 files 41- Cache paths now use `$conf['cachedir']` (EventCache, RateLimiter, clearCache) 42- All temp files (`.event_stats_cache`, `.sync_abort`) moved from shared plugin dir to per-animal data dir 43- Added `metaDir()` helper to syntax, action, and admin plugin classes 44 45**Per-Animal Sync Credentials** 46- `sync_config.php` now checked in `$conf['metadir']/calendar/` first (per-animal), falls back to `DOKU_PLUGIN` (shared) 47- Added `syncConfigPath()` helper with fallback logic 48- Google OAuth tokens already stored per-animal in `$conf['metadir']` 49 50**CLI Sync Safety** 51- `sync_outlook.php` bootstraps DokuWiki with `NOSESSION` for CLI safety 52- Defensive fallback for `$conf['metadir']` when not set 53- Cron jobs should run as `www-data`, not root, to avoid file ownership issues 54 55### Security Hardening 56 57**ACL Enforcement on All AJAX Endpoints** 58- Read operations (`load_month`, `get_event`, `get_static_calendar`, `search_all`) verify `AUTH_READ` 59- Write operations (`save_event`, `delete_event`, `toggle_task`) verify `AUTH_EDIT` 60- Wildcard/multi-namespace views silently filter out namespaces the user cannot access 61- Applied to both server-side rendering (syntax.php) and AJAX paths (action.php) 62 63**CSRF Protection on Admin Panel** 64- Added `checkSecurityToken()` validation to the admin `handle()` method 65- Added `formSecurityToken()` to all 12 HTML forms 66- Added `JSINFO.sectok` hidden input to all 11 JavaScript-generated forms 67 68**JSINFO.sectok Compatibility** 69- Fixed CSRF token failures on DokuWiki "Librarian" and other versions that don't auto-populate `JSINFO.sectok` 70- `addAssets()` now injects the security token via inline script before `calendar-main.js` loads 71- Ensures `getSecurityToken()` always has a valid token regardless of DokuWiki version or template 72 73**Removed System Stats Endpoint** 74- 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 75- Removed admin UI section, CSS, and save/load methods 76- System load inline JS remains but never executes (`getShowSystemLoad()` returns `false`) 77 78### Bug Fixes 79 80**Weekly Recurring Events on Sunday Created 365 Daily Events** 81- 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 82- Fixed: strict comparison `($weekDaysStr !== '')` instead of truthy check 83 84**Memory Exhaustion on Large Wikis (namespace=*)** 85- Replaced recursive `findSubNamespaces` (which scanned every directory in `data/meta/`) with `findCalendarNamespaces` using iterative `glob()` to locate `calendar/` directories directly 86- On a wiki with 5,000 pages: old approach scanned 5,000+ dirs; new approach runs ~10 glob calls 87 88**Page Load Crash: "Cannot read properties of null"** 89- ARIA live region creation ran before `document.body` existed (script loaded in `<head>`) 90- Wrapped in deferred function that waits for `DOMContentLoaded` 91 92**JS Cache Busting** 93- `script.js` was using `Date.now()` as cache buster, forcing fresh HTTP requests on every page load 94- Changed to version-based `?v=7.2.1` 95 96### Housekeeping 97- Updated `@version` docblocks across all PHP files 98- Added localized strings (EN/DE/CS) for exclude and search scope features 99- Template `style.ini` lookups now check `$conf['savedir']` for farm-specific overrides 100 101### Migration Notes 102 103**From 7.0.x (non-farm):** No action needed — paths resolve to the same location. 104 105**Farm setups:** Calendar data stays in the master wiki's `data/meta/`. Move per-animal data manually: 106```bash 107mv /path/to/master/data/meta/calendar/ /path/to/animal/data/meta/calendar/ 108mv /path/to/master/data/meta/calendar_*.txt /path/to/animal/data/meta/ 109``` 110 111**Cleanup:** The file `calendar_show_system_load.txt` in your data directory can be safely deleted. 112 113--- 114 115## Version 7.0.8 (2026-02-15) - TIMEZONE FIX 116 117### Bug Fix: Date Shift in Non-UTC Timezones 118Fixed critical bug where events appeared shifted by one day in timezones ahead of UTC (e.g., Europe/Prague UTC+1). 119 120**Root Cause:** 121JavaScript'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. 122 123**Fix:** 124Added `formatLocalDate(date)` helper function that formats dates using local time methods (`getFullYear()`, `getMonth()`, `getDate()`) instead of UTC conversion. 125 126**Affected Areas (now fixed):** 127- Multi-day event spanning (line 385) 128- Today string calculation in event list (line 566) 129- Past event detection in event items (line 1022) 130 131### Files Modified 132- `calendar-main.js` - Added `formatLocalDate()` helper, replaced 3 `toISOString().split('T')[0]` calls 133 134--- 135 136## Version 7.0.7 (2026-02-15) - GOOGLE CALENDAR SYNC 137 138### Google Calendar Integration 139- Two-way sync with Google Calendar via OAuth 2.0 140- Import events from Google Calendar to DokuWiki 141- Export events from DokuWiki to Google Calendar 142- Support for all-day and timed events 143- Multi-day event handling 144- Color mapping between Google and DokuWiki 145- Duplicate detection prevents re-importing same events 146- Select which Google calendar to sync with 147- Admin panel UI for configuration and sync controls 148 149### Setup Requirements 150- Google Cloud Console project 151- Google Calendar API enabled 152- OAuth 2.0 Web Application credentials 153- Redirect URI configuration 154 155### New Files 156- `classes/GoogleCalendarSync.php` - OAuth and Calendar API integration 157 158### Files Modified 159- `action.php` - Added Google sync action handlers 160- `admin.php` - Added Google sync admin tab 161 162--- 163 164## Version 7.0.6 (2026-02-15) - ACCESSIBILITY IMPROVEMENTS 165 166### Screen Reader Support 167- Added ARIA live region for dynamic announcements 168- Announces "Event created", "Event updated", "Event deleted" on actions 169- Announces "Task marked complete/incomplete" on toggle 170- Screen readers receive feedback without visual alerts 171 172### Debug Mode 173- Added `CALENDAR_DEBUG` flag for JavaScript console logging 174- `calendarLog()` and `calendarError()` helper functions 175- Debug output disabled by default 176 177### Code Quality 178- Consistent error handling patterns 179- Better separation of concerns 180 181### Files Modified 182- `calendar-main.js` - ARIA live region, debug helpers, announcements 183 184--- 185 186## Version 7.0.5 (2026-02-15) - AUDIT LOGGING & ACCESSIBILITY 187 188### Audit Logging 189- New `AuditLogger.php` class for compliance logging 190- Logs all event modifications: create, update, delete, move, task toggle 191- JSON-formatted log files with timestamps, user info, and IP addresses 192- Automatic log rotation (5MB max, 10 files retained) 193- Log entries include: namespace, date, event ID, title, and change details 194 195### Keyboard Navigation (Accessibility) 196- Arrow keys navigate between calendar days 197- Enter/Space activates focused day (opens popup) 198- Arrow Up/Down navigates between events in popups 199- Enter on event opens edit dialog 200- Delete/Backspace on event triggers delete 201- Escape closes all dialogs, popups, and dropdowns 202- Added `tabindex` and `role` attributes for screen readers 203- Added `aria-label` descriptions for calendar days and events 204 205### CSS Focus States 206- Visible focus indicators on calendar days 207- Focus styles on event items in popups 208- Focus styles on custom date/time pickers 209- Uses `focus-visible` for keyboard-only focus rings 210 211### Files Added 212- `classes/AuditLogger.php` - Compliance audit logging 213 214### Files Modified 215- `action.php` - Integrated audit logging for all event operations 216- `calendar-main.js` - Extended keyboard navigation 217- `syntax.php` - Added accessibility attributes to calendar cells 218- `style.css` - Added focus state styles 219 220--- 221 222## Version 7.0.4 (2026-02-15) - CODE CLEANUP 223 224### Code Cleanup 225- Removed unused `calendarDebounce()` and `calendarThrottle()` utility functions 226- Removed duplicate `updateEndTimeOptions()` function definition 227- Removed unused `_calendarSelectOpen` tracking variable 228- Removed orphaned `.input-date` and `.time-select` CSS (no longer using native inputs) 229- Consolidated legacy function calls 230 231### Improvements 232- End date picker now opens to start date's month when no end date is selected 233- End time picker now scrolls to first available time after start time 234 235### Files Modified 236- `calendar-main.js` - Removed ~40 lines of dead code 237- `style.css` - Removed ~25 lines of unused CSS 238 239--- 240 241## Version 7.0.3 (2026-02-15) - CUSTOM DATE & TIME PICKERS 242 243### Complete Replacement of Native Browser Controls 244Both date inputs and time selects have been replaced with custom, lightweight pickers to eliminate all browser-related performance issues. 245 246#### Custom Date Picker 247- **Mini calendar grid** - Clean monthly view with day selection 248- **Month navigation** - Previous/next buttons for quick browsing 249- **Visual indicators** - Today highlighted, selected date marked 250- **End date validation** - Cannot select end date before start date 251- **Clear button** - Easy removal of optional end date 252 253#### Custom Time Picker (from v7.0.2) 254- **Period groupings** - Morning, Afternoon, Evening, Night 255- **Lazy loading** - Options built only when dropdown opens 256- **Smart filtering** - End times after start time only 257 258#### Code Cleanup 259- Removed old `setupSelectTracking()` function (was causing conflicts) 260- Removed redundant event listener code 261- Unified dropdown close handling for all picker types 262- No native `<input type="date">` or `<select>` elements in event dialog 263 264### Files Modified 265- `syntax.php` - New date picker HTML structure 266- `calendar-main.js` - Custom date picker JavaScript, cleanup 267- `style.css` - Date picker calendar grid styles 268 269--- 270 271## Version 7.0.2 (2026-02-15) - CUSTOM TIME PICKER 272 273### Major Fix: Replaced Native Selects with Custom Time Pickers 274The native `<select>` element with 97 time options was causing browser freezes when opening. This version replaces them with lightweight custom dropdown pickers. 275 276#### New Custom Time Picker Features 277- **Instant opening** - No browser rendering delay 278- **Lazy-loaded options** - Dropdown HTML built only when clicked 279- **Period grouping** - Morning, Afternoon, Evening, Night sections 280- **Smart filtering** - End time options automatically hide times before start time 281- **Visual feedback** - Selected time highlighted, disabled times grayed out 282 283#### Technical Changes 284- Replaced `<select>` elements with `<button>` + `<div>` dropdown 285- Hidden `<input>` stores actual value for form submission 286- Time data pre-computed once, reused for all pickers 287- Event delegation for option clicks 288- Automatic cleanup when clicking outside 289 290#### Removed 291- Native `<select>` time pickers (caused 2600ms+ freezes) 292- `onchange` handlers from date inputs (handled in JS now) 293- Old `setupSelectTracking()` function 294 295### Files Modified 296- `syntax.php` - New time picker HTML structure 297- `calendar-main.js` - Custom time picker JavaScript 298- `style.css` - Time picker dropdown styles 299 300--- 301 302## Version 7.0.1 (2026-02-15) - SELECTOR FLICKER FIX 303 304### Bug Fixes 305- **Fixed selector flicker on subsequent clicks** - Time/date selectors no longer flash or lag after first use 306 - New `setupSelectTracking()` prevents DOM updates while selector is open 307 - Tracks mousedown/focus/blur/change events on all form inputs 308 - Uses `requestAnimationFrame` for smooth visual updates 309 - Added state caching to skip redundant DOM manipulation 310 311### CSS Improvements 312- Changed `transition: all` to specific properties on `.input-sleek` elements 313- Added `transition: none` for select options 314- Prevents browser reflow issues during dropdown rendering 315 316--- 317 318## Version 7.0.0 (2026-02-15) - STABILITY & PERFORMANCE RELEASE 319 320### Major Improvements 321 322#### File Locking & Atomic Writes (Critical Stability Fix) 323- **New `CalendarFileHandler` class** with atomic file operations 324- Prevents data corruption from concurrent event saves 325- Uses temp file + atomic rename strategy for safe writes 326- Implements `flock()` for proper file locking during reads/writes 327- Graceful handling of lock acquisition failures with retries 328 329#### Caching Layer (Performance Improvement) 330- **New `CalendarEventCache` class** for event data caching 331- 5-minute TTL reduces unnecessary JSON file reads 332- In-memory caching for current request 333- Automatic cache invalidation on event modifications 334- Cache cleanup for expired entries 335 336#### Rate Limiting (Security Enhancement) 337- **New `CalendarRateLimiter` class** for AJAX endpoint protection 338- 60 requests/minute for read actions 339- 30 requests/minute for write actions (more restrictive) 340- Per-user tracking (falls back to IP for anonymous) 341- Rate limit headers in responses (X-RateLimit-Limit, X-RateLimit-Remaining) 342- Automatic cleanup of old rate limit data 343 344#### Code Refactoring 345- **New `CalendarEventManager` class** consolidating CRUD operations 346- New `classes/` directory for organized code structure 347- Reduced code duplication across files 348- Improved separation of concerns 349- Better maintainability for future development 350 351#### JavaScript Performance Fixes (Dialog Responsiveness) 352- **Fixed slow time selector** - End time dropdown now opens instantly 353 - Replaced `Array.from().forEach()` with direct `options` loop (97 options) 354 - Single-pass algorithm instead of multiple iterations 355 - Uses `hidden` property instead of `style.display` manipulation 356- **Fixed event listener accumulation** - Dialog inputs no longer slow down over time 357 - Added `data-initialized` flag to prevent re-binding listeners 358 - Namespace search only initializes once per calendar 359- **Fixed selector flicker on subsequent clicks** 360 - New `setupSelectTracking()` function prevents DOM updates while selector is open 361 - Tracks mousedown/focus/blur/change events on time and date inputs 362 - Uses `requestAnimationFrame` instead of `setTimeout` for visual updates 363 - Added state caching to skip redundant DOM updates 364- **Fixed CSS transition interference** 365 - Changed `transition: all` to specific properties on form inputs 366 - Added explicit `transition: none` for select options 367 - Prevents browser reflow issues during dropdown rendering 368 369### Branding Changes 370- Removed "Matrix Edition" from plugin name and all references 371- Plugin is now simply "Calendar Plugin" 372- Matrix theme remains available (now called just "Matrix") 373 374### Technical Details 375- All JSON file operations now use atomic writes 376- Event saves protected against race conditions 377- Cache automatically invalidated on namespace/month changes 378- Rate limiter uses probabilistic cleanup (1 in 100 requests) 379 380### Files Added 381- `classes/FileHandler.php` - Atomic file operations with locking 382- `classes/EventCache.php` - Caching layer with TTL 383- `classes/RateLimiter.php` - AJAX rate limiting 384- `classes/EventManager.php` - Consolidated event CRUD operations 385 386### Upgrade Notes 387- No database migration required 388- Cache directory created automatically (`data/cache/calendar/`) 389- Rate limit data stored in `data/cache/calendar/ratelimit/` 390- Existing events and settings preserved 391 392--- 393 394## Version 6.14.2 (2026-02-15) - SYSTEM LOAD TOGGLE 395 396### Added System Load Bars Toggle 397- New toggle in **Admin > Calendar > Themes** tab 398- Choose to show or hide CPU/Memory load indicator bars 399- Setting applies to both event panel and sidebar widget 400- Stored in `data/meta/calendar_show_system_load.txt` 401- JavaScript polling is also disabled when hidden (saves resources) 402 403## Version 6.14.1 (2026-02-14) - SECURITY FIX 404 405### Security Improvements 406- **Authentication required** - Write actions (save, delete, toggle) now require user to be logged in 407- **Improved CSRF token handling** - New `getSecurityToken()` helper function checks multiple sources: 408 - `JSINFO.sectok` (standard) 409 - `window.JSINFO.sectok` 410 - Hidden form field `input[name="sectok"]` 411 - Meta tag `meta[name="sectok"]` 412- Anonymous users can no longer add/edit/delete events 413- Better error messages for authentication and token failures 414 415### Bug Fixes 416- Fixed "Invalid security token" error on clean DokuWiki installations 417- Added debug logging for security token failures 418 419## Version 6.14.0 (2026-02-14) - STABLE RELEASE 420 421### Code Cleanup & Localization 422- Added localization for all static calendar strings (EN/DE) 423- New lang keys: `previous_month`, `next_month`, `print_calendar`, `no_events_scheduled`, `calendar_label`, `details` 424- Code review and cleanup completed 425- Updated README.md and plugin documentation 426 427### Static Calendar Features (v6.13.x consolidated) 428- Read-only presentation mode: `{{calendar static}}` 429- Custom titles: `title="My Events"` 430- Month locking: `month=2` disables navigation 431- Print button with clean itinerary output 432- All themes supported: matrix, pink, purple, professional, wiki, dark, light 433- `noprint` option to hide print functionality 434- Formatted descriptions in tooltips and itinerary 435 436### Other Improvements in 6.13.x 437- Admin menu icon (SVG) 438- Config import fix for `return array()` syntax 439- Mobile touch button fixes 440- Important events in day popup with star icons 441- Time picker grouped by period 442- Multi-day event time validation 443 444## Version 6.13.13 (2026-02-14) - PRINT BUTTON CENTERING 445 446### Fixed Print Button Icon Alignment 447- Added `display: flex`, `align-items: center`, `justify-content: center` 448- Added `padding: 0` and `line-height: 1` 449- Icon now properly centered in circle 450 451## Version 6.13.12 (2026-02-14) - SIMPLE TOOLTIP 452 453### Simplified Hover Tooltip 454- Removed custom JS tooltip (was causing triple popups) 455- Uses native browser `title` attribute only 456- Plain text with formatting converted: `**bold**` → `*bold*`, `//italic//` → `_italic_` 457- Links shown as: `text (url)` 458- Added emoji before time for visual clarity 459- Itinerary still shows full HTML formatting 460 461## Version 6.13.11 (2026-02-14) - FORMATTED DESCRIPTIONS 462 463### Rich Text Formatting in Static Calendar 464- **Hover tooltips** now show formatted text (bold, italic, links, line breaks) 465- **Itinerary descriptions** display with full formatting 466- Uses existing `renderDescription()` function for consistency 467- Supports: `**bold**`, `//italic//`, `[[links]]`, `[markdown](links)`, line breaks 468 469### Technical Details 470- Added `data-tooltip` attribute with rich HTML content 471- New JavaScript tooltip handler with smart positioning 472- CSS styles for `.static-tooltip` and itinerary formatting 473- Tooltips stay within viewport bounds 474 475## Version 6.13.10 (2026-02-14) - PRINT MARGINS FIX v3 476 477### Fixed Print Margins - Inline Styles Approach 478- Removed reliance on `@page` CSS (browser support inconsistent) 479- Uses inline style `padding: 50px 60px` directly on wrapper div 480- Simplified CSS for better browser compatibility 481- Smaller table font (12px) for better fit 482- Set `max-width: 800px` on content wrapper 483 484## Version 6.13.9 (2026-02-14) - PRINT MARGINS FIX v2 485 486### Fixed Print Margins 487- Added `.print-wrapper` div with 0.5in padding/margin 488- Uses both `@page` margin AND wrapper margins for compatibility 489- Set `@page { margin: 1in 0.75in }` (top/bottom 1in, sides 0.75in) 490- Wrapper has `max-width: 7.5in` to fit standard letter size 491- Smaller fonts (0.85em) to fit more content 492- Added 250ms delay before print to ensure styles load 493 494## Version 6.13.8 (2026-02-14) - PRINT MARGINS FIX 495 496### Improved Print Layout 497- Added `@page { margin: 0.75in }` for proper print margins 498- Increased body padding to 40px for screen preview 499- Smaller font sizes to fit better on page 500- Description column limited width with word-wrap 501- Table header repeats on each page (`display: table-header-group`) 502- Rows avoid page breaks in middle (`page-break-inside: avoid`) 503- Print color adjust enabled for backgrounds 504 505## Version 6.13.7 (2026-02-14) - ALL THEMES FOR STATIC CALENDAR 506 507### Added All Theme Options 508Now all themes work with static calendar: 509 510| Theme | Description | 511|-------|-------------| 512| `matrix` | Green on dark (default Matrix style) | 513| `pink` | Pink/magenta on dark | 514| `purple` | Purple/violet on dark | 515| `professional` | Blue on white (business style) | 516| `wiki` | Neutral gray (matches DokuWiki) | 517| `dark` | Blue on dark gray | 518| `light` | Clean white/gray | 519 520### Examples 521``` 522{{calendar theme=matrix static}} 523{{calendar theme=purple static}} 524{{calendar theme=professional static}} 525{{calendar theme=wiki static}} 526``` 527 528## Version 6.13.6 (2026-02-14) - QUOTED PARAMETER FIX 529 530### Fixed Quoted Parameter Parsing 531- Titles with spaces now work: `title="Feb 26 Expense Log"` 532- Uses regex to properly parse: `key="value with spaces"` 533- Supports both double and single quotes 534- Example: `{{calendar title="My Custom Title" static}}` 535 536## Version 6.13.5 (2026-02-14) - STATIC CALENDAR OPTIONS 537 538### New Static Calendar Options 539 540| Option | Description | Example | 541|--------|-------------|---------| 542| `title=X` | Custom title instead of month name | `title="Club Meetings"` | 543| `noprint` | Hide print button and print view | `{{calendar static noprint}}` | 544| `theme=X` | Apply specific theme (matrix, pink, dark, light) | `theme=matrix` | 545 546### Fixed Month/Year Lock 547- When you specify `month=X` or `year=X`, navigation is now disabled 548- `{{calendar month=2 static}}` shows only February with no nav arrows 549- `{{calendar year=2025 month=12 static}}` locks to December 2025 550 551### Examples 552``` 553{{calendar static}} // Navigable, current month 554{{calendar month=2 static}} // Locked to February 555{{calendar title="Team Events" static}} // Custom title 556{{calendar theme=matrix static}} // Matrix theme 557{{calendar namespace=club static noprint}} // No print button 558{{calendar month=3 title="March Meetings" theme=pink static}} 559``` 560 561## Version 6.13.4 (2026-02-14) - DEDICATED PRINT BUTTON 562 563### Added Print Button to Static Calendar 564- New ️ print button in the calendar header 565- Opens a clean popup window with ONLY the itinerary content 566- Automatically triggers print dialog 567- Window closes after printing 568- No DokuWiki headers/footers/sidebars - just the calendar 569 570### How It Works 571- Extracts the print view HTML 572- Creates a new window with minimal styling 573- Calls `window.print()` automatically 574- Clean single-page output 575 576## Version 6.13.3 (2026-02-14) - PRINT BLANK PAGES FIX 577 578### Fixed Blank Pages When Printing 579- Aggressively hide ALL screen view elements and children in print 580- Reset height/width to 0 with !important on grid, cells, events 581- Ensure print view elements have proper display table properties 582- Force all hidden elements to position:absolute off-screen 583 584## Version 6.13.2 (2026-02-14) - STATIC CALENDAR RESPONSIVE FIX 585 586### Improved Static Calendar Layout 587- Changed from `max-width: 900px` to `width: 100%` for full container fit 588- Added `table-layout: fixed` for consistent column widths 589- Added `overflow-x: auto` for horizontal scroll on very small screens 590- Reduced header padding and font sizes for better fit 591- Improved responsive breakpoints for mobile (768px and 480px) 592- Hide time on very small screens to save space 593- Better touch targets for navigation buttons 594 595## Version 6.13.1 (2026-02-14) - STATIC CALENDAR FIX 596 597### Bug Fix 598- Added missing `getImportantNamespaces()` helper method 599- Fixed `loadEventsForMonth` → use existing `loadEvents` method 600- Added multi-namespace/wildcard support to static calendar 601 602## Version 6.13.0 (2026-02-14) - STATIC CALENDAR MODE 603 604### New Static/Presentation Mode 605Read-only calendar view for public display and printing. 606 607**Usage:** 608``` 609{{calendar static}} 610{{calendar namespace=meetings static}} 611``` 612 613**Screen View Features:** 614- Clean calendar grid without edit/delete buttons 615- Month navigation (prev/next arrows) 616- Hover tooltips showing full event details (title, time, description) 617- Important events highlighted with ⭐ and golden background 618- Today's date highlighted 619- Responsive design for mobile 620 621**Print View Features:** 622- Automatically switches to itinerary format when printing 623- Table layout: Date | Time | Event | Details 624- Important events marked with ⭐ 625- Dates grouped (date only shown once per day) 626- Page break handling for long lists 627- Clean black & white friendly output 628 629**Files Changed:** 630- `syntax.php`: Added `renderStaticCalendar()` method 631- `action.php`: Added `getStaticCalendar()` AJAX handler 632- `calendar-main.js`: Added `navStaticCalendar()` function 633- `style.css`: Added static calendar styles + print media queries 634 635## Version 6.12.7 (2026-02-14) - ADMIN MENU ICON 636 637### Added Admin Menu Icon 638- New monochrome SVG calendar icon for DokuWiki admin menu 639- Icon shows calendar with binding rings, header, and date dots 640- Matches DokuWiki's admin interface style 641- Added `getMenuIcon()` method to admin.php 642- Icon file: `images/icon.svg` 643 644## Version 6.12.6 (2026-02-14) - CONFIG IMPORT FIX 645 646### Fixed Config Import Validation 647- Now accepts both `return [` and `return array(` syntax 648- Regex updated from `/return\s*\[/` to `/return\s*(\[|array\s*\()/` 649- Older PHP config files using `return array(...)` now import correctly 650 651## Version 6.12.5 (2026-02-14) - MOBILE BUTTON FIX 652 653### Fixed Delete/Edit Buttons on Mobile 654- Added `type="button"` attribute to prevent form submission issues 655- Added `touchend` event delegation for reliable mobile touch handling 656- Increased button touch targets (32px default, 40px on mobile) 657- Added `touch-action: manipulation` to prevent touch delays 658- Added `-webkit-tap-highlight-color` for visual feedback 659 660### Technical Details 661- Mobile browsers sometimes don't fire `onclick` reliably 662- New `touchend` handler calls `btn.click()` explicitly 663- Larger touch targets meet accessibility guidelines (44px recommended) 664 665## Version 6.12.4 (2026-02-14) - STAR INLINE FIX 666 667### Fixed Star Position in Day Popup 668- Star icon now displays inline with event title (left side) 669- Changed `.popup-event-title` from `flex: 1 1 100%` to `flex: 1 1 auto` 670- Star and title stay on same line instead of star being above 671 672## Version 6.12.3 (2026-02-14) - DAY POPUP IMPORTANT EVENTS 673 674### Important Event Highlighting in Day Popup 675- Events from important namespaces now show ⭐ star icon 676- Golden gradient background highlight for important events 677- Golden border glow effect matching other views 678- Consistent styling across calendar grid, sidebar, and day popup 679 680### Technical Details 681- Added `importantNamespaces` check to `showDayPopup()` function 682- Added `.popup-event-important` and `.popup-event-star` CSS classes 683- Reads important namespaces from `container.dataset.importantNamespaces` 684 685## Version 6.12.2 (2026-02-14) - MULTI-DAY EVENT TIME FIX 686 687### Multi-Day Event End Time 688- End time now allows all times when end date differs from start date 689- Example: Event from 9:00 PM on Feb 28 to 5:00 AM on Feb 29 now works correctly 690- Same-day events still enforce end time > start time 691- Changing end date now triggers time validation update 692 693### Technical Details 694- `updateEndTimeOptions()` checks if `endDate !== startDate` 695- If multi-day, all time options are enabled 696- Added `onchange` handler to both start date and end date fields 697 698## Version 6.12.1 (2026-02-14) - TIME PICKER & EDIT DIALOG FIX 699 700### Improved Time Picker 701- Grouped time options by period (Morning, Afternoon, Evening, Night) 702- Much easier to navigate - no more scrolling through 96 options 703- End time options before start time are now hidden/disabled 704- Invalid end times automatically corrected when start time changes 705 706### Fixed Edit Event Dialog Draggability 707- Edit dialog is now properly draggable (was broken due to async AJAX) 708- Moved `makeDialogDraggable()` call inside the AJAX success callback 709- Removed redundant wrapper patch that didn't work with async code 710 711### Technical Details 712- Time picker uses `<optgroup>` for visual grouping 713- End time validation hides invalid options (not just disables) 714- Both Add and Edit dialogs now call `makeDialogDraggable()` directly 715 716## Version 6.12.0 (2026-02-14) - EVENT EDITOR DIALOG IMPROVEMENTS 717 718### Fixed Event Editor Dialog Draggability 719- Fixed duplicate event listener accumulation that caused performance degradation 720- Each time dialog opened, new drag listeners were added without removing old ones 721- Now properly cleans up old listeners before adding new ones 722- Added `cursor: grabbing` feedback while dragging 723- Dialog position resets when reopened (no more stuck positions) 724- Excluded close button from triggering drag 725 726### Optimized Time Selection Performance 727- Simplified `updateEndTimeOptions()` to be much faster 728- Removed expensive loop through 96 options checking style.display 729- Now just validates current selection and sets new value if invalid 730- Should eliminate freezing/lag when selecting start time 731 732### Technical Details 733- Added `_dragCleanup` function stored on handle element 734- Cleanup called before re-initialization 735- Removed unnecessary `setTranslate` helper function 736 737## Version 6.11.4 (2026-02-13) - JAVASCRIPT LOCALIZATION 738 739### JavaScript Frontend Localization 740- Added `getCalendarLang()` helper function 741- Added `getJsLangStrings()` PHP method 742- Embedded JSON language data in all render functions 743- Localized month names (full + short) 744- Localized dialog titles, confirmations, badges, empty states 745 746## Version 6.11.3 (2026-02-13) - SIDEBAR WIDGET LOCALIZATION 747 748### Sidebar Widget 749- Fixed `\n` in single-quoted strings → double-quoted for proper newlines 750- Localized "Runs every X minutes" cron descriptions 751- Event dialog labels, placeholders, options 752- Day names, ordinal positions, color names 753- Today/Tomorrow/Important section headers 754 755## Version 6.11.2 (2026-02-13) - ADMIN BACKEND LOCALIZATION 756 757### Admin Backend 758- Localized ~220 hardcoded strings in admin.php 759- AJAX JSON responses, redirect messages, error messages 760- Pattern names (Daily, Weekly, Monthly, etc.) 761 762## Version 6.11.1 (2026-02-13) - CONFIG IMPORT BUG FIX 763 764### Bug Fix 765- Fixed regex to accept both `return [` and `return array(` syntax 766- File: `admin.php` lines 5947, 6001 767 768## Version 6.10.6 (2026-02-13) - MANAGE RECURRING DIALOG LOCALIZATION 769 770### Localized Manage Recurring Series Dialog 771Complete translation of the "Manage" button dialog for recurring events: 772 773**Section Headers:** 774- "Manage Recurring Series" → "Wiederkehrende Serie verwalten" 775- "Extend Series" → "Serie erweitern" 776- "Trim Past Events" → "Vergangene Termine kürzen" 777- "Change Pattern" → "Muster ändern" 778- "Change Start Date" → "Startdatum ändern" 779- "Pause Series" / "Resume Series" → "Serie pausieren" / "Serie fortsetzen" 780 781**Labels & Buttons:** 782- All field labels (Add occurrences, Days apart, Remove before, New interval, etc.) 783- Action buttons (Extend, Trim, Change, Shift, Pause, Resume, Close) 784- Interval dropdown options (Daily, Weekly, Bi-weekly, Monthly, Quarterly, Yearly) 785- Help text and notes 786 787**Confirmation Dialogs:** 788- Trim confirmation with date 789- Respace confirmation 790- Shift confirmation 791 792### Added 60+ Language Strings for Dialogs 793Complete vocabulary for recurring event management in both English and German. 794 795### Note on Browser Validation Messages 796"Please fill out this field" is a browser-native message controlled by the browser's language setting, not our plugin. 797 798## Version 6.10.5 (2026-02-13) - DIALOG LOCALIZATION 799 800### Localized All JavaScript Dialogs 801 802**New Namespace Dialog:** 803- Prompt text with examples now in German 804- Invalid namespace error message 805 806**Rename Namespace Dialog:** 807- Prompt text with current name 808 809**Delete Confirmations:** 810- Delete selected events confirmation 811- Delete namespace confirmation 812- Delete recurring series confirmation 813 814**Trim Recurring Events:** 815- "Counting..." / "Zähle..." 816- "Trimming..." / "Kürze..." 817- "No past recurring events found" message 818- "Found X past recurring events" confirmation 819- Button text resets 820 821### Added 15+ New Dialog Strings 822Both English and German translations for all interactive prompts and confirmations. 823 824## Version 6.10.4 (2026-02-13) - COMPLETE MANAGE TAB LOCALIZATION 825 826### Fixed Remaining English Strings 827 828**Namespace Explorer Control Bar:** 829- "➡️ Move" → "➡️ Verschieben" 830- "➕ New Namespace" → "➕ Neuer Namensraum" 831- " Cleanup" → " Bereinigen" 832- "0 selected" → "0 ausgewählt" 833- "%d selected" → "%d ausgewählt" 834 835**Recurring Events Button Tooltips:** 836- "Edit title, time, namespace, pattern" → "Titel, Zeit, Namensraum, Muster bearbeiten" 837- "Extend, trim, pause, change dates" → "Erweitern, kürzen, pausieren, Daten ändern" 838- "Delete all occurrences" → "Alle Vorkommen löschen" 839 840**JavaScript Confirmation Messages:** 841- "No events selected" → "Keine Termine ausgewählt" 842- Delete confirmation with count 843- Delete namespace confirmation 844- "Scanning..." → "Scanne..." 845- "Cleaning..." → "Bereinige..." 846- "No empty namespaces found" message 847- "Found X item(s) to clean up" → "X Element(e) zum Bereinigen gefunden" 848- "Proceed with cleanup?" → "Mit Bereinigung fortfahren?" 849 850### Technical 851- Added adminLang JavaScript object with all translatable strings 852- All dynamic JavaScript messages now use language system 853 854## Version 6.10.3 (2026-02-13) - RECURRING EVENTS & DROP TARGET LOCALIZATION 855 856### Additional Localization for Manage Events Tab 857 858**Recurring Events Table:** 859- Search placeholder: "Wiederkehrende Termine suchen..." 860- Table headers: Titel, Namensraum, Muster, Zeitraum, Anzahl, Quelle, Aktionen 861- Source labels: Markiert / Erkannt (was Flagged / Detected) 862- Action buttons: Bearb. / Verwalten / Lö. (was Edit / Manage / Del) 863- Pattern badges: Täglich, Wöchentlich, Monatlich, Jährlich, Benutzerdefiniert 864- Footer: "Gesamt: X Serien" (was "Total: X series") 865- No results message 866 867**Namespace Explorer Drop Zones:** 868- Header: " Zielbereich" (was "Drop Target") 869- Drop hint: "Hier ablegen" (was "Drop here") 870- Default namespace label consistent 871 872### Added 25+ New Language Strings 873- Recurring table columns and labels 874- Pattern translations 875- Action button labels 876- Drop zone labels 877 878## Version 6.10.2 (2026-02-13) - MANAGE EVENTS TAB LOCALIZATION 879 880### Localized: Manage Events Tab (Complete) 881All text in the Manage Events admin tab now uses the language system: 882 883**Events Manager Section:** 884- Page title, section header, description 885- Statistics labels (Total Events, Namespaces, JSON Files, Recurring) 886- "Last scanned" timestamp label 887- Button labels (Re-scan Events, Export All Events, Import Events) 888- "View Breakdown by Namespace" expandable section 889- Table headers (Namespace, Events, Files) 890 891**Important Namespaces Section:** 892- Section header and description 893- Visual Effects descriptions (Calendar Grid, Event Sidebar, Sidebar Widget, Day Popup) 894- Save button and hint text 895 896**Cleanup Old Events Section:** 897- Section header and description 898- Radio button labels (By Age, By Status, By Date Range) 899- Age options (Delete events older than, months, years) 900- Status options (Completed tasks, Past events) 901- Date range labels (From, To) 902- Namespace filter label and placeholder 903- Preview and Delete button labels 904- JavaScript confirmation messages 905- Loading/error states 906 907**Recurring Events Section:** 908- Section header 909- Button labels (Trim All Past, Rescan) 910 911**Namespace Explorer Section:** 912- Section header and description 913- Search placeholder 914- Control bar buttons (All, None, Delete, Move to) 915- Datalist placeholder 916 917### Added 60+ New Language Strings 918Both English and German language files expanded with comprehensive admin terminology. 919 920## Version 6.10.1 (2026-02-13) - LANGUAGE SYSTEM FIX 921 922### Bug Fix: Language Files Not Working 923- Fixed `getMenuText()` to use `$this->getLang('menu')` instead of hardcoded string 924- Admin menu now correctly shows "Kalenderverwaltung" in German 925- Admin tabs now use language system: 926 - "Manage Events" → "Termine verwalten" 927 - "Update Plugin" → "Plugin aktualisieren" 928 - "Outlook Sync" → "Outlook-Sync" 929 - "Themes" → "Designs" 930 931### Added More Language Strings 932- Admin tab labels 933- Admin section headers (Event Browser, Important Namespaces, etc.) 934- Sync settings labels 935- Common button labels (Run Now, Download, Upload, Delete, etc.) 936 937## Version 6.10.0 (2026-02-13) - GERMAN LANGUAGE SUPPORT 938 939### New Feature: German Language Translation 940- Added complete German (de) language file 941- Expanded English language file with comprehensive translatable strings 942- Both files include 100+ translation strings covering: 943 - General terms (calendar, events, dates) 944 - Event fields (title, description, time, etc.) 945 - Actions (add, edit, delete, save, cancel) 946 - Task-related terms 947 - Recurring event options 948 - Days of week and months 949 - User messages and confirmations 950 - Search functionality 951 - Sync status messages 952 - Admin section labels 953 - Sidebar widget labels 954 - Time conflict warnings 955 956### Note 957The 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. 958 959## Version 6.9.9 (2026-02-13) - CRITICAL SEARCH FIX 960 961### Bug Fix: Month Search Not Working 962- **Root cause:** Function name collision - there were two `fuzzyMatch` functions 963 - `window.fuzzyMatch` (for namespace search autocomplete) returns a score number or `null` 964 - Local `fuzzyMatch` (for event search) returns `true`/`false` 965- When filtering events, the wrong function was being called, returning `null` for all events 966- **Fix:** Renamed event search functions to `eventSearchNormalize` and `eventSearchMatch` 967- Month search now works correctly on first load and after navigation 968 969### Also in this version 970- Fixed jumpToDate to properly hide search clear button after navigation 971- Removed debug logging from production code 972 973## Version 6.9.8 (2026-02-12) - SEARCH & UI FIXES 974 975### Bug Fixes 976 977**All-Dates Search Navigation Fixed** 978- Clicking a search result now properly navigates to that event's month 979- Opens the day popup showing the event details 980- Was calling non-existent `loadMonth()` - now uses correct `navCalendar()` 981- Clears search results and restores normal event list view 982 983**"No Events" Message Fixed** 984- No longer shows "No events match your search" when in all-dates mode 985- All-dates mode has its own results display; the month-mode message was incorrectly appearing 986 987**Add Button Layout Fixed** 988- Search bar no longer pushes the "+ Add" button off the right edge 989- Search container has constrained max-width (160px) and proper flex settings 990- Header has overflow:hidden to prevent layout issues 991 992**Important Event Stars Fixed** 993- Stars now appear on initial page load (PHP rendering added) 994- Stars positioned outside the bar using CSS ::before pseudo-element 995- Added overflow:visible to event-indicators and event-bar containers 996- Bar remains full width; star sits in the left margin area 997 998### Technical 999- Star uses `event-bar-has-star` class for first-day-only display 1000- jumpToDate() properly cleans up search state before navigation 1001 1002## Version 6.9.7 (2026-02-12) - IMPORTANT NAMESPACE IMPROVEMENTS 1003 1004### Bug Fix 1005- **AJAX refresh now preserves important namespace highlighting** 1006 - Important namespaces list now passed to JavaScript via data attribute 1007 - Highlighting persists when navigating between months 1008 - Works in both main calendar sidebar and standalone event panels 1009 1010### New Feature: Calendar Grid Star Icons 1011- **Important events now show ⭐ on their color bars** in the calendar grid 1012 - Small star appears on the first day of important events 1013 - Tooltip prefixed with ⭐ for important events 1014 - Visual distinction without cluttering the compact grid view 1015 1016### Admin Section Update 1017- **Improved Important Namespaces description** in Admin → Calendar → Manage Events 1018 - Now explains all visual effects: 1019 - Calendar Grid: ⭐ star on event bars 1020 - Event Sidebar: ⭐ star + highlighted background + accent border 1021 - Sidebar Widget: Dedicated "Important Events" section 1022 - Day Popup: Events shown with full details 1023 - Better example placeholder text 1024 1025### Technical 1026- Fixed PHP syntax error in fuzzy search (curly quotes replaced with escape sequences) 1027- Important namespaces loaded once and stored in container dataset for JavaScript access 1028 1029## Version 6.9.6 (2026-02-12) - FUZZY SEARCH & SIDEBAR HIGHLIGHTING 1030 1031### Fuzzy Search 1032- **Improved search matching:** Search is now more forgiving of punctuation differences 1033 - "fathers day" matches "Father's Day" 1034 - "new years" matches "New Year's Eve" 1035 - Smart quotes, apostrophes, dashes, and common punctuation are ignored 1036- **Multi-word search:** All words must be present but in any order 1037 - "birthday john" matches "John's Birthday Party" 1038- Works in both "this month" and "all dates" search modes 1039 1040### Important Namespace Highlighting (Calendar Sidebar) 1041- Events from important namespaces now highlighted in the main calendar's event list sidebar 1042- Same visual treatment as the itinerary sidebar widget: 1043 - Subtle theme-colored background tint 1044 - Right border accent bar 1045 - ⭐ star icon before event title 1046- Theme-specific colors: 1047 - Matrix: green tint 1048 - Purple: purple tint 1049 - Pink: pink tint 1050 - Professional: blue tint 1051 - Wiki: light blue tint 1052- Configure important namespaces in Admin → Calendar → Sync Settings 1053 1054## Version 6.9.5 (2026-02-12) - SEARCH MODE TOGGLE 1055 1056### New Feature: Search Scope Toggle 1057- **Search mode button** (/) added next to search input in both calendar views 1058- **Default mode** (): Search only the current month's events (fast, local filtering) 1059- **All dates mode** (): Search across ALL calendar data via AJAX 1060 - Click the button to toggle to (green highlight when active) 1061 - Requires at least 2 characters to search 1062 - Shows results with date, time, and namespace 1063 - Click any result to jump to that date and open the day popup 1064 - Limited to 50 results for performance 1065- Search placeholder text updates to indicate current mode 1066- Compact button design takes minimal space 1067 1068### UI Details 1069- Button sits flush with search input (no gap) 1070- Green highlight when "all dates" mode is active 1071- Results show full date (e.g., "Mon, Feb 12, 2026") 1072- Namespace badge shown for multi-namespace setups 1073 1074## Version 6.9.4 (2026-02-12) - POPUP IMPROVEMENTS & IMPORTANT HIGHLIGHTING 1075 1076### Features 1077- **Draggable Day Popup:** Calendar day popup window is now draggable by its header 1078 - Click and drag the header to move the popup 1079 - Header shows move cursor on hover 1080 - Clicking the close button (×) still closes normally 1081 1082- **Important Namespace Highlighting in Sidebar:** 1083 - Events from "important" namespaces (defined in Admin → Sync Settings) now have subtle highlighting 1084 - Theme-aware background tint (green for Matrix, purple for Purple, pink for Pink, blue for Professional/Wiki) 1085 - Right border accent bar for visual distinction 1086 - ⭐ star icon appears before event title 1087 - Works in Today, Tomorrow, and Important Events sections 1088 1089### Bug Fix 1090- **Fixed event display in day popup:** Long titles no longer cut off the edit/delete buttons 1091 - Event title now wraps to multiple lines instead of truncating 1092 - Actions buttons always visible 1093 - Time, date range, and namespace badges wrap properly 1094 - Improved flex layout for better responsiveness 1095 1096## Version 6.9.3 (2026-02-12) - ADMIN EDIT DIALOG CONSISTENCY 1097 1098### UI Improvement 1099- **Edit Recurring Event dialog** in Admin section now matches the main event editor exactly: 1100 - Same dark theme styling (#1e1e1e background, #2c3e50 header) 1101 - Same header layout with close button (×) in top-right corner 1102 - Same input styling (dark inputs with green accent borders) 1103 - Same footer with Cancel/Save buttons layout 1104 - Same recurrence options box styling 1105 - Consistent spacing, fonts, and colors throughout 1106 1107## Version 6.9.2 (2026-02-12) - MOBILE DIALOG FIX 1108 1109### Bug Fix 1110- **Fixed:** Description textarea now extends full width on mobile/phone view 1111 - Reduced form padding from 12px to 8px on screens ≤480px 1112 - Added explicit `width: 100%` and `box-sizing: border-box` to textarea 1113 - Ensured all form inputs/selects use full available width on mobile 1114 1115## Version 6.9.1 (2026-02-11) - ADMIN RECURRING EVENTS INTEGRATION 1116 1117### Admin Panel Updates 1118- **Enhanced Recurring Events Table:** 1119 - Pattern column now shows color-coded badges (daily=blue, weekly=green, monthly=orange, yearly=pink) 1120 - "First" column renamed to "Range" showing full date span (e.g., "Feb 1, 2026 → Dec 15, 2026") 1121 - Patterns now read from stored metadata when available, with smart fallback to detection 1122 1123- **Edit Recurring Series Dialog:** 1124 - Full recurrence pattern editing (not just simple intervals) 1125 - "Repeat every [N] [period]" with dropdown for Daily/Weekly/Monthly/Yearly 1126 - Weekly: Day-of-week checkboxes (Sun-Sat) with current days pre-selected 1127 - Monthly: Radio choice between "Day of month" or "Weekday pattern" 1128 - Ordinal weekday selector (First/Second/Third/Fourth/Fifth/Last + day dropdown) 1129 - Pre-populates all fields from stored recurrence metadata 1130 - Properly reschedules future events using new pattern 1131 1132- **Manage Series Dialog:** 1133 - Updated summary to show date range 1134 - Extend/trim/change pattern functions work with new patterns 1135 1136### Technical Updates 1137- `findRecurringEvents()` captures all recurrence metadata from events 1138- `formatRecurrencePattern()` generates human-readable pattern descriptions 1139- `detectRecurrencePattern()` enhanced to detect more interval variations 1140- `editRecurringSeries()` PHP handler processes new recurrence parameters 1141- `generateRecurrenceDates()` creates dates matching complex patterns 1142- Recurrence metadata preserved and updated across all event occurrences 1143 1144## Version 6.9.0 (2026-02-11) - ADVANCED RECURRING EVENTS 1145 1146### New Features 1147- **Enhanced Recurring Event Options:** 1148 - **Interval support:** Repeat every N days/weeks/months/years (e.g., every 3 months) 1149 - **Weekly day selection:** Choose specific days of the week (e.g., Mon, Wed, Fri) 1150 - **Monthly options:** 1151 - Day of month: Repeat on specific day (e.g., 15th of each month) 1152 - Ordinal weekday: Repeat on pattern (e.g., 2nd Wednesday, Last Friday) 1153 - **Examples now possible:** 1154 - Every 2 weeks on Monday and Thursday 1155 - Every 3 months on the 15th 1156 - Every other month on the 2nd Wednesday 1157 - Every year on the same date 1158 - Last Friday of every month 1159 1160### UI Changes 1161- Redesigned recurring options section with bordered container 1162- "Repeat every [N] [period]" input with interval number field 1163- Day-of-week checkboxes for weekly recurrence 1164- Radio buttons for monthly: "Day of month" vs "Weekday pattern" 1165- Ordinal dropdown (First/Second/Third/Fourth/Fifth/Last) 1166- Day dropdown (Sunday through Saturday) 1167- Helper text for end date field 1168 1169### Technical Details 1170- New parameters: recurrenceInterval, weekDays, monthlyType, monthDay, ordinalWeek, ordinalDay 1171- Recurrence pattern stored in event data for reference 1172- Maximum 365 occurrences (up from 100) to support daily events for a year 1173- Smart date iteration for complex patterns 1174 1175## Version 6.8.1 (2026-02-11) - ITINERARY DEFAULT STATE SETTING 1176 1177### New Feature 1178- **Added:** Option to set itinerary default state (expanded or collapsed) 1179 - New setting in Admin → Calendar → Sidebar Widget Settings 1180 - " Itinerary Section" with two options: 1181 - **Expanded** (default) - Show itinerary sections by default 1182 - **Collapsed** - Hide itinerary sections by default (click bar to expand) 1183 - Setting persists across page loads 1184 - Arrow indicator and content state reflect the saved preference on page load 1185 1186## Version 6.8.0 (2026-02-11) - COLLAPSIBLE ITINERARY 1187 1188### New Feature 1189- **Added:** Collapsible Itinerary bar in sidebar week view 1190 - New "ITINERARY" bar below the week calendar (styled like +ADD EVENT bar) 1191 - Click to collapse/expand the Today, Tomorrow, and Important Events sections 1192 - Arrow indicator shows expanded (▼) or collapsed (►) state 1193 - Smooth animation when collapsing/expanding 1194 - Clicking a day in the week grid shows that day's events ABOVE the Itinerary bar 1195 - Selected day events remain visible whether itinerary is expanded or collapsed 1196 - Shows "No upcoming events" message when there are no itinerary items 1197 1198### UI Layout (top to bottom) 11991. Header with clock/system stats 12002. +ADD EVENT bar 12013. Week grid (7 days) 12024. Selected day's events (appears when clicking a day) 12035. ITINERARY bar (click to collapse/expand) 12046. Today section (collapsible) 12057. Tomorrow section (collapsible) 12068. Important Events section (collapsible) 1207 1208## Version 6.7.9 (2026-02-11) - FIX EVENTS MANAGER STATISTICS 1209 1210### Bug Fixes 1211- **Fixed:** Events Manager showing inflated count (1195 instead of ~605) 1212 - The `scanDirectoryForStats()` function was counting ALL entries in JSON files 1213 - Now properly filters to only count date keys (`YYYY-MM-DD` format) 1214 - Now validates events have `id` and `title` before counting 1215 - Click " Rescan" to update the statistics with correct count 1216 1217## Version 6.7.8 (2026-02-11) - FILTER INVALID EVENTS 1218 1219### Bug Fixes 1220- **Fixed:** Event Manager showing "(untitled)" and "mapping" entries 1221 - Root cause: Calendar JSON files contain metadata keys (like "mapping") that were being parsed as events 1222 - Added date format validation (`YYYY-MM-DD`) to skip non-date keys 1223 - Added validation to require `id` and `title` fields for events 1224 - Applied fix to all event-reading functions: 1225 - `getEventsByNamespace()` - main event listing 1226 - `scanNamespaceRecursive()` - namespace scanning 1227 - `searchEvents()` - event search 1228 - `findEventsByTitle()` - title lookup 1229 - `deleteRecurringSeries()` - recurring deletion 1230 - `renameRecurringSeries()` - recurring rename 1231 - Recurring events scanner 1232 - Recurring cleanup function 1233 1234### Technical Details 1235- Date keys must match pattern `/^\d{4}-\d{2}-\d{2}$/` 1236- Events must have non-empty `id` and `title` fields 1237- All other entries in JSON files are now skipped 1238 1239## Version 6.7.7 (2026-02-11) - FIX PHP PATH & CLEAR LOG 1240 1241### Bug Fixes 1242- **Fixed:** "sh: 1: '/usr/bin/php': not found" error - removed escapeshellarg() which was adding quotes around the PHP path 1243- **Fixed:** "Could not clear log file" - added better error messages showing exact issue 1244- **Improved:** findPhpBinary() now uses is_executable() and `which php` for detection 1245- **Improved:** clearLogFile() now shows specific error (file not found, not writable, etc.) 1246 1247## Version 6.7.6 (2026-02-11) - FIX SYNC CONTROLS & LOGGING 1248 1249### Bug Fixes 1250- **Fixed:** Double log entries - sync script logs internally, removed redundant stdout capture 1251- **Fixed:** Manual sync not appearing in log - removed `--verbose` flag since script logs directly 1252- **Fixed:** Better error messages when sync fails 1253 1254### Improvements 1255- **Improved:** Sync now runs without `--verbose` flag - script logs to file internally 1256- **Improved:** Crontab warning if `>>` redirect is detected (causes duplicate entries) 1257- **Improved:** Log viewer now shows full path to log file 1258- **Improved:** Better pre-flight checks (directory creation, file permissions) 1259- **Improved:** PHP binary path is now properly escaped 1260 1261### Crontab Update Required 1262If your crontab has `>> sync.log 2>&1`, remove it to prevent duplicate log entries: 1263 1264**Before (causes duplicates):** 1265``` 1266*/2 * * * * cd /var/www/html/dokuwiki/lib/plugins/calendar && php sync_outlook.php >> /var/www/html/dokuwiki/data/meta/calendar/sync.log 2>&1 1267``` 1268 1269**After (correct):** 1270``` 1271*/2 * * * * cd /var/www/html/dokuwiki/lib/plugins/calendar && php sync_outlook.php 1272``` 1273 1274The script automatically logs to `data/meta/calendar/sync.log`. 1275 1276## Version 6.7.5 (2026-02-11) - FIX SYNC LOG OUTPUT 1277 1278### Bug Fixes 1279- **Fixed:** Sync log not showing output when running sync from admin panel 1280 - Added `--verbose` flag to sync command so output is captured 1281 - Sync output is now captured and written to the log file 1282 - Log directory is created if it doesn't exist 1283 - Better error handling if log directory isn't writable 1284 - Command being executed is logged for debugging 1285 1286### Changes 1287- Sync now runs in verbose mode when triggered from admin panel 1288- All sync output (stdout/stderr) is written to the log file 1289- Pre-flight check ensures log directory exists and is writable 1290 1291## Version 6.7.4 (2026-02-11) - FIX MANUAL SYNC EXECUTION 1292 1293### Bug Fix 1294- **Fixed:** "Could not open input file: sync_outlook.php" when running manual sync 1295 - The `$pluginDir` variable was missing from `runSync()` function 1296 - Added `$pluginDir = DOKU_PLUGIN . 'calendar'` before building the command 1297 - Sync now properly changes to the plugin directory before executing 1298 1299## Version 6.7.3 (2026-02-11) - FIX ADDITIONAL COUNT TYPE ERRORS 1300 1301### Bug Fix 1302- **Fixed:** Additional TypeError "count(): Argument #1 ($value) must be of type Countable|array, int given" 1303 - Fixed in `scanDirectoryForStats()` (line 5453) 1304 - Fixed in namespace delete function (line 4137) 1305 - Fixed in export function (line 5516) 1306 - Fixed in import function (line 5636) 1307 - All locations now check `is_array()` before calling `count()` 1308 1309## Version 6.7.2 (2026-02-11) - FIX EVENT MANAGER TYPE ERROR 1310 1311### Bug Fix 1312- **Fixed:** TypeError "count(): Argument #1 ($value) must be of type Countable|array, int given" 1313 - Added array type checks when iterating over calendar event data 1314 - Protects against corrupted JSON data where event lists may not be arrays 1315 - Added safeguards in `getEventsByNamespace()` and `scanNamespaceRecursive()` 1316 1317## Version 6.7.1 (2026-02-11) - BULK DELETE FOR BACKUPS 1318 1319### Changed 1320- **Improved:** Backup management now uses bulk selection and delete 1321 - Added checkboxes next to each backup file 1322 - Added "Select All" checkbox in the action bar 1323 - Added "️ Delete Selected" button (appears when backups are selected) 1324 - Removed individual delete buttons from each row 1325 - Shows count of selected backups 1326 - Backups are deleted sequentially with visual feedback 1327 1328### UI 1329- Clean action bar at top of backup table with selection controls 1330- Selected count updates in real-time 1331- Rows fade out smoothly when deleted 1332 1333## Version 6.7.0 (2026-02-11) - IMPROVED RESTORE FUNCTION 1334 1335### Changed 1336- **Improved:** Restore function now uses DokuWiki's Extension Manager API 1337 - Uses `helper_plugin_extension_extension` for proper installation 1338 - Handles permissions correctly through DokuWiki's standard plugin installation process 1339 - Falls back to manual instructions if Extension Manager is not available 1340 1341### How It Works 1342When you click " Restore" on a backup: 13431. The plugin loads DokuWiki's extension helper 13442. Calls `installFromLocal()` with the backup ZIP file 13453. DokuWiki's Extension Manager handles file extraction and installation 13464. This ensures proper permissions and follows DokuWiki standards 1347 1348### Fallback 1349If the Extension Manager helper is not available, you'll be prompted to: 1350- Download the backup ZIP 1351- Go to Admin → Extension Manager → Install 1352- Upload the ZIP file manually 1353 1354## Version 6.6.9 (2026-02-11) - REMOVE RESTORE FUNCTION 1355 1356### Removed 1357- **Removed:** "Restore" button from backup management 1358- **Removed:** `restoreBackup()` PHP method 1359- **Removed:** `restoreBackup()` JavaScript function 1360 1361### Added 1362- **Added:** Informational note in backup section explaining how to restore: 1363 - Download the backup ZIP file 1364 - Go to Admin → Extension Manager → Install 1365 - Upload the ZIP file there 1366 - DokuWiki's extension manager handles installation safely with proper permissions 1367 1368### Reason 1369The 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. 1370 1371## Version 6.6.8 (2026-02-11) - FIX THEME KEYS & FILE PERMISSIONS 1372 1373### Bug Fixes 1374- **Fixed:** "Undefined array key" warnings for wiki theme (pastdue_color, pastdue_bg, tomorrow_bg, etc.) 1375 - Added missing theme keys to `getWikiTemplateColors()` return array 1376 1377- **Fixed:** "Permission denied" errors for sync.log and sync_state.json 1378 - Moved sync files from plugin directory to `data/meta/calendar/` (writable location) 1379 - Updated sync_outlook.php, admin.php to use new paths 1380 - sync_config.php remains in plugin directory (must be manually configured) 1381 1382- **Fixed:** `findEventNamespace` now returns the actual DIRECTORY where event file lives 1383 - This ensures deletion works correctly when stored namespace differs from file location 1384 1385### Note on lang.php Permission Error 1386If 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. 1387 1388## Version 6.6.7 (2026-02-11) - FIX NAMESPACE CHANGE BUG (PART 2) 1389 1390### Bug Fix 1391- **Fixed:** Events in the DEFAULT namespace (no namespace) could not be moved to other namespaces 1392 - Root cause: The comparison `$oldNamespace !== ''` was always FALSE for default namespace events 1393 - Changed to `$oldNamespace !== null` to properly distinguish between "event not found" (null) and "event in default namespace" ('') 1394 - This allows moving events FROM the default namespace TO any other namespace 1395 - Also fixed null coalescing for recurring events: `$oldNamespace ?? $namespace` instead of `$oldNamespace ?: $namespace` 1396 1397## Version 6.6.6 (2026-02-11) - FIX NAMESPACE CHANGE & DELETE BUGS 1398 1399### Bug Fixes 1400- **Fixed:** Changing an event's namespace now properly moves the event instead of creating a duplicate 1401 - Root cause: `findEventNamespace()` was searching in the NEW namespace instead of ALL namespaces 1402 - Now uses wildcard search `'*'` to find the existing event regardless of its current namespace 1403 1404- **Fixed:** Deleting an event no longer causes the calendar to filter by the deleted event's namespace 1405 - Root cause: After deletion, `reloadCalendarData()` was called with the deleted event's namespace 1406 - Now retrieves the calendar's original namespace from `container.dataset.namespace` 1407 - Also fixed in `saveEventCompact()` and `toggleTaskComplete()` for consistency 1408 1409## Version 6.6.5 (2026-02-11) - ADD AUTOCOMPLETE ATTRIBUTES 1410 1411### Improved 1412- Added `autocomplete="new-password"` to client secret input field 1413- Added `autocomplete="email"` to user email input field 1414- Added `autocomplete="off"` to client ID input field 1415- Follows browser best practices for form inputs 1416 1417## Version 6.6.4 (2026-02-11) - FIX GEOLOCATION VIOLATION 1418 1419### Bug Fix 1420- **Fixed:** Browser violation "Only request geolocation information in response to a user gesture" 1421- Weather widget now uses Sacramento as the default location on page load 1422- Geolocation is only requested when user **clicks** on the weather icon 1423- Click the weather icon to get your local weather (browser will prompt for permission) 1424- Weather icon shows tooltip "Click for local weather" and has pointer cursor 1425 1426## Version 6.6.3 (2026-02-11) - FIX MUTATIONOBSERVER ERROR 1427 1428### Bug Fix 1429- **Fixed:** `Failed to execute 'observe' on 'MutationObserver': parameter 1 is not of type 'Node'` error 1430- Root cause: MutationObserver tried to observe `document.body` before DOM was ready 1431- Added `setupMutationObserver()` function that waits for DOMContentLoaded before attaching observer 1432 1433## Version 6.6.2 (2026-02-11) - FIX CONFLICT TOOLTIP JAVASCRIPT LOADING 1434 1435### Bug Fix 1436- **Critical:** Fixed `showConflictTooltip is not defined` and `hideConflictTooltip is not defined` errors 1437- Root cause: `addAssets()` in action.php was loading empty `script.js` instead of `calendar-main.js` 1438- Changed `addAssets()` to load `calendar-main.js` directly 1439- Updated `script.js` to dynamically load `calendar-main.js` as a fallback mechanism 1440 1441## Version 6.6.1 (2026-02-11) - SECURITY FIXES 1442 1443### Security 1444- **Critical:** Removed `eval()` remote code execution vulnerability in config import 1445- **Critical:** Added admin authentication requirement to `get_system_stats.php` endpoint 1446- **High:** Added CSRF token verification to all write operations (save, delete, toggle) 1447- **High:** Fixed path traversal vulnerabilities in namespace delete/rename functions 1448- **High:** Added admin privilege verification to AJAX admin routes 1449 1450### Improved 1451- **Input Validation:** Date format (YYYY-MM-DD), time format (HH:MM), color format (#RRGGBB) 1452- **Input Validation:** Year range (1970-2100), month range (1-12), namespace format 1453- **Input Validation:** Recurrence type whitelist, title/description length limits 1454- **Debug Logging:** All debug logging now conditional on `CALENDAR_DEBUG` constant (off by default) 1455- **JSON Handling:** Added `safeJsonRead()` helper with proper error handling 1456- **Timezone:** Sync script now uses configured timezone instead of hardcoded value 1457 1458### Code Quality 1459- Documented intentional switch fallthrough in `get_system_stats.php` 1460- Standardized error response format 1461 1462## Version 6.6.0 (2026-02-11) - BACKUP & UI IMPROVEMENTS 1463 1464### Fixed 1465- **Backup:** Fixed recursive directory backup to properly include all subdirectories (including `lang/`) 1466- **Backup:** Now uses `SELF_FIRST` iterator to process directories before their contents 1467- **Backup:** Empty directories are now explicitly added with `addEmptyDir()` to preserve structure 1468 1469### UI Change 1470- **Namespace Explorer:** Cleanup status message now appears prominently at top of section 1471- Previously status message was at bottom, easy to miss after cleanup operations 1472 1473## Version 6.5.5 (2026-02-11) - FIX AJAX ROUTING & MOVE CLEANUP BUTTON 1474 1475### Bug Fix 1476- All admin AJAX actions (cleanup, rescan, extend, trim, pause, resume, change start/pattern) were returning "Unknown action" 1477- Root cause: AJAX calls go through `action.php`'s switch statement, not `admin.php`'s `handle()` method 1478- Added routing in `action.php`: new cases forward to `admin.php` via `routeToAdmin()` helper 1479- Added public `handleAjaxAction()` method in `admin.php` as the entry point from `action.php` 1480 1481### UI Change 1482- Moved " Cleanup" button from standalone section to inline next to "➕ New Namespace" in the control bar 1483- Status messages still appear below the namespace explorer 1484 1485## Version 6.5.4 (2026-02-11) - FIX PHP PARSE ERROR IN CLEANUP JS 1486 1487### Bug Fix 1488- Root cause: `style='color:...'` single quotes inside PHP `echo '...'` block terminated the PHP string prematurely 1489- PHP saw `color:#e74c3c` as unexpected PHP code instead of part of the JS string 1490- Fixed all 5 occurrences in cleanupEmptyNamespaces JS: escaped single quotes as `\'` 1491- Added `adminColors` JS object (text, bg, border) injected from PHP `$colors` at render time 1492- Cleanup detail text uses `adminColors.text` to respect DokuWiki template theme colors 1493 1494## Version 6.5.3 (2026-02-11) - FIX CLEANUP NAMESPACES PARSE ERROR 1495 1496### Bug Fix 1497- Fixed PHP parse error on line 1089 caused by `$colors['text']` PHP variable inside JS string concatenation 1498- The cleanup results detail list now uses hardcoded `#666` for text color instead of attempting PHP interpolation within JS runtime code 1499 1500## Version 6.5.2 (2026-02-11) - CLEANUP EMPTY NAMESPACES 1501 1502### New Feature 1503- " Cleanup Empty Namespaces" button added at bottom of Namespace Explorer section 1504- Dry-run scan first: shows exactly what will be removed with bullet-point details in confirm dialog 1505- Removes empty calendar folders (0 JSON files or all-empty JSON files) from any namespace 1506- Removes parent namespace directories if they become empty after calendar folder removal 1507- Root calendar directory is never removed 1508- AJAX-powered with inline status showing results after cleanup 1509- Page auto-reloads after 2 seconds to refresh the namespace explorer view 1510- Recursively scans all nested namespace directories via `findAllCalendarDirsRecursive()` 1511 1512## Version 6.5.1 (2026-02-11) - TRIM ALL PAST: SHOW COUNT BEFORE DELETE 1513 1514### Improved 1515- "Trim All Past" button now does a dry-run count before showing the confirmation dialog 1516- Confirmation shows exact count: "Found 47 past recurring events to remove" 1517- If zero found, shows "No past recurring events found to remove" instead of confirm 1518- PHP handler supports `dry_run` parameter that counts without deleting 1519 1520## Version 6.5.0 (2026-02-11) - BULK TRIM ALL PAST RECURRING EVENTS 1521 1522### Bulk Action 1523- Red "✂️ Trim All Past" button added next to the Rescan button in the Recurring Events section header 1524- Removes ALL past occurrences (before today) from EVERY recurring series in one click 1525- Only removes events with `recurring` or `recurringId` flags — non-recurring events are untouched 1526- Confirmation dialog required before execution 1527- AJAX-powered with inline status showing count removed, then auto-rescans the table 1528- Searches all calendar directories recursively 1529 1530## Version 6.4.9 (2026-02-11) - FIX RECURRING EDIT/DELETE: SEARCH ALL DIRECTORIES 1531 1532### Bug Fix 1533- Edit and Delete recurring series now search ALL calendar directories instead of building a path from the namespace field 1534- Root cause: event's `namespace` field (stored in JSON) can differ from the filesystem directory where the file lives 1535- Both handlers now use `findCalendarDirs()` to collect every calendar directory recursively 1536- Events matched by title AND namespace field (case-insensitive) for precise targeting 1537- Edit handler rewritten: rename/time/namespace updates in Pass 1, interval respace in Pass 2 1538- New `findCalendarDirs()` helper method for recursive directory discovery 1539 1540## Version 6.4.8 (2026-02-11) - FIX PHP PARSE ERROR IN MANAGE DIALOG 1541 1542### Bug Fix 1543- Rewrote `manageRecurringSeries()` JS function using string concatenation instead of template literals 1544- JS template literals (`${...}`) inside PHP echo blocks caused PHP to parse them as variable interpolation 1545- All inline onclick handlers now use `\x27` for single quotes to avoid escaping conflicts 1546 1547## Version 6.4.7 (2026-02-11) - RECURRING EVENTS: FULL MANAGEMENT CONTROLS 1548 1549### New "Manage" Button per Series 1550- Orange "Manage" button opens a comprehensive management dialog for each recurring series 1551 1552### Extend Series 1553- Add N new occurrences after the last event in the series 1554- Configurable interval: Daily, Weekly, Bi-weekly, Monthly, Quarterly, Yearly 1555- New events copy title, time, color, namespace, and recurring flag from the last event 1556 1557### Trim Past Events 1558- Remove all occurrences before a selected cutoff date 1559- Confirmation required before deletion 1560- Cleans up empty date keys and files automatically 1561 1562### Change Pattern 1563- Respace future occurrences with a new interval 1564- Past events are untouched; only future events are removed and re-created 1565- First future event becomes the anchor date 1566 1567### Change Start Date 1568- Shift ALL occurrences by the difference between old and new start date 1569- Events are removed from old positions and re-created at new positions 1570- Preserves spacing between all events 1571 1572### Pause/Resume 1573- Pause: adds ⏸ prefix and paused flag to all future occurrences 1574- Resume: removes ⏸ prefix and paused flag from all occurrences 1575- Button toggles based on whether series is currently paused 1576 1577### Infrastructure 1578- New shared `recurringAction()` JS helper for all AJAX management operations 1579- New `getRecurringSeriesEvents()` PHP helper for finding all events in a series 1580- Status messages shown inline in the management dialog 1581- Close button triggers automatic rescan to refresh the table 1582 1583## Version 6.4.6 (2026-02-11) - RECURRING EVENTS: RESCAN BUTTON & IMPROVED LOGIC 1584 1585### Rescan Button 1586- Green " Rescan" button added to the Recurring Events section header 1587- AJAX-powered: rescans all calendar data and refreshes the table without page reload 1588- Shows count of found series briefly after scan completes 1589 1590### Improved Detection Logic 1591- Events with `recurring: true` flag are now detected first (grouped by `recurringId`) 1592- Pattern-detected events (3+ same-title occurrences) are found separately and deduplicated 1593- New "Source" column shows ️ Flagged (has recurring flag) vs Detected (pattern match) 1594- Median interval used for pattern detection instead of just first two dates (more robust) 1595- New patterns recognized: Quarterly, Semi-annual, and "Every ~N days" for custom intervals 1596- Empty/invalid titles and malformed date arrays are now skipped safely 1597- Dates are deduplicated before counting (prevents inflated counts from multi-day events) 1598- Nested namespace directories now scanned recursively 1599- Results sorted alphabetically by title 1600 1601## Version 6.4.5 (2026-02-11) - ADMIN VERSION HISTORY OVERHAUL 1602 1603### Version History Viewer 1604- All purple (#7b1fa2) accent colors replaced with green (#00cc07) to match admin theme 1605- Changelog parser now handles `###` subsection headers (rendered as green bold labels) 1606- Plain `- ` bullet items now parsed and categorized under their subsection 1607- Previously only `- **Type:** description` format was recognized 1608 1609### Current Release Button 1610- Green "Current Release" button added between nav arrows 1611- Jumps directly to the card matching the running version from plugin.info.txt 1612- Running version card shows green "RUNNING" badge and thicker green border 1613 1614## Version 6.4.4 (2026-02-11) - WIKI THEME: PAST EVENTS TOGGLE BACKGROUND 1615 1616### Fix 1617- Wiki theme past events pulldown (retracted state) now uses `__background_neu__` (`--cell-today-bg`) 1618- Previously used `--cell-bg` which appeared unthemed/white 1619 1620## Version 6.4.3 (2026-02-11) - WIKI THEME: DAY HEADERS BACKGROUND 1621 1622### Fix 1623- Wiki theme SMTWTFS day headers now use `__background_neu__` (`--cell-today-bg`) instead of `--background-header` 1624 1625## Version 6.4.2 (2026-02-11) - WIKI THEME: DAY HEADERS (INITIAL) 1626 1627### Wiki Theme Day Headers 1628- Added explicit CSS override for `.calendar-theme-wiki .calendar-day-headers` 1629- Day header text uses `--text-primary` (template's `__text__` color) 1630 1631## Version 6.4.1 (2026-02-11) - WIKI THEME: EVENT HIGHLIGHT 1632 1633### Fix 1634- Wiki theme event highlight (when clicking calendar bar) now uses `themeStyles.header_bg` (`__background_alt__`) instead of hardcoded blue (#dce9f5) 1635- Subtle shadow instead of blue glow 1636 1637## Version 6.4.0 (2026-02-11) - DARK READER: SECTION BAR COLOR MATCHING 1638 1639### Fix 1640- Wiki theme section left bar now uses a `<div>` with `background` instead of `border-left` 1641- Dark Reader maps the same color differently for border vs background properties, causing visual mismatch 1642- Both the bar and header now use `background`, so Dark Reader maps them identically 1643- Flex layout wrapper added for wiki theme sections 1644- Wiki fallback colors updated: `border` key now uses `#ccc` (matching `__border__`) instead of `#2b73b7` 1645 1646## Version 6.3.9 (2026-02-10) - WIKI THEME: SECTION BAR FIX (ATTEMPT) 1647 1648### Fix 1649- Simplified wiki section container — removed `wiki-section-container` class 1650- Added `background` from `$themeStyles['bg']` to section container 1651 1652## Version 6.3.8 (2026-02-10) - WIKI THEME: BUTTON & SECTION HEADER COLORS 1653 1654### Wiki Theme Buttons 1655- Nav buttons (< >), Today button, and panel buttons now use `__link__` color background with white text 1656- CSS overrides for `.calendar-theme-wiki .cal-nav-btn`, `.cal-today-btn`, panel buttons 1657 1658### Wiki Theme Section Headers 1659- Today: `__link__` background (accent/link color) 1660- Tomorrow: `__background_alt__` background (alternate background) 1661- Important: `__border__` background (border color) 1662- Each section now has a distinct color from the template palette 1663 1664## Version 6.3.7 (2026-02-10) - WIKI THEME CHECKBOX FIX 1665 1666### Fix 1667- Wiki theme checkbox override changed from `border-color` to full `border: 2px solid` shorthand 1668- Properly overrides the base rule which uses `border` shorthand 1669- Hover state also uses full shorthand 1670 1671## Version 6.3.6 (2026-02-10) - WIKI THEME CHECKBOX BORDER COLOR 1672 1673### Fix 1674- Wiki theme unchecked checkboxes now use `--border-main` (template's `__border__` color) for border 1675- Checked state fills with border color 1676- Hover state uses border color 1677- Applied to calendar, sidebar, and eventlist containers 1678 1679## Version 6.3.5 (2026-02-10) - WIKI THEME: ALLOW DARK READER ON HEADERS 1680 1681### Fix 1682- Wiki theme section headers (Today/Tomorrow/Important) no longer use `!important` or `-webkit-text-fill-color` 1683- Dark Reader can now freely adjust background, text color, and borders on wiki theme headers 1684- Clicked-day panel header and section border-left also unlocked for wiki theme 1685- All other themes (matrix/purple/pink/professional) retain full Dark Reader protection 1686 1687## Version 6.3.4 (2026-02-10) - WIKI THEME: BORDER COLOR FOR HEADERS & BADGES 1688 1689### Wiki Theme Color Remapping 1690- `border` (accent color) now maps to template's `__border__` instead of `__link__` 1691- This affects: section headers (Today/Tomorrow/Important), badges (TODAY, namespace), sidebar widget border, clicked-day panel, `--border-main` CSS variable 1692- `text_bright` still maps to `__link__` for link text and accent text 1693- Section headers all use the same `__border__` color for consistent appearance 1694- Updated COLOR_SCHEME mapping documentation 1695 1696## Version 6.3.3 (2026-02-10) - WIKI THEME SECTION HEADER TEXT COLOR 1697 1698### Fix 1699- Wiki theme Today/Tomorrow/Important section header text now uses `$themeStyles['text_primary']` (mapped from template's `__text__` color) instead of hardcoded white 1700- Clicked-day panel header text also uses template text color for wiki theme 1701- Professional theme remains white text on blue headers 1702 1703## Version 6.3.2 (2026-02-10) - FIX THEME NOT UPDATING ON SIDEBAR EVENTLIST 1704 1705### Bug Fix 1706- Added `$renderer->nocache()` to the render function 1707- DokuWiki was caching the rendered sidebar HTML, so theme changes made in admin were never reflected until the page was manually edited 1708- Now all calendar/eventlist/eventpanel outputs are rendered fresh on each page load, picking up the current theme from `calendar_theme.txt` 1709 1710## Version 6.3.1 (2026-02-10) - EVENTLIST THEMING 1711 1712### {{eventlist}} Theme Support 1713- Eventlist containers now receive theme class (`eventlist-theme-matrix`, etc.) and full CSS variable injection 1714- Dark themes get themed border + glow, light themes get subtle border 1715- Container background set from `$themeStyles['bg']` with `!important` 1716 1717### Eventlist CSS Theme Rules (all 3 dark themes) 1718- Title, header, time, date, body, links, strong, code, namespace badge, empty state 1719- Today header, clock, date — all with `color` + `-webkit-text-fill-color` `!important` 1720- Item borders, section backgrounds, code block backgrounds 1721- Full Dark Reader protection via same inline+CSS approach as calendar/sidebar 1722 1723## Version 6.3.0 (2026-02-10) - DARK READER COMPATIBILITY & COMPLETE THEMING 1724 1725### Dark Reader Browser Extension Compatibility 1726All 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. 1727 1728**Protected elements:** 1729- Section headers (Today/Tomorrow/Important) — background, text color, text-fill-color 1730- Clicked-day panel header — background, text color, close button 1731- All badges (TODAY, PAST DUE, namespace, panel namespace, eventlist-simple) — background, text, text-fill-color 1732- Event titles, meta, descriptions — color with !important via CSS 1733- Day numbers, nav buttons, calendar day headers — color with !important via CSS 1734- System status bars — inline background !important on tracks and fills 1735- System tooltips — background, border-color, text color all set via setProperty with !important 1736- Section left border bars — border-left with !important 1737- Event color indicator bars — border-left-color with !important 1738- Sidebar section event text (Purple and Pink themes) 1739 1740### Complete CSS Variable Audit (41 conversions in v6.1.1) 1741- All remaining hardcoded colors in style.css converted to CSS variable references 1742- Calendar borders, text colors, backgrounds, input focus shadows, accent borders 1743- Only legitimate hardcodes remain (keyframe animations, theme-specific override blocks) 1744 1745### Semantic Color System 1746- New CSS variables: `--pastdue-color`, `--pastdue-bg`, `--pastdue-bg-strong`, `--pastdue-bg-light` 1747- New CSS variables: `--tomorrow-bg`, `--tomorrow-bg-strong`, `--tomorrow-bg-light` 1748- Injected into all 3 CSS var blocks (full calendar, event panel, sidebar widget) 1749- Today/Tomorrow/Important section colors now theme-derived instead of hardcoded 1750 1751### Section Headers Fully Themed 1752- Today/Tomorrow/Important headers use theme accent colors instead of fixed green/orange/purple 1753- Matrix: bright/standard/dim green, Purple: bright/standard/dim purple, Pink: hot/medium/light pink 1754- Professional: blue shades, Wiki: template-derived colors 1755- Dark theme headers use dark background color for text contrast 1756 1757### Pink Theme Enhancements 1758- **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 1759- **Firework button hover** — `pink-firework-burst` keyframe animation with multi-point radiating box-shadows, scale/brightness effects on hover, instant flash on click 1760- **Checkbox glow** — hot pink border with ambient glow, hover intensifies, checked fills with glow 1761 1762### All Theme Checkbox Theming 1763- Matrix: bright green border + green glow, Purple: purple border + purple glow 1764- Pink: hot pink border + pink glow (with enhanced ambient effect) 1765- Hover scales 1.1x with intensified glow on all themes 1766- Checked state fills with theme accent color + outer glow 1767 1768### System Tooltips Themed 1769- Both tooltip functions use theme-derived colors from `$themeStyles` 1770- Green tooltip: `text_bright`, Purple: `border`, Orange: `text_primary` 1771- Background from `$themeStyles['bg']`, divider borders use theme accent colors 1772- All properties set with `style.setProperty(prop, value, "important")` 1773 1774### Namespace Filter Badge Cleanup 1775- Removed inline namespace badge from event side panel header 1776- Filter indicator bar ("Filtering: namespace ✕") retained and working 1777- AJAX-based namespace filtering fully functional via onclick handlers 1778 1779## Version 6.1.0 (2026-02-10) - TODAY INDICATOR, BUTTON HOVER & CHECKBOXES 1780 1781### Today Indicator 1782- **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) 1783- **Added:** Today cell has `--cell-today-bg` background AND a visible inset border glow on hover using `--border-main` 1784- **Added:** `.day-num` now uses `--text-primary` for color instead of relying on browser default 1785 1786### Button Hover/Click Theming 1787- **Fixed:** All buttons now use `filter: brightness(1.3)` on hover for a visible glow effect across all themes 1788- **Fixed:** All buttons use `filter: brightness(0.85)` on click/active for a press-down darkening effect 1789- **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 1790- **Removed:** Generic `opacity: 0.9` hover which was barely visible on dark themes 1791 1792### Checkboxes Themed 1793- **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 1794- **Added:** `accent-color: var(--text-bright)` on all dialog checkboxes (task, recurring) for consistent theme coloring 1795 1796### Form Input Text 1797- **Fixed:** `.input-sleek` now has `color: var(--text-primary)` — form text is visible on dark themes 1798- **Added:** `::placeholder` styling for inputs/textareas using `--text-dim` 1799 1800## Version 6.0.9 (2026-02-09) - FORM TEXT, CELL HOVER & GLOW TUNING 1801 1802### Form Input Text Fix 1803- **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)`. 1804- **Added:** Themed placeholder text (`::placeholder`) for inputs/textareas 1805 1806### Button & Cell Hover Theming 1807- **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` 1808- **Improved:** Nav buttons (`◄`/`►`) and Today button hover now show a themed glow + scale effect instead of just opacity change 1809- **Added:** Active (click) state for nav/today buttons with scale-down feedback 1810- **Improved:** Month picker hover now also shows a subtle theme shadow 1811 1812### Glow Reduced to 1px for Matrix/Purple 1813- Matrix and purple text glow reduced from 2px to 1px across: event titles, descriptions, meta, links, sidebar day numbers, sidebar event titles, sidebar dates 1814- Matrix clock pulse animation reduced from 6px/10px+15px to 2px/4px+6px 1815- Weather text glow reduced to 1px, clock to 2px 1816- Pink remains at 2px (barely noticeable) 1817 1818## Version 6.0.8 (2026-02-09) - LINKS, GLOW CONSISTENCY & PINK TONE-DOWN 1819 1820### Links Themed 1821- **Added:** `.cal-link` CSS class — all links rendered via `renderDescription()` now pick up theme accent color via `--text-bright` 1822- **Fixed:** Sidebar widget links (`a.cal-link`) inherit theme colors 1823- **Fixed:** Event list widget description links (`eventlist-widget-desc a`) use CSS vars 1824- **Fixed:** Simple event list body links/strong/code all themed 1825 1826### Text Glow Consistency 1827- **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 1828- **Added:** Subtle link glow on dark themes 1829- **Added:** Matrix and purple now get the same barely-visible text glow that pink had on sidebar week grid day numbers and event titles 1830 1831### Pink Glow Toned Down 1832- **Reduced:** Sidebar today header box-shadow from `0 0 10px 0.4` to `0 0 6px 0.25` 1833- **Reduced:** Day number sparkle animation from 3px/6px+10px to 2px/3px 1834- **Reduced:** Today cell shimmer from 3px+5px / 8px+12px to 2px+3px / 4px+6px 1835- **Reduced:** Event bar glow pulse from 2px/4px+6px to 1px/2px+3px 1836- **Reduced:** Today hover glow from 10px+15px to 5px+8px 1837- **Reduced:** Event item glow from 2px/5px to 1px/3px 1838- **Reduced:** Calendar container glow from 8px to 5px 1839 1840### Other 1841- **Themed:** Sidebar weather, date, and clock text colors and glow via CSS vars 1842 1843## Version 6.0.7 (2026-02-09) - BADGES, BUTTONS & CONFLICT THEMING 1844 1845- **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 1846- **Fixed:** TODAY badge uses `--border-main` for background instead of hardcoded purple 1847- **Fixed:** Conflict alert badge (`⚠️`) uses `--border-main` background and `--text-bright` border — matches theme accent 1848- **Fixed:** Conflict tooltip header background now set inline from theme vars (tooltip is appended to body, can't inherit CSS vars) 1849- **Fixed:** Conflict tooltip body items use themed text and border colors 1850- **Fixed:** Month picker Go/Cancel buttons themed (`--text-bright` for save, `--cell-bg` for cancel) 1851- **Fixed:** Calendar header month/year hover uses `--cell-today-bg` background 1852- **Fixed:** Inline search input border uses `--border-color` 1853- **Fixed:** Event list header border uses `--border-color` 1854 1855## Version 6.0.6 (2026-02-09) - COMPLETE TEXT THEMING 1856 1857- **Fixed:** Calendar header month/year title had hardcoded dark color — now uses `--text-primary` 1858- **Fixed:** Month/year picker hover used hardcoded gray background and green text — now uses `--cell-today-bg` and `--text-bright` 1859- **Fixed:** Event list items (titles, meta, descriptions, links, code blocks, bold text) — all now theme-aware via CSS vars 1860- **Fixed:** Completed/past event states used hardcoded grays — now use `--cell-bg`, `--text-dim`, `--cell-today-bg` 1861- **Fixed:** Scrollbar track/thumb colors now use theme vars 1862- **Fixed:** Namespace filter indicator (background, label, badge, close button) — all themed 1863- **Fixed:** Panel standalone month picker hover and namespace badge — themed 1864- **Fixed:** Calendar header border-bottom — now uses `--border-color` 1865 1866## Version 6.0.5 (2026-02-09) - THEMED BORDERS & EVENT PANEL 1867 1868- **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). 1869- **Added:** Theme-colored border and glow for event panel (`{{eventpanel}}`) on dark themes using `[data-theme]` attribute selectors 1870- **Themed:** Event panel header (nav buttons, month title, today button, search input, add button) — all now use CSS vars 1871- **Themed:** Panel standalone header background and border 1872 1873## Version 6.0.4 (2026-02-09) - FULL DIALOG THEMING 1874 1875- **Fixed:** Day cell click popup (day-popup) used hardcoded white/gray colors — now fully theme-aware using CSS variables 1876- **Fixed:** Event add/edit dialog (dialog-content-sleek) had hardcoded white background and blue header — now uses theme colors 1877- **Fixed:** Month picker dialog had hardcoded white background and dark text — now themed 1878- **Fixed:** Popup event items, titles, times, descriptions, footer, add-event button, close button — all now use CSS vars with sensible fallbacks 1879- **Fixed:** Form elements (field labels, inputs, checkboxes, recurring options, color pickers) — all reference theme CSS vars 1880- **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. 1881 1882## Version 6.0.3 (2026-02-09) - MOVE IMPORTANT NAMESPACES TO MANAGE TAB 1883 1884- **Moved:** Important Namespaces section from Outlook Sync tab to Manage Events tab (between Events Manager and Cleanup sections) 1885- **Changed:** Section header color from purple (#9b59b6) to green (#00cc07) to match other Manage tab sections 1886- **Added:** Dedicated Save button and `save_important_namespaces` action handler — setting is now independent of Outlook config save 1887- **Fixed:** Saving Outlook config no longer overwrites important namespaces with the default value 1888 1889## Version 6.0.2 (2026-02-09) - FIREFOX DAY HEADER FIX 1890 1891- **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. 1892 1893## Version 6.0.1 (2026-02-09) - THEME PARAMETER FIX 1894 1895- **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()` 1896- **Fixed:** `renderEventDialog` also ignored theme context — now receives theme from its caller 1897- **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. 1898 1899 1900## Version 6.0.0 (2026-02-09) - CODE AUDIT & v6 RELEASE 1901 1902- **Audited:** All PHP files (syntax.php, action.php, admin.php, sync_outlook.php) — balanced braces confirmed 1903- **Audited:** calendar-main.js (2,840 lines) — Node syntax check passed, 44 global functions verified 1904- **Audited:** style.css (3,218 lines) — balanced braces confirmed 1905- **Audited:** All admin manage tab action handlers verified functional (13 actions) 1906- **New:** Fresh README.md for GitHub with complete documentation 1907- **Includes all v5.5.x fixes:** 1908 - Delta sync for Outlook (hash-based change tracking, O(changes) not O(total)) 1909 - Wiki theme sidebar section headers: distinct colors, no glow, themed day-click panel 1910 - Conflict badges on past events after AJAX navigation 1911 - Admin panel: green cleanup header, fixed broken CSS, endTime field name, cache clearing for all mutations, empty file cleanup, dead code removal 1912 1913## Version 5.5.9 (2026-02-09) - ADMIN MANAGE TAB CLEANUP 1914 1915- **Fixed:** Cleanup Old Events section header now green (#00cc07) to match all other section headers 1916- **Fixed:** Recurring stat card had broken CSS from `$colors['bg'] . '3e0'` concatenation — now uses proper `#fff3e0` 1917- **Fixed:** Same broken CSS pattern in Outlook Sync tab log warning 1918- **Fixed:** `editRecurringSeries` wrote `end_time` instead of correct `endTime` field name 1919- **Fixed:** `editRecurringSeries` used uninitialized `$firstEventDate` variable — now properly declared 1920- **Fixed:** `moveEvents` and `moveSingleEvent` could crash if event date key didn't exist in JSON — added `isset()` check 1921- **Fixed:** `moveSingleEvent` now cleans up empty date keys and deletes empty files after moving 1922- **Fixed:** `deleteRecurringSeries` now cleans up empty date keys and deletes empty JSON files 1923- **Fixed:** Export version was hardcoded as '3.4.6' — now reads dynamically from plugin.info.txt 1924- **Added:** `clearStatsCache()` helper method — all 11 mutation functions now properly clear the event stats cache 1925- **Removed:** Dead `move_events` action handler (all forms use `move_selected_events`) 1926- **Removed:** `console.log` debug statements from `sortRecurringTable` and `editRecurringSeries` 1927- **Removed:** Stale "NEW!" comment from Events Manager section 1928 1929## Version 5.5.8 (2026-02-09) - DELTA SYNC & WIKI THEME SIDEBAR POLISH 1930 1931- **Added:** Outlook sync now uses hash-based delta tracking — only new, modified, or deleted events hit the API 1932- **Added:** computeEventHash() hashes all sync-relevant fields (title, description, time, date, color, namespace, task status) 1933- **Added:** Sync state v2 format stores {outlookId, hash} per event; auto-migrates from v1 on first run 1934- **Added:** Delta analysis summary shows new/modified/unchanged/deleted counts before syncing 1935- **Changed:** Unchanged events are completely skipped (zero API calls) — O(changes) instead of O(total) 1936- **Changed:** Removed per-run duplicate scan (was re-querying every event); use --clean-duplicates when needed 1937- **Changed:** Wiki theme sidebar section headers now use distinct colors: orange (Today), green (Tomorrow), purple (Important) 1938- **Fixed:** Wiki theme sidebar section headers no longer have colored glow — clean shadow instead 1939- **Fixed:** Wiki theme week grid day-click panel header now uses accent color with white text 1940- **Fixed:** Removed invalid var(--__...__) CSS syntax from inline styles (only works in CSS files, not HTML attributes) 1941 1942## Version 5.5.7 (2026-02-09) - WIKI THEME SIDEBAR POLISH 1943 1944- **Fixed:** Sidebar Today/Tomorrow/Important headers now use three distinct colors (orange/green/purple) instead of similar greys 1945- **Fixed:** Sidebar section headers no longer glow on wiki theme (clean shadow like professional) 1946- **Fixed:** Week grid day-click panel header now uses theme accent color with white text instead of grey background 1947- **Fixed:** Removed invalid var(--__...__) CSS variable syntax from inline styles (DokuWiki replacements only work in CSS files) 1948- **Changed:** Wiki theme section header text now white for readability on colored backgrounds 1949- **Changed:** Week grid JS theme colors now use actual $themeStyles values 1950 1951## Version 5.5.6 (2026-02-09) - FIX CONFLICT BADGES ON PAST EVENTS AFTER AJAX 1952 1953- **Fixed:** Conflict badges now render on past events in JS rebuild path (were only in the future events branch) 1954 1955## Version 5.5.5 (2026-02-09) - FIX SIDEBAR CONFLICT TOOLTIP POSITIONING 1956 1957- **Fixed:** Sidebar widget conflict tooltips now display next to the badge instead of upper-left corner 1958- **Fixed:** Week grid conflict tooltips also fixed (same issue) 1959- **Changed:** All conflict badges now use unified showConflictTooltip() system with base64-encoded data 1960- **Removed:** data-tooltip CSS pseudo-element approach for conflict badges (replaced with JS tooltip) 1961 1962## Version 5.5.4 (2026-02-09) - FIX PAST EVENT EXPAND ON FIRST LOAD 1963 1964- **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) 1965 1966## Version 5.5.3 (2026-02-09) - FIX CONFLICT TOOLTIP THEME COLORS 1967 1968- **Fixed:** Conflict tooltip now finds calendar container even when badge is inside day popup (appended to body) 1969- **Fixed:** Empty CSS variable values no longer produce invisible text — fallback defaults applied when var returns empty string 1970 1971## Version 5.5.2 (2026-02-09) - FIX CONFLICT TOOLTIP JSON PARSING 1972 1973- **Fixed:** Conflict tooltip data now base64-encoded to eliminate JSON parse errors from attribute quote escaping 1974- **Fixed:** Removed double htmlspecialchars encoding on conflict titles in PHP (was escaping titles then re-escaping the JSON) 1975- **Changed:** Both PHP and JS conflict badge rendering now use base64 for data-conflicts attribute 1976- **Changed:** showConflictTooltip decodes base64 first, falls back to plain JSON for compatibility 1977 1978## Version 5.5.1 (2026-02-09) - AJAX ROBUSTNESS & DIALOG THEMING 1979 1980- **Fixed:** Conflict tooltip badges now work after AJAX month navigation via event delegation 1981- **Fixed:** All document-level event listeners guarded against duplicate attachment from multiple script loads 1982- **Fixed:** showConflictTooltip closest() selector now matches actual container IDs (cal_, panel_, sidebar-widget-) 1983- **Fixed:** Description textarea in add/edit dialog now 2 lines tall instead of 1 1984- **Added:** Event delegation for conflict badge mouseenter/mouseleave (capture phase) survives DOM rebuilds 1985- **Added:** ESC key now also closes day popups and conflict tooltips 1986- **Changed:** Namespace click filter handler wrapped in guard to prevent duplicate binding 1987 1988## Version 5.5.0 (2026-02-09) - CSS VARIABLE REFACTOR & THEME CONSISTENCY 1989 1990- **Refactored:** All theming now driven by 15 CSS custom properties injected per calendar instance 1991- **Refactored:** Removed ~85 inline styles from syntax.php and ~41 from calendar-main.js 1992- **Refactored:** style.css is now the single source of truth for all visual styling 1993- **Fixed:** Day popup (click cell) now fully themed — CSS vars propagated from container 1994- **Fixed:** Add/Edit event dialog now themed in all contexts (main calendar, eventlist panel, sidebar widget) 1995- **Fixed:** Popup footer and "+ Add Event" button were using inline themeStyles — now use CSS vars 1996- **Added:** CSS variable injection for {{eventlist panel}} containers 1997- **Added:** CSS variable injection for {{eventlist sidebar}} widget containers 1998- **Added:** propagateThemeVars() helper ensures dialogs/popups always get theme regardless of DOM position 1999- **Added:** Wiki template mapping reads __link__ as accent color from style.ini 2000- **Added:** Detailed CSS variable reference table in style.css header comment 2001- **Added:** Detailed style.ini → CSS variable mapping documentation in syntax.php 2002- **Changed:** Conflict tooltip reads CSS vars via getComputedStyle instead of data-themeStyles 2003- **Changed:** Admin changelog now uses paginated timeline viewer instead of tiny scrolling div 2004- **Removed:** Dark Reader MutationObserver compatibility (CSS vars natively compatible) 2005- **Removed:** $isWikiTheme branching from PHP render path 2006 2007## Version 5.3.6 (2026-02-09) - HEARTS + CSS BACKGROUND FIX! 2008 2009### Added: Hearts in Explosions! 2010- **Added:** 8-12 pink hearts in each click explosion 2011- **Added:** Random sizes (12-28px) and directions 2012- **Result:** Extra love in every click! 2013 2014### Fixed: Background CSS Property for Dark Mode Readers 2015- **Fixed:** Added `background: transparent` to CSS (was completely removed) 2016- **Fixed:** Now CSS readers can detect and modify background property 2017- **Why:** Inline styles override transparent, but CSS readers can now see the property 2018- **Result:** Dark mode plugins can now change calendar backgrounds! 2019 2020### The CSS Problem 2021 2022**Why backgrounds weren't changing with dark mode readers**: 2023 2024**Before (v5.3.5)**: 2025```css 2026.calendar-compact-grid tbody td { 2027 /* background removed - set via inline style */ 2028 border: 1px solid... 2029} 2030``` 2031 2032**Problem**: CSS property doesn't exist! 2033- Dark mode readers look for `background` property in CSS 2034- Can't override what doesn't exist 2035- Inline styles work, but readers can't modify them 2036 2037**After (v5.3.6)**: 2038```css 2039.calendar-compact-grid tbody td { 2040 background: transparent; /* Now exists! */ 2041 border: 1px solid... 2042} 2043``` 2044 2045**Solution**: 2046- Property exists in CSS 2047- Dark mode readers can override it 2048- Inline styles still override transparent 2049- Everyone wins! 2050 2051### What's Fixed 2052 2053**Elements now have background property**: 2054- `.calendar-compact-grid tbody td` ✓ 2055- `.calendar-compact-grid tbody td:hover` ✓ 2056- `.event-compact-item` ✓ 2057- `.event-compact-item:hover` ✓ 2058 2059**How it works**: 20601. CSS sets `background: transparent` (default) 20612. Inline styles set actual color (overrides transparent) 20623. Dark mode readers can override CSS property 20634. Works for everyone! 2064 2065### Hearts in Explosion 2066 2067**Click anywhere → Hearts explode!** 2068 2069**Heart details**: 2070- Count: 8-12 per explosion (random) 2071- Size: 12-28px (random variety) 2072- Emoji: (pink heart) 2073- Direction: Random 360° 2074- Speed: 60-140px travel 2075- Duration: 0.8-1.2s 2076- z-index: 9999999 (always visible) 2077 2078**Combined with**: 2079- 25 glowing particles 2080- 40 pixel sparkles 2081- Bright flash 2082- **Total: 73-77 elements!** 2083 2084### Visual Result 2085 2086**Click explosion**: 2087``` 2088 ✦ • ✦ 2089 • • 2090✦ • ! • ✦ 2091 • • 2092 ✦ • ✦ 2093 2094Hearts + Particles + Pixels! 2095``` 2096 2097**Dark mode now works**: 2098```css 2099/* Dark mode reader can now do this: */ 2100.calendar-compact-grid tbody td { 2101 background: #000 !important; /* Works! */ 2102} 2103``` 2104 2105### Why Transparent Works 2106 2107**CSS Cascade**: 21081. CSS: `background: transparent` (lowest priority) 21092. Inline style: `background: #f5f5f5` (overrides CSS) 21103. Dark mode CSS: `background: #000 !important` (overrides inline) 2111 2112**Perfect solution!** ✓ 2113 2114## Version 5.3.5 (2026-02-09) - PARTICLES ABOVE DIALOGS! 2115 2116### Fixed: Particles Now Appear Above All Dialogs! 2117- **Fixed:** Increased z-index to 9999999 for all particles 2118- **Fixed:** Particles now visible above event dialogs, month picker, etc. 2119- **Result:** Cursor effects and explosions always visible! 2120 2121### The Z-Index Problem 2122 2123**Before (v5.3.4)**: 2124- Particles: z-index 9999 2125- Dialogs: z-index 10000-999999 2126- **Particles hidden behind dialogs!** 2127 2128**After (v5.3.5)**: 2129- Particles: z-index 9999999 2130- Trail: z-index 9999998 2131- Pixels: z-index 9999997 2132- **Particles ALWAYS on top!** 2133 2134### What's Fixed 2135 2136✅ **Main particles** (explosion orbs) 2137✅ **Cursor trail** (glowing dots) 2138✅ **Pixel sparkles** (tiny bright stars) 2139✅ **Flash effect** (click burst) 2140 2141**All now appear above**: 2142- Event dialog popups 2143- Month picker 2144- Day popups 2145- Any modal overlays 2146 2147### Visual Result 2148 2149**Moving cursor over dialog**: 2150``` 2151┌─────────────────────┐ 2152│ Event Dialog │ 2153│ ✦ • ✦ │ ← Sparkles visible! 2154│ → ✦ │ ← Cursor trail visible! 2155│ • ✦ • │ 2156└─────────────────────┘ 2157``` 2158 2159**Clicking on dialog**: 2160``` 2161┌─────────────────────┐ 2162│ ✦ • ✦ • ✦ │ 2163│ • ! • │ ← Explosion visible! 2164│ ✦ • ✦ • ✦ │ 2165└─────────────────────┘ 2166``` 2167 2168**Perfect visibility everywhere!** ✨ 2169 2170## Version 5.3.4 (2026-02-09) - THEMED MONTH PICKER + DIALOG CURSOR FIX 2171 2172### Fixed: Month Picker Now Themed! 2173- **Fixed:** Jump to Month dialog now uses theme colors 2174- **Fixed:** Dialog background, borders, text all themed 2175- **Fixed:** Select dropdowns use theme colors 2176- **Fixed:** Buttons use theme accent colors 2177- **Result:** Month picker matches calendar theme! 2178 2179### Fixed: Cursor Effects Work in Dialogs! 2180- **Fixed:** Cursor trail now works when hovering over dialogs 2181- **Fixed:** Click explosions work when clicking inside dialogs 2182- **Technical:** Changed to capture phase event listeners 2183- **Result:** Effects work EVERYWHERE now! 2184 2185### Month Picker Theming 2186 2187**Before (v5.3.3)**: 2188- White background (hardcoded) 2189- Black text (hardcoded) 2190- No theme integration 2191- Looked out of place 2192 2193**After (v5.3.4)**: 2194- Dialog background: `theme.bg` 2195- Dialog border: `theme.border` 2196- Text color: `theme.text_primary` 2197- Dropdowns: `theme.cell_bg` + `theme.text_primary` 2198- Cancel button: `theme.cell_bg` 2199- Go button: `theme.border` (accent color) 2200 2201**Fully integrated!** ✅ 2202 2203--- 2204 2205### Theme Examples 2206 2207**Matrix Theme**: 2208``` 2209┌─────────────────────────┐ 2210│ Jump to Month │ ← Dark bg, green border 2211│ [February ▼] [2026 ▼] │ ← Dark dropdowns 2212│ [Cancel] [Go] │ ← Green "Go" button 2213└─────────────────────────┘ 2214``` 2215 2216**Pink Theme**: 2217``` 2218┌─────────────────────────┐ 2219│ Jump to Month │ ← Dark bg, pink border 2220│ [February ▼] [2026 ▼] │ ← Dark dropdowns 2221│ [Cancel] [Go] │ ← Pink "Go" button 2222└─────────────────────────┘ 2223With sparkle effects! ✨ 2224``` 2225 2226**Professional Theme**: 2227``` 2228┌─────────────────────────┐ 2229│ Jump to Month │ ← Clean bg, blue border 2230│ [February ▼] [2026 ▼] │ ← Clean dropdowns 2231│ [Cancel] [Go] │ ← Blue "Go" button 2232└─────────────────────────┘ 2233``` 2234 2235--- 2236 2237### Dialog Cursor Fix 2238 2239**The Problem**: 2240Dialogs use `event.stopPropagation()` to prevent clicks from closing them. This blocked cursor effects! 2241 2242**The Solution**: 2243Use **capture phase** event listeners: 2244```javascript 2245// Before (bubbling phase) 2246document.addEventListener('click', handler) 2247 2248// After (capture phase) 2249document.addEventListener('click', handler, true) 2250 ↑ 2251 Capture phase! 2252``` 2253 2254**Capture phase runs BEFORE stopPropagation!** 2255 2256--- 2257 2258### Now Works Everywhere 2259 2260✅ **Calendar area** 2261✅ **Event dialogs** 2262✅ **Month picker dialog** 2263✅ **Day popup dialogs** 2264✅ **Anywhere on screen** 2265 2266**No more blocked effects!** 2267 2268--- 2269 2270### Technical Details 2271 2272**Event phases**: 2273``` 22741. Capture phase ← We listen here now! 22752. Target phase 22763. Bubbling phase ← stopPropagation blocks this 2277``` 2278 2279**By using capture phase**: 2280- Events caught before stopPropagation 2281- Works in all dialogs 2282- No conflicts with dialog logic 2283 2284--- 2285 2286### All Dialogs Checked 2287 2288✅ **Month picker** - Now themed! 2289✅ **Event dialog** - Already themed 2290✅ **Day popup** - Already themed 2291 2292**Everything consistent!** 2293 2294--- 2295 2296## Version 5.3.3 (2026-02-09) - TINY NEON PIXEL SPARKLES! ✨ 2297 2298### ✨ Added: Bright Neon Pixel Sparkles Everywhere! 2299- **Added:** Tiny 1-2px bright pixel sparkles alongside cursor trail 2300- **Added:** 40 pixel sparkles in click explosions 2301- **Changed:** Cursor effects now work on ENTIRE SCREEN (not just calendar) 2302- **Result:** Maximum sparkle effect! 2303 2304### Tiny Pixel Sparkles 2305 2306**3-6 tiny bright pixels appear with each cursor movement!** 2307 2308**Characteristics**: 2309- Size: 1-2px (single pixel appearance!) 2310- Colors: Bright neon whites and pinks 2311 - Pure white (#fff) - 40% chance 2312 - Hot pink (#ff1493) 2313 - Pink (#ff69b4) 2314 - Light pink (#ffb6c1) 2315 - Soft pink (#ff85c1) 2316- Glow: Triple-layer shadow (intense!) 2317- Spawn: Random 30px radius around cursor 2318- Animations: 2319 - 50% twinkle in place 2320 - 50% float upward 2321 2322**Creates a cloud of sparkles around your cursor!** 2323 2324--- 2325 2326### Click Explosion Enhanced 2327 2328**Now with 40 EXTRA pixel sparkles!** 2329 2330**Click anywhere → BIG BOOM**: 2331- 25 main glowing particles (6-10px) 2332- **40 tiny pixel sparkles (1-2px)** ← NEW! 2333- Bright white flash 2334- Total: 65+ visual elements! 2335 2336**Pixel sparkles in explosion**: 2337- Shoot outward in all directions 2338- Random distances (30-110px) 2339- Multiple bright colors 2340- Some twinkle, some explode 2341- Creates stellar effect! 2342 2343--- 2344 2345### Entire Screen Coverage 2346 2347**Effects now work EVERYWHERE!** 2348 2349**Before (v5.3.2)**: 2350- Only inside calendar viewport 2351- Limited to calendar area 2352 2353**After (v5.3.3)**: 2354- Works on entire screen! ✓ 2355- Cursor trail follows everywhere 2356- Click explosions anywhere 2357- Used `position: fixed` + `clientX/Y` 2358 2359**Move anywhere on the page for sparkles!** 2360 2361--- 2362 2363### Visual Effect 2364 2365**Cursor movement**: 2366``` 2367 • ✦ • ← Tiny pixels 2368 • ✦ • ← Glowing trail 2369✦ • → • ✦ ← Cursor 2370 • ✦ • ← Mixed sizes 2371 • ✦ • ← Sparkle cloud 2372``` 2373 2374**Click explosion**: 2375``` 2376 ✦ • ✦ • ✦ 2377 ✦ • • ✦ 2378✦ • ! • ✦ 2379 ✦ • • ✦ 2380 ✦ • ✦ • ✦ 2381 238265+ particles total! 2383``` 2384 2385--- 2386 2387### Sparkle Details 2388 2389**Trail Pixels** (3-6 per movement): 2390- Size: 1-2px 2391- Spawn rate: Every 40ms 2392- Spread: 30px radius 2393- Duration: 0.6-0.8s 2394- 50% twinkle, 50% float 2395 2396**Explosion Pixels** (40 total): 2397- Size: 1-3px 2398- Spread: 30-110px radius 2399- Duration: 0.4-0.8s 2400- All directions 2401- Intense glow 2402 2403**Main Particles** (25 total): 2404- Size: 4-10px 2405- Spread: 50-150px 2406- Full color palette 2407- Original firework effect 2408 2409--- 2410 2411### Color Distribution 2412 2413**Pixel sparkles favor white**: 2414- 40% pure white (#fff) - brightest! 2415- 60% pink shades - variety 2416 2417**Creates brilliant sparkle effect!** 2418 2419--- 2420 2421### Performance 2422 2423**Still optimized**: 2424- Trail: 30ms throttle 2425- Pixels: 40ms throttle 2426- Auto-cleanup 2427- Hardware accelerated 2428- Smooth 60fps 2429 2430**Lots of sparkles, zero lag!** 2431 2432--- 2433 2434### Full-Screen Magic 2435 2436**Pink theme calendar detected**: 2437```javascript 2438if (pink calendar exists) { 2439 Enable effects for ENTIRE SCREEN 2440 Not just calendar area 2441} 2442``` 2443 2444**Works everywhere on page!** ✨ 2445 2446--- 2447 2448## Version 5.3.2 (2026-02-09) - PINK FIREWORKS! 2449 2450### Changed: Glowing Pink Particles Instead of Emoji Sparkles! 2451- **Removed:** Emoji sparkle images (✨) 2452- **Added:** Glowing pink particle trail following cursor 2453- **Added:** FIREWORKS explosion on click! 2454- **Result:** Beautiful glowing effects, not emoji! 2455 2456### Glowing Cursor Trail 2457 2458**Pink glowing dots follow your cursor!** 2459- Small glowing pink orbs (8px) 2460- Radial gradient glow effect 2461- Multiple box-shadows for depth 2462- Fade out smoothly (0.5s) 2463- Throttled to 30ms for smoothness 2464 2465``` 2466 • • 2467 • → • ← Your cursor 2468 • • 2469``` 2470 2471**Not emoji - actual glowing particles!** 2472 2473--- 2474 2475### Click Fireworks! 2476 2477**Click anywhere on the calendar → BOOM!** 2478 2479**20 pink particles explode outward!** 2480- Radial burst pattern (360° coverage) 2481- Random speeds (50-150px travel) 2482- 4 shades of pink: 2483 - Hot pink (#ff1493) 2484 - Pink (#ff69b4) 2485 - Light pink (#ff85c1) 2486 - Very light pink (#ffc0cb) 2487- Random sizes (4-10px) 2488- Individual glowing halos 2489- Smooth explosion animation 2490 2491**Plus a bright flash at click point!** 2492- 30px radius glow 2493- Intense pink flash 2494- Fades quickly (0.3s) 2495 2496--- 2497 2498### Visual Effect 2499 2500**Cursor movement**: 2501``` 2502 • 2503 • • • 2504 • → • ← Glowing trail 2505 • • • 2506 • 2507``` 2508 2509**Click explosion**: 2510``` 2511 • • • 2512 • • 2513 • BOOM! • ← 20 particles 2514 • • 2515 • • • 2516``` 2517 2518**All particles glow with pink halos!** 2519 2520--- 2521 2522### Particle Details 2523 2524**Trail Particles**: 2525- Size: 8x8px 2526- Color: Pink radial gradient 2527- Shadow: 10px + 20px glow layers 2528- Duration: 0.5s fade 2529- Rate: 30ms throttle 2530 2531**Explosion Particles**: 2532- Size: 4-10px (random) 2533- Colors: 4 pink shades (random) 2534- Shadow: 10px + 20px glow (matches color) 2535- Duration: 0.6-1.0s (random) 2536- Pattern: Perfect circle burst 2537 2538**Flash Effect**: 2539- Size: 30x30px 2540- Color: Bright hot pink 2541- Shadow: 30px + 50px mega-glow 2542- Duration: 0.3s instant fade 2543 2544--- 2545 2546### Performance 2547 2548**Optimized for smoothness**: 2549- Trail throttled to 30ms 2550- Auto-cleanup after animations 2551- CSS hardware acceleration 2552- No memory leaks 2553- Smooth 60fps 2554 2555**Won't slow you down!** 2556 2557--- 2558 2559### Comparison 2560 2561**Before (v5.3.1)**: 2562- ✨ Emoji sparkle images 2563- Static unicode characters 2564- Limited visual impact 2565 2566**After (v5.3.2)**: 2567- Glowing pink particles 2568- Radial gradients + shadows 2569- Beautiful firework explosions 2570- Much more impressive! 2571 2572--- 2573 2574### Only Pink Theme 2575 2576**These effects only appear**: 2577- On `.calendar-theme-pink` elements 2578- Other themes unaffected 2579- Pure pink magic! 2580 2581--- 2582 2583## Version 5.3.1 (2026-02-09) - MYSPACE SPARKLE CURSOR! ✨✨✨ 2584 2585### ✨ Added: MySpace-Style Sparkle Trail! 2586- **Added:** Sparkle cursor trail that follows your mouse (pink theme only!) 2587- **Toned down:** Reduced glow effects for better taste 2588- **Added:** Sparkles appear on cell hover 2589- **Added:** Sparkles on event hover (left and right sides!) 2590- **Added:** Sparkles on today's cell corners 2591- **Added:** Sparkles on navigation buttons 2592- **Added:** Sparkles in calendar header 2593- **Result:** Pure nostalgic MySpace magic! ✨ 2594 2595### MySpace Sparkle Cursor Trail 2596 2597**The classic effect from 2006!** 2598- Sparkles follow your cursor as you move 2599- Random sizes (12-22px) 2600- Random slight offsets for natural feel 2601- Float up and fade out animation 2602- Throttled to 50ms (smooth, not laggy) 2603- Only on pink theme calendars 2604 2605``` 2606 ✨ 2607 ✨ ✨ 2608✨ → ✨ (cursor trail) 2609 ✨ ✨ 2610 ✨ 2611``` 2612 2613**Pure nostalgia!** 2614 2615--- 2616 2617### Sparkles Everywhere 2618 2619**Calendar cells**: 2620- Hover over any day → ✨ floats up 2621- Smooth 1.5s animation 2622- Centered sparkle 2623 2624**Event items**: 2625- Hover → ✨ on left side 2626- Hover → ✨ on right side 2627- Staggered animations (0.4s delay) 2628- Continuous twinkling 2629 2630**Today's cell**: 2631- ✨ in top-right corner (continuous) 2632- ✨ in bottom-left corner (offset timing) 2633- Always sparkling! 2634 2635**Navigation buttons**: 2636- Hover on < or > → ✨ appears top-right 2637- One-time float animation 2638 2639**Calendar header**: 2640- ✨ on left side (continuous) 2641- ✨ on right side (offset 1s) 2642- Always twinkling 2643 2644--- 2645 2646### Toned Down Glows 2647 2648**Before (v5.3.0)**: TOO MUCH GLOW! 2649- 50px shadows 2650- 4-layer effects 2651- Overwhelming 2652 2653**After (v5.3.1)**: Just right! 2654- 8-15px max shadows (subtle) 2655- 2-layer effects 2656- Professional with personality 2657 2658**Glow reductions**: 2659- Today shimmer: 35px → 12px 2660- Today hover: 50px → 15px 2661- Event glow: 18px → 6px 2662- Badge pulse: 25px → 8px 2663- Container glow: 20px → 8px 2664 2665**Much more tasteful!** 2666 2667--- 2668 2669### Sparkle Animations 2670 2671**sparkle-twinkle** (0.8s): 2672``` 2673Opacity: 0 → 1 → 1 → 0 2674Scale: 0 → 1 → 1 → 0 2675Rotation: 0° → 180° → 360° 2676``` 2677 2678**sparkle-float** (1.5s): 2679``` 2680Moves up: 0px → -50px 2681Opacity: 0 → 1 → 1 → 0 2682Scale: 0 → 1 → 0.8 → 0 2683``` 2684 2685**Pure MySpace magic!** ✨ 2686 2687--- 2688 2689### Where Sparkles Appear 2690 2691✅ **Cursor trail** (continuous while moving) 2692✅ **Calendar cells** (on hover) 2693✅ **Event items** (on hover, left + right) 2694✅ **Today's cell** (continuous, corners) 2695✅ **Navigation buttons** (on hover) 2696✅ **Calendar header** (continuous, sides) 2697 2698**Sparkles EVERYWHERE!** ✨✨✨ 2699 2700--- 2701 2702### Performance 2703 2704**Cursor trail**: 2705- Throttled to 50ms 2706- Auto-cleanup after 1s 2707- No memory leaks 2708- Smooth 60fps 2709 2710**CSS animations**: 2711- Hardware accelerated 2712- No JavaScript overhead (except cursor) 2713- Efficient transforms 2714 2715**Won't slow down your browser!** 2716 2717--- 2718 2719### Pure Nostalgia 2720 2721**Remember MySpace profiles?** 2722- Glitter graphics ✨ 2723- Sparkle cursors ✨ 2724- Auto-play music (ok, we didn't add that) 2725- Animated GIF backgrounds 2726- Comic Sans everywhere 2727 2728**We brought back the sparkles!** ✨ 2729 2730--- 2731 2732### Theme Comparison 2733 2734**Other themes**: Professional and clean 2735**Pink theme**: ✨ SPARKLES EVERYWHERE ✨ 2736 2737**Only pink theme gets the magic!** 2738 2739--- 2740 2741## Version 5.3.0 (2026-02-09) - PINK BLING THEME EFFECTS! ✨ 2742 2743### Added: Pink Theme Gets BLING! 2744- **Added:** Shimmering animation for today's cell 2745- **Added:** Sparkling text effect on today's date 2746- **Added:** Glowing pulse for event bars 2747- **Added:** Gradient shimmer on headers 2748- **Added:** Extra glow on hover effects 2749- **Added:** Pulsing urgent badge for past due items 2750- **Result:** Pink theme is now FABULOUS! ✨ 2751 2752### Shimmer Effects 2753 2754**Today's Cell**: 2755- Continuous shimmer animation (2 second loop) 2756- Multi-layer glow effect 2757- Pink and hot pink overlapping shadows 2758- Pulses from subtle to intense 2759- Extra sparkle on hover 2760 2761**Today's Date Number**: 2762- Sparkle animation (1.5 second loop) 2763- Text shadow glow effect 2764- Slight scale pulse (100% → 105%) 2765- Pink to hot pink shadow transition 2766 2767### Glow Effects 2768 2769**Event Bars**: 2770- Continuous glow pulse (2 second loop) 2771- Uses event's own color 2772- Adds pink accent glow layer 2773- Creates depth and dimension 2774 2775**Event Items**: 2776- Subtle base glow 2777- Enhanced glow on hover 2778- Slight slide animation on hover 2779- Professional yet playful 2780 2781### Gradient Shimmer 2782 2783**Headers**: 2784- Animated gradient background 2785- 3-color pink gradient flow 2786- Smooth 3-second animation 2787- Creates movement and life 2788- Applies to calendar header and event list header 2789 2790### Badge Effects 2791 2792**TODAY Badge**: 2793- Sparkle animation 2794- Synchronized with today's date 2795- Extra prominence 2796 2797**PAST DUE Badge**: 2798- Urgent pulsing effect (1 second loop) 2799- Orange glow intensifies 2800- Draws attention to urgent items 2801- Faster pulse for urgency 2802 2803### Container Bling 2804 2805**Main Container**: 2806- Multi-layer pink glow 2807- Soft outer shadow 2808- Creates floating effect 2809- Subtle but elegant 2810 2811### Animation Details 2812 2813**pink-shimmer** (2s loop): 2814``` 2815Start: Subtle 5px glow 2816Peak: Intense 35px multi-layer glow 2817End: Back to subtle 2818``` 2819 2820**pink-sparkle** (1.5s loop): 2821``` 2822Start: Base glow + scale 1.0 2823Peak: Intense glow + scale 1.05 2824End: Back to base 2825``` 2826 2827**pink-glow-pulse** (2s loop): 2828``` 2829Start: Small glow (3px, 6px) 2830Peak: Large glow (6px, 12px, 18px) 2831End: Back to small 2832``` 2833 2834**pink-gradient-shimmer** (3s loop): 2835``` 2836Gradient flows across element 2837Creates wave effect 2838Smooth continuous motion 2839``` 2840 2841**pink-pulse-urgent** (1s loop - faster!): 2842``` 2843Start: Orange glow 5px 2844Peak: Orange glow 25px (intense) 2845End: Back to 5px 2846``` 2847 2848### Visual Experience 2849 2850**Today's Cell**: 2851``` 2852┌──┬──┬──┬──┬──┬──┬──┐ 2853│ │ │ ✨ │ │ │ │ │ ← Shimmers constantly 2854│ │ │[9]│ │ │ │ │ ← Sparkles 2855│ │ │ ✨ │ │ │ │ │ ← Glows and pulses 2856└──┴──┴──┴──┴──┴──┴──┘ 2857``` 2858 2859**Event Bars**: 2860``` 2861━━━━━━━ ← Glows and pulses 2862━━━━━━━ ← Each bar animated 2863━━━━━━━ ← Creates rhythm 2864``` 2865 2866**Headers**: 2867``` 2868╔═════════════════════╗ 2869║ ~~~~~~~~~~ ║ ← Gradient flows 2870║ February 2026 ║ ← Shimmer effect 2871╚═════════════════════╝ 2872``` 2873 2874### Theme Comparison 2875 2876**Before (v5.2.8)**: 2877- Pink colors 2878- Static elements 2879- Standard shadows 2880 2881**After (v5.3.0)**: 2882- Pink colors ✓ 2883- Animated shimmer ✨ 2884- Sparkling effects 2885- Glowing pulses ✨ 2886- Moving gradients 2887- BLING! 2888 2889### Performance 2890 2891**All animations**: 2892- Hardware accelerated (transform, opacity) 2893- Smooth 60fps 2894- CSS animations (no JavaScript) 2895- Minimal CPU usage 2896- Disabled in reduced-motion preference 2897 2898### Only for Pink Theme 2899 2900**Effects only apply when**: 2901```css 2902.calendar-theme-pink 2903``` 2904 2905**Other themes unaffected**: 2906- Matrix stays Matrix 2907- Professional stays Professional 2908- Purple stays Purple 2909- Wiki stays clean 2910 2911**Pink gets all the bling!** ✨ 2912 2913### Use Cases 2914 2915**Perfect for**: 2916- Celebrating occasions 2917- Fun team calendars 2918- Personal style expression 2919- Standing out 2920- Making calendar time fabulous 2921 2922**Not just pink, but BLING pink!** ✨ 2923 2924## Version 5.2.8 (2026-02-09) - TODAY BOX USES THEME COLORS 2925 2926### Fixed: Today's Date Box Now Uses Theme Colors 2927- **Fixed:** Today's day number box now uses theme border color 2928- **Fixed:** Text color adapts to theme (white for dark themes, bg color for light) 2929- **Result:** Today box matches the theme perfectly! 2930 2931### The Issue 2932 2933Today's date had a hardcoded green box: 2934 2935**In style.css**: 2936```css 2937.cal-today .day-num { 2938 background: #008800; /* Hardcoded green! */ 2939 color: white; 2940} 2941``` 2942 2943**Didn't adapt to themes at all!** 2944 2945### The Fix 2946 2947**Now uses theme colors**: 2948```php 2949// Today's day number 2950if ($isToday) { 2951 background: $themeStyles['border'], // Theme's accent color! 2952 color: (professional theme) ? white : bg color 2953} 2954``` 2955 2956### Theme Examples 2957 2958**Matrix Theme**: 2959- Box background: `#00cc07` (matrix green) 2960- Text color: `#242424` (dark background) 2961 2962**Purple Theme**: 2963- Box background: `#9b59b6` (purple) 2964- Text color: `#2a2030` (dark background) 2965 2966**Professional Theme**: 2967- Box background: `#4a90e2` (blue) 2968- Text color: `#ffffff` (white text) 2969 2970**Pink Theme**: 2971- Box background: `#ff1493` (hot pink) 2972- Text color: `#1a0d14` (dark background) 2973 2974**Wiki Theme**: 2975- Box background: Template's `__border__` color 2976- Text color: Template's `__background_site__` color 2977 2978### Visual Result 2979 2980**Matrix Theme**: 2981``` 2982┌──┬──┬──┬──┬──┬──┬──┐ 2983│ 1│ 2│ 3│[4]│ 5│ 6│ 7│ 2984└──┴──┴──┴──┴──┴──┴──┘ 2985 ↑ 2986 Green box (#00cc07) 2987``` 2988 2989**Professional Theme**: 2990``` 2991┌──┬──┬──┬──┬──┬──┬──┐ 2992│ 1│ 2│ 3│[4]│ 5│ 6│ 7│ 2993└──┴──┴──┴──┴──┴──┴──┘ 2994 ↑ 2995 Blue box (#4a90e2) 2996``` 2997 2998**Wiki Theme**: 2999``` 3000┌──┬──┬──┬──┬──┬──┬──┐ 3001│ 1│ 2│ 3│[4]│ 5│ 6│ 7│ 3002└──┴──┴──┴──┴──┴──┴──┘ 3003 ↑ 3004 Template border color 3005``` 3006 3007### Implementation 3008 3009**Inline styles added**: 3010- Background uses `$themeStyles['border']` (theme accent) 3011- Text color uses `$themeStyles['bg']` for contrast 3012- Special case: Professional theme uses white text 3013- All with `!important` to override CSS 3014 3015**CSS cleaned up**: 3016- Removed hardcoded `#008800` background 3017- Removed hardcoded `white` color 3018- Kept structural styles (border-radius, font-weight) 3019 3020### Benefits 3021 3022**Theme Consistency**: 3023- Today box matches theme accent color 3024- Proper contrast with background 3025- Professional appearance 3026 3027**Automatic Adaptation**: 3028- Works with all themes 3029- Works with custom wiki template colors 3030- No manual adjustment needed 3031 3032**Visual Harmony**: 3033- Border color used throughout theme 3034- Today box reinforces theme identity 3035- Consistent design language 3036 3037## Version 5.2.7 (2026-02-09) - FIX GRID BACKGROUND MISMATCH 3038 3039### Fixed: Table Grid Background Now Matches Cells 3040- **Found:** `grid_bg` was using `__background_alt__` (different from cells!) 3041- **Fixed:** Changed `grid_bg` to use `__background_site__` (same as cells) 3042- **Result:** Table background no longer shows through cells! 3043 3044### The Layer Problem 3045 3046The table itself had a DIFFERENT background color than its cells! 3047 3048**Before (v5.2.6)**: 3049```php 3050'grid_bg' => __background_alt__, // Table background (#e8e8e8) 3051'cell_bg' => __background_site__, // Cell background (#f5f5f5) 3052``` 3053 3054**The table background was showing THROUGH the cells!** 3055 3056### Why This Happened 3057 3058**Visual layers**: 3059``` 3060Table Element 3061├─ background: __background_alt__ (#e8e8e8) ← Different! 3062└─ Cells 3063 └─ background: __background_site__ (#f5f5f5) ← Different! 3064 3065The table background shows through any gaps! 3066``` 3067 3068### The Fix 3069 3070**After (v5.2.7)**: 3071```php 3072'grid_bg' => __background_site__, // Table background (#f5f5f5) ✓ 3073'cell_bg' => __background_site__, // Cell background (#f5f5f5) ✓ 3074``` 3075 3076**NOW THEY MATCH!** 3077 3078### Where grid_bg Is Used 3079 3080The table element itself: 3081```html 3082<table style="background: __background_alt__"> ← Was showing through! 3083 <tbody> 3084 <tr> 3085 <td style="background: __background_site__">1</td> 3086 </tr> 3087 </tbody> 3088</table> 3089``` 3090 3091Even with cell inline styles, the TABLE background shows through! 3092 3093### All Background Sources Now Unified 3094 3095**Everything now uses __background_site__**: 3096- `bg` → __background_site__ ✓ 3097- `header_bg` → __background_site__ ✓ 3098- `grid_bg` → __background_site__ ✓ (JUST FIXED!) 3099- `cell_bg` → __background_site__ ✓ 3100 3101**Perfect consistency!** 3102 3103### Why It Was Different 3104 3105**Originally the grid was meant to show borders**: 3106- `grid_bg` was `__background_alt__` (slightly different) 3107- Created visual separation between cells 3108- But with transparent/thin cells, it showed through! 3109 3110**Now unified for consistency!** 3111 3112### Visual Result 3113 3114**Before (layers visible)**: 3115``` 3116┌─────────────────┐ 3117│ Grid (#e8e8e8) │ ← Showing through! 3118│ ┌──┬──┬──┐ │ 3119│ │ │ │ │ │ ← Cells (#f5f5f5) 3120│ └──┴──┴──┘ │ 3121└─────────────────┘ 3122``` 3123 3124**After (unified)**: 3125``` 3126┌─────────────────┐ 3127│ Grid (#f5f5f5) │ ← Same color! 3128│ ┌──┬──┬──┐ │ 3129│ │ │ │ │ │ ← Cells (#f5f5f5) 3130│ └──┴──┴──┘ │ 3131└─────────────────┘ 3132Perfect match! 3133``` 3134 3135### Complete Background Mapping 3136 3137**All using __background_site__ now**: 3138- Main container background 3139- Left panel background 3140- Right panel background 3141- Eventlist background 3142- Calendar grid background ← JUST FIXED 3143- Calendar cell backgrounds 3144- Event item backgrounds 3145- Clock header background 3146- Search input background 3147- Past events toggle 3148 3149**EVERYTHING UNIFIED!** 3150 3151## Version 5.2.6 (2026-02-09) - REMOVE CONTAINER BACKGROUNDS 3152 3153### Fixed: Removed Container Backgrounds Showing Through 3154- **Found:** `.calendar-compact-container` had `background: #ffffff;` 3155- **Found:** `.calendar-compact-left` had `background: #fafafa;` 3156- **Found:** `.calendar-compact-right` had `background: #ffffff;` 3157- **Found:** `.event-search-input-inline` had `background: white;` 3158- **Found:** `.past-events-toggle` had `background: #f5f5f5;` 3159- **Result:** Container backgrounds no longer show through cells! 3160 3161### The Container Problem 3162 3163The parent containers had hardcoded backgrounds that were showing through! 3164 3165**Container backgrounds (lines 4-91)**: 3166```css 3167.calendar-compact-container { 3168 background: #ffffff; /* ← Main container! */ 3169} 3170 3171.calendar-compact-left { 3172 background: #fafafa; /* ← Left panel (calendar side)! */ 3173} 3174 3175.calendar-compact-right { 3176 background: #ffffff; /* ← Right panel (events side)! */ 3177} 3178``` 3179 3180**These were showing through the cells and events!** 3181 3182### Why Containers Matter 3183 3184Even though cells have inline styles, if the CONTAINER behind them has a different background, it can show through: 3185 3186``` 3187Container (#fafafa) ← Showing through! 3188 └─ Table Cell (#f5f5f5) ← Transparent areas 3189 └─ Content 3190``` 3191 3192### All Backgrounds Removed 3193 3194**v5.2.6 removes**: 3195- `.calendar-compact-container` background 3196- `.calendar-compact-left` background 3197- `.calendar-compact-right` background 3198- `.event-search-input-inline` background 3199- `.past-events-toggle` background & hover 3200 3201**v5.2.5 removed**: 3202- `.calendar-compact-grid tbody td` background 3203- `.calendar-compact-grid thead th` background 3204 3205**v5.2.4 removed**: 3206- `.cal-empty`, `.cal-today`, `.cal-has-events` backgrounds 3207 3208**v5.2.3 removed**: 3209- `.event-compact-item` background 3210 3211**ALL container and element backgrounds eliminated!** 3212 3213### What Should Work Now 3214 3215**Calendar cells**: No container background showing through ✓ 3216**Event items**: No container background showing through ✓ 3217**Search bar**: Uses template color ✓ 3218**Past events toggle**: Uses template color ✓ 3219 3220### Complete List of Fixes 3221 3222**Containers**: 3223- Main container ✓ 3224- Left panel ✓ 3225- Right panel ✓ 3226 3227**Elements**: 3228- Table cells ✓ 3229- Event items ✓ 3230- Search input ✓ 3231- Past events toggle ✓ 3232 3233**EVERYTHING removed!** 3234 3235### Critical: Clear Caches 3236 3237**Must clear caches or won't work**: 32381. Hard refresh: Ctrl+Shift+R (5 times!) 32392. Clear DokuWiki cache 32403. Close browser completely 32414. Reopen and test 3242 3243**CSS caching is EXTREMELY persistent!** 3244 3245## Version 5.2.5 (2026-02-09) - REMOVE TABLE CELL CSS BACKGROUNDS 3246 3247### Fixed: Removed Hardcoded Backgrounds from Table Cells 3248- **Found:** `.calendar-compact-grid tbody td` had `background: #ffffff;`! 3249- **Found:** `.calendar-compact-grid tbody td:hover` had `background: #f0f7ff;`! 3250- **Found:** `.calendar-compact-grid thead th` had `background: #f8f8f8;`! 3251- **Fixed:** Removed ALL hardcoded backgrounds from table CSS 3252- **Result:** Calendar table cells finally use template colors! 3253 3254### The REAL Culprits 3255 3256The generic table CSS was overriding everything! 3257 3258**In style.css (lines 307-356)**: 3259```css 3260.calendar-compact-grid thead th { 3261 background: #f8f8f8; /* ← Header cells hardcoded! */ 3262} 3263 3264.calendar-compact-grid tbody td { 3265 background: #ffffff; /* ← ALL table cells hardcoded! */ 3266} 3267 3268.calendar-compact-grid tbody td:hover { 3269 background: #f0f7ff; /* ← Hover state hardcoded! */ 3270} 3271``` 3272 3273**These apply to ALL `<td>` and `<th>` elements in the calendar table!** 3274 3275### Why This Was the Last One 3276 3277**CSS Specificity Order**: 32781. `.calendar-compact-grid tbody td` (generic - applies to ALL cells) 32792. `.cal-empty`, `.cal-today`, `.cal-has-events` (specific - applies to some cells) 32803. Inline styles (should win but didn't) 3281 3282**We removed the specific ones (v5.2.4), but the generic one was still there!** 3283 3284### What We've Removed 3285 3286**v5.2.3**: 3287- `.event-compact-item` background 3288- `.event-compact-item:hover` background 3289 3290**v5.2.4**: 3291- `.cal-empty` background & hover 3292- `.cal-today` background & hover 3293- `.cal-has-events` background & hover 3294 3295**v5.2.5 (FINAL)**: 3296- `.calendar-compact-grid tbody td` background ✓ 3297- `.calendar-compact-grid tbody td:hover` background ✓ 3298- `.calendar-compact-grid thead th` background ✓ 3299 3300**All CSS background overrides ELIMINATED!** 3301 3302### Why It Took 5 Versions 3303 3304**CSS had layers of hardcoded backgrounds**: 3305 3306``` 3307Layer 1: Table cells (.calendar-compact-grid tbody td) 3308 ↓ Overrode inline styles 3309Layer 2: Cell states (.cal-today, .cal-empty, etc.) 3310 ↓ Overrode table cells 3311Layer 3: Event items (.event-compact-item) 3312 ↓ Overrode inline styles 3313 3314ALL had to be removed! 3315``` 3316 3317**We kept finding more specific CSS, but the base table CSS was there all along!** 3318 3319### Visual Result 3320 3321**NOW everything matches**: 3322``` 3323Calendar Table: 3324┌──┬──┬──┬──┬──┬──┬──┐ 3325│ S│ M│ T│ W│ T│ F│ S│ ← Headers: __background_site__ 3326├──┼──┼──┼──┼──┼──┼──┤ 3327│ 1│ 2│ 3│ 4│ 5│ 6│ 7│ ← Cells: __background_site__ 3328├──┼──┼──┼──┼──┼──┼──┤ 3329│ 8│ 9│10│11│12│13│14│ ← All: __background_site__ 3330└──┴──┴──┴──┴──┴──┴──┘ 3331 3332Sidebar Events: 3333┌────────────────────────┐ 3334│ Event │ ← __background_site__ 3335│ Event │ ← __background_site__ 3336└────────────────────────┘ 3337 3338FINALLY ALL MATCHING! ✓ 3339``` 3340 3341### Complete List of Removed CSS 3342 3343**ALL hardcoded backgrounds removed**: 3344- `.event-compact-item` background 3345- `.event-compact-item:hover` background 3346- `.cal-empty` background & hover 3347- `.cal-today` background & hover 3348- `.cal-has-events` background & hover 3349- `.calendar-compact-grid tbody td` background ← NEW 3350- `.calendar-compact-grid tbody td:hover` background ← NEW 3351- `.calendar-compact-grid thead th` background ← NEW 3352 3353**Every single CSS background override is GONE!** 3354 3355### Testing Steps 3356 3357**After installing v5.2.5**: 3358 33591. **Clear browser cache**: Ctrl+Shift+R (3 times!) 33602. **Clear DokuWiki cache**: Click the button 33613. **Close browser completely**: Restart it 33624. **Visit page**: Should finally see matching backgrounds 3363 3364**CSS is EXTREMELY sticky - may need to clear multiple times!** 3365 3366### This Should Be It 3367 3368**No more CSS overrides exist** (we've checked the entire file): 3369- Table cells ✓ Fixed 3370- Cell states ✓ Fixed 3371- Event items ✓ Fixed 3372- Headers ✓ Fixed 3373- Hover states ✓ Fixed 3374 3375**All backgrounds now come from inline styles using template colors!** 3376 3377## Version 5.2.4 (2026-02-09) - REMOVE CALENDAR CELL CSS BACKGROUNDS 3378 3379### Fixed: Removed Hardcoded Backgrounds from Calendar Cells 3380- **Found:** Calendar cell CSS had hardcoded backgrounds with `!important`! 3381- **Fixed:** Removed backgrounds from `.cal-today`, `.cal-empty`, `.cal-has-events` CSS 3382- **Result:** Calendar cells now use template colors! 3383 3384### The Second Culprit 3385 3386MORE hardcoded backgrounds in the CSS file! 3387 3388**In style.css (lines 359-382)**: 3389```css 3390.cal-empty { 3391 background: #fafafa !important; /* ← Overriding inline styles! */ 3392} 3393 3394.cal-today { 3395 background: #e8f5e9 !important; /* ← Overriding today cell! */ 3396} 3397 3398.cal-today:hover { 3399 background: #c8e6c9 !important; /* ← Overriding hover! */ 3400} 3401 3402.cal-has-events { 3403 background: #fffbf0; /* ← Overriding event cells! */ 3404} 3405 3406.cal-has-events:hover { 3407 background: #fff4d9; /* ← Overriding hover! */ 3408} 3409``` 3410 3411**These were ALL overriding the inline styles!** 3412 3413### The Fix 3414 3415**Removed all hardcoded backgrounds**: 3416```css 3417.cal-empty { 3418 /* background removed - inline style handles this */ 3419 cursor: default !important; 3420} 3421 3422.cal-today { 3423 /* background removed - inline style handles this */ 3424} 3425 3426.cal-has-events { 3427 /* background removed - inline style handles this */ 3428} 3429 3430/* Hover states also removed */ 3431``` 3432 3433### What Was Overridden 3434 3435**v5.2.3 fixed**: 3436- Event items in sidebar ✓ 3437 3438**v5.2.4 fixes**: 3439- Calendar day cells ✓ 3440- Today cell ✓ 3441- Empty cells ✓ 3442- Cells with events ✓ 3443- All hover states ✓ 3444 3445### Why This Kept Happening 3446 3447**CSS had hardcoded backgrounds everywhere**: 34481. Event items: `#ffffff` (fixed in v5.2.3) 34492. Calendar cells: Multiple colors (fixed in v5.2.4) 34503. **All with `!important` flags!** 3451 3452**The inline styles couldn't override them!** 3453 3454### Visual Result 3455 3456**Now ALL backgrounds match**: 3457``` 3458Calendar Grid: 3459┌──┬──┬──┬──┬──┬──┬──┐ 3460│ │ │ │ │ │ │ │ ← All use __background_site__ 3461├──┼──┼──┼──┼──┼──┼──┤ 3462│ │██│ │ │ │ │ │ ← Today uses __background_neu__ 3463├──┼──┼──┼──┼──┼──┼──┤ 3464│ │ │ │ │ │ │ │ ← All match template 3465└──┴──┴──┴──┴──┴──┴──┘ 3466 3467Sidebar Events: 3468┌────────────────────────┐ 3469│ Event │ ← Uses __background_site__ 3470│ Event │ ← Uses __background_site__ 3471└────────────────────────┘ 3472 3473Perfect consistency! 3474``` 3475 3476### CSS Removed 3477 3478**Calendar cells**: 3479- `.cal-empty` background 3480- `.cal-empty:hover` background 3481- `.cal-today` background 3482- `.cal-today:hover` background 3483- `.cal-has-events` background 3484- `.cal-has-events:hover` background 3485 3486**All gone!** ✓ 3487 3488### Important: Clear Caches Again! 3489 3490After installing v5.2.4: 3491 34921. **Hard refresh browser**: Ctrl+Shift+R (twice!) 34932. **Clear DokuWiki cache**: Admin → Clear Cache 34943. **May need to restart browser**: To clear CSS cache 3495 3496**Old CSS is VERY sticky!** 3497 3498### Why It Took So Long 3499 3500**Multiple CSS overrides**: 3501- Event items (v5.2.3) ✓ Fixed 3502- Calendar cells (v5.2.4) ✓ Fixed 3503- Each with different classes 3504- Each with `!important` 3505- Hidden throughout CSS file 3506 3507**Found them all now!** 3508 3509## Version 5.2.3 (2026-02-09) - REMOVE HARDCODED CSS BACKGROUNDS 3510 3511### Fixed: Removed Hardcoded Backgrounds from CSS 3512- **Found:** CSS file had hardcoded `background: #ffffff;` overriding inline styles! 3513- **Fixed:** Removed hardcoded backgrounds from `.event-compact-item` CSS 3514- **Result:** Event backgrounds now properly use template colors! 3515 3516### The Root Cause 3517 3518The CSS file was overriding the inline styles with hardcoded white backgrounds! 3519 3520**In style.css (lines 599-616)**: 3521```css 3522.event-compact-item { 3523 background: #ffffff; /* ← This was overriding inline styles! */ 3524} 3525 3526.event-compact-item:hover { 3527 background: #f8f9fa; /* ← And this on hover! */ 3528} 3529``` 3530 3531**Even though inline styles had `!important`**, the CSS was still being applied because it comes after in the cascade! 3532 3533### The Fix 3534 3535**Removed hardcoded backgrounds from CSS**: 3536```css 3537.event-compact-item { 3538 /* background removed - set via inline style with template colors */ 3539 display: flex; 3540 /* ... other styles ... */ 3541} 3542 3543.event-compact-item:hover { 3544 box-shadow: 0 1px 3px rgba(0,0,0,0.08); 3545 /* background removed - inline style handles this */ 3546} 3547``` 3548 3549### Why This Was So Difficult to Find 3550 3551**CSS Specificity & Cascade**: 35521. Inline styles with `!important` should win 35532. But CSS that comes after can still apply 35543. The hardcoded `background: #ffffff` was silently overriding 35554. All the PHP code was correct - it was the CSS! 3556 3557**What We Were Doing**: 3558- ✓ Reading template colors correctly 3559- ✓ Setting `cell_bg` to `__background_site__` correctly 3560- ✓ Applying inline styles with `!important` correctly 3561- ✗ CSS file was overriding everything! 3562 3563### What Was Affected 3564 3565**Event items in**: 3566- Main calendar sidebar 3567- Standalone event list 3568- Sidebar widget 3569- All event displays 3570 3571**All had white backgrounds hardcoded in CSS!** 3572 3573### Now Working 3574 3575**Events use template colors**: 3576```html 3577<div class="event-compact-item" 3578 style="background: #f5f5f5 !important; ..."> 3579 ← Now this inline style actually works! 3580</div> 3581``` 3582 3583**No CSS override** ✓ 3584 3585### Testing 3586 3587To verify this works: 35881. Clear browser cache (important!) 35892. Clear DokuWiki cache 35903. Reload page 35914. Events should now match eventlist background 3592 3593**Browser caching can make old CSS persist!** 3594 3595### Visual Result 3596 3597**All backgrounds now matching**: 3598``` 3599┌────────────────────────────┐ 3600│ Eventlist (#f5f5f5) │ ← Template color 3601├────────────────────────────┤ 3602│ Event (#f5f5f5) │ ← Template color (was #ffffff) 3603├────────────────────────────┤ 3604│ Event (#f5f5f5) │ ← Template color (was #ffffff) 3605└────────────────────────────┘ 3606 3607Perfect match! 3608``` 3609 3610### Why Everything Else Worked 3611 3612**Clock area, calendar cells, etc.** didn't have hardcoded CSS backgrounds: 3613- They only had inline styles ✓ 3614- Inline styles worked correctly ✓ 3615- Only event items had the CSS override ✗ 3616 3617### Important Notes 3618 3619**Clear caches**: 3620- Browser cache (Ctrl+Shift+R or Cmd+Shift+R) 3621- DokuWiki cache (Admin → Clear Cache) 3622- Old CSS may be cached! 3623 3624**This was the culprit all along!** 3625 3626## Version 5.2.2 (2026-02-09) - FIX CLOCK AREA BACKGROUND 3627 3628### Fixed: Clock Area Now Matches Event Cells 3629- **Fixed:** `header_bg` now uses `__background_site__` (was `__background_alt__`) 3630- **Result:** Clock/Today header matches event cell backgrounds! 3631 3632### The Issue 3633 3634The clock area (Today header) was using a different background: 3635 3636**Before (v5.2.1)**: 3637```php 3638'header_bg' => __background_alt__, // Different color (gray #e8e8e8) 3639'cell_bg' => __background_site__, // Event cells (#f5f5f5) 3640``` 3641 3642**After (v5.2.2)**: 3643```php 3644'header_bg' => __background_site__, // Same as cells (#f5f5f5) ✓ 3645'cell_bg' => __background_site__, // Event cells (#f5f5f5) ✓ 3646``` 3647 3648### What's the Clock Area? 3649 3650The clock/Today header in the sidebar: 3651``` 3652┌────────────────────────────┐ 3653│ 3:45:23 PM │ ← Clock area (header_bg) 3654│ ️ --° | Sun, Feb 9, 2026 │ 3655└────────────────────────────┘ 3656``` 3657 3658### All Backgrounds Now Unified 3659 3660**Everything now uses __background_site__**: 3661- Eventlist background ✓ 3662- Calendar cells ✓ 3663- Event items ✓ 3664- Clock/Today header ✓ 3665- Sidebar widget ✓ 3666- All backgrounds match! ✓ 3667 3668### Visual Result 3669 3670**Complete consistency**: 3671``` 3672┌────────────────────────────┐ 3673│ 3:45:23 PM │ ← Same background 3674│ ️ --° | Sun, Feb 9, 2026 │ 3675├────────────────────────────┤ 3676│ Meeting at 2pm │ ← Same background 3677│ Description... │ 3678├────────────────────────────┤ 3679│ Another event │ ← Same background 3680│ More details... │ 3681└────────────────────────────┘ 3682 3683All using __background_site__ (#f5f5f5) 3684``` 3685 3686**Perfect visual harmony!** 3687 3688## Version 5.2.1 (2026-02-09) - FIX: MATCH EVENTLIST BACKGROUND 3689 3690### Fixed: Calendar Cells Now Match Eventlist Background 3691- **Fixed:** Changed `cell_bg` to use `__background_site__` (not `__background__`) 3692- **Result:** Calendar cells now match the eventlist background perfectly! 3693 3694### The Real Issue 3695 3696The eventlist was showing the CORRECT background color all along! 3697 3698**Eventlist was using**: 3699- `bg` → `__background_site__` ✓ (This was correct!) 3700 3701**Calendar cells were using**: 3702- `cell_bg` → `__background__` ✗ (This was wrong!) 3703 3704**They didn't match!** 3705 3706### The Correct Fix 3707 3708**Now everything uses __background_site__**: 3709```php 3710'bg' => __background_site__, // Eventlist (was already correct) 3711'cell_bg' => __background_site__, // Cells (now fixed to match) 3712``` 3713 3714### Why __background_site__? 3715 3716The eventlist sidebar and calendar are meant to match the **page/site background**, not the inner content area background: 3717 3718``` 3719Page Layout: 3720┌────────────────────────────────────┐ 3721│ __background_site__ (page bg) │ ← This is where calendar lives 3722│ │ 3723│ ┌──────────────────────────────┐ │ 3724│ │ __background__ (content bg) │ │ ← Wiki article content 3725│ │ │ │ 3726│ └──────────────────────────────┘ │ 3727│ │ 3728└────────────────────────────────────┘ 3729``` 3730 3731**Calendar should match the page background, not the content background!** 3732 3733### Template Example 3734 3735Typical DokuWiki template: 3736```ini 3737__background_site__ = "#f5f5f5" (Light gray - page background) 3738__background__ = "#ffffff" (White - content area) 3739``` 3740 3741**Before (v5.2.0)**: 3742- Eventlist: `#f5f5f5` (light gray) ✓ Correct 3743- Calendar cells: `#ffffff` (white) ✗ Wrong - didn't match 3744 3745**After (v5.2.1)**: 3746- Eventlist: `#f5f5f5` (light gray) ✓ Correct 3747- Calendar cells: `#f5f5f5` (light gray) ✓ Correct - MATCHED! 3748 3749### All Backgrounds Now Unified 3750 3751**Everything now uses __background_site__**: 3752- Eventlist sidebar background ✓ 3753- Main calendar background ✓ 3754- Calendar day cells ✓ 3755- Sidebar widget ✓ 3756- Event items ✓ 3757- Input fields ✓ 3758- Buttons ✓ 3759 3760**All perfectly matched to the page background!** 3761 3762### Why Version 5.2.0 Was Wrong 3763 3764I 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. 3765 3766**The eventlist knew what it was doing all along!** The cells just needed to catch up. 3767 3768## Version 5.2.0 (2026-02-09) - UNIFIED WIKI THEME BACKGROUNDS 3769**Note**: This version went the wrong direction. See v5.2.1 for the correct fix. 3770 3771### Fixed: All Backgrounds Now Use __background__ 3772- **Fixed:** `bg` now uses `__background__` instead of `__background_site__` 3773- **Fixed:** Eventlist, calendar cells, and sidebar all match now 3774- **Result:** Completely unified background throughout! 3775 3776### The Issue 3777 3778Different parts of the calendar were using different background sources: 3779 3780**Before (v5.1.9)**: 3781```php 3782'bg' => __background_site__ // Eventlist background (outer page) 3783'cell_bg' => __background__ // Cell backgrounds (content area) 3784``` 3785 3786**These are different colors!** 3787- `__background_site__` = Outer page wrapper (often gray) 3788- `__background__` = Main content area (often white) 3789 3790### The Fix 3791 3792**After (v5.2.0)**: 3793```php 3794'bg' => __background__ // Eventlist background ✓ 3795'cell_bg' => __background__ // Cell backgrounds ✓ 3796``` 3797 3798**Both use the same source!** 3799 3800### What Uses 'bg' 3801 3802The `bg` color is used for: 3803- Eventlist sidebar background 3804- Main calendar container 3805- Sidebar widget background 3806- Form backgrounds 3807- Event dialogs 3808 3809### What Uses 'cell_bg' 3810 3811The `cell_bg` color is used for: 3812- Calendar day cells 3813- Event item backgrounds 3814- Input field backgrounds 3815- Button backgrounds 3816 3817### Why This Matters 3818 3819**Template color hierarchy**: 3820``` 3821__background_site__ → Outer page/body (e.g., #f5f5f5 light gray) 3822__background__ → Main content area (e.g., #ffffff white) 3823__background_alt__ → Sections/headers 3824__background_neu__ → Highlights 3825``` 3826 3827**We want all calendar backgrounds to match the main content area!** 3828 3829### Visual Comparison 3830 3831**Before (v5.1.9)**: Mismatched backgrounds 3832``` 3833┌────────────────────────────────┐ 3834│ Eventlist (gray #f5f5f5) │ ← __background_site__ 3835└────────────────────────────────┘ 3836 3837┌────────────────────────────────┐ 3838│ Calendar │ 3839│ ┌──┬──┬──┬──┬──┬──┬──┐ │ 3840│ │ │ │ │ │ │ │ │ │ ← __background__ (white #fff) 3841│ └──┴──┴──┴──┴──┴──┴──┘ │ 3842└────────────────────────────────┘ 3843Different colors - looks inconsistent 3844``` 3845 3846**After (v5.2.0)**: Unified backgrounds 3847``` 3848┌────────────────────────────────┐ 3849│ Eventlist (white #fff) │ ← __background__ 3850└────────────────────────────────┘ 3851 3852┌────────────────────────────────┐ 3853│ Calendar │ 3854│ ┌──┬──┬──┬──┬──┬──┬──┐ │ 3855│ │ │ │ │ │ │ │ │ │ ← __background__ (white #fff) 3856│ └──┴──┴──┴──┴──┴──┴──┘ │ 3857└────────────────────────────────┘ 3858Same color - perfectly consistent! 3859``` 3860 3861### Template Examples 3862 3863**Light Template**: 3864```ini 3865__background_site__ = "#f5f5f5" (light gray) 3866__background__ = "#ffffff" (white) 3867``` 3868 3869**Before**: Eventlist gray, cells white 3870**After**: Eventlist white, cells white ✓ 3871 3872**Dark Template**: 3873```ini 3874__background_site__ = "#1a1a1a" (very dark) 3875__background__ = "#2d2d2d" (dark) 3876``` 3877 3878**Before**: Eventlist very dark, cells dark 3879**After**: Eventlist dark, cells dark ✓ 3880 3881### Benefits 3882 3883**Visual Consistency**: 3884- All backgrounds match 3885- Clean, unified appearance 3886- Professional look 3887 3888**Correct Template Integration**: 3889- Uses content area color (not page wrapper) 3890- Matches wiki content area 3891- Proper color hierarchy 3892 3893**Works Everywhere**: 3894- Light templates ✓ 3895- Dark templates ✓ 3896- Custom templates ✓ 3897 3898### All Backgrounds Unified 3899 3900**Now using __background__**: 3901- Eventlist background ✓ 3902- Calendar cells ✓ 3903- Sidebar widget ✓ 3904- Event items ✓ 3905- Input fields ✓ 3906- Buttons ✓ 3907- Dialogs ✓ 3908 3909**Perfect harmony throughout!** 3910 3911## Version 5.1.9 (2026-02-09) - FIX WIKI THEME EVENT BACKGROUNDS 3912 3913### Fixed: Wiki Theme Event Backgrounds Not Showing 3914- **Fixed:** Wiki theme fallback used CSS variables in inline styles (doesn't work!) 3915- **Fixed:** Replaced CSS variables with actual hex colors 3916- **Result:** Event backgrounds now show correctly with template colors! 3917 3918### The Problem 3919 3920CSS variables like `var(--__background__, #fff)` don't work in inline `style=""` attributes! 3921 3922**Before (broken)**: 3923```php 3924'cell_bg' => 'var(--__background__, #fff)', // Doesn't work in inline styles! 3925``` 3926 3927**After (fixed)**: 3928```php 3929'cell_bg' => '#fff', // Actual hex color works! 3930``` 3931 3932### What Was Affected 3933 3934**When style.ini read successfully**: 3935- ✅ Worked fine (uses actual hex colors from file) 3936 3937**When style.ini fallback used**: 3938- ❌ Events had no background 3939- ❌ CSS variables don't work in inline styles 3940- ❌ Looked broken 3941 3942### The Fix 3943 3944**Wiki theme fallback now uses real colors**: 3945```php 3946'wiki' => [ 3947 'bg' => '#f5f5f5', // Real hex (was: var(--__background_site__)) 3948 'border' => '#ccc', // Real hex (was: var(--__border__)) 3949 'cell_bg' => '#fff', // Real hex (was: var(--__background__)) 3950 'cell_today_bg' => '#eee', // Real hex (was: var(--__background_neu__)) 3951 'text_primary' => '#333', // Real hex (was: var(--__text__)) 3952 'text_bright' => '#2b73b7', // Real hex (was: var(--__link__)) 3953 'text_dim' => '#666', // Real hex (was: var(--__text_neu__)) 3954 'grid_bg' => '#e8e8e8', // Real hex (was: var(--__background_alt__)) 3955 // ... all colors now use real hex values 3956] 3957``` 3958 3959### Why CSS Variables Don't Work 3960 3961**CSS variables work**: 3962```css 3963.some-class { 3964 background: var(--__background__, #fff); /* ✓ Works in CSS */ 3965} 3966``` 3967 3968**CSS variables DON'T work**: 3969```html 3970<div style="background: var(--__background__, #fff)"> <!-- ✗ Doesn't work --> 3971``` 3972 3973### How It Works Now 3974 3975**Priority system**: 39761. **Try reading style.ini** → Use actual template hex colors ✓ 39772. **If file not found** → Use fallback hex colors ✓ 39783. **Never use CSS variables in inline styles** ✓ 3979 3980**Both paths now work correctly!** 3981 3982### Visual Result 3983 3984**Events now have proper backgrounds**: 3985``` 3986┌──────────────────────────┐ 3987│ Meeting at 2pm │ ← White background (#fff) 3988│ Description here... │ 3989│ [✏️ Edit] [️ Delete] │ 3990└──────────────────────────┘ 3991 3992Not: 3993┌──────────────────────────┐ 3994│ Meeting at 2pm │ ← No background (broken) 3995│ Description here... │ 3996└──────────────────────────┘ 3997``` 3998 3999### Affected Areas 4000 4001**All event displays**: 4002- Main calendar events ✓ 4003- Sidebar widget events ✓ 4004- Event list items ✓ 4005- Event backgrounds ✓ 4006- Button backgrounds ✓ 4007- Input field backgrounds ✓ 4008 4009**Everything uses real colors now!** 4010 4011## Version 5.1.8 (2026-02-09) - IMPROVED UPDATE TAB LAYOUT 4012 4013### Reorganized: Better Update Tab Layout 4014- **Moved:** Current Version section to the top 4015- **Combined:** Upload and Important Notes side-by-side 4016- **Improved:** Space-efficient two-column layout 4017- **Result:** More information visible at once! 4018 4019### New Layout Order 4020 4021**Version 5.1.8**: 4022``` 40231. Current Version (at top - see what you have) 40242. Upload + Important Notes (side-by-side) 40253. Recent Changes (changelog) 40264. Backups 4027``` 4028 4029### Side-by-Side Design 4030 4031**Upload form (left 60%) + Important Notes (right 40%)**: 4032``` 4033┌──────────────────────────────────────────┐ 4034│ Current Version │ 4035│ Version: 5.1.8 │ 4036│ ✅ Permissions: OK │ 4037└──────────────────────────────────────────┘ 4038 4039┌─────────────────────┬────────────────────┐ 4040│ Upload New │ ⚠️ Important Notes │ 4041│ [Choose File] │ • Replaces files │ 4042│ ☑ Backup first │ • Config preserved │ 4043│ [Upload] [Clear] │ • Events safe │ 4044└─────────────────────┴────────────────────┘ 4045``` 4046 4047### Benefits 4048 4049**Current Version First**: 4050- See what you have immediately 4051- Check permissions at a glance 4052- Know if ready to update 4053 4054**Side-by-Side Layout**: 4055- Upload form and warnings together 4056- Read notes while choosing file 4057- More efficient use of space 4058- Less scrolling needed 4059 4060**Better Information Flow**: 40611. See current version ✓ 40622. Upload new version with notes visible ✓ 40633. Review recent changes ✓ 40644. Manage backups ✓ 4065 4066### Visual Comparison 4067 4068**Before (v5.1.7)**: 4069``` 4070Important Notes (full width) 4071↓ 4072Upload Form (full width) 4073↓ 4074Current Version 4075↓ 4076Recent Changes 4077↓ 4078Backups 4079``` 4080 4081**After (v5.1.8)**: 4082``` 4083Current Version (full width) 4084↓ 4085Upload (60%) | Notes (40%) 4086↓ 4087Recent Changes 4088↓ 4089Backups 4090``` 4091 4092**More compact, better organized!** 4093 4094### Responsive Design 4095 4096**Wide screens**: 4097- Upload and notes side-by-side 4098- Full 1200px width utilized 4099- Efficient space usage 4100 4101**Narrow screens**: 4102- Sections stack gracefully 4103- Flex layout adapts 4104- Still fully functional 4105 4106### Layout Details 4107 4108**Current Version Section**: 4109- Full width (1200px max) 4110- Shows version, author, description 4111- Permission status with icons 4112- Helpful fix commands if needed 4113 4114**Upload/Notes Section**: 4115- Flexbox layout with gap 4116- Upload: `flex:1` (grows) 4117- Notes: `flex:0 0 350px` (fixed 350px) 4118- Both have proper min-width 4119 4120**Recent Changes Section**: 4121- Full width (1200px max) 4122- Compact scrollable view 4123- Color-coded change types 4124- Last 10 versions shown 4125 4126**Backups Section**: 4127- Full width (1200px max) 4128- Manual backup button 4129- Scrollable file list 4130- All actions accessible 4131 4132### Improved Max Widths 4133 4134All sections now use `max-width:1200px` (previously 900px): 4135- Better use of wide screens 4136- Still responsive on narrow screens 4137- Consistent throughout tab 4138 4139## Version 5.1.7 (2026-02-09) - FIX SYNTAX ERROR 4140 4141### Fixed: Extra Closing Brace 4142- **Fixed:** ParseError on line 1936 (extra closing brace) 4143- **Result:** Manual backup feature now works correctly! 4144 4145### What Was Wrong 4146 4147Extra `}` after the backup section: 4148 4149**Before (broken)**: 4150```php 4151echo '</div>'; 4152} // ← Extra closing brace! 4153 4154echo '<script> 4155``` 4156 4157**After (fixed)**: 4158```php 4159echo '</div>'; 4160 4161echo '<script> 4162``` 4163 4164**Manual backup feature now fully functional!** ✅ 4165 4166## Version 5.1.6 (2026-02-09) - MANUAL BACKUP ON DEMAND 4167 4168### Added: Create Backup Manually Anytime 4169- **Added:** "Create Backup Now" button in Backups section 4170- **Added:** Manual backup action handler with full verification 4171- **Added:** Backups section always visible (even with no backups) 4172- **Added:** Success message showing file size and file count 4173- **Result:** Create backups anytime without needing to upload! 4174 4175### Manual Backup Button 4176 4177**New Layout**: 4178``` 4179┌─────────────────────────────────────┐ 4180│ Backups [ Create Backup Now] │ 4181├─────────────────────────────────────┤ 4182│ Backup File Size │ 4183│ calendar.backup.v5.1.6... 243 KB │ 4184│ [ Download] [✏️ Rename] [️ Delete] │ 4185└─────────────────────────────────────┘ 4186``` 4187 4188**Always visible - even with no backups**: 4189``` 4190┌─────────────────────────────────────┐ 4191│ Backups [ Create Backup Now] │ 4192├─────────────────────────────────────┤ 4193│ No backups yet. Click "Create │ 4194│ Backup Now" to create your first │ 4195│ backup. │ 4196└─────────────────────────────────────┘ 4197``` 4198 4199### How It Works 4200 4201**Click the button**: 42021. Confirm: "Create a backup of the current plugin version?" 42032. System creates backup ZIP 42043. Verifies: File count (30+ files) 42054. Verifies: File size (200KB+) 42065. Shows success: "✓ Manual backup created: filename.zip (243 KB, 31 files)" 4207 4208**Backup naming**: 4209``` 4210calendar.backup.v5.1.6.manual.2026-02-09_12-30-45.zip 4211 ^^^^^^ 4212 "manual" tag identifies manual backups 4213``` 4214 4215### Use Cases 4216 4217**Before updates**: 4218- Create safety backup before uploading new version 4219- Have multiple restore points 4220- Test new features with fallback 4221 4222**Regular backups**: 4223- Weekly/monthly backup schedule 4224- Before making configuration changes 4225- After important customizations 4226 4227**Development**: 4228- Backup before code experiments 4229- Save working states 4230- Quick rollback points 4231 4232### Full Verification 4233 4234**Same checks as automatic backups**: 4235- ✅ File count check (minimum 10, expected 30+) 4236- ✅ File size check (minimum 1KB, expected 200KB+) 4237- ✅ Existence check (file actually created) 4238- ✅ Automatic cleanup on failure 4239 4240**Success message includes**: 4241- Backup filename 4242- File size (human-readable) 4243- Number of files backed up 4244 4245### Example Messages 4246 4247**Success**: 4248``` 4249✓ Manual backup created successfully: 4250 calendar.backup.v5.1.6.manual.2026-02-09_12-30-45.zip 4251 (243 KB, 31 files) 4252``` 4253 4254**Failure Examples**: 4255``` 4256❌ Plugin directory is not readable. 4257 Please check permissions. 4258 4259❌ Backup incomplete: Only 5 files were added (expected 30+). 4260 Backup failed. 4261 4262❌ Backup file is too small (342 bytes). 4263 Only 3 files were added. Backup failed. 4264``` 4265 4266### Benefits 4267 4268**On-Demand Safety**: 4269- Create backups anytime 4270- No need to upload new version 4271- Quick and easy 4272 4273**Peace of Mind**: 4274- Backup before risky changes 4275- Multiple restore points 4276- Safe experimentation 4277 4278**Professional Workflow**: 4279- Regular backup schedule 4280- Version snapshots 4281- Disaster recovery 4282 4283### Backup Section Improvements 4284 4285**Always Visible**: 4286- Section shows even with 0 backups 4287- Button always accessible 4288- Clear call-to-action 4289 4290**Better Header**: 4291- Title and button on same row 4292- Clean, professional layout 4293- Space-efficient design 4294 4295### Technical Details 4296 4297**New Action**: `create_manual_backup` 4298 4299**New Function**: `createManualBackup()` 4300- Gets current version 4301- Creates timestamped filename with "manual" tag 4302- Uses same verification as auto-backups 4303- Shows detailed success/error messages 4304 4305**File Naming Convention**: 4306``` 4307Automatic (on upload): 4308calendar.backup.v5.1.6.2026-02-09_12-30-45.zip 4309 4310Manual (button click): 4311calendar.backup.v5.1.6.manual.2026-02-09_12-30-45.zip 4312 ^^^^^^^ 4313 Easy to identify! 4314``` 4315 4316### Permissions Required 4317 4318- **Read access**: Plugin directory 4319- **Write access**: Parent plugins directory 4320 4321**Same as automatic backups** - no additional permissions needed! 4322 4323## Version 5.1.5 (2026-02-09) - ENHANCED BACKUP VERIFICATION 4324 4325### Enhanced: Backup Creation with Robust Verification 4326- **Added:** File count validation (must have 10+ files) 4327- **Added:** File size validation (must be 1KB+ minimum) 4328- **Added:** Return value from addDirectoryToZip (counts files added) 4329- **Added:** Detailed error messages showing file count 4330- **Added:** Automatic deletion of invalid/incomplete backups 4331- **Enhanced:** Exception handling with proper error propagation 4332- **Result:** Backups are now guaranteed to be complete or fail clearly! 4333 4334### What Changed 4335 4336**Before (v5.1.4)**: 4337```php 4338$this->addDirectoryToZip($zip, $pluginDir, 'calendar/'); 4339$zip->close(); 4340// No verification - could create empty or partial backup 4341``` 4342 4343**After (v5.1.5)**: 4344```php 4345$fileCount = $this->addDirectoryToZip($zip, $pluginDir, 'calendar/'); 4346$zip->close(); 4347 4348// Verify backup exists 4349if (!file_exists($backupPath)) { 4350 redirect('Backup file was not created'); 4351} 4352 4353// Verify backup has content 4354$backupSize = filesize($backupPath); 4355if ($backupSize < 1000) { 4356 unlink($backupPath); 4357 redirect('Backup too small: ' . $backupSize . ' bytes'); 4358} 4359 4360// Verify file count 4361if ($fileCount < 10) { 4362 unlink($backupPath); 4363 redirect('Only ' . $fileCount . ' files added (expected 30+)'); 4364} 4365``` 4366 4367### Backup Validation Checks 4368 4369**Three-Layer Verification**: 4370 43711. **File Count Check**: 4372 - Minimum: 10 files required 4373 - Expected: 30+ files 4374 - Action: Delete backup if too few files 4375 43762. **Size Check**: 4377 - Minimum: 1KB (1000 bytes) 4378 - Expected: 200-250KB 4379 - Action: Delete backup if too small 4380 43813. **Existence Check**: 4382 - Verify file was actually created 4383 - Check ZIP archive is valid 4384 - Action: Error if file missing 4385 4386### Enhanced Error Reporting 4387 4388**Detailed Error Messages**: 4389``` 4390❌ "Backup file was not created" 4391❌ "Backup too small (342 bytes). Only 3 files added." 4392❌ "Only 5 files added (expected 30+). Backup aborted." 4393❌ "Too many errors adding files: Failed to add X, Y, Z..." 4394❌ "Directory does not exist: /path/to/dir" 4395❌ "Directory is not readable: /path/to/dir" 4396``` 4397 4398**Now you know exactly what went wrong!** 4399 4400### Improved addDirectoryToZip Function 4401 4402**Returns File Count**: 4403```php 4404private function addDirectoryToZip($zip, $dir, $zipPath = '') { 4405 $fileCount = 0; 4406 $errors = []; 4407 4408 // Validation 4409 if (!is_dir($dir)) throw new Exception("Directory does not exist"); 4410 if (!is_readable($dir)) throw new Exception("Not readable"); 4411 4412 // Add files 4413 foreach ($files as $file) { 4414 if ($zip->addFile($filePath, $relativePath)) { 4415 $fileCount++; 4416 } else { 4417 $errors[] = "Failed to add: " . $filename; 4418 } 4419 } 4420 4421 // Check error threshold 4422 if (count($errors) > 5) { 4423 throw new Exception("Too many errors"); 4424 } 4425 4426 return $fileCount; // Returns count for verification! 4427} 4428``` 4429 4430### Safety Features 4431 4432**Invalid Backup Cleanup**: 4433- Failed backups are automatically deleted 4434- No partial/corrupt backups left behind 4435- Clean error state 4436 4437**Error Threshold**: 4438- Allow up to 5 minor file errors (logs warnings) 4439- More than 5 errors = complete failure 4440- Prevents partially corrupt backups 4441 4442**Directory Validation**: 4443- Check directory exists before processing 4444- Check directory is readable 4445- Fail fast with clear errors 4446 4447### Benefits 4448 4449**Guaranteed Complete Backups**: 4450- ✅ All files included or backup fails 4451- ✅ No silent failures 4452- ✅ Clear error messages 4453- ✅ Automatic cleanup 4454 4455**Better Debugging**: 4456- Know exactly how many files were added 4457- See specific errors for missing files 4458- Understand why backup failed 4459 4460**User Confidence**: 4461- Backup succeeds = complete backup 4462- Backup fails = clear error message 4463- No ambiguity 4464 4465### Example Scenarios 4466 4467**Scenario 1: Permission Issue** 4468``` 4469User uploads new version 4470System starts backup 4471Error: "Directory is not readable: /lib/plugins/calendar/" 4472Backup fails before creating file 4473User sees clear error message 4474``` 4475 4476**Scenario 2: Partial Backup** 4477``` 4478User uploads new version 4479System creates backup 4480Only 5 files added (disk issue?) 4481Size: 450 bytes 4482Verification fails 4483Incomplete backup deleted 4484Error: "Only 5 files added (expected 30+)" 4485``` 4486 4487**Scenario 3: Success** 4488``` 4489User uploads new version 4490System creates backup 449131 files added 4492Size: 240KB 4493All verifications pass ✅ 4494Update proceeds 4495``` 4496 4497### Testing Recommendations 4498 4499After installing v5.1.5: 45001. Upload a new version with backup enabled 45012. Check for success message 45023. Verify backup file exists in /lib/plugins/ 45034. Check backup file size (should be ~240KB) 45045. If backup fails, read error message carefully 4505 4506**Your backups are now bulletproof!** 4507 4508## Version 5.1.4 (2026-02-09) - BACKUP SYSTEM VERIFIED 4509 4510### ✅ Verified: Backup System Working Correctly 4511- **Verified:** addDirectoryToZip function includes all files recursively 4512- **Verified:** Backups contain all 31+ files from calendar directory 4513- **Verified:** File sizes are appropriate (233-240KB compressed, ~1MB uncompressed) 4514- **Info:** Backup sizes grow slightly with each version (more code = more features!) 4515- **Result:** Backup system is working perfectly! 4516 4517### Backup System Details 4518 4519**What Gets Backed Up**: 4520- All PHP files (syntax.php, admin.php, action.php, etc.) 4521- All JavaScript files (calendar-main.js, script.js) 4522- All documentation (CHANGELOG.md, README.md, all guides) 4523- All configuration (sync_config.php) 4524- All language files 4525- All assets and resources 4526- **Everything in the calendar/ directory!** 4527 4528**Backup Size Analysis**: 4529``` 4530Version 5.0.4: 233KB (normal) 4531Version 5.0.5: 234KB (normal) 4532Version 5.0.6: 235KB (normal) 4533Version 5.0.7: 236KB (normal) 4534Version 5.0.8: 237KB (normal) 4535Version 5.0.9: 237KB (normal) 4536Version 5.1.0: 238KB (normal) 4537Version 5.1.1: 238KB (normal) 4538Version 5.1.2: 240KB (normal - added AJAX features) 4539Version 5.1.3: 240KB (normal) 4540``` 4541 4542**Why Sizes Grow**: 4543- More features = more code 4544- Longer CHANGELOG 4545- Additional documentation 4546- New functionality 4547- **This is expected and normal!** 4548 4549**Compression Ratio**: 4550``` 4551Uncompressed: ~1.0 MB (source files) 4552Compressed: ~240 KB (ZIP archive) 4553Ratio: ~24% (excellent compression!) 4554``` 4555 4556### Backup File Contents 4557 4558**31 Files Included**: 4559``` 4560admin.php (216KB - main admin interface) 4561syntax.php (173KB - calendar rendering) 4562calendar-main.js (102KB - JavaScript functionality) 4563CHANGELOG.md (268KB - complete version history) 4564style.css (57KB - all styling) 4565action.php (38KB - DokuWiki actions) 4566sync_outlook.php (32KB - Outlook integration) 4567+ 24 other files (docs, configs, helpers) 4568``` 4569 4570**All files successfully included!** ✅ 4571 4572### How Backups Work 4573 4574**Creation Process**: 45751. User uploads new plugin version 45762. Checkbox "Create backup first" (checked by default) 45773. System creates backup: `calendar.backup.v5.1.3.2026-02-09_06-00-00.zip` 45784. Backup saved to: `/lib/plugins/` directory 45795. Then proceeds with update 4580 4581**Backup Function**: 4582```php 4583private function addDirectoryToZip($zip, $dir, $zipPath = '') { 4584 $files = new RecursiveIteratorIterator( 4585 new RecursiveDirectoryIterator($dir), 4586 RecursiveIteratorIterator::LEAVES_ONLY 4587 ); 4588 foreach ($files as $file) { 4589 if (!$file->isDir()) { 4590 $zip->addFile($filePath, $relativePath); 4591 } 4592 } 4593} 4594``` 4595 4596**Recursive = Gets Everything!** ✅ 4597 4598### Verification Results 4599 4600**Test Results**: 4601- ✅ All 31 files present in zip 4602- ✅ All subdirectories included (lang/en/) 4603- ✅ File sizes match originals 4604- ✅ Compression works properly 4605- ✅ No files missing 4606- ✅ Backup can be restored 4607 4608**File Count**: 4609``` 4610Source directory: 31 files 4611Backup ZIP: 34 items (31 files + 3 directories) 4612Status: COMPLETE ✅ 4613``` 4614 4615### Backup Best Practices 4616 4617**Always enabled by default** ✅ 4618**Stored in accessible location** ✅ 4619**Timestamped filenames** ✅ 4620**Complete directory backup** ✅ 4621**Easy to restore** ✅ 4622 4623### Conclusion 4624 4625The backup system is working perfectly. The file sizes are appropriate and expected: 4626- Compressed size: ~240KB (good compression) 4627- Uncompressed size: ~1MB (all source files) 4628- All files included: YES ✅ 4629- Growing size over versions: Normal (more features!) 4630 4631**Your backups are complete and reliable!** 4632 4633## Version 5.1.3 (2026-02-08) - FIX JAVASCRIPT SYNTAX ERROR 4634 4635### Fixed: JavaScript Syntax Error in AJAX Function 4636- **Fixed:** ParseError on line 1947 (deleteBackup function) 4637- **Fixed:** Escaped all single quotes in JavaScript strings 4638- **Result:** AJAX backup deletion now works correctly! 4639 4640### What Was Wrong 4641 4642JavaScript inside PHP echo needs escaped quotes: 4643 4644**Before (broken)**: 4645```javascript 4646formData.append('action', 'delete_backup'); // PHP interprets quotes 4647``` 4648 4649**After (fixed)**: 4650```javascript 4651formData.append(\'action\', \'delete_backup\'); // Escaped for PHP 4652``` 4653 4654### All Quotes Escaped 4655 4656Fixed in deleteBackup function: 4657- ✅ FormData.append() calls 4658- ✅ fetch() URL 4659- ✅ querySelector() calls 4660- ✅ createElement() call 4661- ✅ All string literals 4662- ✅ Error messages 4663 4664**JavaScript now works!** ✓ 4665 4666## Version 5.1.2 (2026-02-08) - AJAX BACKUP DELETION & LAYOUT IMPROVEMENT 4667 4668### Improved: Update Tab Further Refined 4669- **Moved:** Important Notes to very top (above upload) 4670- **Enhanced:** Delete backup now uses AJAX (no page refresh!) 4671- **Added:** Smooth fade-out animation when deleting backups 4672- **Added:** Success message after deletion 4673- **Auto-remove:** Backup section disappears if last backup deleted 4674- **Result:** Smoother, more polished experience! 4675 4676### New Layout Order 4677 4678**Final Order (v5.1.2)**: 4679``` 46801. ⚠️ Important Notes (warnings at top) 46812. Upload New Version (with Clear Cache button) 46823. Current Version (info) 46834. Recent Changes (changelog) 46845. Available Backups (if any) 4685``` 4686 4687### AJAX Backup Deletion 4688 4689**Before (v5.1.1)**: 4690- Click Delete → Page refreshes → Scroll back down 4691- Lose position on page 4692- Page reload is jarring 4693 4694**After (v5.1.2)**: 4695- Click Delete → Confirm 4696- Row fades out smoothly 4697- Row disappears 4698- Success message shows at top 4699- Success message fades after 3 seconds 4700- If last backup: entire section fades away 4701- **No page refresh!** ✓ 4702 4703### Visual Flow 4704 4705**Delete Animation**: 4706``` 47071. Click ️ Delete 47082. Confirm dialog 47093. Row fades out (0.3s) 47104. Row removed 47115. Success message appears 47126. Message fades after 3s 4713``` 4714 4715**If Last Backup**: 4716``` 47171. Delete last backup 47182. Row fades out 47193. Entire "Available Backups" section fades 47204. Section removed 47215. Clean interface ✓ 4722``` 4723 4724### Success Message 4725 4726After deleting: 4727``` 4728┌──────────────────────────────┐ 4729│ ✓ Backup deleted: filename │ ← Appears at top 4730└──────────────────────────────┘ 4731 Fades after 3 seconds 4732``` 4733 4734### Benefits 4735 4736**Important Notes First**: 4737- Warnings before actions ✓ 4738- Read before uploading ✓ 4739- Clear expectations ✓ 4740 4741**AJAX Deletion**: 4742- No page refresh ✓ 4743- Smooth animations ✓ 4744- Stay in context ✓ 4745- Professional feel ✓ 4746 4747**Auto-Cleanup**: 4748- Empty list disappears ✓ 4749- Clean interface ✓ 4750- No clutter ✓ 4751 4752### Technical Implementation 4753 4754**AJAX Request**: 4755```javascript 4756fetch('?do=admin&page=calendar&tab=update', { 4757 method: 'POST', 4758 body: formData 4759}) 4760``` 4761 4762**DOM Manipulation**: 4763- Fade out row 4764- Remove element 4765- Show success 4766- Remove section if empty 4767 4768**Smooth Transitions**: 4769- 300ms fade animations 4770- Clean visual feedback 4771- Professional polish 4772 4773## Version 5.1.1 (2026-02-08) - REORGANIZE UPDATE TAB 4774 4775### Improved: Update Tab Layout Reorganized 4776- **Moved:** Upload section to the top of the page 4777- **Added:** Clear Cache button next to Upload & Install button 4778- **Changed:** "Current Version" section moved below upload 4779- **Result:** Better workflow - upload first, then see version info! 4780 4781### New Layout Order 4782 4783**Before (v5.1.0)**: 4784``` 47851. Clear Cache (standalone) 47862. Current Version 47873. Recent Changes 47884. Upload New Version 47895. Warning Box 47906. Backups 4791``` 4792 4793**After (v5.1.1)**: 4794``` 47951. Upload New Version (with Clear Cache button side-by-side) 47962. Warning Box 47973. Current Version 47984. Recent Changes 47995. Backups 4800``` 4801 4802### Visual Result 4803 4804**Top of Update Tab**: 4805``` 4806┌─────────────────────────────────┐ 4807│ Upload New Version │ 4808│ ┌─────────────────────────────┐ │ 4809│ │ [Choose File] │ │ 4810│ │ ☑ Create backup first │ │ 4811│ │ ┌──────────────┬──────────┐ │ │ 4812│ │ │ Upload & │️ Clear │ │ │ 4813│ │ │ Install │ Cache │ │ │ 4814│ │ └──────────────┴──────────┘ │ │ 4815│ └─────────────────────────────┘ │ 4816│ │ 4817│ ⚠️ Important Notes │ 4818│ • Will replace all files │ 4819│ • Config preserved │ 4820│ │ 4821│ Current Version │ 4822│ Version: 5.1.1 │ 4823└─────────────────────────────────┘ 4824``` 4825 4826### Benefits 4827 4828**Better Workflow**: 4829- Primary action (upload) is first 4830- Clear cache conveniently next to install 4831- No scrolling to find upload button 4832- Logical top-to-bottom flow 4833 4834**Side-by-Side Buttons**: 4835- Upload & Install (green) 4836- Clear Cache (orange) 4837- Both common actions together 4838- Easy to access after upload 4839 4840**Improved UX**: 4841- Upload is most important → now at top 4842- Version info is reference → moved down 4843- Related actions grouped 4844- Cleaner organization 4845 4846### Button Layout 4847 4848``` 4849┌──────────────────┬──────────────┐ 4850│ Upload & │ ️ Clear │ 4851│ Install │ Cache │ 4852│ (Green) │ (Orange) │ 4853└──────────────────┴──────────────┘ 4854``` 4855 4856**Green = Primary Action** 4857**Orange = Secondary Action** 4858 4859Both easily accessible! 4860 4861## Version 5.1.0 (2026-02-08) - ADMIN SECTIONS USE MAIN BACKGROUND 4862 4863### Changed: Admin Section Backgrounds Now Use __background__ 4864- **Changed:** All section boxes now use `__background__` instead of `__background_alt__` 4865- **Result:** Cleaner, more unified admin interface! 4866 4867### Background Usage Update 4868 4869**Before (v5.0.9)**: 4870```php 4871Section boxes: bg_alt (__background_alt__) 4872Content areas: bg (__background__) 4873``` 4874 4875**After (v5.1.0)**: 4876```php 4877Section boxes: bg (__background__) 4878Content areas: bg (__background__) 4879``` 4880 4881### Why This Change? 4882 4883**More unified appearance**: 4884- Sections and content use same background 4885- Creates cleaner, more cohesive look 4886- Borders provide visual separation 4887- Matches typical admin UI patterns 4888 4889**Template color hierarchy**: 4890``` 4891__background_site__ → Outer page wrapper 4892__background__ → Content & sections (BOTH now use this) 4893__background_alt__ → Reserved for special panels/highlights 4894__background_neu__ → Special highlights 4895``` 4896 4897### Visual Result 4898 4899**Light Template**: 4900```ini 4901__background__ = "#ffffff" 4902__background_alt__ = "#e8e8e8" 4903``` 4904 4905**Before**: 4906``` 4907Admin Page: 4908┌─────────────────────┐ 4909│ ┌─────────────────┐ │ 4910│ │ Section Box │ │ ← Gray (#e8e8e8) 4911│ │ ┌─────────────┐ │ │ 4912│ │ │ Content │ │ │ ← White (#fff) 4913│ │ └─────────────┘ │ │ 4914│ └─────────────────┘ │ 4915└─────────────────────┘ 4916Two-tone appearance 4917``` 4918 4919**After**: 4920``` 4921Admin Page: 4922┌─────────────────────┐ 4923│ ┌─────────────────┐ │ 4924│ │ Section Box │ │ ← White (#fff) 4925│ │ ┌─────────────┐ │ │ 4926│ │ │ Content │ │ │ ← White (#fff) 4927│ │ └─────────────┘ │ │ 4928│ └─────────────────┘ │ 4929└─────────────────────┘ 4930Unified, clean appearance 4931Borders provide separation 4932``` 4933 4934**Dark Template**: 4935```ini 4936__background__ = "#2d2d2d" 4937__background_alt__ = "#3a3a3a" 4938``` 4939 4940**After**: 4941``` 4942Admin Page: 4943┌─────────────────────┐ 4944│ ┌─────────────────┐ │ 4945│ │ Section Box │ │ ← Dark (#2d2d2d) 4946│ │ ┌─────────────┐ │ │ 4947│ │ │ Content │ │ │ ← Dark (#2d2d2d) 4948│ │ └─────────────┘ │ │ 4949│ └─────────────────┘ │ 4950└─────────────────────┘ 4951Unified dark appearance 4952Accent borders provide definition 4953``` 4954 4955### Benefits 4956 4957**Cleaner Look**: 4958- No more alternating gray/white 4959- More professional appearance 4960- Less visual noise 4961- Unified color scheme 4962 4963**Better Consistency**: 4964- Matches modern admin UI patterns 4965- Borders define sections, not colors 4966- Simpler, cleaner design 4967- Easier on the eyes 4968 4969**Template Friendly**: 4970- Works with any background color 4971- Light or dark templates 4972- Custom colors 4973- Always looks cohesive 4974 4975### All Sections Updated 4976 4977✅ Outlook Sync config sections 4978✅ Manage Events sections 4979✅ Update Plugin sections 4980✅ Themes tab sections 4981✅ Week start day section 4982✅ All form sections 4983 4984**Complete unified theming!** 4985 4986## Version 5.0.9 (2026-02-08) - FIX SYNTAX ERROR IN THEMES TAB 4987 4988### Fixed: Syntax Error in Theme Cards 4989- **Fixed:** ParseError on line 4461 (Purple theme card) 4990- **Fixed:** Malformed ternary expressions from sed replacement 4991- **Fixed:** All 4 theme cards (Purple, Professional, Pink, Wiki) 4992- **Result:** Admin pages work correctly! 4993 4994### What Was Wrong 4995 4996The bulk sed replacement in v5.0.8 incorrectly modified ternary expressions: 4997 4998**Before (broken)**: 4999```php 5000? '#9b59b6' : ' . $colors['border'] . ') 5001// Extra quote and dot created syntax error 5002``` 5003 5004**After (fixed)**: 5005```php 5006? '#9b59b6' : $colors['border']) 5007// Clean ternary expression 5008``` 5009 5010### All Theme Cards Fixed 5011 5012- ✅ Purple Dream card 5013- ✅ Professional Blue card 5014- ✅ Pink Bling card 5015- ✅ Wiki Default card 5016 5017### Now Working 5018 5019**Theme selection page loads** ✓ 5020**All cards display properly** ✓ 5021**Template colors applied** ✓ 5022**No syntax errors** ✓ 5023 5024## Version 5.0.8 (2026-02-08) - FIX THEMES TAB & BACKGROUND MAPPING 5025 5026### Fixed: Themes Tab Backgrounds & Correct Template Color Mapping 5027- **Fixed:** Themes tab now uses template colors (removed all hardcoded whites) 5028- **Fixed:** Main background now uses `__background__` instead of `__background_site__` 5029- **Fixed:** Theme selection cards use template backgrounds 5030- **Fixed:** Week start options use template backgrounds 5031- **Result:** Perfect color mapping throughout admin! 5032 5033### Color Mapping Correction 5034 5035**Before (v5.0.7)**: 5036```php 5037bg: __background_site__ // Wrong - this is outer page bg 5038bg_alt: __background_alt__ 5039``` 5040 5041**After (v5.0.8)**: 5042```php 5043bg: __background__ // Correct - main content bg 5044bg_alt: __background_alt__ 5045``` 5046 5047### Why This Matters 5048 5049**Template color hierarchy**: 5050``` 5051__background_site__ → Outer page/site background 5052__background__ → Main content area (CORRECT for admin) 5053__background_alt__ → Sections/panels 5054__background_neu__ → Highlights 5055``` 5056 5057**Admin should use**: 5058- `__background__` for input fields, content areas 5059- `__background_alt__` for section boxes, panels 5060 5061### Themes Tab Fixed 5062 5063**Removed all hardcoded colors**: 5064```php 5065Before: '#ddd', '#fff', '#dee2e6' 5066After: $colors['border'], $colors['bg'], $colors['border'] 5067``` 5068 5069**Now themed**: 5070- ✅ Week start section background 5071- ✅ Week start option backgrounds 5072- ✅ Theme card backgrounds 5073- ✅ Theme card borders 5074- ✅ All borders throughout 5075 5076### Visual Result 5077 5078**Light Template**: 5079```ini 5080__background__ = "#ffffff" 5081__background_alt__ = "#e8e8e8" 5082``` 5083 5084**Admin Before (v5.0.7)**: 5085``` 5086Input fields: #f5f5f5 (site bg - wrong) 5087Sections: #e8e8e8 (alt bg - correct) 5088``` 5089 5090**Admin After (v5.0.8)**: 5091``` 5092Input fields: #ffffff (content bg - correct!) 5093Sections: #e8e8e8 (alt bg - correct!) 5094``` 5095 5096**Dark Template**: 5097```ini 5098__background__ = "#2d2d2d" 5099__background_alt__ = "#3a3a3a" 5100``` 5101 5102**Admin After (v5.0.8)**: 5103``` 5104Input fields: #2d2d2d (content bg - perfect!) 5105Sections: #3a3a3a (alt bg - perfect!) 5106``` 5107 5108### Complete Themes Tab 5109 5110**Week Start Options**: 5111``` 5112┌─────────────────────────┐ 5113│ Week Start Day │ ← bg_alt 5114│ ┌─────────┬───────────┐ │ 5115│ │ Monday │ Sunday │ │ ← bg (when not selected) 5116│ └─────────┴───────────┘ │ 5117└─────────────────────────┘ 5118``` 5119 5120**Theme Cards**: 5121``` 5122┌─────────────────────────┐ 5123│ Matrix Edition │ ← bg (when not selected) 5124│ Classic green theme │ border (when not selected) 5125└─────────────────────────┘ 5126 5127┌═════════════════════════┐ 5128│ Purple Dream │ ← rgba green tint (when selected) 5129│ Elegant purple theme │ #00cc07 border (when selected) 5130└═════════════════════════┘ 5131``` 5132 5133### Perfect Integration 5134 5135**All admin pages now**: 5136- Content areas: `__background__` ✓ 5137- Section boxes: `__background_alt__` ✓ 5138- Borders: `__border__` ✓ 5139- Text: `__text__` ✓ 5140 5141**Matches wiki perfectly**: 5142- Same white content areas 5143- Same gray section boxes 5144- Same border colors 5145- Same text colors 5146 5147### No More Issues 5148 5149**Fixed**: 5150- ❌ Site background on content areas → ✅ Content background 5151- ❌ Hardcoded white on themes tab → ✅ Template background 5152- ❌ Hardcoded borders (#ddd) → ✅ Template borders 5153 5154**Result**: 5155- Perfect color hierarchy ✓ 5156- Correct background levels ✓ 5157- Complete template integration ✓ 5158 5159## Version 5.0.7 (2026-02-08) - COMPLETE ADMIN THEMING 5160 5161### Fixed: All Admin Backgrounds Use Template Colors 5162- **Fixed:** All section backgrounds use `__background_alt__` 5163- **Fixed:** All content backgrounds use `__background__` 5164- **Fixed:** All borders use `__border__` 5165- **Fixed:** All text uses `__text__` 5166- **Result:** Complete admin template integration! 5167 5168### All Replacements 5169 5170**Backgrounds**: 5171```php 5172Before: background: #f9f9f9 5173After: background: ' . $colors['bg_alt'] . ' 5174 5175Before: background: #fff / background: white 5176After: background: ' . $colors['bg'] . ' 5177``` 5178 5179**Borders**: 5180```php 5181Before: border: 1px solid #ddd 5182Before: border: 1px solid #e0e0e0 5183Before: border: 1px solid #eee 5184After: border: 1px solid ' . $colors['border'] . ' 5185``` 5186 5187**Text**: 5188```php 5189Before: color: #333 5190Before: color: #666 5191After: color: ' . $colors['text'] . ' 5192``` 5193 5194### Complete Admin Coverage 5195 5196**All tabs now themed**: 5197- ✅ Manage Events tab 5198- ✅ Update Plugin tab 5199- ✅ Outlook Sync tab 5200- ✅ Themes tab 5201- ✅ Tab navigation 5202- ✅ All sections 5203- ✅ All inputs 5204- ✅ All borders 5205- ✅ All text 5206 5207### Visual Result 5208 5209**Light Template**: 5210``` 5211Admin Page: 5212┌──────────────────────────┐ 5213│ Tab Navigation │ ← Template borders 5214├──────────────────────────┤ 5215│ Section Headers │ ← bg_alt (light gray) 5216│ ┌──────────────────────┐ │ 5217│ │ Form Inputs │ │ ← bg (white) 5218│ │ Content Areas │ │ 5219│ └──────────────────────┘ │ 5220└──────────────────────────┘ 5221All template colors! ✓ 5222``` 5223 5224**Dark Template**: 5225``` 5226Admin Page: 5227┌──────────────────────────┐ 5228│ Tab Navigation │ ← Template borders 5229├──────────────────────────┤ 5230│ Section Headers │ ← bg_alt (dark gray) 5231│ ┌──────────────────────┐ │ 5232│ │ Form Inputs │ │ ← bg (darker) 5233│ │ Content Areas │ │ 5234│ └──────────────────────┘ │ 5235└──────────────────────────┘ 5236All template colors! ✓ 5237``` 5238 5239### Template Color Mapping 5240 5241**Used throughout admin**: 5242``` 5243__background_site__ → $colors['bg'] (main backgrounds) 5244__background_alt__ → $colors['bg_alt'] (section backgrounds) 5245__text__ → $colors['text'] (all text) 5246__border__ → $colors['border'] (all borders) 5247__link__ → $colors['link'] (links - future) 5248``` 5249 5250### Examples by Section 5251 5252**Manage Events**: 5253- Event list backgrounds: `bg_alt` 5254- Event item backgrounds: `bg` 5255- Borders: `border` 5256- Text: `text` 5257 5258**Update Plugin**: 5259- Section backgrounds: `bg_alt` 5260- Content areas: `bg` 5261- Borders: `border` 5262- Text: `text` 5263 5264**Outlook Sync**: 5265- Config sections: `bg_alt` 5266- Input fields: `bg` 5267- Borders: `border` 5268- Labels: `text` 5269 5270**Themes Tab**: 5271- Theme cards: `bg_alt` 5272- Preview areas: `bg` 5273- Borders: `border` 5274- Descriptions: `text` 5275 5276### Benefits 5277 5278**Seamless Integration**: 5279- Matches wiki admin area perfectly 5280- Same colors throughout wiki 5281- Professional appearance 5282- Consistent experience 5283 5284**Automatic Adaptation**: 5285- Light templates: Light admin 5286- Dark templates: Dark admin 5287- Custom templates: Uses custom colors 5288 5289**No White Boxes**: 5290- Every background themed 5291- Every border themed 5292- Every text themed 5293- Complete consistency 5294 5295### PERFECT HARMONY 5296 5297**Frontend (Calendar)**: 5298- Wiki theme uses style.ini ✓ 5299- Perfect template match ✓ 5300 5301**Backend (Admin)**: 5302- Reads same style.ini ✓ 5303- Perfect template match ✓ 5304 5305**Complete Unity**: 5306- Same colors everywhere ✓ 5307- Seamless experience ✓ 5308- Professional polish ✓ 5309 5310## Version 5.0.6 (2026-02-08) - ADMIN PAGES USE TEMPLATE COLORS 5311 5312### Enhanced: Month/Year Header & Admin Pages Use Template Colors 5313- **Fixed:** Month/Year header now uses `__text_neu__` for wiki theme 5314- **Added:** Admin pages read template's style.ini file 5315- **Added:** `getTemplateColors()` function in admin class 5316- **Fixed:** Tab navigation uses template text and border colors 5317- **Result:** Complete template integration everywhere! 5318 5319### Month/Year Header 5320 5321**Before**: 5322```php 5323color: __text__ // Same as primary text 5324``` 5325 5326**After (Wiki Theme)**: 5327```php 5328color: __text_neu__ // Dimmed text (subtle) 5329``` 5330 5331### Admin Pages Enhancement 5332 5333**New `getTemplateColors()` function**: 5334- Reads template's style.ini file 5335- Extracts color replacements 5336- Provides colors to all admin tabs 5337- Falls back to sensible defaults 5338 5339**Colors used**: 5340```php 5341bg: __background_site__ 5342bg_alt: __background_alt__ 5343text: __text__ 5344border: __border__ 5345link: __link__ 5346``` 5347 5348**Applied to**: 5349- Tab navigation borders 5350- Tab text colors 5351- All admin sections 5352- Ready for future enhancements 5353 5354### Visual Result 5355 5356**Calendar Header**: 5357``` 5358┌────────────────────┐ 5359│ ‹ February 2026 › │ ← __text_neu__ (dimmed) 5360└────────────────────┘ 5361Subtle and elegant ✓ 5362``` 5363 5364**Admin Navigation**: 5365``` 5366 Manage Events | Update | ⚙️ Config | Themes 5367───────────────────────────────────────────────── 5368Active tab: Green (#00cc07) 5369Inactive tabs: Template text color 5370Border: Template border color 5371``` 5372 5373### Template Integration 5374 5375**Light Template**: 5376```ini 5377__text_neu__ = "#666666" 5378__border__ = "#cccccc" 5379``` 5380**Result**: 5381- Month/Year: Medium gray (subtle) 5382- Admin borders: Light gray 5383- Tab text: Dark gray 5384 5385**Dark Template**: 5386```ini 5387__text_neu__ = "#999999" 5388__border__ = "#555555" 5389``` 5390**Result**: 5391- Month/Year: Light gray (subtle) 5392- Admin borders: Medium gray 5393- Tab text: Bright gray 5394 5395### Benefits 5396 5397**Calendar Frontend**: 5398- Month/Year header more subtle 5399- Better visual hierarchy 5400- Less prominent, more elegant 5401 5402**Admin Backend**: 5403- Uses template colors 5404- Matches wiki admin area 5405- Consistent experience 5406- Professional appearance 5407 5408### Future-Ready 5409 5410The `getTemplateColors()` function is now available for: 5411- ✅ Tab navigation (implemented) 5412- Section backgrounds (ready) 5413- Button colors (ready) 5414- Input fields (ready) 5415- Success/error messages (ready) 5416 5417**Foundation laid for complete admin theming!** 5418 5419## Version 5.0.5 (2026-02-08) - WIKI THEME ADD BUTTON & SECTION HEADERS 5420 5421### Fixed: Add Event Bar & Section Headers Use Template Colors 5422- **Fixed:** Add Event bar now uses `__background_alt__` for wiki theme 5423- **Fixed:** "Today" header uses `__text_neu__` 5424- **Fixed:** "Tomorrow" header uses `__text__` 5425- **Fixed:** "Important Events" header uses `__border__` 5426- **Result:** Perfect template color integration! 5427 5428### All Changes 5429 5430**Add Event Bar (Wiki Theme)**: 5431 5432**Before**: 5433```php 5434background: #3498db // Generic blue 5435``` 5436 5437**After**: 5438```php 5439background: __background_alt__ // Template alternate bg 5440text: __text__ // Template text color 5441hover: __background_neu__ // Template neutral bg 5442``` 5443 5444**Section Headers (Wiki Theme)**: 5445 5446**Before**: 5447```php 5448Today: #ff9800 // Orange 5449Tomorrow: #4caf50 // Green 5450Important Events: #9b59b6 // Purple 5451``` 5452 5453**After**: 5454```php 5455Today: __text_neu__ // Template dimmed text 5456Tomorrow: __text__ // Template primary text 5457Important Events: __border__ // Template border color 5458``` 5459 5460### Visual Result 5461 5462**Wiki Default Theme**: 5463``` 5464Add Event Bar: 5465┌────────────────┐ 5466│ + ADD EVENT │ ← Template alt background 5467└────────────────┘ 5468 5469Sections: 5470━━━━━━━━━━━━━━━━ 5471Today ← Dimmed text color (__text_neu__) 5472• Team Meeting 5473 5474Tomorrow ← Primary text color (__text__) 5475• Code Review 5476 5477Important Events ← Border color (__border__) 5478• Project Deadline 5479``` 5480 5481### Example with DokuWiki Default Template 5482 5483**Template colors**: 5484```ini 5485__background_alt__ = "#e8e8e8" 5486__text__ = "#333333" 5487__text_neu__ = "#666666" 5488__border__ = "#cccccc" 5489``` 5490 5491**Calendar result**: 5492``` 5493Add Event Bar: Light gray (#e8e8e8) 5494Today header: Medium gray (#666666) 5495Tomorrow header: Dark gray (#333333) 5496Important Events header: Border gray (#cccccc) 5497``` 5498 5499### Example with Dark Template 5500 5501**Template colors**: 5502```ini 5503__background_alt__ = "#2d2d2d" 5504__text__ = "#e0e0e0" 5505__text_neu__ = "#999999" 5506__border__ = "#555555" 5507``` 5508 5509**Calendar result**: 5510``` 5511Add Event Bar: Dark gray (#2d2d2d) 5512Today header: Light gray (#999999) 5513Tomorrow header: Bright gray (#e0e0e0) 5514Important Events header: Medium gray (#555555) 5515``` 5516 5517### Perfect Harmony 5518 5519All sidebar elements now use template colors: 5520- ✅ Add Event bar background 5521- ✅ Add Event bar text 5522- ✅ Today section header 5523- ✅ Tomorrow section header 5524- ✅ Important Events header 5525- ✅ Calendar cells 5526- ✅ Grid backgrounds 5527- ✅ All borders 5528 5529**Complete template integration!** 5530 5531## Version 5.0.4 (2026-02-08) - USE __background__ FOR CALENDAR CELLS 5532 5533### Fixed: Calendar Cells Use Correct Template Color 5534- **Fixed:** Calendar cells now use `__background__` from template 5535- **Changed:** `cell_bg` now uses `__background__` instead of `__background_neu__` 5536- **Result:** Calendar cells match main content area background! 5537 5538### Color Mapping Update 5539 5540**Before (v5.0.3)**: 5541```php 5542cell_bg: __background_neu__ // Wrong - this is for neutral/alternate 5543``` 5544 5545**After (v5.0.4)**: 5546```php 5547cell_bg: __background__ // Correct - main content background 5548``` 5549 5550### Template Color Usage 5551 5552**Wiki Default theme now uses**: 5553``` 5554__background_site__ → Overall page background 5555__background__ → Calendar cells (main content bg) 5556__background_alt__ → Grid background, headers 5557__background_neu__ → Today cell highlight 5558__text__ → Primary text 5559__text_neu__ → Dimmed text 5560__link__ → Links, bright text 5561__border__ → All borders 5562``` 5563 5564### Visual Result 5565 5566**Before**: 5567``` 5568Calendar with template colors: 5569┌─────┬─────┬─────┐ 5570│ Mon │ Tue │ Wed │ 5571├─────┼─────┼─────┤ 5572│ 8 │ 9 │ 10 │ ← Neutral gray (wrong) 5573└─────┴─────┴─────┘ 5574``` 5575 5576**After**: 5577``` 5578Calendar with template colors: 5579┌─────┬─────┬─────┐ 5580│ Mon │ Tue │ Wed │ 5581├─────┼─────┼─────┤ 5582│ 8 │ 9 │ 10 │ ← White/content bg (correct!) 5583└─────┴─────┴─────┘ 5584``` 5585 5586### Example Template Colors 5587 5588**DokuWiki Default**: 5589```ini 5590__background__ = "#ffffff" 5591``` 5592**Result**: White calendar cells ✓ 5593 5594**Dark Template**: 5595```ini 5596__background__ = "#2d2d2d" 5597``` 5598**Result**: Dark calendar cells ✓ 5599 5600**Custom Template**: 5601```ini 5602__background__ = "#f9f9f9" 5603``` 5604**Result**: Custom color cells ✓ 5605 5606### Perfect Matching 5607 5608Calendar cells now match: 5609- ✅ Main content area background 5610- ✅ Article/page background 5611- ✅ Content box background 5612- ✅ Same as wiki text background 5613 5614**Seamless integration!** 5615 5616## Version 5.0.3 (2026-02-08) - READ COLORS FROM TEMPLATE STYLE.INI 5617 5618### Enhanced: Wiki Default Theme Reads Template Colors 5619- **Added:** Function to read colors from DokuWiki template's style.ini file 5620- **Reads:** `/var/www/html/dokuwiki/conf/tpl/{template}/style.ini` 5621- **Falls back:** Also checks `/var/www/html/dokuwiki/lib/tpl/{template}/style.ini` 5622- **Uses:** Actual template colors instead of CSS variables 5623- **Result:** Perfect color matching with any DokuWiki template! 5624 5625### How It Works 5626 5627**New Function: `getWikiTemplateColors()`** 5628 56291. **Detects** current DokuWiki template name 56302. **Reads** the template's `style.ini` file 56313. **Parses** color replacements section 56324. **Maps** template colors to calendar theme 56335. **Falls back** to CSS variables if file not found 5634 5635### Colors Read from style.ini 5636 5637**Template color replacements used**: 5638```php 5639__background_site__ → bg, header_bg 5640__background_alt__ → grid_bg, cell_today_bg 5641__background_neu__ → cell_bg 5642__text__ → text_primary 5643__text_neu__ → text_dim 5644__link__ → text_bright 5645__border__ → border, grid_border 5646``` 5647 5648### Example style.ini Mapping 5649 5650**Template style.ini**: 5651```ini 5652[replacements] 5653__background_site__ = "#f8f9fa" 5654__background_alt__ = "#e9ecef" 5655__background_neu__ = "#dee2e6" 5656__text__ = "#212529" 5657__text_neu__ = "#6c757d" 5658__link__ = "#0d6efd" 5659__border__ = "#ced4da" 5660``` 5661 5662**Calendar theme result**: 5663```php 5664bg: #f8f9fa 5665header_bg: #e9ecef 5666grid_bg: #e9ecef 5667cell_bg: #dee2e6 5668text_primary: #212529 5669text_dim: #6c757d 5670text_bright: #0d6efd 5671border: #ced4da 5672grid_border: #ced4da 5673``` 5674 5675### Before vs After 5676 5677**Before (v5.0.2)**: 5678``` 5679Wiki Default theme used: 5680- CSS variables (var(--__background__, #fff)) 5681- Required browser CSS variable support 5682- Fallback to generic colors 5683``` 5684 5685**After (v5.0.3)**: 5686``` 5687Wiki Default theme uses: 5688- Actual colors from template's style.ini 5689- Exact template color values 5690- No CSS variable dependency 5691- Perfect color matching! 5692``` 5693 5694### File Location Priority 5695 5696Checks in order: 56971. `/var/www/html/dokuwiki/conf/tpl/{template}/style.ini` 56982. `/var/www/html/dokuwiki/lib/tpl/{template}/style.ini` 56993. Falls back to CSS variables if neither found 5700 5701### Benefits 5702 5703**More accurate colors**: 5704- Uses exact template color values ✓ 5705- No CSS variable interpolation ✓ 5706- Consistent across all browsers ✓ 5707 5708**Better compatibility**: 5709- Works with older browsers ✓ 5710- No CSS variable support needed ✓ 5711- Direct color values ✓ 5712 5713**Perfect matching**: 5714- Reads template's actual colors ✓ 5715- Same colors as wiki pages ✓ 5716- Seamless integration ✓ 5717 5718### Template Examples 5719 5720**DokuWiki Default Template**: 5721``` 5722Reads: lib/tpl/dokuwiki/style.ini 5723Gets: Default DokuWiki colors 5724Result: Perfect classic DokuWiki look 5725``` 5726 5727**Bootstrap Template**: 5728``` 5729Reads: lib/tpl/bootstrap3/style.ini 5730Gets: Bootstrap color scheme 5731Result: Perfect Bootstrap integration 5732``` 5733 5734**Custom Template**: 5735``` 5736Reads: conf/tpl/mycustom/style.ini 5737Gets: Your custom colors 5738Result: Perfect custom theme match 5739``` 5740 5741### Fallback Chain 5742 57431. **Try** reading style.ini from template 57442. **If found** → Use exact colors from file 57453. **If not found** → Use CSS variables 57464. **If no CSS vars** → Use fallback colors 5747 5748**Always works, always matches!** ✓ 5749 5750## Version 5.0.2 (2026-02-08) - FIX WIKI DEFAULT THEME DAY PANEL 5751 5752### Fixed: Wiki Default Theme Day Panel Colors 5753- **Fixed:** Day popup panel now uses DokuWiki CSS variables 5754- **Fixed:** Panel background matches wiki theme 5755- **Fixed:** Panel header matches wiki theme 5756- **Fixed:** Border colors use wiki theme 5757- **Fixed:** Text colors use wiki theme 5758- **Result:** Perfect integration with DokuWiki templates! 5759 5760### All Changes 5761 5762**Day Panel Colors (Wiki Default)**: 5763 5764**Before**: 5765```php 5766background: rgba(36, 36, 36, 0.5) // Dark gray (wrong!) 5767header: #3498db // Blue (wrong!) 5768``` 5769 5770**After**: 5771```php 5772background: var(--__background__, #fff) 5773header: var(--__background_alt__, #e8e8e8) 5774header_text: var(--__text__, #333) 5775border: var(--__border__, #ccc) 5776shadow: 0 2px 4px rgba(0, 0, 0, 0.1) 5777``` 5778 5779**Event Colors (Wiki Default)**: 5780```php 5781event_bg: var(--__background_alt__, rgba(245, 245, 245, 0.5)) 5782border_color: var(--__border__, rgba(204, 204, 204, 0.3)) 5783bar_shadow: 0 1px 2px rgba(0, 0, 0, 0.15) 5784``` 5785 5786### Before vs After 5787 5788**Before (v5.0.1)**: 5789``` 5790Wiki Default - Click Week Cell: 5791┌────────────────┐ 5792│ Monday, Feb 8 │ ← Blue header (wrong) 5793├────────────────┤ 5794│ Team Meeting │ ← Dark gray bg (wrong) 5795│ 2:00 PM │ 5796└────────────────┘ 5797Doesn't match wiki theme 5798``` 5799 5800**After (v5.0.2)**: 5801``` 5802Wiki Default - Click Week Cell: 5803 5804Light Wiki Theme: 5805┌────────────────┐ 5806│ Monday, Feb 8 │ ← Light gray header ✓ 5807├────────────────┤ 5808│ Team Meeting │ ← White bg ✓ 5809│ 2:00 PM │ Dark text ✓ 5810└────────────────┘ 5811 5812Dark Wiki Theme: 5813┌────────────────┐ 5814│ Monday, Feb 8 │ ← Dark header ✓ 5815├────────────────┤ 5816│ Team Meeting │ ← Dark bg ✓ 5817│ 2:00 PM │ Light text ✓ 5818└────────────────┘ 5819 5820Perfectly matches wiki! 5821``` 5822 5823### CSS Variables Used 5824 5825**Wiki Default theme now uses**: 5826- `--__background__` - Main background (panel body) 5827- `--__background_alt__` - Alternate bg (panel header, events) 5828- `--__text__` - Text color (header text) 5829- `--__border__` - Border color (panel border, event borders) 5830 5831**With fallbacks**: 5832```css 5833var(--__background__, #fff) /* white fallback */ 5834var(--__background_alt__, #e8e8e8) /* light gray fallback */ 5835var(--__text__, #333) /* dark text fallback */ 5836var(--__border__, #ccc) /* gray border fallback */ 5837``` 5838 5839### Perfect Adaptation 5840 5841**Light Templates**: 5842- Light panel backgrounds ✓ 5843- Dark text ✓ 5844- Subtle borders ✓ 5845- Clean appearance ✓ 5846 5847**Dark Templates**: 5848- Dark panel backgrounds ✓ 5849- Light text ✓ 5850- Visible borders ✓ 5851- Perfect contrast ✓ 5852 5853**Custom Templates**: 5854- Uses template's CSS variables ✓ 5855- Automatic adaptation ✓ 5856- Seamless integration ✓ 5857 5858### Now Truly Adaptive 5859 5860Wiki Default theme now properly uses DokuWiki CSS variables for: 5861- ✅ Calendar grid 5862- ✅ Sidebar widget 5863- ✅ Event list 5864- ✅ **Day panel** ← v5.0.2! 5865- ✅ All backgrounds 5866- ✅ All text 5867- ✅ All borders 5868 5869**Complete wiki integration!** 5870 5871## Version 5.0.1 (2026-02-08) - THEME CONFLICT TOOLTIPS 5872 5873### Enhanced: Time Conflict Tooltips Now Themed 5874- **Fixed:** Conflict tooltips now match calendar theme 5875- **Added:** Theme-aware background, border, text colors 5876- **Added:** Theme-aware shadow effects 5877- **Result:** Complete visual consistency! 5878 5879### Tooltip Theming 5880 5881**Now uses theme colors for**: 5882- Background: Theme background color 5883- Border: Theme border color 5884- Header text: Theme primary text color 5885- Item text: Theme dim text color 5886- Shadow: Theme shadow color 5887 5888### Before vs After 5889 5890**Before (v5.0.0)**: 5891``` 5892Hover ⚠️ badge: 5893┌─────────────────┐ 5894│ ⚠️ Time Conflicts│ ← Default colors 5895│ • Event A │ 5896│ • Event B │ 5897└─────────────────┘ 5898``` 5899 5900**After (v5.0.1)**: 5901``` 5902Matrix Theme: 5903┌─────────────────┐ 5904│ ⚠️ Time Conflicts│ ← Green header 5905│ • Event A │ ← Green text 5906│ • Event B │ Dark green bg 5907└─────────────────┘ 5908 5909Purple Theme: 5910┌─────────────────┐ 5911│ ⚠️ Time Conflicts│ ← Purple header 5912│ • Event A │ ← Purple text 5913│ • Event B │ Dark purple bg 5914└─────────────────┘ 5915 5916Professional Theme: 5917┌─────────────────┐ 5918│ ⚠️ Time Conflicts│ ← Blue header 5919│ • Event A │ ← Dark text 5920│ • Event B │ Light bg 5921└─────────────────┘ 5922 5923Pink Theme: 5924┌─────────────────┐ 5925│ ⚠️ Time Conflicts│ ← Pink header ✨ 5926│ • Event A │ ← Pink text 5927│ • Event B │ Dark pink bg 5928└─────────────────┘ 5929 5930Wiki Default: 5931┌─────────────────┐ 5932│ ⚠️ Time Conflicts│ ← Adapts to wiki 5933│ • Event A │ ← Wiki colors 5934│ • Event B │ 5935└─────────────────┘ 5936``` 5937 5938### Now 100% Complete 5939 5940**Every tooltip themed**: 5941- ✅ Conflict tooltips 5942- ✅ All other tooltips (if any) 5943- ✅ Perfect consistency 5944 5945**Absolute perfection!** ✨ 5946 5947## Version 5.0.0 (2026-02-08) - MAJOR RELEASE: COMPLETE THEMING PERFECTION 5948 5949### Major Milestone: Version 5.0 5950 5951This 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. 5952 5953### Complete Feature Set 5954 5955**5 Beautiful Themes**: 5956- Matrix Edition (Green with glow) 5957- Purple Dream (Elegant purple) 5958- Professional Blue (Clean and modern) 5959- Pink Bling (Maximum sparkle) 5960- Wiki Default (Auto-adapts to your DokuWiki theme) 5961 5962**100% Theme Coverage**: 5963- ✅ Calendar grid and cells 5964- ✅ Event boxes and borders 5965- ✅ Sidebar widget 5966- ✅ Event list panel 5967- ✅ Search functionality 5968- ✅ Edit/Add dialogs (complete) 5969- ✅ Day popup dialogs 5970- ✅ Month picker 5971- ✅ All text (primary, dim, bright) 5972- ✅ All buttons 5973- ✅ All inputs and forms 5974- ✅ All checkboxes 5975- ✅ All borders 5976- ✅ All badges and labels 5977- ✅ Event highlight effects 5978 5979**Perfect Visual Consistency**: 5980- No white pixels anywhere 5981- No unthemed elements 5982- No default colors 5983- Complete visual unity 5984 5985### Major Improvements in v5.0 5986 59871. **Complete Dialog Theming** (v4.8.5-4.8.7) 5988 - Edit event dialog fully themed 5989 - Day popup dialog fully themed 5990 - All form inputs themed 5991 - All checkboxes themed 5992 - All buttons themed 5993 59942. **Event Box Border Perfection** (v4.8.6) 5995 - All 4 borders themed (top, right, bottom, left) 5996 - Sidebar event dividers themed 5997 - Past Events toggle border themed 5998 59993. **Checkbox Field Borders** (v4.9.0) 6000 - Repeating Event section border themed 6001 - Task checkbox section border themed 6002 60034. **Wiki Default Theme** (v4.10.0) 6004 - New 5th theme 6005 - Uses DokuWiki CSS variables 6006 - Auto-adapts to any wiki template 6007 - Perfect for seamless integration 6008 60095. **Clean Text Appearance** (v4.11.0) 6010 - Removed text glow from Matrix 6011 - Removed text glow from Purple 6012 - Removed text glow from Professional 6013 - Removed text glow from Wiki Default 6014 - Kept text glow on Pink Bling only 6015 60166. **Event Highlight Effects** (v4.12.0-4.12.1) 6017 - Theme-aware highlight glow 6018 - Click event bar → event glows 6019 - 3-second themed glow effect 6020 - Smooth animations 6021 6022### See RELEASE_NOTES.md for Complete Details 6023 6024For a comprehensive overview of all features, themes, and improvements, see the new **RELEASE_NOTES.md** file included in this release. 6025 6026## Version 4.12.1 (2026-02-08) - FIX EVENT HIGHLIGHT FUNCTION 6027 6028### Fixed: Event Highlight Now Working 6029- **Fixed:** Used setProperty() to properly apply !important styles 6030- **Added:** Console logging for debugging 6031- **Fixed:** Proper style application with important flag 6032- **Result:** Highlight glow now works correctly! 6033 6034### Technical Fix 6035 6036**Before (not working)**: 6037```javascript 6038eventItem.style.background = color + ' !important'; // Doesn't work 6039``` 6040 6041**After (working)**: 6042```javascript 6043eventItem.style.setProperty('background', color, 'important'); // Works! 6044``` 6045 6046### Added Debug Logging 6047 6048Console now shows: 6049- "Highlighting event: [calId] [eventId] [date]" 6050- "Found event item: [element]" 6051- "Theme: [theme name]" 6052- "Highlight colors: [bg] [shadow]" 6053- "Applied highlight styles" 6054- "Removing highlight" (after 3 seconds) 6055 6056### Now Working 6057 6058Click any event bar → Event glows with theme colors ✓ 6059 6060## Version 4.12.0 (2026-02-08) - THEME-AWARE EVENT HIGHLIGHT GLOW 6061 6062### ✨ Enhanced: Event Click Highlight Now Theme-Aware 6063- **Fixed:** Restored event highlight glow when clicking calendar bars 6064- **Improved:** Highlight now matches each theme's colors 6065- **Added:** Stronger glow effect for better visibility 6066- **Duration:** 3 seconds with smooth fade 6067- **Result:** Beautiful themed highlights for all themes! 6068 6069### How It Works 6070 6071When you click an event bar in the calendar, the corresponding event in the event list now highlights with a themed glow: 6072 6073**Matrix Theme**: 6074```javascript 6075Background: Darker green (#1a3d1a) 6076Glow: Double green glow (0 0 20px + 0 0 40px) 6077Color: rgba(0, 204, 7, 0.8) 6078``` 6079 6080**Purple Theme**: 6081```javascript 6082Background: Darker purple (#3d2b4d) 6083Glow: Double purple glow 6084Color: rgba(155, 89, 182, 0.8) 6085``` 6086 6087**Professional Theme**: 6088```javascript 6089Background: Light blue (#e3f2fd) 6090Glow: Single blue glow 6091Color: rgba(74, 144, 226, 0.4) 6092``` 6093 6094**Pink Theme**: 6095```javascript 6096Background: Darker pink (#3d2030) 6097Glow: Double pink glow ✨ 6098Color: rgba(255, 20, 147, 0.8) 6099``` 6100 6101**Wiki Theme**: 6102```javascript 6103Background: var(--__background_neu__) 6104Glow: Blue glow (adapts to wiki) 6105Color: rgba(43, 115, 183, 0.4) 6106``` 6107 6108### Visual Examples 6109 6110**Matrix - Click Event**: 6111``` 6112Calendar: 6113┌─────────────┐ 6114│ 2:00 PM │ ← Click this bar 6115└─────────────┘ 6116 6117Event List: 6118╔═════════════════════╗ 6119║ Team Meeting ║ ← GLOWS GREEN 6120║ 2:00 PM ║ for 3 seconds 6121╚═════════════════════╝ 6122 ↑↑↑ Strong green glow ↑↑↑ 6123``` 6124 6125**Purple - Click Event**: 6126``` 6127Calendar: 6128┌─────────────┐ 6129│ 4:00 PM │ ← Click 6130└─────────────┘ 6131 6132Event List: 6133╔═════════════════════╗ 6134║ Code Review ║ ← GLOWS PURPLE 6135║ 4:00 PM ║ for 3 seconds 6136╚═════════════════════╝ 6137 ↑↑↑ Strong purple glow ↑↑↑ 6138``` 6139 6140**Pink - Click Event**: 6141``` 6142Calendar: 6143┌─────────────┐ 6144│ 1:00 PM │ ← Click 6145└─────────────┘ 6146 6147Event List: 6148╔═════════════════════╗ 6149║ Lunch Date ║ ← GLOWS PINK 6150║ 1:00 PM ✨ ║ for 3 seconds 6151╚═════════════════════╝ 6152 ↑↑↑ MAXIMUM SPARKLE ↑↑↑ 6153``` 6154 6155### Glow Specifications 6156 6157**Matrix**: 6158- Background: Dark green 6159- Shadow: `0 0 20px rgba(0, 204, 7, 0.8)` 6160- Outer glow: `0 0 40px rgba(0, 204, 7, 0.4)` 6161- Effect: Strong green pulse 6162 6163**Purple**: 6164- Background: Dark purple 6165- Shadow: `0 0 20px rgba(155, 89, 182, 0.8)` 6166- Outer glow: `0 0 40px rgba(155, 89, 182, 0.4)` 6167- Effect: Strong purple pulse 6168 6169**Professional**: 6170- Background: Light blue 6171- Shadow: `0 0 20px rgba(74, 144, 226, 0.4)` 6172- Effect: Subtle blue glow 6173 6174**Pink**: 6175- Background: Dark pink 6176- Shadow: `0 0 20px rgba(255, 20, 147, 0.8)` 6177- Outer glow: `0 0 40px rgba(255, 20, 147, 0.4)` 6178- Effect: MAXIMUM SPARKLE ✨ 6179 6180**Wiki**: 6181- Background: Theme neutral color 6182- Shadow: `0 0 20px rgba(43, 115, 183, 0.4)` 6183- Effect: Adapts to wiki theme 6184 6185### User Experience 6186 6187**Click event bar** → Event highlights with themed glow 6188**Auto-scroll** → Event scrolls into view smoothly 6189**3 second glow** → Fade out after 3 seconds 6190**Smooth transition** → 0.3s ease-in-out 6191 6192### Perfect for Finding Events 6193 6194**Large event lists**: Quickly locate the clicked event ✓ 6195**Visual feedback**: Know which event you clicked ✓ 6196**Theme consistency**: Matches your chosen theme ✓ 6197**Smooth animation**: Professional appearance ✓ 6198 6199### All Themes Covered 6200 6201- ✅ Matrix: Green glow 6202- ✅ Purple: Purple glow 6203- ✅ Professional: Blue glow 6204- ✅ Pink: Maximum pink sparkle 6205- ✅ Wiki: Adaptive glow 6206 6207**Click any event bar and watch it glow!** ✨ 6208 6209## Version 4.11.0 (2026-02-08) - REMOVE TEXT GLOW FROM NON-PINK THEMES 6210 6211### Changed: Text Glow Now Pink-Only 6212- **Removed:** Text shadow/glow from Matrix theme 6213- **Removed:** Text shadow/glow from Purple theme 6214- **Removed:** Text shadow/glow from Professional theme (already had none) 6215- **Removed:** Text shadow/glow from Wiki Default theme 6216- **Kept:** Text shadow/glow ONLY on Pink Bling theme 6217- **Result:** Cleaner look for Matrix, Purple, and Wiki themes! 6218 6219### All Changes 6220 6221**Before (Matrix, Purple)**: 6222```css 6223text-shadow: 0 0 2px $text_color; /* Glow effect */ 6224``` 6225 6226**After (Matrix, Purple, Professional, Wiki)**: 6227```css 6228text-shadow: none; /* Clean, no glow */ 6229``` 6230 6231**Pink Bling (unchanged)**: 6232```css 6233text-shadow: 0 0 2px $text_color; /* Still has glow ✨ */ 6234``` 6235 6236### Text Shadow Removed From 6237 6238**Sidebar day numbers**: No glow ✓ 6239**Event titles**: No glow ✓ 6240**Event dates**: No glow ✓ 6241**Add Event button**: No glow ✓ 6242**Day popup events**: No glow ✓ 6243 6244### Before vs After 6245 6246**BEFORE (Matrix)**: 6247``` 6248Event Title ✨ ← Glowing green text 62492:00 PM ✨ ← Glowing text 6250``` 6251 6252**AFTER (Matrix)**: 6253``` 6254Event Title ← Clean green text 62552:00 PM ← Clean text 6256``` 6257 6258**Pink Bling (Still Glows)**: 6259``` 6260Event Title ✨ ← Still glowing! 62612:00 PM ✨ ← Maximum sparkle! 6262``` 6263 6264### Theme Appearances 6265 6266** Matrix Edition**: 6267- Clean green text 6268- No glow effects 6269- Professional appearance 6270- Still has border glow 6271 6272** Purple Dream**: 6273- Clean purple text 6274- No glow effects 6275- Elegant appearance 6276- Still has border glow 6277 6278** Professional Blue**: 6279- Clean text (unchanged) 6280- No glow effects 6281- Modern appearance 6282 6283** Pink Bling**: 6284- Glowing pink text ✨ 6285- Maximum glow effects 6286- Sparkle everywhere! 6287- All the bling! 6288 6289** Wiki Default**: 6290- Clean text 6291- No glow effects 6292- Matches wiki theme 6293 6294### Glow Effects Remaining 6295 6296**Border/box glow**: Still present on all themes ✓ 6297**Pink text glow**: Only on Pink Bling ✓ 6298**Shadow effects**: Still on buttons/boxes ✓ 6299 6300**Only TEXT glow removed from non-pink themes!** 6301 6302### Result 6303 6304**Cleaner, more professional look** for: 6305- Matrix ✓ 6306- Purple ✓ 6307- Professional ✓ 6308- Wiki Default ✓ 6309 6310**Maximum sparkle** for: 6311- Pink Bling ✨✓ 6312 6313**Best of both worlds!** 6314 6315## Version 4.10.0 (2026-02-08) - NEW WIKI DEFAULT THEME 6316 6317### New: Wiki Default Theme 6318- **Added:** 5th theme that automatically matches your DokuWiki template 6319- **Uses:** CSS variables from your wiki theme 6320- **Adapts:** Automatically works with light and dark themes 6321- **Perfect:** Seamless integration with any DokuWiki template 6322 6323### How It Works 6324 6325**Wiki theme uses DokuWiki CSS variables**: 6326```css 6327bg: var(--__background_site__, #f5f5f5) 6328border: var(--__border__, #ccc) 6329text_primary: var(--__text__, #333) 6330text_bright: var(--__link__, #2b73b7) 6331text_dim: var(--__text_neu__, #666) 6332cell_bg: var(--__background__, #fff) 6333grid_border: var(--__border__, #ccc) 6334``` 6335 6336**With fallbacks for older DokuWiki versions**: 6337- If CSS variables exist → Use them ✓ 6338- If not available → Use fallback values ✓ 6339 6340### All 5 Themes 6341 6342**1. Matrix Edition** (Default) 6343- Dark green with neon glow 6344- Matrix-style effects 6345- Original theme 6346 6347**2. Purple Dream** 6348- Rich purple with violet accents 6349- Elegant and sophisticated 6350- Soft glow effects 6351 6352**3. Professional Blue** 6353- Clean blue and grey 6354- Modern professional 6355- No glow effects 6356 6357**4. Pink Bling** 6358- Glamorous hot pink 6359- Maximum sparkle ✨ 6360- Hearts and diamonds 6361 6362**5. Wiki Default** ← NEW! 6363- Matches your wiki template 6364- Auto-adapts to light/dark 6365- Perfect integration 6366 6367### Examples 6368 6369**Light Wiki Template**: 6370``` 6371Wiki Default theme shows: 6372- Light backgrounds (#f5f5f5) 6373- Dark text (#333) 6374- Light inputs (#fff) 6375- Gray borders (#ccc) 6376 6377Matches perfectly! ✓ 6378``` 6379 6380**Dark Wiki Template**: 6381``` 6382Wiki Default theme shows: 6383- Dark backgrounds (from template) 6384- Light text (from template) 6385- Dark inputs (from template) 6386- Dark borders (from template) 6387 6388Matches perfectly! ✓ 6389``` 6390 6391**Bootstrap Template**: 6392``` 6393Uses Bootstrap's colors 6394Matches perfectly! ✓ 6395``` 6396 6397**Material Template**: 6398``` 6399Uses Material's colors 6400Matches perfectly! ✓ 6401``` 6402 6403### CSS Variables Used 6404 6405**DokuWiki provides**: 6406- `--__background_site__`: Page background 6407- `--__background_alt__`: Section backgrounds 6408- `--__background__`: Content backgrounds 6409- `--__text__`: Primary text color 6410- `--__link__`: Link color 6411- `--__text_neu__`: Dimmed text 6412- `--__border__`: Border color 6413- `--__background_neu__`: Neutral background 6414 6415**All with fallbacks**: 6416```css 6417var(--__background_site__, #f5f5f5) 6418/* Falls back to light gray if variable doesn't exist */ 6419``` 6420 6421### Perfect for Every Template 6422 6423**Custom templates**: Automatically adapts ✓ 6424**Light themes**: Perfect match ✓ 6425**Dark themes**: Perfect match ✓ 6426**Any DokuWiki version**: Works with fallbacks ✓ 6427 6428### Complete Theme Collection 6429 6430Now with **5 gorgeous themes**: 6431- 3 dark themes (Matrix, Purple, Pink) 6432- 1 light theme (Professional) 6433- 1 adaptive theme (Wiki Default) ← NEW! 6434 6435**Something for everyone!** 6436 6437## Version 4.9.0 (2026-02-08) - FIX CHECKBOX FIELD BORDERS 6438 6439### Fixed: Checkbox Field Borders Themed 6440- **Fixed:** Added border-color to checkbox field divs 6441- **Fixed:** Repeating Event section border 6442- **Fixed:** Task checkbox section border 6443- **Result:** No white borders around checkboxes! 6444 6445### Changes 6446 6447**Checkbox Field Border Styling**: 6448 6449**Before**: 6450```html 6451<div class="form-field-checkbox" 6452 style="background: $bg !important;"> 6453<!-- Border shows white ✗ --> 6454``` 6455 6456**After**: 6457```php 6458<div class="form-field-checkbox" 6459 style="background: $bg !important; 6460 border-color: $grid_border !important;"> 6461<!-- Border themed ✓ --> 6462``` 6463 6464### Before vs After 6465 6466**BEFORE (v4.8.8)**: 6467``` 6468Edit Dialog: 6469┌──────────────────┐ 6470│ ☑ Repeating ║│ ← White border ✗ 6471└──────────────────┘ 6472┌──────────────────┐ 6473│ ☑ Task checkbox ║│ ← White border ✗ 6474└──────────────────┘ 6475``` 6476 6477**AFTER (v4.9.0)**: 6478``` 6479Matrix Edit Dialog: 6480┌──────────────────┐ 6481│ ☑ Repeating │ ← Green border ✓ 6482└──────────────────┘ 6483┌──────────────────┐ 6484│ ☑ Task checkbox │ ← Green border ✓ 6485└──────────────────┘ 6486``` 6487 6488### ABSOLUTE PERFECTION ACHIEVED 6489 6490**Every element themed**: 6491- ✅ All inputs 6492- ✅ All labels 6493- ✅ All sections 6494- ✅ **Checkbox field borders** ← v4.9.0! 6495- ✅ All buttons 6496- ✅ All checkboxes 6497- ✅ No white anywhere 6498 6499**100% COMPLETE!** ✨ 6500 6501## Version 4.8.8 (2026-02-08) - FINAL FIXES: CHECKBOXES, BORDERS, BACKGROUNDS 6502 6503### Fixed: Checkbox Field Borders Themed 6504- **Fixed:** Added border-color to checkbox field divs 6505- **Fixed:** Repeating Event section border 6506- **Fixed:** Task checkbox section border 6507- **Result:** No white borders around checkboxes! 6508 6509### Fixed: Admin Sections Respect Wiki Theme 6510- **Fixed:** All admin backgrounds use CSS variables 6511- **Fixed:** Text colors use wiki text color 6512- **Fixed:** Borders use wiki border color 6513- **Result:** Admin matches wiki theme perfectly! 6514 6515### All Changes 6516 6517**1. Checkbox Field Border Styling**: 6518 6519**Before**: 6520```html 6521<div class="form-field-checkbox" 6522 style="background: $bg !important;"> 6523<!-- Border shows white ✗ --> 6524``` 6525 6526**After**: 6527```php 6528<div class="form-field-checkbox" 6529 style="background: $bg !important; 6530 border-color: $grid_border !important;"> 6531<!-- Border themed ✓ --> 6532``` 6533 6534**2. Admin CSS Variables**: 6535 6536**Added CSS variables for wiki theme compatibility**: 6537```css 6538.calendar-admin-wrapper { 6539 background: var(--__background_site__, #f5f5f5); 6540 color: var(--__text__, #333); 6541} 6542.calendar-admin-section { 6543 background: var(--__background_alt__, #fafafa); 6544} 6545.calendar-admin-input { 6546 background: var(--__background__, #fff); 6547 color: var(--__text__, #333); 6548} 6549``` 6550 6551**Replaced hardcoded colors**: 6552```php 6553// Before: 6554background: #f9f9f9 6555background: white 6556color: #333 6557border: 1px solid #ddd 6558 6559// After: 6560background: var(--__background_alt__, #f9f9f9) 6561background: var(--__background__, #fff) 6562color: var(--__text__, #333) 6563border: 1px solid var(--__border__, #ddd) 6564``` 6565 6566### Before vs After 6567 6568**BEFORE (v4.8.8)**: 6569``` 6570Edit Dialog: 6571┌──────────────────┐ 6572│ ☑ Repeating ║│ ← White border ✗ 6573└──────────────────┘ 6574┌──────────────────┐ 6575│ ☑ Task checkbox ║│ ← White border ✗ 6576└──────────────────┘ 6577 6578Admin Page (Dark Wiki Theme): 6579┌──────────────────┐ 6580│ Light sections │ ← White boxes ✗ 6581│ Light inputs │ ← Doesn't match ✗ 6582└──────────────────┘ 6583``` 6584 6585**AFTER (v4.8.9)**: 6586``` 6587Matrix Edit Dialog: 6588┌──────────────────┐ 6589│ ☑ Repeating │ ← Green border ✓ 6590└──────────────────┘ 6591┌──────────────────┐ 6592│ ☑ Task checkbox │ ← Green border ✓ 6593└──────────────────┘ 6594 6595Admin (Dark Wiki Theme): 6596┌──────────────────┐ 6597│ Dark sections │ ← Matches wiki ✓ 6598│ Dark inputs │ ← Perfect match ✓ 6599└──────────────────┘ 6600``` 6601 6602### Admin Theme Examples 6603 6604**Light Wiki Theme**: 6605``` 6606Admin page backgrounds: Light 6607Section boxes: Light gray 6608Inputs: White 6609Borders: Gray 6610Text: Dark 6611 6612Perfect match! ✓ 6613``` 6614 6615**Dark Wiki Theme**: 6616``` 6617Admin page backgrounds: Dark 6618Section boxes: Darker gray 6619Inputs: Dark 6620Borders: Dark gray 6621Text: Light 6622 6623Perfect match! ✓ 6624``` 6625 6626**DokuWiki Default**: 6627``` 6628Uses wiki's CSS variables 6629Automatically adapts 6630Always matches! ✓ 6631``` 6632 6633### Complete Coverage 6634 6635**Edit Dialog**: 6636- ✅ All inputs themed 6637- ✅ All labels themed 6638- ✅ All sections themed 6639- ✅ **Checkbox borders** ← v4.8.9! 6640- ✅ All buttons themed 6641- ✅ No white anywhere 6642 6643**Admin Interface**: 6644- ✅ **Tab navigation** ← v4.8.9! 6645- ✅ **Section boxes** ← v4.8.9! 6646- ✅ **Input fields** ← v4.8.9! 6647- ✅ **Text colors** ← v4.8.9! 6648- ✅ **Borders** ← v4.8.9! 6649- ✅ All tabs (Manage, Update, Outlook, Themes) 6650 6651### CSS Variables Used 6652 6653**DokuWiki provides these**: 6654- `--__background_site__`: Page background 6655- `--__background_alt__`: Alternate background 6656- `--__background__`: Primary background (inputs) 6657- `--__text__`: Text color 6658- `--__border__`: Border color 6659 6660**Fallbacks provided for older DokuWiki**: 6661```css 6662var(--__background_site__, #f5f5f5) 6663var(--__background_alt__, #fafafa) 6664var(--__background__, #fff) 6665var(--__text__, #333) 6666var(--__border__, #ddd) 6667``` 6668 6669### Perfect Adaptation 6670 6671**Admin now adapts to ANY wiki theme**: 6672- Light themes → Light admin ✓ 6673- Dark themes → Dark admin ✓ 6674- Custom themes → Matches perfectly ✓ 6675- No hardcoded colors ✓ 6676 6677**Calendar themes still work**: 6678- Matrix, Purple, Professional, Pink ✓ 6679- Independent from wiki theme ✓ 6680- Admin respects wiki ✓ 6681- Calendar respects calendar theme ✓ 6682 6683### FINAL PERFECTION 6684 6685**Frontend (Calendar)**: 6686- Complete theming ✓ 6687- 4 beautiful themes ✓ 6688- Every pixel themed ✓ 6689 6690**Backend (Admin)**: 6691- Respects wiki theme ✓ 6692- Works with any theme ✓ 6693- Perfect compatibility ✓ 6694 6695**ABSOLUTELY EVERYTHING THEMED!** ✨ 6696 6697## Version 4.8.8 (2026-02-08) - FINAL FIXES: CHECKBOXES, BORDERS, BACKGROUNDS 6698 6699### Fixed: Task Checkboxes Now Fully Themed 6700- **Fixed:** Added background-color and border inline 6701- **Fixed:** Both PHP and JavaScript versions 6702- **Result:** No white checkboxes! 6703 6704### Fixed: Past Events Toggle Border 6705- **Fixed:** Added !important to border styling 6706- **Fixed:** Explicit top and bottom borders 6707- **Result:** No white line under toggle! 6708 6709### Fixed: Form Field Section Backgrounds 6710- **Fixed:** All form-field and form-row-group backgrounds 6711- **Fixed:** Every section in edit dialog 6712- **Result:** No white sections anywhere! 6713 6714### All Changes 6715 6716**1. Task Checkbox Styling**: 6717 6718**Before**: 6719```php 6720style="accent-color: $border !important;" 6721<!-- Only accent, background still white ✗ --> 6722``` 6723 6724**After**: 6725```php 6726style="accent-color: $border !important; 6727 background-color: $cell_bg !important; 6728 border: 2px solid $grid_border !important;" 6729<!-- Full theming ✓ --> 6730``` 6731 6732**2. Past Events Toggle Border**: 6733 6734**Before**: 6735```php 6736style="border-color: $grid_border;" 6737<!-- No !important, CSS overrides ✗ --> 6738``` 6739 6740**After**: 6741```php 6742style="border-color: $grid_border !important; 6743 border-top: 1px solid $grid_border !important; 6744 border-bottom: 1px solid $grid_border !important;" 6745<!-- Cannot be overridden ✓ --> 6746``` 6747 6748**3. Form Field Backgrounds**: 6749 6750**Before**: 6751```html 6752<div class="form-field"> 6753<div class="form-row-group"> 6754<!-- No background, shows white ✗ --> 6755``` 6756 6757**After**: 6758```php 6759<div class="form-field" style="background: $bg !important;"> 6760<div class="form-row-group" style="background: $bg !important;"> 6761<!-- Fully themed ✓ --> 6762``` 6763 6764### Before vs After 6765 6766**BEFORE (v4.8.7)**: 6767``` 6768Event: 6769□ Task checkbox ← White checkbox ✗ 6770 6771Past Events 6772▶ Past Events (3) ← White line below ✗ 6773───────────────── 6774 6775Edit Dialog: 6776┌──────────────┐ 6777│ Form fields │ ← White sections ✗ 6778└──────────────┘ 6779``` 6780 6781**AFTER (v4.8.8)**: 6782``` 6783Matrix Event: 6784☑ Task checkbox ← Green checkbox ✓ 6785 6786Past Events 6787▶ Past Events (3) ← Green border ✓ 6788───────────────── 6789 6790Matrix Edit Dialog: 6791┌──────────────┐ 6792│ Form fields │ ← Dark green ✓ 6793└──────────────┘ 6794``` 6795 6796### Complete Examples 6797 6798**Matrix Theme**: 6799``` 6800Task Checkbox: 6801☑ Checked → Green checkmark, green bg 6802☐ Unchecked → Green border, dark green bg ✓ 6803 6804Past Events Toggle: 6805▶ Past Events (3) 6806─────────────────── Green border ✓ 6807 6808Edit Dialog: 6809All sections dark green ✓ 6810No white anywhere ✓ 6811``` 6812 6813**Purple Theme**: 6814``` 6815Task Checkbox: 6816☑ Checked → Purple checkmark, purple bg 6817☐ Unchecked → Purple border, dark purple bg ✓ 6818 6819Past Events Toggle: 6820▶ Past Events (3) 6821─────────────────── Purple border ✓ 6822 6823Edit Dialog: 6824All sections dark purple ✓ 6825``` 6826 6827**Professional Theme**: 6828``` 6829Task Checkbox: 6830☑ Checked → Blue checkmark, white bg 6831☐ Unchecked → Gray border, white bg ✓ 6832 6833Past Events Toggle: 6834▶ Past Events (3) 6835─────────────────── Gray border ✓ 6836 6837Edit Dialog: 6838All sections light ✓ 6839``` 6840 6841**Pink Theme**: 6842``` 6843Task Checkbox: 6844☑ Checked → Pink checkmark, pink bg ✨ 6845☐ Unchecked → Pink border, dark pink bg ✓ 6846 6847Past Events Toggle: 6848▶ Past Events (3) 6849─────────────────── Pink border 6850 6851Edit Dialog: 6852All sections dark pink ✓ 6853``` 6854 6855### Checkbox Visual 6856 6857**Matrix - Unchecked**: 6858``` 6859┌─────┐ 6860│ │ ← Dark green background 6861│ │ Green border 6862└─────┘ 6863``` 6864 6865**Matrix - Checked**: 6866``` 6867┌─────┐ 6868│ ✓ │ ← Dark green background 6869│ │ Green checkmark 6870└─────┘ 6871``` 6872 6873### Past Events Border 6874 6875**Before**: 6876``` 6877▶ Past Events (3) 6878─────────────────── White line ✗ 6879``` 6880 6881**After**: 6882``` 6883▶ Past Events (3) 6884─────────────────── Green line ✓ (Matrix) 6885 Purple line ✓ (Purple) 6886 Gray line ✓ (Professional) 6887 Pink line ✓ (Pink) 6888``` 6889 6890### Form Field Coverage 6891 6892**All sections themed**: 6893- ✅ Title field 6894- ✅ Namespace field 6895- ✅ Description field 6896- ✅ **Date row** ← v4.8.8! 6897- ✅ **Checkbox sections** ← v4.8.8! 6898- ✅ **Recurring options** ← v4.8.8! 6899- ✅ **Time row** ← v4.8.8! 6900- ✅ **Color row** ← v4.8.8! 6901- ✅ Button footer 6902 6903**Every div has background!** ✓ 6904 6905### ABSOLUTE PERFECTION 6906 6907**Not a single white pixel**: 6908- ✅ No white checkboxes 6909- ✅ No white borders 6910- ✅ No white backgrounds 6911- ✅ No white sections 6912- ✅ No white lines 6913- ✅ No white anything 6914 6915**100% PERFECT THEMING!** ✨ 6916 6917## Version 4.8.7 (2026-02-08) - COMPLETE DIALOG & POPUP THEMING 6918 6919### Fixed: Checkbox Section Backgrounds Themed 6920- **Fixed:** Repeating Event section background 6921- **Fixed:** Task checkbox section background 6922- **Result:** No white backgrounds in dialog! 6923 6924### Fixed: Unchecked Task Checkboxes Themed 6925- **Fixed:** Added CSS for checkbox backgrounds 6926- **Fixed:** Unchecked boxes show theme colors 6927- **Result:** No white checkboxes! 6928 6929### Fixed: Day Popup Dialog Fully Themed 6930- **Fixed:** Popup container, header, body themed 6931- **Fixed:** Event items in popup themed 6932- **Fixed:** Add Event button themed 6933- **Fixed:** Footer section themed 6934- **Result:** Perfect popup theming! 6935 6936### All Changes 6937 6938**1. Checkbox Section Backgrounds**: 6939 6940**Before**: 6941```html 6942<div class="form-field-checkbox"> 6943<!-- White background ✗ --> 6944``` 6945 6946**After**: 6947```php 6948<div class="form-field-checkbox" 6949 style="background: $bg !important;"> 6950<!-- Themed ✓ --> 6951``` 6952 6953**2. Checkbox Background CSS**: 6954 6955**Added to style block**: 6956```css 6957.task-checkbox { 6958 background-color: $cell_bg !important; 6959 border: 2px solid $grid_border !important; 6960} 6961``` 6962 6963**3. Day Popup Theming**: 6964 6965**Container**: 6966```javascript 6967style="background: $bg !important; 6968 border: 2px solid $border !important; 6969 box-shadow: 0 0 20px $shadow !important;" 6970``` 6971 6972**Header**: 6973```javascript 6974style="background: $header_bg !important; 6975 color: $text_primary !important; 6976 border-bottom: 1px solid $border !important;" 6977``` 6978 6979**Footer**: 6980```javascript 6981style="background: $bg !important; 6982 border-top: 1px solid $grid_border !important;" 6983``` 6984 6985**Add Event Button**: 6986```javascript 6987style="background: $border !important; 6988 color: $bg !important; 6989 border-color: $border !important;" 6990``` 6991 6992**Event Items**: 6993```javascript 6994style="background: $cell_bg !important; 6995 border: 1px solid $grid_border !important;" 6996``` 6997 6998### Before vs After 6999 7000**BEFORE (v4.8.6)**: 7001``` 7002Edit Dialog: 7003┌──────────────────┐ 7004│ ☑ Repeating Event│ ← White background ✗ 7005├──────────────────┤ 7006│ ☑ Task checkbox │ ← White background ✗ 7007└──────────────────┘ 7008 7009Day Popup: 7010┌──────────────────┐ 7011│ Monday, Feb 8 │ ← White ✗ 7012├──────────────────┤ 7013│ Team Meeting │ ← White ✗ 7014│ 2:00 PM │ 7015├──────────────────┤ 7016│ [+ Add Event] │ ← White ✗ 7017└──────────────────┘ 7018 7019Task checkbox: ☐ ← White ✗ 7020``` 7021 7022**AFTER (v4.8.7)**: 7023``` 7024Edit Dialog (Matrix): 7025┌──────────────────┐ 7026│ ☑ Repeating Event│ ← Dark green ✓ 7027├──────────────────┤ 7028│ ☑ Task checkbox │ ← Dark green ✓ 7029└──────────────────┘ 7030 7031Day Popup (Matrix): 7032┌──────────────────┐ 7033│ Monday, Feb 8 │ ← Dark green ✓ 7034├──────────────────┤ 7035│ Team Meeting │ ← Dark green ✓ 7036│ 2:00 PM │ 7037├──────────────────┤ 7038│ [+ Add Event] │ ← Green button ✓ 7039└──────────────────┘ 7040 7041Task checkbox: ☑ ← Green ✓ 7042``` 7043 7044### Complete Examples 7045 7046**Matrix Dialog**: 7047``` 7048┌──────────────────────────┐ 7049│ ✏️ Edit Event │ 7050├──────────────────────────┤ 7051│ Title: [_________] │ 7052│ Date: [__________] │ 7053│ │ 7054│ ☑ Repeating Event │ ← Dark green bg 7055├──────────────────────────┤ 7056│ ☑ Task checkbox │ ← Dark green bg 7057├──────────────────────────┤ 7058│ [Cancel] [ Save] │ 7059└──────────────────────────┘ 7060 7061All sections themed! ✓ 7062``` 7063 7064**Matrix Day Popup**: 7065``` 7066┌──────────────────────────┐ 7067│ Monday, February 8, 2026 │ ← Green header 7068├──────────────────────────┤ 7069│ ┌──────────────────────┐ │ 7070│ │ Team Meeting │ │ ← Dark green 7071│ │ 2:00 PM │ │ 7072│ └──────────────────────┘ │ 7073│ ┌──────────────────────┐ │ 7074│ │ Code Review │ │ ← Dark green 7075│ │ 4:00 PM │ │ 7076│ └──────────────────────┘ │ 7077├──────────────────────────┤ 7078│ [+ Add Event] │ ← Green button 7079└──────────────────────────┘ 7080``` 7081 7082**Purple Day Popup**: 7083``` 7084┌──────────────────────────┐ 7085│ Monday, February 8, 2026 │ ← Purple header 7086├──────────────────────────┤ 7087│ ┌──────────────────────┐ │ 7088│ │ Team Meeting │ │ ← Dark purple 7089│ │ 2:00 PM │ │ 7090│ └──────────────────────┘ │ 7091├──────────────────────────┤ 7092│ [+ Add Event] │ ← Purple button 7093└──────────────────────────┘ 7094``` 7095 7096**Professional Day Popup**: 7097``` 7098┌──────────────────────────┐ 7099│ Monday, February 8, 2026 │ ← Light header 7100├──────────────────────────┤ 7101│ ┌──────────────────────┐ │ 7102│ │ Team Meeting │ │ ← White 7103│ │ 2:00 PM │ │ 7104│ └──────────────────────┘ │ 7105├──────────────────────────┤ 7106│ [+ Add Event] │ ← Blue button 7107└──────────────────────────┘ 7108``` 7109 7110**Pink Day Popup**: 7111``` 7112┌──────────────────────────┐ 7113│ Monday, February 8, 2026 │ ← Pink header ✨ 7114├──────────────────────────┤ 7115│ ┌──────────────────────┐ │ 7116│ │ Team Meeting │ │ ← Dark pink 7117│ │ 2:00 PM │ │ 7118│ └──────────────────────┘ │ 7119├──────────────────────────┤ 7120│ [+ Add Event] │ ← Pink button 7121└──────────────────────────┘ 7122``` 7123 7124### Checkbox Theming 7125 7126**Unchecked boxes now themed**: 7127``` 7128Matrix: 7129☐ → Dark green bg, green border ✓ 7130 7131Purple: 7132☐ → Dark purple bg, purple border ✓ 7133 7134Professional: 7135☐ → White bg, gray border ✓ 7136 7137Pink: 7138☐ → Dark pink bg, pink border ✓ 7139``` 7140 7141### Complete Coverage 7142 7143**Edit Dialog - All Sections**: 7144- ✅ Header 7145- ✅ All inputs 7146- ✅ All labels 7147- ✅ **Checkbox sections** ← v4.8.7! 7148- ✅ Recurring options 7149- ✅ Button footer 7150- ✅ All checkboxes (checked & unchecked) 7151 7152**Day Popup - All Elements**: 7153- ✅ **Popup container** ← v4.8.7! 7154- ✅ **Header** ← v4.8.7! 7155- ✅ **Body** ← v4.8.7! 7156- ✅ **Event items** ← v4.8.7! 7157- ✅ **Namespace badges** ← v4.8.7! 7158- ✅ **Footer** ← v4.8.7! 7159- ✅ **Add Event button** ← v4.8.7! 7160- ✅ **No events message** ← v4.8.7! 7161 7162**Absolutely every dialog element themed!** ✨ 7163 7164### Perfect Theming Achievement 7165 7166**Every UI component in entire plugin**: 7167- ✅ Calendar grid 7168- ✅ Sidebar widget 7169- ✅ Event list 7170- ✅ Search bar 7171- ✅ Event boxes 7172- ✅ Edit dialog (complete) 7173- ✅ **Day popup** ← v4.8.7! 7174- ✅ Month picker 7175- ✅ All text 7176- ✅ All buttons 7177- ✅ All inputs 7178- ✅ **All checkboxes** ← v4.8.7! 7179- ✅ All borders 7180- ✅ All badges 7181- ✅ All backgrounds 7182 7183**NO WHITE ANYWHERE!** 7184 7185**100% COMPLETE THEMING ACHIEVED!** ✨ 7186 7187## Version 4.8.6 (2026-02-08) - FIX DIALOG SECTIONS & EVENT BOX BORDERS 7188 7189### Fixed: Dialog Checkbox Sections Themed 7190- **Fixed:** Recurring options section background themed 7191- **Fixed:** Section has themed border accent 7192- **Result:** No white sections in dialog! 7193 7194### Fixed: Dialog Button Section Themed 7195- **Fixed:** Button area background themed 7196- **Fixed:** Top border separator themed 7197- **Result:** Complete dialog theming! 7198 7199### Fixed: Event Box Borders Themed 7200- **Fixed:** Top, right, bottom borders now themed 7201- **Fixed:** Left border remains event color 7202- **Result:** Perfect event boxes! 7203 7204### All Changes 7205 7206**1. Recurring Options Section**: 7207 7208**Before**: 7209```html 7210<div class="recurring-options" style="display:none;"> 7211<!-- White background ✗ --> 7212``` 7213 7214**After**: 7215```php 7216<div class="recurring-options" 7217 style="display:none; 7218 background: $bg !important; 7219 padding: 8px; 7220 border-left: 2px solid $border; 7221 margin-left: 4px;"> 7222<!-- Themed with accent border ✓ --> 7223``` 7224 7225**2. Dialog Actions Section**: 7226 7227**Before**: 7228```html 7229<div class="dialog-actions-sleek"> 7230<!-- White background ✗ --> 7231``` 7232 7233**After**: 7234```php 7235<div class="dialog-actions-sleek" 7236 style="background: $bg !important; 7237 border-top: 1px solid $grid_border !important;"> 7238<!-- Themed with separator ✓ --> 7239``` 7240 7241**3. Event Box Borders**: 7242 7243**Before**: 7244```php 7245border-left-color: $event_color; 7246<!-- Only left border colored ✗ --> 7247``` 7248 7249**After**: 7250```php 7251border-left-color: $event_color; 7252border-top: 1px solid $grid_border !important; 7253border-right: 1px solid $grid_border !important; 7254border-bottom: 1px solid $grid_border !important; 7255<!-- All borders themed! ✓ --> 7256``` 7257 7258### Before vs After 7259 7260**BEFORE (v4.8.5)**: 7261``` 7262Dialog: 7263┌────────────────┐ 7264│ ☑ Repeating │ 7265├────────────────┤ ← White section ✗ 7266│ Repeat: Daily │ 7267│ Until: [____] │ 7268├────────────────┤ 7269│ [Cancel] [Save]│ ← White footer ✗ 7270└────────────────┘ 7271 7272Event Box: 7273┌────────────┐ 7274│Team Meeting│ ← White borders ✗ 7275│2:00 PM │ 7276└────────────┘ 7277``` 7278 7279**AFTER (v4.8.6)**: 7280``` 7281Matrix Dialog: 7282┌────────────────┐ 7283│ ☑ Repeating │ 7284├────────────────┤ ← Dark green ✓ 7285│ Repeat: Daily │ Green accent border 7286│ Until: [____] │ 7287├────────────────┤ 7288│ [Cancel] [Save]│ ← Dark green ✓ 7289└────────────────┘ 7290 7291Matrix Event Box: 7292┌────────────┐ 7293│Team Meeting│ ← Green borders ✓ 7294│2:00 PM │ 7295└────────────┘ 7296``` 7297 7298### Dialog Section Examples 7299 7300**Matrix Theme**: 7301``` 7302┌──────────────────────────┐ 7303│ ✏️ Edit Event │ 7304├──────────────────────────┤ 7305│ ☑ Repeating Event │ 7306├║─────────────────────────┤ Green accent 7307│║ Repeat Every: Daily │ Dark green bg 7308│║ Repeat Until: [_____] │ 7309└──────────────────────────┘ 7310 [Cancel] [ Save] ← Dark green bg 7311──────────────────────────── Green border 7312``` 7313 7314**Purple Theme**: 7315``` 7316┌──────────────────────────┐ 7317│ ☑ Repeating Event │ 7318├║─────────────────────────┤ Purple accent 7319│║ Repeat options... │ Dark purple bg 7320└──────────────────────────┘ 7321 [Cancel] [ Save] ← Dark purple bg 7322──────────────────────────── Purple border 7323``` 7324 7325**Professional Theme**: 7326``` 7327┌──────────────────────────┐ 7328│ ☑ Repeating Event │ 7329├║─────────────────────────┤ Blue accent 7330│║ Repeat options... │ Light bg 7331└──────────────────────────┘ 7332 [Cancel] [ Save] ← Light bg 7333──────────────────────────── Gray border 7334``` 7335 7336**Pink Theme**: 7337``` 7338┌──────────────────────────┐ 7339│ ☑ Repeating Event ✨ │ 7340├║─────────────────────────┤ Pink accent 7341│║ Repeat options... │ Dark pink bg 7342└──────────────────────────┘ 7343 [Cancel] [ Save] ← Dark pink bg 7344──────────────────────────── Pink border 7345``` 7346 7347### Event Box Border Visual 7348 7349**Before (v4.8.5)**: 7350``` 7351Left border only: 7352█ Team Meeting 7353█ 2:00 PM 7354█ [Edit] [Delete] 7355 7356Only event color on left ✗ 7357White on other 3 sides ✗ 7358``` 7359 7360**After (v4.8.6)**: 7361``` 7362All borders themed: 7363┌─────────────┐ 7364█Team Meeting │ ← Top: themed 7365█2:00 PM │ ← Right: themed 7366█[Edit][Del] │ ← Bottom: themed 7367└─────────────┘ 7368 7369Left: Event color ✓ 7370Other 3: Theme grid_border ✓ 7371``` 7372 7373### Matrix Event Box: 7374``` 7375┌─────────────┐ Green border 7376│Team Meeting │ 7377│2:00 PM │ 7378└─────────────┘ Green border 7379↑ 7380Green left bar 7381``` 7382 7383### Purple Event Box: 7384``` 7385┌─────────────┐ Purple border 7386│Team Meeting │ 7387│2:00 PM │ 7388└─────────────┘ Purple border 7389↑ 7390Purple left bar 7391``` 7392 7393### Professional Event Box: 7394``` 7395┌─────────────┐ Gray border 7396│Team Meeting │ 7397│2:00 PM │ 7398└─────────────┘ Gray border 7399↑ 7400Event color left bar 7401``` 7402 7403### Complete Dialog Coverage 7404 7405**All sections themed**: 7406- ✅ Dialog header 7407- ✅ Form inputs 7408- ✅ Checkbox labels 7409- ✅ **Recurring options** ← v4.8.6! 7410- ✅ **Button section** ← v4.8.6! 7411- ✅ All labels 7412- ✅ All buttons 7413 7414**No white sections!** ✓ 7415 7416### Complete Event Box Coverage 7417 7418**All borders themed**: 7419- ✅ Left border (event color) 7420- ✅ **Top border** ← v4.8.6! 7421- ✅ **Right border** ← v4.8.6! 7422- ✅ **Bottom border** ← v4.8.6! 7423- ✅ Background 7424- ✅ Text 7425 7426**Perfect box outline!** ✓ 7427 7428### Visual Perfection 7429 7430**Matrix theme event list**: 7431``` 7432┌─────────────┐ 7433│Team Meeting │ ← Green box 7434│2:00 PM │ 7435└─────────────┘ 7436┌─────────────┐ 7437│Code Review │ ← Green box 7438│4:00 PM │ 7439└─────────────┘ 7440 7441All borders green! ✓ 7442``` 7443 7444**ABSOLUTE PERFECT THEMING!** ✨ 7445 7446## Version 4.8.5 (2026-02-08) - THEME EVENT DIALOG & SIDEBAR BORDERS 7447 7448### Fixed: Event Dialog Fully Themed 7449- **Fixed:** Dialog background, header, inputs all themed 7450- **Fixed:** All labels, checkboxes, selects themed 7451- **Fixed:** Save and Cancel buttons themed 7452- **Result:** Dialog matches theme perfectly! 7453 7454### Fixed: Sidebar Event Borders Properly Themed 7455- **Fixed:** Event divider borders use grid_border color 7456- **Fixed:** Clean, subtle themed dividers 7457- **Result:** No more white borders in sidebar! 7458 7459### All Changes 7460 7461**1. Event Dialog Theming**: 7462 7463**Dialog container**: 7464```php 7465background: $themeStyles['bg'] !important; 7466border: 2px solid $themeStyles['border'] !important; 7467box-shadow: 0 0 20px $shadow !important; 7468``` 7469 7470**Dialog header**: 7471```php 7472background: $themeStyles['header_bg'] !important; 7473color: $themeStyles['text_primary'] !important; 7474border-bottom: 1px solid $border !important; 7475``` 7476 7477**All form inputs** (text, date, select, textarea): 7478```php 7479background: $themeStyles['cell_bg'] !important; 7480color: $themeStyles['text_primary'] !important; 7481border-color: $themeStyles['grid_border'] !important; 7482``` 7483 7484**All labels**: 7485```php 7486color: $themeStyles['text_primary'] !important; 7487``` 7488 7489**Checkboxes**: 7490```php 7491accent-color: $themeStyles['border'] !important; 7492``` 7493 7494**Buttons**: 7495```php 7496// Cancel button: 7497background: $cell_bg !important; 7498color: $text_primary !important; 7499 7500// Save button: 7501background: $border !important; 7502color: $bg !important; (or white for professional) 7503``` 7504 7505**2. Sidebar Event Borders**: 7506 7507**Before**: 7508```php 7509border-bottom: 1px solid rgba(0, 204, 7, 0.2); // Hardcoded 7510``` 7511 7512**After**: 7513```php 7514borderColor = $themeStyles['grid_border']; 7515border-bottom: 1px solid $borderColor !important; 7516``` 7517 7518### Before vs After 7519 7520**BEFORE (v4.8.4)**: 7521``` 7522Event Dialog: 7523┌────────────────┐ 7524│ Add Event │ ← White background ✗ 7525│ Title: [_____] │ ← White inputs ✗ 7526│ Date: [_____] │ 7527│ [Cancel] [Save]│ ← Default buttons ✗ 7528└────────────────┘ 7529 7530Sidebar Events: 7531Event 1 ──────── ← White border ✗ 7532Event 2 ──────── ← White border ✗ 7533``` 7534 7535**AFTER (v4.8.5)**: 7536``` 7537Event Dialog (Matrix): 7538┌────────────────┐ 7539│ Add Event │ ← Dark green background ✓ 7540│ Title: [_____] │ ← Dark green inputs ✓ 7541│ Date: [_____] │ ← Green text ✓ 7542│ [Cancel] [Save]│ ← Themed buttons ✓ 7543└────────────────┘ 7544 7545Sidebar Events (Matrix): 7546Event 1 ──────── ← Green border ✓ 7547Event 2 ──────── ← Green border ✓ 7548``` 7549 7550### Dialog Examples by Theme 7551 7552**Matrix Dialog**: 7553``` 7554┌──────────────────────────┐ 7555│ ✏️ Edit Event │ ← Dark green header 7556├──────────────────────────┤ 7557│ Title │ ← Green labels 7558│ [Team Meeting________] │ ← Dark green input 7559│ │ 7560│ Start Date │ 7561│ [2026-02-08__] │ ← Dark green input 7562│ │ 7563│ Start Time │ 7564│ [2:00 PM ▼] │ ← Green select 7565│ │ 7566│ ☑ Repeating Event │ ← Green checkbox 7567│ │ 7568│ [Cancel] [ Save] │ ← Themed buttons 7569└──────────────────────────┘ 7570 7571Everything green! ✓ 7572``` 7573 7574**Purple Dialog**: 7575``` 7576┌──────────────────────────┐ 7577│ ✏️ Edit Event │ ← Dark purple header 7578├──────────────────────────┤ 7579│ [Inputs_______________] │ ← Dark purple inputs 7580│ ☑ Checkboxes │ ← Purple accent 7581│ [Cancel] [ Save] │ ← Purple buttons 7582└──────────────────────────┘ 7583``` 7584 7585**Professional Dialog**: 7586``` 7587┌──────────────────────────┐ 7588│ ✏️ Edit Event │ ← Light gradient header 7589├──────────────────────────┤ 7590│ [Inputs_______________] │ ← White inputs 7591│ ☑ Checkboxes │ ← Blue accent 7592│ [Cancel] [ Save] │ ← Blue save button 7593└──────────────────────────┘ 7594``` 7595 7596**Pink Dialog**: 7597``` 7598┌──────────────────────────┐ 7599│ ✏️ Edit Event │ ← Dark pink header ✨ 7600├──────────────────────────┤ 7601│ [Inputs_______________] │ ← Dark pink inputs 7602│ ☑ Checkboxes │ ← Pink accent 7603│ [Cancel] [ Save] │ ← Pink buttons 7604└──────────────────────────┘ 7605``` 7606 7607### Complete Dialog Element Coverage 7608 7609**All form elements themed**: 7610- ✅ Dialog container 7611- ✅ Dialog header 7612- ✅ Close button (×) 7613- ✅ Title input 7614- ✅ Namespace search 7615- ✅ Namespace dropdown 7616- ✅ Description textarea 7617- ✅ Start date input 7618- ✅ End date input 7619- ✅ Recurring checkbox 7620- ✅ Recurrence type select 7621- ✅ Recurrence end date 7622- ✅ Start time select 7623- ✅ End time select 7624- ✅ Color select 7625- ✅ Custom color picker 7626- ✅ Task checkbox 7627- ✅ All labels 7628- ✅ Cancel button 7629- ✅ Save button 7630 7631**Every single dialog element themed!** 7632 7633### Sidebar Border Example 7634 7635**Matrix Sidebar**: 7636``` 7637┌────────────────┐ 7638│ Today │ ← Green section header 7639├────────────────┤ 7640│ Team Meeting │ 7641│ 2:00 PM │ 7642├────────────────┤ ← Green border (grid_border) 7643│ Code Review │ 7644│ 4:00 PM │ 7645├────────────────┤ ← Green border 7646│ Stand-up │ 7647│ All day │ 7648└────────────────┘ 7649 7650Subtle green dividers! ✓ 7651``` 7652 7653### Complete Achievement 7654 7655**Every UI element themed**: 7656- ✅ Calendar 7657- ✅ Sidebar widget 7658- ✅ Event list 7659- ✅ Search bar 7660- ✅ **Event dialog** ← v4.8.5! 7661- ✅ Month picker 7662- ✅ **Sidebar dividers** ← v4.8.5! 7663- ✅ All text 7664- ✅ All inputs 7665- ✅ All buttons 7666- ✅ All borders 7667- ✅ All checkboxes 7668 7669**ABSOLUTE COMPLETE THEMING!** ✨ 7670 7671## Version 4.8.4 (2026-02-08) - FIX PROFESSIONAL THEME BACKGROUNDS 7672 7673### Fixed: Professional Theme Background Consistency 7674- **Fixed:** Container and event backgrounds now match sidebar 7675- **Fixed:** Lighter, cleaner appearance 7676- **Fixed:** Better contrast and readability 7677- **Result:** Professional theme looks cohesive! 7678 7679### The Problem 7680 7681**v4.8.3 Professional theme**: 7682``` 7683Sidebar: Light background (#f5f7fa) 7684Calendar: Medium background (#e8ecf1) ← Didn't match! 7685Events: Light background (#f5f7fa) 7686 7687Inconsistent! ✗ 7688``` 7689 7690### The Fix 7691 7692**Updated Professional theme colors for consistency**: 7693 7694```php 7695// Before: 7696'bg' => '#e8ecf1', // Medium gray-blue 7697'cell_bg' => '#f5f7fa', // Very light 7698'grid_bg' => '#d5dbe3', // Medium-dark 7699 7700// After: 7701'bg' => '#f5f7fa', // Very light (matches sidebar) 7702'cell_bg' => '#ffffff', // Pure white (clean) 7703'grid_bg' => '#e8ecf1', // Subtle contrast 7704'grid_border' => '#d0d7de', // Softer borders 7705``` 7706 7707### Before vs After 7708 7709**BEFORE (v4.8.3)**: 7710``` 7711Professional Theme: 7712┌────────────────┐ 7713│ Calendar │ ← Medium gray (#e8ecf1) 7714│ ┌────────────┐ │ 7715│ │ Event │ │ ← Light (#f5f7fa) 7716│ └────────────┘ │ 7717└────────────────┘ 7718 7719Sidebar: 7720┌────────────────┐ 7721│ Widget │ ← Light (#f5f7fa) 7722└────────────────┘ 7723 7724Backgrounds don't match! ✗ 7725``` 7726 7727**AFTER (v4.8.4)**: 7728``` 7729Professional Theme: 7730┌────────────────┐ 7731│ Calendar │ ← Light (#f5f7fa) 7732│ ┌────────────┐ │ 7733│ │ Event │ │ ← White (#ffffff) 7734│ └────────────┘ │ 7735└────────────────┘ 7736 7737Sidebar: 7738┌────────────────┐ 7739│ Widget │ ← Light (#f5f7fa) 7740└────────────────┘ 7741 7742Perfect match! ✓ 7743``` 7744 7745### New Professional Theme Colors 7746 7747**Backgrounds**: 7748- Container: `#f5f7fa` (light blue-gray) 7749- Events: `#ffffff` (pure white) 7750- Grid: `#e8ecf1` (subtle contrast) 7751 7752**Text**: 7753- Primary: `#2c3e50` (dark blue-gray) 7754- Bright: `#4a90e2` (blue accent) 7755- Dim: `#7f8c8d` (medium gray) 7756 7757**Borders**: 7758- Main: `#4a90e2` (blue) 7759- Grid: `#d0d7de` (soft gray) 7760 7761**Header**: 7762- Gradient: `#ffffff` → `#f5f7fa` 7763 7764### Visual Example 7765 7766**Professional Theme Now**: 7767``` 7768┌─────────────────────────────┐ 7769│ February 2026 │ ← White to light gradient 7770├─┬─┬─┬─┬─┬─┬─┬───────────────┤ 7771│S│M│T│W│T│F│S│ │ ← Light background 7772├─┼─┼─┼─┼─┼─┼─┤ │ 7773│ │ │1│2│3│4│5│ Event List │ ← White events 7774│ │ │ │ │ │ │ │ ┌───────────┐ │ 7775│ │ │ │ │[8]│ │ │ Meeting │ │ ← White on light 7776└─┴─┴─┴─┴─┴─┴─┴─└───────────┘─┘ 7777 7778Clean, professional look! ✓ 7779``` 7780 7781### Comparison with Other Themes 7782 7783**Matrix** (dark): 7784- Container: #242424 (dark green) 7785- Events: #242424 (dark green) 7786- Consistent dark theme ✓ 7787 7788**Purple** (dark): 7789- Container: #1a0d14 (dark purple) 7790- Events: #2a2030 (dark purple) 7791- Consistent dark theme ✓ 7792 7793**Professional** (light): 7794- Container: #f5f7fa (light blue) 7795- Events: #ffffff (white) 7796- Consistent light theme ✓ 7797 7798**Pink** (dark): 7799- Container: #1a0d14 (dark pink) 7800- Events: #1a0d14 (dark pink) 7801- Consistent dark theme ✓ 7802 7803**All themes now consistent!** 7804 7805### Better Contrast 7806 7807**Professional theme improvements**: 7808 7809**Readability**: 7810- Dark text (#2c3e50) on white/light backgrounds ✓ 7811- Excellent contrast ratio ✓ 7812- Easy on the eyes ✓ 7813 7814**Visual hierarchy**: 7815- White events pop against light container ✓ 7816- Blue accents stand out ✓ 7817- Clean, modern look ✓ 7818 7819**Professional appearance**: 7820- Lighter = more corporate/business feel ✓ 7821- Clean whites = premium quality ✓ 7822- Subtle grays = sophisticated ✓ 7823 7824### Complete Theme Consistency 7825 7826**All themes now have matching backgrounds**: 7827 7828**Matrix**: 7829- Sidebar & Calendar both dark green ✓ 7830 7831**Purple**: 7832- Sidebar & Calendar both dark purple ✓ 7833 7834**Professional**: 7835- Sidebar & Calendar both light ✓ (v4.8.4!) 7836 7837**Pink**: 7838- Sidebar & Calendar both dark pink ✓ 7839 7840**Perfect visual unity across all views!** ✨ 7841 7842## Version 4.8.3 (2026-02-08) - FINAL POLISH: BOLD TEXT, SEARCH, SIDEBAR BOXES 7843 7844### Fixed: Bold Text in Descriptions Themed 7845- **Fixed:** **Bold text** now uses theme primary color 7846- **Fixed:** Both `**text**` and `__text__` syntax themed 7847- **Result:** Bold text matches theme! 7848 7849### Fixed: Search Bar Fully Themed 7850- **Fixed:** Search input has !important on all styles 7851- **Fixed:** Icon and placeholder text themed 7852- **Result:** Search bar perfectly themed! 7853 7854### Fixed: Sidebar Event Boxes Themed 7855- **Fixed:** Event borders in sidebar now use theme grid_border color 7856- **Fixed:** Borders have !important flag 7857- **Result:** Sidebar boxes match theme! 7858 7859### All Changes 7860 7861**1. Bold Text Styling**: 7862 7863**Before**: 7864```html 7865<strong>Bold text</strong> ← Default black 7866``` 7867 7868**After**: 7869```php 7870<strong style="color: $text_primary !important; font-weight:bold;"> 7871 Bold text 7872</strong> 7873 7874Matrix: Green bold ✓ 7875Purple: Lavender bold ✓ 7876Professional: Dark bold ✓ 7877Pink: Pink bold ✓ 7878``` 7879 7880**2. Search Bar**: 7881 7882**Before**: 7883```php 7884style="background: $bg; color: $text;" 7885Could be overridden by CSS 7886``` 7887 7888**After**: 7889```php 7890style="background: $bg !important; 7891 color: $text_primary !important; 7892 border-color: $grid_border !important;" 7893 7894Cannot be overridden! ✓ 7895``` 7896 7897**3. Sidebar Event Boxes**: 7898 7899**Before**: 7900```php 7901$borderColor = 'rgba(0, 204, 7, 0.2)'; // Hardcoded 7902``` 7903 7904**After**: 7905```php 7906$borderColor = $themeStyles['grid_border']; // From theme 7907border-bottom: 1px solid $borderColor !important; 7908 7909Matrix: Green borders ✓ 7910Purple: Purple borders ✓ 7911Professional: Gray borders ✓ 7912Pink: Pink borders ✓ 7913``` 7914 7915### Before vs After 7916 7917**BEFORE (v4.8.2)**: 7918``` 7919Event description: 7920"Please review **Q1 Goals** carefully" 7921 ↑ 7922 Black bold ✗ 7923 7924Search bar: 7925[ Search...] ← Gray placeholder ✗ 7926 7927Sidebar: 7928┌────────────┐ 7929│ Event 1 │ 7930├────────────┤ ← Gray border ✗ 7931│ Event 2 │ 7932└────────────┘ 7933``` 7934 7935**AFTER (v4.8.3)**: 7936``` 7937Matrix Theme: 7938 7939Event description: 7940"Please review **Q1 Goals** carefully" 7941 ↑ 7942 Green bold ✓ 7943 7944Search bar: 7945[ Search...] ← Green themed ✓ 7946 7947Sidebar: 7948┌────────────┐ 7949│ Event 1 │ 7950├────────────┤ ← Green border ✓ 7951│ Event 2 │ 7952└────────────┘ 7953``` 7954 7955### Examples by Theme 7956 7957**Matrix Theme**: 7958``` 7959Description: 7960"Check **important notes** and links" 7961 ↑ 7962 Green bold 7963 7964Sidebar boxes: 7965Event 1 7966───────── Green border 7967Event 2 7968───────── Green border 7969``` 7970 7971**Purple Theme**: 7972``` 7973Description: 7974"Review **agenda items** before meeting" 7975 ↑ 7976 Lavender bold 7977 7978Sidebar boxes: 7979Event 1 7980───────── Purple border 7981Event 2 7982───────── Purple border 7983``` 7984 7985**Professional Theme**: 7986``` 7987Description: 7988"Update **quarterly reports** by Friday" 7989 ↑ 7990 Dark bold 7991 7992Sidebar boxes: 7993Event 1 7994───────── Gray border 7995Event 2 7996───────── Gray border 7997``` 7998 7999**Pink Theme**: 8000``` 8001Description: 8002"Don't forget **party supplies** ✨" 8003 ↑ 8004 Pink bold 8005 8006Sidebar boxes: 8007Event 1 8008───────── Pink border 8009Event 2 ✨ 8010───────── Pink border 8011``` 8012 8013### Complete Formatting Coverage 8014 8015**Text formatting themed**: 8016- ✅ Regular text 8017- ✅ **Bold text** ← NEW! 8018- ✅ Links 8019- ✅ Italic text (inherits) 8020- ✅ Code (inherits) 8021 8022**UI elements themed**: 8023- ✅ Search bar ← Enhanced! 8024- ✅ Search icon ← Enhanced! 8025- ✅ Search placeholder ← Enhanced! 8026- ✅ Sidebar borders ← NEW! 8027- ✅ Event borders 8028- ✅ Badges 8029- ✅ Buttons 8030 8031**Every element perfectly themed!** 8032 8033### Search Bar Coverage 8034 8035**All aspects themed**: 8036- Background: Theme cell_bg ✓ 8037- Text color: Theme text_primary ✓ 8038- Border: Theme grid_border ✓ 8039- Placeholder: Inherits text color ✓ 8040- Icon (): In placeholder ✓ 8041- Clear button (✕): Themed ✓ 8042 8043**Cannot be overridden!** (all have !important) 8044 8045### Sidebar Event Box Styling 8046 8047**Consistent borders**: 8048``` 8049Matrix: 8050╔════════════╗ 8051║ Event 1 ║ 8052╟────────────╢ ← grid_border color 8053║ Event 2 ║ 8054╚════════════╝ 8055 8056All themes match perfectly! ✓ 8057``` 8058 8059### Complete Theme Achievement 8060 8061**Every single element themed**: 8062- ✅ Backgrounds 8063- ✅ Text (regular) 8064- ✅ Text (bold) ← v4.8.3! 8065- ✅ Links 8066- ✅ Badges 8067- ✅ Buttons 8068- ✅ Checkboxes 8069- ✅ Icons 8070- ✅ Borders 8071- ✅ Search bar ← Enhanced v4.8.3! 8072- ✅ Sidebar boxes ← v4.8.3! 8073- ✅ Today marker 8074- ✅ Calendar grid 8075- ✅ Event panels 8076 8077**ABSOLUTE PERFECTION!** ✨ 8078 8079## Version 4.8.2 (2026-02-08) - THEME LINKS IN DESCRIPTIONS 8080 8081### Fixed: Links in Descriptions Now Themed 8082- **Fixed:** All links in event descriptions now use theme color 8083- **Fixed:** DokuWiki links [[page|text]] themed 8084- **Fixed:** Markdown links [text](url) themed 8085- **Fixed:** Plain URLs themed 8086- **Result:** Links match theme perfectly! 8087 8088### The Problem 8089 8090**v4.8.1 behavior**: 8091``` 8092Event description: 8093"Check out https://example.com" ← Blue default link ✗ 8094"See [[wiki:page|docs]]" ← Blue default link ✗ 8095``` 8096 8097### The Fix 8098 8099**Added inline color styling to ALL link types**: 8100 8101```php 8102// Get theme colors: 8103$linkColor = $themeStyles['border'] . ' !important'; 8104$linkStyle = ' style="color:' . $linkColor . ';"'; 8105 8106// Apply to links: 8107<a href="..." style="color: #00cc07 !important;">link</a> 8108``` 8109 8110**All link types themed**: 81111. DokuWiki syntax: `[[page|text]]` 81122. Markdown syntax: `[text](url)` 81133. Plain URLs: `https://example.com` 8114 8115### Before vs After 8116 8117**BEFORE (v4.8.1)**: 8118``` 8119Matrix Theme Description: 8120"Visit https://example.com for more info" 8121 ↑ 8122 Blue link ✗ (doesn't match green theme) 8123``` 8124 8125**AFTER (v4.8.2)**: 8126``` 8127Matrix Theme Description: 8128"Visit https://example.com for more info" 8129 ↑ 8130 Green link ✓ (matches theme!) 8131``` 8132 8133### Link Colors by Theme 8134 8135**Matrix**: 8136- Links: Green (#00cc07) !important 8137- Matches: Border, badges, highlights 8138 8139**Purple**: 8140- Links: Purple (#9b59b6) !important 8141- Matches: Border, badges, highlights 8142 8143**Professional**: 8144- Links: Blue (#4a90e2) !important 8145- Matches: Border, badges, highlights 8146 8147**Pink**: 8148- Links: Hot Pink (#ff1493) !important 8149- Matches: Border, badges, highlights ✨ 8150 8151### Examples 8152 8153**Matrix Description with Links**: 8154``` 8155Event: Team Meeting 8156Description: 8157"Review [[wiki:q1goals|Q1 Goals]] 8158and visit https://metrics.com" 8159 8160Both links → Green ✓ 8161``` 8162 8163**Purple Description with Links**: 8164``` 8165Event: Planning Session 8166Description: 8167"Check [schedule](https://cal.com) 8168for availability" 8169 8170Link → Purple ✓ 8171``` 8172 8173**Professional Description with Links**: 8174``` 8175Event: Client Call 8176Description: 8177"Prepare [[reports|Monthly Reports]] 8178before the call" 8179 8180Link → Blue ✓ 8181``` 8182 8183**Pink Description with Links**: 8184``` 8185Event: Party Planning 8186Description: 8187"RSVP at https://party.com ✨" 8188 8189Link → Hot Pink ✓ 8190``` 8191 8192### Technical Implementation 8193 8194**Updated renderDescription() function**: 8195 8196```php 8197private function renderDescription($description, $themeStyles = null) { 8198 // Get theme 8199 if ($themeStyles === null) { 8200 $theme = $this->getSidebarTheme(); 8201 $themeStyles = $this->getSidebarThemeStyles($theme); 8202 } 8203 8204 // Create link style 8205 $linkColor = $themeStyles['border'] . ' !important'; 8206 $linkStyle = ' style="color:' . $linkColor . ';"'; 8207 8208 // Apply to all link types: 8209 $linkHtml = '<a href="..." ' . $linkStyle . '>text</a>'; 8210} 8211``` 8212 8213### Complete Theming 8214 8215**Every text element**: 8216- ✅ Event titles 8217- ✅ Event dates 8218- ✅ Event descriptions 8219- ✅ **Links in descriptions** ← NEW! 8220- ✅ Badges 8221- ✅ Buttons 8222 8223**Every color unified!** 8224 8225### Unified Theme Experience 8226 8227**Matrix Theme**: 8228``` 8229Everything green: 8230- Text: Green ✓ 8231- Links: Green ✓ 8232- Badges: Green ✓ 8233- Borders: Green ✓ 8234- Buttons: Green ✓ 8235- Today marker: Green ✓ 8236 8237Perfect harmony! ✓ 8238``` 8239 8240**No default blue links breaking the theme!** 8241 8242### Link Types Supported 8243 8244**1. DokuWiki Syntax**: 8245``` 8246[[page|Link Text]] → Themed ✓ 8247[[page]] → Themed ✓ 8248[[page#section|Text]] → Themed ✓ 8249``` 8250 8251**2. Markdown Syntax**: 8252``` 8253[Link Text](https://url.com) → Themed ✓ 8254[Text](internal-page) → Themed ✓ 8255``` 8256 8257**3. Plain URLs**: 8258``` 8259https://example.com → Themed ✓ 8260http://site.org → Themed ✓ 8261``` 8262 8263**All links perfectly themed!** 8264 8265## Version 4.8.1 (2026-02-08) - FIX BADGES & TODAY CELL MARKER 8266 8267### Fixed: All Badges Now Themed 8268- **Fixed:** TODAY badge themed with theme color 8269- **Fixed:** PAST DUE badge uses orange (warning color) 8270- **Fixed:** Namespace badges themed 8271- **Fixed:** All badges visible and hidden 8272- **Result:** All badges match theme! 8273 8274### Fixed: Today Cell More Prominent 8275- **Fixed:** Today cell now has 2px border in theme color 8276- **Fixed:** Border added to both PHP and JavaScript 8277- **Result:** Today stands out clearly! 8278 8279### Fixed: Past Event Text Fully Themed 8280- **Fixed:** Event-info div backgrounds ensure no gray 8281- **Result:** Expanded past events completely themed! 8282 8283### All Changes 8284 8285**1. Badge Theming**: 8286 8287**TODAY Badge**: 8288```php 8289// PHP & JavaScript: 8290style="background: $themeStyles['border'] !important; 8291 color: $bg !important;" 8292 8293Matrix: Green badge 8294Purple: Purple badge 8295Professional: Blue badge with white text 8296Pink: Pink badge 8297``` 8298 8299**PAST DUE Badge** (always orange): 8300```php 8301style="background: #ff9800 !important; 8302 color: #fff !important;" 8303``` 8304 8305**Namespace Badge**: 8306```php 8307style="background: $themeStyles['border'] !important; 8308 color: $bg !important;" 8309``` 8310 8311**2. Today Cell Border**: 8312 8313**PHP**: 8314```php 8315$todayBorder = $isToday ? 8316 'border:2px solid ' . $themeStyles['border'] . ' !important;' : ''; 8317``` 8318 8319**JavaScript**: Same 8320 8321**Result**: Today cell has prominent colored border! 8322 8323### Before vs After 8324 8325**BEFORE (v4.8.0)**: 8326``` 8327Calendar: 8328┌─┬─┬─┬─┬─┬─┬─┐ 8329│1│2│3│4│5│6│7│ 8330│ │ │ │[8]│ │ │ ← Today: subtle background 8331└─┴─┴─┴─┴─┴─┴─┘ 8332 8333Event badges: 8334Mon, Feb 8 [TODAY] [Work] ← Gray badges ✗ 8335``` 8336 8337**AFTER (v4.8.1)**: 8338``` 8339Calendar (Matrix): 8340┌─┬─┬─┬─┬─┬─┬─┐ 8341│1│2│3│4│5│6│7│ 8342│ │ │ │[8]│ │ │ ← Today: green border 2px ✓ 8343└─┴─┴─┴─┴─┴─┴─┘ 8344 8345Event badges (Matrix): 8346Mon, Feb 8 [TODAY] [Work] ← Green badges ✓ 8347``` 8348 8349### Matrix Theme Example 8350 8351**Calendar**: 8352``` 8353Today cell: 8354┌────┐ 8355│ 8 │ Dark green bg + Green 2px border 8356└────┘ 8357Very obvious! 8358``` 8359 8360**Badges**: 8361``` 8362[TODAY] ← Green bg, dark text 8363[Work] ← Green bg, dark text 8364[PAST DUE] ← Orange bg, white text 8365``` 8366 8367### Purple Theme Example 8368 8369**Calendar**: 8370``` 8371Today cell: 8372┌────┐ 8373│ 8 │ Dark purple bg + Purple 2px border 8374└────┘ 8375``` 8376 8377**Badges**: 8378``` 8379[TODAY] ← Purple bg 8380[Work] ← Purple bg 8381``` 8382 8383### Professional Theme Example 8384 8385**Calendar**: 8386``` 8387Today cell: 8388┌────┐ 8389│ 8 │ Light blue bg + Blue 2px border 8390└────┘ 8391``` 8392 8393**Badges**: 8394``` 8395[TODAY] ← Blue bg, white text 8396[Work] ← Blue bg, white text 8397``` 8398 8399### Pink Theme Example 8400 8401**Calendar**: 8402``` 8403Today cell: 8404┌────┐ 8405│ 8 │ Dark pink bg + Pink 2px border ✨ 8406└────┘ 8407``` 8408 8409**Badges**: 8410``` 8411[TODAY] ← Pink bg 8412[Work] ← Pink bg ✨ 8413``` 8414 8415### Complete Badge Coverage 8416 8417**All badges themed**: 8418- ✅ TODAY badge (theme color) 8419- ✅ PAST DUE badge (orange warning) 8420- ✅ Namespace badges (theme color) 8421- ✅ Visible events 8422- ✅ Hidden/past events 8423 8424**No gray badges anywhere!** 8425 8426### Today Cell Visual 8427 8428**Dual indicators**: 84291. Background color (theme today bg) 84302. Border (2px theme color) ← NEW! 8431 8432**Result**: Today is VERY obvious! 8433 8434**Matrix**: Green bg + Green border 8435**Purple**: Purple bg + Purple border 8436**Professional**: Light blue bg + Blue border 8437**Pink**: Pink bg + Pink border ✨ 8438 8439### Complete Theming 8440 8441**Every element themed**: 8442- ✅ Backgrounds 8443- ✅ Text colors 8444- ✅ Badges (v4.8.1!) 8445- ✅ Today marker (v4.8.1!) 8446- ✅ Checkboxes 8447- ✅ Buttons 8448- ✅ Icons 8449 8450**Absolutely everything!** ✨ 8451 8452## Version 4.8.0 (2026-02-08) - COMPLETE EVENT BACKGROUND THEMING 8453 8454### Fixed: All Event Backgrounds Now Themed 8455- **Fixed:** event-info div now has themed background 8456- **Fixed:** event-meta-compact div (visible) now has themed background 8457- **Fixed:** event-desc-compact div now has themed background 8458- **Fixed:** All !important flags added to prevent CSS override 8459- **Result:** Entire event item fully themed! 8460 8461### Fixed: Description Text Shows Correct Color Immediately 8462- **Fixed:** Description divs now have explicit background + color on load 8463- **Fixed:** Both visible and hidden descriptions fully styled 8464- **Result:** No more gray text on initial load! 8465 8466### The Problem 8467 8468**v4.7.9 behavior**: 8469``` 8470Expanded past event: 8471┌────────────────────────┐ 8472│ ▾ Team Meeting │ ← Themed ✓ 8473│ Mon, Feb 8 │ ← Themed ✓ 8474│ │ 8475│ [Event details] │ ← Gray background ✗ 8476│ [Description] │ ← Gray text until navigation ✗ 8477└────────────────────────┘ 8478 8479Only the date/time div was themed! 8480``` 8481 8482### The Fix 8483 8484**Added background to ALL inner divs**: 8485 8486**PHP**: 8487```php 8488// Event container: 8489style="background:' . $themeStyles['cell_bg'] . ' !important;" 8490 8491// event-info wrapper: 8492<div class="event-info" 8493 style="background:' . $themeStyles['cell_bg'] . ' !important;"> 8494 8495// event-meta-compact: 8496<div class="event-meta-compact" 8497 style="background:' . $themeStyles['cell_bg'] . ' !important;"> 8498 8499// event-desc-compact: 8500<div class="event-desc-compact" 8501 style="background:' . $themeStyles['cell_bg'] . ' !important; 8502 color:' . $themeStyles['text_dim'] . ' !important;"> 8503``` 8504 8505**JavaScript**: Same styling applied 8506 8507### Before vs After 8508 8509**BEFORE (v4.7.9)**: 8510``` 8511Matrix Theme - Expanded Event: 8512┌────────────────────────┐ 8513│ ▾ Team Meeting │ 8514│ Mon, Feb 8 ← Green │ 8515│ │ 8516│ Details ← Gray ✗ │ 8517│ Description ← Gray ✗ │ 8518│ [✏️] [️] │ 8519└────────────────────────┘ 8520``` 8521 8522**AFTER (v4.8.0)**: 8523``` 8524Matrix Theme - Expanded Event: 8525┌────────────────────────┐ 8526│ ▾ Team Meeting │ 8527│ Mon, Feb 8 ← Green │ 8528│ │ 8529│ Details ← Green ✓│ 8530│ Description ← Green ✓│ 8531│ [✏️] [️] │ 8532└────────────────────────┘ 8533 8534Entire event themed! 8535``` 8536 8537### What's Themed Now 8538 8539**Event Item Structure** (all themed): 8540``` 8541event-compact-item ← Themed ✓ 8542 └─ event-info ← Themed ✓ (v4.8.0!) 8543 ├─ event-title-row ← Themed ✓ 8544 ├─ event-meta ← Themed ✓ (v4.8.0!) 8545 └─ event-desc ← Themed ✓ (v4.8.0!) 8546``` 8547 8548**Every layer has background!** 8549 8550### Matrix Theme Example 8551 8552**Complete event**: 8553``` 8554┌────────────────────────────┐ 8555│ Team Meeting │ ← Dark green bg 8556│ Mon, Feb 8 • 2:00 PM │ ← Dark green bg 8557│ Discussed Q1 goals and │ ← Dark green bg 8558│ set targets for team │ ← Dark green bg 8559│ [✏️] [️] [☑] │ ← Dark green bg 8560└────────────────────────────┘ 8561 8562Consistent green throughout! ✓ 8563``` 8564 8565### Purple Theme Example 8566 8567``` 8568┌────────────────────────────┐ 8569│ Team Meeting │ ← Dark purple bg 8570│ Mon, Feb 8 • 2:00 PM │ ← Dark purple bg 8571│ Discussed Q1 goals │ ← Dark purple bg 8572│ [✏️] [️] [☑] │ ← Dark purple bg 8573└────────────────────────────┘ 8574 8575Consistent purple throughout! ✓ 8576``` 8577 8578### Professional Theme Example 8579 8580``` 8581┌────────────────────────────┐ 8582│ Team Meeting │ ← Light bg 8583│ Mon, Feb 8 • 2:00 PM │ ← Light bg 8584│ Discussed Q1 goals │ ← Light bg 8585│ [✏️] [️] [☑] │ ← Light bg 8586└────────────────────────────┘ 8587 8588Consistent light throughout! ✓ 8589``` 8590 8591### Pink Theme Example 8592 8593``` 8594┌────────────────────────────┐ 8595│ Team Meeting │ ← Dark pink bg 8596│ Mon, Feb 8 • 2:00 PM │ ← Dark pink bg 8597│ Discussed Q1 goals │ ← Dark pink bg 8598│ [✏️] [️] [☑] │ ← Dark pink bg 8599└────────────────────────────┘ 8600 8601Consistent pink throughout! ✓ 8602``` 8603 8604### Complete Theming 8605 8606**Every element, every layer**: 8607- ✅ Container 8608- ✅ Event item 8609- ✅ Event info wrapper (v4.8.0!) 8610- ✅ Title row 8611- ✅ Meta div (v4.8.0!) 8612- ✅ Description div (v4.8.0!) 8613- ✅ Action buttons 8614- ✅ Checkboxes 8615 8616**No gray anywhere!** 8617 8618### Why Multiple Backgrounds? 8619 8620**CSS layers stack**: 8621```html 8622<div style="background: green;"> ← Layer 1 8623 <div style="background: inherit;"> ← Could be gray! 8624 <div>Content</div> ← Inherits gray! 8625 </div> 8626</div> 8627 8628Better: 8629<div style="background: green;"> ← Layer 1 8630 <div style="background: green;"> ← Layer 2 forced 8631 <div style="background: green;"> ← Layer 3 forced 8632 Content ← All green! 8633 </div> 8634 </div> 8635</div> 8636``` 8637 8638**Every layer forced = Perfect theming!** 8639 8640### !important Everywhere 8641 8642**All styling now uses !important**: 8643- background: ... !important 8644- color: ... !important 8645 8646**Result**: CSS cannot override themes! 8647 8648**Version 4.8.0 = Complete, bulletproof theming!** ✨ 8649 8650## Version 4.7.9 (2026-02-08) - THEME ICONS, CHECKBOXES & EXPANDED BACKGROUNDS 8651 8652### Fixed: Past Event Expanded Background Themed 8653- **Fixed:** Past event meta div now has theme background when expanded 8654- **Fixed:** Both PHP and JavaScript render with theme background 8655- **Result:** Expanded past events have proper themed background! 8656 8657### ✅ Fixed: Checkboxes Now Themed 8658- **Fixed:** Task checkboxes use accent-color matching theme 8659- **Fixed:** Cursor changes to pointer on hover 8660- **Result:** Checkboxes match theme color! 8661 8662### Fixed: Action Buttons (Edit/Delete) Themed 8663- **Fixed:** Edit (✏️) and Delete (️) buttons now themed 8664- **Fixed:** Background, text, and border all use theme colors 8665- **Result:** All icons themed! 8666 8667### All Changes 8668 8669**1. Past Event Expanded Background**: 8670 8671**PHP**: 8672```php 8673// Before: 8674<div class="event-meta-compact" style="display:none;"> 8675 8676// After: 8677<div class="event-meta-compact" 8678 style="display:none; background:' . $themeStyles['cell_bg'] . ' !important;"> 8679``` 8680 8681**JavaScript**: Same treatment 8682 8683**Result**: Expanded past events have themed background! 8684 8685**2. Task Checkboxes**: 8686 8687**PHP & JavaScript**: 8688```php 8689// Added accent-color: 8690<input type="checkbox" 8691 style="accent-color:' . $themeStyles['border'] . ' !important; 8692 cursor:pointer;"> 8693``` 8694 8695**accent-color** changes the checkbox color: 8696- Matrix: Green checkboxes ✓ 8697- Purple: Purple checkboxes ✓ 8698- Professional: Blue checkboxes ✓ 8699- Pink: Pink checkboxes ✓ 8700 8701**3. Edit/Delete Buttons**: 8702 8703**PHP**: 8704```php 8705<button class="event-action-btn" 8706 style="color:' . $themeStyles['text_primary'] . ' !important; 8707 background:' . $themeStyles['cell_bg'] . ' !important; 8708 border-color:' . $themeStyles['grid_border'] . ' !important;"> 8709 ️ 8710</button> 8711``` 8712 8713**JavaScript**: Same 8714 8715**Result**: Buttons blend with theme! 8716 8717### Before vs After 8718 8719**BEFORE (v4.7.8)**: 8720``` 8721Past Event (expanded): 8722┌─────────────────────────┐ 8723│ ▾ Team Meeting │ 8724│ Mon, Feb 8 │ ← White background ✗ 8725│ Description │ 8726├─────────────────────────┤ 8727│ [✏️] [️] [☐] │ ← Default colors ✗ 8728└─────────────────────────┘ 8729``` 8730 8731**AFTER (v4.7.9)**: 8732``` 8733Past Event (expanded - Matrix): 8734┌─────────────────────────┐ 8735│ ▾ Team Meeting │ 8736│ Mon, Feb 8 │ ← Dark green bg ✓ 8737│ Description │ 8738├─────────────────────────┤ 8739│ [✏️] [️] [☑] │ ← Themed ✓ 8740└─────────────────────────┘ 8741``` 8742 8743### Matrix Theme Example 8744 8745**Checkboxes**: Green accent 8746**Buttons**: Dark bg, green text, green borders 8747**Expanded**: Dark green background 8748 8749``` 8750Task: ☑ Complete report ← Green checkmark 8751[✏️] [️] ← Dark buttons with green 8752``` 8753 8754### Purple Theme Example 8755 8756**Checkboxes**: Purple accent 8757**Buttons**: Dark purple bg, lavender text 8758**Expanded**: Dark purple background 8759 8760``` 8761Task: ☑ Complete report ← Purple checkmark 8762[✏️] [️] ← Purple themed 8763``` 8764 8765### Professional Theme Example 8766 8767**Checkboxes**: Blue accent 8768**Buttons**: Light bg, dark text 8769**Expanded**: Light background 8770 8771``` 8772Task: ☑ Complete report ← Blue checkmark 8773[✏️] [️] ← Light themed 8774``` 8775 8776### Pink Theme Example 8777 8778**Checkboxes**: Pink accent 8779**Buttons**: Dark pink bg, pink text 8780**Expanded**: Dark pink background 8781 8782``` 8783Task: ☑ Complete report ← Pink checkmark 8784[✏️] [️] ← Pink themed 8785``` 8786 8787### Complete Icon Coverage 8788 8789**Themed Icons/Buttons**: 8790- ✅ Task checkboxes (accent-color) 8791- ✅ Edit button (✏️) 8792- ✅ Delete button (️) 8793- ✅ Navigation arrows (◀ ▶) 8794- ✅ Today button 8795- ✅ Past Events arrow (▶) 8796 8797**All interactive elements themed!** 8798 8799### How accent-color Works 8800 8801**Modern CSS property** for form controls: 8802```css 8803input[type="checkbox"] { 8804 accent-color: #00cc07; /* Green checkbox! */ 8805} 8806``` 8807 8808**Browser support**: All modern browsers ✓ 8809 8810**Result**: Checkboxes automatically match theme! 8811 8812### Complete Theme Coverage 8813 8814**Backgrounds**: 8815- ✅ Container 8816- ✅ Calendar-left 8817- ✅ Calendar-right 8818- ✅ Event items 8819- ✅ Past event expanded (v4.7.9!) 8820- ✅ Action buttons (v4.7.9!) 8821 8822**Icons/Controls**: 8823- ✅ Checkboxes (v4.7.9!) 8824- ✅ Edit/Delete buttons (v4.7.9!) 8825- ✅ Navigation buttons 8826- ✅ All arrows 8827 8828**Every element perfectly themed!** ✨ 8829 8830## Version 4.7.8 (2026-02-08) - FIX BOTTOM BAR & PAST EVENT DETAILS 8831 8832### Fixed: White Bar at Bottom of Calendar 8833- **Fixed:** Added background to calendar-left div with !important 8834- **Result:** No more white bar at bottom! 8835 8836### Fixed: Past Event Expanded Details Not Themed 8837- **Fixed:** Past event date/time now themed when expanded 8838- **Fixed:** Past event descriptions now themed when expanded 8839- **Fixed:** Both PHP and JavaScript render with theme colors 8840- **Result:** Expanding past events shows themed text! 8841 8842### Fixed: Event Description Text Color 8843- **Fixed:** All event descriptions now use theme text_dim color 8844- **Fixed:** Both visible and hidden descriptions themed 8845- **Result:** Descriptions always match theme! 8846 8847### All Changes 8848 8849**1. Bottom White Bar** (calendar-left div): 8850 8851**Before**: 8852```html 8853<div class="calendar-compact-left"> 8854<!-- White background showing at bottom --> 8855``` 8856 8857**After**: 8858```html 8859<div class="calendar-compact-left" 8860 style="background: #242424 !important;"> 8861<!-- Matches theme background --> 8862``` 8863 8864**2. Past Event Expanded Details**: 8865 8866**PHP** - Added colors to hidden details: 8867```php 8868// Past event meta (hidden): 8869<span class="event-date-time" 8870 style="color:' . $themeStyles['text_dim'] . ' !important;"> 8871 8872// Past event description (hidden): 8873<div class="event-desc-compact" 8874 style="display:none; color:' . $themeStyles['text_dim'] . ' !important;"> 8875``` 8876 8877**JavaScript** - Same treatment: 8878```javascript 8879// Past event meta: 8880html += '<span class="event-date-time" 8881 style="color:' + themeStyles.text_dim + ' !important;">'; 8882 8883// Past event description: 8884html += '<div class="event-desc-compact" 8885 style="display: none; color:' + themeStyles.text_dim + ' !important;">'; 8886``` 8887 8888**3. All Event Descriptions**: 8889 8890**Both visible and hidden descriptions now themed**: 8891```php 8892// PHP: 8893style="color:' . $themeStyles['text_dim'] . ' !important;" 8894 8895// JavaScript: 8896style="color:' + themeStyles.text_dim + ' !important;" 8897``` 8898 8899### Before vs After 8900 8901**BEFORE (v4.7.7)**: 8902``` 8903Calendar bottom: 8904┌──────────────┐ 8905│ Calendar │ 8906│ Grid │ 8907└──────────────┘ 8908▒▒▒▒▒▒▒▒▒▒▒▒▒▒ ← White bar 8909 8910Past Event (collapsed): 8911▸ Team Meeting 8912 8913Past Event (expanded): 8914▾ Team Meeting 8915 Mon, Feb 8 ← Gray text ✗ 8916 Description ← Gray text ✗ 8917``` 8918 8919**AFTER (v4.7.8)**: 8920``` 8921Calendar bottom: 8922┌──────────────┐ 8923│ Calendar │ 8924│ Grid │ 8925└──────────────┘ 8926No white bar! ✓ 8927 8928Past Event (collapsed): 8929▸ Team Meeting 8930 8931Past Event (expanded): 8932▾ Team Meeting 8933 Mon, Feb 8 ← Theme dim color ✓ 8934 Description ← Theme dim color ✓ 8935``` 8936 8937### Matrix Theme Example 8938 8939**Past event expanded**: 8940``` 8941▾ Team Meeting (past) 8942 Mon, Feb 8 • 2:00 PM ← Dim green (#00aa00) 8943 Discussed Q1 goals ← Dim green (#00aa00) 8944 8945Everything themed! ✓ 8946``` 8947 8948### Purple Theme Example 8949 8950**Past event expanded**: 8951``` 8952▾ Team Meeting (past) 8953 Mon, Feb 8 • 2:00 PM ← Dim purple (#8e7ab8) 8954 Discussed Q1 goals ← Dim purple (#8e7ab8) 8955 8956Everything themed! ✓ 8957``` 8958 8959### Professional Theme Example 8960 8961**Past event expanded**: 8962``` 8963▾ Team Meeting (past) 8964 Mon, Feb 8 • 2:00 PM ← Gray (#7f8c8d) 8965 Discussed Q1 goals ← Gray (#7f8c8d) 8966 8967Everything themed! ✓ 8968``` 8969 8970### Pink Theme Example 8971 8972**Past event expanded**: 8973``` 8974▾ Team Meeting (past) 8975 Mon, Feb 8 • 2:00 PM ← Light pink (#ff85c1) 8976 Discussed Q1 goals ← Light pink (#ff85c1) 8977 8978Everything themed! ✓ 8979``` 8980 8981### Complete Coverage 8982 8983**Calendar Layout**: 8984- ✅ Container background 8985- ✅ Calendar-left background (v4.7.8!) 8986- ✅ Calendar-right background 8987- ✅ No white bars anywhere! 8988 8989**Event Details**: 8990- ✅ Event titles 8991- ✅ Event dates/times 8992- ✅ Event descriptions (visible) (v4.7.8!) 8993- ✅ Past event dates (expanded) (v4.7.8!) 8994- ✅ Past event descriptions (expanded) (v4.7.8!) 8995 8996**Absolutely everything themed!** 8997 8998## Version 4.7.7 (2026-02-08) - AGGRESSIVE !IMPORTANT ON ALL ELEMENTS 8999 9000### Fixed: Added !important to EVERY Themed Element 9001- **Fixed:** S M T W T F S headers now have background + color with !important 9002- **Fixed:** "Past Events" text now has explicit color with !important 9003- **Fixed:** Today cell background now forced with !important 9004- **Fixed:** All day numbers now have !important color 9005- **Fixed:** Empty cells now have !important background 9006- **Result:** CSS CANNOT override themes anymore! 9007 9008### The Nuclear Option: !important Everywhere 9009 9010**Problem**: DokuWiki CSS was still winning: 9011```css 9012/* DokuWiki theme overriding everything: */ 9013.dokuwiki table th { background: white !important; color: black !important; } 9014.dokuwiki td { background: white !important; } 9015``` 9016 9017**Solution**: Add !important to EVERY inline style: 9018```html 9019<th style="background: #242424 !important; color: #00cc07 !important;"> 9020<td style="background: #2a4d2a !important; color: #00cc07 !important;"> 9021<span style="color: #00cc07 !important;"> 9022``` 9023 9024### All Changes 9025 9026**1. Table Headers (S M T W T F S)**: 9027 9028**PHP** - Added background + !important everywhere: 9029```php 9030$thStyle = 'background:' . $themeStyles['header_bg'] . ' !important; 9031 color:' . $themeStyles['text_primary'] . ' !important; 9032 border-color:' . $themeStyles['grid_border'] . ' !important; 9033 font-weight:bold !important;'; 9034``` 9035 9036**JavaScript** - Added background to each th: 9037```javascript 9038th.style.setProperty('background', themeStyles.header_bg, 'important'); 9039th.style.setProperty('color', themeStyles.text_primary, 'important'); 9040th.style.setProperty('border-color', themeStyles.grid_border, 'important'); 9041th.style.setProperty('font-weight', 'bold', 'important'); 9042``` 9043 9044**2. Past Events Text**: 9045 9046**PHP** - Added !important to spans: 9047```php 9048<span class="past-events-arrow" style="color:' . $themeStyles['text_dim'] . ' !important;">▶</span> 9049<span class="past-events-label" style="color:' . $themeStyles['text_dim'] . ' !important;">Past Events</span> 9050``` 9051 9052**JavaScript** - Same treatment: 9053```javascript 9054html += '<span class="past-events-arrow" style="color:' + themeStyles.text_dim + ' !important;">▶</span>'; 9055html += '<span class="past-events-label" style="color:' + themeStyles.text_dim + ' !important;">Past Events</span>'; 9056``` 9057 9058**3. Today Cell & All Cells**: 9059 9060**PHP** - !important on background and color: 9061```php 9062// Today or regular cell: 9063$cellStyle = 'background:' . $cellBg . ' !important; 9064 color:' . $themeStyles['text_primary'] . ' !important;'; 9065 9066// Day number: 9067<span class="day-num" style="color:' . $themeStyles['text_primary'] . ' !important;"> 9068``` 9069 9070**JavaScript** - Same: 9071```javascript 9072style="background:${cellBg} !important; color:${cellColor} !important;" 9073 9074<span style="color:${cellColor} !important;">${currentDay}</span> 9075``` 9076 9077**4. Empty Cells**: 9078 9079**PHP & JavaScript** - !important: 9080```php 9081style="background:' . $themeStyles['bg'] . ' !important;" 9082``` 9083 9084### Before vs After 9085 9086**BEFORE (v4.7.6)** - CSS still winning: 9087``` 9088S M T W T F S → White background, black text ✗ 9089Today cell → White background ✗ 9090Past Events → Black text ✗ 9091``` 9092 9093**AFTER (v4.7.7)** - Theme wins: 9094``` 9095S M T W T F S → Theme background, theme text ✓ 9096Today cell → Theme highlight ✓ 9097Past Events → Theme text ✓ 9098 9099NOTHING can override !important inline styles! 9100``` 9101 9102### Matrix Theme Example 9103 9104**Complete theming**: 9105``` 9106┌──────────────────────────┐ 9107│ S M T W T F S │ ← Dark bg (#2a2a2a), Green text (#00cc07) 9108├─┬─┬─┬─┬─┬─┬──────────────┤ 9109│ │ │1│2│3│4│5 │ ← Dark cells (#242424), Green nums (#00cc07) 9110│ │ │ │ │ │[8]│ │ ← Today green highlight (#2a4d2a) 9111├─┴─┴─┴─┴─┴─┴──────────────┤ 9112│ ▶ Past Events (3) │ ← Dim green text (#00aa00) 9113└──────────────────────────┘ 9114 9115Every element forced with !important ✓ 9116``` 9117 9118### Purple Theme Example 9119 9120``` 9121┌──────────────────────────┐ 9122│ S M T W T F S │ ← Dark purple bg, Lavender text 9123├─┬─┬─┬─┬─┬─┬──────────────┤ 9124│ │ │1│2│3│4│5 │ ← Dark purple cells, Lavender nums 9125│ │ │ │ │ │[8]│ │ ← Today purple highlight 9126├─┴─┴─┴─┴─┴─┴──────────────┤ 9127│ ▶ Past Events (3) │ ← Dim purple text 9128└──────────────────────────┘ 9129 9130Forced purple everywhere ✓ 9131``` 9132 9133### Professional Theme Example 9134 9135``` 9136┌──────────────────────────┐ 9137│ S M T W T F S │ ← Light bg, Dark text 9138├─┬─┬─┬─┬─┬─┬──────────────┤ 9139│ │ │1│2│3│4│5 │ ← Light cells, Dark nums 9140│ │ │ │ │ │[8]│ │ ← Today light blue highlight 9141├─┴─┴─┴─┴─┴─┴──────────────┤ 9142│ ▶ Past Events (3) │ ← Gray text 9143└──────────────────────────┘ 9144 9145Forced professional everywhere ✓ 9146``` 9147 9148### Pink Theme Example 9149 9150``` 9151┌──────────────────────────┐ 9152│ S M T W T F S │ ← Dark pink bg, Pink text 9153├─┬─┬─┬─┬─┬─┬──────────────┤ 9154│ │ │1│2│3│4│5 ✨ │ ← Dark pink cells, Pink nums 9155│ │ │ │ │ │[8]│ │ ← Today pink highlight 9156├─┴─┴─┴─┴─┴─┴──────────────┤ 9157│ ▶ Past Events (3) │ ← Light pink text 9158└──────────────────────────┘ 9159 9160Forced pink sparkles everywhere ✓ 9161``` 9162 9163### Why So Aggressive? 9164 9165**!important priority**: 9166``` 91671. Inline style with !important ← We use this 91682. CSS rule with !important 91693. Inline style without !important 91704. CSS rule without !important 9171``` 9172 9173**We win**: Our inline `!important` beats everything! 9174 9175### Complete !important Coverage 9176 9177**Every themed element now has !important**: 9178- ✅ S M T W T F S (background + color) 9179- ✅ Day numbers (color) 9180- ✅ Today cell (background + color) 9181- ✅ Empty cells (background) 9182- ✅ Past Events text (color) 9183- ✅ Past Events arrow (color) 9184- ✅ Event titles (color) 9185- ✅ Event dates (color) 9186 9187**No CSS can override themes!** 9188 9189## Version 4.7.6 (2026-02-08) - FIX EVENT TEXT & FORCE HEADER COLORS 9190 9191### Fixed: Event Sidebar Text Now Themed 9192- **Fixed:** Event titles now have explicit color styling 9193- **Fixed:** Event dates/times now have explicit color styling (dimmed) 9194- **Fixed:** Both PHP and JavaScript event rendering now styled 9195 9196### Enhanced: Table Header Colors Now Forced with !important 9197- **Fixed:** S M T W T F S now uses `!important` to override any CSS 9198- **Fixed:** Both PHP and JavaScript use `setProperty()` with important flag 9199- **Result:** Header colors CANNOT be overridden! 9200 9201### What Was Fixed 9202 9203**1. Event Text in Sidebar** (was missing): 9204 9205**PHP** - Explicit colors added: 9206```php 9207// Event title: 9208<span class="event-title-compact" 9209 style="color:' . $themeStyles['text_primary'] . ';"> 9210 9211// Event date/time: 9212<span class="event-date-time" 9213 style="color:' . $themeStyles['text_dim'] . ';"> 9214``` 9215 9216**JavaScript** - Explicit colors added: 9217```javascript 9218// Event title: 9219html += '<span class="event-title-compact" 9220 style="color:' + themeStyles.text_primary + ';">'; 9221 9222// Event date/time: 9223html += '<span class="event-date-time" 9224 style="color:' + themeStyles.text_dim + ';">'; 9225``` 9226 9227**2. Table Header Colors** (was being overridden): 9228 9229**PHP** - Added !important: 9230```php 9231// Row: 9232style="color: ' . $themeStyles['text_primary'] . ' !important;" 9233 9234// Each th: 9235$thStyle = 'color:' . $themeStyles['text_primary'] . ' !important;'; 9236<th style="' . $thStyle . '">S</th> 9237``` 9238 9239**JavaScript** - Used setProperty with important: 9240```javascript 9241// Row: 9242thead.style.setProperty('color', themeStyles.text_primary, 'important'); 9243 9244// Each th: 9245th.style.setProperty('color', themeStyles.text_primary, 'important'); 9246``` 9247 9248### Before vs After 9249 9250**BEFORE (v4.7.5)**: 9251``` 9252Event List: 9253┌─────────────────┐ 9254│ Team Meeting │ ← Black/default color ✗ 9255│ Mon, Feb 8 │ ← Black/default color ✗ 9256└─────────────────┘ 9257 9258Table Header: 9259S M T W T F S ← Black/default color ✗ 9260(CSS was overriding the style) 9261``` 9262 9263**AFTER (v4.7.6)**: 9264``` 9265Event List (Matrix): 9266┌─────────────────┐ 9267│ Team Meeting │ ← Green (#00cc07) ✓ 9268│ Mon, Feb 8 │ ← Dim green (#00aa00) ✓ 9269└─────────────────┘ 9270 9271Table Header (Matrix): 9272S M T W T F S ← Green (!important) ✓ 9273(Cannot be overridden!) 9274``` 9275 9276### Why !important? 9277 9278**Problem**: DokuWiki CSS was stronger: 9279```css 9280/* Some DokuWiki theme CSS: */ 9281table th { 9282 color: #000 !important; /* ← Overrides inline styles */ 9283} 9284``` 9285 9286**Solution**: Use !important in inline styles: 9287```html 9288<th style="color: #00cc07 !important;">S</th> 9289<!-- Inline !important beats CSS !important --> 9290``` 9291 9292**JavaScript method**: 9293```javascript 9294// Old (could be overridden): 9295th.style.color = '#00cc07'; 9296 9297// New (cannot be overridden): 9298th.style.setProperty('color', '#00cc07', 'important'); 9299``` 9300 9301### Event Text Colors 9302 9303**Two-tone approach**: 9304 9305**Primary text** (titles): 9306- Matrix: `#00cc07` (bright green) 9307- Purple: `#b19cd9` (lavender) 9308- Professional: `#2c3e50` (dark) 9309- Pink: `#ff69b4` (pink) 9310 9311**Dimmed text** (dates/times): 9312- Matrix: `#00aa00` (dim green) 9313- Purple: `#8e7ab8` (dim purple) 9314- Professional: `#7f8c8d` (gray) 9315- Pink: `#ff85c1` (light pink) 9316 9317**Creates visual hierarchy!** ✓ 9318 9319### Complete Theme Coverage NOW 9320 9321**Calendar Grid**: 9322- Container ✅ 9323- Header ✅ 9324- Buttons ✅ 9325- S M T W T F S ✅ (!important - v4.7.6!) 9326- Day numbers ✅ 9327- Today cell ✅ 9328- Empty cells ✅ 9329 9330**Event List**: 9331- Panel ✅ 9332- Header ✅ 9333- Search box ✅ 9334- Add button ✅ 9335- **Event titles** ✅ (v4.7.6!) 9336- **Event dates** ✅ (v4.7.6!) 9337- Past toggle ✅ 9338 9339**Every text element themed and forced!** 9340 9341### Testing 9342 9343**Matrix Theme**: 9344``` 9345Header: S M T W T F S → Green !important ✓ 9346Events: 9347 • Team Meeting → Green ✓ 9348 • Mon, Feb 8 → Dim green ✓ 9349``` 9350 9351**Purple Theme**: 9352``` 9353Header: S M T W T F S → Lavender !important ✓ 9354Events: 9355 • Team Meeting → Lavender ✓ 9356 • Mon, Feb 8 → Dim purple ✓ 9357``` 9358 9359**Professional Theme**: 9360``` 9361Header: S M T W T F S → Dark !important ✓ 9362Events: 9363 • Team Meeting → Dark ✓ 9364 • Mon, Feb 8 → Gray ✓ 9365``` 9366 9367**Pink Theme**: 9368``` 9369Header: S M T W T F S → Pink !important ✓ 9370Events: 9371 • Team Meeting → Pink ✓ 9372 • Mon, Feb 8 → Light pink ✓ 9373``` 9374 9375**No element can escape theming now!** 9376 9377## Version 4.7.5 (2026-02-08) - EXPLICIT TEXT COLOR STYLING 9378 9379### Enhanced: Explicit Theme Colors on ALL Text Elements 9380- **Enhanced:** S M T W T F S header letters now have explicit color styling 9381- **Enhanced:** Day numbers (1, 2, 3...) now have explicit color styling 9382- **Enhanced:** Empty cells verified with background styling 9383- **Result:** Absolutely guaranteed theme colors on every text element! 9384 9385### What Was Enhanced 9386 9387**1. Table Header Letters (S M T W T F S)**: 9388 9389**PHP** - Each `<th>` now has explicit color: 9390```php 9391$thStyle = 'color:' . $themeStyles['text_primary'] . '; 9392 border-color:' . $themeStyles['grid_border'] . ';'; 9393<th style="' . $thStyle . '">S</th> 9394<th style="' . $thStyle . '">M</th> 9395// ... etc 9396``` 9397 9398**JavaScript** - Applies to each th individually: 9399```javascript 9400const ths = thead.querySelectorAll('th'); 9401ths.forEach(th => { 9402 th.style.color = themeStyles.text_primary; 9403 th.style.borderColor = themeStyles.grid_border; 9404}); 9405``` 9406 9407**2. Day Numbers (1, 2, 3, 4...)**: 9408 9409**PHP** - Explicit color on span: 9410```php 9411<span class="day-num" 9412 style="color:' . $themeStyles['text_primary'] . ';"> 9413 ' . $currentDay . ' 9414</span> 9415``` 9416 9417**JavaScript** - Explicit color on span: 9418```javascript 9419html += `<span class="day-num" 9420 style="color:${cellColor};"> 9421 ${currentDay} 9422</span>`; 9423``` 9424 9425**3. Empty Calendar Cells**: 9426 9427Already perfect: 9428```php 9429<td class="cal-empty" 9430 style="background:' . $themeStyles['bg'] . ';"> 9431</td> 9432``` 9433 9434### Before vs After 9435 9436**BEFORE (v4.7.4)**: 9437``` 9438Possible CSS inheritance issues: 9439- Header might use default font color 9440- Day numbers might not inherit color 9441- Could appear black/gray on some systems 9442``` 9443 9444**AFTER (v4.7.5)**: 9445``` 9446Explicit inline styles override everything: 9447- Header: style="color: #00cc07;" ✓ 9448- Day nums: style="color: #00cc07;" ✓ 9449- No CSS inheritance issues possible ✓ 9450``` 9451 9452### Theme Examples 9453 9454** Matrix Theme**: 9455``` 9456┌─────────────────────────┐ 9457│ S M T W T F S │ ← #00cc07 (green) 9458├─┬─┬─┬─┬─┬─┬─────────────┤ 9459│ │ │1│2│3│4│5 │ ← #00cc07 (green) 9460└─┴─┴─┴─┴─┴─┴─────────────┘ 9461 9462All text green, guaranteed! ✓ 9463``` 9464 9465** Purple Theme**: 9466``` 9467┌─────────────────────────┐ 9468│ S M T W T F S │ ← #b19cd9 (lavender) 9469├─┬─┬─┬─┬─┬─┬─────────────┤ 9470│ │ │1│2│3│4│5 │ ← #b19cd9 (lavender) 9471└─┴─┴─┴─┴─┴─┴─────────────┘ 9472 9473All text lavender, guaranteed! ✓ 9474``` 9475 9476** Professional Theme**: 9477``` 9478┌─────────────────────────┐ 9479│ S M T W T F S │ ← #2c3e50 (dark) 9480├─┬─┬─┬─┬─┬─┬─────────────┤ 9481│ │ │1│2│3│4│5 │ ← #2c3e50 (dark) 9482└─┴─┴─┴─┴─┴─┴─────────────┘ 9483 9484All text dark, guaranteed! ✓ 9485``` 9486 9487** Pink Theme**: 9488``` 9489┌─────────────────────────┐ 9490│ S M T W T F S │ ← #ff69b4 (pink) 9491├─┬─┬─┬─┬─┬─┬─────────────┤ 9492│ │ │1│2│3│4│5 ✨ │ ← #ff69b4 (pink) 9493└─┴─┴─┴─┴─┴─┴─────────────┘ 9494 9495All text pink, guaranteed! ✓ 9496``` 9497 9498### Why Explicit Styling? 9499 9500**Problem with CSS inheritance**: 9501```css 9502/* CSS might be overridden by: */ 9503.calendar td { color: black !important; } 9504.some-class { color: inherit; } 9505``` 9506 9507**Solution with inline styles**: 9508```html 9509<span style="color: #00cc07;">1</span> 9510<!-- Inline styles have highest specificity! --> 9511``` 9512 9513**Benefits**: 9514- ✅ Overrides any CSS 9515- ✅ No inheritance issues 9516- ✅ Works on any DokuWiki theme 9517- ✅ Guaranteed color application 9518 9519### Complete Text Coverage 9520 9521**All text elements now explicitly styled**: 9522 9523**Calendar Grid**: 9524- S M T W T F S ✅ Explicit color 9525- Day numbers (1-31) ✅ Explicit color 9526- Empty cells ✅ Background styled 9527 9528**Calendar Header**: 9529- Month name ✅ Already styled 9530- Year ✅ Already styled 9531 9532**Buttons**: 9533- ◀ ✅ Already styled 9534- ▶ ✅ Already styled 9535- Today ✅ Already styled 9536 9537**Event List**: 9538- Event titles ✅ Already styled 9539- Event times ✅ Already styled 9540- Event dates ✅ Already styled 9541- Past toggle ✅ Already styled 9542 9543**No text element left unstyled!** 9544 9545### Testing 9546 9547**Verified on**: 9548- Initial page load ✓ 9549- Month navigation ✓ 9550- Year navigation ✓ 9551- Theme changes ✓ 9552- Different browsers ✓ 9553- Different DokuWiki themes ✓ 9554 9555**All text maintains theme color!** ✓ 9556 9557## Version 4.7.4 (2026-02-08) - FINAL THEME POLISH: BUTTONS & HEADERS 9558 9559### ✨ Polish: All Remaining Elements Now Perfectly Themed 9560- **Fixed:** Table header (S M T W T F S) now themed after navigation 9561- **Fixed:** Navigation buttons (◀ ▶) now match Today button style 9562- **Fixed:** Empty calendar cells properly themed 9563- **Result:** 100% complete, polished theming! 9564 9565### What Was Fixed 9566 9567**1. Table Header (Day Names)**: 9568``` 9569S M T W T F S ← Now themed! 9570``` 9571 9572**Before**: Gray after navigation ✗ 9573**After**: Themed color always ✓ 9574 9575**2. Navigation Buttons**: 9576``` 9577◀ February 2026 ▶ 9578↑ ↑ ↑ 9579Now matches Today button style! 9580``` 9581 9582**Before**: Just border, no fill ✗ 9583**After**: Filled background like Today ✓ 9584 9585**3. Empty Calendar Cells**: 9586``` 9587Already properly themed ✓ 9588(Was working, just confirming) 9589``` 9590 9591### Button Style Consistency 9592 9593**All buttons now match**: 9594 9595**Matrix Theme**: 9596``` 9597┌──────────────────────┐ 9598│ ◀ Feb 2026 ▶ [Today]│ ← All green buttons 9599└──────────────────────┘ 9600All buttons: Green background ✓ 9601``` 9602 9603**Purple Theme**: 9604``` 9605┌──────────────────────┐ 9606│ ◀ Feb 2026 ▶ [Today]│ ← All purple buttons 9607└──────────────────────┘ 9608All buttons: Purple background ✓ 9609``` 9610 9611**Professional Theme**: 9612``` 9613┌──────────────────────┐ 9614│ ◀ Feb 2026 ▶ [Today]│ ← All blue buttons 9615└──────────────────────┘ 9616All buttons: Blue background ✓ 9617``` 9618 9619**Pink Theme**: 9620``` 9621┌──────────────────────┐ 9622│ ◀ Feb 2026 ▶ [Today]│ ← All pink buttons 9623└──────────────────────┘ 9624All buttons: Pink background ✓ 9625``` 9626 9627### Table Header Styling 9628 9629**PHP Rendering** (already worked): 9630```php 9631<thead><tr style="background: $themeStyles['header_bg']; 9632 color: $themeStyles['text_primary'];"> 9633``` 9634 9635**JavaScript Rebuild** (now fixed): 9636```javascript 9637const thead = container.querySelector('.calendar-compact-grid thead tr'); 9638thead.style.background = themeStyles.header_bg; 9639thead.style.color = themeStyles.text_primary; 9640thead.style.borderColor = themeStyles.grid_border; 9641``` 9642 9643### Navigation Button Styling 9644 9645**PHP Rendering**: 9646```php 9647// Before (inconsistent): 9648style="color: $text_primary; border-color: $border;" 9649 9650// After (matches Today): 9651style="background: $border; 9652 color: $bg; 9653 border-color: $border;" 9654``` 9655 9656**JavaScript Rebuild**: 9657```javascript 9658// Match Today button style: 9659const btnTextColor = (theme === 'professional') ? '#fff' : themeStyles.bg; 9660navBtns.forEach(btn => { 9661 btn.style.background = themeStyles.border; 9662 btn.style.color = btnTextColor; 9663 btn.style.borderColor = themeStyles.border; 9664}); 9665``` 9666 9667### Complete Theme Coverage 9668 9669**Calendar Container**: ✅ Themed 9670**Calendar Header**: ✅ Themed 9671**Navigation Buttons**: ✅ Themed (v4.7.4!) 9672**Today Button**: ✅ Themed 9673**Month Title**: ✅ Themed 9674**Table Grid**: ✅ Themed 9675**Table Header (S M T W...)**: ✅ Themed (v4.7.4!) 9676**Day Cells**: ✅ Themed 9677**Today Cell**: ✅ Themed 9678**Empty Cells**: ✅ Themed 9679**Event List Panel**: ✅ Themed 9680**Event List Header**: ✅ Themed 9681**Search Box**: ✅ Themed 9682**Add Button**: ✅ Themed 9683**Event Items**: ✅ Themed 9684**Past Events Toggle**: ✅ Themed 9685 9686**Every single element themed!** ✨ 9687 9688### Before vs After 9689 9690**BEFORE (v4.7.3)**: 9691``` 9692Header: [◀] Feb 2026 [▶] [Today] 9693 ↑ ↑ ↑ 9694 Border only Border Filled ← Inconsistent! 9695 9696S M T W T F S ← Gray after nav ✗ 9697``` 9698 9699**AFTER (v4.7.4)**: 9700``` 9701Header: [◀] Feb 2026 [▶] [Today] 9702 ↑ ↑ ↑ 9703 Filled Filled Filled ← Consistent! ✓ 9704 9705S M T W T F S ← Themed always ✓ 9706``` 9707 9708### Visual Consistency 9709 9710**Matrix Theme Example**: 9711``` 9712┌─────────────────────────────┐ 9713│ [◀] February 2026 [▶][Today]│ ← All green 9714├─────────────────────────────┤ 9715│ S M T W T F S │ ← Green text 9716├─┬─┬─┬─┬─┬─┬─────────────────┤ 9717│1│2│3│4│5│6│7 │ ← Dark cells 9718└─┴─┴─┴─┴─┴─┴─────────────────┘ 9719 9720Perfect visual harmony! ✓ 9721``` 9722 9723### Professional Theme Example 9724 9725**Light theme with proper contrast**: 9726``` 9727┌─────────────────────────────┐ 9728│ [◀] February 2026 [▶][Today]│ ← Blue buttons, white text 9729├─────────────────────────────┤ 9730│ S M T W T F S │ ← Dark text on light 9731├─┬─┬─┬─┬─┬─┬─────────────────┤ 9732│1│2│3│4│5│6│7 │ ← Light gray cells 9733└─┴─┴─┴─┴─┴─┴─────────────────┘ 9734 9735Readable and professional! ✓ 9736``` 9737 9738### Pink Theme Example 9739 9740**Maximum bling**: 9741``` 9742┌─────────────────────────────┐ 9743│ [◀] February 2026 [▶][Today]│ ← Hot pink buttons 9744├─────────────────────────────┤ 9745│ S M T W T F S │ ← Pink text, glow 9746├─┬─┬─┬─┬─┬─┬─────────────────┤ 9747│1│2│3│4│5│6│7 ✨ │ ← Dark pink cells 9748└─┴─┴─┴─┴─┴─┴─────────────────┘ 9749 9750Sparkly perfection! ✓ 9751``` 9752 9753### Testing Checklist 9754 9755All scenarios tested and working: 9756 9757**Initial Load**: ✅ All elements themed 9758**Navigate Months**: ✅ Everything stays themed 9759**Jump to Today**: ✅ Everything stays themed 9760**Filter Events**: ✅ Everything stays themed 9761**Search Events**: ✅ Everything stays themed 9762**Expand Past Events**: ✅ Everything stays themed 9763 9764**No element ever loses theme!** 9765 9766## Version 4.7.3 (2026-02-08) - FIX THEME PERSISTENCE IN JAVASCRIPT REBUILDS 9767 9768### Fixed: Theme Now Persists When JavaScript Rebuilds Event List 9769- **Fixed:** Event items now themed when changing months via AJAX 9770- **Fixed:** Past Events toggle now themed after navigation 9771- **Fixed:** JavaScript functions now read theme data from container 9772- **Result:** Theme persists perfectly through all interactions! 9773 9774### The Problem 9775 9776**v4.7.2 behavior**: 9777``` 9778Initial page load: Everything themed ✓ 9779 9780Navigate to next month (AJAX reload): 9781 Calendar grid: Themed ✓ (fixed in v4.7.1) 9782 Event items: Gray ✗ (theme lost!) 9783 Past toggle: Gray ✗ (theme lost!) 9784 9785JavaScript rebuild broke theming! 9786``` 9787 9788### The Root Cause 9789 9790**JavaScript functions didn't have access to theme data**: 9791 9792```javascript 9793// Before (broken): 9794window.renderEventItem = function(event, date, calId, namespace) { 9795 // No theme data available! 9796 let html = '<div style="border-left-color: ' + color + ';">'; 9797 // ↑ Missing theme colors 9798} 9799``` 9800 9801**Problem**: Theme styles were only in PHP, not accessible to JavaScript! 9802 9803### The Fix 9804 9805**Store theme in data attributes** (already done in v4.7.1): 9806```php 9807<div data-theme-styles='{"bg":"#242424","border":"#00cc07",...}'> 9808``` 9809 9810**JavaScript reads theme from container**: 9811```javascript 9812// Get theme data 9813const container = document.getElementById(calId); 9814const themeStyles = JSON.parse(container.dataset.themeStyles); 9815 9816// Apply to event items 9817const itemStyle = 'border-left-color: ' + color + ';' + 9818 'background: ' + themeStyles.cell_bg + ';' + 9819 'color: ' + themeStyles.text_primary + ';'; 9820 9821// Apply to past toggle 9822const toggleStyle = 'background: ' + themeStyles.cell_bg + ';' + 9823 'color: ' + themeStyles.text_dim + ';'; 9824``` 9825 9826### What Was Fixed 9827 9828**1. renderEventItem() function**: 9829```javascript 9830// Now gets theme from container: 9831const container = document.getElementById(calId); 9832let themeStyles = {}; 9833if (container && container.dataset.themeStyles) { 9834 themeStyles = JSON.parse(container.dataset.themeStyles); 9835} 9836 9837// Applies theme to event item: 9838style="border-left-color: ${color}; 9839 background: ${themeStyles.cell_bg}; 9840 color: ${themeStyles.text_primary};" 9841``` 9842 9843**2. renderEventListFromData() function**: 9844```javascript 9845// Gets theme at start: 9846const container = document.getElementById(calId); 9847const themeStyles = JSON.parse(container.dataset.themeStyles); 9848 9849// Applies to past events toggle: 9850const toggleStyle = 9851 'background: ' + themeStyles.cell_bg + ';' + 9852 'color: ' + themeStyles.text_dim + ';' + 9853 'border-color: ' + themeStyles.grid_border + ';'; 9854``` 9855 9856### Before vs After 9857 9858**BEFORE (v4.7.2)**: 9859``` 9860Load page with Matrix theme: 9861┌─────────────┬─────────────┐ 9862│ Calendar │ Events │ 9863│ (Green) ✓ │ (Green) ✓ │ 9864└─────────────┴─────────────┘ 9865 9866Click "›" to next month (AJAX): 9867┌─────────────┬─────────────┐ 9868│ Calendar │ Events │ 9869│ (Green) ✓ │ (Gray) ✗ │ ← Theme lost! 9870└─────────────┴─────────────┘ 9871``` 9872 9873**AFTER (v4.7.3)**: 9874``` 9875Load page with Matrix theme: 9876┌─────────────┬─────────────┐ 9877│ Calendar │ Events │ 9878│ (Green) ✓ │ (Green) ✓ │ 9879└─────────────┴─────────────┘ 9880 9881Click "›" to next month (AJAX): 9882┌─────────────┬─────────────┐ 9883│ Calendar │ Events │ 9884│ (Green) ✓ │ (Green) ✓ │ ← Theme stays! 9885└─────────────┴─────────────┘ 9886 9887Navigate anywhere - theme persists! ✓ 9888``` 9889 9890### Data Flow 9891 9892**Complete theme persistence**: 9893``` 98941. PHP: Store theme in data attributes 9895 data-theme-styles='{"bg":"#242424",...}' 9896 98972. JavaScript: Read on initial load 9898 ✓ Already working (v4.7.1) 9899 99003. JavaScript: Read on AJAX rebuild 9901 ✓ NOW FIXED (v4.7.3) 9902 const themeStyles = JSON.parse(container.dataset.themeStyles); 9903 99044. Apply to all rebuilt elements 9905 ✓ Event items 9906 ✓ Past toggle 9907 ✓ Calendar cells 9908``` 9909 9910### Testing Scenarios 9911 9912All work perfectly now: 9913 9914**Scenario 1: Navigate Months**: 9915``` 9916Feb (Matrix) → Click › → Mar (Matrix) ✓ 9917Theme persists through navigation 9918``` 9919 9920**Scenario 2: Change Year**: 9921``` 99222026 (Purple) → Change to 2027 (Purple) ✓ 9923Theme persists through year change 9924``` 9925 9926**Scenario 3: Jump to Today**: 9927``` 9928Any month (Pink) → Click Today → Current (Pink) ✓ 9929Theme persists when jumping 9930``` 9931 9932**Scenario 4: Filter Events**: 9933``` 9934All events (Professional) → Filter namespace → Filtered (Professional) ✓ 9935Theme persists through filtering 9936``` 9937 9938### All Themes Work 9939 9940** Matrix**: Green everywhere, always ✓ 9941** Purple**: Purple everywhere, always ✓ 9942** Professional**: Blue everywhere, always ✓ 9943** Pink**: Pink everywhere, always ✓ 9944 9945**No matter what you do, theme stays consistent!** 9946 9947## Version 4.7.2 (2026-02-08) - COMPLETE THEME STYLING 9948 9949### Fixed: All Remaining Theme Issues 9950- **Fixed:** Event items in sidebar now use theme colors 9951- **Fixed:** Past Events toggle now uses theme colors 9952- **Fixed:** Calendar cells now properly themed (issue with data passing) 9953- **Result:** Every element now perfectly themed! 9954 9955### What Was Fixed 9956 9957**1. Event Items in Sidebar** (was plain): 9958```php 9959// Before: 9960style="border-left-color: $color;" 9961 9962// After: 9963style="border-left-color: $color; 9964 background: $themeStyles['cell_bg']; 9965 color: $themeStyles['text_primary'];" 9966``` 9967 9968**2. Past Events Toggle** (was plain): 9969```php 9970// Before: 9971<div class="past-events-toggle"> 9972 9973// After: 9974<div class="past-events-toggle" 9975 style="background: $themeStyles['cell_bg']; 9976 color: $themeStyles['text_dim']; 9977 border-color: $themeStyles['grid_border'];"> 9978``` 9979 9980**3. Theme Data Flow** (was broken): 9981```php 9982// Now properly passes theme to all functions: 9983renderEventListContent($events, $calId, $namespace, $themeStyles); 9984``` 9985 9986### Before vs After 9987 9988**BEFORE (v4.7.1)**: 9989``` 9990Calendar header: Themed ✓ 9991Calendar grid: Themed ✓ 9992Event list panel: Themed ✓ 9993Event items: Plain gray ✗ 9994Past Events: Plain gray ✗ 9995``` 9996 9997**AFTER (v4.7.2)**: 9998``` 9999Calendar header: Themed ✓ 10000Calendar grid: Themed ✓ 10001Event list panel: Themed ✓ 10002Event items: Themed ✓ 10003Past Events: Themed ✓ 10004 10005Everything matches! ✨ 10006``` 10007 10008### Matrix Theme Example 10009 10010**Complete theming**: 10011``` 10012┌─────────────┬─────────────┐ 10013│ February │ Events │ ← Green header 10014├─────────────┼─────────────┤ 10015│ Dark cells │ • Meeting │ ← Green bg & text 10016│ Green text │ • Review │ ← Green bg & text 10017│ Today=green │ │ 10018├─────────────┼─────────────┤ 10019│ │ ▶ Past (5) │ ← Green bg 10020└─────────────┴─────────────┘ 10021 10022All green! ✓ 10023``` 10024 10025### Purple Theme Example 10026 10027``` 10028┌─────────────┬─────────────┐ 10029│ February │ Events │ ← Purple header 10030├─────────────┼─────────────┤ 10031│ Dark purple │ • Meeting │ ← Purple bg 10032│ Lavender │ • Review │ ← Lavender text 10033│ cells │ │ 10034├─────────────┼─────────────┤ 10035│ │ ▶ Past (5) │ ← Purple bg 10036└─────────────┴─────────────┘ 10037 10038All purple! ✓ 10039``` 10040 10041### Professional Theme Example 10042 10043``` 10044┌─────────────┬─────────────┐ 10045│ February │ Events │ ← Blue header 10046├─────────────┼─────────────┤ 10047│ Light gray │ • Meeting │ ← Light bg 10048│ Blue accents│ • Review │ ← Dark text 10049│ cells │ │ 10050├─────────────┼─────────────┤ 10051│ │ ▶ Past (5) │ ← Light bg 10052└─────────────┴─────────────┘ 10053 10054All professional! ✓ 10055``` 10056 10057### Pink Theme Example 10058 10059``` 10060┌─────────────┬─────────────┐ 10061│ February │ Events │ ← Hot pink header 10062├─────────────┼─────────────┤ 10063│ Dark pink │ • Meeting │ ← Pink bg 10064│ Pink text │ • Review │ ← Pink text 10065│ cells │ │ 10066├─────────────┼─────────────┤ 10067│ │ ▶ Past (5) │ ← Pink bg 10068└─────────────┴─────────────┘ 10069 10070All pink & sparkly! ✓ 10071``` 10072 10073### What's Themed Now 10074 10075**Calendar Section**: 10076- ✅ Container border & shadow 10077- ✅ Header background & text 10078- ✅ Navigation buttons 10079- ✅ Today button 10080- ✅ Grid table 10081- ✅ Day cells 10082- ✅ Today cell highlight 10083- ✅ Empty cells 10084 10085**Event List Section**: 10086- ✅ Panel background 10087- ✅ Header background 10088- ✅ Header text 10089- ✅ Search box 10090- ✅ Add button 10091- ✅ Event items ← NEW! 10092- ✅ Past Events toggle ← NEW! 10093 10094**100% themed!** 10095 10096## Version 4.7.1 (2026-02-08) - FIX THEME PERSISTENCE & EVENT LIST THEMING 10097 10098### Fixed: Theme Now Persists When Changing Months 10099- **Fixed:** Calendar theme no longer resets to default when navigating months 10100- **Fixed:** Theme data now stored in data attributes and used by JavaScript 10101- **Added:** rebuildCalendar now applies theme styles to all cells 10102 10103### ✨ Added: Event List Panel Now Themed 10104- **Added:** Right sidebar event list now uses theme colors 10105- **Added:** Event list header themed 10106- **Added:** Search box themed 10107- **Added:** Add button themed 10108- **Result:** Complete theme consistency across entire calendar! 10109 10110### The Problems 10111 10112**Problem 1: Month Navigation Lost Theme**: 10113``` 10114Initial load: Matrix theme ✓ (green) 10115Click "›" to next month 10116Result: Gray calendar ✗ (theme lost!) 10117``` 10118 10119**Problem 2: Event List Not Themed**: 10120``` 10121Calendar grid: Themed ✓ 10122Event list (right side): Plain gray ✗ 10123Inconsistent! 10124``` 10125 10126### The Fixes 10127 10128**Fix 1: Store Theme in Data Attributes**: 10129 10130```php 10131// PHP stores theme data: 10132<div data-theme="matrix" 10133 data-theme-styles='{"bg":"#242424","border":"#00cc07",...}'> 10134``` 10135 10136**Fix 2: JavaScript Uses Theme Data**: 10137 10138```javascript 10139// rebuildCalendar reads theme: 10140const theme = container.dataset.theme; 10141const themeStyles = JSON.parse(container.dataset.themeStyles); 10142 10143// Apply to cells: 10144const cellBg = isToday ? 10145 themeStyles.cell_today_bg : 10146 themeStyles.cell_bg; 10147``` 10148 10149**Fix 3: Theme Event List Panel**: 10150 10151```php 10152// Event list header: 10153style="background:{$themeStyles['header_bg']}; 10154 color:{$themeStyles['text_primary']};" 10155 10156// Event list container: 10157style="background:{$themeStyles['bg']};" 10158 10159// Search box: 10160style="background:{$themeStyles['cell_bg']}; 10161 color:{$themeStyles['text_primary']};" 10162 10163// Add button: 10164style="background:{$themeStyles['border']};" 10165``` 10166 10167### Before vs After 10168 10169**BEFORE (v4.7.0)**: 10170``` 10171Load page: Matrix theme everywhere ✓ 10172Navigate to next month: 10173 Calendar grid: Gray ✗ (theme lost) 10174 Event list: Gray ✗ (never themed) 10175``` 10176 10177**AFTER (v4.7.1)**: 10178``` 10179Load page: Matrix theme everywhere ✓ 10180Navigate to next month: 10181 Calendar grid: Matrix theme ✓ (preserved!) 10182 Event list: Matrix theme ✓ (themed!) 10183 10184Perfect consistency! ✨ 10185``` 10186 10187### What's Now Themed 10188 10189**Calendar Grid** (after navigation): 10190- ✅ Cell backgrounds 10191- ✅ Today cell highlight 10192- ✅ Empty cells 10193- ✅ Text colors 10194- ✅ Border colors 10195 10196**Event List Panel**: 10197- ✅ Panel background 10198- ✅ Header background & text 10199- ✅ Search box styling 10200- ✅ Add button colors 10201- ✅ Namespace badge 10202 10203### Technical Implementation 10204 10205**Data Flow**: 10206``` 102071. PHP: Get theme from config 10208 $theme = getSidebarTheme(); 10209 102102. PHP: Get theme styles 10211 $themeStyles = getSidebarThemeStyles($theme); 10212 102133. PHP: Store in data attributes 10214 data-theme="matrix" 10215 data-theme-styles='{...JSON...}' 10216 102174. JavaScript: Read on navigation 10218 const themeStyles = JSON.parse(container.dataset.themeStyles); 10219 102205. JavaScript: Apply to rebuilt elements 10221 style="background:${themeStyles.bg};" 10222``` 10223 10224**Result**: Theme persists across navigations! ✓ 10225 10226### All Themes Work Perfectly 10227 10228** Matrix**: 10229- Month change: Green ✓ 10230- Event list: Green ✓ 10231 10232** Purple**: 10233- Month change: Purple ✓ 10234- Event list: Purple ✓ 10235 10236** Professional**: 10237- Month change: Blue ✓ 10238- Event list: Blue ✓ 10239 10240** Pink**: 10241- Month change: Pink ✓ 10242- Event list: Pink ✓ 10243 10244**Fully consistent theming everywhere!** 10245 10246## Version 4.7.0 (2026-02-08) - THEMES FOR COMPACT CALENDAR! 10247 10248### ✨ Major Feature: Themes Now Apply to Compact Calendar 10249- **Added:** Full theme support for {{calendar-compact}} 10250- **Added:** Matrix, Purple, Professional, and Pink themes 10251- **Added:** Consistent theming across sidebar and calendar 10252- **Result:** Beautiful, cohesive appearance! 10253 10254### What's New 10255 10256**All 4 themes now work on the calendar**: 10257- **Matrix** - Green cyberpunk (default) 10258- **Purple** - Royal purple elegance 10259- **Professional** - Clean business blue 10260- **Pink** - Sparkly pink bling 10261 10262**Set in Admin Panel** → Theme applies everywhere! 10263 10264### Before vs After 10265 10266**BEFORE (v4.6.8)**: 10267``` 10268Sidebar: Themed (Matrix/Purple/Professional/Pink) ✓ 10269Calendar: Plain gray (no theme) ✗ 10270 10271Inconsistent appearance! 10272``` 10273 10274**AFTER (v4.7.0)**: 10275``` 10276Sidebar: Themed ✓ 10277Calendar: SAME THEME ✓ 10278 10279Perfectly consistent! ✨ 10280``` 10281 10282### Theme Showcase 10283 10284**Matrix Theme** (Green): 10285``` 10286┌─────────────────────────┐ 10287│ ◀ February 2026 ▶ │ ← Green header 10288├─────────────────────────┤ 10289│ Dark background │ 10290│ Green borders │ 10291│ Green text │ 10292│ Green glow effects │ 10293└─────────────────────────┘ 10294``` 10295 10296**Purple Theme**: 10297``` 10298┌─────────────────────────┐ 10299│ ◀ February 2026 ▶ │ ← Purple header 10300├─────────────────────────┤ 10301│ Dark purple background │ 10302│ Purple borders │ 10303│ Lavender text │ 10304│ Purple glow │ 10305└─────────────────────────┘ 10306``` 10307 10308**Professional Theme** (Light): 10309``` 10310┌─────────────────────────┐ 10311│ ◀ February 2026 ▶ │ ← Blue header 10312├─────────────────────────┤ 10313│ Light gray background │ 10314│ Blue accents │ 10315│ Professional appearance │ 10316│ Clean, business-ready │ 10317└─────────────────────────┘ 10318``` 10319 10320**Pink Theme** (Bling): 10321``` 10322┌─────────────────────────┐ 10323│ ◀ February 2026 ▶ │ ← Hot pink header 10324├─────────────────────────┤ 10325│ Dark pink background │ 10326│ Pink borders & glow │ 10327│ Pink text │ 10328│ Sparkle effects ✨ │ 10329└─────────────────────────┘ 10330``` 10331 10332### What's Themed 10333 10334**Calendar Container**: 10335- Background color 10336- Border color 10337- Shadow/glow effect 10338 10339**Calendar Header**: 10340- Background gradient 10341- Border color 10342- Text color 10343- Button colors 10344 10345**Calendar Grid**: 10346- Grid background 10347- Grid borders 10348- Header row colors 10349 10350**Calendar Cells**: 10351- Cell background 10352- Today cell highlight 10353- Text color 10354- Border colors 10355 10356### Implementation 10357 10358**Theme Detection**: 10359```php 10360// Same theme system as sidebar 10361$theme = $this->getSidebarTheme(); 10362$themeStyles = $this->getSidebarThemeStyles($theme); 10363``` 10364 10365**Applied to Container**: 10366```php 10367style="background:' . $themeStyles['bg'] . '; 10368 border:2px solid ' . $themeStyles['border'] . '; 10369 box-shadow:0 0 10px ' . $themeStyles['shadow'] . ';" 10370``` 10371 10372**Applied to Header**: 10373```php 10374style="background:' . $themeStyles['header_bg'] . '; 10375 color:' . $themeStyles['text_primary'] . ';" 10376``` 10377 10378**Applied to Cells**: 10379```php 10380$cellBg = $isToday ? 10381 $themeStyles['cell_today_bg'] : 10382 $themeStyles['cell_bg']; 10383``` 10384 10385### How to Change Theme 10386 10387**In Admin Panel**: 103881. Go to Admin → Calendar Management 103892. Click " Themes" tab 103903. Select theme (Matrix/Purple/Professional/Pink) 103914. Theme applies to BOTH sidebar and calendar! ✓ 10392 10393**No configuration needed** - Just select and enjoy! 10394 10395### Theme Colors 10396 10397**Matrix**: 10398- Background: `#242424` (dark gray) 10399- Border: `#00cc07` (matrix green) 10400- Text: `#00cc07` (green) 10401- Today: `#2a4d2a` (green highlight) 10402 10403**Purple**: 10404- Background: `#2a2030` (dark purple) 10405- Border: `#9b59b6` (royal purple) 10406- Text: `#b19cd9` (lavender) 10407- Today: `#3d2b4d` (purple highlight) 10408 10409**Professional**: 10410- Background: `#e8ecf1` (light blue-gray) 10411- Border: `#4a90e2` (business blue) 10412- Text: `#2c3e50` (dark blue-gray) 10413- Today: `#dce8f7` (light blue highlight) 10414 10415**Pink**: 10416- Background: `#1a0d14` (dark pink-black) 10417- Border: `#ff1493` (hot pink) 10418- Text: `#ff69b4` (pink) 10419- Today: `#3d2030` (pink highlight) 10420 10421### Consistency 10422 10423**Both use same theme**: 10424``` 10425Admin Panel → Set theme to "Purple" 10426 10427{{calendar}} sidebar: Purple theme ✓ 10428{{calendar-compact}}: Purple theme ✓ 10429{{calendar-panel}}: Will be themed next! ✓ 10430 10431All calendars match! ✨ 10432``` 10433 10434**Perfectly coordinated appearance!** 10435 10436## Version 4.6.8 (2026-02-07) - DOCUMENT NOHEADER PARAMETER 10437 10438### Documentation: Added noheader Parameter Info 10439- **Added:** Documentation for existing `noheader` parameter 10440- **Updated:** README with complete eventlist parameter list 10441- **Info:** Feature already existed, just wasn't documented! 10442 10443### The noheader Parameter 10444 10445**What it does**: Hides the clock/date/weather header in eventlist 10446 10447**Usage**: 10448``` 10449{{eventlist today noheader}} 10450``` 10451 10452**Before (with header)**: 10453``` 10454┌─────────────────────────────────┐ 10455│ 3:45 PM ️ 72° Feb 7 │ ← Clock header 10456├─────────────────────────────────┤ 10457│ 5 min load │ CPU │ Memory │ ← System stats 10458├─────────────────────────────────┤ 10459│ Today's Events │ 10460│ • 10:00 Team Meeting │ 10461│ • 2:00 Project Review │ 10462└─────────────────────────────────┘ 10463``` 10464 10465**After (noheader)**: 10466``` 10467┌─────────────────────────────────┐ 10468│ Today's Events │ ← No header! 10469│ • 10:00 Team Meeting │ 10470│ • 2:00 Project Review │ 10471└─────────────────────────────────┘ 10472 10473Cleaner, more compact! ✓ 10474``` 10475 10476### When to Use noheader 10477 10478**Use WITH header** (default): 10479- Dashboard view 10480- Want to see current time 10481- Want weather info 10482- Want system stats 10483 10484**Use WITHOUT header** (`noheader`): 10485- Embedded in page content 10486- Just want event list 10487- Minimal design 10488- Space-constrained 10489 10490### Complete eventlist Parameters 10491 10492**Date Parameters**: 10493``` 10494date=YYYY-MM-DD Show specific date 10495daterange=START:END Show date range 10496``` 10497 10498**Filter Parameters**: 10499``` 10500namespace=name Filter by namespace 10501``` 10502 10503**Display Parameters**: 10504``` 10505today Show today with live clock 10506noheader Hide clock/date/weather header 10507showchecked Show completed tasks 10508range=day|week|month Show day/week/month range 10509``` 10510 10511### Examples 10512 10513**Full featured** (dashboard): 10514``` 10515{{eventlist today}} 10516``` 10517Shows: Clock, weather, system stats, events ✓ 10518 10519**Minimal** (embedded): 10520``` 10521{{eventlist today noheader}} 10522``` 10523Shows: Just events ✓ 10524 10525**Date range without header**: 10526``` 10527{{eventlist daterange=2026-02-01:2026-02-28 noheader}} 10528``` 10529Shows: Events for February, no header ✓ 10530 10531**With namespace filter**: 10532``` 10533{{eventlist today namespace=work noheader}} 10534``` 10535Shows: Today's work events, no header ✓ 10536 10537### Implementation 10538 10539**Already existed in code** (line 833): 10540```php 10541$noheader = isset($data['noheader']) ? true : false; 10542``` 10543 10544**Applied at render** (line 1010): 10545```php 10546if ($today && !empty($allEvents) && !$noheader) { 10547 // Render clock header with date/time/weather 10548} 10549``` 10550 10551**Just wasn't documented!** Now it is. ✓ 10552 10553## Version 4.6.7 (2026-02-07) - REMOVE REDUNDANT FILTER BADGE 10554 10555### ✨ Improvement: Removed Filter Badge Above Sidebar 10556- **Removed:** Filter badge no longer shows above compact calendar 10557- **Reason:** Filtering is already clearly visible in the calendar view 10558- **Result:** Cleaner UI, less redundancy 10559 10560### What Changed 10561 10562**BEFORE**: 10563``` 10564┌─────────────────────────┐ 10565│ Filtering: work ✕ │ ← Badge above calendar 10566├─────────────────────────┤ 10567│ ◀ February 2026 ▶ │ 10568├─────────────────────────┤ 10569│ Calendar grid with │ 10570│ filtered events │ ← Already filtered 10571└─────────────────────────┘ 10572 10573Badge was redundant - you can already see 10574the filtering in the calendar! 10575``` 10576 10577**AFTER**: 10578``` 10579┌─────────────────────────┐ 10580│ ◀ February 2026 ▶ │ ← No badge! 10581├─────────────────────────┤ 10582│ Calendar grid with │ 10583│ filtered events │ ← Filtering visible here 10584└─────────────────────────┘ 10585 10586Cleaner, simpler UI ✓ 10587``` 10588 10589### Why Remove It? 10590 10591**Redundant Information**: 10592- Calendar already shows only filtered events 10593- Namespace badges on events show which namespace 10594- Badge added visual clutter without value 10595 10596**Better UX**: 10597- Less visual noise 10598- More space for content 10599- Filtering still obvious from event display 10600 10601**Code Cleanup**: 10602```php 10603// Old code (removed): 10604if ($namespace && $namespace !== '*' && ...) { 10605 $html .= '<div class="calendar-namespace-filter">'; 10606 $html .= 'Filtering: ' . $namespace . ' ✕'; 10607 $html .= '</div>'; 10608} 10609 10610// New code: 10611// Filter badge removed - filtering shown in calendar view only 10612``` 10613 10614### How Filtering Still Works 10615 10616**Filtering IS Active**: 10617- Calendar only shows events from selected namespace ✓ 10618- Event namespace badges show which namespace ✓ 10619- Clear filtering still works (in calendar) ✓ 10620 10621**Just No Badge**: 10622- No redundant "Filtering: work ✕" above calendar 10623- Cleaner, more professional appearance 10624 10625### What You Still See 10626 10627**Namespace Information**: 10628``` 10629Event with namespace badge: 10630┌────────────────────────┐ 10631│ 10:00 Team Meeting │ 10632│ [work] ←─────────┼─ Namespace badge on event 10633└────────────────────────┘ 10634``` 10635 10636**Filtered View**: 10637- Only events from selected namespace visible 10638- Empty dates show no events 10639- Clear which namespace you're viewing 10640 10641**No Need for Top Badge**: 10642- Already obvious from events shown 10643- Namespace badges provide context 10644- Less clutter! 10645 10646### Summary 10647 10648**Removed**: Filter badge above calendar 10649**Kept**: All filtering functionality 10650**Benefit**: Cleaner UI 10651 10652**Filtering works the same, just without the redundant badge!** ✨ 10653 10654## Version 4.6.6 (2026-02-07) - FIX: REMOVE FILTER BADGE IMMEDIATELY 10655 10656### Fixed: Filter Badge Now Disappears Immediately 10657- **Fixed:** Filter badge now removed from DOM immediately when clicking ✕ 10658- **Added:** Badge removal before page reload/AJAX call 10659- **Result:** Badge disappears instantly, no waiting for reload 10660 10661### The Problem 10662 10663**v4.6.5 behavior**: 10664``` 10665Click ✕ to clear filter 10666→ Page reloads or AJAX fires 10667→ Badge stays visible during reload ✗ 10668→ Badge finally disappears after reload ✓ 10669 10670User sees badge for 0.5-2 seconds after clicking ✕ 10671Feels laggy! ✗ 10672``` 10673 10674### The Fix 10675 10676**Immediately remove badge from DOM**: 10677 10678```javascript 10679window.clearNamespaceFilter = function(calId) { 10680 const container = document.getElementById(calId); 10681 10682 // IMMEDIATELY hide/remove the filter badge 10683 const filterBadge = container.querySelector('.calendar-namespace-filter'); 10684 if (filterBadge) { 10685 filterBadge.style.display = 'none'; // Hide instantly 10686 filterBadge.remove(); // Remove from DOM 10687 } 10688 10689 // THEN reload (AJAX or page reload) 10690 navCalendar(...) or window.location.href = ... 10691}; 10692``` 10693 10694### Before vs After 10695 10696**BEFORE (v4.6.5)**: 10697``` 10698Time 0ms: Click ✕ 10699┌─────────────────────────┐ 10700│ Filtering: work ✕ │ ← Still visible 10701├─────────────────────────┤ 10702 10703Time 500ms: Reload completes 10704┌─────────────────────────┐ 10705│ (no badge) │ ← Finally gone 10706├─────────────────────────┤ 10707 10708Delay: 500-2000ms ✗ 10709``` 10710 10711**AFTER (v4.6.6)**: 10712``` 10713Time 0ms: Click ✕ 10714┌─────────────────────────┐ 10715│ (no badge) │ ← Gone immediately! 10716├─────────────────────────┤ 10717 10718Time 500ms: Reload completes 10719┌─────────────────────────┐ 10720│ (no badge) │ ← Still gone 10721├─────────────────────────┤ 10722 10723Delay: 0ms ✓ 10724Instant feedback! ✓ 10725``` 10726 10727### Implementation 10728 10729**Two-step removal**: 10730 10731**Step 1**: Hide immediately 10732```javascript 10733filterBadge.style.display = 'none'; 10734// User sees badge disappear instantly 10735``` 10736 10737**Step 2**: Remove from DOM 10738```javascript 10739filterBadge.remove(); 10740// Clean up HTML 10741``` 10742 10743**Step 3**: Reload 10744```javascript 10745// Sidebar: Page reload 10746window.location.href = url.toString(); 10747 10748// Calendar: AJAX reload 10749navCalendar(calId, year, month, originalNamespace); 10750``` 10751 10752**Result**: Badge gone BEFORE reload starts ✓ 10753 10754### Why This Matters 10755 10756**User Experience**: 10757- Old: Click ✕ → Wait → Badge disappears 10758- New: Click ✕ → Badge disappears instantly 10759 10760**Perceived Performance**: 10761- Instant visual feedback 10762- Feels responsive 10763- Professional UX 10764 10765**Technical**: 10766- DOM manipulation is synchronous (instant) 10767- Network requests are asynchronous (slow) 10768- Do fast things first! 10769 10770**Badge now disappears the moment you click ✕!** ⚡ 10771 10772## Version 4.6.5 (2026-02-07) - FIX SIDEBAR FILTER BADGE CLEARING 10773 10774### Fixed: Filter Badge Not Clearing in Sidebar 10775- **Fixed:** Filter badge now properly clears when clicking ✕ button 10776- **Fixed:** Sidebar widget now reloads page without namespace filter 10777- **Changed:** clearNamespaceFilter now detects sidebar vs calendar and handles appropriately 10778 10779### The Problem 10780 10781**In {{calendar}} sidebar widget**: 10782``` 107831. Click namespace badge to filter 107842. Badge appears: "Filtering: work ✕" 107853. Click ✕ to clear filter 107864. Badge stays visible! ✗ 107875. Events still filtered! ✗ 10788``` 10789 10790**Root Cause**: Sidebar widget is server-rendered (PHP), not AJAX-reloaded like regular calendar. 10791 10792### The Fix 10793 10794**Detect widget type and handle appropriately**: 10795 10796```javascript 10797window.clearNamespaceFilter = function(calId) { 10798 const container = document.getElementById(calId); 10799 10800 // Check if this is a sidebar widget 10801 const sidebarContainer = document.getElementById('sidebar-widget-' + calId); 10802 10803 if (sidebarContainer) { 10804 // SIDEBAR: Reload page without namespace parameter 10805 const url = new URL(window.location.href); 10806 url.searchParams.delete('namespace'); 10807 window.location.href = url.toString(); // Page reload 10808 return; 10809 } 10810 10811 // REGULAR CALENDAR: AJAX reload 10812 navCalendar(calId, year, month, originalNamespace); 10813}; 10814``` 10815 10816### How It Works 10817 10818**Sidebar Widget** ({{calendar}} syntax): 10819``` 10820Rendered server-side with PHP 10821Cannot be AJAX-reloaded 10822Solution: Reload entire page without ?namespace=work parameter 10823``` 10824 10825**Regular Calendar** ({{calendar-compact}} or {{calendar-panel}}): 10826``` 10827Has AJAX reload capability 10828Solution: Call navCalendar() to reload via AJAX 10829``` 10830 10831### Before vs After 10832 10833**BEFORE (v4.6.4)**: 10834``` 10835Sidebar widget filtered by "work": 10836┌─────────────────────────┐ 10837│ Filtering: work ✕ │ ← Click ✕ 10838├─────────────────────────┤ 10839│ Today │ 10840│ • Work meeting │ 10841└─────────────────────────┘ 10842 10843After clicking ✕: 10844┌─────────────────────────┐ 10845│ Filtering: work ✕ │ ← Still there! ✗ 10846├─────────────────────────┤ 10847│ Today │ 10848│ • Work meeting │ ← Still filtered! ✗ 10849└─────────────────────────┘ 10850``` 10851 10852**AFTER (v4.6.5)**: 10853``` 10854Sidebar widget filtered by "work": 10855┌─────────────────────────┐ 10856│ Filtering: work ✕ │ ← Click ✕ 10857├─────────────────────────┤ 10858│ Today │ 10859│ • Work meeting │ 10860└─────────────────────────┘ 10861 10862After clicking ✕ → Page reloads: 10863┌─────────────────────────┐ 10864│ (no filter badge) │ ← Cleared! ✓ 10865├─────────────────────────┤ 10866│ Today │ 10867│ • Work meeting │ 10868│ • Personal task │ ← All events! ✓ 10869│ • Project review │ 10870└─────────────────────────┘ 10871``` 10872 10873### Technical Details 10874 10875**Why Page Reload for Sidebar?** 10876 10877Sidebar widget is rendered server-side: 10878```php 10879// In syntax.php: 10880return $this->renderSidebarWidget($events, $namespace, $calId); 10881// ↑ PHP generates complete HTML 10882// No AJAX reload endpoint exists for sidebar 10883``` 10884 10885**Solution**: Remove `?namespace=work` from URL and reload page 10886```javascript 10887const url = new URL(window.location.href); 10888url.searchParams.delete('namespace'); // Remove filter 10889window.location.href = url.toString(); // Reload 10890``` 10891 10892**Why AJAX for Regular Calendar?** 10893 10894Regular calendars have AJAX endpoints: 10895```javascript 10896// action.php handles: 10897action: 'load_month' → Returns new month data 10898navCalendar() → Fetches and rebuilds calendar 10899``` 10900 10901### Filter Badge Behavior 10902 10903**Showing Badge** (when filtering): 10904- Server-side: PHP renders badge in HTML 10905- Client-side: JavaScript adds badge to header 10906 10907**Clearing Badge**: 10908- Sidebar: Page reload (removes ?namespace from URL) 10909- Calendar: AJAX reload (badge removed in rebuildCalendar) 10910 10911**Now works correctly for both!** ✓ 10912 10913## Version 4.6.4 (2026-02-07) - HOTFIX: PHP SYNTAX ERROR 10914 10915### Critical Hotfix: Fixed PHP Parse Error 10916- **Fixed:** Template literal backticks causing PHP syntax error 10917- **Fixed:** Changed JavaScript template literals to concatenation 10918- **Fixed:** Admin page now loads without parse errors 10919 10920### The Problem 10921 10922**v4.6.3 broke admin page**: 10923``` 10924Error loading plugin calendar 10925ParseError: syntax error, unexpected identifier "s", 10926expecting "," or ";" 10927``` 10928 10929**Cause**: JavaScript template literals inside PHP echo 10930```php 10931echo '<script> 10932 let nsOptions = `<option value="">(default)</option>`; 10933 ↑ PHP sees backtick and gets confused! 10934</script>'; 10935``` 10936 10937**Why it broke**: Backticks (`) are special in PHP too! 10938 10939### The Fix 10940 10941**Changed from template literals to concatenation**: 10942 10943**BEFORE (broken)**: 10944```javascript 10945let nsOptions = `<option value="">(default)</option>`; 10946nsOptions += `<option value="${namespace}">${namespace}</option>`; 10947console.log('Edit recurring:', namespace); 10948``` 10949 10950**AFTER (fixed)**: 10951```javascript 10952let nsOptions = "<option value=\\"\\">(default)</option>"; 10953nsOptions += "<option value=\\"" + namespace + "\\">" + namespace + "</option>"; 10954console.log("Edit recurring:", namespace); 10955``` 10956 10957**Changes**: 10958- ✅ Backticks (`) → Double quotes (") 10959- ✅ Template literals (${var}) → Concatenation (" + var + ") 10960- ✅ Single quotes in console.log → Double quotes 10961- ✅ Properly escaped quotes for PHP echo 10962 10963### Technical Details 10964 10965**The Issue**: 10966```php 10967// Inside PHP echo string: 10968echo '<script> 10969 let x = `template ${literal}`; // ✗ Backtick breaks PHP! 10970</script>'; 10971``` 10972 10973**The Solution**: 10974```php 10975// Use regular string concatenation: 10976echo '<script> 10977 let x = "string " + variable; // ✓ Works in PHP echo! 10978</script>'; 10979``` 10980 10981**Quote Escaping**: 10982```javascript 10983// Double quotes inside PHP single-quote string: 10984'<option value=\"\">text</option>' 10985 ↑↑ Escaped for JavaScript 10986``` 10987 10988### Result 10989 10990**Before**: Admin page crashed with parse error ✗ 10991**After**: Admin page loads perfectly ✓ 10992 10993**No functionality changed - just syntax fix!** 10994 10995## Version 4.6.3 (2026-02-07) - FIX RECURRING EVENTS NAMESPACE DROPDOWN 10996 10997### Critical Fix: Namespace Dropdown in Recurring Events Section 10998- **Fixed:** Namespace dropdown now shows ALL available namespaces when editing 10999- **Fixed:** Current namespace now properly selected in dropdown 11000- **Fixed:** Namespace extraction from DOM now uses multiple methods 11001- **Added:** Console logging to debug namespace detection 11002 11003### The Problem 11004 11005**When editing from Recurring Events section**: 11006``` 11007Click "Edit" on recurring event 11008Namespace dropdown shows: 11009- (default) 11010- (nothing else!) ✗ 11011 11012Can't select any namespace! ✗ 11013``` 11014 11015**Why**: Broken namespace extraction logic 11016```javascript 11017// OLD CODE (broken): 11018const namespaces = Array.from(document.querySelectorAll("[id^=ns_]")) 11019 .map(el => { 11020 // Complex parsing that often failed 11021 const nsSpan = el.querySelector("span:nth-child(3)"); 11022 return nsSpan.textContent.replace(" ", "").trim(); 11023 }) 11024 .filter(ns => ns !== namespace); // Excluded current! ✗ 11025``` 11026 11027**Result**: Empty dropdown, can't change namespace! ✗ 11028 11029### The Fix 11030 11031**NEW CODE (robust)**: 11032```javascript 11033const namespaces = new Set(); 11034 11035// Method 1: Namespace explorer folders 11036document.querySelectorAll("[id^=ns_]").forEach(el => { 11037 const nsSpan = el.querySelector("span:nth-child(3)"); 11038 if (nsSpan) { 11039 let nsText = nsSpan.textContent.replace(" ", "").trim(); 11040 if (nsText && nsText !== "(default)") { 11041 namespaces.add(nsText); // ✓ 11042 } 11043 } 11044}); 11045 11046// Method 2: Datalist (backup method) 11047document.querySelectorAll("#namespaceList option").forEach(opt => { 11048 if (opt.value && opt.value !== "") { 11049 namespaces.add(opt.value); // ✓ 11050 } 11051}); 11052 11053// Build dropdown with ALL namespaces 11054let options = `<option value="">(default)</option>`; 11055 11056// Show current namespace as selected 11057if (namespace) { 11058 options += `<option value="${namespace}" selected>${namespace} (current)</option>`; 11059} 11060 11061// Show all other namespaces 11062for (const ns of nsArray) { 11063 if (ns !== namespace) { 11064 options += `<option value="${ns}">${ns}</option>`; 11065 } 11066} 11067``` 11068 11069**Result**: All namespaces visible! ✓ 11070 11071### How It Works Now 11072 11073**Before (Broken)**: 11074``` 11075Edit recurring event in "work" namespace 11076 11077Dropdown shows: 11078☐ (default) 11079 11080That's it! Can't select anything! ✗ 11081``` 11082 11083**After (Fixed)**: 11084``` 11085Edit recurring event in "work" namespace 11086 11087Dropdown shows: 11088☐ (default) 11089☑ work (current) ← Selected! 11090☐ personal 11091☐ projects 11092☐ meetings 11093 11094All namespaces available! ✓ 11095``` 11096 11097### Key Improvements 11098 11099**1. Dual extraction methods**: 11100- Primary: Parse namespace explorer DOM 11101- Backup: Read from datalist 11102- Result: Always finds namespaces ✓ 11103 11104**2. Current namespace included**: 11105```javascript 11106// OLD: Excluded current namespace 11107.filter(ns => ns !== namespace) ✗ 11108 11109// NEW: Include and mark as selected 11110options += `<option value="${namespace}" selected>${namespace} (current)</option>` ✓ 11111``` 11112 11113**3. Better error handling**: 11114```javascript 11115if (nsSpan) { // Check exists 11116 let nsText = nsSpan.textContent.replace(" ", "").trim(); 11117 if (nsText && nsText !== "(default)") { // Validate 11118 namespaces.add(nsText); 11119 } 11120} 11121``` 11122 11123**4. Console debugging**: 11124```javascript 11125console.log('Edit recurring - Current namespace:', namespace); 11126console.log('Available namespaces:', nsArray); 11127``` 11128 11129Open browser console (F12) to see what namespaces are detected! 11130 11131### Example Usage 11132 11133**Scenario**: Edit recurring "Team Meeting" in "work" namespace 11134 11135**Steps**: 111361. Go to Recurring Events section 111372. Click "Edit" on "Team Meeting" 111383. See namespace dropdown: 11139 - ☐ (default) 11140 - ☑ work (current) 11141 - ☐ personal 11142 - ☐ projects 111434. Select "personal" to move event 111445. Click "Save Changes" 111456. Event moved to "personal" namespace ✓ 11146 11147**Finally works as expected!** 11148 11149## Version 4.6.2 (2026-02-07) - FIX NAMESPACE PRESERVATION 11150 11151### Recurring Events Namespace Fix 11152- **Fixed:** Namespace now properly preserved when editing recurring events 11153- **Fixed:** Namespace selector now allows selecting any namespace (not just default) 11154- **Added:** Better logging for namespace preservation debugging 11155- **Added:** Console logging to track namespace values during edit 11156 11157### The Namespace Problem 11158 11159**Issue 1**: Can't select non-default namespace 11160``` 11161When editing recurring event: 11162- Dropdown shows all namespaces ✓ 11163- User selects "work" 11164- Form submits with "" (empty/default) ✗ 11165``` 11166 11167**Issue 2**: Namespace not preserved 11168``` 11169Recurring event in "personal" namespace 11170Edit the title only 11171After save: namespace changed to "" (default) ✗ 11172``` 11173 11174### The Fixes 11175 11176**Fix 1**: Better namespace preservation logic 11177```php 11178// When editing recurring event: 11179$existingNamespace = $existingEventData['namespace']; 11180 11181// Preserve if user didn't explicitly change it: 11182if (empty($namespace) || 11183 strpos($namespace, '*') !== false || 11184 strpos($namespace, ';') !== false) { 11185 // User didn't select or selected wildcard 11186 $namespace = $existingNamespace; // Keep existing! 11187} 11188``` 11189 11190**Fix 2**: Proper form population 11191```javascript 11192// When editing, set BOTH inputs: 11193namespaceHidden.value = event.namespace || ''; // Hidden (submitted) 11194namespaceSearch.value = event.namespace || '(default)'; // Visible 11195 11196// Plus logging: 11197console.log('Set namespace for editing:', event.namespace); 11198``` 11199 11200**Fix 3**: Added detailed logging 11201```php 11202error_log("Preserving namespace '$namespace' (received='$receivedNamespace')"); 11203error_log("Using new namespace '$namespace'"); 11204error_log("No existing namespace to preserve"); 11205``` 11206 11207### How It Works Now 11208 11209**Scenario 1**: Edit without changing namespace 11210``` 11211Event in "work" namespace 11212Edit title to "Updated Meeting" 11213Namespace field shows: "work" 11214Hidden input value: "work" 11215Result: Saved in "work" ✓ 11216``` 11217 11218**Scenario 2**: Change namespace during edit 11219``` 11220Event in "personal" namespace 11221Edit and select "work" namespace 11222Hidden input value: "work" 11223Result: Saved in "work" ✓ 11224``` 11225 11226**Scenario 3**: Edit with empty/wildcard namespace 11227``` 11228Event in "projects" namespace 11229Namespace field empty or shows "personal;work" 11230System preserves: "projects" 11231Result: Saved in "projects" ✓ 11232``` 11233 11234### Debugging 11235 11236Now with console logging, you can see: 11237```javascript 11238Set namespace for editing: work 11239Hidden value: work 11240``` 11241 11242And in PHP logs: 11243``` 11244Calendar saveEvent recurring: Loaded existing data - namespace='work' 11245Calendar saveEvent recurring: Preserving namespace 'work' (received='') 11246``` 11247 11248**Namespace preservation now works correctly!** 11249 11250## Version 4.6.1 (2026-02-07) - PRESERVE RECURRING EVENT DATA 11251 11252### Recurring Events Edit Fix 11253- **Fixed:** Editing recurring events now preserves unchanged fields 11254- **Fixed:** Empty fields no longer erase existing data 11255- **Added:** Smart merge of existing event data with new changes 11256 11257### The Problem 11258 11259**Before**: Editing erased unchanged fields! 11260``` 11261Original recurring event: 11262- Title: "Team Meeting" 11263- Time: "10:00 AM" 11264- Description: "Weekly standup with engineering team" 11265- Color: Red 11266 11267User edits ONLY the title to "Staff Meeting" 11268Form sends: 11269- Title: "Staff Meeting" ✓ 11270- Time: "" ✗ (empty because user didn't change it) 11271- Description: "" ✗ (empty) 11272- Color: "#3498db" ✗ (default blue) 11273 11274Result after save: 11275- Title: "Staff Meeting" ✓ 11276- Time: BLANK ✗ 11277- Description: BLANK ✗ 11278- Color: Blue ✗ 11279``` 11280 11281**All the other data was lost!** ✗ 11282 11283### The Fix 11284 11285**After**: Preserves unchanged data! 11286```php 11287if ($eventId && $isRecurring) { 11288 // Load existing event data 11289 $existingEventData = getExistingEventData($eventId); 11290 11291 // Merge: use new value OR keep existing 11292 $title = $title ?: $existingEventData['title']; 11293 $time = $time ?: $existingEventData['time']; 11294 $description = $description ?: $existingEventData['description']; 11295 $color = ($color === '#3498db') ? 11296 $existingEventData['color'] : $color; 11297} 11298``` 11299 11300**Now**: 11301``` 11302User edits ONLY the title to "Staff Meeting" 11303 11304System: 113051. Loads existing event data 113062. Merges: new title + existing time/description/color 113073. Saves merged data 11308 11309Result: 11310- Title: "Staff Meeting" ✓ (changed) 11311- Time: "10:00 AM" ✓ (preserved!) 11312- Description: "Weekly standup..." ✓ (preserved!) 11313- Color: Red ✓ (preserved!) 11314``` 11315 11316**Only changed fields are updated!** ✓ 11317 11318### How It Works 11319 11320**Step 1**: Load existing data 11321```php 11322$existingEventData = $this->getExistingEventData( 11323 $eventId, 11324 $date, 11325 $namespace 11326); 11327``` 11328 11329**Step 2**: Merge with new data 11330```php 11331// If new value is empty, use existing value 11332$title = $newTitle ?: $existingEventData['title']; 11333$time = $newTime ?: $existingEventData['time']; 11334$description = $newDesc ?: $existingEventData['description']; 11335 11336// Special handling for color (default is #3498db) 11337if ($newColor === '#3498db' && $existingEventData['color']) { 11338 $color = $existingEventData['color']; 11339} 11340``` 11341 11342**Step 3**: Save merged data 11343```php 11344createRecurringEvents(..., $title, $time, $description, $color, ...); 11345``` 11346 11347### Fields Preserved 11348 11349When editing recurring events, these fields are now preserved if not changed: 11350- ✅ Title (if left blank) 11351- ✅ Time (if not specified) 11352- ✅ End Time (if not specified) 11353- ✅ Description (if left empty) 11354- ✅ Color (if still default blue) 11355 11356**Edit only what you want to change - everything else stays!** 11357 11358## Version 4.6.0 (2026-02-07) - NAMESPACE RENAME & RECURRING FIX 11359 11360### ✨ New Feature: Rename Namespaces 11361- **Added:** ✏️ Rename button in Namespace Explorer 11362- **Added:** Rename all events in a namespace at once 11363- **Added:** Automatic cleanup of old directory structure 11364 11365### Critical Fix: Recurring Events Actually Edit Now! 11366- **Fixed:** Editing recurring events now deletes ALL instances 11367- **Fixed:** Previously only deleted one instance, left orphans 11368- **Fixed:** Recurring events properly regenerated on edit 11369 11370### Namespace Rename Feature 11371 11372**Before**: Could only delete namespaces, not rename 11373 11374**After**: Click ✏️ to rename! 11375 11376``` 11377 work (15 events) [3] [✏️] [️] 11378 ↑ NEW! 11379``` 11380 11381**How It Works**: 113821. Click ✏️ rename button 113832. Enter new namespace name 113843. All events moved to new namespace 113854. Event `namespace` field updated in JSON 113865. Old directory cleaned up 11387 11388**Example**: 11389``` 11390Rename: "work" → "business" 11391 11392Before: 11393/data/meta/work/calendar/*.json 11394Events: {namespace: "work"} 11395 11396After: 11397/data/meta/business/calendar/*.json 11398Events: {namespace: "business"} 11399``` 11400 11401**Implementation**: 11402```php 11403private function renameNamespace() { 11404 // 1. Validate new name 11405 // 2. Rename directory 11406 // 3. Update all event namespace fields in JSON 11407 // 4. Clean up old empty directories 11408} 11409``` 11410 11411### Recurring Events Fix - The Problem 11412 11413**Before**: Editing didn't work! 11414``` 11415Original recurring event generates: 11416- Event-0 (Mon, Feb 10) 11417- Event-1 (Mon, Feb 17) 11418- Event-2 (Mon, Feb 24) 11419 11420User edits Event-0, changes title to "Updated" 11421 11422What SHOULD happen: 11423- Delete Event-0, Event-1, Event-2 11424- Generate new instances with "Updated" title 11425 11426What ACTUALLY happened: 11427- Delete Event-0 only ✗ 11428- Generate new instances 11429- Result: Event-1 and Event-2 still show old title! ✗ 11430``` 11431 11432**After**: Properly deletes ALL instances! 11433 11434**The Fix**: 11435```php 11436private function deleteEvent() { 11437 $event = getEvent($eventId); 11438 11439 // Check if recurring 11440 if ($event['recurring'] && $event['recurringId']) { 11441 // Delete ALL instances with same recurringId 11442 deleteAllRecurringInstances($recurringId); 11443 } 11444 11445 // Then normal delete for spanning events 11446} 11447 11448private function deleteAllRecurringInstances($recurringId) { 11449 // Scan ALL calendar JSON files 11450 foreach (glob('*.json') as $file) { 11451 // Filter out events with matching recurringId 11452 $events = array_filter($events, function($event) { 11453 return $event['recurringId'] !== $recurringId; 11454 }); 11455 } 11456} 11457``` 11458 11459**Result**: 11460- Edit "Weekly Team Meeting" → ALL instances updated ✓ 11461- Delete recurring event → ALL instances deleted ✓ 11462- No more orphaned events! ✓ 11463 11464### Recurring Event Fields 11465 11466Every recurring event has: 11467```json 11468{ 11469 "id": "abc123-0", 11470 "recurring": true, 11471 "recurringId": "abc123", ← Links all instances 11472 ... 11473} 11474``` 11475 11476When editing/deleting, we find ALL events with same `recurringId` and remove them! 11477 11478**Finally, recurring events work properly!** 11479 11480## Version 4.5.2 (2026-02-07) - FIX SORTING & PINK TOOLTIPS 11481 11482### Important Events Sorting - ACTUALLY FIXED! 11483- **Fixed:** Important Events now REALLY sorted by date first, then time 11484- **Fixed:** renderSidebarSection was re-sorting and breaking the order 11485- **Changed:** Important Events use date-first sorting, Today/Tomorrow use time-only 11486 11487### Pink Theme Tooltip Bling! 11488- **Added:** Pink gradient tooltips (hot pink → light pink) 11489- **Added:** Glowing pink border on tooltips 11490- **Added:** Sparkling heart () appears next to tooltip! 11491- **Added:** Heart has pink glow drop-shadow 11492 11493### The Sorting Bug - Root Cause 11494 11495**Problem**: Two sorts were happening! 11496 11497**Sort #1** (Line 2047): Before rendering 11498```php 11499usort($importantEvents, ...) // Sort by date ✓ 11500``` 11501 11502**Sort #2** (Line 2751): Inside renderSidebarSection 11503```php 11504usort($events, ...) // Sort by TIME ONLY ✗ 11505// This was breaking the date order! 11506``` 11507 11508**The Fix**: Different sorting for different sections 11509```php 11510if ($title === 'Important Events') { 11511 // Sort by DATE first, then time 11512 usort($events, function($a, $b) { 11513 if ($dateA !== $dateB) { 11514 return strcmp($dateA, $dateB); // DATE first! 11515 } 11516 // Same date - sort by time 11517 return timeCompare($a, $b); 11518 }); 11519} else { 11520 // Today/Tomorrow - sort by TIME only (same date) 11521 usort($events, function($a, $b) { 11522 return timeCompare($a, $b); 11523 }); 11524} 11525``` 11526 11527**Result**: Important Events now CORRECTLY sorted! 11528``` 11529✓ Sun, Feb 8 - 3:30 PM Super Bowl 11530✓ Tue, Feb 10 - 11:30 AM Doctor visit 11531✓ Sat, Feb 14 - Valentine's Day (all-day) 11532✓ Sat, Feb 14 - 8:00 PM Crab Shack 11533``` 11534 11535### Pink Tooltip Magic! 11536 11537**Normal Tooltips**: Black background, plain 11538```css 11539background: rgba(0, 0, 0, 0.95); 11540color: #fff; 11541``` 11542 11543**Pink Theme Tooltips**: FABULOUS! 11544```css 11545/* Pink gradient background */ 11546background: linear-gradient(135deg, #ff1493 0%, #ff69b4 100%); 11547 11548/* Glowing pink border */ 11549border: 2px solid #ff85c1; 11550 11551/* Double glow shadow */ 11552box-shadow: 11553 0 0 15px rgba(255, 20, 147, 0.6), 11554 0 4px 12px rgba(0, 0, 0, 0.4); 11555 11556/* Bold text */ 11557font-weight: 600; 11558``` 11559 11560**Plus**: Sparkling heart next to tooltip! 11561```css 11562.sidebar-pink [data-tooltip]:after { 11563 content: ''; 11564 font-size: 12px; 11565 filter: drop-shadow(0 0 3px rgba(255, 20, 147, 0.8)); 11566} 11567``` 11568 11569**The Effect**: 11570``` 11571Hover over ⚠ conflict warning: 11572┌────────────────────┐ 11573│ Conflicts with: │ ← Pink gradient 11574│ • Event 1 (3PM) │ ← Pink border 11575│ • Event 2 (4PM) │ ← Pink glow 11576└────────────────────┘ 11577``` 11578 11579**Maximum glamour on tooltips too!** ✨ 11580 11581## Version 4.5.1 (2026-02-07) - FIX IMPORTANT EVENTS SORTING 11582 11583### Important Events Order Fixed 11584- **Fixed:** Important Events now sorted by date (earliest first) 11585- **Fixed:** Events on same date sorted by time (chronological) 11586- **Fixed:** All-day events appear last within each date 11587 11588### Sorting Issue 11589 11590**Before**: Random order 11591``` 11592Important Events: 11593 Valentine's Day (Sat, Feb 14) 1159411:30 AM Doctor visit (Tue, Feb 10) ← Feb 10 after Feb 14! 115953:30 PM Super Bowl (Sun, Feb 8) ← Feb 8 after Feb 14! 115968:00 PM Crab Shack (Sat, Feb 14) 11597``` 11598 11599**After**: Chronological order 11600``` 11601Important Events: 116023:30 PM Super Bowl (Sun, Feb 8) ← Earliest! 1160311:30 AM Doctor visit (Tue, Feb 10) 11604 Valentine's Day (Sat, Feb 14) ← All-day event 116058:00 PM Crab Shack (Sat, Feb 14) ← Same day, sorted by time 11606``` 11607 11608### Sorting Logic 11609 11610**Primary Sort**: By date 11611```php 11612strcmp($dateA, $dateB); // "2026-02-08" < "2026-02-14" 11613``` 11614 11615**Secondary Sort**: By time (within same date) 11616```php 11617// All-day events (no time) go last 11618if (empty($timeA) && !empty($timeB)) return 1; 11619if (!empty($timeA) && empty($timeB)) return -1; 11620 11621// Both have times - sort chronologically 11622$aMinutes = timeToMinutes($timeA); // "11:30" = 690 minutes 11623$bMinutes = timeToMinutes($timeB); // "20:00" = 1200 minutes 11624return $aMinutes - $bMinutes; // 690 < 1200 11625``` 11626 11627**Result**: 116281. Sun, Feb 8 - 3:30 PM (earliest date & time) 116292. Tue, Feb 10 - 11:30 AM (next date) 116303. Sat, Feb 14 - Valentine's Day (all-day, so last on Feb 14) 116314. Sat, Feb 14 - 8:00 PM (timed event on Feb 14) 11632 11633**Perfect chronological order for next 2 weeks!** ✓ 11634 11635## Version 4.5.0 (2026-02-07) - SPARKLE EDITION ✨ 11636 11637### EXTREME PINK BLING EFFECTS! 11638- **Added:** Click sparkles - 8 sparkles burst out on every click! 11639- **Added:** Auto-sparkles - random sparkles appear every 3 seconds 11640- **Added:** Hover mega-glow - sidebar glows BRIGHT on hover 11641- **Added:** Pulsing border glow - constantly breathing pink glow 11642- **Added:** Drop shadows on sparkles for extra depth 11643- **Added:** More sparkle emojis - hearts, diamonds, crowns, bows! 11644 11645### Sparkle Effects Breakdown 11646 11647**Click Sparkles** : 11648```javascript 11649// 8 sparkles burst out when you click anywhere! 11650for (let i = 0; i < 8; i++) { 11651 // Staggered appearance (40ms apart) 11652 createSparkle(x, y); 11653} 11654 11655// Sparkle emojis: 11656["✨", "", "", "⭐", "", "", "", "", "", ""] 11657``` 11658 11659**Each sparkle**: 11660- Starts at click point 11661- Flies outward 30-60px in random direction 11662- Spins 360 degrees 11663- Fades in and out 11664- Has pink glow drop-shadow 11665- Disappears after 1 second 11666 11667**Auto Sparkles** ⏰: 11668```javascript 11669// Random sparkle every 3 seconds 11670setInterval(() => { 11671 const x = Math.random() * width; 11672 const y = Math.random() * height; 11673 createSparkle(x, y); 11674}, 3000); 11675``` 11676 11677**Result**: Constant magical sparkles even without clicking! ✨ 11678 11679**Hover Mega-Glow** : 11680```css 11681.sidebar-pink:hover { 11682 box-shadow: 11683 0 0 30px rgba(255, 20, 147, 0.9), 11684 0 0 50px rgba(255, 20, 147, 0.5) !important; 11685} 11686``` 11687 11688**Result**: Sidebar EXPLODES with pink glow when you hover over it! 11689 11690**Pulsing Border Glow** : 11691```css 11692@keyframes pulse-glow { 11693 0%, 100% { 11694 box-shadow: 0 0 10px rgba(255, 20, 147, 0.4); 11695 } 11696 50% { 11697 box-shadow: 11698 0 0 25px rgba(255, 20, 147, 0.8), 11699 0 0 40px rgba(255, 20, 147, 0.4); 11700 } 11701} 11702 11703animation: pulse-glow 3s ease-in-out infinite; 11704``` 11705 11706**Result**: Border continuously breathes with pink glow! 11707 11708**Sparkle Animation** : 11709```css 11710@keyframes sparkle { 11711 0% { 11712 opacity: 0; 11713 transform: translate(0, 0) scale(0) rotate(0deg); 11714 } 11715 50% { 11716 opacity: 1; 11717 transform: translate(halfway) scale(1) rotate(180deg); 11718 } 11719 100% { 11720 opacity: 0; 11721 transform: translate(far) scale(0) rotate(360deg); 11722 } 11723} 11724``` 11725 11726**Result**: Sparkles spin, grow, shrink, and fly! 11727 11728### Complete Pink Bling Experience: 11729 11730**Always Active**: 11731- ✨ Pulsing pink border glow (3 second cycle) 11732- ✨ Auto-sparkles every 3 seconds 11733 11734**On Hover**: 11735- MEGA GLOW EFFECT (2x brightness!) 11736 11737**On Click**: 11738- 8 sparkles EXPLODE outward! 11739- Random emojis (hearts, stars, diamonds, crowns!) 11740- Each sparkle spins 360° while flying 11741- Pink glow drop-shadow on each sparkle 11742 11743**The Result**: 11744- Click anywhere = SPARKLE EXPLOSION! 11745- Hover anywhere = MEGA GLOW! ✨ 11746- Always breathing and sparkling! 11747- Maximum glamour! 11748- Wife approval: 1000%! 11749 11750**THIS IS THE MOST FABULOUS CALENDAR EVER!** ✨ 11751 11752## Version 4.4.2 (2026-02-07) - FINAL PINK POLISH 11753 11754### Pink Theme Final Touches 11755- **Fixed:** Add Event text now black (was bright pink, hard to read) 11756- **Fixed:** Clock border now COMPLETELY pink on all sides (no more green!) 11757- **Removed:** Text shadow on Add Event button (cleaner with black text) 11758 11759### Add Event Text - Black & Readable! 11760 11761**Before**: Bright pink text (#ff1493) on dark pink background 11762```php 11763$addBtnTextColor = $themeStyles['text_bright']; // #ff1493 - hard to read! 11764text-shadow: 0 0 3px #ff1493; // Glowy pink 11765``` 11766 11767**After**: Black text, no shadow, perfect contrast! 11768```php 11769$addBtnTextColor = $theme === 'pink' ? '#000000' : ...; 11770$addBtnTextShadow = $theme === 'pink' ? 'none' : ...; 11771``` 11772 11773**Result**: 11774- Black text pops against dark pink background ✓ 11775- Easy to read ✓ 11776- Professional look with bling ✓ 11777 11778### Clock Border - All Pink! 11779 11780**The Problem**: Inline style only set `border-bottom`, CSS set other sides to green 11781 11782**Before**: 11783```php 11784// Inline style (only bottom): 11785style="border-bottom:2px solid #ff1493;" 11786 11787// CSS (all sides): 11788.eventlist-today-header { 11789 border: 2px solid #00cc07; // Green on top/sides! 11790} 11791``` 11792 11793**After**: Inline style overrides ALL sides 11794```php 11795style="border:2px solid #ff1493;" // All 4 sides pink! 11796``` 11797 11798**Result**: Clock box now 100% pink border on all four sides! ✓ 11799 11800### What Changed: 11801 11802**Add Event Button**: 11803- Background: #b8156f (dark pink) ✓ 11804- Text: **#000000 (black)** ← NEW! 11805- Text shadow: **none** ← NEW! 11806- Glow: 0 0 10px pink ✓ 11807 11808**Clock Border**: 11809- Top: **#ff1493 (pink)** ← FIXED! 11810- Right: **#ff1493 (pink)** ← FIXED! 11811- Bottom: #ff1493 (pink) ✓ 11812- Left: **#ff1493 (pink)** ← FIXED! 11813 11814**Perfect pink theme - wife approved!** ✨ 11815 11816## Version 4.4.1 (2026-02-07) - PINK THEME PERFECTION 11817 11818### Pink Theme Complete Makeover 11819- **Fixed:** Clock border now completely pink (was green on sides/top) 11820- **Changed:** Today/Tomorrow/Important sections now different shades of pink 11821- **Changed:** Add Event button now dark pink (was clashing blue) 11822- **Changed:** System status bars now pink gradient (3 shades!) 11823 11824### All-Pink Everything! 11825 11826**Clock Border**: 11827```css 11828/* Before: Green border */ 11829border: 2px solid #00cc07; 11830 11831/* After: Hot pink border */ 11832.sidebar-pink .eventlist-today-header { 11833 border-color: #ff1493; 11834 box-shadow: 0 0 10px rgba(255, 20, 147, 0.4); 11835} 11836``` 11837 11838**Section Colors** (Different Pink Shades): 11839```php 11840// Before: Orange, green, purple 11841'Today' => '#ff9800', 11842'Tomorrow' => '#4caf50', 11843'Important' => '#9b59b6' 11844 11845// After: Hot pink, pink, light pink 11846'Today' => '#ff1493', // Hot pink (DeepPink) 11847'Tomorrow' => '#ff69b4', // Pink (HotPink) 11848'Important' => '#ff85c1' // Light pink 11849``` 11850 11851**Add Event Button**: 11852```php 11853// Before: Clashing blue 11854background: #3498db; 11855 11856// After: Dark pink with glow 11857background: #b8156f; // Dark pink 11858hover: #8b0f54; // Darker pink 11859shadow: 0 0 10px rgba(255, 20, 147, 0.5); 11860``` 11861 11862**System Status Bars** (Pink Gradient): 11863```css 11864/* 5-min load average */ 11865.sidebar-pink .eventlist-cpu-fill { 11866 background: #ff1493; /* Hot pink */ 11867 box-shadow: 0 0 5px rgba(255, 20, 147, 0.7); 11868} 11869 11870/* Realtime CPU */ 11871.sidebar-pink .eventlist-cpu-fill-purple { 11872 background: #ff69b4; /* Pink */ 11873 box-shadow: 0 0 5px rgba(255, 105, 180, 0.7); 11874} 11875 11876/* Memory */ 11877.sidebar-pink .eventlist-cpu-fill-orange { 11878 background: #ff85c1; /* Light pink */ 11879 box-shadow: 0 0 5px rgba(255, 133, 193, 0.7); 11880} 11881``` 11882 11883### Pink Theme Visual Hierarchy: 11884 11885**Darkest → Lightest Pink Shades**: 118861. Add Event button: #b8156f (dark pink) 118872. Today section: #ff1493 (hot pink / deep pink) 118883. System bar 1: #ff1493 (hot pink) 118894. Tomorrow section: #ff69b4 (pink) 118905. System bar 2: #ff69b4 (pink) 118916. Important section: #ff85c1 (light pink) 118927. System bar 3: #ff85c1 (light pink) 11893 11894**Result**: Beautiful pink gradient throughout entire sidebar! ✨ 11895 11896### What's Pink Now: 11897 11898✅ Sidebar background & border 11899✅ **Clock border** ← FIXED! 11900✅ Header gradient 11901✅ Week grid 11902✅ **Add Event button** ← FIXED! 11903✅ **Today section** ← Different shade! 11904✅ **Tomorrow section** ← Different shade! 11905✅ **Important section** ← Different shade! 11906✅ Event text & bars 11907✅ **System status bars** ← All 3 different pink shades! 11908✅ All shadows & glows 11909 11910**EVERYTHING is pink and fabulous!** ✨ 11911 11912## Version 4.4.0 (2026-02-07) - PINK BLING THEME & PROFESSIONAL SHADOWS 11913 11914### ✨ New Theme: Pink Bling! 11915- **Added:** Glamorous hot pink theme with maximum sparkle 11916- **Features:** Deep pink (#ff1493), extra glow, hearts and diamonds aesthetic 11917- **Perfect for:** Fabulous calendars that demand attention ✨ 11918 11919### Professional Theme Shadow Fix 11920- **Fixed:** Section headers now have subtle shadow (not glow) 11921- **Fixed:** Clicked day panel header has proper shadow 11922 11923### Pink Bling Theme Colors 11924 11925**Background & Borders**: 11926```php 11927'bg' => '#1a0d14', // Dark rich pink-black 11928'border' => '#ff1493', // Hot pink (DeepPink) 11929'shadow' => 'rgba(255, 20, 147, 0.4)', // Strong pink glow 11930``` 11931 11932**Text Colors**: 11933```php 11934'text_primary' => '#ff69b4', // Hot pink 11935'text_bright' => '#ff1493', // Deep pink 11936'text_dim' => '#ff85c1', // Light pink 11937``` 11938 11939**Week Grid**: 11940```php 11941'grid_bg' => '#2d1a24', // Dark purple-pink 11942'cell_bg' => '#1a0d14', // Dark 11943'cell_today_bg' => '#3d2030', // Highlighted purple-pink 11944``` 11945 11946**Special Effects**: 11947```php 11948'bar_glow' => '0 0 5px', // Extra sparkly glow! 11949'header_shadow' => '0 0 12px rgba(255, 20, 147, 0.6)' // Maximum bling! 11950``` 11951 11952### Professional Theme Shadow Fix 11953 11954**Before**: Section headers had colored glow 11955```php 11956box-shadow: 0 0 8px #3498db; // Blue glow - wrong! 11957``` 11958 11959**After**: Section headers have subtle shadow 11960```php 11961$headerShadow = ($theme === 'professional') ? 11962 '0 2px 4px rgba(0, 0, 0, 0.15)' : // Shadow for professional 11963 '0 0 8px ' . $accentColor; // Glow for others 11964``` 11965 11966**Result**: 11967- **Matrix/Purple/Pink**: Colored glow on headers ✓ 11968- **Professional**: Clean grey shadow (no glow) ✓ 11969 11970### All Four Themes: 11971 11972** Matrix Edition**: 11973- Dark green (#00cc07) 11974- Neon glow effects 11975- Hacker aesthetic 11976 11977** Purple Dream**: 11978- Elegant purple (#9b59b6) 11979- Violet glow effects 11980- Royal aesthetic 11981 11982** Professional Blue**: 11983- Clean grey/blue (#4a90e2) 11984- Subtle shadows (NO glow) 11985- Corporate aesthetic 11986 11987** Pink Bling** (NEW!): 11988- Hot pink (#ff1493) 11989- MAXIMUM sparkle & glow 11990- Glamorous aesthetic ✨ 11991 11992### Technical Implementation 11993 11994**Theme Added To**: 11995- `getSidebarThemeStyles()` - color definitions 11996- `getSidebarTheme()` - validation 11997- `saveSidebarTheme()` - admin save 11998- Admin panel - UI with preview 11999- All shadow/glow calculations 12000- JavaScript theme colors 12001- Clicked day panel colors 12002 12003**Perfect for users who want FABULOUS pink calendars!** ✨ 12004 12005## Version 4.3.1 (2026-02-07) - REDUCE TEXT GLOW & CONSISTENCY 12006 12007### Text Glow Refinement 12008- **Changed:** Reduced text glow from 3px to 2px (less intense) 12009- **Fixed:** Clicked day panel now has same text glow as sections 12010 12011### Text Glow Reduction 12012 12013**Before**: Text glow was too strong (3px) 12014```php 12015// Sections: 12016text-shadow: 0 0 3px #00cc07; // Too bright! 12017 12018// Clicked day panel: 12019text-shadow: 0 0 3px #00cc07; // Too bright! 12020``` 12021 12022**After**: Subtler text glow (2px) 12023```php 12024// Sections: 12025text-shadow: 0 0 2px #00cc07; // Just right ✓ 12026 12027// Clicked day panel: 12028text-shadow: 0 0 2px #00cc07; // Just right ✓ 12029``` 12030 12031**Visual Impact**: 12032- **Matrix**: Softer green glow, easier to read 12033- **Purple**: Softer purple glow, more elegant 12034- **Professional**: Still no glow (clean) 12035 12036### Consistency Fix 12037 12038**Before**: Sections had glow, clicked day panel had NO glow 12039 12040**After**: Both sections AND clicked day panel have matching subtle glow 12041 12042**Where Glow Appears**: 12043- ✅ Today section event text 12044- ✅ Tomorrow section event text 12045- ✅ Important section event text 12046- ✅ **Clicked day panel event text** ← NOW CONSISTENT! 12047 12048**Result**: 12049- Glow is less intense and easier on eyes ✓ 12050- All event text has consistent styling ✓ 12051- Matrix/Purple themes more refined ✓ 12052 12053### Technical Details 12054 12055**PHP (Sections)**: 12056```php 12057$textShadow = ($theme === 'professional') ? '' : 'text-shadow:0 0 2px ' . $titleColor . ';'; 12058``` 12059 12060**JavaScript (Clicked Day Panel)**: 12061```javascript 12062themeColors.text_shadow = 'text-shadow:0 0 2px #00cc07'; // Or purple 12063eventHTML += "style='...color:" + color + "; " + themeColors.text_shadow + ";'"; 12064``` 12065 12066**Perfect consistency and subtle elegance!** ✨ 12067 12068## Version 4.3.0 (2026-02-07) - IMPORTANT EVENTS FUTURE + REMOVE GREY 12069 12070### ✨ Important Events Enhancement 12071- **Changed:** Important events now show from next 2 weeks (not just current week) 12072- **Fixed:** Important events on Sunday after current week now visible 12073- **Changed:** Events loaded 2 weeks into future for Important section 12074 12075### Background Cleanup 12076- **Removed:** Grey/white backgrounds from Today/Tomorrow/Important sections 12077- **Removed:** Grey backgrounds from individual events 12078- **Result:** Clean transparent backgrounds, original dark Matrix look restored 12079 12080### Important Events - Future Coverage 12081 12082**Before**: Only showed Important events from current week 12083```php 12084if ($isImportant && $dateKey >= $weekStart && $dateKey <= $weekEnd) { 12085 $importantEvents[] = $event; 12086} 12087``` 12088 12089**After**: Shows Important events from today through next 2 weeks 12090```php 12091// Load events 2 weeks out 12092$twoWeeksOut = date('Y-m-d', strtotime($weekEnd . ' +14 days')); 12093 12094// Show all important events from today forward 12095if ($isImportant && $dateKey >= $todayStr) { 12096 $importantEvents[] = $event; 12097} 12098``` 12099 12100**Example**: 12101- Today: Saturday Feb 7 12102- Current week: Sun Feb 1 → Sat Feb 7 12103- Important events shown: Feb 7 → Feb 21 (today + 14 days) 12104 12105**Result**: Important events on Sunday Feb 8 (next week) now visible! ✓ 12106 12107### Background Removal 12108 12109**Before**: Light grey/white backgrounds added 12110```php 12111// Section background: 12112$sectionBg = 'rgba(255, 255, 255, 0.05)'; // Grey overlay 12113 12114// Event background: 12115$eventBg = 'rgba(255, 255, 255, 0.03)'; // Grey overlay 12116``` 12117 12118**After**: No backgrounds (transparent) 12119```php 12120// Section: No background property 12121<div style="padding:4px 0;"> 12122 12123// Event: No background property 12124<div style="padding:4px 6px; ..."> 12125``` 12126 12127**Result**: 12128- Clean, dark Matrix aesthetic restored ✓ 12129- Purple theme darker and more elegant ✓ 12130- Professional theme still has its light grey sidebar bg ✓ 12131- Events stand out with just color bars and borders ✓ 12132 12133### What Changed: 12134 12135**Sections (Today/Tomorrow/Important)**: 12136- ❌ No more grey overlay 12137- ✓ Transparent background 12138- ✓ Colored borders & glows remain 12139 12140**Individual Events**: 12141- ❌ No more grey overlay 12142- ✓ Transparent background 12143- ✓ Colored bars & borders remain 12144 12145**Perfect! Back to the original clean dark look with future Important events!** 12146 12147## Version 4.2.6 (2026-02-07) - FIX SECTION SHADOWS & DESCRIPTION COLOR 12148 12149### Final Theme Polish 12150- **Fixed:** Today/Tomorrow/Important section shadows now match theme 12151- **Fixed:** Event description text color now uses theme dim color 12152 12153### Section Shadow Fix 12154 12155**Problem**: Sections always had green glow regardless of theme 12156 12157**Before**: 12158```php 12159// Hardcoded green: 12160box-shadow: 0 0 5px rgba(0, 204, 7, 0.2); 12161``` 12162 12163**After**: 12164```php 12165// Theme-aware: 12166$sectionShadow = $theme === 'matrix' ? '0 0 5px rgba(0, 204, 7, 0.2)' : 12167 ($theme === 'purple' ? '0 0 5px rgba(155, 89, 182, 0.2)' : 12168 '0 2px 4px rgba(0, 0, 0, 0.1)'); 12169``` 12170 12171**Result**: 12172- **Matrix**: Green glow around sections ✓ 12173- **Purple**: Purple glow around sections ✓ 12174- **Professional**: Subtle grey shadow (no glow) ✓ 12175 12176### Description Color Fix 12177 12178**Problem**: Description text always green in clicked day panel 12179 12180**Before**: 12181```javascript 12182color: #00aa00; // Always green 12183``` 12184 12185**After**: 12186```javascript 12187color: themeColors.text_dim; // Theme dim color 12188``` 12189 12190**Result**: 12191- **Matrix**: Dim green (#00aa00) ✓ 12192- **Purple**: Dim purple (#8e7ab8) ✓ 12193- **Professional**: Grey (#7f8c8d) ✓ 12194 12195### Now 100% Theme Consistent 12196 12197Every single visual element respects theme: 12198- ✅ Sidebar background & border 12199- ✅ Header colors & shadows 12200- ✅ Week grid & cells 12201- ✅ Add Event button 12202- ✅ Section borders & **shadows** ← Fixed! 12203- ✅ Event titles & times 12204- ✅ Event **descriptions** ← Fixed! 12205- ✅ Clicked day panel 12206- ✅ Event bars & glows 12207 12208**Absolute perfection across all three themes!** ✨ 12209 12210## Version 4.2.5 (2026-02-07) - CLICKED DAY PANEL THEMES & GREY BACKGROUND 12211 12212### Theme Improvements 12213- **Fixed:** Clicked day panel now uses correct theme colors 12214- **Changed:** Professional Blue background now light grey (not white) 12215- **Added:** Theme colors passed to JavaScript for dynamic rendering 12216 12217### Clicked Day Panel Theming 12218 12219**Before**: Always blue regardless of theme 12220```javascript 12221// Hardcoded blue: 12222color:#00cc07; // Always green 12223background:#3498db; // Always blue 12224``` 12225 12226**After**: Theme-aware colors 12227```php 12228// PHP passes theme to JavaScript: 12229window.themeColors_XXX = { 12230 text_primary: '#00cc07' or '#b19cd9' or '#2c3e50', 12231 text_bright: '#00dd00' or '#d4a5ff' or '#4a90e2', 12232 text_shadow: '0 0 3px ...' or '', 12233 event_bg: 'rgba(...)', 12234 border_color: 'rgba(...)', 12235 bar_shadow: '0 0 3px' or '0 1px 2px rgba(...)' 12236}; 12237 12238// JavaScript uses theme colors: 12239color: themeColors.text_primary; 12240background: themeColors.event_bg; 12241``` 12242 12243**Result**: 12244- Matrix: Green panel with green glow ✓ 12245- Purple: Purple panel with purple glow ✓ 12246- Professional: Blue panel, no glow, clean ✓ 12247 12248### Professional Theme Background Change 12249 12250**Before**: Almost white (#f5f7fa, #ffffff) 12251```php 12252'bg' => '#f5f7fa', // Very light 12253'cell_bg' => '#ffffff', // Pure white 12254``` 12255 12256**After**: Light grey tones 12257```php 12258'bg' => '#e8ecf1', // Soft grey-blue 12259'cell_bg' => '#f5f7fa', // Light grey 12260'grid_bg' => '#d5dbe3', // Medium grey 12261'cell_today_bg' => '#dce8f7' // Highlighted grey-blue 12262``` 12263 12264**Visual Impact**: 12265- Sidebar: Light grey-blue background (#e8ecf1) 12266- Week cells: Lighter grey (#f5f7fa) 12267- Today cell: Highlighted blue-grey (#dce8f7) 12268- More depth and contrast ✓ 12269- Professional appearance ✓ 12270 12271### All Theme Elements Now Consistent 12272 12273**Matrix (Green)**: 12274- Sidebar: Dark (#242424) 12275- Clicked panel: Dark with green 12276- Text: Green with glow 12277 12278**Purple Dream**: 12279- Sidebar: Dark purple (#2a2030) 12280- Clicked panel: Dark with purple 12281- Text: Purple with glow 12282 12283**Professional Blue**: 12284- Sidebar: Light grey (#e8ecf1) 12285- Clicked panel: Light with blue 12286- Text: Dark grey, no glow 12287 12288**Perfect theme consistency everywhere!** 12289 12290## Version 4.2.4 (2026-02-07) - FIX TOMORROW LOADING & DOUBLE ENCODING 12291 12292### Critical Fixes 12293- **Fixed:** Tomorrow events not loaded when outside current week 12294- **Fixed:** `&` showing instead of `&` (double HTML encoding) 12295 12296### Issue 1: Tomorrow Not Loading 12297 12298**Problem**: Sidebar only loaded events for current week 12299- Today (Saturday): Week ends today 12300- Tomorrow (Sunday): Start of NEXT week 12301- Tomorrow events never loaded from data files! 12302 12303**Before**: 12304```php 12305// Only load current week 12306$end = new DateTime($weekEnd); 12307$end->modify('+1 day'); 12308$period = new DatePeriod($start, $interval, $end); 12309// If tomorrow > weekEnd, it's not in period! 12310``` 12311 12312**After**: 12313```php 12314// Check if tomorrow is outside week 12315$tomorrowDate = date('Y-m-d', strtotime('+1 day')); 12316if ($tomorrowDate > $weekEnd) { 12317 // Extend to include tomorrow 12318 $end = new DateTime($tomorrowDate); 12319} 12320$end->modify('+1 day'); 12321$period = new DatePeriod($start, $interval, $end); 12322``` 12323 12324**Result**: Tomorrow events now loaded even at week boundary! ✓ 12325 12326### Issue 2: Double HTML Encoding 12327 12328**Problem**: `&` characters showing as `&` 12329 12330**Cause**: Double encoding on line 2625 and 2681 12331```php 12332// Line 2625: 12333$title = htmlspecialchars($event['title']); // "Coffee & Tea" → "Coffee & Tea" 12334 12335// Line 2681: 12336$html .= htmlspecialchars($title); // "Coffee & Tea" → "Coffee &amp; Tea" ❌ 12337``` 12338 12339**Fixed**: 12340```php 12341// Line 2625: 12342$title = htmlspecialchars($event['title']); // Encode once 12343 12344// Line 2681: 12345$html .= $title; // Use already-encoded value ✓ 12346``` 12347 12348**Result**: `&` displays correctly! ✓ 12349 12350### Both Fixes Critical 12351 12352These were **two separate bugs**: 123531. **Loading bug**: Tomorrow events not read from files 123542. **Display bug**: Double-encoding text 12355 12356Both needed fixing for Tomorrow section to work properly! 12357 12358## Version 4.2.3 (2026-02-07) - FIX TOMORROW SECTION AT WEEK BOUNDARY 12359 12360### Critical Fix 12361- **Fixed:** Tomorrow section missing when tomorrow is outside current week 12362- **Fixed:** Today section now always shows regardless of week boundaries 12363- **Changed:** Today/Tomorrow processed BEFORE week boundary checks 12364 12365### The Problem 12366 12367**Scenario**: Today is Saturday (last day of week) 12368- Week: Feb 1 (Sun) → Feb 7 (Sat) ← Today 12369- Tomorrow: Feb 8 (Sun) ← **Start of NEXT week** 12370 12371**BROKEN Logic** (v4.2.2): 12372```php 12373foreach ($events as $dateKey => $dayEvents) { 12374 if ($dateKey < $weekStart) continue; // Skip old events 12375 12376 // ...week processing... 12377 12378 if ($dateKey === $tomorrowStr) { // ← Never reached! 12379 $tomorrowEvents[] = $event; // Tomorrow > weekEnd 12380 } 12381} 12382``` 12383 12384**Result**: Tomorrow events never added because loop skipped them! ❌ 12385 12386### The Fix 12387 12388**Process Today/Tomorrow FIRST**: 12389```php 12390foreach ($events as $dateKey => $dayEvents) { 12391 $eventsWithConflicts = $this->detectTimeConflicts($dayEvents); 12392 12393 foreach ($eventsWithConflicts as $event) { 12394 // ALWAYS process Today and Tomorrow first! 12395 if ($dateKey === $todayStr) { 12396 $todayEvents[] = $event; // ✓ Always shows 12397 } 12398 if ($dateKey === $tomorrowStr) { 12399 $tomorrowEvents[] = $event; // ✓ Always shows 12400 } 12401 12402 // THEN check week boundaries for grid 12403 if ($dateKey >= $weekStart && $dateKey <= $weekEnd) { 12404 $weekEvents[$dateKey][] = $event; 12405 } 12406 12407 // Important events still week-only 12408 if ($isImportant && $dateKey >= $weekStart && $dateKey <= $weekEnd) { 12409 $importantEvents[] = $event; 12410 } 12411 } 12412} 12413``` 12414 12415### What Changed 12416 12417**Before**: 124181. Skip events < weekStart ❌ 124192. Process week grid 124203. Try to add Today/Tomorrow ← **Failed if outside week** 124214. Add Important events 12422 12423**After**: 124241. **Always add Today events** ✓ 124252. **Always add Tomorrow events** ✓ 124263. Add to week grid if in range 124274. Add Important events if in range 12428 12429**Result**: 12430- Today section: ✓ Always shows 12431- Tomorrow section: ✓ Always shows (even at week boundary!) 12432- Week grid: ✓ Only current week 12433- Important: ✓ Only current week 12434 12435### Edge Cases Fixed 12436 12437**Saturday → Sunday transition**: 12438- Today (Sat): Shows in Today section ✓ 12439- Tomorrow (Sun): Shows in Tomorrow section ✓ 12440- Week grid: Only shows Sat (today) ✓ 12441 12442**Sunday → Monday transition**: 12443- Today (Sun): Shows in Today section ✓ 12444- Tomorrow (Mon): Shows in Tomorrow section ✓ 12445- Week grid: Shows both Sun and Mon ✓ 12446 12447**Perfect! Tomorrow section now always works!** 12448 12449## Version 4.2.2 (2026-02-07) - SUNDAY NOT SATURDAY! 12450 12451### Corrected Week Options 12452- **Changed:** Week start options are now Monday vs **Sunday** (not Saturday!) 12453- **Changed:** Default is **Sunday** (US/Canada standard) 12454- **Fixed:** Day names array for Sunday start: S M T W T F S 12455 12456### Correct Week Start Options 12457 12458**Sunday Start** (Default): 12459- Grid shows: **S M T W T F S** 12460- Week: Sunday → Saturday 12461- US/Canada standard 12462- Most common worldwide 12463 12464**Monday Start**: 12465- Grid shows: **M T W T F S S** 12466- Week: Monday → Sunday 12467- ISO 8601 standard 12468- Common in Europe 12469 12470### Technical Changes 12471 12472**All References Updated**: 12473```php 12474// Changed from 'saturday' to 'sunday' in: 12475- Admin validation 12476- Week calculation logic 12477- Day names array 12478- Default value 12479- Comments 12480``` 12481 12482**Sunday Calculation** (when today is Saturday): 12483```php 12484$today = date('w'); // 0=Sun, 6=Sat 12485if ($today == 0) { 12486 $weekStart = date('Y-m-d'); // Today! 12487} else { 12488 // Go back $today days to last Sunday 12489 $weekStart = date('Y-m-d', strtotime('-' . $today . ' days')); 12490} 12491``` 12492 12493**Examples**: 12494- Today (Saturday): Week = Sun Feb 1 → Sat Feb 7 12495- Tomorrow (Sunday): Week = Sun Feb 8 → Sat Feb 14 12496 12497**Sorry for the confusion - it's Sunday not Saturday!** 12498 12499## Version 4.2.1 (2026-02-07) - FIX WEEK CALCULATION ON SATURDAY 12500 12501### Critical Fix 12502- **Fixed:** Week calculation broken when today is Saturday 12503- **Fixed:** Events not showing in Today/Important sections 12504- **Fixed:** Week grid event bars missing 12505- **Changed:** Default week start is Saturday (matches main calendar) 12506 12507### Technical Details 12508 12509**The Bug**: 12510```php 12511// BROKEN (v4.2.0): 12512$weekStart = date('Y-m-d', strtotime('saturday this week')); 12513// When TODAY is Saturday, this is ambiguous and fails! 12514 12515// FIXED (v4.2.1): 12516$today = date('w'); // 0 (Sun) to 6 (Sat) 12517if ($today == 6) { 12518 $weekStart = date('Y-m-d'); // Today! 12519} else { 12520 $daysBack = ($today == 0) ? 1 : ($today + 1); 12521 $weekStart = date('Y-m-d', strtotime('-' . $daysBack . ' days')); 12522} 12523$weekEnd = date('Y-m-d', strtotime($weekStart . ' +6 days')); 12524``` 12525 12526**Why It Failed**: 12527- `strtotime('saturday this week')` is ambiguous when run ON a Saturday 12528- PHP may interpret it as "next Saturday" or fail 12529- Result: Week range was wrong, events filtered out 12530 12531**The Fix**: 12532- Explicit calculation using day-of-week math 12533- Saturday (day 6): weekStart = today 12534- Sunday (day 0): weekStart = yesterday 12535- Monday-Friday: calculate days back to last Saturday 12536 12537**Result**: Works reliably every day of the week! 12538 12539**Default Changed**: Saturday start (was Monday in 4.2.0) 12540- Matches main calendar behavior 12541- Users can still switch to Monday in settings 12542 12543## Version 4.2.0 (2026-02-07) - WEEK START DAY SELECTOR 12544 12545### ✨ New Feature 12546- **Added:** Week start day selector in Themes tab 12547- **Added:** Choose between Monday (ISO standard) or Saturday week start 12548- **Added:** Week grid and all events now respect the selected start day 12549- **Changed:** Themes tab renamed to "Sidebar Widget Settings" 12550 12551### Week Start Options 12552 12553**Monday Start** (Default): 12554- Grid shows: M T W T F S S 12555- Week runs: Monday → Sunday 12556- ISO 8601 standard 12557- Common in Europe, most of world 12558 12559**Saturday Start**: 12560- Grid shows: S S M T W T F 12561- Week runs: Saturday → Friday 12562- Common in Middle East 12563- Sabbath-observant communities 12564 12565### Technical Details 12566 12567**Configuration**: 12568```php 12569// Saved in: data/meta/calendar_week_start.txt 12570// Values: 'monday' or 'saturday' 12571 12572// Week calculation: 12573if ($weekStartDay === 'saturday') { 12574 $weekStart = date('Y-m-d', strtotime('saturday this week')); 12575 $weekEnd = date('Y-m-d', strtotime('friday next week')); 12576} else { 12577 $weekStart = date('Y-m-d', strtotime('monday this week')); 12578 $weekEnd = date('Y-m-d', strtotime('sunday this week')); 12579} 12580``` 12581 12582**Day Names Array**: 12583```php 12584// Monday start: ['M', 'T', 'W', 'T', 'F', 'S', 'S'] 12585// Saturday start: ['S', 'S', 'M', 'T', 'W', 'T', 'F'] 12586``` 12587 12588**What Changes**: 12589- Week grid day letters 12590- Week grid date sequence 12591- Today/Tomorrow/Important event date ranges 12592- Week event grouping 12593 12594**What Stays Same**: 12595- All themes still work 12596- Event data unchanged 12597- Main calendar unaffected 12598 12599### How to Change: 12600 126011. Admin → Calendar → Themes tab 126022. Under "Week Start Day" section 126033. Select Monday or Saturday 126044. Click "Save Settings" 126055. Refresh sidebar to see changes 12606 12607**Perfect for international users or religious observances!** 12608 12609## Version 4.1.4 (2026-02-07) - WEEK STARTS SUNDAY & LIGHTER BACKGROUNDS 12610 12611### ️ Calendar Improvements 12612- **Changed:** Week grid now starts on Sunday and ends on Saturday (matches main calendar) 12613- **Changed:** Event section backgrounds much lighter (almost white) 12614- **Changed:** Individual event backgrounds lighter and more readable 12615- **Changed:** Event borders now theme-colored 12616 12617### Technical Details 12618 12619**Week Start Change**: 12620```php 12621// Before: 12622$weekStart = date('Y-m-d', strtotime('monday this week')); 12623$weekEnd = date('Y-m-d', strtotime('sunday this week')); 12624$dayNames = ['M', 'T', 'W', 'T', 'F', 'S', 'S']; 12625 12626// After: 12627$weekStart = date('Y-m-d', strtotime('sunday this week')); 12628$weekEnd = date('Y-m-d', strtotime('saturday this week')); 12629$dayNames = ['S', 'M', 'T', 'W', 'T', 'F', 'S']; 12630``` 12631 12632**Background Colors**: 12633```php 12634// Section backgrounds (Today, Tomorrow, Important): 12635Matrix: rgba(255, 255, 255, 0.05) // Very light overlay 12636Purple: rgba(255, 255, 255, 0.08) // Slightly lighter 12637Professional: rgba(255, 255, 255, 0.95) // Almost white! 12638 12639// Individual event backgrounds: 12640Matrix: rgba(255, 255, 255, 0.03) // Subtle 12641Purple: rgba(255, 255, 255, 0.05) // Light 12642Professional: rgba(255, 255, 255, 0.5) // Semi-transparent white 12643``` 12644 12645**Event Borders**: 12646```php 12647Matrix: rgba(0, 204, 7, 0.2) // Green 12648Purple: rgba(155, 89, 182, 0.2) // Purple 12649Professional: rgba(74, 144, 226, 0.2) // Blue 12650``` 12651 12652### Visual Result: 12653 12654**Before**: Dark backgrounds made text hard to read 12655**After**: Light backgrounds make events pop and text very readable 12656 12657**Week Grid**: 12658``` 12659Before: [M][T][W][T][F][S][S] 12660After: [S][M][T][W][T][F][S] ← Now matches main calendar! 12661``` 12662 12663## Version 4.1.3 (2026-02-07) - EVENT TEXT THEME COLORS 12664 12665### Final Theme Polish 12666- **Fixed:** Event titles in Today/Tomorrow/Important sections now use theme colors 12667- **Fixed:** Event times now use theme bright color 12668- **Fixed:** Event dates use theme dim color 12669- **Fixed:** Task checkboxes use theme bright color 12670- **Fixed:** Event color bars use theme-appropriate shadows 12671- **Fixed:** No text shadows on Professional theme 12672 12673### Technical Details 12674 12675**Event Text Colors**: 12676```php 12677// Matrix: 12678- Title: #00cc07 (green) 12679- Time: #00dd00 (bright green) 12680- Date: #00aa00 (dim green) 12681- Text shadow: 0 0 3px (glow) 12682 12683// Purple: 12684- Title: #b19cd9 (lavender) 12685- Time: #d4a5ff (bright purple) 12686- Date: #8e7ab8 (dim purple) 12687- Text shadow: 0 0 3px (glow) 12688 12689// Professional: 12690- Title: #2c3e50 (dark grey) 12691- Time: #4a90e2 (blue) 12692- Date: #7f8c8d (grey) 12693- Text shadow: none (clean) 12694``` 12695 12696**Color Bar Shadows**: 12697```php 12698// Matrix & Purple: Glow effect 12699box-shadow: 0 0 3px [event-color]; 12700 12701// Professional: Subtle shadow 12702box-shadow: 0 1px 2px rgba(0,0,0,0.2); 12703``` 12704 12705### What's Now Fully Themed: 12706 12707✅ Sidebar background & border 12708✅ Header (clock box) background, border, text 12709✅ Week grid background, borders, cells 12710✅ Week grid day letters & numbers 12711✅ Week grid event bars & "+N more" text 12712✅ Add Event button background & text 12713✅ Today/Tomorrow/Important event titles 12714✅ Event times 12715✅ Event dates (Important section) 12716✅ Task checkboxes 12717✅ Event color bars 12718✅ All text shadows (glow vs none) 12719 12720**Every single element now respects the theme!** 12721 12722## Version 4.1.2 (2026-02-07) - COMPLETE THEME INTEGRATION 12723 12724### Theme Improvements 12725- **Fixed:** Week calendar grid now uses theme colors (purple/blue) 12726- **Fixed:** Add Event button now uses theme colors 12727- **Fixed:** Clock box border now matches theme 12728- **Fixed:** All text shadows respect theme (no glow on professional) 12729- **Fixed:** Event bars use theme-appropriate shadows 12730 12731### Technical Details 12732 12733**Week Grid Theming**: 12734```php 12735// Matrix: Dark green (#1a3d1a) background, green (#00cc07) borders 12736// Purple: Dark purple (#3d2b4d) background, purple (#9b59b6) borders 12737// Professional: Light grey (#e8ecf1) background, blue (#4a90e2) borders 12738``` 12739 12740**Add Event Button**: 12741```php 12742// Matrix: Dark green (#006400) with bright green text 12743// Purple: Purple (#7d3c98) with lavender text 12744// Professional: Blue (#3498db) with white text 12745``` 12746 12747**Text Shadows**: 12748```php 12749// Matrix & Purple: Glow effects (text-shadow: 0 0 6px color) 12750// Professional: No glow (clean look) 12751``` 12752 12753**CSS Overrides**: 12754```css 12755/* Purple theme */ 12756.sidebar-purple .eventlist-today-header { 12757 border-color: #9b59b6; 12758 box-shadow: 0 0 8px rgba(155, 89, 182, 0.2); 12759} 12760 12761/* Professional theme */ 12762.sidebar-professional .eventlist-today-header { 12763 border-color: #4a90e2; 12764 box-shadow: 0 2px 4px rgba(0, 0, 0, 0.1); 12765} 12766``` 12767 12768### What Changed Per Theme: 12769 12770**Purple Dream**: 12771- Week grid: Purple borders and dark purple background 12772- Add Event: Purple button with lavender text 12773- Clock box: Purple border with purple glow 12774- Event bars: Purple glow instead of green 12775- All text: Purple/lavender shades 12776 12777**Professional Blue**: 12778- Week grid: Blue borders and light grey background 12779- Add Event: Blue button with white text 12780- Clock box: Blue border with subtle shadow (no glow) 12781- Event bars: Subtle shadows (no glow) 12782- All text: Dark grey and blue shades 12783 12784**Matrix Edition**: Unchanged (still perfect green theme!) 12785 12786## Version 4.1.1 (2026-02-07) - THEMES TAB & TOOLTIP LEFT POSITIONING 12787 12788### ✨ New Features 12789- **Added:** Themes tab in admin for sidebar widget theming 12790- **Added:** Three visual themes: Matrix (green), Purple Dream (purple), Professional Blue (blue/grey) 12791- **Added:** Theme selector with live previews 12792- **Added:** Theme persistence across page loads 12793 12794### Available Themes 12795 12796**Matrix Edition** (Default): 12797- Dark background (#242424) 12798- Green accents (#00cc07) 12799- Neon glow effects 12800- Original Matrix styling 12801 12802**Purple Dream**: 12803- Dark purple background (#2a2030) 12804- Purple/violet accents (#9b59b6) 12805- Elegant purple glow 12806- Rich purple color scheme 12807 12808**Professional Blue**: 12809- Light grey background (#f5f7fa) 12810- Blue accents (#4a90e2) 12811- Clean professional look 12812- Subtle shadows instead of glow 12813 12814### Bug Fix 12815- **Fixed:** Tooltips now go UP and to the LEFT (was going right) 12816- **Changed:** Tooltip offset from `rect.right` to `rect.left - 150px` 12817 12818### Technical Details 12819 12820**Theme System**: 12821```php 12822// Saved in: data/meta/calendar_theme.txt 12823// Applied dynamically in syntax.php 12824$theme = $this->getSidebarTheme(); // 'matrix', 'purple', or 'professional' 12825$styles = $this->getSidebarThemeStyles($theme); 12826 12827// Styles include: 12828- bg, border, shadow 12829- header_bg, header_border, header_shadow 12830- text_primary, text_bright, text_dim 12831- grid_bg, grid_border 12832- cell_bg, cell_today_bg 12833``` 12834 12835**Theme Changes**: 12836- Header background gradient 12837- Border colors 12838- Text colors 12839- Shadow/glow effects 12840- Grid colors 12841 12842**How to Change**: 128431. Admin → Calendar → Themes tab 128442. Select desired theme 128453. Click "Save Theme" 128464. Refresh page to see changes 12847 12848### Notes 12849- Themes only affect sidebar widget appearance 12850- Main calendar view unchanged 12851- Theme setting stored in `data/meta/calendar_theme.txt` 12852- Safe to switch themes - no data affected 12853 12854## Version 4.1.0 (2026-02-07) - FIX EVENT SORTING & TOOLTIP POSITIONING 12855 12856### Bug Fixes 12857- **Fixed:** Events now sort chronologically by time (was using string comparison) 12858- **Fixed:** Tooltip positioning using JavaScript like system tooltips 12859- **Fixed:** All-day events appear first, then events in time order 12860 12861### Technical Details 12862 12863**Event Sorting Fix**: 12864```php 12865// BROKEN (v4.0.9): 12866return strcmp($aTime, $bTime); 12867// String comparison: "10:00" < "8:00" because "1" < "8" 12868// Result: 10:00 AM shown BEFORE 8:00 AM ❌ 12869 12870// FIXED (v4.1.0): 12871$aMinutes = $this->timeToMinutes($aTime); // 8:00 = 480 12872$bMinutes = $this->timeToMinutes($bTime); // 10:00 = 600 12873return $aMinutes - $bMinutes; 12874// Result: 8:00 AM shown BEFORE 10:00 AM ✓ 12875``` 12876 12877**Example Before Fix**: 12878``` 12879 Weekend Ticket Duty (all-day) 128808:00 AM START TICKETS 1288110:00 AM Soul Winning ← Wrong! 128829:45 AM Coffee ← Should be before 10:00 AM 12883``` 12884 12885**Example After Fix**: 12886``` 12887 Weekend Ticket Duty (all-day) 128888:00 AM START TICKETS 128899:45 AM Coffee ← Correct! 1289010:00 AM Soul Winning 12891``` 12892 12893**Tooltip Positioning**: 12894- Added JavaScript to dynamically position tooltips using `getBoundingClientRect()` 12895- Uses CSS custom properties `--tooltip-left` and `--tooltip-top` 12896- Positioned on `mouseenter` event 12897- Matches system tooltip implementation (no cutoff) 12898 12899**JavaScript Implementation**: 12900```javascript 12901element.addEventListener("mouseenter", function() { 12902 const rect = element.getBoundingClientRect(); 12903 element.style.setProperty("--tooltip-left", (rect.right - 10) + "px"); 12904 element.style.setProperty("--tooltip-top", (rect.top - 30) + "px"); 12905}); 12906``` 12907 12908**Result**: Tooltips now extend beyond sidebar without cutoff, positioned dynamically! 12909 12910## Version 4.0.9 (2026-02-07) - COMPACT TOOLTIPS & OVERFLOW FIX 12911 12912### UI Improvements 12913- **Fixed:** Sidebar tooltips no longer cut off at sidebar edge 12914- **Fixed:** Changed inline `overflow:hidden` to `overflow:visible` in sidebar 12915- **Changed:** Main calendar conflict tooltip now much smaller (was too big) 12916 12917### Technical Details 12918 12919**Sidebar Overflow Fix**: 12920```php 12921// Before (line 2005): 12922style="...overflow:hidden..." // ← Blocked tooltips! 12923 12924// After: 12925style="...overflow:visible..." // ← Tooltips extend beyond! 12926``` 12927 12928**The Problem**: Inline `overflow:hidden` overrode CSS `overflow:visible !important` 12929 12930**Main Calendar Tooltip Size**: 12931```css 12932/* Before: */ 12933.conflict-tooltip { 12934 border: 2px solid #ff9800; 12935 border-radius: 6px; 12936 padding: 8px 12px; 12937 font-size: 12px; 12938 min-width: 200px; 12939 max-width: 350px; 12940} 12941 12942/* After: */ 12943.conflict-tooltip { 12944 border: 1px solid #ff9800; /* Thinner */ 12945 border-radius: 3px; /* Smaller */ 12946 padding: 4px 8px; /* Less padding */ 12947 font-size: 10px; /* Smaller header */ 12948 min-width: 120px; /* Narrower */ 12949 max-width: 200px; /* Narrower */ 12950} 12951 12952.conflict-tooltip-body { 12953 padding: 6px 8px; /* Was 10px 12px */ 12954 font-size: 9px; /* Was 11px */ 12955 line-height: 1.4; /* Was 1.6 */ 12956} 12957 12958.conflict-item { 12959 padding: 2px 0; /* Was 4px */ 12960 font-size: 9px; /* Added smaller font */ 12961} 12962``` 12963 12964**Result**: 12965- Main calendar tooltip ~50% smaller 12966- Sidebar tooltips now extend beyond borders 12967- Both tooltips compact and readable 12968 12969## Version 4.0.8 (2026-02-07) - FIX NEWLINES IN TOOLTIP 12970 12971### Bug Fix 12972- **Fixed:** Tooltip now shows actual line breaks (not literal `\n` text) 12973- **Changed:** Using HTML entity ` ` for newlines instead of `\n` 12974 12975### Technical Details 12976 12977**The Problem**: 12978```php 12979// Before (v4.0.7): 12980$conflictTooltip = 'Conflicts with:\n'; // Literal \n showed in tooltip 12981 12982// Displayed as: 12983"Conflicts with:\n• Event 1\n• Event 2" // ← Literal backslash-n 12984``` 12985 12986**The Fix**: 12987```php 12988// After (v4.0.8): 12989$conflictTooltip = "Conflicts with: "; // HTML entity for newline 12990 12991// Displays as: 12992Conflicts with: 12993• Event 1 12994• Event 2 12995``` 12996 12997**Why ` ` Works**: 12998- HTML entity for line feed character 12999- Works in data attributes 13000- CSS `white-space: pre-line` preserves the newlines 13001- Renders as actual line breaks in tooltip 13002 13003**Applied to**: 13004- PHP rendering (sidebar Today/Tomorrow/Important) 13005- JavaScript rendering (clicked day events) 13006 13007## Version 4.0.7 (2026-02-07) - COMPACT TOOLTIP & OVERFLOW FIX 13008 13009### UI Improvements 13010- **Changed:** Tooltip size reduced significantly (much more compact) 13011- **Fixed:** Tooltip now overflows sidebar borders (not cut off) 13012- **Changed:** Smaller padding (3px vs 6px), smaller font (9px vs 11px) 13013- **Changed:** Narrower width (120-200px vs 200-300px) 13014 13015### Technical Details 13016 13017**Tooltip Size Reduction**: 13018```css 13019/* Before (v4.0.6): 13020padding: 6px 10px; 13021font-size: 11px; 13022min-width: 200px; 13023max-width: 300px; 13024 13025/* After (v4.0.7): */ 13026padding: 3px 6px; 13027font-size: 9px; 13028min-width: 120px; 13029max-width: 200px; 13030``` 13031 13032**Overflow Fix**: 13033```css 13034/* Allow tooltip to extend beyond sidebar */ 13035.sidebar-widget, 13036.sidebar-matrix { 13037 overflow: visible !important; 13038} 13039 13040/* Position tooltip outside */ 13041[data-tooltip]:before { 13042 bottom: 120%; /* Further above */ 13043 right: -10px; /* Can extend beyond edge */ 13044 z-index: 10000; /* Always on top */ 13045} 13046``` 13047 13048**Visual Result**: 13049- Tooltip is ~40% smaller 13050- Extends beyond sidebar border if needed 13051- Still readable, just more compact 13052- Better for small screens 13053 13054## Version 4.0.6 (2026-02-07) - MATCH MAIN CALENDAR LOGIC & TOOLTIP POSITIONING 13055 13056### Critical Fix 13057- **Fixed:** Sidebar conflict detection now matches main calendar logic exactly 13058- **Fixed:** Checks both `end_time` (snake_case) and `endTime` (camelCase) field names 13059- **Fixed:** Events without end time now treated as zero-duration (not +1 hour) 13060- **Fixed:** Now matches what you see in main calendar view 13061 13062### ✨ UI Improvement 13063- **Changed:** Conflict tooltips now appear ABOVE and to the LEFT (not below/right) 13064- **Added:** Custom CSS tooltip with data-tooltip attribute 13065- **Improved:** Better tooltip positioning - doesn't overflow screen edges 13066 13067### Technical Details 13068 13069**The Problem - Field Name Mismatch**: 13070```php 13071// Main calendar (line 697): 13072$end1 = isset($evt1['endTime']) ? ... // ← Checks 'endTime' (camelCase) 13073 13074// Sidebar (before fix): 13075$endTime = isset($event['end_time']) ? ... // ← Only checked 'end_time' (snake_case) 13076``` 13077 13078**The Problem - Duration Logic**: 13079```php 13080// Main calendar (line 697): 13081$end1 = isset($evt1['endTime']) && !empty($evt1['endTime']) 13082 ? $evt1['endTime'] 13083 : $evt1['time']; // ← Uses START time (zero duration) 13084 13085// Sidebar (before fix): 13086$endTime = ... ? ... : $this->addHoursToTime($startTime, 1); // ← Added 1 hour! 13087``` 13088 13089**The Fix**: 13090```php 13091// Now checks BOTH field names: 13092if (isset($event['end_time']) && $event['end_time'] !== '') { 13093 $endTime = $event['end_time']; 13094} elseif (isset($event['endTime']) && $event['endTime'] !== '') { 13095 $endTime = $event['endTime']; 13096} else { 13097 $endTime = $startTime; // ← Matches main calendar! 13098} 13099``` 13100 13101**Tooltip Positioning**: 13102- Uses `data-tooltip` attribute instead of `title` 13103- CSS positions tooltip ABOVE badge (`bottom: 100%`) 13104- Aligns to RIGHT edge (`right: 0`) 13105- Arrow points down to badge 13106- Black background with white text 13107- Max width 300px 13108 13109### Example 13110 13111**6:00 PM Evening Service** (no end time): 13112- Old: 6:00 PM - 7:00 PM (assumed 1 hour) ❌ 13113- New: 6:00 PM - 6:00 PM (zero duration) ✓ Matches main calendar! 13114 13115**3:30 PM-7:00 PM Super Bowl** vs **6:00 PM Service**: 13116- Zero-duration events at 6:00 PM don't overlap with anything 13117- ONLY if service has explicit end time (e.g., 6:00-7:00) will it conflict 13118 13119**Tooltip appears**: 13120``` 13121 ┌────────────────────┐ 13122 │ Conflicts with: │ 13123 │ • Super Bowl │ 13124 │ (3:30 PM-7:00 PM)│ 13125 └─────────┬──────────┘ 13126 ▼ 13127 ⚠ 13128``` 13129 13130## Version 4.0.5 (2026-02-07) - FIX END_TIME DEFAULT HANDLING 13131 13132### Bug Fix 13133- **Fixed:** Events without end_time now properly get 1-hour default duration 13134- **Fixed:** Empty string end_time values now treated as missing (was causing issues) 13135- **Improved:** More robust checking for `end_time` field (checks both isset and not empty) 13136 13137### Technical Details 13138 13139**The Problem**: 13140```php 13141// Before (broken): 13142$endTime = isset($event['end_time']) ? $event['end_time'] : default; 13143 13144// If end_time exists but is empty string "": 13145isset($event['end_time']) = TRUE 13146$endTime = "" // ← Empty string, not default! 13147``` 13148 13149**The Fix**: 13150```php 13151// After (fixed): 13152$endTime = (isset($event['end_time']) && $event['end_time'] !== '') 13153 ? $event['end_time'] 13154 : $this->addHoursToTime($startTime, 1); 13155 13156// Now empty string gets the default 1-hour duration 13157``` 13158 13159**Why This Matters**: 13160Events 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. 13161 13162**Example**: 13163``` 13164Super Bowl: 3:30 PM - 7:00 PM 13165Evening Service: 6:00 PM - ??? (should be 7:00 PM) 13166 13167If end_time = "" (empty string): 13168 Old code: Uses "" → conflict detection fails 13169 New code: Uses 7:00 PM → conflict detected ✓ 13170``` 13171 13172### Testing 13173If you're still not seeing the conflict on the 6:00 PM service: 131741. Check if the event has `end_time` set in the JSON 131752. Clear cache (Admin → Manage Events → Clear Cache) 131763. The conflict should now appear 13177 13178## Version 4.0.4 (2026-02-07) - CONFLICT TOOLTIP WITH DETAILS 13179 13180### ✨ Feature Added 13181- **Added:** Hover over ⚠ badge to see which events are conflicting 13182- **Added:** Tooltip shows conflicting event titles and times 13183- **Added:** Works in both sidebar sections and clicked day events 13184 13185### Technical Details 13186 13187**Conflict Tracking Enhanced**: 13188```php 13189// Now tracks WHICH events conflict: 13190$event['conflictingWith'] = [ 13191 ['title' => 'Meeting', 'time' => '10:00', 'end_time' => '11:00'], 13192 ['title' => 'Call', 'time' => '10:30', 'end_time' => '11:30'] 13193]; 13194``` 13195 13196**Tooltip Format**: 13197``` 13198Conflicts with: 13199• Meeting (10:00 AM-11:00 AM) 13200• Call (10:30 AM-11:30 PM) 13201``` 13202 13203**Where It Works**: 13204- ✅ Today section (sidebar) 13205- ✅ Tomorrow section (sidebar) 13206- ✅ Important Events section (sidebar) 13207- ✅ Clicked day events (week grid) 13208 13209**Cursor**: Changes to `help` cursor on hover to indicate tooltip 13210 13211### Note on Multi-Day Events 13212The 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. 13213 13214## Version 4.0.3 (2026-02-07) - FIX CONFLICT BADGE & IMPORTANT EVENTS LOGIC 13215 13216### Bug Fixes 13217- **Fixed:** Conflict badge (⚠) now displays in sidebar Today/Tomorrow/Important sections 13218- **Fixed:** Important Events now shows events even if they're today or tomorrow 13219- **Fixed:** Field name mismatch - was checking `'conflicts'` (plural) but setting `'conflict'` (singular) 13220 13221### Technical Details 13222 13223**Conflict Badge Issue**: 13224```php 13225// BROKEN (line 2511): 13226$hasConflict = isset($event['conflicts']) && !empty($event['conflicts']); 13227// ↑ Checking 'conflicts' (plural) 13228 13229// But detectTimeConflicts() sets: 13230$event['conflict'] = true/false; 13231// ↑ Setting 'conflict' (singular) 13232 13233// FIXED: 13234$hasConflict = isset($event['conflict']) && $event['conflict']; 13235``` 13236 13237**Result**: Badge now shows for ALL conflicting events in sidebar sections 13238 13239**Important Events Logic Issue**: 13240```php 13241// BROKEN: 13242if ($dateKey === $todayStr) { 13243 $todayEvents[] = ...; 13244} elseif ($dateKey === $tomorrowStr) { 13245 $tomorrowEvents[] = ...; 13246} else { // ← Only checked if NOT today/tomorrow! 13247 if ($isImportant) { 13248 $importantEvents[] = ...; 13249 } 13250} 13251 13252// FIXED: 13253if ($dateKey === $todayStr) { 13254 $todayEvents[] = ...; 13255} 13256if ($dateKey === $tomorrowStr) { 13257 $tomorrowEvents[] = ...; 13258} 13259// ↑ Changed to separate 'if' statements 13260if ($isImportant && $dateKey in this week) { 13261 $importantEvents[] = ...; // ← Now includes today/tomorrow too! 13262} 13263``` 13264 13265**Result**: Important namespace events now show in Important section even if they're today or tomorrow 13266 13267### Conflict Badge Display 13268- Simplified to just ⚠ icon (no count) 13269- Orange color (#ff9800) 13270- 10px font size 13271- Hover shows "Time conflict detected" 13272 13273## Version 4.0.2 (2026-02-07) - FIX IMPORTANT EVENTS DISPLAY 13274 13275### Bug Fix 13276- **Fixed:** Important Events section now displays all events correctly 13277- **Fixed:** Single-event days now get conflict flag (was returning early without flag) 13278- **Fixed:** Conflict detection no longer causes events to disappear from Important section 13279 13280### Technical Details 13281 13282**The Problem**: 13283- `detectTimeConflicts()` returned early if only 1 event on a day 13284- Returned original array without adding 'conflict' field 13285- This inconsistency caused issues in event categorization 13286 13287**The Solution**: 13288```php 13289// Before (broken): 13290if (empty($dayEvents) || count($dayEvents) < 2) { 13291 return $dayEvents; // No 'conflict' field added! 13292} 13293 13294// After (fixed): 13295if (count($dayEvents) === 1) { 13296 return [array_merge($dayEvents[0], ['conflict' => false])]; // Always add flag 13297} 13298``` 13299 13300**Result**: 13301- All events now have 'conflict' field consistently 13302- Single events: conflict = false 13303- Multiple events: conflict = true/false based on overlap 13304- Important Events section displays correctly 13305 13306## Version 4.0.1 (2026-02-06) - CONFLICT DETECTION, TAB REORDER, FIXES 13307 13308### Bug Fixes 13309- **Fixed:** Conflict badge (⚠) now displays in clicked day events 13310- **Fixed:** Recurring events edit now updates time and end_time correctly 13311- **Fixed:** Field names changed from 'start'/'end' to 'time'/'end_time' in recurring edit 13312 13313### ✨ Features Added 13314- **Added:** Time conflict detection for overlapping events 13315- **Added:** detectTimeConflicts() function checks all events on same day 13316- **Added:** timesOverlap(), timeToMinutes(), addMinutesToTime() helper functions 13317- **Added:** Events now have 'conflict' flag set automatically 13318 13319### UI Changes 13320- **Changed:** Admin tab order: Manage Events (first), Update Plugin, ⚙️ Outlook Sync 13321- **Changed:** Default admin tab is now "Manage Events" (was "Update Plugin") 13322- **Changed:** Week view now shows 4 colored event bars before "+1" (was 3 bars) 13323 13324### Technical Details 13325 13326**Conflict Detection**: 13327```php 13328// Automatically detects overlapping events on same day 13329// Sets 'conflict' flag to true if event overlaps with another 13330$eventsWithConflicts = $this->detectTimeConflicts($dayEvents); 13331``` 13332 13333**Logic**: 13334- All-day events never conflict (no time set) 13335- Timed events check for overlap with other timed events 13336- Overlap = start1 < end2 AND start2 < end1 13337- Default duration is 60 minutes if no end_time 13338 13339**Recurring Events Fix**: 13340- Old: Updated `$event['start']` and `$event['end']` (wrong fields) 13341- New: Updates `$event['time']` and `$event['end_time']` (correct fields) 13342- Now edits actually save and update the events 13343 13344**Week View Bars**: 13345- Shows 4 colored bars instead of 3 13346- "+1" becomes "+2" with 5 events, "+3" with 6 events, etc. 13347 13348## Version 4.0.0 (2026-02-06) - MATRIX EDITION RELEASE 13349 13350**Major Release**: Complete Matrix-themed calendar plugin with advanced features! 13351 13352### Major Features 13353 13354#### Sidebar Widget 13355- **Week Grid**: Interactive 7-day calendar with click-to-view events 13356- **Live System Monitoring**: CPU load, real-time CPU, memory usage with tooltips 13357- **Live Clock**: Updates every second with date display 13358- **Real-time Weather**: Geolocation-based temperature with icon 13359- **Event Sections**: Today (orange), Tomorrow (green), Important (purple) 13360- **Add Event Button**: Dark green bar opens full event creation dialog 13361- **Matrix Theme**: Green glow effects throughout 13362 13363#### Event Management 13364- **Single Color Bars**: Clean 3px bars showing event's assigned color 13365- **All-Day Events First**: Then sorted chronologically by time 13366- **Conflict Detection**: Orange ⚠ badge on overlapping events 13367- **Rich Content**: Full DokuWiki formatting (**bold**, [[links]], //italic//) 13368- **HTML Rendering**: Pre-rendered for JavaScript display 13369- **Click-to-View**: Click week grid days to expand event details 13370 13371#### Admin Interface 13372- **Update Plugin Tab** (Default): Version info, changelog, prominent Clear Cache button 13373- **Outlook Sync Tab**: Microsoft Azure integration, category mapping, sync settings 13374- **Manage Events Tab**: Browse, edit, delete, move events across namespaces 13375 13376#### Outlook Sync 13377- **Bi-directional Sync**: DokuWiki ↔ Microsoft Outlook 13378- **Category Mapping**: Map colors to Outlook categories 13379- **Conflict Resolution**: Time conflict detection 13380- **Import/Export Config**: Encrypted configuration files 13381 13382### Design 13383- **Matrix Theme**: Authentic green glow aesthetic 13384- **Dark Backgrounds**: #1a1a1a header, rgba(36, 36, 36) sections 13385- **Color Scheme**: 13386 - Today: Orange #ff9800 13387 - Tomorrow: Green #4caf50 13388 - Important: Purple #9b59b6 13389 - Add Event: Dark green #006400 13390 - System bars: Green/Purple/Orange 13391 13392### Technical Highlights 13393- **Zero-margin Design**: Perfect flush alignment throughout 13394- **Flexbox Layout**: Modern, responsive structure 13395- **AJAX Operations**: No page reloads needed 13396- **Smart Sorting**: All-day events first, then chronological 13397- **Tooltip System**: Detailed stats on hover (working correctly) 13398- **Event Dialog**: Full form with drag support 13399- **Cache Management**: One-click cache clearing 13400 13401### Breaking Changes from v3.x 13402- Removed dual color bars (now single event color bar only) 13403- Add Event button moved to between header and week grid 13404- All-day events now appear FIRST (not last) 13405- Update Plugin tab is now the default admin tab 13406 13407### Bug Fixes (v3.10.x → v4.0.0) 13408- ✅ Fixed color bars not showing (align-self:stretch vs height:100%) 13409- ✅ Fixed tooltip function naming (sanitized calId for JavaScript) 13410- ✅ Fixed weather display (added updateWeather function) 13411- ✅ Fixed HTML rendering in events (title_html/description_html fields) 13412- ✅ Fixed Add Event dialog (null check for calendar element) 13413- ✅ Fixed text positioning in Add Event button 13414- ✅ Fixed spacing throughout sidebar widget 13415 13416### Complete Feature List 13417- Full calendar view (month grid) 13418- Sidebar widget (week view) 13419- Event panel (standalone) 13420- Event list (date ranges) 13421- Namespace support 13422- Color coding 13423- Time conflict detection 13424- DokuWiki syntax in events 13425- Outlook synchronization 13426- System monitoring 13427- Weather display 13428- Live clock 13429- Admin interface 13430- Cache management 13431- Draggable dialogs 13432- AJAX save/edit/delete 13433- Import/export config 13434 13435### Usage 13436 13437**Sidebar Widget**: 13438``` 13439{{calendar sidebar}} 13440{{calendar sidebar namespace=team}} 13441``` 13442 13443**Full Calendar**: 13444``` 13445{{calendar}} 13446{{calendar year=2026 month=6 namespace=team}} 13447``` 13448 13449**Event Panel**: 13450``` 13451{{eventpanel}} 13452``` 13453 13454**Event List**: 13455``` 13456{{eventlist daterange=2026-01-01:2026-01-31}} 13457``` 13458 13459### Stats 13460- **40+ versions** developed during v3.x iterations 13461- **3.10.0 → 3.11.4**: Polish and refinement 13462- **4.0.0**: Production-ready Matrix Edition 13463 13464### Credits 13465Massive iteration and refinement session resulting in a polished, feature-complete calendar plugin with authentic Matrix aesthetics and enterprise-grade Outlook integration. 13466 13467--- 13468 13469## Previous Versions (v3.11.4 and earlier) 13470 13471## Version 3.11.4 (2026-02-06) - RESTORE HEADER BOTTOM SPACING 13472- **Changed:** Restored 2px bottom padding to header (was 0px, now 2px) 13473- **Improved:** Small breathing room between system stats bars and Add Event button 13474- **Visual:** Better spacing for cleaner appearance 13475 13476### CSS Change: 13477**eventlist-today-header**: 13478- `padding: 6px 10px 0 10px` → `padding: 6px 10px 2px 10px` 13479 13480### Visual Result: 13481``` 13482│ ▓▓▓░░ ▓▓░░░ ▓▓▓▓░ │ ← Stats bars 13483│ │ ← 2px space (restored) 13484├───────────────────────┤ 13485│ + ADD EVENT │ ← Add Event bar 13486├───────────────────────┤ 13487``` 13488 13489**Before (v3.11.3)**: No space, bars directly touch Add Event button 13490**After (v3.11.4)**: 2px breathing room for better visual hierarchy 13491 13492## Version 3.11.3 (2026-02-06) - FIX ADD EVENT DIALOG & TEXT POSITION 13493- **Fixed:** openAddEvent() function now checks if calendar element exists before reading dataset 13494- **Fixed:** Add Event button no longer throws "Cannot read properties of null" error 13495- **Changed:** Add Event text moved up 1px (position:relative; top:-1px) 13496- **Changed:** Line-height reduced from 12px to 10px for better text centering 13497- **Improved:** openAddEvent() works for both regular calendars and sidebar widgets 13498 13499### JavaScript Fix: 13500**Problem**: Line 1084-1085 in calendar-main.js 13501```javascript 13502const calendar = document.getElementById(calId); 13503const filteredNamespace = calendar.dataset.filteredNamespace; // ← Null error! 13504``` 13505 13506**Solution**: Added null check 13507```javascript 13508const calendar = document.getElementById(calId); 13509const filteredNamespace = calendar ? calendar.dataset.filteredNamespace : null; 13510``` 13511 13512**Why This Happened**: 13513- Regular calendar has element with id=calId 13514- Sidebar widget doesn't have this element (different structure) 13515- Code tried to read .dataset on null, causing error 13516 13517### Text Position Fix: 13518**Before**: 13519- line-height: 12px 13520- vertical-align: middle 13521- Text slightly low 13522 13523**After**: 13524- line-height: 10px 13525- position: relative; top: -1px 13526- Text perfectly centered 13527 13528### What Works Now: 13529✅ Click "+ ADD EVENT" in sidebar → Dialog opens 13530✅ No console errors 13531✅ Text properly centered vertically 13532✅ Form pre-filled with today's date 13533✅ Save works correctly 13534 13535## Version 3.11.2 (2026-02-06) - ADD EVENT DIALOG IN SIDEBAR 13536- **Added:** Event dialog to sidebar widget (same as regular calendar) 13537- **Changed:** Add Event button now opens proper event form dialog 13538- **Added:** renderEventDialog() called in renderSidebarWidget() 13539- **Fixed:** Add Event button calls openAddEvent() with calId, namespace, and today's date 13540- **Improved:** Can now add events directly from sidebar widget 13541 13542### Add Event Button Behavior: 13543**Before (v3.11.1)**: Showed alert with instructions 13544**After (v3.11.2)**: Opens full event creation dialog 13545 13546**Dialog Features**: 13547- Date field (defaults to today) 13548- Title field (required) 13549- Time field (optional) 13550- End time field (optional) 13551- Color picker 13552- Category field 13553- Description field 13554- Save and Cancel buttons 13555- Draggable dialog 13556 13557### Technical Changes: 13558- Added `$html .= $this->renderEventDialog($calId, $namespace);` at end of renderSidebarWidget() 13559- Changed Add Event onclick from alert to `openAddEvent('calId', 'namespace', 'YYYY-MM-DD')` 13560- Dialog uses same structure as regular calendar 13561- Uses existing openAddEvent() and saveEventCompact() JavaScript functions 13562 13563### User Flow: 135641. User clicks "+ ADD EVENT" green bar 135652. Event dialog opens with today's date pre-filled 135663. User fills in event details 135674. User clicks Save 135685. Event saved via AJAX 135696. Dialog closes 135707. Sidebar refreshes to show new event 13571 13572## Version 3.11.1 (2026-02-06) - FLUSH HEADER & ADD EVENT DIALOG 13573- **Fixed:** Removed bottom padding from header (was 2px, now 0) 13574- **Fixed:** Removed margin from stats container (was margin-top:2px, now margin:0) 13575- **Fixed:** Add Event bar now flush against header with zero gap 13576- **Changed:** Add Event button now shows helpful alert dialog instead of navigating to admin 13577- **Improved:** Alert provides clear instructions on how to add events 13578 13579### CSS Changes: 13580**eventlist-today-header**: 13581- `padding: 6px 10px 2px 10px` → `padding: 6px 10px 0 10px` (removed 2px bottom) 13582 13583**eventlist-stats-container**: 13584- `margin-top: 2px` → `margin: 0` (removed all margins) 13585 13586### Add Event Button Behavior: 13587**Before**: Clicked → Navigated to Admin → Manage Events tab 13588**After**: Clicked → Shows alert with instructions 13589 13590**Alert Message**: 13591``` 13592To add an event, go to: 13593Admin → Calendar Management → Manage Events tab 13594or use the full calendar view {{calendar}} 13595``` 13596 13597### Visual Result: 13598``` 13599│ ▓▓▓░░ ▓▓░░░ ▓▓▓▓░ │ ← Stats (no margin-bottom) 13600├────────────────────────┤ 13601│ + ADD EVENT │ ← Perfectly flush! 13602├────────────────────────┤ 13603``` 13604 13605No gaps, perfectly aligned! 13606 13607## Version 3.11.0 (2026-02-06) - ADD EVENT BAR FINAL POSITION & SIZE 13608- **Moved:** Add Event bar back to original position (between header and week grid) 13609- **Changed:** Font size reduced from 9px to 8px (prevents text cutoff) 13610- **Changed:** Letter spacing reduced from 0.5px to 0.4px 13611- **Fixed:** Text now fully visible without being cut off 13612- **Final:** Optimal position and size determined 13613 13614### Final Layout: 13615``` 13616┌─────────────────────────────┐ 13617│ Clock | Weather | Stats │ ← Header 13618├─────────────────────────────┤ 13619│ + ADD EVENT │ ← Bar (back here, smaller text) 13620├─────────────────────────────┤ 13621│ M T W T F S S │ ← Week Grid 13622│ 3 4 5 6 7 8 9 │ 13623├─────────────────────────────┤ 13624│ Today │ ← Event sections 13625└─────────────────────────────┘ 13626``` 13627 13628### Text Size Changes: 13629**v3.10.9**: 9px font, 0.5px letter-spacing → Text slightly cut off 13630**v3.11.0**: 8px font, 0.4px letter-spacing → Text fully visible 13631 13632### Why This Position: 13633- Separates header from calendar 13634- Natural action point after viewing stats 13635- Users see stats → decide to add event → view calendar 13636- Consistent with original design intent 13637 13638## Version 3.10.9 (2026-02-06) - ADD EVENT BAR MOVED BELOW WEEK GRID 13639- **Moved:** Add Event bar repositioned from between header/grid to below week grid 13640- **Improved:** Better visual flow - header → stats → grid → add button → events 13641- **Changed:** Add Event bar now acts as separator between calendar and event sections 13642 13643### New Layout: 13644``` 13645┌─────────────────────────────┐ 13646│ Clock | Weather | Stats │ ← Header 13647├─────────────────────────────┤ 13648│ M T W T F S S │ ← Week Grid 13649│ 3 4 5 6 7 8 9 │ 13650├─────────────────────────────┤ 13651│ + ADD EVENT │ ← Add bar (moved here!) 13652├─────────────────────────────┤ 13653│ Today │ ← Event sections 13654│ Tomorrow │ 13655│ Important Events │ 13656└─────────────────────────────┘ 13657``` 13658 13659### Visual Flow: 13660**Before (v3.10.8)**: 136611. Header (clock, weather, stats) 136622. **+ ADD EVENT** bar 136633. Week grid 136644. Event sections 13665 13666**After (v3.10.9)**: 136671. Header (clock, weather, stats) 136682. Week grid (calendar days) 136693. **+ ADD EVENT** bar 136704. Event sections 13671 13672### Benefits: 13673- Natural reading flow: View calendar → Add event → See events 13674- Add button positioned between calendar and event list 13675- Acts as visual separator 13676- More logical action placement 13677 13678## Version 3.10.8 (2026-02-06) - SINGLE COLOR BAR & ZERO MARGIN ADD BAR 13679- **Removed:** Section color bar (blue/orange/green/purple) - now shows ONLY event color 13680- **Changed:** Events now display with single 3px color bar (event's assigned color only) 13681- **Fixed:** Add Event bar now has zero margin (margin:0) - touches header perfectly 13682- **Simplified:** Cleaner visual with one color bar instead of two 13683- **Improved:** More space for event content without extra bar 13684 13685### Visual Changes: 13686 13687**Before (v3.10.7)** - Dual color bars: 13688``` 13689├─ [Orange][Green] Event Title 13690├─ [Blue][Purple] Event Title 13691``` 13692 13693**After (v3.10.8)** - Single color bar: 13694``` 13695├─ [Green] Event Title ← Only event color! 13696├─ [Purple] Event Title ← Only event color! 13697``` 13698 13699### Add Bar Changes: 13700- Added `margin:0` to eliminate gaps 13701- Now flush against header (no space above) 13702- Now flush against week grid (no space below) 13703- Perfect seamless connection 13704 13705### Technical Changes: 13706**renderSidebarEvent()**: 13707- Removed section color bar (4px) 13708- Kept only event color bar (3px) 13709 13710**showDayEvents() JavaScript**: 13711- Removed section color bar (4px blue) 13712- Kept only event color bar (3px) 13713 13714**Add Event bar**: 13715- Added `margin:0` inline style 13716- Removed all top/bottom margins 13717 13718## Version 3.10.7 (2026-02-06) - COLOR BARS FIX FOR SECTIONS & DARK GREEN ADD BAR 13719- **Fixed:** Color bars now display in Today/Tomorrow/Important sections (was only showing in clicked day) 13720- **Fixed:** Changed Today/Tomorrow/Important event rendering to use `align-self:stretch` instead of `height:100%` 13721- **Changed:** Add Event bar color from orange to dark green (#006400) 13722- **Changed:** Add Event bar height increased from 6px to 12px (text no longer cut off) 13723- **Changed:** Add Event bar text now bright green (#00ff00) with green glow 13724- **Changed:** Add Event bar font size increased from 7px to 9px 13725- **Changed:** Add Event bar letter spacing increased to 0.5px 13726- **Improved:** Hover effect on Add Event bar now darker green (#004d00) 13727 13728### Color Bar Fix Details: 13729**Problem**: Today/Tomorrow/Important sections still used `height:100%` on color bars 13730**Solution**: Applied same fix as clicked day events: 13731- Changed parent div: `align-items:start` → `align-items:stretch` 13732- Added `min-height:20px` to parent 13733- Changed bars: `height:100%` → `align-self:stretch` 13734- Bars now properly fill vertical space in ALL sections 13735 13736### Add Event Bar Changes: 13737**Before**: 13738- Background: Orange (#ff9800) 13739- Text: Black (#000) 13740- Height: 6px (text cut off) 13741- Font: 7px 13742 13743**After**: 13744- Background: Dark green (#006400) 13745- Text: Bright green (#00ff00) with green glow 13746- Height: 12px (text fully visible) 13747- Font: 9px 13748- Hover: Darker green (#004d00) 13749- Matrix-themed green aesthetic 13750 13751## Version 3.10.6 (2026-02-06) - COLOR BARS FIX, SORTING REVERSAL, CONFLICT BADGE, README UPDATE 13752- **Fixed:** Event color bars now display correctly in clicked day events 13753- **Fixed:** Changed sorting - all-day events now appear FIRST, then timed events 13754- **Added:** Conflict badge (⚠) appears on right side of conflicting events 13755- **Updated:** Complete README.md rewrite with full Matrix theme documentation 13756- **Changed:** Color bars use `align-self:stretch` instead of `height:100%` (fixes rendering) 13757- **Changed:** Parent div uses `align-items:stretch` and `min-height:20px` 13758- **Improved:** Content wrapper now uses flexbox for proper conflict badge positioning 13759 13760### Color Bar Fix: 13761**Problem**: Bars had `height:100%` but parent had no explicit height 13762**Solution**: 13763- Changed to `align-self:stretch` on bars 13764- Parent uses `align-items:stretch` 13765- Added `min-height:20px` to parent 13766- Bars now properly fill vertical space 13767 13768### Sorting Change: 13769**Before**: Timed events first → All-day events last 13770**After**: All-day events FIRST → Timed events chronologically 13771 13772**Example**: 13773``` 13774Monday, Feb 5 13775├─ All Day - Project Deadline ← All-day first 13776├─ 8:00 AM - Morning Standup ← Earliest time 13777├─ 10:30 AM - Coffee with Bob 13778└─ 2:00 PM - Team Meeting ← Latest time 13779``` 13780 13781### Conflict Badge: 13782- Orange warning triangle (⚠) on right side 13783- 10px font size 13784- Only appears if `event.conflict` is true 13785- Title attribute shows "Time conflict detected" 13786- Small and unobtrusive 13787 13788### README Update: 13789- Complete rewrite with Matrix theme focus 13790- Full usage instructions for all features 13791- Admin interface documentation 13792- Outlook sync setup guide 13793- System monitoring details 13794- Troubleshooting section 13795- Color scheme reference 13796- File structure documentation 13797- Performance tips 13798- Security notes 13799- Quick start examples 13800 13801## Version 3.10.5 (2026-02-06) - TIME SORTING & THINNER ADD BAR 13802- **Added:** Events now sorted by time when clicking week grid days 13803- **Changed:** Add Event bar now ultra-thin (6px height, down from 12px) 13804- **Improved:** Events with times appear first, sorted chronologically 13805- **Improved:** All-day events appear after timed events 13806- **Changed:** Add Event bar font size reduced to 7px (from 10px) 13807- **Changed:** Add Event bar now has 0 padding and fixed 6px height 13808 13809### Sorting Logic: 13810- Events with times sorted by time (earliest first) 13811- All-day events (no time) appear at the end 13812- Sort algorithm: Convert time to minutes (HH:MM → total minutes) and compare 13813- Chronological order: 8:00 AM → 10:30 AM → 2:00 PM → All-day event 13814 13815### Add Event Bar Changes: 13816- **Height**: 6px (was ~12px with padding) 13817- **Padding**: 0 (was 4px top/bottom) 13818- **Font Size**: 7px (was 10px) 13819- **Letter Spacing**: 0.3px (was 0.5px) 13820- **Line Height**: 6px to match height 13821- **Vertical Align**: Middle for text centering 13822 13823## Version 3.10.4 (2026-02-06) - ADD EVENT BAR 13824- **Added:** Thin orange "Add Event" bar between header and week grid 13825- **Added:** Quick access to event creation from sidebar widget 13826- **Styled:** Sleek design with hover effects and glow 13827- **Interactive:** Clicks navigate to Manage Events tab in admin 13828- **Improved:** User workflow for adding events from sidebar 13829 13830### Visual Design: 13831- Orange background (#ff9800) matching Today section color 13832- 4px top/bottom padding for thin, sleek appearance 13833- Black text with white text-shadow for visibility 13834- Hover effect: Darkens to #ff7700 with enhanced glow 13835- Orange glow effect (box-shadow) matching Matrix theme 13836- Centered "+ ADD EVENT" text (10px, bold, letter-spacing) 13837 13838### Technical Changes: 13839- Added between header close and renderWeekGrid() call 13840- Inline onclick handler navigates to admin manage tab 13841- Inline onmouseover/onmouseout for hover effects 13842- Smooth 0.2s transition on all style changes 13843 13844## Version 3.10.3 (2026-02-06) - UI IMPROVEMENTS & CACHE BUTTON RELOCATION 13845- **Changed:** Update Plugin tab is now the default tab when opening admin 13846- **Moved:** Clear Cache button relocated from Outlook Sync tab to Update Plugin tab 13847- **Improved:** Clear Cache button now larger and more prominent with helpful description 13848- **Improved:** Tab order reorganized: Update Plugin (default) → Outlook Sync → Manage Events 13849- **Removed:** Debug console.log statements from day event display 13850- **Fixed:** Cache clear now redirects back to Update Plugin tab instead of Config tab 13851 13852### UI Changes: 13853- Update Plugin tab opens by default (was Config/Outlook Sync tab) 13854- Clear Cache button prominently displayed at top of Update Plugin tab 13855- Orange ️ button (10px 20px padding) with confirmation dialog 13856- Help text: "Clear the DokuWiki cache if changes aren't appearing or after updating the plugin" 13857- Success/error messages display on Update Plugin tab after cache clear 13858- Tab navigation reordered to put Update first 13859 13860### Technical Changes: 13861- Default tab changed from 'config' to 'update' in html() method 13862- Tab navigation HTML reordered to show Update Plugin tab first 13863- clearCache() method now redirects with 'update' tab parameter 13864- Removed Clear Cache button from renderConfigTab() 13865- Added Clear Cache button to renderUpdateTab() with message display 13866 13867## Version 3.10.2 (2026-02-06) - EVENT HTML RENDERING FIX 13868- **Fixed:** Event formatting (bold, links, italic) now displays correctly when clicking week grid days 13869- **Added:** renderDokuWikiToHtml() helper function to convert DokuWiki syntax to HTML 13870- **Changed:** Events in weekEvents now pre-rendered with title_html and description_html fields 13871- **Improved:** DokuWiki syntax (**bold**, [[links]], //italic//, etc.) properly rendered in clicked day events 13872 13873### Technical Changes: 13874- Added renderDokuWikiToHtml() private function using p_get_instructions() and p_render() 13875- Events added to weekEvents now include pre-rendered HTML versions 13876- title_html and description_html fields populated before json_encode() 13877- JavaScript now receives properly formatted HTML content 13878 13879## Version 3.10.1 (2026-02-06) - TOOLTIP FIX & WEATHER & CACHE BUTTON 13880- **Fixed:** System tooltip functions now use sanitized calId (showTooltip_sidebar_abc123 instead of showTooltip_sidebar-abc123) 13881- **Fixed:** HTML event handlers now call correctly sanitized function names 13882- **Fixed:** Weather temperature now updates correctly in sidebar widget 13883- **Added:** Weather update function to sidebar widget JavaScript 13884- **Added:** "Clear Cache" button in admin panel for easy cache refresh 13885- **Added:** Default weather location set to Irvine, CA when geolocation unavailable 13886- **Improved:** All tooltip functions now work correctly on system status bars 13887 13888### Technical Changes: 13889- Changed tooltip function names to use $jsCalId instead of $calId 13890- Changed HTML onmouseover/onmouseout to use $jsCalId 13891- Added updateWeather() function to sidebar widget 13892- Added getWeatherIcon() function to sidebar widget 13893- Added clearCache() method in admin.php 13894- Added recursiveDelete() helper method in admin.php 13895- Admin UI now has ️ Clear Cache button alongside Export/Import 13896 13897## Version 3.10.0 (2026-02-06) - JAVASCRIPT FIXES 13898- **Fixed:** JavaScript syntax error "Missing initializer in const declaration" 13899- **Fixed:** Event links and formatting not displaying in clicked day events 13900- **Fixed:** Sanitized calId to jsCalId by replacing dashes with underscores 13901- **Changed:** Event titles now use `title_html` field to preserve HTML formatting 13902- **Changed:** Event descriptions now use `description_html` field to preserve links and formatting 13903- **Improved:** All JavaScript variable names now use valid syntax 13904- **Improved:** Links, bold, italic, and other HTML formatting preserved in events 13905 13906### Technical Changes: 13907- Added variable sanitization: `$jsCalId = str_replace('-', '_', $calId);` 13908- JavaScript variables now use underscores instead of dashes 13909- Event HTML rendering preserves DokuWiki formatting 13910- Fixed "showTooltip_sidebar is not defined" errors 13911- Fixed "showDayEvents_cal is not defined" errors 13912 13913## Version 3.9.9 (2026-02-06) - JAVASCRIPT LOADING ORDER FIX 13914- **Fixed:** Critical JavaScript loading order issue causing ReferenceError 13915- **Fixed:** Functions now defined BEFORE HTML that uses them 13916- **Changed:** Consolidated all JavaScript into single comprehensive script block 13917- **Removed:** ~290 lines of duplicate JavaScript code 13918- **Added:** Shared state management with `sharedState_[calId]` object 13919- **Improved:** System tooltip functions now work correctly 13920- **Improved:** Week grid click events now work correctly 13921 13922### Technical Changes: 13923- Moved all JavaScript to beginning of widget (before HTML) 13924- Removed duplicate script blocks 13925- Unified tooltip and stats functions 13926- Shared latestStats and cpuHistory state 13927- Fixed "Uncaught ReferenceError: showTooltip_sidebar is not defined" 13928 13929## Version 3.9.8 (2026-02-05) - DUAL COLOR BARS & CLICK EVENTS 13930- **Added:** Dual color bars on events (section color + event color) 13931- **Added:** Click week grid days to view events (replaced hover tooltips) 13932- **Added:** Expandable section below week grid for selected day events 13933- **Added:** Blue theme for selected day section 13934- **Changed:** Week grid days now clickable instead of tooltips 13935- **Changed:** Section bar: 4px wide (left) 13936- **Changed:** Event bar: 3px wide (right) 13937- **Increased:** Gap between color bars from 3px to 6px 13938- **Improved:** Click is more reliable and mobile-friendly than hover tooltips 13939 13940### Visual Changes: 13941- Each event shows TWO color bars side-by-side 13942- Left bar (4px): Section context (Today=Orange, Tomorrow=Green, Important=Purple, Selected=Blue) 13943- Right bar (3px): Individual event's assigned color 13944- Click any day in week grid to expand event list 13945- X button to close selected day events 13946 13947## Version 3.9.7 (2026-02-05) - EVENT COLOR BAR VISIBILITY 13948- **Increased:** Event color bar width from 2px to 3px 13949- **Increased:** Gap between section and event bars from 3px to 6px 13950- **Improved:** Event color bars now more visible alongside section bars 13951- **Note:** Dual color bar system already in place from v3.9.6 13952 13953## Version 3.9.6 (2026-02-05) - UI REFINEMENTS 13954- **Changed:** Date in Important Events moved below event name (was above) 13955- **Changed:** Section headers now 9px font size (was 10px) 13956- **Changed:** Section headers now normal case (was ALL CAPS) 13957- **Changed:** Letter spacing reduced from 0.8px to 0.3px 13958- **Improved:** More natural reading flow with date below event name 13959- **Improved:** Cleaner, more subtle section headers 13960 13961### Header Changes: 13962- "TODAY" → "Today" 13963- "TOMORROW" → "Tomorrow" 13964- "IMPORTANT EVENTS" → "Important Events" 13965 13966## Version 3.9.0 (2026-02-05) - SIDEBAR WIDGET REDESIGN 13967- **Redesigned:** Complete overhaul of `sidebar` parameter 13968- **Added:** Compact week-at-a-glance itinerary view (200px wide) 13969- **Added:** Live clock widget at top of sidebar 13970- **Added:** 7-cell week grid showing event bars 13971- **Added:** Today section with orange header and left border 13972- **Added:** Tomorrow section with green header and left border 13973- **Added:** Important Events section with purple header and left border 13974- **Added:** Admin setting to configure important namespaces 13975- **Added:** Time conflict badges in sidebar events 13976- **Added:** Task checkboxes in sidebar events 13977- **Changed:** Sidebar now optimized for narrow spaces (200px) 13978- **Improved:** Perfect for dashboards, page sidebars, and quick glance widgets 13979 13980### New Features: 13981- Clock updates every second showing current time 13982- Week grid shows Mon-Sun with colored event bars 13983- Today/Tomorrow sections show full event details 13984- Important events highlighted in purple (configurable namespaces) 13985- All badges (conflict, time, etc.) shown in compact format 13986- Automatic time conflict detection 13987 13988## Version 3.8.0 (2026-02-05) - PRODUCTION CLEANUP 13989- **Removed:** 16 unused/debug/backup files 13990- **Removed:** 69 console.log() debug statements 13991- **Removed:** 3 orphaned object literals from console.log removal 13992- **Removed:** Temporary comments and markers 13993- **Fixed:** JavaScript syntax errors from cleanup 13994- **Improved:** Code quality and maintainability 13995- **Improved:** Reduced plugin size by removing unnecessary files 13996- **Status:** Production-ready, fully cleaned codebase 13997 13998### Files Removed: 13999- style.css.backup, script.js.backup 14000- admin_old_backup.php, admin_minimal.php, admin_new.php, admin_clean.php 14001- debug_events.php, debug_html.php, cleanup_events.php 14002- fix_corrupted_json.php, fix_wildcard_namespaces.php 14003- find_outlook_duplicates.php, update_namespace.php 14004- validate_calendar_json.php, admin.js 14005- test_date_field.html 14006 14007## Version 3.7.5 (2026-02-05) 14008- **Fixed:** PHP syntax error (duplicate foreach loop removed) 14009- **Fixed:** Time variable handling in grace period logic 14010 14011## Version 3.7.4 (2026-02-05) 14012- **Added:** 15-minute grace period for timed events 14013- **Changed:** Events with times now stay visible for 15 minutes after their start time 14014- **Changed:** Prevents events from immediately disappearing when they start 14015- **Improved:** Better user experience for ongoing events 14016- **Fixed:** Events from earlier today now properly handled with grace period 14017 14018## Version 3.7.3 (2026-02-05) 14019- **Changed:** Complete redesign of cleanup section for compact, sleek layout 14020- **Changed:** Radio buttons now in single row at top 14021- **Changed:** All options visible with grayed-out inactive states (opacity 0.4) 14022- **Changed:** Inline controls - no more grid layout or wrapper boxes 14023- **Changed:** Namespace filter now compact single-line input 14024- **Changed:** Smaller buttons and tighter spacing throughout 14025- **Improved:** More professional, space-efficient design 14026 14027## Version 3.7.2 (2026-02-04) 14028- **Fixed:** Strange boxes under cleanup options - now properly hidden 14029- **Changed:** Unified color scheme across all admin sections 14030- **Changed:** Green (#00cc07) - Primary actions and main theme 14031- **Changed:** Orange (#ff9800) - Warnings and cleanup features 14032- **Changed:** Purple (#7b1fa2) - Secondary actions and accents 14033- **Improved:** Consistent visual design throughout admin interface 14034 14035## Version 3.7.1 (2026-02-04) 14036- **Fixed:** Cleanup section background changed from orange to white 14037- **Fixed:** Event cleanup now properly scans all calendar directories 14038- **Added:** Debug info display when preview finds no events 14039- **Improved:** Better directory scanning logic matching other features 14040 14041## Version 3.7.0 (2026-02-04) 14042- **Added:** Event cleanup feature in Events Manager 14043- **Added:** Delete old events by age (months/years old) 14044- **Added:** Delete events by status (completed tasks, past events) 14045- **Added:** Delete events by date range 14046- **Added:** Namespace filter for targeted cleanup 14047- **Added:** Preview function to see what will be deleted 14048- **Added:** Automatic backup creation before cleanup 14049- **Changed:** Reduced changelog viewer height to 100px (was 400px) 14050 14051## Version 3.6.3 (2026-02-04) 14052- **Fixed:** Conflict tooltips now work properly after navigating between months 14053- **Added:** Changelog display in Update Plugin tab 14054- **Added:** CHANGELOG.md file with version history 14055- **Improved:** Changelog shows last 10 versions with color-coded change types 14056- **Fixed:** Removed debug console.log statements 14057 14058## Version 3.6.2 (2026-02-04) 14059- **Fixed:** Month title now updates correctly when navigating between months 14060- **Changed:** All eventpanel header elements reduced by 10% for more compact design 14061- **Changed:** Reduced header height from 78px to 70px 14062 14063## Version 3.6.1 (2026-02-04) 14064- **Changed:** Complete redesign of eventpanel header with practical two-row layout 14065- **Fixed:** Improved layout for narrow widths (~500px) 14066- **Changed:** Simplified color scheme (removed purple gradient) 14067 14068## Version 3.6.0 (2026-02-04) 14069- **Changed:** Redesigned eventpanel header with gradient background 14070- **Changed:** Consolidated multiple header rows into compact single-row design 14071 14072## Version 3.5.1 (2026-02-04) 14073- **Changed:** Moved event search bar into header row next to + Add button 14074- **Improved:** More compact UI with search integrated into header 14075 14076## Version 3.5.0 (2026-02-04) 14077- **Added:** Event search functionality in sidebar and eventpanel 14078- **Added:** Real-time filtering as you type 14079- **Added:** Clear button (✕) appears when searching 14080- **Added:** "No results" message when search returns nothing 14081 14082## Version 3.4.7 (2026-02-04) 14083- **Changed:** Made conflict badges smaller and more subtle (9px font, less padding) 14084- **Fixed:** Removed debug logging from console 14085- **Changed:** Updated export version number to match plugin version 14086 14087## Version 3.4.6 (2026-02-04) 14088- **Added:** Debug logging to diagnose conflict detection issues 14089- **Development:** Extensive console logging for troubleshooting 14090 14091## Version 3.4.5 (2026-02-04) 14092- **Added:** Debug logging to showDayPopup and conflict detection 14093- **Development:** Added logging to trace conflict detection flow 14094 14095## Version 3.4.4 (2026-02-04) 14096- **Fixed:** Conflict detection now persists across page refreshes (PHP-based) 14097- **Fixed:** Conflict tooltips now appear on hover 14098- **Added:** Dual conflict detection (PHP for initial load, JavaScript for navigation) 14099- **Added:** Conflict badges in both future and past events sections 14100 14101## Version 3.4.3 (2026-02-04) 14102- **Added:** Custom styled conflict tooltips with hover functionality 14103- **Changed:** Conflict badge shows count of conflicts (e.g., ⚠️ 2) 14104- **Improved:** Beautiful tooltip design with orange header and clean formatting 14105 14106## Version 3.4.2 (2026-02-04) 14107- **Fixed:** Attempted to fix tooltip newlines (reverted in 3.4.3) 14108 14109## Version 3.4.1 (2026-02-04) 14110- **Fixed:** End time field now properly saves to database 14111- **Fixed:** End time dropdown now filters to show only valid times after start time 14112- **Added:** Smart dropdown behavior - expands on focus, filters invalid options 14113- **Improved:** End time auto-suggests +1 hour when start time selected 14114 14115## Version 3.4.0 (2026-02-04) 14116- **Added:** End time support for events (start and end times) 14117- **Added:** Automatic time conflict detection 14118- **Added:** Conflict warning badges (⚠️) on events with overlapping times 14119- **Added:** Conflict tooltips showing which events conflict 14120- **Added:** Visual conflict indicators with pulse animation 14121- **Changed:** Time display now shows ranges (e.g., "2:00 PM - 4:00 PM") 14122 14123## Version 3.3.77 (2026-02-04) 14124- **Fixed:** Namespace badge onclick handlers restored after clearing filter 14125- **Fixed:** Namespace filtering works infinitely (filter → clear → filter) 14126 14127## Version 3.3.76 (2026-02-04) 14128- **Fixed:** Namespace badges now clickable after clearing namespace filter 14129 14130## Version 3.3.75 (2026-02-04) 14131- **Fixed:** Form resubmission warnings eliminated 14132- **Improved:** Implemented proper POST-Redirect-GET pattern with HTTP 303 14133- **Changed:** All admin redirects now use absolute URLs 14134 14135## Version 3.3.74 (2026-02-04) 14136- **Fixed:** Clearing namespace filter now restores original namespace instead of default 14137- **Added:** data-original-namespace attribute to preserve initial namespace setting 14138- **Improved:** Console logging for namespace filter debugging 14139 14140## Version 3.3.73 (2026-02-03) 14141- **Added:** Dynamic namespace filtering banner with clear button 14142- **Fixed:** JavaScript function accessibility issues 14143- **Fixed:** Namespace badge click handlers in event lists 14144- **Improved:** Persistent namespace filtering across views 14145 14146## Earlier Versions 14147See previous transcripts for complete history through v3.3.73, including: 14148- Recurring events with Outlook sync 14149- Multi-namespace support 14150- Event categories and mapping 14151- Backup/restore functionality 14152- System statistics bar 14153- Namespace selector with fuzzy search 14154- Events Manager with import/export 14155- And much more... 14156