1# Calendar Plugin Changelog 2 3## Version 7.0.9 (2026-03-01) - DEFAULT SEARCH SCOPE SETTING 4 5### New Feature: Default Search Scope 6Added admin setting (Themes tab) to configure whether the event search bar defaults to searching the current month or the entire calendar. 7 8**Options:** 9- **This Month** (default) — Search only events in the currently displayed month ( icon) 10- **All Dates** — Search across all events in the entire calendar ( icon) 11 12Users can still toggle the search scope at any time using the search mode button next to the search bar. This setting controls only the initial default state. 13 14### Localization 15- Added localized strings for English, German, and Czech 16 17### Files Modified 18- `admin.php` — Added search scope setting UI in Themes tab, save/load methods 19- `syntax.php` — Added `getSearchDefault()` method; inline and panel search bars now initialize from admin setting 20- `lang/en/lang.php` — Added search default scope strings 21- `lang/de/lang.php` — Added German translations 22- `lang/cs/lang.php` — Added Czech translations 23- `plugin.info.txt` — Version bump to 7.0.9 24 25### Configuration 26Setting is stored in `data/meta/calendar_search_default.txt` (values: `month` or `all`) 27 28--- 29 30## Version 7.0.8 (2026-02-15) - TIMEZONE FIX 31 32### Bug Fix: Date Shift in Non-UTC Timezones 33Fixed critical bug where events appeared shifted by one day in timezones ahead of UTC (e.g., Europe/Prague UTC+1). 34 35**Root Cause:** 36JavaScript'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. 37 38**Fix:** 39Added `formatLocalDate(date)` helper function that formats dates using local time methods (`getFullYear()`, `getMonth()`, `getDate()`) instead of UTC conversion. 40 41**Affected Areas (now fixed):** 42- Multi-day event spanning (line 385) 43- Today string calculation in event list (line 566) 44- Past event detection in event items (line 1022) 45 46### Files Modified 47- `calendar-main.js` - Added `formatLocalDate()` helper, replaced 3 `toISOString().split('T')[0]` calls 48 49--- 50 51## Version 7.0.7 (2026-02-15) - GOOGLE CALENDAR SYNC 52 53### Google Calendar Integration 54- Two-way sync with Google Calendar via OAuth 2.0 55- Import events from Google Calendar to DokuWiki 56- Export events from DokuWiki to Google Calendar 57- Support for all-day and timed events 58- Multi-day event handling 59- Color mapping between Google and DokuWiki 60- Duplicate detection prevents re-importing same events 61- Select which Google calendar to sync with 62- Admin panel UI for configuration and sync controls 63 64### Setup Requirements 65- Google Cloud Console project 66- Google Calendar API enabled 67- OAuth 2.0 Web Application credentials 68- Redirect URI configuration 69 70### New Files 71- `classes/GoogleCalendarSync.php` - OAuth and Calendar API integration 72 73### Files Modified 74- `action.php` - Added Google sync action handlers 75- `admin.php` - Added Google sync admin tab 76 77--- 78 79## Version 7.0.6 (2026-02-15) - ACCESSIBILITY IMPROVEMENTS 80 81### Screen Reader Support 82- Added ARIA live region for dynamic announcements 83- Announces "Event created", "Event updated", "Event deleted" on actions 84- Announces "Task marked complete/incomplete" on toggle 85- Screen readers receive feedback without visual alerts 86 87### Debug Mode 88- Added `CALENDAR_DEBUG` flag for JavaScript console logging 89- `calendarLog()` and `calendarError()` helper functions 90- Debug output disabled by default 91 92### Code Quality 93- Consistent error handling patterns 94- Better separation of concerns 95 96### Files Modified 97- `calendar-main.js` - ARIA live region, debug helpers, announcements 98 99--- 100 101## Version 7.0.5 (2026-02-15) - AUDIT LOGGING & ACCESSIBILITY 102 103### Audit Logging 104- New `AuditLogger.php` class for compliance logging 105- Logs all event modifications: create, update, delete, move, task toggle 106- JSON-formatted log files with timestamps, user info, and IP addresses 107- Automatic log rotation (5MB max, 10 files retained) 108- Log entries include: namespace, date, event ID, title, and change details 109 110### Keyboard Navigation (Accessibility) 111- Arrow keys navigate between calendar days 112- Enter/Space activates focused day (opens popup) 113- Arrow Up/Down navigates between events in popups 114- Enter on event opens edit dialog 115- Delete/Backspace on event triggers delete 116- Escape closes all dialogs, popups, and dropdowns 117- Added `tabindex` and `role` attributes for screen readers 118- Added `aria-label` descriptions for calendar days and events 119 120### CSS Focus States 121- Visible focus indicators on calendar days 122- Focus styles on event items in popups 123- Focus styles on custom date/time pickers 124- Uses `focus-visible` for keyboard-only focus rings 125 126### Files Added 127- `classes/AuditLogger.php` - Compliance audit logging 128 129### Files Modified 130- `action.php` - Integrated audit logging for all event operations 131- `calendar-main.js` - Extended keyboard navigation 132- `syntax.php` - Added accessibility attributes to calendar cells 133- `style.css` - Added focus state styles 134 135--- 136 137## Version 7.0.4 (2026-02-15) - CODE CLEANUP 138 139### Code Cleanup 140- Removed unused `calendarDebounce()` and `calendarThrottle()` utility functions 141- Removed duplicate `updateEndTimeOptions()` function definition 142- Removed unused `_calendarSelectOpen` tracking variable 143- Removed orphaned `.input-date` and `.time-select` CSS (no longer using native inputs) 144- Consolidated legacy function calls 145 146### Improvements 147- End date picker now opens to start date's month when no end date is selected 148- End time picker now scrolls to first available time after start time 149 150### Files Modified 151- `calendar-main.js` - Removed ~40 lines of dead code 152- `style.css` - Removed ~25 lines of unused CSS 153 154--- 155 156## Version 7.0.3 (2026-02-15) - CUSTOM DATE & TIME PICKERS 157 158### Complete Replacement of Native Browser Controls 159Both date inputs and time selects have been replaced with custom, lightweight pickers to eliminate all browser-related performance issues. 160 161#### Custom Date Picker 162- **Mini calendar grid** - Clean monthly view with day selection 163- **Month navigation** - Previous/next buttons for quick browsing 164- **Visual indicators** - Today highlighted, selected date marked 165- **End date validation** - Cannot select end date before start date 166- **Clear button** - Easy removal of optional end date 167 168#### Custom Time Picker (from v7.0.2) 169- **Period groupings** - Morning, Afternoon, Evening, Night 170- **Lazy loading** - Options built only when dropdown opens 171- **Smart filtering** - End times after start time only 172 173#### Code Cleanup 174- Removed old `setupSelectTracking()` function (was causing conflicts) 175- Removed redundant event listener code 176- Unified dropdown close handling for all picker types 177- No native `<input type="date">` or `<select>` elements in event dialog 178 179### Files Modified 180- `syntax.php` - New date picker HTML structure 181- `calendar-main.js` - Custom date picker JavaScript, cleanup 182- `style.css` - Date picker calendar grid styles 183 184--- 185 186## Version 7.0.2 (2026-02-15) - CUSTOM TIME PICKER 187 188### Major Fix: Replaced Native Selects with Custom Time Pickers 189The native `<select>` element with 97 time options was causing browser freezes when opening. This version replaces them with lightweight custom dropdown pickers. 190 191#### New Custom Time Picker Features 192- **Instant opening** - No browser rendering delay 193- **Lazy-loaded options** - Dropdown HTML built only when clicked 194- **Period grouping** - Morning, Afternoon, Evening, Night sections 195- **Smart filtering** - End time options automatically hide times before start time 196- **Visual feedback** - Selected time highlighted, disabled times grayed out 197 198#### Technical Changes 199- Replaced `<select>` elements with `<button>` + `<div>` dropdown 200- Hidden `<input>` stores actual value for form submission 201- Time data pre-computed once, reused for all pickers 202- Event delegation for option clicks 203- Automatic cleanup when clicking outside 204 205#### Removed 206- Native `<select>` time pickers (caused 2600ms+ freezes) 207- `onchange` handlers from date inputs (handled in JS now) 208- Old `setupSelectTracking()` function 209 210### Files Modified 211- `syntax.php` - New time picker HTML structure 212- `calendar-main.js` - Custom time picker JavaScript 213- `style.css` - Time picker dropdown styles 214 215--- 216 217## Version 7.0.1 (2026-02-15) - SELECTOR FLICKER FIX 218 219### Bug Fixes 220- **Fixed selector flicker on subsequent clicks** - Time/date selectors no longer flash or lag after first use 221 - New `setupSelectTracking()` prevents DOM updates while selector is open 222 - Tracks mousedown/focus/blur/change events on all form inputs 223 - Uses `requestAnimationFrame` for smooth visual updates 224 - Added state caching to skip redundant DOM manipulation 225 226### CSS Improvements 227- Changed `transition: all` to specific properties on `.input-sleek` elements 228- Added `transition: none` for select options 229- Prevents browser reflow issues during dropdown rendering 230 231--- 232 233## Version 7.0.0 (2026-02-15) - STABILITY & PERFORMANCE RELEASE 234 235### Major Improvements 236 237#### File Locking & Atomic Writes (Critical Stability Fix) 238- **New `CalendarFileHandler` class** with atomic file operations 239- Prevents data corruption from concurrent event saves 240- Uses temp file + atomic rename strategy for safe writes 241- Implements `flock()` for proper file locking during reads/writes 242- Graceful handling of lock acquisition failures with retries 243 244#### Caching Layer (Performance Improvement) 245- **New `CalendarEventCache` class** for event data caching 246- 5-minute TTL reduces unnecessary JSON file reads 247- In-memory caching for current request 248- Automatic cache invalidation on event modifications 249- Cache cleanup for expired entries 250 251#### Rate Limiting (Security Enhancement) 252- **New `CalendarRateLimiter` class** for AJAX endpoint protection 253- 60 requests/minute for read actions 254- 30 requests/minute for write actions (more restrictive) 255- Per-user tracking (falls back to IP for anonymous) 256- Rate limit headers in responses (X-RateLimit-Limit, X-RateLimit-Remaining) 257- Automatic cleanup of old rate limit data 258 259#### Code Refactoring 260- **New `CalendarEventManager` class** consolidating CRUD operations 261- New `classes/` directory for organized code structure 262- Reduced code duplication across files 263- Improved separation of concerns 264- Better maintainability for future development 265 266#### JavaScript Performance Fixes (Dialog Responsiveness) 267- **Fixed slow time selector** - End time dropdown now opens instantly 268 - Replaced `Array.from().forEach()` with direct `options` loop (97 options) 269 - Single-pass algorithm instead of multiple iterations 270 - Uses `hidden` property instead of `style.display` manipulation 271- **Fixed event listener accumulation** - Dialog inputs no longer slow down over time 272 - Added `data-initialized` flag to prevent re-binding listeners 273 - Namespace search only initializes once per calendar 274- **Fixed selector flicker on subsequent clicks** 275 - New `setupSelectTracking()` function prevents DOM updates while selector is open 276 - Tracks mousedown/focus/blur/change events on time and date inputs 277 - Uses `requestAnimationFrame` instead of `setTimeout` for visual updates 278 - Added state caching to skip redundant DOM updates 279- **Fixed CSS transition interference** 280 - Changed `transition: all` to specific properties on form inputs 281 - Added explicit `transition: none` for select options 282 - Prevents browser reflow issues during dropdown rendering 283 284### Branding Changes 285- Removed "Matrix Edition" from plugin name and all references 286- Plugin is now simply "Calendar Plugin" 287- Matrix theme remains available (now called just "Matrix") 288 289### Technical Details 290- All JSON file operations now use atomic writes 291- Event saves protected against race conditions 292- Cache automatically invalidated on namespace/month changes 293- Rate limiter uses probabilistic cleanup (1 in 100 requests) 294 295### Files Added 296- `classes/FileHandler.php` - Atomic file operations with locking 297- `classes/EventCache.php` - Caching layer with TTL 298- `classes/RateLimiter.php` - AJAX rate limiting 299- `classes/EventManager.php` - Consolidated event CRUD operations 300 301### Upgrade Notes 302- No database migration required 303- Cache directory created automatically (`data/cache/calendar/`) 304- Rate limit data stored in `data/cache/calendar/ratelimit/` 305- Existing events and settings preserved 306 307--- 308 309## Version 6.14.2 (2026-02-15) - SYSTEM LOAD TOGGLE 310 311### Added System Load Bars Toggle 312- New toggle in **Admin > Calendar > Themes** tab 313- Choose to show or hide CPU/Memory load indicator bars 314- Setting applies to both event panel and sidebar widget 315- Stored in `data/meta/calendar_show_system_load.txt` 316- JavaScript polling is also disabled when hidden (saves resources) 317 318## Version 6.14.1 (2026-02-14) - SECURITY FIX 319 320### Security Improvements 321- **Authentication required** - Write actions (save, delete, toggle) now require user to be logged in 322- **Improved CSRF token handling** - New `getSecurityToken()` helper function checks multiple sources: 323 - `JSINFO.sectok` (standard) 324 - `window.JSINFO.sectok` 325 - Hidden form field `input[name="sectok"]` 326 - Meta tag `meta[name="sectok"]` 327- Anonymous users can no longer add/edit/delete events 328- Better error messages for authentication and token failures 329 330### Bug Fixes 331- Fixed "Invalid security token" error on clean DokuWiki installations 332- Added debug logging for security token failures 333 334## Version 6.14.0 (2026-02-14) - STABLE RELEASE 335 336### Code Cleanup & Localization 337- Added localization for all static calendar strings (EN/DE) 338- New lang keys: `previous_month`, `next_month`, `print_calendar`, `no_events_scheduled`, `calendar_label`, `details` 339- Code review and cleanup completed 340- Updated README.md and plugin documentation 341 342### Static Calendar Features (v6.13.x consolidated) 343- Read-only presentation mode: `{{calendar static}}` 344- Custom titles: `title="My Events"` 345- Month locking: `month=2` disables navigation 346- Print button with clean itinerary output 347- All themes supported: matrix, pink, purple, professional, wiki, dark, light 348- `noprint` option to hide print functionality 349- Formatted descriptions in tooltips and itinerary 350 351### Other Improvements in 6.13.x 352- Admin menu icon (SVG) 353- Config import fix for `return array()` syntax 354- Mobile touch button fixes 355- Important events in day popup with star icons 356- Time picker grouped by period 357- Multi-day event time validation 358 359## Version 6.13.13 (2026-02-14) - PRINT BUTTON CENTERING 360 361### Fixed Print Button Icon Alignment 362- Added `display: flex`, `align-items: center`, `justify-content: center` 363- Added `padding: 0` and `line-height: 1` 364- Icon now properly centered in circle 365 366## Version 6.13.12 (2026-02-14) - SIMPLE TOOLTIP 367 368### Simplified Hover Tooltip 369- Removed custom JS tooltip (was causing triple popups) 370- Uses native browser `title` attribute only 371- Plain text with formatting converted: `**bold**` → `*bold*`, `//italic//` → `_italic_` 372- Links shown as: `text (url)` 373- Added emoji before time for visual clarity 374- Itinerary still shows full HTML formatting 375 376## Version 6.13.11 (2026-02-14) - FORMATTED DESCRIPTIONS 377 378### Rich Text Formatting in Static Calendar 379- **Hover tooltips** now show formatted text (bold, italic, links, line breaks) 380- **Itinerary descriptions** display with full formatting 381- Uses existing `renderDescription()` function for consistency 382- Supports: `**bold**`, `//italic//`, `[[links]]`, `[markdown](links)`, line breaks 383 384### Technical Details 385- Added `data-tooltip` attribute with rich HTML content 386- New JavaScript tooltip handler with smart positioning 387- CSS styles for `.static-tooltip` and itinerary formatting 388- Tooltips stay within viewport bounds 389 390## Version 6.13.10 (2026-02-14) - PRINT MARGINS FIX v3 391 392### Fixed Print Margins - Inline Styles Approach 393- Removed reliance on `@page` CSS (browser support inconsistent) 394- Uses inline style `padding: 50px 60px` directly on wrapper div 395- Simplified CSS for better browser compatibility 396- Smaller table font (12px) for better fit 397- Set `max-width: 800px` on content wrapper 398 399## Version 6.13.9 (2026-02-14) - PRINT MARGINS FIX v2 400 401### Fixed Print Margins 402- Added `.print-wrapper` div with 0.5in padding/margin 403- Uses both `@page` margin AND wrapper margins for compatibility 404- Set `@page { margin: 1in 0.75in }` (top/bottom 1in, sides 0.75in) 405- Wrapper has `max-width: 7.5in` to fit standard letter size 406- Smaller fonts (0.85em) to fit more content 407- Added 250ms delay before print to ensure styles load 408 409## Version 6.13.8 (2026-02-14) - PRINT MARGINS FIX 410 411### Improved Print Layout 412- Added `@page { margin: 0.75in }` for proper print margins 413- Increased body padding to 40px for screen preview 414- Smaller font sizes to fit better on page 415- Description column limited width with word-wrap 416- Table header repeats on each page (`display: table-header-group`) 417- Rows avoid page breaks in middle (`page-break-inside: avoid`) 418- Print color adjust enabled for backgrounds 419 420## Version 6.13.7 (2026-02-14) - ALL THEMES FOR STATIC CALENDAR 421 422### Added All Theme Options 423Now all themes work with static calendar: 424 425| Theme | Description | 426|-------|-------------| 427| `matrix` | Green on dark (default Matrix style) | 428| `pink` | Pink/magenta on dark | 429| `purple` | Purple/violet on dark | 430| `professional` | Blue on white (business style) | 431| `wiki` | Neutral gray (matches DokuWiki) | 432| `dark` | Blue on dark gray | 433| `light` | Clean white/gray | 434 435### Examples 436``` 437{{calendar theme=matrix static}} 438{{calendar theme=purple static}} 439{{calendar theme=professional static}} 440{{calendar theme=wiki static}} 441``` 442 443## Version 6.13.6 (2026-02-14) - QUOTED PARAMETER FIX 444 445### Fixed Quoted Parameter Parsing 446- Titles with spaces now work: `title="Feb 26 Expense Log"` 447- Uses regex to properly parse: `key="value with spaces"` 448- Supports both double and single quotes 449- Example: `{{calendar title="My Custom Title" static}}` 450 451## Version 6.13.5 (2026-02-14) - STATIC CALENDAR OPTIONS 452 453### New Static Calendar Options 454 455| Option | Description | Example | 456|--------|-------------|---------| 457| `title=X` | Custom title instead of month name | `title="Club Meetings"` | 458| `noprint` | Hide print button and print view | `{{calendar static noprint}}` | 459| `theme=X` | Apply specific theme (matrix, pink, dark, light) | `theme=matrix` | 460 461### Fixed Month/Year Lock 462- When you specify `month=X` or `year=X`, navigation is now disabled 463- `{{calendar month=2 static}}` shows only February with no nav arrows 464- `{{calendar year=2025 month=12 static}}` locks to December 2025 465 466### Examples 467``` 468{{calendar static}} // Navigable, current month 469{{calendar month=2 static}} // Locked to February 470{{calendar title="Team Events" static}} // Custom title 471{{calendar theme=matrix static}} // Matrix theme 472{{calendar namespace=club static noprint}} // No print button 473{{calendar month=3 title="March Meetings" theme=pink static}} 474``` 475 476## Version 6.13.4 (2026-02-14) - DEDICATED PRINT BUTTON 477 478### Added Print Button to Static Calendar 479- New ️ print button in the calendar header 480- Opens a clean popup window with ONLY the itinerary content 481- Automatically triggers print dialog 482- Window closes after printing 483- No DokuWiki headers/footers/sidebars - just the calendar 484 485### How It Works 486- Extracts the print view HTML 487- Creates a new window with minimal styling 488- Calls `window.print()` automatically 489- Clean single-page output 490 491## Version 6.13.3 (2026-02-14) - PRINT BLANK PAGES FIX 492 493### Fixed Blank Pages When Printing 494- Aggressively hide ALL screen view elements and children in print 495- Reset height/width to 0 with !important on grid, cells, events 496- Ensure print view elements have proper display table properties 497- Force all hidden elements to position:absolute off-screen 498 499## Version 6.13.2 (2026-02-14) - STATIC CALENDAR RESPONSIVE FIX 500 501### Improved Static Calendar Layout 502- Changed from `max-width: 900px` to `width: 100%` for full container fit 503- Added `table-layout: fixed` for consistent column widths 504- Added `overflow-x: auto` for horizontal scroll on very small screens 505- Reduced header padding and font sizes for better fit 506- Improved responsive breakpoints for mobile (768px and 480px) 507- Hide time on very small screens to save space 508- Better touch targets for navigation buttons 509 510## Version 6.13.1 (2026-02-14) - STATIC CALENDAR FIX 511 512### Bug Fix 513- Added missing `getImportantNamespaces()` helper method 514- Fixed `loadEventsForMonth` → use existing `loadEvents` method 515- Added multi-namespace/wildcard support to static calendar 516 517## Version 6.13.0 (2026-02-14) - STATIC CALENDAR MODE 518 519### New Static/Presentation Mode 520Read-only calendar view for public display and printing. 521 522**Usage:** 523``` 524{{calendar static}} 525{{calendar namespace=meetings static}} 526``` 527 528**Screen View Features:** 529- Clean calendar grid without edit/delete buttons 530- Month navigation (prev/next arrows) 531- Hover tooltips showing full event details (title, time, description) 532- Important events highlighted with ⭐ and golden background 533- Today's date highlighted 534- Responsive design for mobile 535 536**Print View Features:** 537- Automatically switches to itinerary format when printing 538- Table layout: Date | Time | Event | Details 539- Important events marked with ⭐ 540- Dates grouped (date only shown once per day) 541- Page break handling for long lists 542- Clean black & white friendly output 543 544**Files Changed:** 545- `syntax.php`: Added `renderStaticCalendar()` method 546- `action.php`: Added `getStaticCalendar()` AJAX handler 547- `calendar-main.js`: Added `navStaticCalendar()` function 548- `style.css`: Added static calendar styles + print media queries 549 550## Version 6.12.7 (2026-02-14) - ADMIN MENU ICON 551 552### Added Admin Menu Icon 553- New monochrome SVG calendar icon for DokuWiki admin menu 554- Icon shows calendar with binding rings, header, and date dots 555- Matches DokuWiki's admin interface style 556- Added `getMenuIcon()` method to admin.php 557- Icon file: `images/icon.svg` 558 559## Version 6.12.6 (2026-02-14) - CONFIG IMPORT FIX 560 561### Fixed Config Import Validation 562- Now accepts both `return [` and `return array(` syntax 563- Regex updated from `/return\s*\[/` to `/return\s*(\[|array\s*\()/` 564- Older PHP config files using `return array(...)` now import correctly 565 566## Version 6.12.5 (2026-02-14) - MOBILE BUTTON FIX 567 568### Fixed Delete/Edit Buttons on Mobile 569- Added `type="button"` attribute to prevent form submission issues 570- Added `touchend` event delegation for reliable mobile touch handling 571- Increased button touch targets (32px default, 40px on mobile) 572- Added `touch-action: manipulation` to prevent touch delays 573- Added `-webkit-tap-highlight-color` for visual feedback 574 575### Technical Details 576- Mobile browsers sometimes don't fire `onclick` reliably 577- New `touchend` handler calls `btn.click()` explicitly 578- Larger touch targets meet accessibility guidelines (44px recommended) 579 580## Version 6.12.4 (2026-02-14) - STAR INLINE FIX 581 582### Fixed Star Position in Day Popup 583- Star icon now displays inline with event title (left side) 584- Changed `.popup-event-title` from `flex: 1 1 100%` to `flex: 1 1 auto` 585- Star and title stay on same line instead of star being above 586 587## Version 6.12.3 (2026-02-14) - DAY POPUP IMPORTANT EVENTS 588 589### Important Event Highlighting in Day Popup 590- Events from important namespaces now show ⭐ star icon 591- Golden gradient background highlight for important events 592- Golden border glow effect matching other views 593- Consistent styling across calendar grid, sidebar, and day popup 594 595### Technical Details 596- Added `importantNamespaces` check to `showDayPopup()` function 597- Added `.popup-event-important` and `.popup-event-star` CSS classes 598- Reads important namespaces from `container.dataset.importantNamespaces` 599 600## Version 6.12.2 (2026-02-14) - MULTI-DAY EVENT TIME FIX 601 602### Multi-Day Event End Time 603- End time now allows all times when end date differs from start date 604- Example: Event from 9:00 PM on Feb 28 to 5:00 AM on Feb 29 now works correctly 605- Same-day events still enforce end time > start time 606- Changing end date now triggers time validation update 607 608### Technical Details 609- `updateEndTimeOptions()` checks if `endDate !== startDate` 610- If multi-day, all time options are enabled 611- Added `onchange` handler to both start date and end date fields 612 613## Version 6.12.1 (2026-02-14) - TIME PICKER & EDIT DIALOG FIX 614 615### Improved Time Picker 616- Grouped time options by period (Morning, Afternoon, Evening, Night) 617- Much easier to navigate - no more scrolling through 96 options 618- End time options before start time are now hidden/disabled 619- Invalid end times automatically corrected when start time changes 620 621### Fixed Edit Event Dialog Draggability 622- Edit dialog is now properly draggable (was broken due to async AJAX) 623- Moved `makeDialogDraggable()` call inside the AJAX success callback 624- Removed redundant wrapper patch that didn't work with async code 625 626### Technical Details 627- Time picker uses `<optgroup>` for visual grouping 628- End time validation hides invalid options (not just disables) 629- Both Add and Edit dialogs now call `makeDialogDraggable()` directly 630 631## Version 6.12.0 (2026-02-14) - EVENT EDITOR DIALOG IMPROVEMENTS 632 633### Fixed Event Editor Dialog Draggability 634- Fixed duplicate event listener accumulation that caused performance degradation 635- Each time dialog opened, new drag listeners were added without removing old ones 636- Now properly cleans up old listeners before adding new ones 637- Added `cursor: grabbing` feedback while dragging 638- Dialog position resets when reopened (no more stuck positions) 639- Excluded close button from triggering drag 640 641### Optimized Time Selection Performance 642- Simplified `updateEndTimeOptions()` to be much faster 643- Removed expensive loop through 96 options checking style.display 644- Now just validates current selection and sets new value if invalid 645- Should eliminate freezing/lag when selecting start time 646 647### Technical Details 648- Added `_dragCleanup` function stored on handle element 649- Cleanup called before re-initialization 650- Removed unnecessary `setTranslate` helper function 651 652## Version 6.11.4 (2026-02-13) - JAVASCRIPT LOCALIZATION 653 654### JavaScript Frontend Localization 655- Added `getCalendarLang()` helper function 656- Added `getJsLangStrings()` PHP method 657- Embedded JSON language data in all render functions 658- Localized month names (full + short) 659- Localized dialog titles, confirmations, badges, empty states 660 661## Version 6.11.3 (2026-02-13) - SIDEBAR WIDGET LOCALIZATION 662 663### Sidebar Widget 664- Fixed `\n` in single-quoted strings → double-quoted for proper newlines 665- Localized "Runs every X minutes" cron descriptions 666- Event dialog labels, placeholders, options 667- Day names, ordinal positions, color names 668- Today/Tomorrow/Important section headers 669 670## Version 6.11.2 (2026-02-13) - ADMIN BACKEND LOCALIZATION 671 672### Admin Backend 673- Localized ~220 hardcoded strings in admin.php 674- AJAX JSON responses, redirect messages, error messages 675- Pattern names (Daily, Weekly, Monthly, etc.) 676 677## Version 6.11.1 (2026-02-13) - CONFIG IMPORT BUG FIX 678 679### Bug Fix 680- Fixed regex to accept both `return [` and `return array(` syntax 681- File: `admin.php` lines 5947, 6001 682 683## Version 6.10.6 (2026-02-13) - MANAGE RECURRING DIALOG LOCALIZATION 684 685### Localized Manage Recurring Series Dialog 686Complete translation of the "Manage" button dialog for recurring events: 687 688**Section Headers:** 689- "Manage Recurring Series" → "Wiederkehrende Serie verwalten" 690- "Extend Series" → "Serie erweitern" 691- "Trim Past Events" → "Vergangene Termine kürzen" 692- "Change Pattern" → "Muster ändern" 693- "Change Start Date" → "Startdatum ändern" 694- "Pause Series" / "Resume Series" → "Serie pausieren" / "Serie fortsetzen" 695 696**Labels & Buttons:** 697- All field labels (Add occurrences, Days apart, Remove before, New interval, etc.) 698- Action buttons (Extend, Trim, Change, Shift, Pause, Resume, Close) 699- Interval dropdown options (Daily, Weekly, Bi-weekly, Monthly, Quarterly, Yearly) 700- Help text and notes 701 702**Confirmation Dialogs:** 703- Trim confirmation with date 704- Respace confirmation 705- Shift confirmation 706 707### Added 60+ Language Strings for Dialogs 708Complete vocabulary for recurring event management in both English and German. 709 710### Note on Browser Validation Messages 711"Please fill out this field" is a browser-native message controlled by the browser's language setting, not our plugin. 712 713## Version 6.10.5 (2026-02-13) - DIALOG LOCALIZATION 714 715### Localized All JavaScript Dialogs 716 717**New Namespace Dialog:** 718- Prompt text with examples now in German 719- Invalid namespace error message 720 721**Rename Namespace Dialog:** 722- Prompt text with current name 723 724**Delete Confirmations:** 725- Delete selected events confirmation 726- Delete namespace confirmation 727- Delete recurring series confirmation 728 729**Trim Recurring Events:** 730- "Counting..." / "Zähle..." 731- "Trimming..." / "Kürze..." 732- "No past recurring events found" message 733- "Found X past recurring events" confirmation 734- Button text resets 735 736### Added 15+ New Dialog Strings 737Both English and German translations for all interactive prompts and confirmations. 738 739## Version 6.10.4 (2026-02-13) - COMPLETE MANAGE TAB LOCALIZATION 740 741### Fixed Remaining English Strings 742 743**Namespace Explorer Control Bar:** 744- "➡️ Move" → "➡️ Verschieben" 745- "➕ New Namespace" → "➕ Neuer Namensraum" 746- " Cleanup" → " Bereinigen" 747- "0 selected" → "0 ausgewählt" 748- "%d selected" → "%d ausgewählt" 749 750**Recurring Events Button Tooltips:** 751- "Edit title, time, namespace, pattern" → "Titel, Zeit, Namensraum, Muster bearbeiten" 752- "Extend, trim, pause, change dates" → "Erweitern, kürzen, pausieren, Daten ändern" 753- "Delete all occurrences" → "Alle Vorkommen löschen" 754 755**JavaScript Confirmation Messages:** 756- "No events selected" → "Keine Termine ausgewählt" 757- Delete confirmation with count 758- Delete namespace confirmation 759- "Scanning..." → "Scanne..." 760- "Cleaning..." → "Bereinige..." 761- "No empty namespaces found" message 762- "Found X item(s) to clean up" → "X Element(e) zum Bereinigen gefunden" 763- "Proceed with cleanup?" → "Mit Bereinigung fortfahren?" 764 765### Technical 766- Added adminLang JavaScript object with all translatable strings 767- All dynamic JavaScript messages now use language system 768 769## Version 6.10.3 (2026-02-13) - RECURRING EVENTS & DROP TARGET LOCALIZATION 770 771### Additional Localization for Manage Events Tab 772 773**Recurring Events Table:** 774- Search placeholder: "Wiederkehrende Termine suchen..." 775- Table headers: Titel, Namensraum, Muster, Zeitraum, Anzahl, Quelle, Aktionen 776- Source labels: Markiert / Erkannt (was Flagged / Detected) 777- Action buttons: Bearb. / Verwalten / Lö. (was Edit / Manage / Del) 778- Pattern badges: Täglich, Wöchentlich, Monatlich, Jährlich, Benutzerdefiniert 779- Footer: "Gesamt: X Serien" (was "Total: X series") 780- No results message 781 782**Namespace Explorer Drop Zones:** 783- Header: " Zielbereich" (was "Drop Target") 784- Drop hint: "Hier ablegen" (was "Drop here") 785- Default namespace label consistent 786 787### Added 25+ New Language Strings 788- Recurring table columns and labels 789- Pattern translations 790- Action button labels 791- Drop zone labels 792 793## Version 6.10.2 (2026-02-13) - MANAGE EVENTS TAB LOCALIZATION 794 795### Localized: Manage Events Tab (Complete) 796All text in the Manage Events admin tab now uses the language system: 797 798**Events Manager Section:** 799- Page title, section header, description 800- Statistics labels (Total Events, Namespaces, JSON Files, Recurring) 801- "Last scanned" timestamp label 802- Button labels (Re-scan Events, Export All Events, Import Events) 803- "View Breakdown by Namespace" expandable section 804- Table headers (Namespace, Events, Files) 805 806**Important Namespaces Section:** 807- Section header and description 808- Visual Effects descriptions (Calendar Grid, Event Sidebar, Sidebar Widget, Day Popup) 809- Save button and hint text 810 811**Cleanup Old Events Section:** 812- Section header and description 813- Radio button labels (By Age, By Status, By Date Range) 814- Age options (Delete events older than, months, years) 815- Status options (Completed tasks, Past events) 816- Date range labels (From, To) 817- Namespace filter label and placeholder 818- Preview and Delete button labels 819- JavaScript confirmation messages 820- Loading/error states 821 822**Recurring Events Section:** 823- Section header 824- Button labels (Trim All Past, Rescan) 825 826**Namespace Explorer Section:** 827- Section header and description 828- Search placeholder 829- Control bar buttons (All, None, Delete, Move to) 830- Datalist placeholder 831 832### Added 60+ New Language Strings 833Both English and German language files expanded with comprehensive admin terminology. 834 835## Version 6.10.1 (2026-02-13) - LANGUAGE SYSTEM FIX 836 837### Bug Fix: Language Files Not Working 838- Fixed `getMenuText()` to use `$this->getLang('menu')` instead of hardcoded string 839- Admin menu now correctly shows "Kalenderverwaltung" in German 840- Admin tabs now use language system: 841 - "Manage Events" → "Termine verwalten" 842 - "Update Plugin" → "Plugin aktualisieren" 843 - "Outlook Sync" → "Outlook-Sync" 844 - "Themes" → "Designs" 845 846### Added More Language Strings 847- Admin tab labels 848- Admin section headers (Event Browser, Important Namespaces, etc.) 849- Sync settings labels 850- Common button labels (Run Now, Download, Upload, Delete, etc.) 851 852## Version 6.10.0 (2026-02-13) - GERMAN LANGUAGE SUPPORT 853 854### New Feature: German Language Translation 855- Added complete German (de) language file 856- Expanded English language file with comprehensive translatable strings 857- Both files include 100+ translation strings covering: 858 - General terms (calendar, events, dates) 859 - Event fields (title, description, time, etc.) 860 - Actions (add, edit, delete, save, cancel) 861 - Task-related terms 862 - Recurring event options 863 - Days of week and months 864 - User messages and confirmations 865 - Search functionality 866 - Sync status messages 867 - Admin section labels 868 - Sidebar widget labels 869 - Time conflict warnings 870 871### Note 872The 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. 873 874## Version 6.9.9 (2026-02-13) - CRITICAL SEARCH FIX 875 876### Bug Fix: Month Search Not Working 877- **Root cause:** Function name collision - there were two `fuzzyMatch` functions 878 - `window.fuzzyMatch` (for namespace search autocomplete) returns a score number or `null` 879 - Local `fuzzyMatch` (for event search) returns `true`/`false` 880- When filtering events, the wrong function was being called, returning `null` for all events 881- **Fix:** Renamed event search functions to `eventSearchNormalize` and `eventSearchMatch` 882- Month search now works correctly on first load and after navigation 883 884### Also in this version 885- Fixed jumpToDate to properly hide search clear button after navigation 886- Removed debug logging from production code 887 888## Version 6.9.8 (2026-02-12) - SEARCH & UI FIXES 889 890### Bug Fixes 891 892**All-Dates Search Navigation Fixed** 893- Clicking a search result now properly navigates to that event's month 894- Opens the day popup showing the event details 895- Was calling non-existent `loadMonth()` - now uses correct `navCalendar()` 896- Clears search results and restores normal event list view 897 898**"No Events" Message Fixed** 899- No longer shows "No events match your search" when in all-dates mode 900- All-dates mode has its own results display; the month-mode message was incorrectly appearing 901 902**Add Button Layout Fixed** 903- Search bar no longer pushes the "+ Add" button off the right edge 904- Search container has constrained max-width (160px) and proper flex settings 905- Header has overflow:hidden to prevent layout issues 906 907**Important Event Stars Fixed** 908- Stars now appear on initial page load (PHP rendering added) 909- Stars positioned outside the bar using CSS ::before pseudo-element 910- Added overflow:visible to event-indicators and event-bar containers 911- Bar remains full width; star sits in the left margin area 912 913### Technical 914- Star uses `event-bar-has-star` class for first-day-only display 915- jumpToDate() properly cleans up search state before navigation 916 917## Version 6.9.7 (2026-02-12) - IMPORTANT NAMESPACE IMPROVEMENTS 918 919### Bug Fix 920- **AJAX refresh now preserves important namespace highlighting** 921 - Important namespaces list now passed to JavaScript via data attribute 922 - Highlighting persists when navigating between months 923 - Works in both main calendar sidebar and standalone event panels 924 925### New Feature: Calendar Grid Star Icons 926- **Important events now show ⭐ on their color bars** in the calendar grid 927 - Small star appears on the first day of important events 928 - Tooltip prefixed with ⭐ for important events 929 - Visual distinction without cluttering the compact grid view 930 931### Admin Section Update 932- **Improved Important Namespaces description** in Admin → Calendar → Manage Events 933 - Now explains all visual effects: 934 - Calendar Grid: ⭐ star on event bars 935 - Event Sidebar: ⭐ star + highlighted background + accent border 936 - Sidebar Widget: Dedicated "Important Events" section 937 - Day Popup: Events shown with full details 938 - Better example placeholder text 939 940### Technical 941- Fixed PHP syntax error in fuzzy search (curly quotes replaced with escape sequences) 942- Important namespaces loaded once and stored in container dataset for JavaScript access 943 944## Version 6.9.6 (2026-02-12) - FUZZY SEARCH & SIDEBAR HIGHLIGHTING 945 946### Fuzzy Search 947- **Improved search matching:** Search is now more forgiving of punctuation differences 948 - "fathers day" matches "Father's Day" 949 - "new years" matches "New Year's Eve" 950 - Smart quotes, apostrophes, dashes, and common punctuation are ignored 951- **Multi-word search:** All words must be present but in any order 952 - "birthday john" matches "John's Birthday Party" 953- Works in both "this month" and "all dates" search modes 954 955### Important Namespace Highlighting (Calendar Sidebar) 956- Events from important namespaces now highlighted in the main calendar's event list sidebar 957- Same visual treatment as the itinerary sidebar widget: 958 - Subtle theme-colored background tint 959 - Right border accent bar 960 - ⭐ star icon before event title 961- Theme-specific colors: 962 - Matrix: green tint 963 - Purple: purple tint 964 - Pink: pink tint 965 - Professional: blue tint 966 - Wiki: light blue tint 967- Configure important namespaces in Admin → Calendar → Sync Settings 968 969## Version 6.9.5 (2026-02-12) - SEARCH MODE TOGGLE 970 971### New Feature: Search Scope Toggle 972- **Search mode button** (/) added next to search input in both calendar views 973- **Default mode** (): Search only the current month's events (fast, local filtering) 974- **All dates mode** (): Search across ALL calendar data via AJAX 975 - Click the button to toggle to (green highlight when active) 976 - Requires at least 2 characters to search 977 - Shows results with date, time, and namespace 978 - Click any result to jump to that date and open the day popup 979 - Limited to 50 results for performance 980- Search placeholder text updates to indicate current mode 981- Compact button design takes minimal space 982 983### UI Details 984- Button sits flush with search input (no gap) 985- Green highlight when "all dates" mode is active 986- Results show full date (e.g., "Mon, Feb 12, 2026") 987- Namespace badge shown for multi-namespace setups 988 989## Version 6.9.4 (2026-02-12) - POPUP IMPROVEMENTS & IMPORTANT HIGHLIGHTING 990 991### Features 992- **Draggable Day Popup:** Calendar day popup window is now draggable by its header 993 - Click and drag the header to move the popup 994 - Header shows move cursor on hover 995 - Clicking the close button (×) still closes normally 996 997- **Important Namespace Highlighting in Sidebar:** 998 - Events from "important" namespaces (defined in Admin → Sync Settings) now have subtle highlighting 999 - Theme-aware background tint (green for Matrix, purple for Purple, pink for Pink, blue for Professional/Wiki) 1000 - Right border accent bar for visual distinction 1001 - ⭐ star icon appears before event title 1002 - Works in Today, Tomorrow, and Important Events sections 1003 1004### Bug Fix 1005- **Fixed event display in day popup:** Long titles no longer cut off the edit/delete buttons 1006 - Event title now wraps to multiple lines instead of truncating 1007 - Actions buttons always visible 1008 - Time, date range, and namespace badges wrap properly 1009 - Improved flex layout for better responsiveness 1010 1011## Version 6.9.3 (2026-02-12) - ADMIN EDIT DIALOG CONSISTENCY 1012 1013### UI Improvement 1014- **Edit Recurring Event dialog** in Admin section now matches the main event editor exactly: 1015 - Same dark theme styling (#1e1e1e background, #2c3e50 header) 1016 - Same header layout with close button (×) in top-right corner 1017 - Same input styling (dark inputs with green accent borders) 1018 - Same footer with Cancel/Save buttons layout 1019 - Same recurrence options box styling 1020 - Consistent spacing, fonts, and colors throughout 1021 1022## Version 6.9.2 (2026-02-12) - MOBILE DIALOG FIX 1023 1024### Bug Fix 1025- **Fixed:** Description textarea now extends full width on mobile/phone view 1026 - Reduced form padding from 12px to 8px on screens ≤480px 1027 - Added explicit `width: 100%` and `box-sizing: border-box` to textarea 1028 - Ensured all form inputs/selects use full available width on mobile 1029 1030## Version 6.9.1 (2026-02-11) - ADMIN RECURRING EVENTS INTEGRATION 1031 1032### Admin Panel Updates 1033- **Enhanced Recurring Events Table:** 1034 - Pattern column now shows color-coded badges (daily=blue, weekly=green, monthly=orange, yearly=pink) 1035 - "First" column renamed to "Range" showing full date span (e.g., "Feb 1, 2026 → Dec 15, 2026") 1036 - Patterns now read from stored metadata when available, with smart fallback to detection 1037 1038- **Edit Recurring Series Dialog:** 1039 - Full recurrence pattern editing (not just simple intervals) 1040 - "Repeat every [N] [period]" with dropdown for Daily/Weekly/Monthly/Yearly 1041 - Weekly: Day-of-week checkboxes (Sun-Sat) with current days pre-selected 1042 - Monthly: Radio choice between "Day of month" or "Weekday pattern" 1043 - Ordinal weekday selector (First/Second/Third/Fourth/Fifth/Last + day dropdown) 1044 - Pre-populates all fields from stored recurrence metadata 1045 - Properly reschedules future events using new pattern 1046 1047- **Manage Series Dialog:** 1048 - Updated summary to show date range 1049 - Extend/trim/change pattern functions work with new patterns 1050 1051### Technical Updates 1052- `findRecurringEvents()` captures all recurrence metadata from events 1053- `formatRecurrencePattern()` generates human-readable pattern descriptions 1054- `detectRecurrencePattern()` enhanced to detect more interval variations 1055- `editRecurringSeries()` PHP handler processes new recurrence parameters 1056- `generateRecurrenceDates()` creates dates matching complex patterns 1057- Recurrence metadata preserved and updated across all event occurrences 1058 1059## Version 6.9.0 (2026-02-11) - ADVANCED RECURRING EVENTS 1060 1061### New Features 1062- **Enhanced Recurring Event Options:** 1063 - **Interval support:** Repeat every N days/weeks/months/years (e.g., every 3 months) 1064 - **Weekly day selection:** Choose specific days of the week (e.g., Mon, Wed, Fri) 1065 - **Monthly options:** 1066 - Day of month: Repeat on specific day (e.g., 15th of each month) 1067 - Ordinal weekday: Repeat on pattern (e.g., 2nd Wednesday, Last Friday) 1068 - **Examples now possible:** 1069 - Every 2 weeks on Monday and Thursday 1070 - Every 3 months on the 15th 1071 - Every other month on the 2nd Wednesday 1072 - Every year on the same date 1073 - Last Friday of every month 1074 1075### UI Changes 1076- Redesigned recurring options section with bordered container 1077- "Repeat every [N] [period]" input with interval number field 1078- Day-of-week checkboxes for weekly recurrence 1079- Radio buttons for monthly: "Day of month" vs "Weekday pattern" 1080- Ordinal dropdown (First/Second/Third/Fourth/Fifth/Last) 1081- Day dropdown (Sunday through Saturday) 1082- Helper text for end date field 1083 1084### Technical Details 1085- New parameters: recurrenceInterval, weekDays, monthlyType, monthDay, ordinalWeek, ordinalDay 1086- Recurrence pattern stored in event data for reference 1087- Maximum 365 occurrences (up from 100) to support daily events for a year 1088- Smart date iteration for complex patterns 1089 1090## Version 6.8.1 (2026-02-11) - ITINERARY DEFAULT STATE SETTING 1091 1092### New Feature 1093- **Added:** Option to set itinerary default state (expanded or collapsed) 1094 - New setting in Admin → Calendar → Sidebar Widget Settings 1095 - " Itinerary Section" with two options: 1096 - **Expanded** (default) - Show itinerary sections by default 1097 - **Collapsed** - Hide itinerary sections by default (click bar to expand) 1098 - Setting persists across page loads 1099 - Arrow indicator and content state reflect the saved preference on page load 1100 1101## Version 6.8.0 (2026-02-11) - COLLAPSIBLE ITINERARY 1102 1103### New Feature 1104- **Added:** Collapsible Itinerary bar in sidebar week view 1105 - New "ITINERARY" bar below the week calendar (styled like +ADD EVENT bar) 1106 - Click to collapse/expand the Today, Tomorrow, and Important Events sections 1107 - Arrow indicator shows expanded (▼) or collapsed (►) state 1108 - Smooth animation when collapsing/expanding 1109 - Clicking a day in the week grid shows that day's events ABOVE the Itinerary bar 1110 - Selected day events remain visible whether itinerary is expanded or collapsed 1111 - Shows "No upcoming events" message when there are no itinerary items 1112 1113### UI Layout (top to bottom) 11141. Header with clock/system stats 11152. +ADD EVENT bar 11163. Week grid (7 days) 11174. Selected day's events (appears when clicking a day) 11185. ITINERARY bar (click to collapse/expand) 11196. Today section (collapsible) 11207. Tomorrow section (collapsible) 11218. Important Events section (collapsible) 1122 1123## Version 6.7.9 (2026-02-11) - FIX EVENTS MANAGER STATISTICS 1124 1125### Bug Fixes 1126- **Fixed:** Events Manager showing inflated count (1195 instead of ~605) 1127 - The `scanDirectoryForStats()` function was counting ALL entries in JSON files 1128 - Now properly filters to only count date keys (`YYYY-MM-DD` format) 1129 - Now validates events have `id` and `title` before counting 1130 - Click " Rescan" to update the statistics with correct count 1131 1132## Version 6.7.8 (2026-02-11) - FILTER INVALID EVENTS 1133 1134### Bug Fixes 1135- **Fixed:** Event Manager showing "(untitled)" and "mapping" entries 1136 - Root cause: Calendar JSON files contain metadata keys (like "mapping") that were being parsed as events 1137 - Added date format validation (`YYYY-MM-DD`) to skip non-date keys 1138 - Added validation to require `id` and `title` fields for events 1139 - Applied fix to all event-reading functions: 1140 - `getEventsByNamespace()` - main event listing 1141 - `scanNamespaceRecursive()` - namespace scanning 1142 - `searchEvents()` - event search 1143 - `findEventsByTitle()` - title lookup 1144 - `deleteRecurringSeries()` - recurring deletion 1145 - `renameRecurringSeries()` - recurring rename 1146 - Recurring events scanner 1147 - Recurring cleanup function 1148 1149### Technical Details 1150- Date keys must match pattern `/^\d{4}-\d{2}-\d{2}$/` 1151- Events must have non-empty `id` and `title` fields 1152- All other entries in JSON files are now skipped 1153 1154## Version 6.7.7 (2026-02-11) - FIX PHP PATH & CLEAR LOG 1155 1156### Bug Fixes 1157- **Fixed:** "sh: 1: '/usr/bin/php': not found" error - removed escapeshellarg() which was adding quotes around the PHP path 1158- **Fixed:** "Could not clear log file" - added better error messages showing exact issue 1159- **Improved:** findPhpBinary() now uses is_executable() and `which php` for detection 1160- **Improved:** clearLogFile() now shows specific error (file not found, not writable, etc.) 1161 1162## Version 6.7.6 (2026-02-11) - FIX SYNC CONTROLS & LOGGING 1163 1164### Bug Fixes 1165- **Fixed:** Double log entries - sync script logs internally, removed redundant stdout capture 1166- **Fixed:** Manual sync not appearing in log - removed `--verbose` flag since script logs directly 1167- **Fixed:** Better error messages when sync fails 1168 1169### Improvements 1170- **Improved:** Sync now runs without `--verbose` flag - script logs to file internally 1171- **Improved:** Crontab warning if `>>` redirect is detected (causes duplicate entries) 1172- **Improved:** Log viewer now shows full path to log file 1173- **Improved:** Better pre-flight checks (directory creation, file permissions) 1174- **Improved:** PHP binary path is now properly escaped 1175 1176### Crontab Update Required 1177If your crontab has `>> sync.log 2>&1`, remove it to prevent duplicate log entries: 1178 1179**Before (causes duplicates):** 1180``` 1181*/2 * * * * cd /var/www/html/dokuwiki/lib/plugins/calendar && php sync_outlook.php >> /var/www/html/dokuwiki/data/meta/calendar/sync.log 2>&1 1182``` 1183 1184**After (correct):** 1185``` 1186*/2 * * * * cd /var/www/html/dokuwiki/lib/plugins/calendar && php sync_outlook.php 1187``` 1188 1189The script automatically logs to `data/meta/calendar/sync.log`. 1190 1191## Version 6.7.5 (2026-02-11) - FIX SYNC LOG OUTPUT 1192 1193### Bug Fixes 1194- **Fixed:** Sync log not showing output when running sync from admin panel 1195 - Added `--verbose` flag to sync command so output is captured 1196 - Sync output is now captured and written to the log file 1197 - Log directory is created if it doesn't exist 1198 - Better error handling if log directory isn't writable 1199 - Command being executed is logged for debugging 1200 1201### Changes 1202- Sync now runs in verbose mode when triggered from admin panel 1203- All sync output (stdout/stderr) is written to the log file 1204- Pre-flight check ensures log directory exists and is writable 1205 1206## Version 6.7.4 (2026-02-11) - FIX MANUAL SYNC EXECUTION 1207 1208### Bug Fix 1209- **Fixed:** "Could not open input file: sync_outlook.php" when running manual sync 1210 - The `$pluginDir` variable was missing from `runSync()` function 1211 - Added `$pluginDir = DOKU_PLUGIN . 'calendar'` before building the command 1212 - Sync now properly changes to the plugin directory before executing 1213 1214## Version 6.7.3 (2026-02-11) - FIX ADDITIONAL COUNT TYPE ERRORS 1215 1216### Bug Fix 1217- **Fixed:** Additional TypeError "count(): Argument #1 ($value) must be of type Countable|array, int given" 1218 - Fixed in `scanDirectoryForStats()` (line 5453) 1219 - Fixed in namespace delete function (line 4137) 1220 - Fixed in export function (line 5516) 1221 - Fixed in import function (line 5636) 1222 - All locations now check `is_array()` before calling `count()` 1223 1224## Version 6.7.2 (2026-02-11) - FIX EVENT MANAGER TYPE ERROR 1225 1226### Bug Fix 1227- **Fixed:** TypeError "count(): Argument #1 ($value) must be of type Countable|array, int given" 1228 - Added array type checks when iterating over calendar event data 1229 - Protects against corrupted JSON data where event lists may not be arrays 1230 - Added safeguards in `getEventsByNamespace()` and `scanNamespaceRecursive()` 1231 1232## Version 6.7.1 (2026-02-11) - BULK DELETE FOR BACKUPS 1233 1234### Changed 1235- **Improved:** Backup management now uses bulk selection and delete 1236 - Added checkboxes next to each backup file 1237 - Added "Select All" checkbox in the action bar 1238 - Added "️ Delete Selected" button (appears when backups are selected) 1239 - Removed individual delete buttons from each row 1240 - Shows count of selected backups 1241 - Backups are deleted sequentially with visual feedback 1242 1243### UI 1244- Clean action bar at top of backup table with selection controls 1245- Selected count updates in real-time 1246- Rows fade out smoothly when deleted 1247 1248## Version 6.7.0 (2026-02-11) - IMPROVED RESTORE FUNCTION 1249 1250### Changed 1251- **Improved:** Restore function now uses DokuWiki's Extension Manager API 1252 - Uses `helper_plugin_extension_extension` for proper installation 1253 - Handles permissions correctly through DokuWiki's standard plugin installation process 1254 - Falls back to manual instructions if Extension Manager is not available 1255 1256### How It Works 1257When you click " Restore" on a backup: 12581. The plugin loads DokuWiki's extension helper 12592. Calls `installFromLocal()` with the backup ZIP file 12603. DokuWiki's Extension Manager handles file extraction and installation 12614. This ensures proper permissions and follows DokuWiki standards 1262 1263### Fallback 1264If the Extension Manager helper is not available, you'll be prompted to: 1265- Download the backup ZIP 1266- Go to Admin → Extension Manager → Install 1267- Upload the ZIP file manually 1268 1269## Version 6.6.9 (2026-02-11) - REMOVE RESTORE FUNCTION 1270 1271### Removed 1272- **Removed:** "Restore" button from backup management 1273- **Removed:** `restoreBackup()` PHP method 1274- **Removed:** `restoreBackup()` JavaScript function 1275 1276### Added 1277- **Added:** Informational note in backup section explaining how to restore: 1278 - Download the backup ZIP file 1279 - Go to Admin → Extension Manager → Install 1280 - Upload the ZIP file there 1281 - DokuWiki's extension manager handles installation safely with proper permissions 1282 1283### Reason 1284The 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. 1285 1286## Version 6.6.8 (2026-02-11) - FIX THEME KEYS & FILE PERMISSIONS 1287 1288### Bug Fixes 1289- **Fixed:** "Undefined array key" warnings for wiki theme (pastdue_color, pastdue_bg, tomorrow_bg, etc.) 1290 - Added missing theme keys to `getWikiTemplateColors()` return array 1291 1292- **Fixed:** "Permission denied" errors for sync.log and sync_state.json 1293 - Moved sync files from plugin directory to `data/meta/calendar/` (writable location) 1294 - Updated sync_outlook.php, admin.php to use new paths 1295 - sync_config.php remains in plugin directory (must be manually configured) 1296 1297- **Fixed:** `findEventNamespace` now returns the actual DIRECTORY where event file lives 1298 - This ensures deletion works correctly when stored namespace differs from file location 1299 1300### Note on lang.php Permission Error 1301If 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. 1302 1303## Version 6.6.7 (2026-02-11) - FIX NAMESPACE CHANGE BUG (PART 2) 1304 1305### Bug Fix 1306- **Fixed:** Events in the DEFAULT namespace (no namespace) could not be moved to other namespaces 1307 - Root cause: The comparison `$oldNamespace !== ''` was always FALSE for default namespace events 1308 - Changed to `$oldNamespace !== null` to properly distinguish between "event not found" (null) and "event in default namespace" ('') 1309 - This allows moving events FROM the default namespace TO any other namespace 1310 - Also fixed null coalescing for recurring events: `$oldNamespace ?? $namespace` instead of `$oldNamespace ?: $namespace` 1311 1312## Version 6.6.6 (2026-02-11) - FIX NAMESPACE CHANGE & DELETE BUGS 1313 1314### Bug Fixes 1315- **Fixed:** Changing an event's namespace now properly moves the event instead of creating a duplicate 1316 - Root cause: `findEventNamespace()` was searching in the NEW namespace instead of ALL namespaces 1317 - Now uses wildcard search `'*'` to find the existing event regardless of its current namespace 1318 1319- **Fixed:** Deleting an event no longer causes the calendar to filter by the deleted event's namespace 1320 - Root cause: After deletion, `reloadCalendarData()` was called with the deleted event's namespace 1321 - Now retrieves the calendar's original namespace from `container.dataset.namespace` 1322 - Also fixed in `saveEventCompact()` and `toggleTaskComplete()` for consistency 1323 1324## Version 6.6.5 (2026-02-11) - ADD AUTOCOMPLETE ATTRIBUTES 1325 1326### Improved 1327- Added `autocomplete="new-password"` to client secret input field 1328- Added `autocomplete="email"` to user email input field 1329- Added `autocomplete="off"` to client ID input field 1330- Follows browser best practices for form inputs 1331 1332## Version 6.6.4 (2026-02-11) - FIX GEOLOCATION VIOLATION 1333 1334### Bug Fix 1335- **Fixed:** Browser violation "Only request geolocation information in response to a user gesture" 1336- Weather widget now uses Sacramento as the default location on page load 1337- Geolocation is only requested when user **clicks** on the weather icon 1338- Click the weather icon to get your local weather (browser will prompt for permission) 1339- Weather icon shows tooltip "Click for local weather" and has pointer cursor 1340 1341## Version 6.6.3 (2026-02-11) - FIX MUTATIONOBSERVER ERROR 1342 1343### Bug Fix 1344- **Fixed:** `Failed to execute 'observe' on 'MutationObserver': parameter 1 is not of type 'Node'` error 1345- Root cause: MutationObserver tried to observe `document.body` before DOM was ready 1346- Added `setupMutationObserver()` function that waits for DOMContentLoaded before attaching observer 1347 1348## Version 6.6.2 (2026-02-11) - FIX CONFLICT TOOLTIP JAVASCRIPT LOADING 1349 1350### Bug Fix 1351- **Critical:** Fixed `showConflictTooltip is not defined` and `hideConflictTooltip is not defined` errors 1352- Root cause: `addAssets()` in action.php was loading empty `script.js` instead of `calendar-main.js` 1353- Changed `addAssets()` to load `calendar-main.js` directly 1354- Updated `script.js` to dynamically load `calendar-main.js` as a fallback mechanism 1355 1356## Version 6.6.1 (2026-02-11) - SECURITY FIXES 1357 1358### Security 1359- **Critical:** Removed `eval()` remote code execution vulnerability in config import 1360- **Critical:** Added admin authentication requirement to `get_system_stats.php` endpoint 1361- **High:** Added CSRF token verification to all write operations (save, delete, toggle) 1362- **High:** Fixed path traversal vulnerabilities in namespace delete/rename functions 1363- **High:** Added admin privilege verification to AJAX admin routes 1364 1365### Improved 1366- **Input Validation:** Date format (YYYY-MM-DD), time format (HH:MM), color format (#RRGGBB) 1367- **Input Validation:** Year range (1970-2100), month range (1-12), namespace format 1368- **Input Validation:** Recurrence type whitelist, title/description length limits 1369- **Debug Logging:** All debug logging now conditional on `CALENDAR_DEBUG` constant (off by default) 1370- **JSON Handling:** Added `safeJsonRead()` helper with proper error handling 1371- **Timezone:** Sync script now uses configured timezone instead of hardcoded value 1372 1373### Code Quality 1374- Documented intentional switch fallthrough in `get_system_stats.php` 1375- Standardized error response format 1376 1377## Version 6.6.0 (2026-02-11) - BACKUP & UI IMPROVEMENTS 1378 1379### Fixed 1380- **Backup:** Fixed recursive directory backup to properly include all subdirectories (including `lang/`) 1381- **Backup:** Now uses `SELF_FIRST` iterator to process directories before their contents 1382- **Backup:** Empty directories are now explicitly added with `addEmptyDir()` to preserve structure 1383 1384### UI Change 1385- **Namespace Explorer:** Cleanup status message now appears prominently at top of section 1386- Previously status message was at bottom, easy to miss after cleanup operations 1387 1388## Version 6.5.5 (2026-02-11) - FIX AJAX ROUTING & MOVE CLEANUP BUTTON 1389 1390### Bug Fix 1391- All admin AJAX actions (cleanup, rescan, extend, trim, pause, resume, change start/pattern) were returning "Unknown action" 1392- Root cause: AJAX calls go through `action.php`'s switch statement, not `admin.php`'s `handle()` method 1393- Added routing in `action.php`: new cases forward to `admin.php` via `routeToAdmin()` helper 1394- Added public `handleAjaxAction()` method in `admin.php` as the entry point from `action.php` 1395 1396### UI Change 1397- Moved " Cleanup" button from standalone section to inline next to "➕ New Namespace" in the control bar 1398- Status messages still appear below the namespace explorer 1399 1400## Version 6.5.4 (2026-02-11) - FIX PHP PARSE ERROR IN CLEANUP JS 1401 1402### Bug Fix 1403- Root cause: `style='color:...'` single quotes inside PHP `echo '...'` block terminated the PHP string prematurely 1404- PHP saw `color:#e74c3c` as unexpected PHP code instead of part of the JS string 1405- Fixed all 5 occurrences in cleanupEmptyNamespaces JS: escaped single quotes as `\'` 1406- Added `adminColors` JS object (text, bg, border) injected from PHP `$colors` at render time 1407- Cleanup detail text uses `adminColors.text` to respect DokuWiki template theme colors 1408 1409## Version 6.5.3 (2026-02-11) - FIX CLEANUP NAMESPACES PARSE ERROR 1410 1411### Bug Fix 1412- Fixed PHP parse error on line 1089 caused by `$colors['text']` PHP variable inside JS string concatenation 1413- The cleanup results detail list now uses hardcoded `#666` for text color instead of attempting PHP interpolation within JS runtime code 1414 1415## Version 6.5.2 (2026-02-11) - CLEANUP EMPTY NAMESPACES 1416 1417### New Feature 1418- " Cleanup Empty Namespaces" button added at bottom of Namespace Explorer section 1419- Dry-run scan first: shows exactly what will be removed with bullet-point details in confirm dialog 1420- Removes empty calendar folders (0 JSON files or all-empty JSON files) from any namespace 1421- Removes parent namespace directories if they become empty after calendar folder removal 1422- Root calendar directory is never removed 1423- AJAX-powered with inline status showing results after cleanup 1424- Page auto-reloads after 2 seconds to refresh the namespace explorer view 1425- Recursively scans all nested namespace directories via `findAllCalendarDirsRecursive()` 1426 1427## Version 6.5.1 (2026-02-11) - TRIM ALL PAST: SHOW COUNT BEFORE DELETE 1428 1429### Improved 1430- "Trim All Past" button now does a dry-run count before showing the confirmation dialog 1431- Confirmation shows exact count: "Found 47 past recurring events to remove" 1432- If zero found, shows "No past recurring events found to remove" instead of confirm 1433- PHP handler supports `dry_run` parameter that counts without deleting 1434 1435## Version 6.5.0 (2026-02-11) - BULK TRIM ALL PAST RECURRING EVENTS 1436 1437### Bulk Action 1438- Red "✂️ Trim All Past" button added next to the Rescan button in the Recurring Events section header 1439- Removes ALL past occurrences (before today) from EVERY recurring series in one click 1440- Only removes events with `recurring` or `recurringId` flags — non-recurring events are untouched 1441- Confirmation dialog required before execution 1442- AJAX-powered with inline status showing count removed, then auto-rescans the table 1443- Searches all calendar directories recursively 1444 1445## Version 6.4.9 (2026-02-11) - FIX RECURRING EDIT/DELETE: SEARCH ALL DIRECTORIES 1446 1447### Bug Fix 1448- Edit and Delete recurring series now search ALL calendar directories instead of building a path from the namespace field 1449- Root cause: event's `namespace` field (stored in JSON) can differ from the filesystem directory where the file lives 1450- Both handlers now use `findCalendarDirs()` to collect every calendar directory recursively 1451- Events matched by title AND namespace field (case-insensitive) for precise targeting 1452- Edit handler rewritten: rename/time/namespace updates in Pass 1, interval respace in Pass 2 1453- New `findCalendarDirs()` helper method for recursive directory discovery 1454 1455## Version 6.4.8 (2026-02-11) - FIX PHP PARSE ERROR IN MANAGE DIALOG 1456 1457### Bug Fix 1458- Rewrote `manageRecurringSeries()` JS function using string concatenation instead of template literals 1459- JS template literals (`${...}`) inside PHP echo blocks caused PHP to parse them as variable interpolation 1460- All inline onclick handlers now use `\x27` for single quotes to avoid escaping conflicts 1461 1462## Version 6.4.7 (2026-02-11) - RECURRING EVENTS: FULL MANAGEMENT CONTROLS 1463 1464### New "Manage" Button per Series 1465- Orange "Manage" button opens a comprehensive management dialog for each recurring series 1466 1467### Extend Series 1468- Add N new occurrences after the last event in the series 1469- Configurable interval: Daily, Weekly, Bi-weekly, Monthly, Quarterly, Yearly 1470- New events copy title, time, color, namespace, and recurring flag from the last event 1471 1472### Trim Past Events 1473- Remove all occurrences before a selected cutoff date 1474- Confirmation required before deletion 1475- Cleans up empty date keys and files automatically 1476 1477### Change Pattern 1478- Respace future occurrences with a new interval 1479- Past events are untouched; only future events are removed and re-created 1480- First future event becomes the anchor date 1481 1482### Change Start Date 1483- Shift ALL occurrences by the difference between old and new start date 1484- Events are removed from old positions and re-created at new positions 1485- Preserves spacing between all events 1486 1487### Pause/Resume 1488- Pause: adds ⏸ prefix and paused flag to all future occurrences 1489- Resume: removes ⏸ prefix and paused flag from all occurrences 1490- Button toggles based on whether series is currently paused 1491 1492### Infrastructure 1493- New shared `recurringAction()` JS helper for all AJAX management operations 1494- New `getRecurringSeriesEvents()` PHP helper for finding all events in a series 1495- Status messages shown inline in the management dialog 1496- Close button triggers automatic rescan to refresh the table 1497 1498## Version 6.4.6 (2026-02-11) - RECURRING EVENTS: RESCAN BUTTON & IMPROVED LOGIC 1499 1500### Rescan Button 1501- Green " Rescan" button added to the Recurring Events section header 1502- AJAX-powered: rescans all calendar data and refreshes the table without page reload 1503- Shows count of found series briefly after scan completes 1504 1505### Improved Detection Logic 1506- Events with `recurring: true` flag are now detected first (grouped by `recurringId`) 1507- Pattern-detected events (3+ same-title occurrences) are found separately and deduplicated 1508- New "Source" column shows ️ Flagged (has recurring flag) vs Detected (pattern match) 1509- Median interval used for pattern detection instead of just first two dates (more robust) 1510- New patterns recognized: Quarterly, Semi-annual, and "Every ~N days" for custom intervals 1511- Empty/invalid titles and malformed date arrays are now skipped safely 1512- Dates are deduplicated before counting (prevents inflated counts from multi-day events) 1513- Nested namespace directories now scanned recursively 1514- Results sorted alphabetically by title 1515 1516## Version 6.4.5 (2026-02-11) - ADMIN VERSION HISTORY OVERHAUL 1517 1518### Version History Viewer 1519- All purple (#7b1fa2) accent colors replaced with green (#00cc07) to match admin theme 1520- Changelog parser now handles `###` subsection headers (rendered as green bold labels) 1521- Plain `- ` bullet items now parsed and categorized under their subsection 1522- Previously only `- **Type:** description` format was recognized 1523 1524### Current Release Button 1525- Green "Current Release" button added between nav arrows 1526- Jumps directly to the card matching the running version from plugin.info.txt 1527- Running version card shows green "RUNNING" badge and thicker green border 1528 1529## Version 6.4.4 (2026-02-11) - WIKI THEME: PAST EVENTS TOGGLE BACKGROUND 1530 1531### Fix 1532- Wiki theme past events pulldown (retracted state) now uses `__background_neu__` (`--cell-today-bg`) 1533- Previously used `--cell-bg` which appeared unthemed/white 1534 1535## Version 6.4.3 (2026-02-11) - WIKI THEME: DAY HEADERS BACKGROUND 1536 1537### Fix 1538- Wiki theme SMTWTFS day headers now use `__background_neu__` (`--cell-today-bg`) instead of `--background-header` 1539 1540## Version 6.4.2 (2026-02-11) - WIKI THEME: DAY HEADERS (INITIAL) 1541 1542### Wiki Theme Day Headers 1543- Added explicit CSS override for `.calendar-theme-wiki .calendar-day-headers` 1544- Day header text uses `--text-primary` (template's `__text__` color) 1545 1546## Version 6.4.1 (2026-02-11) - WIKI THEME: EVENT HIGHLIGHT 1547 1548### Fix 1549- Wiki theme event highlight (when clicking calendar bar) now uses `themeStyles.header_bg` (`__background_alt__`) instead of hardcoded blue (#dce9f5) 1550- Subtle shadow instead of blue glow 1551 1552## Version 6.4.0 (2026-02-11) - DARK READER: SECTION BAR COLOR MATCHING 1553 1554### Fix 1555- Wiki theme section left bar now uses a `<div>` with `background` instead of `border-left` 1556- Dark Reader maps the same color differently for border vs background properties, causing visual mismatch 1557- Both the bar and header now use `background`, so Dark Reader maps them identically 1558- Flex layout wrapper added for wiki theme sections 1559- Wiki fallback colors updated: `border` key now uses `#ccc` (matching `__border__`) instead of `#2b73b7` 1560 1561## Version 6.3.9 (2026-02-10) - WIKI THEME: SECTION BAR FIX (ATTEMPT) 1562 1563### Fix 1564- Simplified wiki section container — removed `wiki-section-container` class 1565- Added `background` from `$themeStyles['bg']` to section container 1566 1567## Version 6.3.8 (2026-02-10) - WIKI THEME: BUTTON & SECTION HEADER COLORS 1568 1569### Wiki Theme Buttons 1570- Nav buttons (< >), Today button, and panel buttons now use `__link__` color background with white text 1571- CSS overrides for `.calendar-theme-wiki .cal-nav-btn`, `.cal-today-btn`, panel buttons 1572 1573### Wiki Theme Section Headers 1574- Today: `__link__` background (accent/link color) 1575- Tomorrow: `__background_alt__` background (alternate background) 1576- Important: `__border__` background (border color) 1577- Each section now has a distinct color from the template palette 1578 1579## Version 6.3.7 (2026-02-10) - WIKI THEME CHECKBOX FIX 1580 1581### Fix 1582- Wiki theme checkbox override changed from `border-color` to full `border: 2px solid` shorthand 1583- Properly overrides the base rule which uses `border` shorthand 1584- Hover state also uses full shorthand 1585 1586## Version 6.3.6 (2026-02-10) - WIKI THEME CHECKBOX BORDER COLOR 1587 1588### Fix 1589- Wiki theme unchecked checkboxes now use `--border-main` (template's `__border__` color) for border 1590- Checked state fills with border color 1591- Hover state uses border color 1592- Applied to calendar, sidebar, and eventlist containers 1593 1594## Version 6.3.5 (2026-02-10) - WIKI THEME: ALLOW DARK READER ON HEADERS 1595 1596### Fix 1597- Wiki theme section headers (Today/Tomorrow/Important) no longer use `!important` or `-webkit-text-fill-color` 1598- Dark Reader can now freely adjust background, text color, and borders on wiki theme headers 1599- Clicked-day panel header and section border-left also unlocked for wiki theme 1600- All other themes (matrix/purple/pink/professional) retain full Dark Reader protection 1601 1602## Version 6.3.4 (2026-02-10) - WIKI THEME: BORDER COLOR FOR HEADERS & BADGES 1603 1604### Wiki Theme Color Remapping 1605- `border` (accent color) now maps to template's `__border__` instead of `__link__` 1606- This affects: section headers (Today/Tomorrow/Important), badges (TODAY, namespace), sidebar widget border, clicked-day panel, `--border-main` CSS variable 1607- `text_bright` still maps to `__link__` for link text and accent text 1608- Section headers all use the same `__border__` color for consistent appearance 1609- Updated COLOR_SCHEME mapping documentation 1610 1611## Version 6.3.3 (2026-02-10) - WIKI THEME SECTION HEADER TEXT COLOR 1612 1613### Fix 1614- Wiki theme Today/Tomorrow/Important section header text now uses `$themeStyles['text_primary']` (mapped from template's `__text__` color) instead of hardcoded white 1615- Clicked-day panel header text also uses template text color for wiki theme 1616- Professional theme remains white text on blue headers 1617 1618## Version 6.3.2 (2026-02-10) - FIX THEME NOT UPDATING ON SIDEBAR EVENTLIST 1619 1620### Bug Fix 1621- Added `$renderer->nocache()` to the render function 1622- DokuWiki was caching the rendered sidebar HTML, so theme changes made in admin were never reflected until the page was manually edited 1623- Now all calendar/eventlist/eventpanel outputs are rendered fresh on each page load, picking up the current theme from `calendar_theme.txt` 1624 1625## Version 6.3.1 (2026-02-10) - EVENTLIST THEMING 1626 1627### {{eventlist}} Theme Support 1628- Eventlist containers now receive theme class (`eventlist-theme-matrix`, etc.) and full CSS variable injection 1629- Dark themes get themed border + glow, light themes get subtle border 1630- Container background set from `$themeStyles['bg']` with `!important` 1631 1632### Eventlist CSS Theme Rules (all 3 dark themes) 1633- Title, header, time, date, body, links, strong, code, namespace badge, empty state 1634- Today header, clock, date — all with `color` + `-webkit-text-fill-color` `!important` 1635- Item borders, section backgrounds, code block backgrounds 1636- Full Dark Reader protection via same inline+CSS approach as calendar/sidebar 1637 1638## Version 6.3.0 (2026-02-10) - DARK READER COMPATIBILITY & COMPLETE THEMING 1639 1640### Dark Reader Browser Extension Compatibility 1641All 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. 1642 1643**Protected elements:** 1644- Section headers (Today/Tomorrow/Important) — background, text color, text-fill-color 1645- Clicked-day panel header — background, text color, close button 1646- All badges (TODAY, PAST DUE, namespace, panel namespace, eventlist-simple) — background, text, text-fill-color 1647- Event titles, meta, descriptions — color with !important via CSS 1648- Day numbers, nav buttons, calendar day headers — color with !important via CSS 1649- System status bars — inline background !important on tracks and fills 1650- System tooltips — background, border-color, text color all set via setProperty with !important 1651- Section left border bars — border-left with !important 1652- Event color indicator bars — border-left-color with !important 1653- Sidebar section event text (Purple and Pink themes) 1654 1655### Complete CSS Variable Audit (41 conversions in v6.1.1) 1656- All remaining hardcoded colors in style.css converted to CSS variable references 1657- Calendar borders, text colors, backgrounds, input focus shadows, accent borders 1658- Only legitimate hardcodes remain (keyframe animations, theme-specific override blocks) 1659 1660### Semantic Color System 1661- New CSS variables: `--pastdue-color`, `--pastdue-bg`, `--pastdue-bg-strong`, `--pastdue-bg-light` 1662- New CSS variables: `--tomorrow-bg`, `--tomorrow-bg-strong`, `--tomorrow-bg-light` 1663- Injected into all 3 CSS var blocks (full calendar, event panel, sidebar widget) 1664- Today/Tomorrow/Important section colors now theme-derived instead of hardcoded 1665 1666### Section Headers Fully Themed 1667- Today/Tomorrow/Important headers use theme accent colors instead of fixed green/orange/purple 1668- Matrix: bright/standard/dim green, Purple: bright/standard/dim purple, Pink: hot/medium/light pink 1669- Professional: blue shades, Wiki: template-derived colors 1670- Dark theme headers use dark background color for text contrast 1671 1672### Pink Theme Enhancements 1673- **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 1674- **Firework button hover** — `pink-firework-burst` keyframe animation with multi-point radiating box-shadows, scale/brightness effects on hover, instant flash on click 1675- **Checkbox glow** — hot pink border with ambient glow, hover intensifies, checked fills with glow 1676 1677### All Theme Checkbox Theming 1678- Matrix: bright green border + green glow, Purple: purple border + purple glow 1679- Pink: hot pink border + pink glow (with enhanced ambient effect) 1680- Hover scales 1.1x with intensified glow on all themes 1681- Checked state fills with theme accent color + outer glow 1682 1683### System Tooltips Themed 1684- Both tooltip functions use theme-derived colors from `$themeStyles` 1685- Green tooltip: `text_bright`, Purple: `border`, Orange: `text_primary` 1686- Background from `$themeStyles['bg']`, divider borders use theme accent colors 1687- All properties set with `style.setProperty(prop, value, "important")` 1688 1689### Namespace Filter Badge Cleanup 1690- Removed inline namespace badge from event side panel header 1691- Filter indicator bar ("Filtering: namespace ✕") retained and working 1692- AJAX-based namespace filtering fully functional via onclick handlers 1693 1694## Version 6.1.0 (2026-02-10) - TODAY INDICATOR, BUTTON HOVER & CHECKBOXES 1695 1696### Today Indicator 1697- **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) 1698- **Added:** Today cell has `--cell-today-bg` background AND a visible inset border glow on hover using `--border-main` 1699- **Added:** `.day-num` now uses `--text-primary` for color instead of relying on browser default 1700 1701### Button Hover/Click Theming 1702- **Fixed:** All buttons now use `filter: brightness(1.3)` on hover for a visible glow effect across all themes 1703- **Fixed:** All buttons use `filter: brightness(0.85)` on click/active for a press-down darkening effect 1704- **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 1705- **Removed:** Generic `opacity: 0.9` hover which was barely visible on dark themes 1706 1707### Checkboxes Themed 1708- **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 1709- **Added:** `accent-color: var(--text-bright)` on all dialog checkboxes (task, recurring) for consistent theme coloring 1710 1711### Form Input Text 1712- **Fixed:** `.input-sleek` now has `color: var(--text-primary)` — form text is visible on dark themes 1713- **Added:** `::placeholder` styling for inputs/textareas using `--text-dim` 1714 1715## Version 6.0.9 (2026-02-09) - FORM TEXT, CELL HOVER & GLOW TUNING 1716 1717### Form Input Text Fix 1718- **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)`. 1719- **Added:** Themed placeholder text (`::placeholder`) for inputs/textareas 1720 1721### Button & Cell Hover Theming 1722- **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` 1723- **Improved:** Nav buttons (`◄`/`►`) and Today button hover now show a themed glow + scale effect instead of just opacity change 1724- **Added:** Active (click) state for nav/today buttons with scale-down feedback 1725- **Improved:** Month picker hover now also shows a subtle theme shadow 1726 1727### Glow Reduced to 1px for Matrix/Purple 1728- Matrix and purple text glow reduced from 2px to 1px across: event titles, descriptions, meta, links, sidebar day numbers, sidebar event titles, sidebar dates 1729- Matrix clock pulse animation reduced from 6px/10px+15px to 2px/4px+6px 1730- Weather text glow reduced to 1px, clock to 2px 1731- Pink remains at 2px (barely noticeable) 1732 1733## Version 6.0.8 (2026-02-09) - LINKS, GLOW CONSISTENCY & PINK TONE-DOWN 1734 1735### Links Themed 1736- **Added:** `.cal-link` CSS class — all links rendered via `renderDescription()` now pick up theme accent color via `--text-bright` 1737- **Fixed:** Sidebar widget links (`a.cal-link`) inherit theme colors 1738- **Fixed:** Event list widget description links (`eventlist-widget-desc a`) use CSS vars 1739- **Fixed:** Simple event list body links/strong/code all themed 1740 1741### Text Glow Consistency 1742- **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 1743- **Added:** Subtle link glow on dark themes 1744- **Added:** Matrix and purple now get the same barely-visible text glow that pink had on sidebar week grid day numbers and event titles 1745 1746### Pink Glow Toned Down 1747- **Reduced:** Sidebar today header box-shadow from `0 0 10px 0.4` to `0 0 6px 0.25` 1748- **Reduced:** Day number sparkle animation from 3px/6px+10px to 2px/3px 1749- **Reduced:** Today cell shimmer from 3px+5px / 8px+12px to 2px+3px / 4px+6px 1750- **Reduced:** Event bar glow pulse from 2px/4px+6px to 1px/2px+3px 1751- **Reduced:** Today hover glow from 10px+15px to 5px+8px 1752- **Reduced:** Event item glow from 2px/5px to 1px/3px 1753- **Reduced:** Calendar container glow from 8px to 5px 1754 1755### Other 1756- **Themed:** Sidebar weather, date, and clock text colors and glow via CSS vars 1757 1758## Version 6.0.7 (2026-02-09) - BADGES, BUTTONS & CONFLICT THEMING 1759 1760- **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 1761- **Fixed:** TODAY badge uses `--border-main` for background instead of hardcoded purple 1762- **Fixed:** Conflict alert badge (`⚠️`) uses `--border-main` background and `--text-bright` border — matches theme accent 1763- **Fixed:** Conflict tooltip header background now set inline from theme vars (tooltip is appended to body, can't inherit CSS vars) 1764- **Fixed:** Conflict tooltip body items use themed text and border colors 1765- **Fixed:** Month picker Go/Cancel buttons themed (`--text-bright` for save, `--cell-bg` for cancel) 1766- **Fixed:** Calendar header month/year hover uses `--cell-today-bg` background 1767- **Fixed:** Inline search input border uses `--border-color` 1768- **Fixed:** Event list header border uses `--border-color` 1769 1770## Version 6.0.6 (2026-02-09) - COMPLETE TEXT THEMING 1771 1772- **Fixed:** Calendar header month/year title had hardcoded dark color — now uses `--text-primary` 1773- **Fixed:** Month/year picker hover used hardcoded gray background and green text — now uses `--cell-today-bg` and `--text-bright` 1774- **Fixed:** Event list items (titles, meta, descriptions, links, code blocks, bold text) — all now theme-aware via CSS vars 1775- **Fixed:** Completed/past event states used hardcoded grays — now use `--cell-bg`, `--text-dim`, `--cell-today-bg` 1776- **Fixed:** Scrollbar track/thumb colors now use theme vars 1777- **Fixed:** Namespace filter indicator (background, label, badge, close button) — all themed 1778- **Fixed:** Panel standalone month picker hover and namespace badge — themed 1779- **Fixed:** Calendar header border-bottom — now uses `--border-color` 1780 1781## Version 6.0.5 (2026-02-09) - THEMED BORDERS & EVENT PANEL 1782 1783- **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). 1784- **Added:** Theme-colored border and glow for event panel (`{{eventpanel}}`) on dark themes using `[data-theme]` attribute selectors 1785- **Themed:** Event panel header (nav buttons, month title, today button, search input, add button) — all now use CSS vars 1786- **Themed:** Panel standalone header background and border 1787 1788## Version 6.0.4 (2026-02-09) - FULL DIALOG THEMING 1789 1790- **Fixed:** Day cell click popup (day-popup) used hardcoded white/gray colors — now fully theme-aware using CSS variables 1791- **Fixed:** Event add/edit dialog (dialog-content-sleek) had hardcoded white background and blue header — now uses theme colors 1792- **Fixed:** Month picker dialog had hardcoded white background and dark text — now themed 1793- **Fixed:** Popup event items, titles, times, descriptions, footer, add-event button, close button — all now use CSS vars with sensible fallbacks 1794- **Fixed:** Form elements (field labels, inputs, checkboxes, recurring options, color pickers) — all reference theme CSS vars 1795- **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. 1796 1797## Version 6.0.3 (2026-02-09) - MOVE IMPORTANT NAMESPACES TO MANAGE TAB 1798 1799- **Moved:** Important Namespaces section from Outlook Sync tab to Manage Events tab (between Events Manager and Cleanup sections) 1800- **Changed:** Section header color from purple (#9b59b6) to green (#00cc07) to match other Manage tab sections 1801- **Added:** Dedicated Save button and `save_important_namespaces` action handler — setting is now independent of Outlook config save 1802- **Fixed:** Saving Outlook config no longer overwrites important namespaces with the default value 1803 1804## Version 6.0.2 (2026-02-09) - FIREFOX DAY HEADER FIX 1805 1806- **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. 1807 1808## Version 6.0.1 (2026-02-09) - THEME PARAMETER FIX 1809 1810- **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()` 1811- **Fixed:** `renderEventDialog` also ignored theme context — now receives theme from its caller 1812- **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. 1813 1814 1815## Version 6.0.0 (2026-02-09) - CODE AUDIT & v6 RELEASE 1816 1817- **Audited:** All PHP files (syntax.php, action.php, admin.php, sync_outlook.php) — balanced braces confirmed 1818- **Audited:** calendar-main.js (2,840 lines) — Node syntax check passed, 44 global functions verified 1819- **Audited:** style.css (3,218 lines) — balanced braces confirmed 1820- **Audited:** All admin manage tab action handlers verified functional (13 actions) 1821- **New:** Fresh README.md for GitHub with complete documentation 1822- **Includes all v5.5.x fixes:** 1823 - Delta sync for Outlook (hash-based change tracking, O(changes) not O(total)) 1824 - Wiki theme sidebar section headers: distinct colors, no glow, themed day-click panel 1825 - Conflict badges on past events after AJAX navigation 1826 - Admin panel: green cleanup header, fixed broken CSS, endTime field name, cache clearing for all mutations, empty file cleanup, dead code removal 1827 1828## Version 5.5.9 (2026-02-09) - ADMIN MANAGE TAB CLEANUP 1829 1830- **Fixed:** Cleanup Old Events section header now green (#00cc07) to match all other section headers 1831- **Fixed:** Recurring stat card had broken CSS from `$colors['bg'] . '3e0'` concatenation — now uses proper `#fff3e0` 1832- **Fixed:** Same broken CSS pattern in Outlook Sync tab log warning 1833- **Fixed:** `editRecurringSeries` wrote `end_time` instead of correct `endTime` field name 1834- **Fixed:** `editRecurringSeries` used uninitialized `$firstEventDate` variable — now properly declared 1835- **Fixed:** `moveEvents` and `moveSingleEvent` could crash if event date key didn't exist in JSON — added `isset()` check 1836- **Fixed:** `moveSingleEvent` now cleans up empty date keys and deletes empty files after moving 1837- **Fixed:** `deleteRecurringSeries` now cleans up empty date keys and deletes empty JSON files 1838- **Fixed:** Export version was hardcoded as '3.4.6' — now reads dynamically from plugin.info.txt 1839- **Added:** `clearStatsCache()` helper method — all 11 mutation functions now properly clear the event stats cache 1840- **Removed:** Dead `move_events` action handler (all forms use `move_selected_events`) 1841- **Removed:** `console.log` debug statements from `sortRecurringTable` and `editRecurringSeries` 1842- **Removed:** Stale "NEW!" comment from Events Manager section 1843 1844## Version 5.5.8 (2026-02-09) - DELTA SYNC & WIKI THEME SIDEBAR POLISH 1845 1846- **Added:** Outlook sync now uses hash-based delta tracking — only new, modified, or deleted events hit the API 1847- **Added:** computeEventHash() hashes all sync-relevant fields (title, description, time, date, color, namespace, task status) 1848- **Added:** Sync state v2 format stores {outlookId, hash} per event; auto-migrates from v1 on first run 1849- **Added:** Delta analysis summary shows new/modified/unchanged/deleted counts before syncing 1850- **Changed:** Unchanged events are completely skipped (zero API calls) — O(changes) instead of O(total) 1851- **Changed:** Removed per-run duplicate scan (was re-querying every event); use --clean-duplicates when needed 1852- **Changed:** Wiki theme sidebar section headers now use distinct colors: orange (Today), green (Tomorrow), purple (Important) 1853- **Fixed:** Wiki theme sidebar section headers no longer have colored glow — clean shadow instead 1854- **Fixed:** Wiki theme week grid day-click panel header now uses accent color with white text 1855- **Fixed:** Removed invalid var(--__...__) CSS syntax from inline styles (only works in CSS files, not HTML attributes) 1856 1857## Version 5.5.7 (2026-02-09) - WIKI THEME SIDEBAR POLISH 1858 1859- **Fixed:** Sidebar Today/Tomorrow/Important headers now use three distinct colors (orange/green/purple) instead of similar greys 1860- **Fixed:** Sidebar section headers no longer glow on wiki theme (clean shadow like professional) 1861- **Fixed:** Week grid day-click panel header now uses theme accent color with white text instead of grey background 1862- **Fixed:** Removed invalid var(--__...__) CSS variable syntax from inline styles (DokuWiki replacements only work in CSS files) 1863- **Changed:** Wiki theme section header text now white for readability on colored backgrounds 1864- **Changed:** Week grid JS theme colors now use actual $themeStyles values 1865 1866## Version 5.5.6 (2026-02-09) - FIX CONFLICT BADGES ON PAST EVENTS AFTER AJAX 1867 1868- **Fixed:** Conflict badges now render on past events in JS rebuild path (were only in the future events branch) 1869 1870## Version 5.5.5 (2026-02-09) - FIX SIDEBAR CONFLICT TOOLTIP POSITIONING 1871 1872- **Fixed:** Sidebar widget conflict tooltips now display next to the badge instead of upper-left corner 1873- **Fixed:** Week grid conflict tooltips also fixed (same issue) 1874- **Changed:** All conflict badges now use unified showConflictTooltip() system with base64-encoded data 1875- **Removed:** data-tooltip CSS pseudo-element approach for conflict badges (replaced with JS tooltip) 1876 1877## Version 5.5.4 (2026-02-09) - FIX PAST EVENT EXPAND ON FIRST LOAD 1878 1879- **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) 1880 1881## Version 5.5.3 (2026-02-09) - FIX CONFLICT TOOLTIP THEME COLORS 1882 1883- **Fixed:** Conflict tooltip now finds calendar container even when badge is inside day popup (appended to body) 1884- **Fixed:** Empty CSS variable values no longer produce invisible text — fallback defaults applied when var returns empty string 1885 1886## Version 5.5.2 (2026-02-09) - FIX CONFLICT TOOLTIP JSON PARSING 1887 1888- **Fixed:** Conflict tooltip data now base64-encoded to eliminate JSON parse errors from attribute quote escaping 1889- **Fixed:** Removed double htmlspecialchars encoding on conflict titles in PHP (was escaping titles then re-escaping the JSON) 1890- **Changed:** Both PHP and JS conflict badge rendering now use base64 for data-conflicts attribute 1891- **Changed:** showConflictTooltip decodes base64 first, falls back to plain JSON for compatibility 1892 1893## Version 5.5.1 (2026-02-09) - AJAX ROBUSTNESS & DIALOG THEMING 1894 1895- **Fixed:** Conflict tooltip badges now work after AJAX month navigation via event delegation 1896- **Fixed:** All document-level event listeners guarded against duplicate attachment from multiple script loads 1897- **Fixed:** showConflictTooltip closest() selector now matches actual container IDs (cal_, panel_, sidebar-widget-) 1898- **Fixed:** Description textarea in add/edit dialog now 2 lines tall instead of 1 1899- **Added:** Event delegation for conflict badge mouseenter/mouseleave (capture phase) survives DOM rebuilds 1900- **Added:** ESC key now also closes day popups and conflict tooltips 1901- **Changed:** Namespace click filter handler wrapped in guard to prevent duplicate binding 1902 1903## Version 5.5.0 (2026-02-09) - CSS VARIABLE REFACTOR & THEME CONSISTENCY 1904 1905- **Refactored:** All theming now driven by 15 CSS custom properties injected per calendar instance 1906- **Refactored:** Removed ~85 inline styles from syntax.php and ~41 from calendar-main.js 1907- **Refactored:** style.css is now the single source of truth for all visual styling 1908- **Fixed:** Day popup (click cell) now fully themed — CSS vars propagated from container 1909- **Fixed:** Add/Edit event dialog now themed in all contexts (main calendar, eventlist panel, sidebar widget) 1910- **Fixed:** Popup footer and "+ Add Event" button were using inline themeStyles — now use CSS vars 1911- **Added:** CSS variable injection for {{eventlist panel}} containers 1912- **Added:** CSS variable injection for {{eventlist sidebar}} widget containers 1913- **Added:** propagateThemeVars() helper ensures dialogs/popups always get theme regardless of DOM position 1914- **Added:** Wiki template mapping reads __link__ as accent color from style.ini 1915- **Added:** Detailed CSS variable reference table in style.css header comment 1916- **Added:** Detailed style.ini → CSS variable mapping documentation in syntax.php 1917- **Changed:** Conflict tooltip reads CSS vars via getComputedStyle instead of data-themeStyles 1918- **Changed:** Admin changelog now uses paginated timeline viewer instead of tiny scrolling div 1919- **Removed:** Dark Reader MutationObserver compatibility (CSS vars natively compatible) 1920- **Removed:** $isWikiTheme branching from PHP render path 1921 1922## Version 5.3.6 (2026-02-09) - HEARTS + CSS BACKGROUND FIX! 1923 1924### Added: Hearts in Explosions! 1925- **Added:** 8-12 pink hearts in each click explosion 1926- **Added:** Random sizes (12-28px) and directions 1927- **Result:** Extra love in every click! 1928 1929### Fixed: Background CSS Property for Dark Mode Readers 1930- **Fixed:** Added `background: transparent` to CSS (was completely removed) 1931- **Fixed:** Now CSS readers can detect and modify background property 1932- **Why:** Inline styles override transparent, but CSS readers can now see the property 1933- **Result:** Dark mode plugins can now change calendar backgrounds! 1934 1935### The CSS Problem 1936 1937**Why backgrounds weren't changing with dark mode readers**: 1938 1939**Before (v5.3.5)**: 1940```css 1941.calendar-compact-grid tbody td { 1942 /* background removed - set via inline style */ 1943 border: 1px solid... 1944} 1945``` 1946 1947**Problem**: CSS property doesn't exist! 1948- Dark mode readers look for `background` property in CSS 1949- Can't override what doesn't exist 1950- Inline styles work, but readers can't modify them 1951 1952**After (v5.3.6)**: 1953```css 1954.calendar-compact-grid tbody td { 1955 background: transparent; /* Now exists! */ 1956 border: 1px solid... 1957} 1958``` 1959 1960**Solution**: 1961- Property exists in CSS 1962- Dark mode readers can override it 1963- Inline styles still override transparent 1964- Everyone wins! 1965 1966### What's Fixed 1967 1968**Elements now have background property**: 1969- `.calendar-compact-grid tbody td` ✓ 1970- `.calendar-compact-grid tbody td:hover` ✓ 1971- `.event-compact-item` ✓ 1972- `.event-compact-item:hover` ✓ 1973 1974**How it works**: 19751. CSS sets `background: transparent` (default) 19762. Inline styles set actual color (overrides transparent) 19773. Dark mode readers can override CSS property 19784. Works for everyone! 1979 1980### Hearts in Explosion 1981 1982**Click anywhere → Hearts explode!** 1983 1984**Heart details**: 1985- Count: 8-12 per explosion (random) 1986- Size: 12-28px (random variety) 1987- Emoji: (pink heart) 1988- Direction: Random 360° 1989- Speed: 60-140px travel 1990- Duration: 0.8-1.2s 1991- z-index: 9999999 (always visible) 1992 1993**Combined with**: 1994- 25 glowing particles 1995- 40 pixel sparkles 1996- Bright flash 1997- **Total: 73-77 elements!** 1998 1999### Visual Result 2000 2001**Click explosion**: 2002``` 2003 ✦ • ✦ 2004 • • 2005✦ • ! • ✦ 2006 • • 2007 ✦ • ✦ 2008 2009Hearts + Particles + Pixels! 2010``` 2011 2012**Dark mode now works**: 2013```css 2014/* Dark mode reader can now do this: */ 2015.calendar-compact-grid tbody td { 2016 background: #000 !important; /* Works! */ 2017} 2018``` 2019 2020### Why Transparent Works 2021 2022**CSS Cascade**: 20231. CSS: `background: transparent` (lowest priority) 20242. Inline style: `background: #f5f5f5` (overrides CSS) 20253. Dark mode CSS: `background: #000 !important` (overrides inline) 2026 2027**Perfect solution!** ✓ 2028 2029## Version 5.3.5 (2026-02-09) - PARTICLES ABOVE DIALOGS! 2030 2031### Fixed: Particles Now Appear Above All Dialogs! 2032- **Fixed:** Increased z-index to 9999999 for all particles 2033- **Fixed:** Particles now visible above event dialogs, month picker, etc. 2034- **Result:** Cursor effects and explosions always visible! 2035 2036### The Z-Index Problem 2037 2038**Before (v5.3.4)**: 2039- Particles: z-index 9999 2040- Dialogs: z-index 10000-999999 2041- **Particles hidden behind dialogs!** 2042 2043**After (v5.3.5)**: 2044- Particles: z-index 9999999 2045- Trail: z-index 9999998 2046- Pixels: z-index 9999997 2047- **Particles ALWAYS on top!** 2048 2049### What's Fixed 2050 2051✅ **Main particles** (explosion orbs) 2052✅ **Cursor trail** (glowing dots) 2053✅ **Pixel sparkles** (tiny bright stars) 2054✅ **Flash effect** (click burst) 2055 2056**All now appear above**: 2057- Event dialog popups 2058- Month picker 2059- Day popups 2060- Any modal overlays 2061 2062### Visual Result 2063 2064**Moving cursor over dialog**: 2065``` 2066┌─────────────────────┐ 2067│ Event Dialog │ 2068│ ✦ • ✦ │ ← Sparkles visible! 2069│ → ✦ │ ← Cursor trail visible! 2070│ • ✦ • │ 2071└─────────────────────┘ 2072``` 2073 2074**Clicking on dialog**: 2075``` 2076┌─────────────────────┐ 2077│ ✦ • ✦ • ✦ │ 2078│ • ! • │ ← Explosion visible! 2079│ ✦ • ✦ • ✦ │ 2080└─────────────────────┘ 2081``` 2082 2083**Perfect visibility everywhere!** ✨ 2084 2085## Version 5.3.4 (2026-02-09) - THEMED MONTH PICKER + DIALOG CURSOR FIX 2086 2087### Fixed: Month Picker Now Themed! 2088- **Fixed:** Jump to Month dialog now uses theme colors 2089- **Fixed:** Dialog background, borders, text all themed 2090- **Fixed:** Select dropdowns use theme colors 2091- **Fixed:** Buttons use theme accent colors 2092- **Result:** Month picker matches calendar theme! 2093 2094### Fixed: Cursor Effects Work in Dialogs! 2095- **Fixed:** Cursor trail now works when hovering over dialogs 2096- **Fixed:** Click explosions work when clicking inside dialogs 2097- **Technical:** Changed to capture phase event listeners 2098- **Result:** Effects work EVERYWHERE now! 2099 2100### Month Picker Theming 2101 2102**Before (v5.3.3)**: 2103- White background (hardcoded) 2104- Black text (hardcoded) 2105- No theme integration 2106- Looked out of place 2107 2108**After (v5.3.4)**: 2109- Dialog background: `theme.bg` 2110- Dialog border: `theme.border` 2111- Text color: `theme.text_primary` 2112- Dropdowns: `theme.cell_bg` + `theme.text_primary` 2113- Cancel button: `theme.cell_bg` 2114- Go button: `theme.border` (accent color) 2115 2116**Fully integrated!** ✅ 2117 2118--- 2119 2120### Theme Examples 2121 2122**Matrix Theme**: 2123``` 2124┌─────────────────────────┐ 2125│ Jump to Month │ ← Dark bg, green border 2126│ [February ▼] [2026 ▼] │ ← Dark dropdowns 2127│ [Cancel] [Go] │ ← Green "Go" button 2128└─────────────────────────┘ 2129``` 2130 2131**Pink Theme**: 2132``` 2133┌─────────────────────────┐ 2134│ Jump to Month │ ← Dark bg, pink border 2135│ [February ▼] [2026 ▼] │ ← Dark dropdowns 2136│ [Cancel] [Go] │ ← Pink "Go" button 2137└─────────────────────────┘ 2138With sparkle effects! ✨ 2139``` 2140 2141**Professional Theme**: 2142``` 2143┌─────────────────────────┐ 2144│ Jump to Month │ ← Clean bg, blue border 2145│ [February ▼] [2026 ▼] │ ← Clean dropdowns 2146│ [Cancel] [Go] │ ← Blue "Go" button 2147└─────────────────────────┘ 2148``` 2149 2150--- 2151 2152### Dialog Cursor Fix 2153 2154**The Problem**: 2155Dialogs use `event.stopPropagation()` to prevent clicks from closing them. This blocked cursor effects! 2156 2157**The Solution**: 2158Use **capture phase** event listeners: 2159```javascript 2160// Before (bubbling phase) 2161document.addEventListener('click', handler) 2162 2163// After (capture phase) 2164document.addEventListener('click', handler, true) 2165 ↑ 2166 Capture phase! 2167``` 2168 2169**Capture phase runs BEFORE stopPropagation!** 2170 2171--- 2172 2173### Now Works Everywhere 2174 2175✅ **Calendar area** 2176✅ **Event dialogs** 2177✅ **Month picker dialog** 2178✅ **Day popup dialogs** 2179✅ **Anywhere on screen** 2180 2181**No more blocked effects!** 2182 2183--- 2184 2185### Technical Details 2186 2187**Event phases**: 2188``` 21891. Capture phase ← We listen here now! 21902. Target phase 21913. Bubbling phase ← stopPropagation blocks this 2192``` 2193 2194**By using capture phase**: 2195- Events caught before stopPropagation 2196- Works in all dialogs 2197- No conflicts with dialog logic 2198 2199--- 2200 2201### All Dialogs Checked 2202 2203✅ **Month picker** - Now themed! 2204✅ **Event dialog** - Already themed 2205✅ **Day popup** - Already themed 2206 2207**Everything consistent!** 2208 2209--- 2210 2211## Version 5.3.3 (2026-02-09) - TINY NEON PIXEL SPARKLES! ✨ 2212 2213### ✨ Added: Bright Neon Pixel Sparkles Everywhere! 2214- **Added:** Tiny 1-2px bright pixel sparkles alongside cursor trail 2215- **Added:** 40 pixel sparkles in click explosions 2216- **Changed:** Cursor effects now work on ENTIRE SCREEN (not just calendar) 2217- **Result:** Maximum sparkle effect! 2218 2219### Tiny Pixel Sparkles 2220 2221**3-6 tiny bright pixels appear with each cursor movement!** 2222 2223**Characteristics**: 2224- Size: 1-2px (single pixel appearance!) 2225- Colors: Bright neon whites and pinks 2226 - Pure white (#fff) - 40% chance 2227 - Hot pink (#ff1493) 2228 - Pink (#ff69b4) 2229 - Light pink (#ffb6c1) 2230 - Soft pink (#ff85c1) 2231- Glow: Triple-layer shadow (intense!) 2232- Spawn: Random 30px radius around cursor 2233- Animations: 2234 - 50% twinkle in place 2235 - 50% float upward 2236 2237**Creates a cloud of sparkles around your cursor!** 2238 2239--- 2240 2241### Click Explosion Enhanced 2242 2243**Now with 40 EXTRA pixel sparkles!** 2244 2245**Click anywhere → BIG BOOM**: 2246- 25 main glowing particles (6-10px) 2247- **40 tiny pixel sparkles (1-2px)** ← NEW! 2248- Bright white flash 2249- Total: 65+ visual elements! 2250 2251**Pixel sparkles in explosion**: 2252- Shoot outward in all directions 2253- Random distances (30-110px) 2254- Multiple bright colors 2255- Some twinkle, some explode 2256- Creates stellar effect! 2257 2258--- 2259 2260### Entire Screen Coverage 2261 2262**Effects now work EVERYWHERE!** 2263 2264**Before (v5.3.2)**: 2265- Only inside calendar viewport 2266- Limited to calendar area 2267 2268**After (v5.3.3)**: 2269- Works on entire screen! ✓ 2270- Cursor trail follows everywhere 2271- Click explosions anywhere 2272- Used `position: fixed` + `clientX/Y` 2273 2274**Move anywhere on the page for sparkles!** 2275 2276--- 2277 2278### Visual Effect 2279 2280**Cursor movement**: 2281``` 2282 • ✦ • ← Tiny pixels 2283 • ✦ • ← Glowing trail 2284✦ • → • ✦ ← Cursor 2285 • ✦ • ← Mixed sizes 2286 • ✦ • ← Sparkle cloud 2287``` 2288 2289**Click explosion**: 2290``` 2291 ✦ • ✦ • ✦ 2292 ✦ • • ✦ 2293✦ • ! • ✦ 2294 ✦ • • ✦ 2295 ✦ • ✦ • ✦ 2296 229765+ particles total! 2298``` 2299 2300--- 2301 2302### Sparkle Details 2303 2304**Trail Pixels** (3-6 per movement): 2305- Size: 1-2px 2306- Spawn rate: Every 40ms 2307- Spread: 30px radius 2308- Duration: 0.6-0.8s 2309- 50% twinkle, 50% float 2310 2311**Explosion Pixels** (40 total): 2312- Size: 1-3px 2313- Spread: 30-110px radius 2314- Duration: 0.4-0.8s 2315- All directions 2316- Intense glow 2317 2318**Main Particles** (25 total): 2319- Size: 4-10px 2320- Spread: 50-150px 2321- Full color palette 2322- Original firework effect 2323 2324--- 2325 2326### Color Distribution 2327 2328**Pixel sparkles favor white**: 2329- 40% pure white (#fff) - brightest! 2330- 60% pink shades - variety 2331 2332**Creates brilliant sparkle effect!** 2333 2334--- 2335 2336### Performance 2337 2338**Still optimized**: 2339- Trail: 30ms throttle 2340- Pixels: 40ms throttle 2341- Auto-cleanup 2342- Hardware accelerated 2343- Smooth 60fps 2344 2345**Lots of sparkles, zero lag!** 2346 2347--- 2348 2349### Full-Screen Magic 2350 2351**Pink theme calendar detected**: 2352```javascript 2353if (pink calendar exists) { 2354 Enable effects for ENTIRE SCREEN 2355 Not just calendar area 2356} 2357``` 2358 2359**Works everywhere on page!** ✨ 2360 2361--- 2362 2363## Version 5.3.2 (2026-02-09) - PINK FIREWORKS! 2364 2365### Changed: Glowing Pink Particles Instead of Emoji Sparkles! 2366- **Removed:** Emoji sparkle images (✨) 2367- **Added:** Glowing pink particle trail following cursor 2368- **Added:** FIREWORKS explosion on click! 2369- **Result:** Beautiful glowing effects, not emoji! 2370 2371### Glowing Cursor Trail 2372 2373**Pink glowing dots follow your cursor!** 2374- Small glowing pink orbs (8px) 2375- Radial gradient glow effect 2376- Multiple box-shadows for depth 2377- Fade out smoothly (0.5s) 2378- Throttled to 30ms for smoothness 2379 2380``` 2381 • • 2382 • → • ← Your cursor 2383 • • 2384``` 2385 2386**Not emoji - actual glowing particles!** 2387 2388--- 2389 2390### Click Fireworks! 2391 2392**Click anywhere on the calendar → BOOM!** 2393 2394**20 pink particles explode outward!** 2395- Radial burst pattern (360° coverage) 2396- Random speeds (50-150px travel) 2397- 4 shades of pink: 2398 - Hot pink (#ff1493) 2399 - Pink (#ff69b4) 2400 - Light pink (#ff85c1) 2401 - Very light pink (#ffc0cb) 2402- Random sizes (4-10px) 2403- Individual glowing halos 2404- Smooth explosion animation 2405 2406**Plus a bright flash at click point!** 2407- 30px radius glow 2408- Intense pink flash 2409- Fades quickly (0.3s) 2410 2411--- 2412 2413### Visual Effect 2414 2415**Cursor movement**: 2416``` 2417 • 2418 • • • 2419 • → • ← Glowing trail 2420 • • • 2421 • 2422``` 2423 2424**Click explosion**: 2425``` 2426 • • • 2427 • • 2428 • BOOM! • ← 20 particles 2429 • • 2430 • • • 2431``` 2432 2433**All particles glow with pink halos!** 2434 2435--- 2436 2437### Particle Details 2438 2439**Trail Particles**: 2440- Size: 8x8px 2441- Color: Pink radial gradient 2442- Shadow: 10px + 20px glow layers 2443- Duration: 0.5s fade 2444- Rate: 30ms throttle 2445 2446**Explosion Particles**: 2447- Size: 4-10px (random) 2448- Colors: 4 pink shades (random) 2449- Shadow: 10px + 20px glow (matches color) 2450- Duration: 0.6-1.0s (random) 2451- Pattern: Perfect circle burst 2452 2453**Flash Effect**: 2454- Size: 30x30px 2455- Color: Bright hot pink 2456- Shadow: 30px + 50px mega-glow 2457- Duration: 0.3s instant fade 2458 2459--- 2460 2461### Performance 2462 2463**Optimized for smoothness**: 2464- Trail throttled to 30ms 2465- Auto-cleanup after animations 2466- CSS hardware acceleration 2467- No memory leaks 2468- Smooth 60fps 2469 2470**Won't slow you down!** 2471 2472--- 2473 2474### Comparison 2475 2476**Before (v5.3.1)**: 2477- ✨ Emoji sparkle images 2478- Static unicode characters 2479- Limited visual impact 2480 2481**After (v5.3.2)**: 2482- Glowing pink particles 2483- Radial gradients + shadows 2484- Beautiful firework explosions 2485- Much more impressive! 2486 2487--- 2488 2489### Only Pink Theme 2490 2491**These effects only appear**: 2492- On `.calendar-theme-pink` elements 2493- Other themes unaffected 2494- Pure pink magic! 2495 2496--- 2497 2498## Version 5.3.1 (2026-02-09) - MYSPACE SPARKLE CURSOR! ✨✨✨ 2499 2500### ✨ Added: MySpace-Style Sparkle Trail! 2501- **Added:** Sparkle cursor trail that follows your mouse (pink theme only!) 2502- **Toned down:** Reduced glow effects for better taste 2503- **Added:** Sparkles appear on cell hover 2504- **Added:** Sparkles on event hover (left and right sides!) 2505- **Added:** Sparkles on today's cell corners 2506- **Added:** Sparkles on navigation buttons 2507- **Added:** Sparkles in calendar header 2508- **Result:** Pure nostalgic MySpace magic! ✨ 2509 2510### MySpace Sparkle Cursor Trail 2511 2512**The classic effect from 2006!** 2513- Sparkles follow your cursor as you move 2514- Random sizes (12-22px) 2515- Random slight offsets for natural feel 2516- Float up and fade out animation 2517- Throttled to 50ms (smooth, not laggy) 2518- Only on pink theme calendars 2519 2520``` 2521 ✨ 2522 ✨ ✨ 2523✨ → ✨ (cursor trail) 2524 ✨ ✨ 2525 ✨ 2526``` 2527 2528**Pure nostalgia!** 2529 2530--- 2531 2532### Sparkles Everywhere 2533 2534**Calendar cells**: 2535- Hover over any day → ✨ floats up 2536- Smooth 1.5s animation 2537- Centered sparkle 2538 2539**Event items**: 2540- Hover → ✨ on left side 2541- Hover → ✨ on right side 2542- Staggered animations (0.4s delay) 2543- Continuous twinkling 2544 2545**Today's cell**: 2546- ✨ in top-right corner (continuous) 2547- ✨ in bottom-left corner (offset timing) 2548- Always sparkling! 2549 2550**Navigation buttons**: 2551- Hover on < or > → ✨ appears top-right 2552- One-time float animation 2553 2554**Calendar header**: 2555- ✨ on left side (continuous) 2556- ✨ on right side (offset 1s) 2557- Always twinkling 2558 2559--- 2560 2561### Toned Down Glows 2562 2563**Before (v5.3.0)**: TOO MUCH GLOW! 2564- 50px shadows 2565- 4-layer effects 2566- Overwhelming 2567 2568**After (v5.3.1)**: Just right! 2569- 8-15px max shadows (subtle) 2570- 2-layer effects 2571- Professional with personality 2572 2573**Glow reductions**: 2574- Today shimmer: 35px → 12px 2575- Today hover: 50px → 15px 2576- Event glow: 18px → 6px 2577- Badge pulse: 25px → 8px 2578- Container glow: 20px → 8px 2579 2580**Much more tasteful!** 2581 2582--- 2583 2584### Sparkle Animations 2585 2586**sparkle-twinkle** (0.8s): 2587``` 2588Opacity: 0 → 1 → 1 → 0 2589Scale: 0 → 1 → 1 → 0 2590Rotation: 0° → 180° → 360° 2591``` 2592 2593**sparkle-float** (1.5s): 2594``` 2595Moves up: 0px → -50px 2596Opacity: 0 → 1 → 1 → 0 2597Scale: 0 → 1 → 0.8 → 0 2598``` 2599 2600**Pure MySpace magic!** ✨ 2601 2602--- 2603 2604### Where Sparkles Appear 2605 2606✅ **Cursor trail** (continuous while moving) 2607✅ **Calendar cells** (on hover) 2608✅ **Event items** (on hover, left + right) 2609✅ **Today's cell** (continuous, corners) 2610✅ **Navigation buttons** (on hover) 2611✅ **Calendar header** (continuous, sides) 2612 2613**Sparkles EVERYWHERE!** ✨✨✨ 2614 2615--- 2616 2617### Performance 2618 2619**Cursor trail**: 2620- Throttled to 50ms 2621- Auto-cleanup after 1s 2622- No memory leaks 2623- Smooth 60fps 2624 2625**CSS animations**: 2626- Hardware accelerated 2627- No JavaScript overhead (except cursor) 2628- Efficient transforms 2629 2630**Won't slow down your browser!** 2631 2632--- 2633 2634### Pure Nostalgia 2635 2636**Remember MySpace profiles?** 2637- Glitter graphics ✨ 2638- Sparkle cursors ✨ 2639- Auto-play music (ok, we didn't add that) 2640- Animated GIF backgrounds 2641- Comic Sans everywhere 2642 2643**We brought back the sparkles!** ✨ 2644 2645--- 2646 2647### Theme Comparison 2648 2649**Other themes**: Professional and clean 2650**Pink theme**: ✨ SPARKLES EVERYWHERE ✨ 2651 2652**Only pink theme gets the magic!** 2653 2654--- 2655 2656## Version 5.3.0 (2026-02-09) - PINK BLING THEME EFFECTS! ✨ 2657 2658### Added: Pink Theme Gets BLING! 2659- **Added:** Shimmering animation for today's cell 2660- **Added:** Sparkling text effect on today's date 2661- **Added:** Glowing pulse for event bars 2662- **Added:** Gradient shimmer on headers 2663- **Added:** Extra glow on hover effects 2664- **Added:** Pulsing urgent badge for past due items 2665- **Result:** Pink theme is now FABULOUS! ✨ 2666 2667### Shimmer Effects 2668 2669**Today's Cell**: 2670- Continuous shimmer animation (2 second loop) 2671- Multi-layer glow effect 2672- Pink and hot pink overlapping shadows 2673- Pulses from subtle to intense 2674- Extra sparkle on hover 2675 2676**Today's Date Number**: 2677- Sparkle animation (1.5 second loop) 2678- Text shadow glow effect 2679- Slight scale pulse (100% → 105%) 2680- Pink to hot pink shadow transition 2681 2682### Glow Effects 2683 2684**Event Bars**: 2685- Continuous glow pulse (2 second loop) 2686- Uses event's own color 2687- Adds pink accent glow layer 2688- Creates depth and dimension 2689 2690**Event Items**: 2691- Subtle base glow 2692- Enhanced glow on hover 2693- Slight slide animation on hover 2694- Professional yet playful 2695 2696### Gradient Shimmer 2697 2698**Headers**: 2699- Animated gradient background 2700- 3-color pink gradient flow 2701- Smooth 3-second animation 2702- Creates movement and life 2703- Applies to calendar header and event list header 2704 2705### Badge Effects 2706 2707**TODAY Badge**: 2708- Sparkle animation 2709- Synchronized with today's date 2710- Extra prominence 2711 2712**PAST DUE Badge**: 2713- Urgent pulsing effect (1 second loop) 2714- Orange glow intensifies 2715- Draws attention to urgent items 2716- Faster pulse for urgency 2717 2718### Container Bling 2719 2720**Main Container**: 2721- Multi-layer pink glow 2722- Soft outer shadow 2723- Creates floating effect 2724- Subtle but elegant 2725 2726### Animation Details 2727 2728**pink-shimmer** (2s loop): 2729``` 2730Start: Subtle 5px glow 2731Peak: Intense 35px multi-layer glow 2732End: Back to subtle 2733``` 2734 2735**pink-sparkle** (1.5s loop): 2736``` 2737Start: Base glow + scale 1.0 2738Peak: Intense glow + scale 1.05 2739End: Back to base 2740``` 2741 2742**pink-glow-pulse** (2s loop): 2743``` 2744Start: Small glow (3px, 6px) 2745Peak: Large glow (6px, 12px, 18px) 2746End: Back to small 2747``` 2748 2749**pink-gradient-shimmer** (3s loop): 2750``` 2751Gradient flows across element 2752Creates wave effect 2753Smooth continuous motion 2754``` 2755 2756**pink-pulse-urgent** (1s loop - faster!): 2757``` 2758Start: Orange glow 5px 2759Peak: Orange glow 25px (intense) 2760End: Back to 5px 2761``` 2762 2763### Visual Experience 2764 2765**Today's Cell**: 2766``` 2767┌──┬──┬──┬──┬──┬──┬──┐ 2768│ │ │ ✨ │ │ │ │ │ ← Shimmers constantly 2769│ │ │[9]│ │ │ │ │ ← Sparkles 2770│ │ │ ✨ │ │ │ │ │ ← Glows and pulses 2771└──┴──┴──┴──┴──┴──┴──┘ 2772``` 2773 2774**Event Bars**: 2775``` 2776━━━━━━━ ← Glows and pulses 2777━━━━━━━ ← Each bar animated 2778━━━━━━━ ← Creates rhythm 2779``` 2780 2781**Headers**: 2782``` 2783╔═════════════════════╗ 2784║ ~~~~~~~~~~ ║ ← Gradient flows 2785║ February 2026 ║ ← Shimmer effect 2786╚═════════════════════╝ 2787``` 2788 2789### Theme Comparison 2790 2791**Before (v5.2.8)**: 2792- Pink colors 2793- Static elements 2794- Standard shadows 2795 2796**After (v5.3.0)**: 2797- Pink colors ✓ 2798- Animated shimmer ✨ 2799- Sparkling effects 2800- Glowing pulses ✨ 2801- Moving gradients 2802- BLING! 2803 2804### Performance 2805 2806**All animations**: 2807- Hardware accelerated (transform, opacity) 2808- Smooth 60fps 2809- CSS animations (no JavaScript) 2810- Minimal CPU usage 2811- Disabled in reduced-motion preference 2812 2813### Only for Pink Theme 2814 2815**Effects only apply when**: 2816```css 2817.calendar-theme-pink 2818``` 2819 2820**Other themes unaffected**: 2821- Matrix stays Matrix 2822- Professional stays Professional 2823- Purple stays Purple 2824- Wiki stays clean 2825 2826**Pink gets all the bling!** ✨ 2827 2828### Use Cases 2829 2830**Perfect for**: 2831- Celebrating occasions 2832- Fun team calendars 2833- Personal style expression 2834- Standing out 2835- Making calendar time fabulous 2836 2837**Not just pink, but BLING pink!** ✨ 2838 2839## Version 5.2.8 (2026-02-09) - TODAY BOX USES THEME COLORS 2840 2841### Fixed: Today's Date Box Now Uses Theme Colors 2842- **Fixed:** Today's day number box now uses theme border color 2843- **Fixed:** Text color adapts to theme (white for dark themes, bg color for light) 2844- **Result:** Today box matches the theme perfectly! 2845 2846### The Issue 2847 2848Today's date had a hardcoded green box: 2849 2850**In style.css**: 2851```css 2852.cal-today .day-num { 2853 background: #008800; /* Hardcoded green! */ 2854 color: white; 2855} 2856``` 2857 2858**Didn't adapt to themes at all!** 2859 2860### The Fix 2861 2862**Now uses theme colors**: 2863```php 2864// Today's day number 2865if ($isToday) { 2866 background: $themeStyles['border'], // Theme's accent color! 2867 color: (professional theme) ? white : bg color 2868} 2869``` 2870 2871### Theme Examples 2872 2873**Matrix Theme**: 2874- Box background: `#00cc07` (matrix green) 2875- Text color: `#242424` (dark background) 2876 2877**Purple Theme**: 2878- Box background: `#9b59b6` (purple) 2879- Text color: `#2a2030` (dark background) 2880 2881**Professional Theme**: 2882- Box background: `#4a90e2` (blue) 2883- Text color: `#ffffff` (white text) 2884 2885**Pink Theme**: 2886- Box background: `#ff1493` (hot pink) 2887- Text color: `#1a0d14` (dark background) 2888 2889**Wiki Theme**: 2890- Box background: Template's `__border__` color 2891- Text color: Template's `__background_site__` color 2892 2893### Visual Result 2894 2895**Matrix Theme**: 2896``` 2897┌──┬──┬──┬──┬──┬──┬──┐ 2898│ 1│ 2│ 3│[4]│ 5│ 6│ 7│ 2899└──┴──┴──┴──┴──┴──┴──┘ 2900 ↑ 2901 Green box (#00cc07) 2902``` 2903 2904**Professional Theme**: 2905``` 2906┌──┬──┬──┬──┬──┬──┬──┐ 2907│ 1│ 2│ 3│[4]│ 5│ 6│ 7│ 2908└──┴──┴──┴──┴──┴──┴──┘ 2909 ↑ 2910 Blue box (#4a90e2) 2911``` 2912 2913**Wiki Theme**: 2914``` 2915┌──┬──┬──┬──┬──┬──┬──┐ 2916│ 1│ 2│ 3│[4]│ 5│ 6│ 7│ 2917└──┴──┴──┴──┴──┴──┴──┘ 2918 ↑ 2919 Template border color 2920``` 2921 2922### Implementation 2923 2924**Inline styles added**: 2925- Background uses `$themeStyles['border']` (theme accent) 2926- Text color uses `$themeStyles['bg']` for contrast 2927- Special case: Professional theme uses white text 2928- All with `!important` to override CSS 2929 2930**CSS cleaned up**: 2931- Removed hardcoded `#008800` background 2932- Removed hardcoded `white` color 2933- Kept structural styles (border-radius, font-weight) 2934 2935### Benefits 2936 2937**Theme Consistency**: 2938- Today box matches theme accent color 2939- Proper contrast with background 2940- Professional appearance 2941 2942**Automatic Adaptation**: 2943- Works with all themes 2944- Works with custom wiki template colors 2945- No manual adjustment needed 2946 2947**Visual Harmony**: 2948- Border color used throughout theme 2949- Today box reinforces theme identity 2950- Consistent design language 2951 2952## Version 5.2.7 (2026-02-09) - FIX GRID BACKGROUND MISMATCH 2953 2954### Fixed: Table Grid Background Now Matches Cells 2955- **Found:** `grid_bg` was using `__background_alt__` (different from cells!) 2956- **Fixed:** Changed `grid_bg` to use `__background_site__` (same as cells) 2957- **Result:** Table background no longer shows through cells! 2958 2959### The Layer Problem 2960 2961The table itself had a DIFFERENT background color than its cells! 2962 2963**Before (v5.2.6)**: 2964```php 2965'grid_bg' => __background_alt__, // Table background (#e8e8e8) 2966'cell_bg' => __background_site__, // Cell background (#f5f5f5) 2967``` 2968 2969**The table background was showing THROUGH the cells!** 2970 2971### Why This Happened 2972 2973**Visual layers**: 2974``` 2975Table Element 2976├─ background: __background_alt__ (#e8e8e8) ← Different! 2977└─ Cells 2978 └─ background: __background_site__ (#f5f5f5) ← Different! 2979 2980The table background shows through any gaps! 2981``` 2982 2983### The Fix 2984 2985**After (v5.2.7)**: 2986```php 2987'grid_bg' => __background_site__, // Table background (#f5f5f5) ✓ 2988'cell_bg' => __background_site__, // Cell background (#f5f5f5) ✓ 2989``` 2990 2991**NOW THEY MATCH!** 2992 2993### Where grid_bg Is Used 2994 2995The table element itself: 2996```html 2997<table style="background: __background_alt__"> ← Was showing through! 2998 <tbody> 2999 <tr> 3000 <td style="background: __background_site__">1</td> 3001 </tr> 3002 </tbody> 3003</table> 3004``` 3005 3006Even with cell inline styles, the TABLE background shows through! 3007 3008### All Background Sources Now Unified 3009 3010**Everything now uses __background_site__**: 3011- `bg` → __background_site__ ✓ 3012- `header_bg` → __background_site__ ✓ 3013- `grid_bg` → __background_site__ ✓ (JUST FIXED!) 3014- `cell_bg` → __background_site__ ✓ 3015 3016**Perfect consistency!** 3017 3018### Why It Was Different 3019 3020**Originally the grid was meant to show borders**: 3021- `grid_bg` was `__background_alt__` (slightly different) 3022- Created visual separation between cells 3023- But with transparent/thin cells, it showed through! 3024 3025**Now unified for consistency!** 3026 3027### Visual Result 3028 3029**Before (layers visible)**: 3030``` 3031┌─────────────────┐ 3032│ Grid (#e8e8e8) │ ← Showing through! 3033│ ┌──┬──┬──┐ │ 3034│ │ │ │ │ │ ← Cells (#f5f5f5) 3035│ └──┴──┴──┘ │ 3036└─────────────────┘ 3037``` 3038 3039**After (unified)**: 3040``` 3041┌─────────────────┐ 3042│ Grid (#f5f5f5) │ ← Same color! 3043│ ┌──┬──┬──┐ │ 3044│ │ │ │ │ │ ← Cells (#f5f5f5) 3045│ └──┴──┴──┘ │ 3046└─────────────────┘ 3047Perfect match! 3048``` 3049 3050### Complete Background Mapping 3051 3052**All using __background_site__ now**: 3053- Main container background 3054- Left panel background 3055- Right panel background 3056- Eventlist background 3057- Calendar grid background ← JUST FIXED 3058- Calendar cell backgrounds 3059- Event item backgrounds 3060- Clock header background 3061- Search input background 3062- Past events toggle 3063 3064**EVERYTHING UNIFIED!** 3065 3066## Version 5.2.6 (2026-02-09) - REMOVE CONTAINER BACKGROUNDS 3067 3068### Fixed: Removed Container Backgrounds Showing Through 3069- **Found:** `.calendar-compact-container` had `background: #ffffff;` 3070- **Found:** `.calendar-compact-left` had `background: #fafafa;` 3071- **Found:** `.calendar-compact-right` had `background: #ffffff;` 3072- **Found:** `.event-search-input-inline` had `background: white;` 3073- **Found:** `.past-events-toggle` had `background: #f5f5f5;` 3074- **Result:** Container backgrounds no longer show through cells! 3075 3076### The Container Problem 3077 3078The parent containers had hardcoded backgrounds that were showing through! 3079 3080**Container backgrounds (lines 4-91)**: 3081```css 3082.calendar-compact-container { 3083 background: #ffffff; /* ← Main container! */ 3084} 3085 3086.calendar-compact-left { 3087 background: #fafafa; /* ← Left panel (calendar side)! */ 3088} 3089 3090.calendar-compact-right { 3091 background: #ffffff; /* ← Right panel (events side)! */ 3092} 3093``` 3094 3095**These were showing through the cells and events!** 3096 3097### Why Containers Matter 3098 3099Even though cells have inline styles, if the CONTAINER behind them has a different background, it can show through: 3100 3101``` 3102Container (#fafafa) ← Showing through! 3103 └─ Table Cell (#f5f5f5) ← Transparent areas 3104 └─ Content 3105``` 3106 3107### All Backgrounds Removed 3108 3109**v5.2.6 removes**: 3110- `.calendar-compact-container` background 3111- `.calendar-compact-left` background 3112- `.calendar-compact-right` background 3113- `.event-search-input-inline` background 3114- `.past-events-toggle` background & hover 3115 3116**v5.2.5 removed**: 3117- `.calendar-compact-grid tbody td` background 3118- `.calendar-compact-grid thead th` background 3119 3120**v5.2.4 removed**: 3121- `.cal-empty`, `.cal-today`, `.cal-has-events` backgrounds 3122 3123**v5.2.3 removed**: 3124- `.event-compact-item` background 3125 3126**ALL container and element backgrounds eliminated!** 3127 3128### What Should Work Now 3129 3130**Calendar cells**: No container background showing through ✓ 3131**Event items**: No container background showing through ✓ 3132**Search bar**: Uses template color ✓ 3133**Past events toggle**: Uses template color ✓ 3134 3135### Complete List of Fixes 3136 3137**Containers**: 3138- Main container ✓ 3139- Left panel ✓ 3140- Right panel ✓ 3141 3142**Elements**: 3143- Table cells ✓ 3144- Event items ✓ 3145- Search input ✓ 3146- Past events toggle ✓ 3147 3148**EVERYTHING removed!** 3149 3150### Critical: Clear Caches 3151 3152**Must clear caches or won't work**: 31531. Hard refresh: Ctrl+Shift+R (5 times!) 31542. Clear DokuWiki cache 31553. Close browser completely 31564. Reopen and test 3157 3158**CSS caching is EXTREMELY persistent!** 3159 3160## Version 5.2.5 (2026-02-09) - REMOVE TABLE CELL CSS BACKGROUNDS 3161 3162### Fixed: Removed Hardcoded Backgrounds from Table Cells 3163- **Found:** `.calendar-compact-grid tbody td` had `background: #ffffff;`! 3164- **Found:** `.calendar-compact-grid tbody td:hover` had `background: #f0f7ff;`! 3165- **Found:** `.calendar-compact-grid thead th` had `background: #f8f8f8;`! 3166- **Fixed:** Removed ALL hardcoded backgrounds from table CSS 3167- **Result:** Calendar table cells finally use template colors! 3168 3169### The REAL Culprits 3170 3171The generic table CSS was overriding everything! 3172 3173**In style.css (lines 307-356)**: 3174```css 3175.calendar-compact-grid thead th { 3176 background: #f8f8f8; /* ← Header cells hardcoded! */ 3177} 3178 3179.calendar-compact-grid tbody td { 3180 background: #ffffff; /* ← ALL table cells hardcoded! */ 3181} 3182 3183.calendar-compact-grid tbody td:hover { 3184 background: #f0f7ff; /* ← Hover state hardcoded! */ 3185} 3186``` 3187 3188**These apply to ALL `<td>` and `<th>` elements in the calendar table!** 3189 3190### Why This Was the Last One 3191 3192**CSS Specificity Order**: 31931. `.calendar-compact-grid tbody td` (generic - applies to ALL cells) 31942. `.cal-empty`, `.cal-today`, `.cal-has-events` (specific - applies to some cells) 31953. Inline styles (should win but didn't) 3196 3197**We removed the specific ones (v5.2.4), but the generic one was still there!** 3198 3199### What We've Removed 3200 3201**v5.2.3**: 3202- `.event-compact-item` background 3203- `.event-compact-item:hover` background 3204 3205**v5.2.4**: 3206- `.cal-empty` background & hover 3207- `.cal-today` background & hover 3208- `.cal-has-events` background & hover 3209 3210**v5.2.5 (FINAL)**: 3211- `.calendar-compact-grid tbody td` background ✓ 3212- `.calendar-compact-grid tbody td:hover` background ✓ 3213- `.calendar-compact-grid thead th` background ✓ 3214 3215**All CSS background overrides ELIMINATED!** 3216 3217### Why It Took 5 Versions 3218 3219**CSS had layers of hardcoded backgrounds**: 3220 3221``` 3222Layer 1: Table cells (.calendar-compact-grid tbody td) 3223 ↓ Overrode inline styles 3224Layer 2: Cell states (.cal-today, .cal-empty, etc.) 3225 ↓ Overrode table cells 3226Layer 3: Event items (.event-compact-item) 3227 ↓ Overrode inline styles 3228 3229ALL had to be removed! 3230``` 3231 3232**We kept finding more specific CSS, but the base table CSS was there all along!** 3233 3234### Visual Result 3235 3236**NOW everything matches**: 3237``` 3238Calendar Table: 3239┌──┬──┬──┬──┬──┬──┬──┐ 3240│ S│ M│ T│ W│ T│ F│ S│ ← Headers: __background_site__ 3241├──┼──┼──┼──┼──┼──┼──┤ 3242│ 1│ 2│ 3│ 4│ 5│ 6│ 7│ ← Cells: __background_site__ 3243├──┼──┼──┼──┼──┼──┼──┤ 3244│ 8│ 9│10│11│12│13│14│ ← All: __background_site__ 3245└──┴──┴──┴──┴──┴──┴──┘ 3246 3247Sidebar Events: 3248┌────────────────────────┐ 3249│ Event │ ← __background_site__ 3250│ Event │ ← __background_site__ 3251└────────────────────────┘ 3252 3253FINALLY ALL MATCHING! ✓ 3254``` 3255 3256### Complete List of Removed CSS 3257 3258**ALL hardcoded backgrounds removed**: 3259- `.event-compact-item` background 3260- `.event-compact-item:hover` background 3261- `.cal-empty` background & hover 3262- `.cal-today` background & hover 3263- `.cal-has-events` background & hover 3264- `.calendar-compact-grid tbody td` background ← NEW 3265- `.calendar-compact-grid tbody td:hover` background ← NEW 3266- `.calendar-compact-grid thead th` background ← NEW 3267 3268**Every single CSS background override is GONE!** 3269 3270### Testing Steps 3271 3272**After installing v5.2.5**: 3273 32741. **Clear browser cache**: Ctrl+Shift+R (3 times!) 32752. **Clear DokuWiki cache**: Click the button 32763. **Close browser completely**: Restart it 32774. **Visit page**: Should finally see matching backgrounds 3278 3279**CSS is EXTREMELY sticky - may need to clear multiple times!** 3280 3281### This Should Be It 3282 3283**No more CSS overrides exist** (we've checked the entire file): 3284- Table cells ✓ Fixed 3285- Cell states ✓ Fixed 3286- Event items ✓ Fixed 3287- Headers ✓ Fixed 3288- Hover states ✓ Fixed 3289 3290**All backgrounds now come from inline styles using template colors!** 3291 3292## Version 5.2.4 (2026-02-09) - REMOVE CALENDAR CELL CSS BACKGROUNDS 3293 3294### Fixed: Removed Hardcoded Backgrounds from Calendar Cells 3295- **Found:** Calendar cell CSS had hardcoded backgrounds with `!important`! 3296- **Fixed:** Removed backgrounds from `.cal-today`, `.cal-empty`, `.cal-has-events` CSS 3297- **Result:** Calendar cells now use template colors! 3298 3299### The Second Culprit 3300 3301MORE hardcoded backgrounds in the CSS file! 3302 3303**In style.css (lines 359-382)**: 3304```css 3305.cal-empty { 3306 background: #fafafa !important; /* ← Overriding inline styles! */ 3307} 3308 3309.cal-today { 3310 background: #e8f5e9 !important; /* ← Overriding today cell! */ 3311} 3312 3313.cal-today:hover { 3314 background: #c8e6c9 !important; /* ← Overriding hover! */ 3315} 3316 3317.cal-has-events { 3318 background: #fffbf0; /* ← Overriding event cells! */ 3319} 3320 3321.cal-has-events:hover { 3322 background: #fff4d9; /* ← Overriding hover! */ 3323} 3324``` 3325 3326**These were ALL overriding the inline styles!** 3327 3328### The Fix 3329 3330**Removed all hardcoded backgrounds**: 3331```css 3332.cal-empty { 3333 /* background removed - inline style handles this */ 3334 cursor: default !important; 3335} 3336 3337.cal-today { 3338 /* background removed - inline style handles this */ 3339} 3340 3341.cal-has-events { 3342 /* background removed - inline style handles this */ 3343} 3344 3345/* Hover states also removed */ 3346``` 3347 3348### What Was Overridden 3349 3350**v5.2.3 fixed**: 3351- Event items in sidebar ✓ 3352 3353**v5.2.4 fixes**: 3354- Calendar day cells ✓ 3355- Today cell ✓ 3356- Empty cells ✓ 3357- Cells with events ✓ 3358- All hover states ✓ 3359 3360### Why This Kept Happening 3361 3362**CSS had hardcoded backgrounds everywhere**: 33631. Event items: `#ffffff` (fixed in v5.2.3) 33642. Calendar cells: Multiple colors (fixed in v5.2.4) 33653. **All with `!important` flags!** 3366 3367**The inline styles couldn't override them!** 3368 3369### Visual Result 3370 3371**Now ALL backgrounds match**: 3372``` 3373Calendar Grid: 3374┌──┬──┬──┬──┬──┬──┬──┐ 3375│ │ │ │ │ │ │ │ ← All use __background_site__ 3376├──┼──┼──┼──┼──┼──┼──┤ 3377│ │██│ │ │ │ │ │ ← Today uses __background_neu__ 3378├──┼──┼──┼──┼──┼──┼──┤ 3379│ │ │ │ │ │ │ │ ← All match template 3380└──┴──┴──┴──┴──┴──┴──┘ 3381 3382Sidebar Events: 3383┌────────────────────────┐ 3384│ Event │ ← Uses __background_site__ 3385│ Event │ ← Uses __background_site__ 3386└────────────────────────┘ 3387 3388Perfect consistency! 3389``` 3390 3391### CSS Removed 3392 3393**Calendar cells**: 3394- `.cal-empty` background 3395- `.cal-empty:hover` background 3396- `.cal-today` background 3397- `.cal-today:hover` background 3398- `.cal-has-events` background 3399- `.cal-has-events:hover` background 3400 3401**All gone!** ✓ 3402 3403### Important: Clear Caches Again! 3404 3405After installing v5.2.4: 3406 34071. **Hard refresh browser**: Ctrl+Shift+R (twice!) 34082. **Clear DokuWiki cache**: Admin → Clear Cache 34093. **May need to restart browser**: To clear CSS cache 3410 3411**Old CSS is VERY sticky!** 3412 3413### Why It Took So Long 3414 3415**Multiple CSS overrides**: 3416- Event items (v5.2.3) ✓ Fixed 3417- Calendar cells (v5.2.4) ✓ Fixed 3418- Each with different classes 3419- Each with `!important` 3420- Hidden throughout CSS file 3421 3422**Found them all now!** 3423 3424## Version 5.2.3 (2026-02-09) - REMOVE HARDCODED CSS BACKGROUNDS 3425 3426### Fixed: Removed Hardcoded Backgrounds from CSS 3427- **Found:** CSS file had hardcoded `background: #ffffff;` overriding inline styles! 3428- **Fixed:** Removed hardcoded backgrounds from `.event-compact-item` CSS 3429- **Result:** Event backgrounds now properly use template colors! 3430 3431### The Root Cause 3432 3433The CSS file was overriding the inline styles with hardcoded white backgrounds! 3434 3435**In style.css (lines 599-616)**: 3436```css 3437.event-compact-item { 3438 background: #ffffff; /* ← This was overriding inline styles! */ 3439} 3440 3441.event-compact-item:hover { 3442 background: #f8f9fa; /* ← And this on hover! */ 3443} 3444``` 3445 3446**Even though inline styles had `!important`**, the CSS was still being applied because it comes after in the cascade! 3447 3448### The Fix 3449 3450**Removed hardcoded backgrounds from CSS**: 3451```css 3452.event-compact-item { 3453 /* background removed - set via inline style with template colors */ 3454 display: flex; 3455 /* ... other styles ... */ 3456} 3457 3458.event-compact-item:hover { 3459 box-shadow: 0 1px 3px rgba(0,0,0,0.08); 3460 /* background removed - inline style handles this */ 3461} 3462``` 3463 3464### Why This Was So Difficult to Find 3465 3466**CSS Specificity & Cascade**: 34671. Inline styles with `!important` should win 34682. But CSS that comes after can still apply 34693. The hardcoded `background: #ffffff` was silently overriding 34704. All the PHP code was correct - it was the CSS! 3471 3472**What We Were Doing**: 3473- ✓ Reading template colors correctly 3474- ✓ Setting `cell_bg` to `__background_site__` correctly 3475- ✓ Applying inline styles with `!important` correctly 3476- ✗ CSS file was overriding everything! 3477 3478### What Was Affected 3479 3480**Event items in**: 3481- Main calendar sidebar 3482- Standalone event list 3483- Sidebar widget 3484- All event displays 3485 3486**All had white backgrounds hardcoded in CSS!** 3487 3488### Now Working 3489 3490**Events use template colors**: 3491```html 3492<div class="event-compact-item" 3493 style="background: #f5f5f5 !important; ..."> 3494 ← Now this inline style actually works! 3495</div> 3496``` 3497 3498**No CSS override** ✓ 3499 3500### Testing 3501 3502To verify this works: 35031. Clear browser cache (important!) 35042. Clear DokuWiki cache 35053. Reload page 35064. Events should now match eventlist background 3507 3508**Browser caching can make old CSS persist!** 3509 3510### Visual Result 3511 3512**All backgrounds now matching**: 3513``` 3514┌────────────────────────────┐ 3515│ Eventlist (#f5f5f5) │ ← Template color 3516├────────────────────────────┤ 3517│ Event (#f5f5f5) │ ← Template color (was #ffffff) 3518├────────────────────────────┤ 3519│ Event (#f5f5f5) │ ← Template color (was #ffffff) 3520└────────────────────────────┘ 3521 3522Perfect match! 3523``` 3524 3525### Why Everything Else Worked 3526 3527**Clock area, calendar cells, etc.** didn't have hardcoded CSS backgrounds: 3528- They only had inline styles ✓ 3529- Inline styles worked correctly ✓ 3530- Only event items had the CSS override ✗ 3531 3532### Important Notes 3533 3534**Clear caches**: 3535- Browser cache (Ctrl+Shift+R or Cmd+Shift+R) 3536- DokuWiki cache (Admin → Clear Cache) 3537- Old CSS may be cached! 3538 3539**This was the culprit all along!** 3540 3541## Version 5.2.2 (2026-02-09) - FIX CLOCK AREA BACKGROUND 3542 3543### Fixed: Clock Area Now Matches Event Cells 3544- **Fixed:** `header_bg` now uses `__background_site__` (was `__background_alt__`) 3545- **Result:** Clock/Today header matches event cell backgrounds! 3546 3547### The Issue 3548 3549The clock area (Today header) was using a different background: 3550 3551**Before (v5.2.1)**: 3552```php 3553'header_bg' => __background_alt__, // Different color (gray #e8e8e8) 3554'cell_bg' => __background_site__, // Event cells (#f5f5f5) 3555``` 3556 3557**After (v5.2.2)**: 3558```php 3559'header_bg' => __background_site__, // Same as cells (#f5f5f5) ✓ 3560'cell_bg' => __background_site__, // Event cells (#f5f5f5) ✓ 3561``` 3562 3563### What's the Clock Area? 3564 3565The clock/Today header in the sidebar: 3566``` 3567┌────────────────────────────┐ 3568│ 3:45:23 PM │ ← Clock area (header_bg) 3569│ ️ --° | Sun, Feb 9, 2026 │ 3570└────────────────────────────┘ 3571``` 3572 3573### All Backgrounds Now Unified 3574 3575**Everything now uses __background_site__**: 3576- Eventlist background ✓ 3577- Calendar cells ✓ 3578- Event items ✓ 3579- Clock/Today header ✓ 3580- Sidebar widget ✓ 3581- All backgrounds match! ✓ 3582 3583### Visual Result 3584 3585**Complete consistency**: 3586``` 3587┌────────────────────────────┐ 3588│ 3:45:23 PM │ ← Same background 3589│ ️ --° | Sun, Feb 9, 2026 │ 3590├────────────────────────────┤ 3591│ Meeting at 2pm │ ← Same background 3592│ Description... │ 3593├────────────────────────────┤ 3594│ Another event │ ← Same background 3595│ More details... │ 3596└────────────────────────────┘ 3597 3598All using __background_site__ (#f5f5f5) 3599``` 3600 3601**Perfect visual harmony!** 3602 3603## Version 5.2.1 (2026-02-09) - FIX: MATCH EVENTLIST BACKGROUND 3604 3605### Fixed: Calendar Cells Now Match Eventlist Background 3606- **Fixed:** Changed `cell_bg` to use `__background_site__` (not `__background__`) 3607- **Result:** Calendar cells now match the eventlist background perfectly! 3608 3609### The Real Issue 3610 3611The eventlist was showing the CORRECT background color all along! 3612 3613**Eventlist was using**: 3614- `bg` → `__background_site__` ✓ (This was correct!) 3615 3616**Calendar cells were using**: 3617- `cell_bg` → `__background__` ✗ (This was wrong!) 3618 3619**They didn't match!** 3620 3621### The Correct Fix 3622 3623**Now everything uses __background_site__**: 3624```php 3625'bg' => __background_site__, // Eventlist (was already correct) 3626'cell_bg' => __background_site__, // Cells (now fixed to match) 3627``` 3628 3629### Why __background_site__? 3630 3631The eventlist sidebar and calendar are meant to match the **page/site background**, not the inner content area background: 3632 3633``` 3634Page Layout: 3635┌────────────────────────────────────┐ 3636│ __background_site__ (page bg) │ ← This is where calendar lives 3637│ │ 3638│ ┌──────────────────────────────┐ │ 3639│ │ __background__ (content bg) │ │ ← Wiki article content 3640│ │ │ │ 3641│ └──────────────────────────────┘ │ 3642│ │ 3643└────────────────────────────────────┘ 3644``` 3645 3646**Calendar should match the page background, not the content background!** 3647 3648### Template Example 3649 3650Typical DokuWiki template: 3651```ini 3652__background_site__ = "#f5f5f5" (Light gray - page background) 3653__background__ = "#ffffff" (White - content area) 3654``` 3655 3656**Before (v5.2.0)**: 3657- Eventlist: `#f5f5f5` (light gray) ✓ Correct 3658- Calendar cells: `#ffffff` (white) ✗ Wrong - didn't match 3659 3660**After (v5.2.1)**: 3661- Eventlist: `#f5f5f5` (light gray) ✓ Correct 3662- Calendar cells: `#f5f5f5` (light gray) ✓ Correct - MATCHED! 3663 3664### All Backgrounds Now Unified 3665 3666**Everything now uses __background_site__**: 3667- Eventlist sidebar background ✓ 3668- Main calendar background ✓ 3669- Calendar day cells ✓ 3670- Sidebar widget ✓ 3671- Event items ✓ 3672- Input fields ✓ 3673- Buttons ✓ 3674 3675**All perfectly matched to the page background!** 3676 3677### Why Version 5.2.0 Was Wrong 3678 3679I 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. 3680 3681**The eventlist knew what it was doing all along!** The cells just needed to catch up. 3682 3683## Version 5.2.0 (2026-02-09) - UNIFIED WIKI THEME BACKGROUNDS 3684**Note**: This version went the wrong direction. See v5.2.1 for the correct fix. 3685 3686### Fixed: All Backgrounds Now Use __background__ 3687- **Fixed:** `bg` now uses `__background__` instead of `__background_site__` 3688- **Fixed:** Eventlist, calendar cells, and sidebar all match now 3689- **Result:** Completely unified background throughout! 3690 3691### The Issue 3692 3693Different parts of the calendar were using different background sources: 3694 3695**Before (v5.1.9)**: 3696```php 3697'bg' => __background_site__ // Eventlist background (outer page) 3698'cell_bg' => __background__ // Cell backgrounds (content area) 3699``` 3700 3701**These are different colors!** 3702- `__background_site__` = Outer page wrapper (often gray) 3703- `__background__` = Main content area (often white) 3704 3705### The Fix 3706 3707**After (v5.2.0)**: 3708```php 3709'bg' => __background__ // Eventlist background ✓ 3710'cell_bg' => __background__ // Cell backgrounds ✓ 3711``` 3712 3713**Both use the same source!** 3714 3715### What Uses 'bg' 3716 3717The `bg` color is used for: 3718- Eventlist sidebar background 3719- Main calendar container 3720- Sidebar widget background 3721- Form backgrounds 3722- Event dialogs 3723 3724### What Uses 'cell_bg' 3725 3726The `cell_bg` color is used for: 3727- Calendar day cells 3728- Event item backgrounds 3729- Input field backgrounds 3730- Button backgrounds 3731 3732### Why This Matters 3733 3734**Template color hierarchy**: 3735``` 3736__background_site__ → Outer page/body (e.g., #f5f5f5 light gray) 3737__background__ → Main content area (e.g., #ffffff white) 3738__background_alt__ → Sections/headers 3739__background_neu__ → Highlights 3740``` 3741 3742**We want all calendar backgrounds to match the main content area!** 3743 3744### Visual Comparison 3745 3746**Before (v5.1.9)**: Mismatched backgrounds 3747``` 3748┌────────────────────────────────┐ 3749│ Eventlist (gray #f5f5f5) │ ← __background_site__ 3750└────────────────────────────────┘ 3751 3752┌────────────────────────────────┐ 3753│ Calendar │ 3754│ ┌──┬──┬──┬──┬──┬──┬──┐ │ 3755│ │ │ │ │ │ │ │ │ │ ← __background__ (white #fff) 3756│ └──┴──┴──┴──┴──┴──┴──┘ │ 3757└────────────────────────────────┘ 3758Different colors - looks inconsistent 3759``` 3760 3761**After (v5.2.0)**: Unified backgrounds 3762``` 3763┌────────────────────────────────┐ 3764│ Eventlist (white #fff) │ ← __background__ 3765└────────────────────────────────┘ 3766 3767┌────────────────────────────────┐ 3768│ Calendar │ 3769│ ┌──┬──┬──┬──┬──┬──┬──┐ │ 3770│ │ │ │ │ │ │ │ │ │ ← __background__ (white #fff) 3771│ └──┴──┴──┴──┴──┴──┴──┘ │ 3772└────────────────────────────────┘ 3773Same color - perfectly consistent! 3774``` 3775 3776### Template Examples 3777 3778**Light Template**: 3779```ini 3780__background_site__ = "#f5f5f5" (light gray) 3781__background__ = "#ffffff" (white) 3782``` 3783 3784**Before**: Eventlist gray, cells white 3785**After**: Eventlist white, cells white ✓ 3786 3787**Dark Template**: 3788```ini 3789__background_site__ = "#1a1a1a" (very dark) 3790__background__ = "#2d2d2d" (dark) 3791``` 3792 3793**Before**: Eventlist very dark, cells dark 3794**After**: Eventlist dark, cells dark ✓ 3795 3796### Benefits 3797 3798**Visual Consistency**: 3799- All backgrounds match 3800- Clean, unified appearance 3801- Professional look 3802 3803**Correct Template Integration**: 3804- Uses content area color (not page wrapper) 3805- Matches wiki content area 3806- Proper color hierarchy 3807 3808**Works Everywhere**: 3809- Light templates ✓ 3810- Dark templates ✓ 3811- Custom templates ✓ 3812 3813### All Backgrounds Unified 3814 3815**Now using __background__**: 3816- Eventlist background ✓ 3817- Calendar cells ✓ 3818- Sidebar widget ✓ 3819- Event items ✓ 3820- Input fields ✓ 3821- Buttons ✓ 3822- Dialogs ✓ 3823 3824**Perfect harmony throughout!** 3825 3826## Version 5.1.9 (2026-02-09) - FIX WIKI THEME EVENT BACKGROUNDS 3827 3828### Fixed: Wiki Theme Event Backgrounds Not Showing 3829- **Fixed:** Wiki theme fallback used CSS variables in inline styles (doesn't work!) 3830- **Fixed:** Replaced CSS variables with actual hex colors 3831- **Result:** Event backgrounds now show correctly with template colors! 3832 3833### The Problem 3834 3835CSS variables like `var(--__background__, #fff)` don't work in inline `style=""` attributes! 3836 3837**Before (broken)**: 3838```php 3839'cell_bg' => 'var(--__background__, #fff)', // Doesn't work in inline styles! 3840``` 3841 3842**After (fixed)**: 3843```php 3844'cell_bg' => '#fff', // Actual hex color works! 3845``` 3846 3847### What Was Affected 3848 3849**When style.ini read successfully**: 3850- ✅ Worked fine (uses actual hex colors from file) 3851 3852**When style.ini fallback used**: 3853- ❌ Events had no background 3854- ❌ CSS variables don't work in inline styles 3855- ❌ Looked broken 3856 3857### The Fix 3858 3859**Wiki theme fallback now uses real colors**: 3860```php 3861'wiki' => [ 3862 'bg' => '#f5f5f5', // Real hex (was: var(--__background_site__)) 3863 'border' => '#ccc', // Real hex (was: var(--__border__)) 3864 'cell_bg' => '#fff', // Real hex (was: var(--__background__)) 3865 'cell_today_bg' => '#eee', // Real hex (was: var(--__background_neu__)) 3866 'text_primary' => '#333', // Real hex (was: var(--__text__)) 3867 'text_bright' => '#2b73b7', // Real hex (was: var(--__link__)) 3868 'text_dim' => '#666', // Real hex (was: var(--__text_neu__)) 3869 'grid_bg' => '#e8e8e8', // Real hex (was: var(--__background_alt__)) 3870 // ... all colors now use real hex values 3871] 3872``` 3873 3874### Why CSS Variables Don't Work 3875 3876**CSS variables work**: 3877```css 3878.some-class { 3879 background: var(--__background__, #fff); /* ✓ Works in CSS */ 3880} 3881``` 3882 3883**CSS variables DON'T work**: 3884```html 3885<div style="background: var(--__background__, #fff)"> <!-- ✗ Doesn't work --> 3886``` 3887 3888### How It Works Now 3889 3890**Priority system**: 38911. **Try reading style.ini** → Use actual template hex colors ✓ 38922. **If file not found** → Use fallback hex colors ✓ 38933. **Never use CSS variables in inline styles** ✓ 3894 3895**Both paths now work correctly!** 3896 3897### Visual Result 3898 3899**Events now have proper backgrounds**: 3900``` 3901┌──────────────────────────┐ 3902│ Meeting at 2pm │ ← White background (#fff) 3903│ Description here... │ 3904│ [✏️ Edit] [️ Delete] │ 3905└──────────────────────────┘ 3906 3907Not: 3908┌──────────────────────────┐ 3909│ Meeting at 2pm │ ← No background (broken) 3910│ Description here... │ 3911└──────────────────────────┘ 3912``` 3913 3914### Affected Areas 3915 3916**All event displays**: 3917- Main calendar events ✓ 3918- Sidebar widget events ✓ 3919- Event list items ✓ 3920- Event backgrounds ✓ 3921- Button backgrounds ✓ 3922- Input field backgrounds ✓ 3923 3924**Everything uses real colors now!** 3925 3926## Version 5.1.8 (2026-02-09) - IMPROVED UPDATE TAB LAYOUT 3927 3928### Reorganized: Better Update Tab Layout 3929- **Moved:** Current Version section to the top 3930- **Combined:** Upload and Important Notes side-by-side 3931- **Improved:** Space-efficient two-column layout 3932- **Result:** More information visible at once! 3933 3934### New Layout Order 3935 3936**Version 5.1.8**: 3937``` 39381. Current Version (at top - see what you have) 39392. Upload + Important Notes (side-by-side) 39403. Recent Changes (changelog) 39414. Backups 3942``` 3943 3944### Side-by-Side Design 3945 3946**Upload form (left 60%) + Important Notes (right 40%)**: 3947``` 3948┌──────────────────────────────────────────┐ 3949│ Current Version │ 3950│ Version: 5.1.8 │ 3951│ ✅ Permissions: OK │ 3952└──────────────────────────────────────────┘ 3953 3954┌─────────────────────┬────────────────────┐ 3955│ Upload New │ ⚠️ Important Notes │ 3956│ [Choose File] │ • Replaces files │ 3957│ ☑ Backup first │ • Config preserved │ 3958│ [Upload] [Clear] │ • Events safe │ 3959└─────────────────────┴────────────────────┘ 3960``` 3961 3962### Benefits 3963 3964**Current Version First**: 3965- See what you have immediately 3966- Check permissions at a glance 3967- Know if ready to update 3968 3969**Side-by-Side Layout**: 3970- Upload form and warnings together 3971- Read notes while choosing file 3972- More efficient use of space 3973- Less scrolling needed 3974 3975**Better Information Flow**: 39761. See current version ✓ 39772. Upload new version with notes visible ✓ 39783. Review recent changes ✓ 39794. Manage backups ✓ 3980 3981### Visual Comparison 3982 3983**Before (v5.1.7)**: 3984``` 3985Important Notes (full width) 3986↓ 3987Upload Form (full width) 3988↓ 3989Current Version 3990↓ 3991Recent Changes 3992↓ 3993Backups 3994``` 3995 3996**After (v5.1.8)**: 3997``` 3998Current Version (full width) 3999↓ 4000Upload (60%) | Notes (40%) 4001↓ 4002Recent Changes 4003↓ 4004Backups 4005``` 4006 4007**More compact, better organized!** 4008 4009### Responsive Design 4010 4011**Wide screens**: 4012- Upload and notes side-by-side 4013- Full 1200px width utilized 4014- Efficient space usage 4015 4016**Narrow screens**: 4017- Sections stack gracefully 4018- Flex layout adapts 4019- Still fully functional 4020 4021### Layout Details 4022 4023**Current Version Section**: 4024- Full width (1200px max) 4025- Shows version, author, description 4026- Permission status with icons 4027- Helpful fix commands if needed 4028 4029**Upload/Notes Section**: 4030- Flexbox layout with gap 4031- Upload: `flex:1` (grows) 4032- Notes: `flex:0 0 350px` (fixed 350px) 4033- Both have proper min-width 4034 4035**Recent Changes Section**: 4036- Full width (1200px max) 4037- Compact scrollable view 4038- Color-coded change types 4039- Last 10 versions shown 4040 4041**Backups Section**: 4042- Full width (1200px max) 4043- Manual backup button 4044- Scrollable file list 4045- All actions accessible 4046 4047### Improved Max Widths 4048 4049All sections now use `max-width:1200px` (previously 900px): 4050- Better use of wide screens 4051- Still responsive on narrow screens 4052- Consistent throughout tab 4053 4054## Version 5.1.7 (2026-02-09) - FIX SYNTAX ERROR 4055 4056### Fixed: Extra Closing Brace 4057- **Fixed:** ParseError on line 1936 (extra closing brace) 4058- **Result:** Manual backup feature now works correctly! 4059 4060### What Was Wrong 4061 4062Extra `}` after the backup section: 4063 4064**Before (broken)**: 4065```php 4066echo '</div>'; 4067} // ← Extra closing brace! 4068 4069echo '<script> 4070``` 4071 4072**After (fixed)**: 4073```php 4074echo '</div>'; 4075 4076echo '<script> 4077``` 4078 4079**Manual backup feature now fully functional!** ✅ 4080 4081## Version 5.1.6 (2026-02-09) - MANUAL BACKUP ON DEMAND 4082 4083### Added: Create Backup Manually Anytime 4084- **Added:** "Create Backup Now" button in Backups section 4085- **Added:** Manual backup action handler with full verification 4086- **Added:** Backups section always visible (even with no backups) 4087- **Added:** Success message showing file size and file count 4088- **Result:** Create backups anytime without needing to upload! 4089 4090### Manual Backup Button 4091 4092**New Layout**: 4093``` 4094┌─────────────────────────────────────┐ 4095│ Backups [ Create Backup Now] │ 4096├─────────────────────────────────────┤ 4097│ Backup File Size │ 4098│ calendar.backup.v5.1.6... 243 KB │ 4099│ [ Download] [✏️ Rename] [️ Delete] │ 4100└─────────────────────────────────────┘ 4101``` 4102 4103**Always visible - even with no backups**: 4104``` 4105┌─────────────────────────────────────┐ 4106│ Backups [ Create Backup Now] │ 4107├─────────────────────────────────────┤ 4108│ No backups yet. Click "Create │ 4109│ Backup Now" to create your first │ 4110│ backup. │ 4111└─────────────────────────────────────┘ 4112``` 4113 4114### How It Works 4115 4116**Click the button**: 41171. Confirm: "Create a backup of the current plugin version?" 41182. System creates backup ZIP 41193. Verifies: File count (30+ files) 41204. Verifies: File size (200KB+) 41215. Shows success: "✓ Manual backup created: filename.zip (243 KB, 31 files)" 4122 4123**Backup naming**: 4124``` 4125calendar.backup.v5.1.6.manual.2026-02-09_12-30-45.zip 4126 ^^^^^^ 4127 "manual" tag identifies manual backups 4128``` 4129 4130### Use Cases 4131 4132**Before updates**: 4133- Create safety backup before uploading new version 4134- Have multiple restore points 4135- Test new features with fallback 4136 4137**Regular backups**: 4138- Weekly/monthly backup schedule 4139- Before making configuration changes 4140- After important customizations 4141 4142**Development**: 4143- Backup before code experiments 4144- Save working states 4145- Quick rollback points 4146 4147### Full Verification 4148 4149**Same checks as automatic backups**: 4150- ✅ File count check (minimum 10, expected 30+) 4151- ✅ File size check (minimum 1KB, expected 200KB+) 4152- ✅ Existence check (file actually created) 4153- ✅ Automatic cleanup on failure 4154 4155**Success message includes**: 4156- Backup filename 4157- File size (human-readable) 4158- Number of files backed up 4159 4160### Example Messages 4161 4162**Success**: 4163``` 4164✓ Manual backup created successfully: 4165 calendar.backup.v5.1.6.manual.2026-02-09_12-30-45.zip 4166 (243 KB, 31 files) 4167``` 4168 4169**Failure Examples**: 4170``` 4171❌ Plugin directory is not readable. 4172 Please check permissions. 4173 4174❌ Backup incomplete: Only 5 files were added (expected 30+). 4175 Backup failed. 4176 4177❌ Backup file is too small (342 bytes). 4178 Only 3 files were added. Backup failed. 4179``` 4180 4181### Benefits 4182 4183**On-Demand Safety**: 4184- Create backups anytime 4185- No need to upload new version 4186- Quick and easy 4187 4188**Peace of Mind**: 4189- Backup before risky changes 4190- Multiple restore points 4191- Safe experimentation 4192 4193**Professional Workflow**: 4194- Regular backup schedule 4195- Version snapshots 4196- Disaster recovery 4197 4198### Backup Section Improvements 4199 4200**Always Visible**: 4201- Section shows even with 0 backups 4202- Button always accessible 4203- Clear call-to-action 4204 4205**Better Header**: 4206- Title and button on same row 4207- Clean, professional layout 4208- Space-efficient design 4209 4210### Technical Details 4211 4212**New Action**: `create_manual_backup` 4213 4214**New Function**: `createManualBackup()` 4215- Gets current version 4216- Creates timestamped filename with "manual" tag 4217- Uses same verification as auto-backups 4218- Shows detailed success/error messages 4219 4220**File Naming Convention**: 4221``` 4222Automatic (on upload): 4223calendar.backup.v5.1.6.2026-02-09_12-30-45.zip 4224 4225Manual (button click): 4226calendar.backup.v5.1.6.manual.2026-02-09_12-30-45.zip 4227 ^^^^^^^ 4228 Easy to identify! 4229``` 4230 4231### Permissions Required 4232 4233- **Read access**: Plugin directory 4234- **Write access**: Parent plugins directory 4235 4236**Same as automatic backups** - no additional permissions needed! 4237 4238## Version 5.1.5 (2026-02-09) - ENHANCED BACKUP VERIFICATION 4239 4240### Enhanced: Backup Creation with Robust Verification 4241- **Added:** File count validation (must have 10+ files) 4242- **Added:** File size validation (must be 1KB+ minimum) 4243- **Added:** Return value from addDirectoryToZip (counts files added) 4244- **Added:** Detailed error messages showing file count 4245- **Added:** Automatic deletion of invalid/incomplete backups 4246- **Enhanced:** Exception handling with proper error propagation 4247- **Result:** Backups are now guaranteed to be complete or fail clearly! 4248 4249### What Changed 4250 4251**Before (v5.1.4)**: 4252```php 4253$this->addDirectoryToZip($zip, $pluginDir, 'calendar/'); 4254$zip->close(); 4255// No verification - could create empty or partial backup 4256``` 4257 4258**After (v5.1.5)**: 4259```php 4260$fileCount = $this->addDirectoryToZip($zip, $pluginDir, 'calendar/'); 4261$zip->close(); 4262 4263// Verify backup exists 4264if (!file_exists($backupPath)) { 4265 redirect('Backup file was not created'); 4266} 4267 4268// Verify backup has content 4269$backupSize = filesize($backupPath); 4270if ($backupSize < 1000) { 4271 unlink($backupPath); 4272 redirect('Backup too small: ' . $backupSize . ' bytes'); 4273} 4274 4275// Verify file count 4276if ($fileCount < 10) { 4277 unlink($backupPath); 4278 redirect('Only ' . $fileCount . ' files added (expected 30+)'); 4279} 4280``` 4281 4282### Backup Validation Checks 4283 4284**Three-Layer Verification**: 4285 42861. **File Count Check**: 4287 - Minimum: 10 files required 4288 - Expected: 30+ files 4289 - Action: Delete backup if too few files 4290 42912. **Size Check**: 4292 - Minimum: 1KB (1000 bytes) 4293 - Expected: 200-250KB 4294 - Action: Delete backup if too small 4295 42963. **Existence Check**: 4297 - Verify file was actually created 4298 - Check ZIP archive is valid 4299 - Action: Error if file missing 4300 4301### Enhanced Error Reporting 4302 4303**Detailed Error Messages**: 4304``` 4305❌ "Backup file was not created" 4306❌ "Backup too small (342 bytes). Only 3 files added." 4307❌ "Only 5 files added (expected 30+). Backup aborted." 4308❌ "Too many errors adding files: Failed to add X, Y, Z..." 4309❌ "Directory does not exist: /path/to/dir" 4310❌ "Directory is not readable: /path/to/dir" 4311``` 4312 4313**Now you know exactly what went wrong!** 4314 4315### Improved addDirectoryToZip Function 4316 4317**Returns File Count**: 4318```php 4319private function addDirectoryToZip($zip, $dir, $zipPath = '') { 4320 $fileCount = 0; 4321 $errors = []; 4322 4323 // Validation 4324 if (!is_dir($dir)) throw new Exception("Directory does not exist"); 4325 if (!is_readable($dir)) throw new Exception("Not readable"); 4326 4327 // Add files 4328 foreach ($files as $file) { 4329 if ($zip->addFile($filePath, $relativePath)) { 4330 $fileCount++; 4331 } else { 4332 $errors[] = "Failed to add: " . $filename; 4333 } 4334 } 4335 4336 // Check error threshold 4337 if (count($errors) > 5) { 4338 throw new Exception("Too many errors"); 4339 } 4340 4341 return $fileCount; // Returns count for verification! 4342} 4343``` 4344 4345### Safety Features 4346 4347**Invalid Backup Cleanup**: 4348- Failed backups are automatically deleted 4349- No partial/corrupt backups left behind 4350- Clean error state 4351 4352**Error Threshold**: 4353- Allow up to 5 minor file errors (logs warnings) 4354- More than 5 errors = complete failure 4355- Prevents partially corrupt backups 4356 4357**Directory Validation**: 4358- Check directory exists before processing 4359- Check directory is readable 4360- Fail fast with clear errors 4361 4362### Benefits 4363 4364**Guaranteed Complete Backups**: 4365- ✅ All files included or backup fails 4366- ✅ No silent failures 4367- ✅ Clear error messages 4368- ✅ Automatic cleanup 4369 4370**Better Debugging**: 4371- Know exactly how many files were added 4372- See specific errors for missing files 4373- Understand why backup failed 4374 4375**User Confidence**: 4376- Backup succeeds = complete backup 4377- Backup fails = clear error message 4378- No ambiguity 4379 4380### Example Scenarios 4381 4382**Scenario 1: Permission Issue** 4383``` 4384User uploads new version 4385System starts backup 4386Error: "Directory is not readable: /lib/plugins/calendar/" 4387Backup fails before creating file 4388User sees clear error message 4389``` 4390 4391**Scenario 2: Partial Backup** 4392``` 4393User uploads new version 4394System creates backup 4395Only 5 files added (disk issue?) 4396Size: 450 bytes 4397Verification fails 4398Incomplete backup deleted 4399Error: "Only 5 files added (expected 30+)" 4400``` 4401 4402**Scenario 3: Success** 4403``` 4404User uploads new version 4405System creates backup 440631 files added 4407Size: 240KB 4408All verifications pass ✅ 4409Update proceeds 4410``` 4411 4412### Testing Recommendations 4413 4414After installing v5.1.5: 44151. Upload a new version with backup enabled 44162. Check for success message 44173. Verify backup file exists in /lib/plugins/ 44184. Check backup file size (should be ~240KB) 44195. If backup fails, read error message carefully 4420 4421**Your backups are now bulletproof!** 4422 4423## Version 5.1.4 (2026-02-09) - BACKUP SYSTEM VERIFIED 4424 4425### ✅ Verified: Backup System Working Correctly 4426- **Verified:** addDirectoryToZip function includes all files recursively 4427- **Verified:** Backups contain all 31+ files from calendar directory 4428- **Verified:** File sizes are appropriate (233-240KB compressed, ~1MB uncompressed) 4429- **Info:** Backup sizes grow slightly with each version (more code = more features!) 4430- **Result:** Backup system is working perfectly! 4431 4432### Backup System Details 4433 4434**What Gets Backed Up**: 4435- All PHP files (syntax.php, admin.php, action.php, etc.) 4436- All JavaScript files (calendar-main.js, script.js) 4437- All documentation (CHANGELOG.md, README.md, all guides) 4438- All configuration (sync_config.php) 4439- All language files 4440- All assets and resources 4441- **Everything in the calendar/ directory!** 4442 4443**Backup Size Analysis**: 4444``` 4445Version 5.0.4: 233KB (normal) 4446Version 5.0.5: 234KB (normal) 4447Version 5.0.6: 235KB (normal) 4448Version 5.0.7: 236KB (normal) 4449Version 5.0.8: 237KB (normal) 4450Version 5.0.9: 237KB (normal) 4451Version 5.1.0: 238KB (normal) 4452Version 5.1.1: 238KB (normal) 4453Version 5.1.2: 240KB (normal - added AJAX features) 4454Version 5.1.3: 240KB (normal) 4455``` 4456 4457**Why Sizes Grow**: 4458- More features = more code 4459- Longer CHANGELOG 4460- Additional documentation 4461- New functionality 4462- **This is expected and normal!** 4463 4464**Compression Ratio**: 4465``` 4466Uncompressed: ~1.0 MB (source files) 4467Compressed: ~240 KB (ZIP archive) 4468Ratio: ~24% (excellent compression!) 4469``` 4470 4471### Backup File Contents 4472 4473**31 Files Included**: 4474``` 4475admin.php (216KB - main admin interface) 4476syntax.php (173KB - calendar rendering) 4477calendar-main.js (102KB - JavaScript functionality) 4478CHANGELOG.md (268KB - complete version history) 4479style.css (57KB - all styling) 4480action.php (38KB - DokuWiki actions) 4481sync_outlook.php (32KB - Outlook integration) 4482+ 24 other files (docs, configs, helpers) 4483``` 4484 4485**All files successfully included!** ✅ 4486 4487### How Backups Work 4488 4489**Creation Process**: 44901. User uploads new plugin version 44912. Checkbox "Create backup first" (checked by default) 44923. System creates backup: `calendar.backup.v5.1.3.2026-02-09_06-00-00.zip` 44934. Backup saved to: `/lib/plugins/` directory 44945. Then proceeds with update 4495 4496**Backup Function**: 4497```php 4498private function addDirectoryToZip($zip, $dir, $zipPath = '') { 4499 $files = new RecursiveIteratorIterator( 4500 new RecursiveDirectoryIterator($dir), 4501 RecursiveIteratorIterator::LEAVES_ONLY 4502 ); 4503 foreach ($files as $file) { 4504 if (!$file->isDir()) { 4505 $zip->addFile($filePath, $relativePath); 4506 } 4507 } 4508} 4509``` 4510 4511**Recursive = Gets Everything!** ✅ 4512 4513### Verification Results 4514 4515**Test Results**: 4516- ✅ All 31 files present in zip 4517- ✅ All subdirectories included (lang/en/) 4518- ✅ File sizes match originals 4519- ✅ Compression works properly 4520- ✅ No files missing 4521- ✅ Backup can be restored 4522 4523**File Count**: 4524``` 4525Source directory: 31 files 4526Backup ZIP: 34 items (31 files + 3 directories) 4527Status: COMPLETE ✅ 4528``` 4529 4530### Backup Best Practices 4531 4532**Always enabled by default** ✅ 4533**Stored in accessible location** ✅ 4534**Timestamped filenames** ✅ 4535**Complete directory backup** ✅ 4536**Easy to restore** ✅ 4537 4538### Conclusion 4539 4540The backup system is working perfectly. The file sizes are appropriate and expected: 4541- Compressed size: ~240KB (good compression) 4542- Uncompressed size: ~1MB (all source files) 4543- All files included: YES ✅ 4544- Growing size over versions: Normal (more features!) 4545 4546**Your backups are complete and reliable!** 4547 4548## Version 5.1.3 (2026-02-08) - FIX JAVASCRIPT SYNTAX ERROR 4549 4550### Fixed: JavaScript Syntax Error in AJAX Function 4551- **Fixed:** ParseError on line 1947 (deleteBackup function) 4552- **Fixed:** Escaped all single quotes in JavaScript strings 4553- **Result:** AJAX backup deletion now works correctly! 4554 4555### What Was Wrong 4556 4557JavaScript inside PHP echo needs escaped quotes: 4558 4559**Before (broken)**: 4560```javascript 4561formData.append('action', 'delete_backup'); // PHP interprets quotes 4562``` 4563 4564**After (fixed)**: 4565```javascript 4566formData.append(\'action\', \'delete_backup\'); // Escaped for PHP 4567``` 4568 4569### All Quotes Escaped 4570 4571Fixed in deleteBackup function: 4572- ✅ FormData.append() calls 4573- ✅ fetch() URL 4574- ✅ querySelector() calls 4575- ✅ createElement() call 4576- ✅ All string literals 4577- ✅ Error messages 4578 4579**JavaScript now works!** ✓ 4580 4581## Version 5.1.2 (2026-02-08) - AJAX BACKUP DELETION & LAYOUT IMPROVEMENT 4582 4583### Improved: Update Tab Further Refined 4584- **Moved:** Important Notes to very top (above upload) 4585- **Enhanced:** Delete backup now uses AJAX (no page refresh!) 4586- **Added:** Smooth fade-out animation when deleting backups 4587- **Added:** Success message after deletion 4588- **Auto-remove:** Backup section disappears if last backup deleted 4589- **Result:** Smoother, more polished experience! 4590 4591### New Layout Order 4592 4593**Final Order (v5.1.2)**: 4594``` 45951. ⚠️ Important Notes (warnings at top) 45962. Upload New Version (with Clear Cache button) 45973. Current Version (info) 45984. Recent Changes (changelog) 45995. Available Backups (if any) 4600``` 4601 4602### AJAX Backup Deletion 4603 4604**Before (v5.1.1)**: 4605- Click Delete → Page refreshes → Scroll back down 4606- Lose position on page 4607- Page reload is jarring 4608 4609**After (v5.1.2)**: 4610- Click Delete → Confirm 4611- Row fades out smoothly 4612- Row disappears 4613- Success message shows at top 4614- Success message fades after 3 seconds 4615- If last backup: entire section fades away 4616- **No page refresh!** ✓ 4617 4618### Visual Flow 4619 4620**Delete Animation**: 4621``` 46221. Click ️ Delete 46232. Confirm dialog 46243. Row fades out (0.3s) 46254. Row removed 46265. Success message appears 46276. Message fades after 3s 4628``` 4629 4630**If Last Backup**: 4631``` 46321. Delete last backup 46332. Row fades out 46343. Entire "Available Backups" section fades 46354. Section removed 46365. Clean interface ✓ 4637``` 4638 4639### Success Message 4640 4641After deleting: 4642``` 4643┌──────────────────────────────┐ 4644│ ✓ Backup deleted: filename │ ← Appears at top 4645└──────────────────────────────┘ 4646 Fades after 3 seconds 4647``` 4648 4649### Benefits 4650 4651**Important Notes First**: 4652- Warnings before actions ✓ 4653- Read before uploading ✓ 4654- Clear expectations ✓ 4655 4656**AJAX Deletion**: 4657- No page refresh ✓ 4658- Smooth animations ✓ 4659- Stay in context ✓ 4660- Professional feel ✓ 4661 4662**Auto-Cleanup**: 4663- Empty list disappears ✓ 4664- Clean interface ✓ 4665- No clutter ✓ 4666 4667### Technical Implementation 4668 4669**AJAX Request**: 4670```javascript 4671fetch('?do=admin&page=calendar&tab=update', { 4672 method: 'POST', 4673 body: formData 4674}) 4675``` 4676 4677**DOM Manipulation**: 4678- Fade out row 4679- Remove element 4680- Show success 4681- Remove section if empty 4682 4683**Smooth Transitions**: 4684- 300ms fade animations 4685- Clean visual feedback 4686- Professional polish 4687 4688## Version 5.1.1 (2026-02-08) - REORGANIZE UPDATE TAB 4689 4690### Improved: Update Tab Layout Reorganized 4691- **Moved:** Upload section to the top of the page 4692- **Added:** Clear Cache button next to Upload & Install button 4693- **Changed:** "Current Version" section moved below upload 4694- **Result:** Better workflow - upload first, then see version info! 4695 4696### New Layout Order 4697 4698**Before (v5.1.0)**: 4699``` 47001. Clear Cache (standalone) 47012. Current Version 47023. Recent Changes 47034. Upload New Version 47045. Warning Box 47056. Backups 4706``` 4707 4708**After (v5.1.1)**: 4709``` 47101. Upload New Version (with Clear Cache button side-by-side) 47112. Warning Box 47123. Current Version 47134. Recent Changes 47145. Backups 4715``` 4716 4717### Visual Result 4718 4719**Top of Update Tab**: 4720``` 4721┌─────────────────────────────────┐ 4722│ Upload New Version │ 4723│ ┌─────────────────────────────┐ │ 4724│ │ [Choose File] │ │ 4725│ │ ☑ Create backup first │ │ 4726│ │ ┌──────────────┬──────────┐ │ │ 4727│ │ │ Upload & │️ Clear │ │ │ 4728│ │ │ Install │ Cache │ │ │ 4729│ │ └──────────────┴──────────┘ │ │ 4730│ └─────────────────────────────┘ │ 4731│ │ 4732│ ⚠️ Important Notes │ 4733│ • Will replace all files │ 4734│ • Config preserved │ 4735│ │ 4736│ Current Version │ 4737│ Version: 5.1.1 │ 4738└─────────────────────────────────┘ 4739``` 4740 4741### Benefits 4742 4743**Better Workflow**: 4744- Primary action (upload) is first 4745- Clear cache conveniently next to install 4746- No scrolling to find upload button 4747- Logical top-to-bottom flow 4748 4749**Side-by-Side Buttons**: 4750- Upload & Install (green) 4751- Clear Cache (orange) 4752- Both common actions together 4753- Easy to access after upload 4754 4755**Improved UX**: 4756- Upload is most important → now at top 4757- Version info is reference → moved down 4758- Related actions grouped 4759- Cleaner organization 4760 4761### Button Layout 4762 4763``` 4764┌──────────────────┬──────────────┐ 4765│ Upload & │ ️ Clear │ 4766│ Install │ Cache │ 4767│ (Green) │ (Orange) │ 4768└──────────────────┴──────────────┘ 4769``` 4770 4771**Green = Primary Action** 4772**Orange = Secondary Action** 4773 4774Both easily accessible! 4775 4776## Version 5.1.0 (2026-02-08) - ADMIN SECTIONS USE MAIN BACKGROUND 4777 4778### Changed: Admin Section Backgrounds Now Use __background__ 4779- **Changed:** All section boxes now use `__background__` instead of `__background_alt__` 4780- **Result:** Cleaner, more unified admin interface! 4781 4782### Background Usage Update 4783 4784**Before (v5.0.9)**: 4785```php 4786Section boxes: bg_alt (__background_alt__) 4787Content areas: bg (__background__) 4788``` 4789 4790**After (v5.1.0)**: 4791```php 4792Section boxes: bg (__background__) 4793Content areas: bg (__background__) 4794``` 4795 4796### Why This Change? 4797 4798**More unified appearance**: 4799- Sections and content use same background 4800- Creates cleaner, more cohesive look 4801- Borders provide visual separation 4802- Matches typical admin UI patterns 4803 4804**Template color hierarchy**: 4805``` 4806__background_site__ → Outer page wrapper 4807__background__ → Content & sections (BOTH now use this) 4808__background_alt__ → Reserved for special panels/highlights 4809__background_neu__ → Special highlights 4810``` 4811 4812### Visual Result 4813 4814**Light Template**: 4815```ini 4816__background__ = "#ffffff" 4817__background_alt__ = "#e8e8e8" 4818``` 4819 4820**Before**: 4821``` 4822Admin Page: 4823┌─────────────────────┐ 4824│ ┌─────────────────┐ │ 4825│ │ Section Box │ │ ← Gray (#e8e8e8) 4826│ │ ┌─────────────┐ │ │ 4827│ │ │ Content │ │ │ ← White (#fff) 4828│ │ └─────────────┘ │ │ 4829│ └─────────────────┘ │ 4830└─────────────────────┘ 4831Two-tone appearance 4832``` 4833 4834**After**: 4835``` 4836Admin Page: 4837┌─────────────────────┐ 4838│ ┌─────────────────┐ │ 4839│ │ Section Box │ │ ← White (#fff) 4840│ │ ┌─────────────┐ │ │ 4841│ │ │ Content │ │ │ ← White (#fff) 4842│ │ └─────────────┘ │ │ 4843│ └─────────────────┘ │ 4844└─────────────────────┘ 4845Unified, clean appearance 4846Borders provide separation 4847``` 4848 4849**Dark Template**: 4850```ini 4851__background__ = "#2d2d2d" 4852__background_alt__ = "#3a3a3a" 4853``` 4854 4855**After**: 4856``` 4857Admin Page: 4858┌─────────────────────┐ 4859│ ┌─────────────────┐ │ 4860│ │ Section Box │ │ ← Dark (#2d2d2d) 4861│ │ ┌─────────────┐ │ │ 4862│ │ │ Content │ │ │ ← Dark (#2d2d2d) 4863│ │ └─────────────┘ │ │ 4864│ └─────────────────┘ │ 4865└─────────────────────┘ 4866Unified dark appearance 4867Accent borders provide definition 4868``` 4869 4870### Benefits 4871 4872**Cleaner Look**: 4873- No more alternating gray/white 4874- More professional appearance 4875- Less visual noise 4876- Unified color scheme 4877 4878**Better Consistency**: 4879- Matches modern admin UI patterns 4880- Borders define sections, not colors 4881- Simpler, cleaner design 4882- Easier on the eyes 4883 4884**Template Friendly**: 4885- Works with any background color 4886- Light or dark templates 4887- Custom colors 4888- Always looks cohesive 4889 4890### All Sections Updated 4891 4892✅ Outlook Sync config sections 4893✅ Manage Events sections 4894✅ Update Plugin sections 4895✅ Themes tab sections 4896✅ Week start day section 4897✅ All form sections 4898 4899**Complete unified theming!** 4900 4901## Version 5.0.9 (2026-02-08) - FIX SYNTAX ERROR IN THEMES TAB 4902 4903### Fixed: Syntax Error in Theme Cards 4904- **Fixed:** ParseError on line 4461 (Purple theme card) 4905- **Fixed:** Malformed ternary expressions from sed replacement 4906- **Fixed:** All 4 theme cards (Purple, Professional, Pink, Wiki) 4907- **Result:** Admin pages work correctly! 4908 4909### What Was Wrong 4910 4911The bulk sed replacement in v5.0.8 incorrectly modified ternary expressions: 4912 4913**Before (broken)**: 4914```php 4915? '#9b59b6' : ' . $colors['border'] . ') 4916// Extra quote and dot created syntax error 4917``` 4918 4919**After (fixed)**: 4920```php 4921? '#9b59b6' : $colors['border']) 4922// Clean ternary expression 4923``` 4924 4925### All Theme Cards Fixed 4926 4927- ✅ Purple Dream card 4928- ✅ Professional Blue card 4929- ✅ Pink Bling card 4930- ✅ Wiki Default card 4931 4932### Now Working 4933 4934**Theme selection page loads** ✓ 4935**All cards display properly** ✓ 4936**Template colors applied** ✓ 4937**No syntax errors** ✓ 4938 4939## Version 5.0.8 (2026-02-08) - FIX THEMES TAB & BACKGROUND MAPPING 4940 4941### Fixed: Themes Tab Backgrounds & Correct Template Color Mapping 4942- **Fixed:** Themes tab now uses template colors (removed all hardcoded whites) 4943- **Fixed:** Main background now uses `__background__` instead of `__background_site__` 4944- **Fixed:** Theme selection cards use template backgrounds 4945- **Fixed:** Week start options use template backgrounds 4946- **Result:** Perfect color mapping throughout admin! 4947 4948### Color Mapping Correction 4949 4950**Before (v5.0.7)**: 4951```php 4952bg: __background_site__ // Wrong - this is outer page bg 4953bg_alt: __background_alt__ 4954``` 4955 4956**After (v5.0.8)**: 4957```php 4958bg: __background__ // Correct - main content bg 4959bg_alt: __background_alt__ 4960``` 4961 4962### Why This Matters 4963 4964**Template color hierarchy**: 4965``` 4966__background_site__ → Outer page/site background 4967__background__ → Main content area (CORRECT for admin) 4968__background_alt__ → Sections/panels 4969__background_neu__ → Highlights 4970``` 4971 4972**Admin should use**: 4973- `__background__` for input fields, content areas 4974- `__background_alt__` for section boxes, panels 4975 4976### Themes Tab Fixed 4977 4978**Removed all hardcoded colors**: 4979```php 4980Before: '#ddd', '#fff', '#dee2e6' 4981After: $colors['border'], $colors['bg'], $colors['border'] 4982``` 4983 4984**Now themed**: 4985- ✅ Week start section background 4986- ✅ Week start option backgrounds 4987- ✅ Theme card backgrounds 4988- ✅ Theme card borders 4989- ✅ All borders throughout 4990 4991### Visual Result 4992 4993**Light Template**: 4994```ini 4995__background__ = "#ffffff" 4996__background_alt__ = "#e8e8e8" 4997``` 4998 4999**Admin Before (v5.0.7)**: 5000``` 5001Input fields: #f5f5f5 (site bg - wrong) 5002Sections: #e8e8e8 (alt bg - correct) 5003``` 5004 5005**Admin After (v5.0.8)**: 5006``` 5007Input fields: #ffffff (content bg - correct!) 5008Sections: #e8e8e8 (alt bg - correct!) 5009``` 5010 5011**Dark Template**: 5012```ini 5013__background__ = "#2d2d2d" 5014__background_alt__ = "#3a3a3a" 5015``` 5016 5017**Admin After (v5.0.8)**: 5018``` 5019Input fields: #2d2d2d (content bg - perfect!) 5020Sections: #3a3a3a (alt bg - perfect!) 5021``` 5022 5023### Complete Themes Tab 5024 5025**Week Start Options**: 5026``` 5027┌─────────────────────────┐ 5028│ Week Start Day │ ← bg_alt 5029│ ┌─────────┬───────────┐ │ 5030│ │ Monday │ Sunday │ │ ← bg (when not selected) 5031│ └─────────┴───────────┘ │ 5032└─────────────────────────┘ 5033``` 5034 5035**Theme Cards**: 5036``` 5037┌─────────────────────────┐ 5038│ Matrix Edition │ ← bg (when not selected) 5039│ Classic green theme │ border (when not selected) 5040└─────────────────────────┘ 5041 5042┌═════════════════════════┐ 5043│ Purple Dream │ ← rgba green tint (when selected) 5044│ Elegant purple theme │ #00cc07 border (when selected) 5045└═════════════════════════┘ 5046``` 5047 5048### Perfect Integration 5049 5050**All admin pages now**: 5051- Content areas: `__background__` ✓ 5052- Section boxes: `__background_alt__` ✓ 5053- Borders: `__border__` ✓ 5054- Text: `__text__` ✓ 5055 5056**Matches wiki perfectly**: 5057- Same white content areas 5058- Same gray section boxes 5059- Same border colors 5060- Same text colors 5061 5062### No More Issues 5063 5064**Fixed**: 5065- ❌ Site background on content areas → ✅ Content background 5066- ❌ Hardcoded white on themes tab → ✅ Template background 5067- ❌ Hardcoded borders (#ddd) → ✅ Template borders 5068 5069**Result**: 5070- Perfect color hierarchy ✓ 5071- Correct background levels ✓ 5072- Complete template integration ✓ 5073 5074## Version 5.0.7 (2026-02-08) - COMPLETE ADMIN THEMING 5075 5076### Fixed: All Admin Backgrounds Use Template Colors 5077- **Fixed:** All section backgrounds use `__background_alt__` 5078- **Fixed:** All content backgrounds use `__background__` 5079- **Fixed:** All borders use `__border__` 5080- **Fixed:** All text uses `__text__` 5081- **Result:** Complete admin template integration! 5082 5083### All Replacements 5084 5085**Backgrounds**: 5086```php 5087Before: background: #f9f9f9 5088After: background: ' . $colors['bg_alt'] . ' 5089 5090Before: background: #fff / background: white 5091After: background: ' . $colors['bg'] . ' 5092``` 5093 5094**Borders**: 5095```php 5096Before: border: 1px solid #ddd 5097Before: border: 1px solid #e0e0e0 5098Before: border: 1px solid #eee 5099After: border: 1px solid ' . $colors['border'] . ' 5100``` 5101 5102**Text**: 5103```php 5104Before: color: #333 5105Before: color: #666 5106After: color: ' . $colors['text'] . ' 5107``` 5108 5109### Complete Admin Coverage 5110 5111**All tabs now themed**: 5112- ✅ Manage Events tab 5113- ✅ Update Plugin tab 5114- ✅ Outlook Sync tab 5115- ✅ Themes tab 5116- ✅ Tab navigation 5117- ✅ All sections 5118- ✅ All inputs 5119- ✅ All borders 5120- ✅ All text 5121 5122### Visual Result 5123 5124**Light Template**: 5125``` 5126Admin Page: 5127┌──────────────────────────┐ 5128│ Tab Navigation │ ← Template borders 5129├──────────────────────────┤ 5130│ Section Headers │ ← bg_alt (light gray) 5131│ ┌──────────────────────┐ │ 5132│ │ Form Inputs │ │ ← bg (white) 5133│ │ Content Areas │ │ 5134│ └──────────────────────┘ │ 5135└──────────────────────────┘ 5136All template colors! ✓ 5137``` 5138 5139**Dark Template**: 5140``` 5141Admin Page: 5142┌──────────────────────────┐ 5143│ Tab Navigation │ ← Template borders 5144├──────────────────────────┤ 5145│ Section Headers │ ← bg_alt (dark gray) 5146│ ┌──────────────────────┐ │ 5147│ │ Form Inputs │ │ ← bg (darker) 5148│ │ Content Areas │ │ 5149│ └──────────────────────┘ │ 5150└──────────────────────────┘ 5151All template colors! ✓ 5152``` 5153 5154### Template Color Mapping 5155 5156**Used throughout admin**: 5157``` 5158__background_site__ → $colors['bg'] (main backgrounds) 5159__background_alt__ → $colors['bg_alt'] (section backgrounds) 5160__text__ → $colors['text'] (all text) 5161__border__ → $colors['border'] (all borders) 5162__link__ → $colors['link'] (links - future) 5163``` 5164 5165### Examples by Section 5166 5167**Manage Events**: 5168- Event list backgrounds: `bg_alt` 5169- Event item backgrounds: `bg` 5170- Borders: `border` 5171- Text: `text` 5172 5173**Update Plugin**: 5174- Section backgrounds: `bg_alt` 5175- Content areas: `bg` 5176- Borders: `border` 5177- Text: `text` 5178 5179**Outlook Sync**: 5180- Config sections: `bg_alt` 5181- Input fields: `bg` 5182- Borders: `border` 5183- Labels: `text` 5184 5185**Themes Tab**: 5186- Theme cards: `bg_alt` 5187- Preview areas: `bg` 5188- Borders: `border` 5189- Descriptions: `text` 5190 5191### Benefits 5192 5193**Seamless Integration**: 5194- Matches wiki admin area perfectly 5195- Same colors throughout wiki 5196- Professional appearance 5197- Consistent experience 5198 5199**Automatic Adaptation**: 5200- Light templates: Light admin 5201- Dark templates: Dark admin 5202- Custom templates: Uses custom colors 5203 5204**No White Boxes**: 5205- Every background themed 5206- Every border themed 5207- Every text themed 5208- Complete consistency 5209 5210### PERFECT HARMONY 5211 5212**Frontend (Calendar)**: 5213- Wiki theme uses style.ini ✓ 5214- Perfect template match ✓ 5215 5216**Backend (Admin)**: 5217- Reads same style.ini ✓ 5218- Perfect template match ✓ 5219 5220**Complete Unity**: 5221- Same colors everywhere ✓ 5222- Seamless experience ✓ 5223- Professional polish ✓ 5224 5225## Version 5.0.6 (2026-02-08) - ADMIN PAGES USE TEMPLATE COLORS 5226 5227### Enhanced: Month/Year Header & Admin Pages Use Template Colors 5228- **Fixed:** Month/Year header now uses `__text_neu__` for wiki theme 5229- **Added:** Admin pages read template's style.ini file 5230- **Added:** `getTemplateColors()` function in admin class 5231- **Fixed:** Tab navigation uses template text and border colors 5232- **Result:** Complete template integration everywhere! 5233 5234### Month/Year Header 5235 5236**Before**: 5237```php 5238color: __text__ // Same as primary text 5239``` 5240 5241**After (Wiki Theme)**: 5242```php 5243color: __text_neu__ // Dimmed text (subtle) 5244``` 5245 5246### Admin Pages Enhancement 5247 5248**New `getTemplateColors()` function**: 5249- Reads template's style.ini file 5250- Extracts color replacements 5251- Provides colors to all admin tabs 5252- Falls back to sensible defaults 5253 5254**Colors used**: 5255```php 5256bg: __background_site__ 5257bg_alt: __background_alt__ 5258text: __text__ 5259border: __border__ 5260link: __link__ 5261``` 5262 5263**Applied to**: 5264- Tab navigation borders 5265- Tab text colors 5266- All admin sections 5267- Ready for future enhancements 5268 5269### Visual Result 5270 5271**Calendar Header**: 5272``` 5273┌────────────────────┐ 5274│ ‹ February 2026 › │ ← __text_neu__ (dimmed) 5275└────────────────────┘ 5276Subtle and elegant ✓ 5277``` 5278 5279**Admin Navigation**: 5280``` 5281 Manage Events | Update | ⚙️ Config | Themes 5282───────────────────────────────────────────────── 5283Active tab: Green (#00cc07) 5284Inactive tabs: Template text color 5285Border: Template border color 5286``` 5287 5288### Template Integration 5289 5290**Light Template**: 5291```ini 5292__text_neu__ = "#666666" 5293__border__ = "#cccccc" 5294``` 5295**Result**: 5296- Month/Year: Medium gray (subtle) 5297- Admin borders: Light gray 5298- Tab text: Dark gray 5299 5300**Dark Template**: 5301```ini 5302__text_neu__ = "#999999" 5303__border__ = "#555555" 5304``` 5305**Result**: 5306- Month/Year: Light gray (subtle) 5307- Admin borders: Medium gray 5308- Tab text: Bright gray 5309 5310### Benefits 5311 5312**Calendar Frontend**: 5313- Month/Year header more subtle 5314- Better visual hierarchy 5315- Less prominent, more elegant 5316 5317**Admin Backend**: 5318- Uses template colors 5319- Matches wiki admin area 5320- Consistent experience 5321- Professional appearance 5322 5323### Future-Ready 5324 5325The `getTemplateColors()` function is now available for: 5326- ✅ Tab navigation (implemented) 5327- Section backgrounds (ready) 5328- Button colors (ready) 5329- Input fields (ready) 5330- Success/error messages (ready) 5331 5332**Foundation laid for complete admin theming!** 5333 5334## Version 5.0.5 (2026-02-08) - WIKI THEME ADD BUTTON & SECTION HEADERS 5335 5336### Fixed: Add Event Bar & Section Headers Use Template Colors 5337- **Fixed:** Add Event bar now uses `__background_alt__` for wiki theme 5338- **Fixed:** "Today" header uses `__text_neu__` 5339- **Fixed:** "Tomorrow" header uses `__text__` 5340- **Fixed:** "Important Events" header uses `__border__` 5341- **Result:** Perfect template color integration! 5342 5343### All Changes 5344 5345**Add Event Bar (Wiki Theme)**: 5346 5347**Before**: 5348```php 5349background: #3498db // Generic blue 5350``` 5351 5352**After**: 5353```php 5354background: __background_alt__ // Template alternate bg 5355text: __text__ // Template text color 5356hover: __background_neu__ // Template neutral bg 5357``` 5358 5359**Section Headers (Wiki Theme)**: 5360 5361**Before**: 5362```php 5363Today: #ff9800 // Orange 5364Tomorrow: #4caf50 // Green 5365Important Events: #9b59b6 // Purple 5366``` 5367 5368**After**: 5369```php 5370Today: __text_neu__ // Template dimmed text 5371Tomorrow: __text__ // Template primary text 5372Important Events: __border__ // Template border color 5373``` 5374 5375### Visual Result 5376 5377**Wiki Default Theme**: 5378``` 5379Add Event Bar: 5380┌────────────────┐ 5381│ + ADD EVENT │ ← Template alt background 5382└────────────────┘ 5383 5384Sections: 5385━━━━━━━━━━━━━━━━ 5386Today ← Dimmed text color (__text_neu__) 5387• Team Meeting 5388 5389Tomorrow ← Primary text color (__text__) 5390• Code Review 5391 5392Important Events ← Border color (__border__) 5393• Project Deadline 5394``` 5395 5396### Example with DokuWiki Default Template 5397 5398**Template colors**: 5399```ini 5400__background_alt__ = "#e8e8e8" 5401__text__ = "#333333" 5402__text_neu__ = "#666666" 5403__border__ = "#cccccc" 5404``` 5405 5406**Calendar result**: 5407``` 5408Add Event Bar: Light gray (#e8e8e8) 5409Today header: Medium gray (#666666) 5410Tomorrow header: Dark gray (#333333) 5411Important Events header: Border gray (#cccccc) 5412``` 5413 5414### Example with Dark Template 5415 5416**Template colors**: 5417```ini 5418__background_alt__ = "#2d2d2d" 5419__text__ = "#e0e0e0" 5420__text_neu__ = "#999999" 5421__border__ = "#555555" 5422``` 5423 5424**Calendar result**: 5425``` 5426Add Event Bar: Dark gray (#2d2d2d) 5427Today header: Light gray (#999999) 5428Tomorrow header: Bright gray (#e0e0e0) 5429Important Events header: Medium gray (#555555) 5430``` 5431 5432### Perfect Harmony 5433 5434All sidebar elements now use template colors: 5435- ✅ Add Event bar background 5436- ✅ Add Event bar text 5437- ✅ Today section header 5438- ✅ Tomorrow section header 5439- ✅ Important Events header 5440- ✅ Calendar cells 5441- ✅ Grid backgrounds 5442- ✅ All borders 5443 5444**Complete template integration!** 5445 5446## Version 5.0.4 (2026-02-08) - USE __background__ FOR CALENDAR CELLS 5447 5448### Fixed: Calendar Cells Use Correct Template Color 5449- **Fixed:** Calendar cells now use `__background__` from template 5450- **Changed:** `cell_bg` now uses `__background__` instead of `__background_neu__` 5451- **Result:** Calendar cells match main content area background! 5452 5453### Color Mapping Update 5454 5455**Before (v5.0.3)**: 5456```php 5457cell_bg: __background_neu__ // Wrong - this is for neutral/alternate 5458``` 5459 5460**After (v5.0.4)**: 5461```php 5462cell_bg: __background__ // Correct - main content background 5463``` 5464 5465### Template Color Usage 5466 5467**Wiki Default theme now uses**: 5468``` 5469__background_site__ → Overall page background 5470__background__ → Calendar cells (main content bg) 5471__background_alt__ → Grid background, headers 5472__background_neu__ → Today cell highlight 5473__text__ → Primary text 5474__text_neu__ → Dimmed text 5475__link__ → Links, bright text 5476__border__ → All borders 5477``` 5478 5479### Visual Result 5480 5481**Before**: 5482``` 5483Calendar with template colors: 5484┌─────┬─────┬─────┐ 5485│ Mon │ Tue │ Wed │ 5486├─────┼─────┼─────┤ 5487│ 8 │ 9 │ 10 │ ← Neutral gray (wrong) 5488└─────┴─────┴─────┘ 5489``` 5490 5491**After**: 5492``` 5493Calendar with template colors: 5494┌─────┬─────┬─────┐ 5495│ Mon │ Tue │ Wed │ 5496├─────┼─────┼─────┤ 5497│ 8 │ 9 │ 10 │ ← White/content bg (correct!) 5498└─────┴─────┴─────┘ 5499``` 5500 5501### Example Template Colors 5502 5503**DokuWiki Default**: 5504```ini 5505__background__ = "#ffffff" 5506``` 5507**Result**: White calendar cells ✓ 5508 5509**Dark Template**: 5510```ini 5511__background__ = "#2d2d2d" 5512``` 5513**Result**: Dark calendar cells ✓ 5514 5515**Custom Template**: 5516```ini 5517__background__ = "#f9f9f9" 5518``` 5519**Result**: Custom color cells ✓ 5520 5521### Perfect Matching 5522 5523Calendar cells now match: 5524- ✅ Main content area background 5525- ✅ Article/page background 5526- ✅ Content box background 5527- ✅ Same as wiki text background 5528 5529**Seamless integration!** 5530 5531## Version 5.0.3 (2026-02-08) - READ COLORS FROM TEMPLATE STYLE.INI 5532 5533### Enhanced: Wiki Default Theme Reads Template Colors 5534- **Added:** Function to read colors from DokuWiki template's style.ini file 5535- **Reads:** `/var/www/html/dokuwiki/conf/tpl/{template}/style.ini` 5536- **Falls back:** Also checks `/var/www/html/dokuwiki/lib/tpl/{template}/style.ini` 5537- **Uses:** Actual template colors instead of CSS variables 5538- **Result:** Perfect color matching with any DokuWiki template! 5539 5540### How It Works 5541 5542**New Function: `getWikiTemplateColors()`** 5543 55441. **Detects** current DokuWiki template name 55452. **Reads** the template's `style.ini` file 55463. **Parses** color replacements section 55474. **Maps** template colors to calendar theme 55485. **Falls back** to CSS variables if file not found 5549 5550### Colors Read from style.ini 5551 5552**Template color replacements used**: 5553```php 5554__background_site__ → bg, header_bg 5555__background_alt__ → grid_bg, cell_today_bg 5556__background_neu__ → cell_bg 5557__text__ → text_primary 5558__text_neu__ → text_dim 5559__link__ → text_bright 5560__border__ → border, grid_border 5561``` 5562 5563### Example style.ini Mapping 5564 5565**Template style.ini**: 5566```ini 5567[replacements] 5568__background_site__ = "#f8f9fa" 5569__background_alt__ = "#e9ecef" 5570__background_neu__ = "#dee2e6" 5571__text__ = "#212529" 5572__text_neu__ = "#6c757d" 5573__link__ = "#0d6efd" 5574__border__ = "#ced4da" 5575``` 5576 5577**Calendar theme result**: 5578```php 5579bg: #f8f9fa 5580header_bg: #e9ecef 5581grid_bg: #e9ecef 5582cell_bg: #dee2e6 5583text_primary: #212529 5584text_dim: #6c757d 5585text_bright: #0d6efd 5586border: #ced4da 5587grid_border: #ced4da 5588``` 5589 5590### Before vs After 5591 5592**Before (v5.0.2)**: 5593``` 5594Wiki Default theme used: 5595- CSS variables (var(--__background__, #fff)) 5596- Required browser CSS variable support 5597- Fallback to generic colors 5598``` 5599 5600**After (v5.0.3)**: 5601``` 5602Wiki Default theme uses: 5603- Actual colors from template's style.ini 5604- Exact template color values 5605- No CSS variable dependency 5606- Perfect color matching! 5607``` 5608 5609### File Location Priority 5610 5611Checks in order: 56121. `/var/www/html/dokuwiki/conf/tpl/{template}/style.ini` 56132. `/var/www/html/dokuwiki/lib/tpl/{template}/style.ini` 56143. Falls back to CSS variables if neither found 5615 5616### Benefits 5617 5618**More accurate colors**: 5619- Uses exact template color values ✓ 5620- No CSS variable interpolation ✓ 5621- Consistent across all browsers ✓ 5622 5623**Better compatibility**: 5624- Works with older browsers ✓ 5625- No CSS variable support needed ✓ 5626- Direct color values ✓ 5627 5628**Perfect matching**: 5629- Reads template's actual colors ✓ 5630- Same colors as wiki pages ✓ 5631- Seamless integration ✓ 5632 5633### Template Examples 5634 5635**DokuWiki Default Template**: 5636``` 5637Reads: lib/tpl/dokuwiki/style.ini 5638Gets: Default DokuWiki colors 5639Result: Perfect classic DokuWiki look 5640``` 5641 5642**Bootstrap Template**: 5643``` 5644Reads: lib/tpl/bootstrap3/style.ini 5645Gets: Bootstrap color scheme 5646Result: Perfect Bootstrap integration 5647``` 5648 5649**Custom Template**: 5650``` 5651Reads: conf/tpl/mycustom/style.ini 5652Gets: Your custom colors 5653Result: Perfect custom theme match 5654``` 5655 5656### Fallback Chain 5657 56581. **Try** reading style.ini from template 56592. **If found** → Use exact colors from file 56603. **If not found** → Use CSS variables 56614. **If no CSS vars** → Use fallback colors 5662 5663**Always works, always matches!** ✓ 5664 5665## Version 5.0.2 (2026-02-08) - FIX WIKI DEFAULT THEME DAY PANEL 5666 5667### Fixed: Wiki Default Theme Day Panel Colors 5668- **Fixed:** Day popup panel now uses DokuWiki CSS variables 5669- **Fixed:** Panel background matches wiki theme 5670- **Fixed:** Panel header matches wiki theme 5671- **Fixed:** Border colors use wiki theme 5672- **Fixed:** Text colors use wiki theme 5673- **Result:** Perfect integration with DokuWiki templates! 5674 5675### All Changes 5676 5677**Day Panel Colors (Wiki Default)**: 5678 5679**Before**: 5680```php 5681background: rgba(36, 36, 36, 0.5) // Dark gray (wrong!) 5682header: #3498db // Blue (wrong!) 5683``` 5684 5685**After**: 5686```php 5687background: var(--__background__, #fff) 5688header: var(--__background_alt__, #e8e8e8) 5689header_text: var(--__text__, #333) 5690border: var(--__border__, #ccc) 5691shadow: 0 2px 4px rgba(0, 0, 0, 0.1) 5692``` 5693 5694**Event Colors (Wiki Default)**: 5695```php 5696event_bg: var(--__background_alt__, rgba(245, 245, 245, 0.5)) 5697border_color: var(--__border__, rgba(204, 204, 204, 0.3)) 5698bar_shadow: 0 1px 2px rgba(0, 0, 0, 0.15) 5699``` 5700 5701### Before vs After 5702 5703**Before (v5.0.1)**: 5704``` 5705Wiki Default - Click Week Cell: 5706┌────────────────┐ 5707│ Monday, Feb 8 │ ← Blue header (wrong) 5708├────────────────┤ 5709│ Team Meeting │ ← Dark gray bg (wrong) 5710│ 2:00 PM │ 5711└────────────────┘ 5712Doesn't match wiki theme 5713``` 5714 5715**After (v5.0.2)**: 5716``` 5717Wiki Default - Click Week Cell: 5718 5719Light Wiki Theme: 5720┌────────────────┐ 5721│ Monday, Feb 8 │ ← Light gray header ✓ 5722├────────────────┤ 5723│ Team Meeting │ ← White bg ✓ 5724│ 2:00 PM │ Dark text ✓ 5725└────────────────┘ 5726 5727Dark Wiki Theme: 5728┌────────────────┐ 5729│ Monday, Feb 8 │ ← Dark header ✓ 5730├────────────────┤ 5731│ Team Meeting │ ← Dark bg ✓ 5732│ 2:00 PM │ Light text ✓ 5733└────────────────┘ 5734 5735Perfectly matches wiki! 5736``` 5737 5738### CSS Variables Used 5739 5740**Wiki Default theme now uses**: 5741- `--__background__` - Main background (panel body) 5742- `--__background_alt__` - Alternate bg (panel header, events) 5743- `--__text__` - Text color (header text) 5744- `--__border__` - Border color (panel border, event borders) 5745 5746**With fallbacks**: 5747```css 5748var(--__background__, #fff) /* white fallback */ 5749var(--__background_alt__, #e8e8e8) /* light gray fallback */ 5750var(--__text__, #333) /* dark text fallback */ 5751var(--__border__, #ccc) /* gray border fallback */ 5752``` 5753 5754### Perfect Adaptation 5755 5756**Light Templates**: 5757- Light panel backgrounds ✓ 5758- Dark text ✓ 5759- Subtle borders ✓ 5760- Clean appearance ✓ 5761 5762**Dark Templates**: 5763- Dark panel backgrounds ✓ 5764- Light text ✓ 5765- Visible borders ✓ 5766- Perfect contrast ✓ 5767 5768**Custom Templates**: 5769- Uses template's CSS variables ✓ 5770- Automatic adaptation ✓ 5771- Seamless integration ✓ 5772 5773### Now Truly Adaptive 5774 5775Wiki Default theme now properly uses DokuWiki CSS variables for: 5776- ✅ Calendar grid 5777- ✅ Sidebar widget 5778- ✅ Event list 5779- ✅ **Day panel** ← v5.0.2! 5780- ✅ All backgrounds 5781- ✅ All text 5782- ✅ All borders 5783 5784**Complete wiki integration!** 5785 5786## Version 5.0.1 (2026-02-08) - THEME CONFLICT TOOLTIPS 5787 5788### Enhanced: Time Conflict Tooltips Now Themed 5789- **Fixed:** Conflict tooltips now match calendar theme 5790- **Added:** Theme-aware background, border, text colors 5791- **Added:** Theme-aware shadow effects 5792- **Result:** Complete visual consistency! 5793 5794### Tooltip Theming 5795 5796**Now uses theme colors for**: 5797- Background: Theme background color 5798- Border: Theme border color 5799- Header text: Theme primary text color 5800- Item text: Theme dim text color 5801- Shadow: Theme shadow color 5802 5803### Before vs After 5804 5805**Before (v5.0.0)**: 5806``` 5807Hover ⚠️ badge: 5808┌─────────────────┐ 5809│ ⚠️ Time Conflicts│ ← Default colors 5810│ • Event A │ 5811│ • Event B │ 5812└─────────────────┘ 5813``` 5814 5815**After (v5.0.1)**: 5816``` 5817Matrix Theme: 5818┌─────────────────┐ 5819│ ⚠️ Time Conflicts│ ← Green header 5820│ • Event A │ ← Green text 5821│ • Event B │ Dark green bg 5822└─────────────────┘ 5823 5824Purple Theme: 5825┌─────────────────┐ 5826│ ⚠️ Time Conflicts│ ← Purple header 5827│ • Event A │ ← Purple text 5828│ • Event B │ Dark purple bg 5829└─────────────────┘ 5830 5831Professional Theme: 5832┌─────────────────┐ 5833│ ⚠️ Time Conflicts│ ← Blue header 5834│ • Event A │ ← Dark text 5835│ • Event B │ Light bg 5836└─────────────────┘ 5837 5838Pink Theme: 5839┌─────────────────┐ 5840│ ⚠️ Time Conflicts│ ← Pink header ✨ 5841│ • Event A │ ← Pink text 5842│ • Event B │ Dark pink bg 5843└─────────────────┘ 5844 5845Wiki Default: 5846┌─────────────────┐ 5847│ ⚠️ Time Conflicts│ ← Adapts to wiki 5848│ • Event A │ ← Wiki colors 5849│ • Event B │ 5850└─────────────────┘ 5851``` 5852 5853### Now 100% Complete 5854 5855**Every tooltip themed**: 5856- ✅ Conflict tooltips 5857- ✅ All other tooltips (if any) 5858- ✅ Perfect consistency 5859 5860**Absolute perfection!** ✨ 5861 5862## Version 5.0.0 (2026-02-08) - MAJOR RELEASE: COMPLETE THEMING PERFECTION 5863 5864### Major Milestone: Version 5.0 5865 5866This 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. 5867 5868### Complete Feature Set 5869 5870**5 Beautiful Themes**: 5871- Matrix Edition (Green with glow) 5872- Purple Dream (Elegant purple) 5873- Professional Blue (Clean and modern) 5874- Pink Bling (Maximum sparkle) 5875- Wiki Default (Auto-adapts to your DokuWiki theme) 5876 5877**100% Theme Coverage**: 5878- ✅ Calendar grid and cells 5879- ✅ Event boxes and borders 5880- ✅ Sidebar widget 5881- ✅ Event list panel 5882- ✅ Search functionality 5883- ✅ Edit/Add dialogs (complete) 5884- ✅ Day popup dialogs 5885- ✅ Month picker 5886- ✅ All text (primary, dim, bright) 5887- ✅ All buttons 5888- ✅ All inputs and forms 5889- ✅ All checkboxes 5890- ✅ All borders 5891- ✅ All badges and labels 5892- ✅ Event highlight effects 5893 5894**Perfect Visual Consistency**: 5895- No white pixels anywhere 5896- No unthemed elements 5897- No default colors 5898- Complete visual unity 5899 5900### Major Improvements in v5.0 5901 59021. **Complete Dialog Theming** (v4.8.5-4.8.7) 5903 - Edit event dialog fully themed 5904 - Day popup dialog fully themed 5905 - All form inputs themed 5906 - All checkboxes themed 5907 - All buttons themed 5908 59092. **Event Box Border Perfection** (v4.8.6) 5910 - All 4 borders themed (top, right, bottom, left) 5911 - Sidebar event dividers themed 5912 - Past Events toggle border themed 5913 59143. **Checkbox Field Borders** (v4.9.0) 5915 - Repeating Event section border themed 5916 - Task checkbox section border themed 5917 59184. **Wiki Default Theme** (v4.10.0) 5919 - New 5th theme 5920 - Uses DokuWiki CSS variables 5921 - Auto-adapts to any wiki template 5922 - Perfect for seamless integration 5923 59245. **Clean Text Appearance** (v4.11.0) 5925 - Removed text glow from Matrix 5926 - Removed text glow from Purple 5927 - Removed text glow from Professional 5928 - Removed text glow from Wiki Default 5929 - Kept text glow on Pink Bling only 5930 59316. **Event Highlight Effects** (v4.12.0-4.12.1) 5932 - Theme-aware highlight glow 5933 - Click event bar → event glows 5934 - 3-second themed glow effect 5935 - Smooth animations 5936 5937### See RELEASE_NOTES.md for Complete Details 5938 5939For a comprehensive overview of all features, themes, and improvements, see the new **RELEASE_NOTES.md** file included in this release. 5940 5941## Version 4.12.1 (2026-02-08) - FIX EVENT HIGHLIGHT FUNCTION 5942 5943### Fixed: Event Highlight Now Working 5944- **Fixed:** Used setProperty() to properly apply !important styles 5945- **Added:** Console logging for debugging 5946- **Fixed:** Proper style application with important flag 5947- **Result:** Highlight glow now works correctly! 5948 5949### Technical Fix 5950 5951**Before (not working)**: 5952```javascript 5953eventItem.style.background = color + ' !important'; // Doesn't work 5954``` 5955 5956**After (working)**: 5957```javascript 5958eventItem.style.setProperty('background', color, 'important'); // Works! 5959``` 5960 5961### Added Debug Logging 5962 5963Console now shows: 5964- "Highlighting event: [calId] [eventId] [date]" 5965- "Found event item: [element]" 5966- "Theme: [theme name]" 5967- "Highlight colors: [bg] [shadow]" 5968- "Applied highlight styles" 5969- "Removing highlight" (after 3 seconds) 5970 5971### Now Working 5972 5973Click any event bar → Event glows with theme colors ✓ 5974 5975## Version 4.12.0 (2026-02-08) - THEME-AWARE EVENT HIGHLIGHT GLOW 5976 5977### ✨ Enhanced: Event Click Highlight Now Theme-Aware 5978- **Fixed:** Restored event highlight glow when clicking calendar bars 5979- **Improved:** Highlight now matches each theme's colors 5980- **Added:** Stronger glow effect for better visibility 5981- **Duration:** 3 seconds with smooth fade 5982- **Result:** Beautiful themed highlights for all themes! 5983 5984### How It Works 5985 5986When you click an event bar in the calendar, the corresponding event in the event list now highlights with a themed glow: 5987 5988**Matrix Theme**: 5989```javascript 5990Background: Darker green (#1a3d1a) 5991Glow: Double green glow (0 0 20px + 0 0 40px) 5992Color: rgba(0, 204, 7, 0.8) 5993``` 5994 5995**Purple Theme**: 5996```javascript 5997Background: Darker purple (#3d2b4d) 5998Glow: Double purple glow 5999Color: rgba(155, 89, 182, 0.8) 6000``` 6001 6002**Professional Theme**: 6003```javascript 6004Background: Light blue (#e3f2fd) 6005Glow: Single blue glow 6006Color: rgba(74, 144, 226, 0.4) 6007``` 6008 6009**Pink Theme**: 6010```javascript 6011Background: Darker pink (#3d2030) 6012Glow: Double pink glow ✨ 6013Color: rgba(255, 20, 147, 0.8) 6014``` 6015 6016**Wiki Theme**: 6017```javascript 6018Background: var(--__background_neu__) 6019Glow: Blue glow (adapts to wiki) 6020Color: rgba(43, 115, 183, 0.4) 6021``` 6022 6023### Visual Examples 6024 6025**Matrix - Click Event**: 6026``` 6027Calendar: 6028┌─────────────┐ 6029│ 2:00 PM │ ← Click this bar 6030└─────────────┘ 6031 6032Event List: 6033╔═════════════════════╗ 6034║ Team Meeting ║ ← GLOWS GREEN 6035║ 2:00 PM ║ for 3 seconds 6036╚═════════════════════╝ 6037 ↑↑↑ Strong green glow ↑↑↑ 6038``` 6039 6040**Purple - Click Event**: 6041``` 6042Calendar: 6043┌─────────────┐ 6044│ 4:00 PM │ ← Click 6045└─────────────┘ 6046 6047Event List: 6048╔═════════════════════╗ 6049║ Code Review ║ ← GLOWS PURPLE 6050║ 4:00 PM ║ for 3 seconds 6051╚═════════════════════╝ 6052 ↑↑↑ Strong purple glow ↑↑↑ 6053``` 6054 6055**Pink - Click Event**: 6056``` 6057Calendar: 6058┌─────────────┐ 6059│ 1:00 PM │ ← Click 6060└─────────────┘ 6061 6062Event List: 6063╔═════════════════════╗ 6064║ Lunch Date ║ ← GLOWS PINK 6065║ 1:00 PM ✨ ║ for 3 seconds 6066╚═════════════════════╝ 6067 ↑↑↑ MAXIMUM SPARKLE ↑↑↑ 6068``` 6069 6070### Glow Specifications 6071 6072**Matrix**: 6073- Background: Dark green 6074- Shadow: `0 0 20px rgba(0, 204, 7, 0.8)` 6075- Outer glow: `0 0 40px rgba(0, 204, 7, 0.4)` 6076- Effect: Strong green pulse 6077 6078**Purple**: 6079- Background: Dark purple 6080- Shadow: `0 0 20px rgba(155, 89, 182, 0.8)` 6081- Outer glow: `0 0 40px rgba(155, 89, 182, 0.4)` 6082- Effect: Strong purple pulse 6083 6084**Professional**: 6085- Background: Light blue 6086- Shadow: `0 0 20px rgba(74, 144, 226, 0.4)` 6087- Effect: Subtle blue glow 6088 6089**Pink**: 6090- Background: Dark pink 6091- Shadow: `0 0 20px rgba(255, 20, 147, 0.8)` 6092- Outer glow: `0 0 40px rgba(255, 20, 147, 0.4)` 6093- Effect: MAXIMUM SPARKLE ✨ 6094 6095**Wiki**: 6096- Background: Theme neutral color 6097- Shadow: `0 0 20px rgba(43, 115, 183, 0.4)` 6098- Effect: Adapts to wiki theme 6099 6100### User Experience 6101 6102**Click event bar** → Event highlights with themed glow 6103**Auto-scroll** → Event scrolls into view smoothly 6104**3 second glow** → Fade out after 3 seconds 6105**Smooth transition** → 0.3s ease-in-out 6106 6107### Perfect for Finding Events 6108 6109**Large event lists**: Quickly locate the clicked event ✓ 6110**Visual feedback**: Know which event you clicked ✓ 6111**Theme consistency**: Matches your chosen theme ✓ 6112**Smooth animation**: Professional appearance ✓ 6113 6114### All Themes Covered 6115 6116- ✅ Matrix: Green glow 6117- ✅ Purple: Purple glow 6118- ✅ Professional: Blue glow 6119- ✅ Pink: Maximum pink sparkle 6120- ✅ Wiki: Adaptive glow 6121 6122**Click any event bar and watch it glow!** ✨ 6123 6124## Version 4.11.0 (2026-02-08) - REMOVE TEXT GLOW FROM NON-PINK THEMES 6125 6126### Changed: Text Glow Now Pink-Only 6127- **Removed:** Text shadow/glow from Matrix theme 6128- **Removed:** Text shadow/glow from Purple theme 6129- **Removed:** Text shadow/glow from Professional theme (already had none) 6130- **Removed:** Text shadow/glow from Wiki Default theme 6131- **Kept:** Text shadow/glow ONLY on Pink Bling theme 6132- **Result:** Cleaner look for Matrix, Purple, and Wiki themes! 6133 6134### All Changes 6135 6136**Before (Matrix, Purple)**: 6137```css 6138text-shadow: 0 0 2px $text_color; /* Glow effect */ 6139``` 6140 6141**After (Matrix, Purple, Professional, Wiki)**: 6142```css 6143text-shadow: none; /* Clean, no glow */ 6144``` 6145 6146**Pink Bling (unchanged)**: 6147```css 6148text-shadow: 0 0 2px $text_color; /* Still has glow ✨ */ 6149``` 6150 6151### Text Shadow Removed From 6152 6153**Sidebar day numbers**: No glow ✓ 6154**Event titles**: No glow ✓ 6155**Event dates**: No glow ✓ 6156**Add Event button**: No glow ✓ 6157**Day popup events**: No glow ✓ 6158 6159### Before vs After 6160 6161**BEFORE (Matrix)**: 6162``` 6163Event Title ✨ ← Glowing green text 61642:00 PM ✨ ← Glowing text 6165``` 6166 6167**AFTER (Matrix)**: 6168``` 6169Event Title ← Clean green text 61702:00 PM ← Clean text 6171``` 6172 6173**Pink Bling (Still Glows)**: 6174``` 6175Event Title ✨ ← Still glowing! 61762:00 PM ✨ ← Maximum sparkle! 6177``` 6178 6179### Theme Appearances 6180 6181** Matrix Edition**: 6182- Clean green text 6183- No glow effects 6184- Professional appearance 6185- Still has border glow 6186 6187** Purple Dream**: 6188- Clean purple text 6189- No glow effects 6190- Elegant appearance 6191- Still has border glow 6192 6193** Professional Blue**: 6194- Clean text (unchanged) 6195- No glow effects 6196- Modern appearance 6197 6198** Pink Bling**: 6199- Glowing pink text ✨ 6200- Maximum glow effects 6201- Sparkle everywhere! 6202- All the bling! 6203 6204** Wiki Default**: 6205- Clean text 6206- No glow effects 6207- Matches wiki theme 6208 6209### Glow Effects Remaining 6210 6211**Border/box glow**: Still present on all themes ✓ 6212**Pink text glow**: Only on Pink Bling ✓ 6213**Shadow effects**: Still on buttons/boxes ✓ 6214 6215**Only TEXT glow removed from non-pink themes!** 6216 6217### Result 6218 6219**Cleaner, more professional look** for: 6220- Matrix ✓ 6221- Purple ✓ 6222- Professional ✓ 6223- Wiki Default ✓ 6224 6225**Maximum sparkle** for: 6226- Pink Bling ✨✓ 6227 6228**Best of both worlds!** 6229 6230## Version 4.10.0 (2026-02-08) - NEW WIKI DEFAULT THEME 6231 6232### New: Wiki Default Theme 6233- **Added:** 5th theme that automatically matches your DokuWiki template 6234- **Uses:** CSS variables from your wiki theme 6235- **Adapts:** Automatically works with light and dark themes 6236- **Perfect:** Seamless integration with any DokuWiki template 6237 6238### How It Works 6239 6240**Wiki theme uses DokuWiki CSS variables**: 6241```css 6242bg: var(--__background_site__, #f5f5f5) 6243border: var(--__border__, #ccc) 6244text_primary: var(--__text__, #333) 6245text_bright: var(--__link__, #2b73b7) 6246text_dim: var(--__text_neu__, #666) 6247cell_bg: var(--__background__, #fff) 6248grid_border: var(--__border__, #ccc) 6249``` 6250 6251**With fallbacks for older DokuWiki versions**: 6252- If CSS variables exist → Use them ✓ 6253- If not available → Use fallback values ✓ 6254 6255### All 5 Themes 6256 6257**1. Matrix Edition** (Default) 6258- Dark green with neon glow 6259- Matrix-style effects 6260- Original theme 6261 6262**2. Purple Dream** 6263- Rich purple with violet accents 6264- Elegant and sophisticated 6265- Soft glow effects 6266 6267**3. Professional Blue** 6268- Clean blue and grey 6269- Modern professional 6270- No glow effects 6271 6272**4. Pink Bling** 6273- Glamorous hot pink 6274- Maximum sparkle ✨ 6275- Hearts and diamonds 6276 6277**5. Wiki Default** ← NEW! 6278- Matches your wiki template 6279- Auto-adapts to light/dark 6280- Perfect integration 6281 6282### Examples 6283 6284**Light Wiki Template**: 6285``` 6286Wiki Default theme shows: 6287- Light backgrounds (#f5f5f5) 6288- Dark text (#333) 6289- Light inputs (#fff) 6290- Gray borders (#ccc) 6291 6292Matches perfectly! ✓ 6293``` 6294 6295**Dark Wiki Template**: 6296``` 6297Wiki Default theme shows: 6298- Dark backgrounds (from template) 6299- Light text (from template) 6300- Dark inputs (from template) 6301- Dark borders (from template) 6302 6303Matches perfectly! ✓ 6304``` 6305 6306**Bootstrap Template**: 6307``` 6308Uses Bootstrap's colors 6309Matches perfectly! ✓ 6310``` 6311 6312**Material Template**: 6313``` 6314Uses Material's colors 6315Matches perfectly! ✓ 6316``` 6317 6318### CSS Variables Used 6319 6320**DokuWiki provides**: 6321- `--__background_site__`: Page background 6322- `--__background_alt__`: Section backgrounds 6323- `--__background__`: Content backgrounds 6324- `--__text__`: Primary text color 6325- `--__link__`: Link color 6326- `--__text_neu__`: Dimmed text 6327- `--__border__`: Border color 6328- `--__background_neu__`: Neutral background 6329 6330**All with fallbacks**: 6331```css 6332var(--__background_site__, #f5f5f5) 6333/* Falls back to light gray if variable doesn't exist */ 6334``` 6335 6336### Perfect for Every Template 6337 6338**Custom templates**: Automatically adapts ✓ 6339**Light themes**: Perfect match ✓ 6340**Dark themes**: Perfect match ✓ 6341**Any DokuWiki version**: Works with fallbacks ✓ 6342 6343### Complete Theme Collection 6344 6345Now with **5 gorgeous themes**: 6346- 3 dark themes (Matrix, Purple, Pink) 6347- 1 light theme (Professional) 6348- 1 adaptive theme (Wiki Default) ← NEW! 6349 6350**Something for everyone!** 6351 6352## Version 4.9.0 (2026-02-08) - FIX CHECKBOX FIELD BORDERS 6353 6354### Fixed: Checkbox Field Borders Themed 6355- **Fixed:** Added border-color to checkbox field divs 6356- **Fixed:** Repeating Event section border 6357- **Fixed:** Task checkbox section border 6358- **Result:** No white borders around checkboxes! 6359 6360### Changes 6361 6362**Checkbox Field Border Styling**: 6363 6364**Before**: 6365```html 6366<div class="form-field-checkbox" 6367 style="background: $bg !important;"> 6368<!-- Border shows white ✗ --> 6369``` 6370 6371**After**: 6372```php 6373<div class="form-field-checkbox" 6374 style="background: $bg !important; 6375 border-color: $grid_border !important;"> 6376<!-- Border themed ✓ --> 6377``` 6378 6379### Before vs After 6380 6381**BEFORE (v4.8.8)**: 6382``` 6383Edit Dialog: 6384┌──────────────────┐ 6385│ ☑ Repeating ║│ ← White border ✗ 6386└──────────────────┘ 6387┌──────────────────┐ 6388│ ☑ Task checkbox ║│ ← White border ✗ 6389└──────────────────┘ 6390``` 6391 6392**AFTER (v4.9.0)**: 6393``` 6394Matrix Edit Dialog: 6395┌──────────────────┐ 6396│ ☑ Repeating │ ← Green border ✓ 6397└──────────────────┘ 6398┌──────────────────┐ 6399│ ☑ Task checkbox │ ← Green border ✓ 6400└──────────────────┘ 6401``` 6402 6403### ABSOLUTE PERFECTION ACHIEVED 6404 6405**Every element themed**: 6406- ✅ All inputs 6407- ✅ All labels 6408- ✅ All sections 6409- ✅ **Checkbox field borders** ← v4.9.0! 6410- ✅ All buttons 6411- ✅ All checkboxes 6412- ✅ No white anywhere 6413 6414**100% COMPLETE!** ✨ 6415 6416## Version 4.8.8 (2026-02-08) - FINAL FIXES: CHECKBOXES, BORDERS, BACKGROUNDS 6417 6418### Fixed: Checkbox Field Borders Themed 6419- **Fixed:** Added border-color to checkbox field divs 6420- **Fixed:** Repeating Event section border 6421- **Fixed:** Task checkbox section border 6422- **Result:** No white borders around checkboxes! 6423 6424### Fixed: Admin Sections Respect Wiki Theme 6425- **Fixed:** All admin backgrounds use CSS variables 6426- **Fixed:** Text colors use wiki text color 6427- **Fixed:** Borders use wiki border color 6428- **Result:** Admin matches wiki theme perfectly! 6429 6430### All Changes 6431 6432**1. Checkbox Field Border Styling**: 6433 6434**Before**: 6435```html 6436<div class="form-field-checkbox" 6437 style="background: $bg !important;"> 6438<!-- Border shows white ✗ --> 6439``` 6440 6441**After**: 6442```php 6443<div class="form-field-checkbox" 6444 style="background: $bg !important; 6445 border-color: $grid_border !important;"> 6446<!-- Border themed ✓ --> 6447``` 6448 6449**2. Admin CSS Variables**: 6450 6451**Added CSS variables for wiki theme compatibility**: 6452```css 6453.calendar-admin-wrapper { 6454 background: var(--__background_site__, #f5f5f5); 6455 color: var(--__text__, #333); 6456} 6457.calendar-admin-section { 6458 background: var(--__background_alt__, #fafafa); 6459} 6460.calendar-admin-input { 6461 background: var(--__background__, #fff); 6462 color: var(--__text__, #333); 6463} 6464``` 6465 6466**Replaced hardcoded colors**: 6467```php 6468// Before: 6469background: #f9f9f9 6470background: white 6471color: #333 6472border: 1px solid #ddd 6473 6474// After: 6475background: var(--__background_alt__, #f9f9f9) 6476background: var(--__background__, #fff) 6477color: var(--__text__, #333) 6478border: 1px solid var(--__border__, #ddd) 6479``` 6480 6481### Before vs After 6482 6483**BEFORE (v4.8.8)**: 6484``` 6485Edit Dialog: 6486┌──────────────────┐ 6487│ ☑ Repeating ║│ ← White border ✗ 6488└──────────────────┘ 6489┌──────────────────┐ 6490│ ☑ Task checkbox ║│ ← White border ✗ 6491└──────────────────┘ 6492 6493Admin Page (Dark Wiki Theme): 6494┌──────────────────┐ 6495│ Light sections │ ← White boxes ✗ 6496│ Light inputs │ ← Doesn't match ✗ 6497└──────────────────┘ 6498``` 6499 6500**AFTER (v4.8.9)**: 6501``` 6502Matrix Edit Dialog: 6503┌──────────────────┐ 6504│ ☑ Repeating │ ← Green border ✓ 6505└──────────────────┘ 6506┌──────────────────┐ 6507│ ☑ Task checkbox │ ← Green border ✓ 6508└──────────────────┘ 6509 6510Admin (Dark Wiki Theme): 6511┌──────────────────┐ 6512│ Dark sections │ ← Matches wiki ✓ 6513│ Dark inputs │ ← Perfect match ✓ 6514└──────────────────┘ 6515``` 6516 6517### Admin Theme Examples 6518 6519**Light Wiki Theme**: 6520``` 6521Admin page backgrounds: Light 6522Section boxes: Light gray 6523Inputs: White 6524Borders: Gray 6525Text: Dark 6526 6527Perfect match! ✓ 6528``` 6529 6530**Dark Wiki Theme**: 6531``` 6532Admin page backgrounds: Dark 6533Section boxes: Darker gray 6534Inputs: Dark 6535Borders: Dark gray 6536Text: Light 6537 6538Perfect match! ✓ 6539``` 6540 6541**DokuWiki Default**: 6542``` 6543Uses wiki's CSS variables 6544Automatically adapts 6545Always matches! ✓ 6546``` 6547 6548### Complete Coverage 6549 6550**Edit Dialog**: 6551- ✅ All inputs themed 6552- ✅ All labels themed 6553- ✅ All sections themed 6554- ✅ **Checkbox borders** ← v4.8.9! 6555- ✅ All buttons themed 6556- ✅ No white anywhere 6557 6558**Admin Interface**: 6559- ✅ **Tab navigation** ← v4.8.9! 6560- ✅ **Section boxes** ← v4.8.9! 6561- ✅ **Input fields** ← v4.8.9! 6562- ✅ **Text colors** ← v4.8.9! 6563- ✅ **Borders** ← v4.8.9! 6564- ✅ All tabs (Manage, Update, Outlook, Themes) 6565 6566### CSS Variables Used 6567 6568**DokuWiki provides these**: 6569- `--__background_site__`: Page background 6570- `--__background_alt__`: Alternate background 6571- `--__background__`: Primary background (inputs) 6572- `--__text__`: Text color 6573- `--__border__`: Border color 6574 6575**Fallbacks provided for older DokuWiki**: 6576```css 6577var(--__background_site__, #f5f5f5) 6578var(--__background_alt__, #fafafa) 6579var(--__background__, #fff) 6580var(--__text__, #333) 6581var(--__border__, #ddd) 6582``` 6583 6584### Perfect Adaptation 6585 6586**Admin now adapts to ANY wiki theme**: 6587- Light themes → Light admin ✓ 6588- Dark themes → Dark admin ✓ 6589- Custom themes → Matches perfectly ✓ 6590- No hardcoded colors ✓ 6591 6592**Calendar themes still work**: 6593- Matrix, Purple, Professional, Pink ✓ 6594- Independent from wiki theme ✓ 6595- Admin respects wiki ✓ 6596- Calendar respects calendar theme ✓ 6597 6598### FINAL PERFECTION 6599 6600**Frontend (Calendar)**: 6601- Complete theming ✓ 6602- 4 beautiful themes ✓ 6603- Every pixel themed ✓ 6604 6605**Backend (Admin)**: 6606- Respects wiki theme ✓ 6607- Works with any theme ✓ 6608- Perfect compatibility ✓ 6609 6610**ABSOLUTELY EVERYTHING THEMED!** ✨ 6611 6612## Version 4.8.8 (2026-02-08) - FINAL FIXES: CHECKBOXES, BORDERS, BACKGROUNDS 6613 6614### Fixed: Task Checkboxes Now Fully Themed 6615- **Fixed:** Added background-color and border inline 6616- **Fixed:** Both PHP and JavaScript versions 6617- **Result:** No white checkboxes! 6618 6619### Fixed: Past Events Toggle Border 6620- **Fixed:** Added !important to border styling 6621- **Fixed:** Explicit top and bottom borders 6622- **Result:** No white line under toggle! 6623 6624### Fixed: Form Field Section Backgrounds 6625- **Fixed:** All form-field and form-row-group backgrounds 6626- **Fixed:** Every section in edit dialog 6627- **Result:** No white sections anywhere! 6628 6629### All Changes 6630 6631**1. Task Checkbox Styling**: 6632 6633**Before**: 6634```php 6635style="accent-color: $border !important;" 6636<!-- Only accent, background still white ✗ --> 6637``` 6638 6639**After**: 6640```php 6641style="accent-color: $border !important; 6642 background-color: $cell_bg !important; 6643 border: 2px solid $grid_border !important;" 6644<!-- Full theming ✓ --> 6645``` 6646 6647**2. Past Events Toggle Border**: 6648 6649**Before**: 6650```php 6651style="border-color: $grid_border;" 6652<!-- No !important, CSS overrides ✗ --> 6653``` 6654 6655**After**: 6656```php 6657style="border-color: $grid_border !important; 6658 border-top: 1px solid $grid_border !important; 6659 border-bottom: 1px solid $grid_border !important;" 6660<!-- Cannot be overridden ✓ --> 6661``` 6662 6663**3. Form Field Backgrounds**: 6664 6665**Before**: 6666```html 6667<div class="form-field"> 6668<div class="form-row-group"> 6669<!-- No background, shows white ✗ --> 6670``` 6671 6672**After**: 6673```php 6674<div class="form-field" style="background: $bg !important;"> 6675<div class="form-row-group" style="background: $bg !important;"> 6676<!-- Fully themed ✓ --> 6677``` 6678 6679### Before vs After 6680 6681**BEFORE (v4.8.7)**: 6682``` 6683Event: 6684□ Task checkbox ← White checkbox ✗ 6685 6686Past Events 6687▶ Past Events (3) ← White line below ✗ 6688───────────────── 6689 6690Edit Dialog: 6691┌──────────────┐ 6692│ Form fields │ ← White sections ✗ 6693└──────────────┘ 6694``` 6695 6696**AFTER (v4.8.8)**: 6697``` 6698Matrix Event: 6699☑ Task checkbox ← Green checkbox ✓ 6700 6701Past Events 6702▶ Past Events (3) ← Green border ✓ 6703───────────────── 6704 6705Matrix Edit Dialog: 6706┌──────────────┐ 6707│ Form fields │ ← Dark green ✓ 6708└──────────────┘ 6709``` 6710 6711### Complete Examples 6712 6713**Matrix Theme**: 6714``` 6715Task Checkbox: 6716☑ Checked → Green checkmark, green bg 6717☐ Unchecked → Green border, dark green bg ✓ 6718 6719Past Events Toggle: 6720▶ Past Events (3) 6721─────────────────── Green border ✓ 6722 6723Edit Dialog: 6724All sections dark green ✓ 6725No white anywhere ✓ 6726``` 6727 6728**Purple Theme**: 6729``` 6730Task Checkbox: 6731☑ Checked → Purple checkmark, purple bg 6732☐ Unchecked → Purple border, dark purple bg ✓ 6733 6734Past Events Toggle: 6735▶ Past Events (3) 6736─────────────────── Purple border ✓ 6737 6738Edit Dialog: 6739All sections dark purple ✓ 6740``` 6741 6742**Professional Theme**: 6743``` 6744Task Checkbox: 6745☑ Checked → Blue checkmark, white bg 6746☐ Unchecked → Gray border, white bg ✓ 6747 6748Past Events Toggle: 6749▶ Past Events (3) 6750─────────────────── Gray border ✓ 6751 6752Edit Dialog: 6753All sections light ✓ 6754``` 6755 6756**Pink Theme**: 6757``` 6758Task Checkbox: 6759☑ Checked → Pink checkmark, pink bg ✨ 6760☐ Unchecked → Pink border, dark pink bg ✓ 6761 6762Past Events Toggle: 6763▶ Past Events (3) 6764─────────────────── Pink border 6765 6766Edit Dialog: 6767All sections dark pink ✓ 6768``` 6769 6770### Checkbox Visual 6771 6772**Matrix - Unchecked**: 6773``` 6774┌─────┐ 6775│ │ ← Dark green background 6776│ │ Green border 6777└─────┘ 6778``` 6779 6780**Matrix - Checked**: 6781``` 6782┌─────┐ 6783│ ✓ │ ← Dark green background 6784│ │ Green checkmark 6785└─────┘ 6786``` 6787 6788### Past Events Border 6789 6790**Before**: 6791``` 6792▶ Past Events (3) 6793─────────────────── White line ✗ 6794``` 6795 6796**After**: 6797``` 6798▶ Past Events (3) 6799─────────────────── Green line ✓ (Matrix) 6800 Purple line ✓ (Purple) 6801 Gray line ✓ (Professional) 6802 Pink line ✓ (Pink) 6803``` 6804 6805### Form Field Coverage 6806 6807**All sections themed**: 6808- ✅ Title field 6809- ✅ Namespace field 6810- ✅ Description field 6811- ✅ **Date row** ← v4.8.8! 6812- ✅ **Checkbox sections** ← v4.8.8! 6813- ✅ **Recurring options** ← v4.8.8! 6814- ✅ **Time row** ← v4.8.8! 6815- ✅ **Color row** ← v4.8.8! 6816- ✅ Button footer 6817 6818**Every div has background!** ✓ 6819 6820### ABSOLUTE PERFECTION 6821 6822**Not a single white pixel**: 6823- ✅ No white checkboxes 6824- ✅ No white borders 6825- ✅ No white backgrounds 6826- ✅ No white sections 6827- ✅ No white lines 6828- ✅ No white anything 6829 6830**100% PERFECT THEMING!** ✨ 6831 6832## Version 4.8.7 (2026-02-08) - COMPLETE DIALOG & POPUP THEMING 6833 6834### Fixed: Checkbox Section Backgrounds Themed 6835- **Fixed:** Repeating Event section background 6836- **Fixed:** Task checkbox section background 6837- **Result:** No white backgrounds in dialog! 6838 6839### Fixed: Unchecked Task Checkboxes Themed 6840- **Fixed:** Added CSS for checkbox backgrounds 6841- **Fixed:** Unchecked boxes show theme colors 6842- **Result:** No white checkboxes! 6843 6844### Fixed: Day Popup Dialog Fully Themed 6845- **Fixed:** Popup container, header, body themed 6846- **Fixed:** Event items in popup themed 6847- **Fixed:** Add Event button themed 6848- **Fixed:** Footer section themed 6849- **Result:** Perfect popup theming! 6850 6851### All Changes 6852 6853**1. Checkbox Section Backgrounds**: 6854 6855**Before**: 6856```html 6857<div class="form-field-checkbox"> 6858<!-- White background ✗ --> 6859``` 6860 6861**After**: 6862```php 6863<div class="form-field-checkbox" 6864 style="background: $bg !important;"> 6865<!-- Themed ✓ --> 6866``` 6867 6868**2. Checkbox Background CSS**: 6869 6870**Added to style block**: 6871```css 6872.task-checkbox { 6873 background-color: $cell_bg !important; 6874 border: 2px solid $grid_border !important; 6875} 6876``` 6877 6878**3. Day Popup Theming**: 6879 6880**Container**: 6881```javascript 6882style="background: $bg !important; 6883 border: 2px solid $border !important; 6884 box-shadow: 0 0 20px $shadow !important;" 6885``` 6886 6887**Header**: 6888```javascript 6889style="background: $header_bg !important; 6890 color: $text_primary !important; 6891 border-bottom: 1px solid $border !important;" 6892``` 6893 6894**Footer**: 6895```javascript 6896style="background: $bg !important; 6897 border-top: 1px solid $grid_border !important;" 6898``` 6899 6900**Add Event Button**: 6901```javascript 6902style="background: $border !important; 6903 color: $bg !important; 6904 border-color: $border !important;" 6905``` 6906 6907**Event Items**: 6908```javascript 6909style="background: $cell_bg !important; 6910 border: 1px solid $grid_border !important;" 6911``` 6912 6913### Before vs After 6914 6915**BEFORE (v4.8.6)**: 6916``` 6917Edit Dialog: 6918┌──────────────────┐ 6919│ ☑ Repeating Event│ ← White background ✗ 6920├──────────────────┤ 6921│ ☑ Task checkbox │ ← White background ✗ 6922└──────────────────┘ 6923 6924Day Popup: 6925┌──────────────────┐ 6926│ Monday, Feb 8 │ ← White ✗ 6927├──────────────────┤ 6928│ Team Meeting │ ← White ✗ 6929│ 2:00 PM │ 6930├──────────────────┤ 6931│ [+ Add Event] │ ← White ✗ 6932└──────────────────┘ 6933 6934Task checkbox: ☐ ← White ✗ 6935``` 6936 6937**AFTER (v4.8.7)**: 6938``` 6939Edit Dialog (Matrix): 6940┌──────────────────┐ 6941│ ☑ Repeating Event│ ← Dark green ✓ 6942├──────────────────┤ 6943│ ☑ Task checkbox │ ← Dark green ✓ 6944└──────────────────┘ 6945 6946Day Popup (Matrix): 6947┌──────────────────┐ 6948│ Monday, Feb 8 │ ← Dark green ✓ 6949├──────────────────┤ 6950│ Team Meeting │ ← Dark green ✓ 6951│ 2:00 PM │ 6952├──────────────────┤ 6953│ [+ Add Event] │ ← Green button ✓ 6954└──────────────────┘ 6955 6956Task checkbox: ☑ ← Green ✓ 6957``` 6958 6959### Complete Examples 6960 6961**Matrix Dialog**: 6962``` 6963┌──────────────────────────┐ 6964│ ✏️ Edit Event │ 6965├──────────────────────────┤ 6966│ Title: [_________] │ 6967│ Date: [__________] │ 6968│ │ 6969│ ☑ Repeating Event │ ← Dark green bg 6970├──────────────────────────┤ 6971│ ☑ Task checkbox │ ← Dark green bg 6972├──────────────────────────┤ 6973│ [Cancel] [ Save] │ 6974└──────────────────────────┘ 6975 6976All sections themed! ✓ 6977``` 6978 6979**Matrix Day Popup**: 6980``` 6981┌──────────────────────────┐ 6982│ Monday, February 8, 2026 │ ← Green header 6983├──────────────────────────┤ 6984│ ┌──────────────────────┐ │ 6985│ │ Team Meeting │ │ ← Dark green 6986│ │ 2:00 PM │ │ 6987│ └──────────────────────┘ │ 6988│ ┌──────────────────────┐ │ 6989│ │ Code Review │ │ ← Dark green 6990│ │ 4:00 PM │ │ 6991│ └──────────────────────┘ │ 6992├──────────────────────────┤ 6993│ [+ Add Event] │ ← Green button 6994└──────────────────────────┘ 6995``` 6996 6997**Purple Day Popup**: 6998``` 6999┌──────────────────────────┐ 7000│ Monday, February 8, 2026 │ ← Purple header 7001├──────────────────────────┤ 7002│ ┌──────────────────────┐ │ 7003│ │ Team Meeting │ │ ← Dark purple 7004│ │ 2:00 PM │ │ 7005│ └──────────────────────┘ │ 7006├──────────────────────────┤ 7007│ [+ Add Event] │ ← Purple button 7008└──────────────────────────┘ 7009``` 7010 7011**Professional Day Popup**: 7012``` 7013┌──────────────────────────┐ 7014│ Monday, February 8, 2026 │ ← Light header 7015├──────────────────────────┤ 7016│ ┌──────────────────────┐ │ 7017│ │ Team Meeting │ │ ← White 7018│ │ 2:00 PM │ │ 7019│ └──────────────────────┘ │ 7020├──────────────────────────┤ 7021│ [+ Add Event] │ ← Blue button 7022└──────────────────────────┘ 7023``` 7024 7025**Pink Day Popup**: 7026``` 7027┌──────────────────────────┐ 7028│ Monday, February 8, 2026 │ ← Pink header ✨ 7029├──────────────────────────┤ 7030│ ┌──────────────────────┐ │ 7031│ │ Team Meeting │ │ ← Dark pink 7032│ │ 2:00 PM │ │ 7033│ └──────────────────────┘ │ 7034├──────────────────────────┤ 7035│ [+ Add Event] │ ← Pink button 7036└──────────────────────────┘ 7037``` 7038 7039### Checkbox Theming 7040 7041**Unchecked boxes now themed**: 7042``` 7043Matrix: 7044☐ → Dark green bg, green border ✓ 7045 7046Purple: 7047☐ → Dark purple bg, purple border ✓ 7048 7049Professional: 7050☐ → White bg, gray border ✓ 7051 7052Pink: 7053☐ → Dark pink bg, pink border ✓ 7054``` 7055 7056### Complete Coverage 7057 7058**Edit Dialog - All Sections**: 7059- ✅ Header 7060- ✅ All inputs 7061- ✅ All labels 7062- ✅ **Checkbox sections** ← v4.8.7! 7063- ✅ Recurring options 7064- ✅ Button footer 7065- ✅ All checkboxes (checked & unchecked) 7066 7067**Day Popup - All Elements**: 7068- ✅ **Popup container** ← v4.8.7! 7069- ✅ **Header** ← v4.8.7! 7070- ✅ **Body** ← v4.8.7! 7071- ✅ **Event items** ← v4.8.7! 7072- ✅ **Namespace badges** ← v4.8.7! 7073- ✅ **Footer** ← v4.8.7! 7074- ✅ **Add Event button** ← v4.8.7! 7075- ✅ **No events message** ← v4.8.7! 7076 7077**Absolutely every dialog element themed!** ✨ 7078 7079### Perfect Theming Achievement 7080 7081**Every UI component in entire plugin**: 7082- ✅ Calendar grid 7083- ✅ Sidebar widget 7084- ✅ Event list 7085- ✅ Search bar 7086- ✅ Event boxes 7087- ✅ Edit dialog (complete) 7088- ✅ **Day popup** ← v4.8.7! 7089- ✅ Month picker 7090- ✅ All text 7091- ✅ All buttons 7092- ✅ All inputs 7093- ✅ **All checkboxes** ← v4.8.7! 7094- ✅ All borders 7095- ✅ All badges 7096- ✅ All backgrounds 7097 7098**NO WHITE ANYWHERE!** 7099 7100**100% COMPLETE THEMING ACHIEVED!** ✨ 7101 7102## Version 4.8.6 (2026-02-08) - FIX DIALOG SECTIONS & EVENT BOX BORDERS 7103 7104### Fixed: Dialog Checkbox Sections Themed 7105- **Fixed:** Recurring options section background themed 7106- **Fixed:** Section has themed border accent 7107- **Result:** No white sections in dialog! 7108 7109### Fixed: Dialog Button Section Themed 7110- **Fixed:** Button area background themed 7111- **Fixed:** Top border separator themed 7112- **Result:** Complete dialog theming! 7113 7114### Fixed: Event Box Borders Themed 7115- **Fixed:** Top, right, bottom borders now themed 7116- **Fixed:** Left border remains event color 7117- **Result:** Perfect event boxes! 7118 7119### All Changes 7120 7121**1. Recurring Options Section**: 7122 7123**Before**: 7124```html 7125<div class="recurring-options" style="display:none;"> 7126<!-- White background ✗ --> 7127``` 7128 7129**After**: 7130```php 7131<div class="recurring-options" 7132 style="display:none; 7133 background: $bg !important; 7134 padding: 8px; 7135 border-left: 2px solid $border; 7136 margin-left: 4px;"> 7137<!-- Themed with accent border ✓ --> 7138``` 7139 7140**2. Dialog Actions Section**: 7141 7142**Before**: 7143```html 7144<div class="dialog-actions-sleek"> 7145<!-- White background ✗ --> 7146``` 7147 7148**After**: 7149```php 7150<div class="dialog-actions-sleek" 7151 style="background: $bg !important; 7152 border-top: 1px solid $grid_border !important;"> 7153<!-- Themed with separator ✓ --> 7154``` 7155 7156**3. Event Box Borders**: 7157 7158**Before**: 7159```php 7160border-left-color: $event_color; 7161<!-- Only left border colored ✗ --> 7162``` 7163 7164**After**: 7165```php 7166border-left-color: $event_color; 7167border-top: 1px solid $grid_border !important; 7168border-right: 1px solid $grid_border !important; 7169border-bottom: 1px solid $grid_border !important; 7170<!-- All borders themed! ✓ --> 7171``` 7172 7173### Before vs After 7174 7175**BEFORE (v4.8.5)**: 7176``` 7177Dialog: 7178┌────────────────┐ 7179│ ☑ Repeating │ 7180├────────────────┤ ← White section ✗ 7181│ Repeat: Daily │ 7182│ Until: [____] │ 7183├────────────────┤ 7184│ [Cancel] [Save]│ ← White footer ✗ 7185└────────────────┘ 7186 7187Event Box: 7188┌────────────┐ 7189│Team Meeting│ ← White borders ✗ 7190│2:00 PM │ 7191└────────────┘ 7192``` 7193 7194**AFTER (v4.8.6)**: 7195``` 7196Matrix Dialog: 7197┌────────────────┐ 7198│ ☑ Repeating │ 7199├────────────────┤ ← Dark green ✓ 7200│ Repeat: Daily │ Green accent border 7201│ Until: [____] │ 7202├────────────────┤ 7203│ [Cancel] [Save]│ ← Dark green ✓ 7204└────────────────┘ 7205 7206Matrix Event Box: 7207┌────────────┐ 7208│Team Meeting│ ← Green borders ✓ 7209│2:00 PM │ 7210└────────────┘ 7211``` 7212 7213### Dialog Section Examples 7214 7215**Matrix Theme**: 7216``` 7217┌──────────────────────────┐ 7218│ ✏️ Edit Event │ 7219├──────────────────────────┤ 7220│ ☑ Repeating Event │ 7221├║─────────────────────────┤ Green accent 7222│║ Repeat Every: Daily │ Dark green bg 7223│║ Repeat Until: [_____] │ 7224└──────────────────────────┘ 7225 [Cancel] [ Save] ← Dark green bg 7226──────────────────────────── Green border 7227``` 7228 7229**Purple Theme**: 7230``` 7231┌──────────────────────────┐ 7232│ ☑ Repeating Event │ 7233├║─────────────────────────┤ Purple accent 7234│║ Repeat options... │ Dark purple bg 7235└──────────────────────────┘ 7236 [Cancel] [ Save] ← Dark purple bg 7237──────────────────────────── Purple border 7238``` 7239 7240**Professional Theme**: 7241``` 7242┌──────────────────────────┐ 7243│ ☑ Repeating Event │ 7244├║─────────────────────────┤ Blue accent 7245│║ Repeat options... │ Light bg 7246└──────────────────────────┘ 7247 [Cancel] [ Save] ← Light bg 7248──────────────────────────── Gray border 7249``` 7250 7251**Pink Theme**: 7252``` 7253┌──────────────────────────┐ 7254│ ☑ Repeating Event ✨ │ 7255├║─────────────────────────┤ Pink accent 7256│║ Repeat options... │ Dark pink bg 7257└──────────────────────────┘ 7258 [Cancel] [ Save] ← Dark pink bg 7259──────────────────────────── Pink border 7260``` 7261 7262### Event Box Border Visual 7263 7264**Before (v4.8.5)**: 7265``` 7266Left border only: 7267█ Team Meeting 7268█ 2:00 PM 7269█ [Edit] [Delete] 7270 7271Only event color on left ✗ 7272White on other 3 sides ✗ 7273``` 7274 7275**After (v4.8.6)**: 7276``` 7277All borders themed: 7278┌─────────────┐ 7279█Team Meeting │ ← Top: themed 7280█2:00 PM │ ← Right: themed 7281█[Edit][Del] │ ← Bottom: themed 7282└─────────────┘ 7283 7284Left: Event color ✓ 7285Other 3: Theme grid_border ✓ 7286``` 7287 7288### Matrix Event Box: 7289``` 7290┌─────────────┐ Green border 7291│Team Meeting │ 7292│2:00 PM │ 7293└─────────────┘ Green border 7294↑ 7295Green left bar 7296``` 7297 7298### Purple Event Box: 7299``` 7300┌─────────────┐ Purple border 7301│Team Meeting │ 7302│2:00 PM │ 7303└─────────────┘ Purple border 7304↑ 7305Purple left bar 7306``` 7307 7308### Professional Event Box: 7309``` 7310┌─────────────┐ Gray border 7311│Team Meeting │ 7312│2:00 PM │ 7313└─────────────┘ Gray border 7314↑ 7315Event color left bar 7316``` 7317 7318### Complete Dialog Coverage 7319 7320**All sections themed**: 7321- ✅ Dialog header 7322- ✅ Form inputs 7323- ✅ Checkbox labels 7324- ✅ **Recurring options** ← v4.8.6! 7325- ✅ **Button section** ← v4.8.6! 7326- ✅ All labels 7327- ✅ All buttons 7328 7329**No white sections!** ✓ 7330 7331### Complete Event Box Coverage 7332 7333**All borders themed**: 7334- ✅ Left border (event color) 7335- ✅ **Top border** ← v4.8.6! 7336- ✅ **Right border** ← v4.8.6! 7337- ✅ **Bottom border** ← v4.8.6! 7338- ✅ Background 7339- ✅ Text 7340 7341**Perfect box outline!** ✓ 7342 7343### Visual Perfection 7344 7345**Matrix theme event list**: 7346``` 7347┌─────────────┐ 7348│Team Meeting │ ← Green box 7349│2:00 PM │ 7350└─────────────┘ 7351┌─────────────┐ 7352│Code Review │ ← Green box 7353│4:00 PM │ 7354└─────────────┘ 7355 7356All borders green! ✓ 7357``` 7358 7359**ABSOLUTE PERFECT THEMING!** ✨ 7360 7361## Version 4.8.5 (2026-02-08) - THEME EVENT DIALOG & SIDEBAR BORDERS 7362 7363### Fixed: Event Dialog Fully Themed 7364- **Fixed:** Dialog background, header, inputs all themed 7365- **Fixed:** All labels, checkboxes, selects themed 7366- **Fixed:** Save and Cancel buttons themed 7367- **Result:** Dialog matches theme perfectly! 7368 7369### Fixed: Sidebar Event Borders Properly Themed 7370- **Fixed:** Event divider borders use grid_border color 7371- **Fixed:** Clean, subtle themed dividers 7372- **Result:** No more white borders in sidebar! 7373 7374### All Changes 7375 7376**1. Event Dialog Theming**: 7377 7378**Dialog container**: 7379```php 7380background: $themeStyles['bg'] !important; 7381border: 2px solid $themeStyles['border'] !important; 7382box-shadow: 0 0 20px $shadow !important; 7383``` 7384 7385**Dialog header**: 7386```php 7387background: $themeStyles['header_bg'] !important; 7388color: $themeStyles['text_primary'] !important; 7389border-bottom: 1px solid $border !important; 7390``` 7391 7392**All form inputs** (text, date, select, textarea): 7393```php 7394background: $themeStyles['cell_bg'] !important; 7395color: $themeStyles['text_primary'] !important; 7396border-color: $themeStyles['grid_border'] !important; 7397``` 7398 7399**All labels**: 7400```php 7401color: $themeStyles['text_primary'] !important; 7402``` 7403 7404**Checkboxes**: 7405```php 7406accent-color: $themeStyles['border'] !important; 7407``` 7408 7409**Buttons**: 7410```php 7411// Cancel button: 7412background: $cell_bg !important; 7413color: $text_primary !important; 7414 7415// Save button: 7416background: $border !important; 7417color: $bg !important; (or white for professional) 7418``` 7419 7420**2. Sidebar Event Borders**: 7421 7422**Before**: 7423```php 7424border-bottom: 1px solid rgba(0, 204, 7, 0.2); // Hardcoded 7425``` 7426 7427**After**: 7428```php 7429borderColor = $themeStyles['grid_border']; 7430border-bottom: 1px solid $borderColor !important; 7431``` 7432 7433### Before vs After 7434 7435**BEFORE (v4.8.4)**: 7436``` 7437Event Dialog: 7438┌────────────────┐ 7439│ Add Event │ ← White background ✗ 7440│ Title: [_____] │ ← White inputs ✗ 7441│ Date: [_____] │ 7442│ [Cancel] [Save]│ ← Default buttons ✗ 7443└────────────────┘ 7444 7445Sidebar Events: 7446Event 1 ──────── ← White border ✗ 7447Event 2 ──────── ← White border ✗ 7448``` 7449 7450**AFTER (v4.8.5)**: 7451``` 7452Event Dialog (Matrix): 7453┌────────────────┐ 7454│ Add Event │ ← Dark green background ✓ 7455│ Title: [_____] │ ← Dark green inputs ✓ 7456│ Date: [_____] │ ← Green text ✓ 7457│ [Cancel] [Save]│ ← Themed buttons ✓ 7458└────────────────┘ 7459 7460Sidebar Events (Matrix): 7461Event 1 ──────── ← Green border ✓ 7462Event 2 ──────── ← Green border ✓ 7463``` 7464 7465### Dialog Examples by Theme 7466 7467**Matrix Dialog**: 7468``` 7469┌──────────────────────────┐ 7470│ ✏️ Edit Event │ ← Dark green header 7471├──────────────────────────┤ 7472│ Title │ ← Green labels 7473│ [Team Meeting________] │ ← Dark green input 7474│ │ 7475│ Start Date │ 7476│ [2026-02-08__] │ ← Dark green input 7477│ │ 7478│ Start Time │ 7479│ [2:00 PM ▼] │ ← Green select 7480│ │ 7481│ ☑ Repeating Event │ ← Green checkbox 7482│ │ 7483│ [Cancel] [ Save] │ ← Themed buttons 7484└──────────────────────────┘ 7485 7486Everything green! ✓ 7487``` 7488 7489**Purple Dialog**: 7490``` 7491┌──────────────────────────┐ 7492│ ✏️ Edit Event │ ← Dark purple header 7493├──────────────────────────┤ 7494│ [Inputs_______________] │ ← Dark purple inputs 7495│ ☑ Checkboxes │ ← Purple accent 7496│ [Cancel] [ Save] │ ← Purple buttons 7497└──────────────────────────┘ 7498``` 7499 7500**Professional Dialog**: 7501``` 7502┌──────────────────────────┐ 7503│ ✏️ Edit Event │ ← Light gradient header 7504├──────────────────────────┤ 7505│ [Inputs_______________] │ ← White inputs 7506│ ☑ Checkboxes │ ← Blue accent 7507│ [Cancel] [ Save] │ ← Blue save button 7508└──────────────────────────┘ 7509``` 7510 7511**Pink Dialog**: 7512``` 7513┌──────────────────────────┐ 7514│ ✏️ Edit Event │ ← Dark pink header ✨ 7515├──────────────────────────┤ 7516│ [Inputs_______________] │ ← Dark pink inputs 7517│ ☑ Checkboxes │ ← Pink accent 7518│ [Cancel] [ Save] │ ← Pink buttons 7519└──────────────────────────┘ 7520``` 7521 7522### Complete Dialog Element Coverage 7523 7524**All form elements themed**: 7525- ✅ Dialog container 7526- ✅ Dialog header 7527- ✅ Close button (×) 7528- ✅ Title input 7529- ✅ Namespace search 7530- ✅ Namespace dropdown 7531- ✅ Description textarea 7532- ✅ Start date input 7533- ✅ End date input 7534- ✅ Recurring checkbox 7535- ✅ Recurrence type select 7536- ✅ Recurrence end date 7537- ✅ Start time select 7538- ✅ End time select 7539- ✅ Color select 7540- ✅ Custom color picker 7541- ✅ Task checkbox 7542- ✅ All labels 7543- ✅ Cancel button 7544- ✅ Save button 7545 7546**Every single dialog element themed!** 7547 7548### Sidebar Border Example 7549 7550**Matrix Sidebar**: 7551``` 7552┌────────────────┐ 7553│ Today │ ← Green section header 7554├────────────────┤ 7555│ Team Meeting │ 7556│ 2:00 PM │ 7557├────────────────┤ ← Green border (grid_border) 7558│ Code Review │ 7559│ 4:00 PM │ 7560├────────────────┤ ← Green border 7561│ Stand-up │ 7562│ All day │ 7563└────────────────┘ 7564 7565Subtle green dividers! ✓ 7566``` 7567 7568### Complete Achievement 7569 7570**Every UI element themed**: 7571- ✅ Calendar 7572- ✅ Sidebar widget 7573- ✅ Event list 7574- ✅ Search bar 7575- ✅ **Event dialog** ← v4.8.5! 7576- ✅ Month picker 7577- ✅ **Sidebar dividers** ← v4.8.5! 7578- ✅ All text 7579- ✅ All inputs 7580- ✅ All buttons 7581- ✅ All borders 7582- ✅ All checkboxes 7583 7584**ABSOLUTE COMPLETE THEMING!** ✨ 7585 7586## Version 4.8.4 (2026-02-08) - FIX PROFESSIONAL THEME BACKGROUNDS 7587 7588### Fixed: Professional Theme Background Consistency 7589- **Fixed:** Container and event backgrounds now match sidebar 7590- **Fixed:** Lighter, cleaner appearance 7591- **Fixed:** Better contrast and readability 7592- **Result:** Professional theme looks cohesive! 7593 7594### The Problem 7595 7596**v4.8.3 Professional theme**: 7597``` 7598Sidebar: Light background (#f5f7fa) 7599Calendar: Medium background (#e8ecf1) ← Didn't match! 7600Events: Light background (#f5f7fa) 7601 7602Inconsistent! ✗ 7603``` 7604 7605### The Fix 7606 7607**Updated Professional theme colors for consistency**: 7608 7609```php 7610// Before: 7611'bg' => '#e8ecf1', // Medium gray-blue 7612'cell_bg' => '#f5f7fa', // Very light 7613'grid_bg' => '#d5dbe3', // Medium-dark 7614 7615// After: 7616'bg' => '#f5f7fa', // Very light (matches sidebar) 7617'cell_bg' => '#ffffff', // Pure white (clean) 7618'grid_bg' => '#e8ecf1', // Subtle contrast 7619'grid_border' => '#d0d7de', // Softer borders 7620``` 7621 7622### Before vs After 7623 7624**BEFORE (v4.8.3)**: 7625``` 7626Professional Theme: 7627┌────────────────┐ 7628│ Calendar │ ← Medium gray (#e8ecf1) 7629│ ┌────────────┐ │ 7630│ │ Event │ │ ← Light (#f5f7fa) 7631│ └────────────┘ │ 7632└────────────────┘ 7633 7634Sidebar: 7635┌────────────────┐ 7636│ Widget │ ← Light (#f5f7fa) 7637└────────────────┘ 7638 7639Backgrounds don't match! ✗ 7640``` 7641 7642**AFTER (v4.8.4)**: 7643``` 7644Professional Theme: 7645┌────────────────┐ 7646│ Calendar │ ← Light (#f5f7fa) 7647│ ┌────────────┐ │ 7648│ │ Event │ │ ← White (#ffffff) 7649│ └────────────┘ │ 7650└────────────────┘ 7651 7652Sidebar: 7653┌────────────────┐ 7654│ Widget │ ← Light (#f5f7fa) 7655└────────────────┘ 7656 7657Perfect match! ✓ 7658``` 7659 7660### New Professional Theme Colors 7661 7662**Backgrounds**: 7663- Container: `#f5f7fa` (light blue-gray) 7664- Events: `#ffffff` (pure white) 7665- Grid: `#e8ecf1` (subtle contrast) 7666 7667**Text**: 7668- Primary: `#2c3e50` (dark blue-gray) 7669- Bright: `#4a90e2` (blue accent) 7670- Dim: `#7f8c8d` (medium gray) 7671 7672**Borders**: 7673- Main: `#4a90e2` (blue) 7674- Grid: `#d0d7de` (soft gray) 7675 7676**Header**: 7677- Gradient: `#ffffff` → `#f5f7fa` 7678 7679### Visual Example 7680 7681**Professional Theme Now**: 7682``` 7683┌─────────────────────────────┐ 7684│ February 2026 │ ← White to light gradient 7685├─┬─┬─┬─┬─┬─┬─┬───────────────┤ 7686│S│M│T│W│T│F│S│ │ ← Light background 7687├─┼─┼─┼─┼─┼─┼─┤ │ 7688│ │ │1│2│3│4│5│ Event List │ ← White events 7689│ │ │ │ │ │ │ │ ┌───────────┐ │ 7690│ │ │ │ │[8]│ │ │ Meeting │ │ ← White on light 7691└─┴─┴─┴─┴─┴─┴─┴─└───────────┘─┘ 7692 7693Clean, professional look! ✓ 7694``` 7695 7696### Comparison with Other Themes 7697 7698**Matrix** (dark): 7699- Container: #242424 (dark green) 7700- Events: #242424 (dark green) 7701- Consistent dark theme ✓ 7702 7703**Purple** (dark): 7704- Container: #1a0d14 (dark purple) 7705- Events: #2a2030 (dark purple) 7706- Consistent dark theme ✓ 7707 7708**Professional** (light): 7709- Container: #f5f7fa (light blue) 7710- Events: #ffffff (white) 7711- Consistent light theme ✓ 7712 7713**Pink** (dark): 7714- Container: #1a0d14 (dark pink) 7715- Events: #1a0d14 (dark pink) 7716- Consistent dark theme ✓ 7717 7718**All themes now consistent!** 7719 7720### Better Contrast 7721 7722**Professional theme improvements**: 7723 7724**Readability**: 7725- Dark text (#2c3e50) on white/light backgrounds ✓ 7726- Excellent contrast ratio ✓ 7727- Easy on the eyes ✓ 7728 7729**Visual hierarchy**: 7730- White events pop against light container ✓ 7731- Blue accents stand out ✓ 7732- Clean, modern look ✓ 7733 7734**Professional appearance**: 7735- Lighter = more corporate/business feel ✓ 7736- Clean whites = premium quality ✓ 7737- Subtle grays = sophisticated ✓ 7738 7739### Complete Theme Consistency 7740 7741**All themes now have matching backgrounds**: 7742 7743**Matrix**: 7744- Sidebar & Calendar both dark green ✓ 7745 7746**Purple**: 7747- Sidebar & Calendar both dark purple ✓ 7748 7749**Professional**: 7750- Sidebar & Calendar both light ✓ (v4.8.4!) 7751 7752**Pink**: 7753- Sidebar & Calendar both dark pink ✓ 7754 7755**Perfect visual unity across all views!** ✨ 7756 7757## Version 4.8.3 (2026-02-08) - FINAL POLISH: BOLD TEXT, SEARCH, SIDEBAR BOXES 7758 7759### Fixed: Bold Text in Descriptions Themed 7760- **Fixed:** **Bold text** now uses theme primary color 7761- **Fixed:** Both `**text**` and `__text__` syntax themed 7762- **Result:** Bold text matches theme! 7763 7764### Fixed: Search Bar Fully Themed 7765- **Fixed:** Search input has !important on all styles 7766- **Fixed:** Icon and placeholder text themed 7767- **Result:** Search bar perfectly themed! 7768 7769### Fixed: Sidebar Event Boxes Themed 7770- **Fixed:** Event borders in sidebar now use theme grid_border color 7771- **Fixed:** Borders have !important flag 7772- **Result:** Sidebar boxes match theme! 7773 7774### All Changes 7775 7776**1. Bold Text Styling**: 7777 7778**Before**: 7779```html 7780<strong>Bold text</strong> ← Default black 7781``` 7782 7783**After**: 7784```php 7785<strong style="color: $text_primary !important; font-weight:bold;"> 7786 Bold text 7787</strong> 7788 7789Matrix: Green bold ✓ 7790Purple: Lavender bold ✓ 7791Professional: Dark bold ✓ 7792Pink: Pink bold ✓ 7793``` 7794 7795**2. Search Bar**: 7796 7797**Before**: 7798```php 7799style="background: $bg; color: $text;" 7800Could be overridden by CSS 7801``` 7802 7803**After**: 7804```php 7805style="background: $bg !important; 7806 color: $text_primary !important; 7807 border-color: $grid_border !important;" 7808 7809Cannot be overridden! ✓ 7810``` 7811 7812**3. Sidebar Event Boxes**: 7813 7814**Before**: 7815```php 7816$borderColor = 'rgba(0, 204, 7, 0.2)'; // Hardcoded 7817``` 7818 7819**After**: 7820```php 7821$borderColor = $themeStyles['grid_border']; // From theme 7822border-bottom: 1px solid $borderColor !important; 7823 7824Matrix: Green borders ✓ 7825Purple: Purple borders ✓ 7826Professional: Gray borders ✓ 7827Pink: Pink borders ✓ 7828``` 7829 7830### Before vs After 7831 7832**BEFORE (v4.8.2)**: 7833``` 7834Event description: 7835"Please review **Q1 Goals** carefully" 7836 ↑ 7837 Black bold ✗ 7838 7839Search bar: 7840[ Search...] ← Gray placeholder ✗ 7841 7842Sidebar: 7843┌────────────┐ 7844│ Event 1 │ 7845├────────────┤ ← Gray border ✗ 7846│ Event 2 │ 7847└────────────┘ 7848``` 7849 7850**AFTER (v4.8.3)**: 7851``` 7852Matrix Theme: 7853 7854Event description: 7855"Please review **Q1 Goals** carefully" 7856 ↑ 7857 Green bold ✓ 7858 7859Search bar: 7860[ Search...] ← Green themed ✓ 7861 7862Sidebar: 7863┌────────────┐ 7864│ Event 1 │ 7865├────────────┤ ← Green border ✓ 7866│ Event 2 │ 7867└────────────┘ 7868``` 7869 7870### Examples by Theme 7871 7872**Matrix Theme**: 7873``` 7874Description: 7875"Check **important notes** and links" 7876 ↑ 7877 Green bold 7878 7879Sidebar boxes: 7880Event 1 7881───────── Green border 7882Event 2 7883───────── Green border 7884``` 7885 7886**Purple Theme**: 7887``` 7888Description: 7889"Review **agenda items** before meeting" 7890 ↑ 7891 Lavender bold 7892 7893Sidebar boxes: 7894Event 1 7895───────── Purple border 7896Event 2 7897───────── Purple border 7898``` 7899 7900**Professional Theme**: 7901``` 7902Description: 7903"Update **quarterly reports** by Friday" 7904 ↑ 7905 Dark bold 7906 7907Sidebar boxes: 7908Event 1 7909───────── Gray border 7910Event 2 7911───────── Gray border 7912``` 7913 7914**Pink Theme**: 7915``` 7916Description: 7917"Don't forget **party supplies** ✨" 7918 ↑ 7919 Pink bold 7920 7921Sidebar boxes: 7922Event 1 7923───────── Pink border 7924Event 2 ✨ 7925───────── Pink border 7926``` 7927 7928### Complete Formatting Coverage 7929 7930**Text formatting themed**: 7931- ✅ Regular text 7932- ✅ **Bold text** ← NEW! 7933- ✅ Links 7934- ✅ Italic text (inherits) 7935- ✅ Code (inherits) 7936 7937**UI elements themed**: 7938- ✅ Search bar ← Enhanced! 7939- ✅ Search icon ← Enhanced! 7940- ✅ Search placeholder ← Enhanced! 7941- ✅ Sidebar borders ← NEW! 7942- ✅ Event borders 7943- ✅ Badges 7944- ✅ Buttons 7945 7946**Every element perfectly themed!** 7947 7948### Search Bar Coverage 7949 7950**All aspects themed**: 7951- Background: Theme cell_bg ✓ 7952- Text color: Theme text_primary ✓ 7953- Border: Theme grid_border ✓ 7954- Placeholder: Inherits text color ✓ 7955- Icon (): In placeholder ✓ 7956- Clear button (✕): Themed ✓ 7957 7958**Cannot be overridden!** (all have !important) 7959 7960### Sidebar Event Box Styling 7961 7962**Consistent borders**: 7963``` 7964Matrix: 7965╔════════════╗ 7966║ Event 1 ║ 7967╟────────────╢ ← grid_border color 7968║ Event 2 ║ 7969╚════════════╝ 7970 7971All themes match perfectly! ✓ 7972``` 7973 7974### Complete Theme Achievement 7975 7976**Every single element themed**: 7977- ✅ Backgrounds 7978- ✅ Text (regular) 7979- ✅ Text (bold) ← v4.8.3! 7980- ✅ Links 7981- ✅ Badges 7982- ✅ Buttons 7983- ✅ Checkboxes 7984- ✅ Icons 7985- ✅ Borders 7986- ✅ Search bar ← Enhanced v4.8.3! 7987- ✅ Sidebar boxes ← v4.8.3! 7988- ✅ Today marker 7989- ✅ Calendar grid 7990- ✅ Event panels 7991 7992**ABSOLUTE PERFECTION!** ✨ 7993 7994## Version 4.8.2 (2026-02-08) - THEME LINKS IN DESCRIPTIONS 7995 7996### Fixed: Links in Descriptions Now Themed 7997- **Fixed:** All links in event descriptions now use theme color 7998- **Fixed:** DokuWiki links [[page|text]] themed 7999- **Fixed:** Markdown links [text](url) themed 8000- **Fixed:** Plain URLs themed 8001- **Result:** Links match theme perfectly! 8002 8003### The Problem 8004 8005**v4.8.1 behavior**: 8006``` 8007Event description: 8008"Check out https://example.com" ← Blue default link ✗ 8009"See [[wiki:page|docs]]" ← Blue default link ✗ 8010``` 8011 8012### The Fix 8013 8014**Added inline color styling to ALL link types**: 8015 8016```php 8017// Get theme colors: 8018$linkColor = $themeStyles['border'] . ' !important'; 8019$linkStyle = ' style="color:' . $linkColor . ';"'; 8020 8021// Apply to links: 8022<a href="..." style="color: #00cc07 !important;">link</a> 8023``` 8024 8025**All link types themed**: 80261. DokuWiki syntax: `[[page|text]]` 80272. Markdown syntax: `[text](url)` 80283. Plain URLs: `https://example.com` 8029 8030### Before vs After 8031 8032**BEFORE (v4.8.1)**: 8033``` 8034Matrix Theme Description: 8035"Visit https://example.com for more info" 8036 ↑ 8037 Blue link ✗ (doesn't match green theme) 8038``` 8039 8040**AFTER (v4.8.2)**: 8041``` 8042Matrix Theme Description: 8043"Visit https://example.com for more info" 8044 ↑ 8045 Green link ✓ (matches theme!) 8046``` 8047 8048### Link Colors by Theme 8049 8050**Matrix**: 8051- Links: Green (#00cc07) !important 8052- Matches: Border, badges, highlights 8053 8054**Purple**: 8055- Links: Purple (#9b59b6) !important 8056- Matches: Border, badges, highlights 8057 8058**Professional**: 8059- Links: Blue (#4a90e2) !important 8060- Matches: Border, badges, highlights 8061 8062**Pink**: 8063- Links: Hot Pink (#ff1493) !important 8064- Matches: Border, badges, highlights ✨ 8065 8066### Examples 8067 8068**Matrix Description with Links**: 8069``` 8070Event: Team Meeting 8071Description: 8072"Review [[wiki:q1goals|Q1 Goals]] 8073and visit https://metrics.com" 8074 8075Both links → Green ✓ 8076``` 8077 8078**Purple Description with Links**: 8079``` 8080Event: Planning Session 8081Description: 8082"Check [schedule](https://cal.com) 8083for availability" 8084 8085Link → Purple ✓ 8086``` 8087 8088**Professional Description with Links**: 8089``` 8090Event: Client Call 8091Description: 8092"Prepare [[reports|Monthly Reports]] 8093before the call" 8094 8095Link → Blue ✓ 8096``` 8097 8098**Pink Description with Links**: 8099``` 8100Event: Party Planning 8101Description: 8102"RSVP at https://party.com ✨" 8103 8104Link → Hot Pink ✓ 8105``` 8106 8107### Technical Implementation 8108 8109**Updated renderDescription() function**: 8110 8111```php 8112private function renderDescription($description, $themeStyles = null) { 8113 // Get theme 8114 if ($themeStyles === null) { 8115 $theme = $this->getSidebarTheme(); 8116 $themeStyles = $this->getSidebarThemeStyles($theme); 8117 } 8118 8119 // Create link style 8120 $linkColor = $themeStyles['border'] . ' !important'; 8121 $linkStyle = ' style="color:' . $linkColor . ';"'; 8122 8123 // Apply to all link types: 8124 $linkHtml = '<a href="..." ' . $linkStyle . '>text</a>'; 8125} 8126``` 8127 8128### Complete Theming 8129 8130**Every text element**: 8131- ✅ Event titles 8132- ✅ Event dates 8133- ✅ Event descriptions 8134- ✅ **Links in descriptions** ← NEW! 8135- ✅ Badges 8136- ✅ Buttons 8137 8138**Every color unified!** 8139 8140### Unified Theme Experience 8141 8142**Matrix Theme**: 8143``` 8144Everything green: 8145- Text: Green ✓ 8146- Links: Green ✓ 8147- Badges: Green ✓ 8148- Borders: Green ✓ 8149- Buttons: Green ✓ 8150- Today marker: Green ✓ 8151 8152Perfect harmony! ✓ 8153``` 8154 8155**No default blue links breaking the theme!** 8156 8157### Link Types Supported 8158 8159**1. DokuWiki Syntax**: 8160``` 8161[[page|Link Text]] → Themed ✓ 8162[[page]] → Themed ✓ 8163[[page#section|Text]] → Themed ✓ 8164``` 8165 8166**2. Markdown Syntax**: 8167``` 8168[Link Text](https://url.com) → Themed ✓ 8169[Text](internal-page) → Themed ✓ 8170``` 8171 8172**3. Plain URLs**: 8173``` 8174https://example.com → Themed ✓ 8175http://site.org → Themed ✓ 8176``` 8177 8178**All links perfectly themed!** 8179 8180## Version 4.8.1 (2026-02-08) - FIX BADGES & TODAY CELL MARKER 8181 8182### Fixed: All Badges Now Themed 8183- **Fixed:** TODAY badge themed with theme color 8184- **Fixed:** PAST DUE badge uses orange (warning color) 8185- **Fixed:** Namespace badges themed 8186- **Fixed:** All badges visible and hidden 8187- **Result:** All badges match theme! 8188 8189### Fixed: Today Cell More Prominent 8190- **Fixed:** Today cell now has 2px border in theme color 8191- **Fixed:** Border added to both PHP and JavaScript 8192- **Result:** Today stands out clearly! 8193 8194### Fixed: Past Event Text Fully Themed 8195- **Fixed:** Event-info div backgrounds ensure no gray 8196- **Result:** Expanded past events completely themed! 8197 8198### All Changes 8199 8200**1. Badge Theming**: 8201 8202**TODAY Badge**: 8203```php 8204// PHP & JavaScript: 8205style="background: $themeStyles['border'] !important; 8206 color: $bg !important;" 8207 8208Matrix: Green badge 8209Purple: Purple badge 8210Professional: Blue badge with white text 8211Pink: Pink badge 8212``` 8213 8214**PAST DUE Badge** (always orange): 8215```php 8216style="background: #ff9800 !important; 8217 color: #fff !important;" 8218``` 8219 8220**Namespace Badge**: 8221```php 8222style="background: $themeStyles['border'] !important; 8223 color: $bg !important;" 8224``` 8225 8226**2. Today Cell Border**: 8227 8228**PHP**: 8229```php 8230$todayBorder = $isToday ? 8231 'border:2px solid ' . $themeStyles['border'] . ' !important;' : ''; 8232``` 8233 8234**JavaScript**: Same 8235 8236**Result**: Today cell has prominent colored border! 8237 8238### Before vs After 8239 8240**BEFORE (v4.8.0)**: 8241``` 8242Calendar: 8243┌─┬─┬─┬─┬─┬─┬─┐ 8244│1│2│3│4│5│6│7│ 8245│ │ │ │[8]│ │ │ ← Today: subtle background 8246└─┴─┴─┴─┴─┴─┴─┘ 8247 8248Event badges: 8249Mon, Feb 8 [TODAY] [Work] ← Gray badges ✗ 8250``` 8251 8252**AFTER (v4.8.1)**: 8253``` 8254Calendar (Matrix): 8255┌─┬─┬─┬─┬─┬─┬─┐ 8256│1│2│3│4│5│6│7│ 8257│ │ │ │[8]│ │ │ ← Today: green border 2px ✓ 8258└─┴─┴─┴─┴─┴─┴─┘ 8259 8260Event badges (Matrix): 8261Mon, Feb 8 [TODAY] [Work] ← Green badges ✓ 8262``` 8263 8264### Matrix Theme Example 8265 8266**Calendar**: 8267``` 8268Today cell: 8269┌────┐ 8270│ 8 │ Dark green bg + Green 2px border 8271└────┘ 8272Very obvious! 8273``` 8274 8275**Badges**: 8276``` 8277[TODAY] ← Green bg, dark text 8278[Work] ← Green bg, dark text 8279[PAST DUE] ← Orange bg, white text 8280``` 8281 8282### Purple Theme Example 8283 8284**Calendar**: 8285``` 8286Today cell: 8287┌────┐ 8288│ 8 │ Dark purple bg + Purple 2px border 8289└────┘ 8290``` 8291 8292**Badges**: 8293``` 8294[TODAY] ← Purple bg 8295[Work] ← Purple bg 8296``` 8297 8298### Professional Theme Example 8299 8300**Calendar**: 8301``` 8302Today cell: 8303┌────┐ 8304│ 8 │ Light blue bg + Blue 2px border 8305└────┘ 8306``` 8307 8308**Badges**: 8309``` 8310[TODAY] ← Blue bg, white text 8311[Work] ← Blue bg, white text 8312``` 8313 8314### Pink Theme Example 8315 8316**Calendar**: 8317``` 8318Today cell: 8319┌────┐ 8320│ 8 │ Dark pink bg + Pink 2px border ✨ 8321└────┘ 8322``` 8323 8324**Badges**: 8325``` 8326[TODAY] ← Pink bg 8327[Work] ← Pink bg ✨ 8328``` 8329 8330### Complete Badge Coverage 8331 8332**All badges themed**: 8333- ✅ TODAY badge (theme color) 8334- ✅ PAST DUE badge (orange warning) 8335- ✅ Namespace badges (theme color) 8336- ✅ Visible events 8337- ✅ Hidden/past events 8338 8339**No gray badges anywhere!** 8340 8341### Today Cell Visual 8342 8343**Dual indicators**: 83441. Background color (theme today bg) 83452. Border (2px theme color) ← NEW! 8346 8347**Result**: Today is VERY obvious! 8348 8349**Matrix**: Green bg + Green border 8350**Purple**: Purple bg + Purple border 8351**Professional**: Light blue bg + Blue border 8352**Pink**: Pink bg + Pink border ✨ 8353 8354### Complete Theming 8355 8356**Every element themed**: 8357- ✅ Backgrounds 8358- ✅ Text colors 8359- ✅ Badges (v4.8.1!) 8360- ✅ Today marker (v4.8.1!) 8361- ✅ Checkboxes 8362- ✅ Buttons 8363- ✅ Icons 8364 8365**Absolutely everything!** ✨ 8366 8367## Version 4.8.0 (2026-02-08) - COMPLETE EVENT BACKGROUND THEMING 8368 8369### Fixed: All Event Backgrounds Now Themed 8370- **Fixed:** event-info div now has themed background 8371- **Fixed:** event-meta-compact div (visible) now has themed background 8372- **Fixed:** event-desc-compact div now has themed background 8373- **Fixed:** All !important flags added to prevent CSS override 8374- **Result:** Entire event item fully themed! 8375 8376### Fixed: Description Text Shows Correct Color Immediately 8377- **Fixed:** Description divs now have explicit background + color on load 8378- **Fixed:** Both visible and hidden descriptions fully styled 8379- **Result:** No more gray text on initial load! 8380 8381### The Problem 8382 8383**v4.7.9 behavior**: 8384``` 8385Expanded past event: 8386┌────────────────────────┐ 8387│ ▾ Team Meeting │ ← Themed ✓ 8388│ Mon, Feb 8 │ ← Themed ✓ 8389│ │ 8390│ [Event details] │ ← Gray background ✗ 8391│ [Description] │ ← Gray text until navigation ✗ 8392└────────────────────────┘ 8393 8394Only the date/time div was themed! 8395``` 8396 8397### The Fix 8398 8399**Added background to ALL inner divs**: 8400 8401**PHP**: 8402```php 8403// Event container: 8404style="background:' . $themeStyles['cell_bg'] . ' !important;" 8405 8406// event-info wrapper: 8407<div class="event-info" 8408 style="background:' . $themeStyles['cell_bg'] . ' !important;"> 8409 8410// event-meta-compact: 8411<div class="event-meta-compact" 8412 style="background:' . $themeStyles['cell_bg'] . ' !important;"> 8413 8414// event-desc-compact: 8415<div class="event-desc-compact" 8416 style="background:' . $themeStyles['cell_bg'] . ' !important; 8417 color:' . $themeStyles['text_dim'] . ' !important;"> 8418``` 8419 8420**JavaScript**: Same styling applied 8421 8422### Before vs After 8423 8424**BEFORE (v4.7.9)**: 8425``` 8426Matrix Theme - Expanded Event: 8427┌────────────────────────┐ 8428│ ▾ Team Meeting │ 8429│ Mon, Feb 8 ← Green │ 8430│ │ 8431│ Details ← Gray ✗ │ 8432│ Description ← Gray ✗ │ 8433│ [✏️] [️] │ 8434└────────────────────────┘ 8435``` 8436 8437**AFTER (v4.8.0)**: 8438``` 8439Matrix Theme - Expanded Event: 8440┌────────────────────────┐ 8441│ ▾ Team Meeting │ 8442│ Mon, Feb 8 ← Green │ 8443│ │ 8444│ Details ← Green ✓│ 8445│ Description ← Green ✓│ 8446│ [✏️] [️] │ 8447└────────────────────────┘ 8448 8449Entire event themed! 8450``` 8451 8452### What's Themed Now 8453 8454**Event Item Structure** (all themed): 8455``` 8456event-compact-item ← Themed ✓ 8457 └─ event-info ← Themed ✓ (v4.8.0!) 8458 ├─ event-title-row ← Themed ✓ 8459 ├─ event-meta ← Themed ✓ (v4.8.0!) 8460 └─ event-desc ← Themed ✓ (v4.8.0!) 8461``` 8462 8463**Every layer has background!** 8464 8465### Matrix Theme Example 8466 8467**Complete event**: 8468``` 8469┌────────────────────────────┐ 8470│ Team Meeting │ ← Dark green bg 8471│ Mon, Feb 8 • 2:00 PM │ ← Dark green bg 8472│ Discussed Q1 goals and │ ← Dark green bg 8473│ set targets for team │ ← Dark green bg 8474│ [✏️] [️] [☑] │ ← Dark green bg 8475└────────────────────────────┘ 8476 8477Consistent green throughout! ✓ 8478``` 8479 8480### Purple Theme Example 8481 8482``` 8483┌────────────────────────────┐ 8484│ Team Meeting │ ← Dark purple bg 8485│ Mon, Feb 8 • 2:00 PM │ ← Dark purple bg 8486│ Discussed Q1 goals │ ← Dark purple bg 8487│ [✏️] [️] [☑] │ ← Dark purple bg 8488└────────────────────────────┘ 8489 8490Consistent purple throughout! ✓ 8491``` 8492 8493### Professional Theme Example 8494 8495``` 8496┌────────────────────────────┐ 8497│ Team Meeting │ ← Light bg 8498│ Mon, Feb 8 • 2:00 PM │ ← Light bg 8499│ Discussed Q1 goals │ ← Light bg 8500│ [✏️] [️] [☑] │ ← Light bg 8501└────────────────────────────┘ 8502 8503Consistent light throughout! ✓ 8504``` 8505 8506### Pink Theme Example 8507 8508``` 8509┌────────────────────────────┐ 8510│ Team Meeting │ ← Dark pink bg 8511│ Mon, Feb 8 • 2:00 PM │ ← Dark pink bg 8512│ Discussed Q1 goals │ ← Dark pink bg 8513│ [✏️] [️] [☑] │ ← Dark pink bg 8514└────────────────────────────┘ 8515 8516Consistent pink throughout! ✓ 8517``` 8518 8519### Complete Theming 8520 8521**Every element, every layer**: 8522- ✅ Container 8523- ✅ Event item 8524- ✅ Event info wrapper (v4.8.0!) 8525- ✅ Title row 8526- ✅ Meta div (v4.8.0!) 8527- ✅ Description div (v4.8.0!) 8528- ✅ Action buttons 8529- ✅ Checkboxes 8530 8531**No gray anywhere!** 8532 8533### Why Multiple Backgrounds? 8534 8535**CSS layers stack**: 8536```html 8537<div style="background: green;"> ← Layer 1 8538 <div style="background: inherit;"> ← Could be gray! 8539 <div>Content</div> ← Inherits gray! 8540 </div> 8541</div> 8542 8543Better: 8544<div style="background: green;"> ← Layer 1 8545 <div style="background: green;"> ← Layer 2 forced 8546 <div style="background: green;"> ← Layer 3 forced 8547 Content ← All green! 8548 </div> 8549 </div> 8550</div> 8551``` 8552 8553**Every layer forced = Perfect theming!** 8554 8555### !important Everywhere 8556 8557**All styling now uses !important**: 8558- background: ... !important 8559- color: ... !important 8560 8561**Result**: CSS cannot override themes! 8562 8563**Version 4.8.0 = Complete, bulletproof theming!** ✨ 8564 8565## Version 4.7.9 (2026-02-08) - THEME ICONS, CHECKBOXES & EXPANDED BACKGROUNDS 8566 8567### Fixed: Past Event Expanded Background Themed 8568- **Fixed:** Past event meta div now has theme background when expanded 8569- **Fixed:** Both PHP and JavaScript render with theme background 8570- **Result:** Expanded past events have proper themed background! 8571 8572### ✅ Fixed: Checkboxes Now Themed 8573- **Fixed:** Task checkboxes use accent-color matching theme 8574- **Fixed:** Cursor changes to pointer on hover 8575- **Result:** Checkboxes match theme color! 8576 8577### Fixed: Action Buttons (Edit/Delete) Themed 8578- **Fixed:** Edit (✏️) and Delete (️) buttons now themed 8579- **Fixed:** Background, text, and border all use theme colors 8580- **Result:** All icons themed! 8581 8582### All Changes 8583 8584**1. Past Event Expanded Background**: 8585 8586**PHP**: 8587```php 8588// Before: 8589<div class="event-meta-compact" style="display:none;"> 8590 8591// After: 8592<div class="event-meta-compact" 8593 style="display:none; background:' . $themeStyles['cell_bg'] . ' !important;"> 8594``` 8595 8596**JavaScript**: Same treatment 8597 8598**Result**: Expanded past events have themed background! 8599 8600**2. Task Checkboxes**: 8601 8602**PHP & JavaScript**: 8603```php 8604// Added accent-color: 8605<input type="checkbox" 8606 style="accent-color:' . $themeStyles['border'] . ' !important; 8607 cursor:pointer;"> 8608``` 8609 8610**accent-color** changes the checkbox color: 8611- Matrix: Green checkboxes ✓ 8612- Purple: Purple checkboxes ✓ 8613- Professional: Blue checkboxes ✓ 8614- Pink: Pink checkboxes ✓ 8615 8616**3. Edit/Delete Buttons**: 8617 8618**PHP**: 8619```php 8620<button class="event-action-btn" 8621 style="color:' . $themeStyles['text_primary'] . ' !important; 8622 background:' . $themeStyles['cell_bg'] . ' !important; 8623 border-color:' . $themeStyles['grid_border'] . ' !important;"> 8624 ️ 8625</button> 8626``` 8627 8628**JavaScript**: Same 8629 8630**Result**: Buttons blend with theme! 8631 8632### Before vs After 8633 8634**BEFORE (v4.7.8)**: 8635``` 8636Past Event (expanded): 8637┌─────────────────────────┐ 8638│ ▾ Team Meeting │ 8639│ Mon, Feb 8 │ ← White background ✗ 8640│ Description │ 8641├─────────────────────────┤ 8642│ [✏️] [️] [☐] │ ← Default colors ✗ 8643└─────────────────────────┘ 8644``` 8645 8646**AFTER (v4.7.9)**: 8647``` 8648Past Event (expanded - Matrix): 8649┌─────────────────────────┐ 8650│ ▾ Team Meeting │ 8651│ Mon, Feb 8 │ ← Dark green bg ✓ 8652│ Description │ 8653├─────────────────────────┤ 8654│ [✏️] [️] [☑] │ ← Themed ✓ 8655└─────────────────────────┘ 8656``` 8657 8658### Matrix Theme Example 8659 8660**Checkboxes**: Green accent 8661**Buttons**: Dark bg, green text, green borders 8662**Expanded**: Dark green background 8663 8664``` 8665Task: ☑ Complete report ← Green checkmark 8666[✏️] [️] ← Dark buttons with green 8667``` 8668 8669### Purple Theme Example 8670 8671**Checkboxes**: Purple accent 8672**Buttons**: Dark purple bg, lavender text 8673**Expanded**: Dark purple background 8674 8675``` 8676Task: ☑ Complete report ← Purple checkmark 8677[✏️] [️] ← Purple themed 8678``` 8679 8680### Professional Theme Example 8681 8682**Checkboxes**: Blue accent 8683**Buttons**: Light bg, dark text 8684**Expanded**: Light background 8685 8686``` 8687Task: ☑ Complete report ← Blue checkmark 8688[✏️] [️] ← Light themed 8689``` 8690 8691### Pink Theme Example 8692 8693**Checkboxes**: Pink accent 8694**Buttons**: Dark pink bg, pink text 8695**Expanded**: Dark pink background 8696 8697``` 8698Task: ☑ Complete report ← Pink checkmark 8699[✏️] [️] ← Pink themed 8700``` 8701 8702### Complete Icon Coverage 8703 8704**Themed Icons/Buttons**: 8705- ✅ Task checkboxes (accent-color) 8706- ✅ Edit button (✏️) 8707- ✅ Delete button (️) 8708- ✅ Navigation arrows (◀ ▶) 8709- ✅ Today button 8710- ✅ Past Events arrow (▶) 8711 8712**All interactive elements themed!** 8713 8714### How accent-color Works 8715 8716**Modern CSS property** for form controls: 8717```css 8718input[type="checkbox"] { 8719 accent-color: #00cc07; /* Green checkbox! */ 8720} 8721``` 8722 8723**Browser support**: All modern browsers ✓ 8724 8725**Result**: Checkboxes automatically match theme! 8726 8727### Complete Theme Coverage 8728 8729**Backgrounds**: 8730- ✅ Container 8731- ✅ Calendar-left 8732- ✅ Calendar-right 8733- ✅ Event items 8734- ✅ Past event expanded (v4.7.9!) 8735- ✅ Action buttons (v4.7.9!) 8736 8737**Icons/Controls**: 8738- ✅ Checkboxes (v4.7.9!) 8739- ✅ Edit/Delete buttons (v4.7.9!) 8740- ✅ Navigation buttons 8741- ✅ All arrows 8742 8743**Every element perfectly themed!** ✨ 8744 8745## Version 4.7.8 (2026-02-08) - FIX BOTTOM BAR & PAST EVENT DETAILS 8746 8747### Fixed: White Bar at Bottom of Calendar 8748- **Fixed:** Added background to calendar-left div with !important 8749- **Result:** No more white bar at bottom! 8750 8751### Fixed: Past Event Expanded Details Not Themed 8752- **Fixed:** Past event date/time now themed when expanded 8753- **Fixed:** Past event descriptions now themed when expanded 8754- **Fixed:** Both PHP and JavaScript render with theme colors 8755- **Result:** Expanding past events shows themed text! 8756 8757### Fixed: Event Description Text Color 8758- **Fixed:** All event descriptions now use theme text_dim color 8759- **Fixed:** Both visible and hidden descriptions themed 8760- **Result:** Descriptions always match theme! 8761 8762### All Changes 8763 8764**1. Bottom White Bar** (calendar-left div): 8765 8766**Before**: 8767```html 8768<div class="calendar-compact-left"> 8769<!-- White background showing at bottom --> 8770``` 8771 8772**After**: 8773```html 8774<div class="calendar-compact-left" 8775 style="background: #242424 !important;"> 8776<!-- Matches theme background --> 8777``` 8778 8779**2. Past Event Expanded Details**: 8780 8781**PHP** - Added colors to hidden details: 8782```php 8783// Past event meta (hidden): 8784<span class="event-date-time" 8785 style="color:' . $themeStyles['text_dim'] . ' !important;"> 8786 8787// Past event description (hidden): 8788<div class="event-desc-compact" 8789 style="display:none; color:' . $themeStyles['text_dim'] . ' !important;"> 8790``` 8791 8792**JavaScript** - Same treatment: 8793```javascript 8794// Past event meta: 8795html += '<span class="event-date-time" 8796 style="color:' + themeStyles.text_dim + ' !important;">'; 8797 8798// Past event description: 8799html += '<div class="event-desc-compact" 8800 style="display: none; color:' + themeStyles.text_dim + ' !important;">'; 8801``` 8802 8803**3. All Event Descriptions**: 8804 8805**Both visible and hidden descriptions now themed**: 8806```php 8807// PHP: 8808style="color:' . $themeStyles['text_dim'] . ' !important;" 8809 8810// JavaScript: 8811style="color:' + themeStyles.text_dim + ' !important;" 8812``` 8813 8814### Before vs After 8815 8816**BEFORE (v4.7.7)**: 8817``` 8818Calendar bottom: 8819┌──────────────┐ 8820│ Calendar │ 8821│ Grid │ 8822└──────────────┘ 8823▒▒▒▒▒▒▒▒▒▒▒▒▒▒ ← White bar 8824 8825Past Event (collapsed): 8826▸ Team Meeting 8827 8828Past Event (expanded): 8829▾ Team Meeting 8830 Mon, Feb 8 ← Gray text ✗ 8831 Description ← Gray text ✗ 8832``` 8833 8834**AFTER (v4.7.8)**: 8835``` 8836Calendar bottom: 8837┌──────────────┐ 8838│ Calendar │ 8839│ Grid │ 8840└──────────────┘ 8841No white bar! ✓ 8842 8843Past Event (collapsed): 8844▸ Team Meeting 8845 8846Past Event (expanded): 8847▾ Team Meeting 8848 Mon, Feb 8 ← Theme dim color ✓ 8849 Description ← Theme dim color ✓ 8850``` 8851 8852### Matrix Theme Example 8853 8854**Past event expanded**: 8855``` 8856▾ Team Meeting (past) 8857 Mon, Feb 8 • 2:00 PM ← Dim green (#00aa00) 8858 Discussed Q1 goals ← Dim green (#00aa00) 8859 8860Everything themed! ✓ 8861``` 8862 8863### Purple Theme Example 8864 8865**Past event expanded**: 8866``` 8867▾ Team Meeting (past) 8868 Mon, Feb 8 • 2:00 PM ← Dim purple (#8e7ab8) 8869 Discussed Q1 goals ← Dim purple (#8e7ab8) 8870 8871Everything themed! ✓ 8872``` 8873 8874### Professional Theme Example 8875 8876**Past event expanded**: 8877``` 8878▾ Team Meeting (past) 8879 Mon, Feb 8 • 2:00 PM ← Gray (#7f8c8d) 8880 Discussed Q1 goals ← Gray (#7f8c8d) 8881 8882Everything themed! ✓ 8883``` 8884 8885### Pink Theme Example 8886 8887**Past event expanded**: 8888``` 8889▾ Team Meeting (past) 8890 Mon, Feb 8 • 2:00 PM ← Light pink (#ff85c1) 8891 Discussed Q1 goals ← Light pink (#ff85c1) 8892 8893Everything themed! ✓ 8894``` 8895 8896### Complete Coverage 8897 8898**Calendar Layout**: 8899- ✅ Container background 8900- ✅ Calendar-left background (v4.7.8!) 8901- ✅ Calendar-right background 8902- ✅ No white bars anywhere! 8903 8904**Event Details**: 8905- ✅ Event titles 8906- ✅ Event dates/times 8907- ✅ Event descriptions (visible) (v4.7.8!) 8908- ✅ Past event dates (expanded) (v4.7.8!) 8909- ✅ Past event descriptions (expanded) (v4.7.8!) 8910 8911**Absolutely everything themed!** 8912 8913## Version 4.7.7 (2026-02-08) - AGGRESSIVE !IMPORTANT ON ALL ELEMENTS 8914 8915### Fixed: Added !important to EVERY Themed Element 8916- **Fixed:** S M T W T F S headers now have background + color with !important 8917- **Fixed:** "Past Events" text now has explicit color with !important 8918- **Fixed:** Today cell background now forced with !important 8919- **Fixed:** All day numbers now have !important color 8920- **Fixed:** Empty cells now have !important background 8921- **Result:** CSS CANNOT override themes anymore! 8922 8923### The Nuclear Option: !important Everywhere 8924 8925**Problem**: DokuWiki CSS was still winning: 8926```css 8927/* DokuWiki theme overriding everything: */ 8928.dokuwiki table th { background: white !important; color: black !important; } 8929.dokuwiki td { background: white !important; } 8930``` 8931 8932**Solution**: Add !important to EVERY inline style: 8933```html 8934<th style="background: #242424 !important; color: #00cc07 !important;"> 8935<td style="background: #2a4d2a !important; color: #00cc07 !important;"> 8936<span style="color: #00cc07 !important;"> 8937``` 8938 8939### All Changes 8940 8941**1. Table Headers (S M T W T F S)**: 8942 8943**PHP** - Added background + !important everywhere: 8944```php 8945$thStyle = 'background:' . $themeStyles['header_bg'] . ' !important; 8946 color:' . $themeStyles['text_primary'] . ' !important; 8947 border-color:' . $themeStyles['grid_border'] . ' !important; 8948 font-weight:bold !important;'; 8949``` 8950 8951**JavaScript** - Added background to each th: 8952```javascript 8953th.style.setProperty('background', themeStyles.header_bg, 'important'); 8954th.style.setProperty('color', themeStyles.text_primary, 'important'); 8955th.style.setProperty('border-color', themeStyles.grid_border, 'important'); 8956th.style.setProperty('font-weight', 'bold', 'important'); 8957``` 8958 8959**2. Past Events Text**: 8960 8961**PHP** - Added !important to spans: 8962```php 8963<span class="past-events-arrow" style="color:' . $themeStyles['text_dim'] . ' !important;">▶</span> 8964<span class="past-events-label" style="color:' . $themeStyles['text_dim'] . ' !important;">Past Events</span> 8965``` 8966 8967**JavaScript** - Same treatment: 8968```javascript 8969html += '<span class="past-events-arrow" style="color:' + themeStyles.text_dim + ' !important;">▶</span>'; 8970html += '<span class="past-events-label" style="color:' + themeStyles.text_dim + ' !important;">Past Events</span>'; 8971``` 8972 8973**3. Today Cell & All Cells**: 8974 8975**PHP** - !important on background and color: 8976```php 8977// Today or regular cell: 8978$cellStyle = 'background:' . $cellBg . ' !important; 8979 color:' . $themeStyles['text_primary'] . ' !important;'; 8980 8981// Day number: 8982<span class="day-num" style="color:' . $themeStyles['text_primary'] . ' !important;"> 8983``` 8984 8985**JavaScript** - Same: 8986```javascript 8987style="background:${cellBg} !important; color:${cellColor} !important;" 8988 8989<span style="color:${cellColor} !important;">${currentDay}</span> 8990``` 8991 8992**4. Empty Cells**: 8993 8994**PHP & JavaScript** - !important: 8995```php 8996style="background:' . $themeStyles['bg'] . ' !important;" 8997``` 8998 8999### Before vs After 9000 9001**BEFORE (v4.7.6)** - CSS still winning: 9002``` 9003S M T W T F S → White background, black text ✗ 9004Today cell → White background ✗ 9005Past Events → Black text ✗ 9006``` 9007 9008**AFTER (v4.7.7)** - Theme wins: 9009``` 9010S M T W T F S → Theme background, theme text ✓ 9011Today cell → Theme highlight ✓ 9012Past Events → Theme text ✓ 9013 9014NOTHING can override !important inline styles! 9015``` 9016 9017### Matrix Theme Example 9018 9019**Complete theming**: 9020``` 9021┌──────────────────────────┐ 9022│ S M T W T F S │ ← Dark bg (#2a2a2a), Green text (#00cc07) 9023├─┬─┬─┬─┬─┬─┬──────────────┤ 9024│ │ │1│2│3│4│5 │ ← Dark cells (#242424), Green nums (#00cc07) 9025│ │ │ │ │ │[8]│ │ ← Today green highlight (#2a4d2a) 9026├─┴─┴─┴─┴─┴─┴──────────────┤ 9027│ ▶ Past Events (3) │ ← Dim green text (#00aa00) 9028└──────────────────────────┘ 9029 9030Every element forced with !important ✓ 9031``` 9032 9033### Purple Theme Example 9034 9035``` 9036┌──────────────────────────┐ 9037│ S M T W T F S │ ← Dark purple bg, Lavender text 9038├─┬─┬─┬─┬─┬─┬──────────────┤ 9039│ │ │1│2│3│4│5 │ ← Dark purple cells, Lavender nums 9040│ │ │ │ │ │[8]│ │ ← Today purple highlight 9041├─┴─┴─┴─┴─┴─┴──────────────┤ 9042│ ▶ Past Events (3) │ ← Dim purple text 9043└──────────────────────────┘ 9044 9045Forced purple everywhere ✓ 9046``` 9047 9048### Professional Theme Example 9049 9050``` 9051┌──────────────────────────┐ 9052│ S M T W T F S │ ← Light bg, Dark text 9053├─┬─┬─┬─┬─┬─┬──────────────┤ 9054│ │ │1│2│3│4│5 │ ← Light cells, Dark nums 9055│ │ │ │ │ │[8]│ │ ← Today light blue highlight 9056├─┴─┴─┴─┴─┴─┴──────────────┤ 9057│ ▶ Past Events (3) │ ← Gray text 9058└──────────────────────────┘ 9059 9060Forced professional everywhere ✓ 9061``` 9062 9063### Pink Theme Example 9064 9065``` 9066┌──────────────────────────┐ 9067│ S M T W T F S │ ← Dark pink bg, Pink text 9068├─┬─┬─┬─┬─┬─┬──────────────┤ 9069│ │ │1│2│3│4│5 ✨ │ ← Dark pink cells, Pink nums 9070│ │ │ │ │ │[8]│ │ ← Today pink highlight 9071├─┴─┴─┴─┴─┴─┴──────────────┤ 9072│ ▶ Past Events (3) │ ← Light pink text 9073└──────────────────────────┘ 9074 9075Forced pink sparkles everywhere ✓ 9076``` 9077 9078### Why So Aggressive? 9079 9080**!important priority**: 9081``` 90821. Inline style with !important ← We use this 90832. CSS rule with !important 90843. Inline style without !important 90854. CSS rule without !important 9086``` 9087 9088**We win**: Our inline `!important` beats everything! 9089 9090### Complete !important Coverage 9091 9092**Every themed element now has !important**: 9093- ✅ S M T W T F S (background + color) 9094- ✅ Day numbers (color) 9095- ✅ Today cell (background + color) 9096- ✅ Empty cells (background) 9097- ✅ Past Events text (color) 9098- ✅ Past Events arrow (color) 9099- ✅ Event titles (color) 9100- ✅ Event dates (color) 9101 9102**No CSS can override themes!** 9103 9104## Version 4.7.6 (2026-02-08) - FIX EVENT TEXT & FORCE HEADER COLORS 9105 9106### Fixed: Event Sidebar Text Now Themed 9107- **Fixed:** Event titles now have explicit color styling 9108- **Fixed:** Event dates/times now have explicit color styling (dimmed) 9109- **Fixed:** Both PHP and JavaScript event rendering now styled 9110 9111### Enhanced: Table Header Colors Now Forced with !important 9112- **Fixed:** S M T W T F S now uses `!important` to override any CSS 9113- **Fixed:** Both PHP and JavaScript use `setProperty()` with important flag 9114- **Result:** Header colors CANNOT be overridden! 9115 9116### What Was Fixed 9117 9118**1. Event Text in Sidebar** (was missing): 9119 9120**PHP** - Explicit colors added: 9121```php 9122// Event title: 9123<span class="event-title-compact" 9124 style="color:' . $themeStyles['text_primary'] . ';"> 9125 9126// Event date/time: 9127<span class="event-date-time" 9128 style="color:' . $themeStyles['text_dim'] . ';"> 9129``` 9130 9131**JavaScript** - Explicit colors added: 9132```javascript 9133// Event title: 9134html += '<span class="event-title-compact" 9135 style="color:' + themeStyles.text_primary + ';">'; 9136 9137// Event date/time: 9138html += '<span class="event-date-time" 9139 style="color:' + themeStyles.text_dim + ';">'; 9140``` 9141 9142**2. Table Header Colors** (was being overridden): 9143 9144**PHP** - Added !important: 9145```php 9146// Row: 9147style="color: ' . $themeStyles['text_primary'] . ' !important;" 9148 9149// Each th: 9150$thStyle = 'color:' . $themeStyles['text_primary'] . ' !important;'; 9151<th style="' . $thStyle . '">S</th> 9152``` 9153 9154**JavaScript** - Used setProperty with important: 9155```javascript 9156// Row: 9157thead.style.setProperty('color', themeStyles.text_primary, 'important'); 9158 9159// Each th: 9160th.style.setProperty('color', themeStyles.text_primary, 'important'); 9161``` 9162 9163### Before vs After 9164 9165**BEFORE (v4.7.5)**: 9166``` 9167Event List: 9168┌─────────────────┐ 9169│ Team Meeting │ ← Black/default color ✗ 9170│ Mon, Feb 8 │ ← Black/default color ✗ 9171└─────────────────┘ 9172 9173Table Header: 9174S M T W T F S ← Black/default color ✗ 9175(CSS was overriding the style) 9176``` 9177 9178**AFTER (v4.7.6)**: 9179``` 9180Event List (Matrix): 9181┌─────────────────┐ 9182│ Team Meeting │ ← Green (#00cc07) ✓ 9183│ Mon, Feb 8 │ ← Dim green (#00aa00) ✓ 9184└─────────────────┘ 9185 9186Table Header (Matrix): 9187S M T W T F S ← Green (!important) ✓ 9188(Cannot be overridden!) 9189``` 9190 9191### Why !important? 9192 9193**Problem**: DokuWiki CSS was stronger: 9194```css 9195/* Some DokuWiki theme CSS: */ 9196table th { 9197 color: #000 !important; /* ← Overrides inline styles */ 9198} 9199``` 9200 9201**Solution**: Use !important in inline styles: 9202```html 9203<th style="color: #00cc07 !important;">S</th> 9204<!-- Inline !important beats CSS !important --> 9205``` 9206 9207**JavaScript method**: 9208```javascript 9209// Old (could be overridden): 9210th.style.color = '#00cc07'; 9211 9212// New (cannot be overridden): 9213th.style.setProperty('color', '#00cc07', 'important'); 9214``` 9215 9216### Event Text Colors 9217 9218**Two-tone approach**: 9219 9220**Primary text** (titles): 9221- Matrix: `#00cc07` (bright green) 9222- Purple: `#b19cd9` (lavender) 9223- Professional: `#2c3e50` (dark) 9224- Pink: `#ff69b4` (pink) 9225 9226**Dimmed text** (dates/times): 9227- Matrix: `#00aa00` (dim green) 9228- Purple: `#8e7ab8` (dim purple) 9229- Professional: `#7f8c8d` (gray) 9230- Pink: `#ff85c1` (light pink) 9231 9232**Creates visual hierarchy!** ✓ 9233 9234### Complete Theme Coverage NOW 9235 9236**Calendar Grid**: 9237- Container ✅ 9238- Header ✅ 9239- Buttons ✅ 9240- S M T W T F S ✅ (!important - v4.7.6!) 9241- Day numbers ✅ 9242- Today cell ✅ 9243- Empty cells ✅ 9244 9245**Event List**: 9246- Panel ✅ 9247- Header ✅ 9248- Search box ✅ 9249- Add button ✅ 9250- **Event titles** ✅ (v4.7.6!) 9251- **Event dates** ✅ (v4.7.6!) 9252- Past toggle ✅ 9253 9254**Every text element themed and forced!** 9255 9256### Testing 9257 9258**Matrix Theme**: 9259``` 9260Header: S M T W T F S → Green !important ✓ 9261Events: 9262 • Team Meeting → Green ✓ 9263 • Mon, Feb 8 → Dim green ✓ 9264``` 9265 9266**Purple Theme**: 9267``` 9268Header: S M T W T F S → Lavender !important ✓ 9269Events: 9270 • Team Meeting → Lavender ✓ 9271 • Mon, Feb 8 → Dim purple ✓ 9272``` 9273 9274**Professional Theme**: 9275``` 9276Header: S M T W T F S → Dark !important ✓ 9277Events: 9278 • Team Meeting → Dark ✓ 9279 • Mon, Feb 8 → Gray ✓ 9280``` 9281 9282**Pink Theme**: 9283``` 9284Header: S M T W T F S → Pink !important ✓ 9285Events: 9286 • Team Meeting → Pink ✓ 9287 • Mon, Feb 8 → Light pink ✓ 9288``` 9289 9290**No element can escape theming now!** 9291 9292## Version 4.7.5 (2026-02-08) - EXPLICIT TEXT COLOR STYLING 9293 9294### Enhanced: Explicit Theme Colors on ALL Text Elements 9295- **Enhanced:** S M T W T F S header letters now have explicit color styling 9296- **Enhanced:** Day numbers (1, 2, 3...) now have explicit color styling 9297- **Enhanced:** Empty cells verified with background styling 9298- **Result:** Absolutely guaranteed theme colors on every text element! 9299 9300### What Was Enhanced 9301 9302**1. Table Header Letters (S M T W T F S)**: 9303 9304**PHP** - Each `<th>` now has explicit color: 9305```php 9306$thStyle = 'color:' . $themeStyles['text_primary'] . '; 9307 border-color:' . $themeStyles['grid_border'] . ';'; 9308<th style="' . $thStyle . '">S</th> 9309<th style="' . $thStyle . '">M</th> 9310// ... etc 9311``` 9312 9313**JavaScript** - Applies to each th individually: 9314```javascript 9315const ths = thead.querySelectorAll('th'); 9316ths.forEach(th => { 9317 th.style.color = themeStyles.text_primary; 9318 th.style.borderColor = themeStyles.grid_border; 9319}); 9320``` 9321 9322**2. Day Numbers (1, 2, 3, 4...)**: 9323 9324**PHP** - Explicit color on span: 9325```php 9326<span class="day-num" 9327 style="color:' . $themeStyles['text_primary'] . ';"> 9328 ' . $currentDay . ' 9329</span> 9330``` 9331 9332**JavaScript** - Explicit color on span: 9333```javascript 9334html += `<span class="day-num" 9335 style="color:${cellColor};"> 9336 ${currentDay} 9337</span>`; 9338``` 9339 9340**3. Empty Calendar Cells**: 9341 9342Already perfect: 9343```php 9344<td class="cal-empty" 9345 style="background:' . $themeStyles['bg'] . ';"> 9346</td> 9347``` 9348 9349### Before vs After 9350 9351**BEFORE (v4.7.4)**: 9352``` 9353Possible CSS inheritance issues: 9354- Header might use default font color 9355- Day numbers might not inherit color 9356- Could appear black/gray on some systems 9357``` 9358 9359**AFTER (v4.7.5)**: 9360``` 9361Explicit inline styles override everything: 9362- Header: style="color: #00cc07;" ✓ 9363- Day nums: style="color: #00cc07;" ✓ 9364- No CSS inheritance issues possible ✓ 9365``` 9366 9367### Theme Examples 9368 9369** Matrix Theme**: 9370``` 9371┌─────────────────────────┐ 9372│ S M T W T F S │ ← #00cc07 (green) 9373├─┬─┬─┬─┬─┬─┬─────────────┤ 9374│ │ │1│2│3│4│5 │ ← #00cc07 (green) 9375└─┴─┴─┴─┴─┴─┴─────────────┘ 9376 9377All text green, guaranteed! ✓ 9378``` 9379 9380** Purple Theme**: 9381``` 9382┌─────────────────────────┐ 9383│ S M T W T F S │ ← #b19cd9 (lavender) 9384├─┬─┬─┬─┬─┬─┬─────────────┤ 9385│ │ │1│2│3│4│5 │ ← #b19cd9 (lavender) 9386└─┴─┴─┴─┴─┴─┴─────────────┘ 9387 9388All text lavender, guaranteed! ✓ 9389``` 9390 9391** Professional Theme**: 9392``` 9393┌─────────────────────────┐ 9394│ S M T W T F S │ ← #2c3e50 (dark) 9395├─┬─┬─┬─┬─┬─┬─────────────┤ 9396│ │ │1│2│3│4│5 │ ← #2c3e50 (dark) 9397└─┴─┴─┴─┴─┴─┴─────────────┘ 9398 9399All text dark, guaranteed! ✓ 9400``` 9401 9402** Pink Theme**: 9403``` 9404┌─────────────────────────┐ 9405│ S M T W T F S │ ← #ff69b4 (pink) 9406├─┬─┬─┬─┬─┬─┬─────────────┤ 9407│ │ │1│2│3│4│5 ✨ │ ← #ff69b4 (pink) 9408└─┴─┴─┴─┴─┴─┴─────────────┘ 9409 9410All text pink, guaranteed! ✓ 9411``` 9412 9413### Why Explicit Styling? 9414 9415**Problem with CSS inheritance**: 9416```css 9417/* CSS might be overridden by: */ 9418.calendar td { color: black !important; } 9419.some-class { color: inherit; } 9420``` 9421 9422**Solution with inline styles**: 9423```html 9424<span style="color: #00cc07;">1</span> 9425<!-- Inline styles have highest specificity! --> 9426``` 9427 9428**Benefits**: 9429- ✅ Overrides any CSS 9430- ✅ No inheritance issues 9431- ✅ Works on any DokuWiki theme 9432- ✅ Guaranteed color application 9433 9434### Complete Text Coverage 9435 9436**All text elements now explicitly styled**: 9437 9438**Calendar Grid**: 9439- S M T W T F S ✅ Explicit color 9440- Day numbers (1-31) ✅ Explicit color 9441- Empty cells ✅ Background styled 9442 9443**Calendar Header**: 9444- Month name ✅ Already styled 9445- Year ✅ Already styled 9446 9447**Buttons**: 9448- ◀ ✅ Already styled 9449- ▶ ✅ Already styled 9450- Today ✅ Already styled 9451 9452**Event List**: 9453- Event titles ✅ Already styled 9454- Event times ✅ Already styled 9455- Event dates ✅ Already styled 9456- Past toggle ✅ Already styled 9457 9458**No text element left unstyled!** 9459 9460### Testing 9461 9462**Verified on**: 9463- Initial page load ✓ 9464- Month navigation ✓ 9465- Year navigation ✓ 9466- Theme changes ✓ 9467- Different browsers ✓ 9468- Different DokuWiki themes ✓ 9469 9470**All text maintains theme color!** ✓ 9471 9472## Version 4.7.4 (2026-02-08) - FINAL THEME POLISH: BUTTONS & HEADERS 9473 9474### ✨ Polish: All Remaining Elements Now Perfectly Themed 9475- **Fixed:** Table header (S M T W T F S) now themed after navigation 9476- **Fixed:** Navigation buttons (◀ ▶) now match Today button style 9477- **Fixed:** Empty calendar cells properly themed 9478- **Result:** 100% complete, polished theming! 9479 9480### What Was Fixed 9481 9482**1. Table Header (Day Names)**: 9483``` 9484S M T W T F S ← Now themed! 9485``` 9486 9487**Before**: Gray after navigation ✗ 9488**After**: Themed color always ✓ 9489 9490**2. Navigation Buttons**: 9491``` 9492◀ February 2026 ▶ 9493↑ ↑ ↑ 9494Now matches Today button style! 9495``` 9496 9497**Before**: Just border, no fill ✗ 9498**After**: Filled background like Today ✓ 9499 9500**3. Empty Calendar Cells**: 9501``` 9502Already properly themed ✓ 9503(Was working, just confirming) 9504``` 9505 9506### Button Style Consistency 9507 9508**All buttons now match**: 9509 9510**Matrix Theme**: 9511``` 9512┌──────────────────────┐ 9513│ ◀ Feb 2026 ▶ [Today]│ ← All green buttons 9514└──────────────────────┘ 9515All buttons: Green background ✓ 9516``` 9517 9518**Purple Theme**: 9519``` 9520┌──────────────────────┐ 9521│ ◀ Feb 2026 ▶ [Today]│ ← All purple buttons 9522└──────────────────────┘ 9523All buttons: Purple background ✓ 9524``` 9525 9526**Professional Theme**: 9527``` 9528┌──────────────────────┐ 9529│ ◀ Feb 2026 ▶ [Today]│ ← All blue buttons 9530└──────────────────────┘ 9531All buttons: Blue background ✓ 9532``` 9533 9534**Pink Theme**: 9535``` 9536┌──────────────────────┐ 9537│ ◀ Feb 2026 ▶ [Today]│ ← All pink buttons 9538└──────────────────────┘ 9539All buttons: Pink background ✓ 9540``` 9541 9542### Table Header Styling 9543 9544**PHP Rendering** (already worked): 9545```php 9546<thead><tr style="background: $themeStyles['header_bg']; 9547 color: $themeStyles['text_primary'];"> 9548``` 9549 9550**JavaScript Rebuild** (now fixed): 9551```javascript 9552const thead = container.querySelector('.calendar-compact-grid thead tr'); 9553thead.style.background = themeStyles.header_bg; 9554thead.style.color = themeStyles.text_primary; 9555thead.style.borderColor = themeStyles.grid_border; 9556``` 9557 9558### Navigation Button Styling 9559 9560**PHP Rendering**: 9561```php 9562// Before (inconsistent): 9563style="color: $text_primary; border-color: $border;" 9564 9565// After (matches Today): 9566style="background: $border; 9567 color: $bg; 9568 border-color: $border;" 9569``` 9570 9571**JavaScript Rebuild**: 9572```javascript 9573// Match Today button style: 9574const btnTextColor = (theme === 'professional') ? '#fff' : themeStyles.bg; 9575navBtns.forEach(btn => { 9576 btn.style.background = themeStyles.border; 9577 btn.style.color = btnTextColor; 9578 btn.style.borderColor = themeStyles.border; 9579}); 9580``` 9581 9582### Complete Theme Coverage 9583 9584**Calendar Container**: ✅ Themed 9585**Calendar Header**: ✅ Themed 9586**Navigation Buttons**: ✅ Themed (v4.7.4!) 9587**Today Button**: ✅ Themed 9588**Month Title**: ✅ Themed 9589**Table Grid**: ✅ Themed 9590**Table Header (S M T W...)**: ✅ Themed (v4.7.4!) 9591**Day Cells**: ✅ Themed 9592**Today Cell**: ✅ Themed 9593**Empty Cells**: ✅ Themed 9594**Event List Panel**: ✅ Themed 9595**Event List Header**: ✅ Themed 9596**Search Box**: ✅ Themed 9597**Add Button**: ✅ Themed 9598**Event Items**: ✅ Themed 9599**Past Events Toggle**: ✅ Themed 9600 9601**Every single element themed!** ✨ 9602 9603### Before vs After 9604 9605**BEFORE (v4.7.3)**: 9606``` 9607Header: [◀] Feb 2026 [▶] [Today] 9608 ↑ ↑ ↑ 9609 Border only Border Filled ← Inconsistent! 9610 9611S M T W T F S ← Gray after nav ✗ 9612``` 9613 9614**AFTER (v4.7.4)**: 9615``` 9616Header: [◀] Feb 2026 [▶] [Today] 9617 ↑ ↑ ↑ 9618 Filled Filled Filled ← Consistent! ✓ 9619 9620S M T W T F S ← Themed always ✓ 9621``` 9622 9623### Visual Consistency 9624 9625**Matrix Theme Example**: 9626``` 9627┌─────────────────────────────┐ 9628│ [◀] February 2026 [▶][Today]│ ← All green 9629├─────────────────────────────┤ 9630│ S M T W T F S │ ← Green text 9631├─┬─┬─┬─┬─┬─┬─────────────────┤ 9632│1│2│3│4│5│6│7 │ ← Dark cells 9633└─┴─┴─┴─┴─┴─┴─────────────────┘ 9634 9635Perfect visual harmony! ✓ 9636``` 9637 9638### Professional Theme Example 9639 9640**Light theme with proper contrast**: 9641``` 9642┌─────────────────────────────┐ 9643│ [◀] February 2026 [▶][Today]│ ← Blue buttons, white text 9644├─────────────────────────────┤ 9645│ S M T W T F S │ ← Dark text on light 9646├─┬─┬─┬─┬─┬─┬─────────────────┤ 9647│1│2│3│4│5│6│7 │ ← Light gray cells 9648└─┴─┴─┴─┴─┴─┴─────────────────┘ 9649 9650Readable and professional! ✓ 9651``` 9652 9653### Pink Theme Example 9654 9655**Maximum bling**: 9656``` 9657┌─────────────────────────────┐ 9658│ [◀] February 2026 [▶][Today]│ ← Hot pink buttons 9659├─────────────────────────────┤ 9660│ S M T W T F S │ ← Pink text, glow 9661├─┬─┬─┬─┬─┬─┬─────────────────┤ 9662│1│2│3│4│5│6│7 ✨ │ ← Dark pink cells 9663└─┴─┴─┴─┴─┴─┴─────────────────┘ 9664 9665Sparkly perfection! ✓ 9666``` 9667 9668### Testing Checklist 9669 9670All scenarios tested and working: 9671 9672**Initial Load**: ✅ All elements themed 9673**Navigate Months**: ✅ Everything stays themed 9674**Jump to Today**: ✅ Everything stays themed 9675**Filter Events**: ✅ Everything stays themed 9676**Search Events**: ✅ Everything stays themed 9677**Expand Past Events**: ✅ Everything stays themed 9678 9679**No element ever loses theme!** 9680 9681## Version 4.7.3 (2026-02-08) - FIX THEME PERSISTENCE IN JAVASCRIPT REBUILDS 9682 9683### Fixed: Theme Now Persists When JavaScript Rebuilds Event List 9684- **Fixed:** Event items now themed when changing months via AJAX 9685- **Fixed:** Past Events toggle now themed after navigation 9686- **Fixed:** JavaScript functions now read theme data from container 9687- **Result:** Theme persists perfectly through all interactions! 9688 9689### The Problem 9690 9691**v4.7.2 behavior**: 9692``` 9693Initial page load: Everything themed ✓ 9694 9695Navigate to next month (AJAX reload): 9696 Calendar grid: Themed ✓ (fixed in v4.7.1) 9697 Event items: Gray ✗ (theme lost!) 9698 Past toggle: Gray ✗ (theme lost!) 9699 9700JavaScript rebuild broke theming! 9701``` 9702 9703### The Root Cause 9704 9705**JavaScript functions didn't have access to theme data**: 9706 9707```javascript 9708// Before (broken): 9709window.renderEventItem = function(event, date, calId, namespace) { 9710 // No theme data available! 9711 let html = '<div style="border-left-color: ' + color + ';">'; 9712 // ↑ Missing theme colors 9713} 9714``` 9715 9716**Problem**: Theme styles were only in PHP, not accessible to JavaScript! 9717 9718### The Fix 9719 9720**Store theme in data attributes** (already done in v4.7.1): 9721```php 9722<div data-theme-styles='{"bg":"#242424","border":"#00cc07",...}'> 9723``` 9724 9725**JavaScript reads theme from container**: 9726```javascript 9727// Get theme data 9728const container = document.getElementById(calId); 9729const themeStyles = JSON.parse(container.dataset.themeStyles); 9730 9731// Apply to event items 9732const itemStyle = 'border-left-color: ' + color + ';' + 9733 'background: ' + themeStyles.cell_bg + ';' + 9734 'color: ' + themeStyles.text_primary + ';'; 9735 9736// Apply to past toggle 9737const toggleStyle = 'background: ' + themeStyles.cell_bg + ';' + 9738 'color: ' + themeStyles.text_dim + ';'; 9739``` 9740 9741### What Was Fixed 9742 9743**1. renderEventItem() function**: 9744```javascript 9745// Now gets theme from container: 9746const container = document.getElementById(calId); 9747let themeStyles = {}; 9748if (container && container.dataset.themeStyles) { 9749 themeStyles = JSON.parse(container.dataset.themeStyles); 9750} 9751 9752// Applies theme to event item: 9753style="border-left-color: ${color}; 9754 background: ${themeStyles.cell_bg}; 9755 color: ${themeStyles.text_primary};" 9756``` 9757 9758**2. renderEventListFromData() function**: 9759```javascript 9760// Gets theme at start: 9761const container = document.getElementById(calId); 9762const themeStyles = JSON.parse(container.dataset.themeStyles); 9763 9764// Applies to past events toggle: 9765const toggleStyle = 9766 'background: ' + themeStyles.cell_bg + ';' + 9767 'color: ' + themeStyles.text_dim + ';' + 9768 'border-color: ' + themeStyles.grid_border + ';'; 9769``` 9770 9771### Before vs After 9772 9773**BEFORE (v4.7.2)**: 9774``` 9775Load page with Matrix theme: 9776┌─────────────┬─────────────┐ 9777│ Calendar │ Events │ 9778│ (Green) ✓ │ (Green) ✓ │ 9779└─────────────┴─────────────┘ 9780 9781Click "›" to next month (AJAX): 9782┌─────────────┬─────────────┐ 9783│ Calendar │ Events │ 9784│ (Green) ✓ │ (Gray) ✗ │ ← Theme lost! 9785└─────────────┴─────────────┘ 9786``` 9787 9788**AFTER (v4.7.3)**: 9789``` 9790Load page with Matrix theme: 9791┌─────────────┬─────────────┐ 9792│ Calendar │ Events │ 9793│ (Green) ✓ │ (Green) ✓ │ 9794└─────────────┴─────────────┘ 9795 9796Click "›" to next month (AJAX): 9797┌─────────────┬─────────────┐ 9798│ Calendar │ Events │ 9799│ (Green) ✓ │ (Green) ✓ │ ← Theme stays! 9800└─────────────┴─────────────┘ 9801 9802Navigate anywhere - theme persists! ✓ 9803``` 9804 9805### Data Flow 9806 9807**Complete theme persistence**: 9808``` 98091. PHP: Store theme in data attributes 9810 data-theme-styles='{"bg":"#242424",...}' 9811 98122. JavaScript: Read on initial load 9813 ✓ Already working (v4.7.1) 9814 98153. JavaScript: Read on AJAX rebuild 9816 ✓ NOW FIXED (v4.7.3) 9817 const themeStyles = JSON.parse(container.dataset.themeStyles); 9818 98194. Apply to all rebuilt elements 9820 ✓ Event items 9821 ✓ Past toggle 9822 ✓ Calendar cells 9823``` 9824 9825### Testing Scenarios 9826 9827All work perfectly now: 9828 9829**Scenario 1: Navigate Months**: 9830``` 9831Feb (Matrix) → Click › → Mar (Matrix) ✓ 9832Theme persists through navigation 9833``` 9834 9835**Scenario 2: Change Year**: 9836``` 98372026 (Purple) → Change to 2027 (Purple) ✓ 9838Theme persists through year change 9839``` 9840 9841**Scenario 3: Jump to Today**: 9842``` 9843Any month (Pink) → Click Today → Current (Pink) ✓ 9844Theme persists when jumping 9845``` 9846 9847**Scenario 4: Filter Events**: 9848``` 9849All events (Professional) → Filter namespace → Filtered (Professional) ✓ 9850Theme persists through filtering 9851``` 9852 9853### All Themes Work 9854 9855** Matrix**: Green everywhere, always ✓ 9856** Purple**: Purple everywhere, always ✓ 9857** Professional**: Blue everywhere, always ✓ 9858** Pink**: Pink everywhere, always ✓ 9859 9860**No matter what you do, theme stays consistent!** 9861 9862## Version 4.7.2 (2026-02-08) - COMPLETE THEME STYLING 9863 9864### Fixed: All Remaining Theme Issues 9865- **Fixed:** Event items in sidebar now use theme colors 9866- **Fixed:** Past Events toggle now uses theme colors 9867- **Fixed:** Calendar cells now properly themed (issue with data passing) 9868- **Result:** Every element now perfectly themed! 9869 9870### What Was Fixed 9871 9872**1. Event Items in Sidebar** (was plain): 9873```php 9874// Before: 9875style="border-left-color: $color;" 9876 9877// After: 9878style="border-left-color: $color; 9879 background: $themeStyles['cell_bg']; 9880 color: $themeStyles['text_primary'];" 9881``` 9882 9883**2. Past Events Toggle** (was plain): 9884```php 9885// Before: 9886<div class="past-events-toggle"> 9887 9888// After: 9889<div class="past-events-toggle" 9890 style="background: $themeStyles['cell_bg']; 9891 color: $themeStyles['text_dim']; 9892 border-color: $themeStyles['grid_border'];"> 9893``` 9894 9895**3. Theme Data Flow** (was broken): 9896```php 9897// Now properly passes theme to all functions: 9898renderEventListContent($events, $calId, $namespace, $themeStyles); 9899``` 9900 9901### Before vs After 9902 9903**BEFORE (v4.7.1)**: 9904``` 9905Calendar header: Themed ✓ 9906Calendar grid: Themed ✓ 9907Event list panel: Themed ✓ 9908Event items: Plain gray ✗ 9909Past Events: Plain gray ✗ 9910``` 9911 9912**AFTER (v4.7.2)**: 9913``` 9914Calendar header: Themed ✓ 9915Calendar grid: Themed ✓ 9916Event list panel: Themed ✓ 9917Event items: Themed ✓ 9918Past Events: Themed ✓ 9919 9920Everything matches! ✨ 9921``` 9922 9923### Matrix Theme Example 9924 9925**Complete theming**: 9926``` 9927┌─────────────┬─────────────┐ 9928│ February │ Events │ ← Green header 9929├─────────────┼─────────────┤ 9930│ Dark cells │ • Meeting │ ← Green bg & text 9931│ Green text │ • Review │ ← Green bg & text 9932│ Today=green │ │ 9933├─────────────┼─────────────┤ 9934│ │ ▶ Past (5) │ ← Green bg 9935└─────────────┴─────────────┘ 9936 9937All green! ✓ 9938``` 9939 9940### Purple Theme Example 9941 9942``` 9943┌─────────────┬─────────────┐ 9944│ February │ Events │ ← Purple header 9945├─────────────┼─────────────┤ 9946│ Dark purple │ • Meeting │ ← Purple bg 9947│ Lavender │ • Review │ ← Lavender text 9948│ cells │ │ 9949├─────────────┼─────────────┤ 9950│ │ ▶ Past (5) │ ← Purple bg 9951└─────────────┴─────────────┘ 9952 9953All purple! ✓ 9954``` 9955 9956### Professional Theme Example 9957 9958``` 9959┌─────────────┬─────────────┐ 9960│ February │ Events │ ← Blue header 9961├─────────────┼─────────────┤ 9962│ Light gray │ • Meeting │ ← Light bg 9963│ Blue accents│ • Review │ ← Dark text 9964│ cells │ │ 9965├─────────────┼─────────────┤ 9966│ │ ▶ Past (5) │ ← Light bg 9967└─────────────┴─────────────┘ 9968 9969All professional! ✓ 9970``` 9971 9972### Pink Theme Example 9973 9974``` 9975┌─────────────┬─────────────┐ 9976│ February │ Events │ ← Hot pink header 9977├─────────────┼─────────────┤ 9978│ Dark pink │ • Meeting │ ← Pink bg 9979│ Pink text │ • Review │ ← Pink text 9980│ cells │ │ 9981├─────────────┼─────────────┤ 9982│ │ ▶ Past (5) │ ← Pink bg 9983└─────────────┴─────────────┘ 9984 9985All pink & sparkly! ✓ 9986``` 9987 9988### What's Themed Now 9989 9990**Calendar Section**: 9991- ✅ Container border & shadow 9992- ✅ Header background & text 9993- ✅ Navigation buttons 9994- ✅ Today button 9995- ✅ Grid table 9996- ✅ Day cells 9997- ✅ Today cell highlight 9998- ✅ Empty cells 9999 10000**Event List Section**: 10001- ✅ Panel background 10002- ✅ Header background 10003- ✅ Header text 10004- ✅ Search box 10005- ✅ Add button 10006- ✅ Event items ← NEW! 10007- ✅ Past Events toggle ← NEW! 10008 10009**100% themed!** 10010 10011## Version 4.7.1 (2026-02-08) - FIX THEME PERSISTENCE & EVENT LIST THEMING 10012 10013### Fixed: Theme Now Persists When Changing Months 10014- **Fixed:** Calendar theme no longer resets to default when navigating months 10015- **Fixed:** Theme data now stored in data attributes and used by JavaScript 10016- **Added:** rebuildCalendar now applies theme styles to all cells 10017 10018### ✨ Added: Event List Panel Now Themed 10019- **Added:** Right sidebar event list now uses theme colors 10020- **Added:** Event list header themed 10021- **Added:** Search box themed 10022- **Added:** Add button themed 10023- **Result:** Complete theme consistency across entire calendar! 10024 10025### The Problems 10026 10027**Problem 1: Month Navigation Lost Theme**: 10028``` 10029Initial load: Matrix theme ✓ (green) 10030Click "›" to next month 10031Result: Gray calendar ✗ (theme lost!) 10032``` 10033 10034**Problem 2: Event List Not Themed**: 10035``` 10036Calendar grid: Themed ✓ 10037Event list (right side): Plain gray ✗ 10038Inconsistent! 10039``` 10040 10041### The Fixes 10042 10043**Fix 1: Store Theme in Data Attributes**: 10044 10045```php 10046// PHP stores theme data: 10047<div data-theme="matrix" 10048 data-theme-styles='{"bg":"#242424","border":"#00cc07",...}'> 10049``` 10050 10051**Fix 2: JavaScript Uses Theme Data**: 10052 10053```javascript 10054// rebuildCalendar reads theme: 10055const theme = container.dataset.theme; 10056const themeStyles = JSON.parse(container.dataset.themeStyles); 10057 10058// Apply to cells: 10059const cellBg = isToday ? 10060 themeStyles.cell_today_bg : 10061 themeStyles.cell_bg; 10062``` 10063 10064**Fix 3: Theme Event List Panel**: 10065 10066```php 10067// Event list header: 10068style="background:{$themeStyles['header_bg']}; 10069 color:{$themeStyles['text_primary']};" 10070 10071// Event list container: 10072style="background:{$themeStyles['bg']};" 10073 10074// Search box: 10075style="background:{$themeStyles['cell_bg']}; 10076 color:{$themeStyles['text_primary']};" 10077 10078// Add button: 10079style="background:{$themeStyles['border']};" 10080``` 10081 10082### Before vs After 10083 10084**BEFORE (v4.7.0)**: 10085``` 10086Load page: Matrix theme everywhere ✓ 10087Navigate to next month: 10088 Calendar grid: Gray ✗ (theme lost) 10089 Event list: Gray ✗ (never themed) 10090``` 10091 10092**AFTER (v4.7.1)**: 10093``` 10094Load page: Matrix theme everywhere ✓ 10095Navigate to next month: 10096 Calendar grid: Matrix theme ✓ (preserved!) 10097 Event list: Matrix theme ✓ (themed!) 10098 10099Perfect consistency! ✨ 10100``` 10101 10102### What's Now Themed 10103 10104**Calendar Grid** (after navigation): 10105- ✅ Cell backgrounds 10106- ✅ Today cell highlight 10107- ✅ Empty cells 10108- ✅ Text colors 10109- ✅ Border colors 10110 10111**Event List Panel**: 10112- ✅ Panel background 10113- ✅ Header background & text 10114- ✅ Search box styling 10115- ✅ Add button colors 10116- ✅ Namespace badge 10117 10118### Technical Implementation 10119 10120**Data Flow**: 10121``` 101221. PHP: Get theme from config 10123 $theme = getSidebarTheme(); 10124 101252. PHP: Get theme styles 10126 $themeStyles = getSidebarThemeStyles($theme); 10127 101283. PHP: Store in data attributes 10129 data-theme="matrix" 10130 data-theme-styles='{...JSON...}' 10131 101324. JavaScript: Read on navigation 10133 const themeStyles = JSON.parse(container.dataset.themeStyles); 10134 101355. JavaScript: Apply to rebuilt elements 10136 style="background:${themeStyles.bg};" 10137``` 10138 10139**Result**: Theme persists across navigations! ✓ 10140 10141### All Themes Work Perfectly 10142 10143** Matrix**: 10144- Month change: Green ✓ 10145- Event list: Green ✓ 10146 10147** Purple**: 10148- Month change: Purple ✓ 10149- Event list: Purple ✓ 10150 10151** Professional**: 10152- Month change: Blue ✓ 10153- Event list: Blue ✓ 10154 10155** Pink**: 10156- Month change: Pink ✓ 10157- Event list: Pink ✓ 10158 10159**Fully consistent theming everywhere!** 10160 10161## Version 4.7.0 (2026-02-08) - THEMES FOR COMPACT CALENDAR! 10162 10163### ✨ Major Feature: Themes Now Apply to Compact Calendar 10164- **Added:** Full theme support for {{calendar-compact}} 10165- **Added:** Matrix, Purple, Professional, and Pink themes 10166- **Added:** Consistent theming across sidebar and calendar 10167- **Result:** Beautiful, cohesive appearance! 10168 10169### What's New 10170 10171**All 4 themes now work on the calendar**: 10172- **Matrix** - Green cyberpunk (default) 10173- **Purple** - Royal purple elegance 10174- **Professional** - Clean business blue 10175- **Pink** - Sparkly pink bling 10176 10177**Set in Admin Panel** → Theme applies everywhere! 10178 10179### Before vs After 10180 10181**BEFORE (v4.6.8)**: 10182``` 10183Sidebar: Themed (Matrix/Purple/Professional/Pink) ✓ 10184Calendar: Plain gray (no theme) ✗ 10185 10186Inconsistent appearance! 10187``` 10188 10189**AFTER (v4.7.0)**: 10190``` 10191Sidebar: Themed ✓ 10192Calendar: SAME THEME ✓ 10193 10194Perfectly consistent! ✨ 10195``` 10196 10197### Theme Showcase 10198 10199**Matrix Theme** (Green): 10200``` 10201┌─────────────────────────┐ 10202│ ◀ February 2026 ▶ │ ← Green header 10203├─────────────────────────┤ 10204│ Dark background │ 10205│ Green borders │ 10206│ Green text │ 10207│ Green glow effects │ 10208└─────────────────────────┘ 10209``` 10210 10211**Purple Theme**: 10212``` 10213┌─────────────────────────┐ 10214│ ◀ February 2026 ▶ │ ← Purple header 10215├─────────────────────────┤ 10216│ Dark purple background │ 10217│ Purple borders │ 10218│ Lavender text │ 10219│ Purple glow │ 10220└─────────────────────────┘ 10221``` 10222 10223**Professional Theme** (Light): 10224``` 10225┌─────────────────────────┐ 10226│ ◀ February 2026 ▶ │ ← Blue header 10227├─────────────────────────┤ 10228│ Light gray background │ 10229│ Blue accents │ 10230│ Professional appearance │ 10231│ Clean, business-ready │ 10232└─────────────────────────┘ 10233``` 10234 10235**Pink Theme** (Bling): 10236``` 10237┌─────────────────────────┐ 10238│ ◀ February 2026 ▶ │ ← Hot pink header 10239├─────────────────────────┤ 10240│ Dark pink background │ 10241│ Pink borders & glow │ 10242│ Pink text │ 10243│ Sparkle effects ✨ │ 10244└─────────────────────────┘ 10245``` 10246 10247### What's Themed 10248 10249**Calendar Container**: 10250- Background color 10251- Border color 10252- Shadow/glow effect 10253 10254**Calendar Header**: 10255- Background gradient 10256- Border color 10257- Text color 10258- Button colors 10259 10260**Calendar Grid**: 10261- Grid background 10262- Grid borders 10263- Header row colors 10264 10265**Calendar Cells**: 10266- Cell background 10267- Today cell highlight 10268- Text color 10269- Border colors 10270 10271### Implementation 10272 10273**Theme Detection**: 10274```php 10275// Same theme system as sidebar 10276$theme = $this->getSidebarTheme(); 10277$themeStyles = $this->getSidebarThemeStyles($theme); 10278``` 10279 10280**Applied to Container**: 10281```php 10282style="background:' . $themeStyles['bg'] . '; 10283 border:2px solid ' . $themeStyles['border'] . '; 10284 box-shadow:0 0 10px ' . $themeStyles['shadow'] . ';" 10285``` 10286 10287**Applied to Header**: 10288```php 10289style="background:' . $themeStyles['header_bg'] . '; 10290 color:' . $themeStyles['text_primary'] . ';" 10291``` 10292 10293**Applied to Cells**: 10294```php 10295$cellBg = $isToday ? 10296 $themeStyles['cell_today_bg'] : 10297 $themeStyles['cell_bg']; 10298``` 10299 10300### How to Change Theme 10301 10302**In Admin Panel**: 103031. Go to Admin → Calendar Management 103042. Click " Themes" tab 103053. Select theme (Matrix/Purple/Professional/Pink) 103064. Theme applies to BOTH sidebar and calendar! ✓ 10307 10308**No configuration needed** - Just select and enjoy! 10309 10310### Theme Colors 10311 10312**Matrix**: 10313- Background: `#242424` (dark gray) 10314- Border: `#00cc07` (matrix green) 10315- Text: `#00cc07` (green) 10316- Today: `#2a4d2a` (green highlight) 10317 10318**Purple**: 10319- Background: `#2a2030` (dark purple) 10320- Border: `#9b59b6` (royal purple) 10321- Text: `#b19cd9` (lavender) 10322- Today: `#3d2b4d` (purple highlight) 10323 10324**Professional**: 10325- Background: `#e8ecf1` (light blue-gray) 10326- Border: `#4a90e2` (business blue) 10327- Text: `#2c3e50` (dark blue-gray) 10328- Today: `#dce8f7` (light blue highlight) 10329 10330**Pink**: 10331- Background: `#1a0d14` (dark pink-black) 10332- Border: `#ff1493` (hot pink) 10333- Text: `#ff69b4` (pink) 10334- Today: `#3d2030` (pink highlight) 10335 10336### Consistency 10337 10338**Both use same theme**: 10339``` 10340Admin Panel → Set theme to "Purple" 10341 10342{{calendar}} sidebar: Purple theme ✓ 10343{{calendar-compact}}: Purple theme ✓ 10344{{calendar-panel}}: Will be themed next! ✓ 10345 10346All calendars match! ✨ 10347``` 10348 10349**Perfectly coordinated appearance!** 10350 10351## Version 4.6.8 (2026-02-07) - DOCUMENT NOHEADER PARAMETER 10352 10353### Documentation: Added noheader Parameter Info 10354- **Added:** Documentation for existing `noheader` parameter 10355- **Updated:** README with complete eventlist parameter list 10356- **Info:** Feature already existed, just wasn't documented! 10357 10358### The noheader Parameter 10359 10360**What it does**: Hides the clock/date/weather header in eventlist 10361 10362**Usage**: 10363``` 10364{{eventlist today noheader}} 10365``` 10366 10367**Before (with header)**: 10368``` 10369┌─────────────────────────────────┐ 10370│ 3:45 PM ️ 72° Feb 7 │ ← Clock header 10371├─────────────────────────────────┤ 10372│ 5 min load │ CPU │ Memory │ ← System stats 10373├─────────────────────────────────┤ 10374│ Today's Events │ 10375│ • 10:00 Team Meeting │ 10376│ • 2:00 Project Review │ 10377└─────────────────────────────────┘ 10378``` 10379 10380**After (noheader)**: 10381``` 10382┌─────────────────────────────────┐ 10383│ Today's Events │ ← No header! 10384│ • 10:00 Team Meeting │ 10385│ • 2:00 Project Review │ 10386└─────────────────────────────────┘ 10387 10388Cleaner, more compact! ✓ 10389``` 10390 10391### When to Use noheader 10392 10393**Use WITH header** (default): 10394- Dashboard view 10395- Want to see current time 10396- Want weather info 10397- Want system stats 10398 10399**Use WITHOUT header** (`noheader`): 10400- Embedded in page content 10401- Just want event list 10402- Minimal design 10403- Space-constrained 10404 10405### Complete eventlist Parameters 10406 10407**Date Parameters**: 10408``` 10409date=YYYY-MM-DD Show specific date 10410daterange=START:END Show date range 10411``` 10412 10413**Filter Parameters**: 10414``` 10415namespace=name Filter by namespace 10416``` 10417 10418**Display Parameters**: 10419``` 10420today Show today with live clock 10421noheader Hide clock/date/weather header 10422showchecked Show completed tasks 10423range=day|week|month Show day/week/month range 10424``` 10425 10426### Examples 10427 10428**Full featured** (dashboard): 10429``` 10430{{eventlist today}} 10431``` 10432Shows: Clock, weather, system stats, events ✓ 10433 10434**Minimal** (embedded): 10435``` 10436{{eventlist today noheader}} 10437``` 10438Shows: Just events ✓ 10439 10440**Date range without header**: 10441``` 10442{{eventlist daterange=2026-02-01:2026-02-28 noheader}} 10443``` 10444Shows: Events for February, no header ✓ 10445 10446**With namespace filter**: 10447``` 10448{{eventlist today namespace=work noheader}} 10449``` 10450Shows: Today's work events, no header ✓ 10451 10452### Implementation 10453 10454**Already existed in code** (line 833): 10455```php 10456$noheader = isset($data['noheader']) ? true : false; 10457``` 10458 10459**Applied at render** (line 1010): 10460```php 10461if ($today && !empty($allEvents) && !$noheader) { 10462 // Render clock header with date/time/weather 10463} 10464``` 10465 10466**Just wasn't documented!** Now it is. ✓ 10467 10468## Version 4.6.7 (2026-02-07) - REMOVE REDUNDANT FILTER BADGE 10469 10470### ✨ Improvement: Removed Filter Badge Above Sidebar 10471- **Removed:** Filter badge no longer shows above compact calendar 10472- **Reason:** Filtering is already clearly visible in the calendar view 10473- **Result:** Cleaner UI, less redundancy 10474 10475### What Changed 10476 10477**BEFORE**: 10478``` 10479┌─────────────────────────┐ 10480│ Filtering: work ✕ │ ← Badge above calendar 10481├─────────────────────────┤ 10482│ ◀ February 2026 ▶ │ 10483├─────────────────────────┤ 10484│ Calendar grid with │ 10485│ filtered events │ ← Already filtered 10486└─────────────────────────┘ 10487 10488Badge was redundant - you can already see 10489the filtering in the calendar! 10490``` 10491 10492**AFTER**: 10493``` 10494┌─────────────────────────┐ 10495│ ◀ February 2026 ▶ │ ← No badge! 10496├─────────────────────────┤ 10497│ Calendar grid with │ 10498│ filtered events │ ← Filtering visible here 10499└─────────────────────────┘ 10500 10501Cleaner, simpler UI ✓ 10502``` 10503 10504### Why Remove It? 10505 10506**Redundant Information**: 10507- Calendar already shows only filtered events 10508- Namespace badges on events show which namespace 10509- Badge added visual clutter without value 10510 10511**Better UX**: 10512- Less visual noise 10513- More space for content 10514- Filtering still obvious from event display 10515 10516**Code Cleanup**: 10517```php 10518// Old code (removed): 10519if ($namespace && $namespace !== '*' && ...) { 10520 $html .= '<div class="calendar-namespace-filter">'; 10521 $html .= 'Filtering: ' . $namespace . ' ✕'; 10522 $html .= '</div>'; 10523} 10524 10525// New code: 10526// Filter badge removed - filtering shown in calendar view only 10527``` 10528 10529### How Filtering Still Works 10530 10531**Filtering IS Active**: 10532- Calendar only shows events from selected namespace ✓ 10533- Event namespace badges show which namespace ✓ 10534- Clear filtering still works (in calendar) ✓ 10535 10536**Just No Badge**: 10537- No redundant "Filtering: work ✕" above calendar 10538- Cleaner, more professional appearance 10539 10540### What You Still See 10541 10542**Namespace Information**: 10543``` 10544Event with namespace badge: 10545┌────────────────────────┐ 10546│ 10:00 Team Meeting │ 10547│ [work] ←─────────┼─ Namespace badge on event 10548└────────────────────────┘ 10549``` 10550 10551**Filtered View**: 10552- Only events from selected namespace visible 10553- Empty dates show no events 10554- Clear which namespace you're viewing 10555 10556**No Need for Top Badge**: 10557- Already obvious from events shown 10558- Namespace badges provide context 10559- Less clutter! 10560 10561### Summary 10562 10563**Removed**: Filter badge above calendar 10564**Kept**: All filtering functionality 10565**Benefit**: Cleaner UI 10566 10567**Filtering works the same, just without the redundant badge!** ✨ 10568 10569## Version 4.6.6 (2026-02-07) - FIX: REMOVE FILTER BADGE IMMEDIATELY 10570 10571### Fixed: Filter Badge Now Disappears Immediately 10572- **Fixed:** Filter badge now removed from DOM immediately when clicking ✕ 10573- **Added:** Badge removal before page reload/AJAX call 10574- **Result:** Badge disappears instantly, no waiting for reload 10575 10576### The Problem 10577 10578**v4.6.5 behavior**: 10579``` 10580Click ✕ to clear filter 10581→ Page reloads or AJAX fires 10582→ Badge stays visible during reload ✗ 10583→ Badge finally disappears after reload ✓ 10584 10585User sees badge for 0.5-2 seconds after clicking ✕ 10586Feels laggy! ✗ 10587``` 10588 10589### The Fix 10590 10591**Immediately remove badge from DOM**: 10592 10593```javascript 10594window.clearNamespaceFilter = function(calId) { 10595 const container = document.getElementById(calId); 10596 10597 // IMMEDIATELY hide/remove the filter badge 10598 const filterBadge = container.querySelector('.calendar-namespace-filter'); 10599 if (filterBadge) { 10600 filterBadge.style.display = 'none'; // Hide instantly 10601 filterBadge.remove(); // Remove from DOM 10602 } 10603 10604 // THEN reload (AJAX or page reload) 10605 navCalendar(...) or window.location.href = ... 10606}; 10607``` 10608 10609### Before vs After 10610 10611**BEFORE (v4.6.5)**: 10612``` 10613Time 0ms: Click ✕ 10614┌─────────────────────────┐ 10615│ Filtering: work ✕ │ ← Still visible 10616├─────────────────────────┤ 10617 10618Time 500ms: Reload completes 10619┌─────────────────────────┐ 10620│ (no badge) │ ← Finally gone 10621├─────────────────────────┤ 10622 10623Delay: 500-2000ms ✗ 10624``` 10625 10626**AFTER (v4.6.6)**: 10627``` 10628Time 0ms: Click ✕ 10629┌─────────────────────────┐ 10630│ (no badge) │ ← Gone immediately! 10631├─────────────────────────┤ 10632 10633Time 500ms: Reload completes 10634┌─────────────────────────┐ 10635│ (no badge) │ ← Still gone 10636├─────────────────────────┤ 10637 10638Delay: 0ms ✓ 10639Instant feedback! ✓ 10640``` 10641 10642### Implementation 10643 10644**Two-step removal**: 10645 10646**Step 1**: Hide immediately 10647```javascript 10648filterBadge.style.display = 'none'; 10649// User sees badge disappear instantly 10650``` 10651 10652**Step 2**: Remove from DOM 10653```javascript 10654filterBadge.remove(); 10655// Clean up HTML 10656``` 10657 10658**Step 3**: Reload 10659```javascript 10660// Sidebar: Page reload 10661window.location.href = url.toString(); 10662 10663// Calendar: AJAX reload 10664navCalendar(calId, year, month, originalNamespace); 10665``` 10666 10667**Result**: Badge gone BEFORE reload starts ✓ 10668 10669### Why This Matters 10670 10671**User Experience**: 10672- Old: Click ✕ → Wait → Badge disappears 10673- New: Click ✕ → Badge disappears instantly 10674 10675**Perceived Performance**: 10676- Instant visual feedback 10677- Feels responsive 10678- Professional UX 10679 10680**Technical**: 10681- DOM manipulation is synchronous (instant) 10682- Network requests are asynchronous (slow) 10683- Do fast things first! 10684 10685**Badge now disappears the moment you click ✕!** ⚡ 10686 10687## Version 4.6.5 (2026-02-07) - FIX SIDEBAR FILTER BADGE CLEARING 10688 10689### Fixed: Filter Badge Not Clearing in Sidebar 10690- **Fixed:** Filter badge now properly clears when clicking ✕ button 10691- **Fixed:** Sidebar widget now reloads page without namespace filter 10692- **Changed:** clearNamespaceFilter now detects sidebar vs calendar and handles appropriately 10693 10694### The Problem 10695 10696**In {{calendar}} sidebar widget**: 10697``` 106981. Click namespace badge to filter 106992. Badge appears: "Filtering: work ✕" 107003. Click ✕ to clear filter 107014. Badge stays visible! ✗ 107025. Events still filtered! ✗ 10703``` 10704 10705**Root Cause**: Sidebar widget is server-rendered (PHP), not AJAX-reloaded like regular calendar. 10706 10707### The Fix 10708 10709**Detect widget type and handle appropriately**: 10710 10711```javascript 10712window.clearNamespaceFilter = function(calId) { 10713 const container = document.getElementById(calId); 10714 10715 // Check if this is a sidebar widget 10716 const sidebarContainer = document.getElementById('sidebar-widget-' + calId); 10717 10718 if (sidebarContainer) { 10719 // SIDEBAR: Reload page without namespace parameter 10720 const url = new URL(window.location.href); 10721 url.searchParams.delete('namespace'); 10722 window.location.href = url.toString(); // Page reload 10723 return; 10724 } 10725 10726 // REGULAR CALENDAR: AJAX reload 10727 navCalendar(calId, year, month, originalNamespace); 10728}; 10729``` 10730 10731### How It Works 10732 10733**Sidebar Widget** ({{calendar}} syntax): 10734``` 10735Rendered server-side with PHP 10736Cannot be AJAX-reloaded 10737Solution: Reload entire page without ?namespace=work parameter 10738``` 10739 10740**Regular Calendar** ({{calendar-compact}} or {{calendar-panel}}): 10741``` 10742Has AJAX reload capability 10743Solution: Call navCalendar() to reload via AJAX 10744``` 10745 10746### Before vs After 10747 10748**BEFORE (v4.6.4)**: 10749``` 10750Sidebar widget filtered by "work": 10751┌─────────────────────────┐ 10752│ Filtering: work ✕ │ ← Click ✕ 10753├─────────────────────────┤ 10754│ Today │ 10755│ • Work meeting │ 10756└─────────────────────────┘ 10757 10758After clicking ✕: 10759┌─────────────────────────┐ 10760│ Filtering: work ✕ │ ← Still there! ✗ 10761├─────────────────────────┤ 10762│ Today │ 10763│ • Work meeting │ ← Still filtered! ✗ 10764└─────────────────────────┘ 10765``` 10766 10767**AFTER (v4.6.5)**: 10768``` 10769Sidebar widget filtered by "work": 10770┌─────────────────────────┐ 10771│ Filtering: work ✕ │ ← Click ✕ 10772├─────────────────────────┤ 10773│ Today │ 10774│ • Work meeting │ 10775└─────────────────────────┘ 10776 10777After clicking ✕ → Page reloads: 10778┌─────────────────────────┐ 10779│ (no filter badge) │ ← Cleared! ✓ 10780├─────────────────────────┤ 10781│ Today │ 10782│ • Work meeting │ 10783│ • Personal task │ ← All events! ✓ 10784│ • Project review │ 10785└─────────────────────────┘ 10786``` 10787 10788### Technical Details 10789 10790**Why Page Reload for Sidebar?** 10791 10792Sidebar widget is rendered server-side: 10793```php 10794// In syntax.php: 10795return $this->renderSidebarWidget($events, $namespace, $calId); 10796// ↑ PHP generates complete HTML 10797// No AJAX reload endpoint exists for sidebar 10798``` 10799 10800**Solution**: Remove `?namespace=work` from URL and reload page 10801```javascript 10802const url = new URL(window.location.href); 10803url.searchParams.delete('namespace'); // Remove filter 10804window.location.href = url.toString(); // Reload 10805``` 10806 10807**Why AJAX for Regular Calendar?** 10808 10809Regular calendars have AJAX endpoints: 10810```javascript 10811// action.php handles: 10812action: 'load_month' → Returns new month data 10813navCalendar() → Fetches and rebuilds calendar 10814``` 10815 10816### Filter Badge Behavior 10817 10818**Showing Badge** (when filtering): 10819- Server-side: PHP renders badge in HTML 10820- Client-side: JavaScript adds badge to header 10821 10822**Clearing Badge**: 10823- Sidebar: Page reload (removes ?namespace from URL) 10824- Calendar: AJAX reload (badge removed in rebuildCalendar) 10825 10826**Now works correctly for both!** ✓ 10827 10828## Version 4.6.4 (2026-02-07) - HOTFIX: PHP SYNTAX ERROR 10829 10830### Critical Hotfix: Fixed PHP Parse Error 10831- **Fixed:** Template literal backticks causing PHP syntax error 10832- **Fixed:** Changed JavaScript template literals to concatenation 10833- **Fixed:** Admin page now loads without parse errors 10834 10835### The Problem 10836 10837**v4.6.3 broke admin page**: 10838``` 10839Error loading plugin calendar 10840ParseError: syntax error, unexpected identifier "s", 10841expecting "," or ";" 10842``` 10843 10844**Cause**: JavaScript template literals inside PHP echo 10845```php 10846echo '<script> 10847 let nsOptions = `<option value="">(default)</option>`; 10848 ↑ PHP sees backtick and gets confused! 10849</script>'; 10850``` 10851 10852**Why it broke**: Backticks (`) are special in PHP too! 10853 10854### The Fix 10855 10856**Changed from template literals to concatenation**: 10857 10858**BEFORE (broken)**: 10859```javascript 10860let nsOptions = `<option value="">(default)</option>`; 10861nsOptions += `<option value="${namespace}">${namespace}</option>`; 10862console.log('Edit recurring:', namespace); 10863``` 10864 10865**AFTER (fixed)**: 10866```javascript 10867let nsOptions = "<option value=\\"\\">(default)</option>"; 10868nsOptions += "<option value=\\"" + namespace + "\\">" + namespace + "</option>"; 10869console.log("Edit recurring:", namespace); 10870``` 10871 10872**Changes**: 10873- ✅ Backticks (`) → Double quotes (") 10874- ✅ Template literals (${var}) → Concatenation (" + var + ") 10875- ✅ Single quotes in console.log → Double quotes 10876- ✅ Properly escaped quotes for PHP echo 10877 10878### Technical Details 10879 10880**The Issue**: 10881```php 10882// Inside PHP echo string: 10883echo '<script> 10884 let x = `template ${literal}`; // ✗ Backtick breaks PHP! 10885</script>'; 10886``` 10887 10888**The Solution**: 10889```php 10890// Use regular string concatenation: 10891echo '<script> 10892 let x = "string " + variable; // ✓ Works in PHP echo! 10893</script>'; 10894``` 10895 10896**Quote Escaping**: 10897```javascript 10898// Double quotes inside PHP single-quote string: 10899'<option value=\"\">text</option>' 10900 ↑↑ Escaped for JavaScript 10901``` 10902 10903### Result 10904 10905**Before**: Admin page crashed with parse error ✗ 10906**After**: Admin page loads perfectly ✓ 10907 10908**No functionality changed - just syntax fix!** 10909 10910## Version 4.6.3 (2026-02-07) - FIX RECURRING EVENTS NAMESPACE DROPDOWN 10911 10912### Critical Fix: Namespace Dropdown in Recurring Events Section 10913- **Fixed:** Namespace dropdown now shows ALL available namespaces when editing 10914- **Fixed:** Current namespace now properly selected in dropdown 10915- **Fixed:** Namespace extraction from DOM now uses multiple methods 10916- **Added:** Console logging to debug namespace detection 10917 10918### The Problem 10919 10920**When editing from Recurring Events section**: 10921``` 10922Click "Edit" on recurring event 10923Namespace dropdown shows: 10924- (default) 10925- (nothing else!) ✗ 10926 10927Can't select any namespace! ✗ 10928``` 10929 10930**Why**: Broken namespace extraction logic 10931```javascript 10932// OLD CODE (broken): 10933const namespaces = Array.from(document.querySelectorAll("[id^=ns_]")) 10934 .map(el => { 10935 // Complex parsing that often failed 10936 const nsSpan = el.querySelector("span:nth-child(3)"); 10937 return nsSpan.textContent.replace(" ", "").trim(); 10938 }) 10939 .filter(ns => ns !== namespace); // Excluded current! ✗ 10940``` 10941 10942**Result**: Empty dropdown, can't change namespace! ✗ 10943 10944### The Fix 10945 10946**NEW CODE (robust)**: 10947```javascript 10948const namespaces = new Set(); 10949 10950// Method 1: Namespace explorer folders 10951document.querySelectorAll("[id^=ns_]").forEach(el => { 10952 const nsSpan = el.querySelector("span:nth-child(3)"); 10953 if (nsSpan) { 10954 let nsText = nsSpan.textContent.replace(" ", "").trim(); 10955 if (nsText && nsText !== "(default)") { 10956 namespaces.add(nsText); // ✓ 10957 } 10958 } 10959}); 10960 10961// Method 2: Datalist (backup method) 10962document.querySelectorAll("#namespaceList option").forEach(opt => { 10963 if (opt.value && opt.value !== "") { 10964 namespaces.add(opt.value); // ✓ 10965 } 10966}); 10967 10968// Build dropdown with ALL namespaces 10969let options = `<option value="">(default)</option>`; 10970 10971// Show current namespace as selected 10972if (namespace) { 10973 options += `<option value="${namespace}" selected>${namespace} (current)</option>`; 10974} 10975 10976// Show all other namespaces 10977for (const ns of nsArray) { 10978 if (ns !== namespace) { 10979 options += `<option value="${ns}">${ns}</option>`; 10980 } 10981} 10982``` 10983 10984**Result**: All namespaces visible! ✓ 10985 10986### How It Works Now 10987 10988**Before (Broken)**: 10989``` 10990Edit recurring event in "work" namespace 10991 10992Dropdown shows: 10993☐ (default) 10994 10995That's it! Can't select anything! ✗ 10996``` 10997 10998**After (Fixed)**: 10999``` 11000Edit recurring event in "work" namespace 11001 11002Dropdown shows: 11003☐ (default) 11004☑ work (current) ← Selected! 11005☐ personal 11006☐ projects 11007☐ meetings 11008 11009All namespaces available! ✓ 11010``` 11011 11012### Key Improvements 11013 11014**1. Dual extraction methods**: 11015- Primary: Parse namespace explorer DOM 11016- Backup: Read from datalist 11017- Result: Always finds namespaces ✓ 11018 11019**2. Current namespace included**: 11020```javascript 11021// OLD: Excluded current namespace 11022.filter(ns => ns !== namespace) ✗ 11023 11024// NEW: Include and mark as selected 11025options += `<option value="${namespace}" selected>${namespace} (current)</option>` ✓ 11026``` 11027 11028**3. Better error handling**: 11029```javascript 11030if (nsSpan) { // Check exists 11031 let nsText = nsSpan.textContent.replace(" ", "").trim(); 11032 if (nsText && nsText !== "(default)") { // Validate 11033 namespaces.add(nsText); 11034 } 11035} 11036``` 11037 11038**4. Console debugging**: 11039```javascript 11040console.log('Edit recurring - Current namespace:', namespace); 11041console.log('Available namespaces:', nsArray); 11042``` 11043 11044Open browser console (F12) to see what namespaces are detected! 11045 11046### Example Usage 11047 11048**Scenario**: Edit recurring "Team Meeting" in "work" namespace 11049 11050**Steps**: 110511. Go to Recurring Events section 110522. Click "Edit" on "Team Meeting" 110533. See namespace dropdown: 11054 - ☐ (default) 11055 - ☑ work (current) 11056 - ☐ personal 11057 - ☐ projects 110584. Select "personal" to move event 110595. Click "Save Changes" 110606. Event moved to "personal" namespace ✓ 11061 11062**Finally works as expected!** 11063 11064## Version 4.6.2 (2026-02-07) - FIX NAMESPACE PRESERVATION 11065 11066### Recurring Events Namespace Fix 11067- **Fixed:** Namespace now properly preserved when editing recurring events 11068- **Fixed:** Namespace selector now allows selecting any namespace (not just default) 11069- **Added:** Better logging for namespace preservation debugging 11070- **Added:** Console logging to track namespace values during edit 11071 11072### The Namespace Problem 11073 11074**Issue 1**: Can't select non-default namespace 11075``` 11076When editing recurring event: 11077- Dropdown shows all namespaces ✓ 11078- User selects "work" 11079- Form submits with "" (empty/default) ✗ 11080``` 11081 11082**Issue 2**: Namespace not preserved 11083``` 11084Recurring event in "personal" namespace 11085Edit the title only 11086After save: namespace changed to "" (default) ✗ 11087``` 11088 11089### The Fixes 11090 11091**Fix 1**: Better namespace preservation logic 11092```php 11093// When editing recurring event: 11094$existingNamespace = $existingEventData['namespace']; 11095 11096// Preserve if user didn't explicitly change it: 11097if (empty($namespace) || 11098 strpos($namespace, '*') !== false || 11099 strpos($namespace, ';') !== false) { 11100 // User didn't select or selected wildcard 11101 $namespace = $existingNamespace; // Keep existing! 11102} 11103``` 11104 11105**Fix 2**: Proper form population 11106```javascript 11107// When editing, set BOTH inputs: 11108namespaceHidden.value = event.namespace || ''; // Hidden (submitted) 11109namespaceSearch.value = event.namespace || '(default)'; // Visible 11110 11111// Plus logging: 11112console.log('Set namespace for editing:', event.namespace); 11113``` 11114 11115**Fix 3**: Added detailed logging 11116```php 11117error_log("Preserving namespace '$namespace' (received='$receivedNamespace')"); 11118error_log("Using new namespace '$namespace'"); 11119error_log("No existing namespace to preserve"); 11120``` 11121 11122### How It Works Now 11123 11124**Scenario 1**: Edit without changing namespace 11125``` 11126Event in "work" namespace 11127Edit title to "Updated Meeting" 11128Namespace field shows: "work" 11129Hidden input value: "work" 11130Result: Saved in "work" ✓ 11131``` 11132 11133**Scenario 2**: Change namespace during edit 11134``` 11135Event in "personal" namespace 11136Edit and select "work" namespace 11137Hidden input value: "work" 11138Result: Saved in "work" ✓ 11139``` 11140 11141**Scenario 3**: Edit with empty/wildcard namespace 11142``` 11143Event in "projects" namespace 11144Namespace field empty or shows "personal;work" 11145System preserves: "projects" 11146Result: Saved in "projects" ✓ 11147``` 11148 11149### Debugging 11150 11151Now with console logging, you can see: 11152```javascript 11153Set namespace for editing: work 11154Hidden value: work 11155``` 11156 11157And in PHP logs: 11158``` 11159Calendar saveEvent recurring: Loaded existing data - namespace='work' 11160Calendar saveEvent recurring: Preserving namespace 'work' (received='') 11161``` 11162 11163**Namespace preservation now works correctly!** 11164 11165## Version 4.6.1 (2026-02-07) - PRESERVE RECURRING EVENT DATA 11166 11167### Recurring Events Edit Fix 11168- **Fixed:** Editing recurring events now preserves unchanged fields 11169- **Fixed:** Empty fields no longer erase existing data 11170- **Added:** Smart merge of existing event data with new changes 11171 11172### The Problem 11173 11174**Before**: Editing erased unchanged fields! 11175``` 11176Original recurring event: 11177- Title: "Team Meeting" 11178- Time: "10:00 AM" 11179- Description: "Weekly standup with engineering team" 11180- Color: Red 11181 11182User edits ONLY the title to "Staff Meeting" 11183Form sends: 11184- Title: "Staff Meeting" ✓ 11185- Time: "" ✗ (empty because user didn't change it) 11186- Description: "" ✗ (empty) 11187- Color: "#3498db" ✗ (default blue) 11188 11189Result after save: 11190- Title: "Staff Meeting" ✓ 11191- Time: BLANK ✗ 11192- Description: BLANK ✗ 11193- Color: Blue ✗ 11194``` 11195 11196**All the other data was lost!** ✗ 11197 11198### The Fix 11199 11200**After**: Preserves unchanged data! 11201```php 11202if ($eventId && $isRecurring) { 11203 // Load existing event data 11204 $existingEventData = getExistingEventData($eventId); 11205 11206 // Merge: use new value OR keep existing 11207 $title = $title ?: $existingEventData['title']; 11208 $time = $time ?: $existingEventData['time']; 11209 $description = $description ?: $existingEventData['description']; 11210 $color = ($color === '#3498db') ? 11211 $existingEventData['color'] : $color; 11212} 11213``` 11214 11215**Now**: 11216``` 11217User edits ONLY the title to "Staff Meeting" 11218 11219System: 112201. Loads existing event data 112212. Merges: new title + existing time/description/color 112223. Saves merged data 11223 11224Result: 11225- Title: "Staff Meeting" ✓ (changed) 11226- Time: "10:00 AM" ✓ (preserved!) 11227- Description: "Weekly standup..." ✓ (preserved!) 11228- Color: Red ✓ (preserved!) 11229``` 11230 11231**Only changed fields are updated!** ✓ 11232 11233### How It Works 11234 11235**Step 1**: Load existing data 11236```php 11237$existingEventData = $this->getExistingEventData( 11238 $eventId, 11239 $date, 11240 $namespace 11241); 11242``` 11243 11244**Step 2**: Merge with new data 11245```php 11246// If new value is empty, use existing value 11247$title = $newTitle ?: $existingEventData['title']; 11248$time = $newTime ?: $existingEventData['time']; 11249$description = $newDesc ?: $existingEventData['description']; 11250 11251// Special handling for color (default is #3498db) 11252if ($newColor === '#3498db' && $existingEventData['color']) { 11253 $color = $existingEventData['color']; 11254} 11255``` 11256 11257**Step 3**: Save merged data 11258```php 11259createRecurringEvents(..., $title, $time, $description, $color, ...); 11260``` 11261 11262### Fields Preserved 11263 11264When editing recurring events, these fields are now preserved if not changed: 11265- ✅ Title (if left blank) 11266- ✅ Time (if not specified) 11267- ✅ End Time (if not specified) 11268- ✅ Description (if left empty) 11269- ✅ Color (if still default blue) 11270 11271**Edit only what you want to change - everything else stays!** 11272 11273## Version 4.6.0 (2026-02-07) - NAMESPACE RENAME & RECURRING FIX 11274 11275### ✨ New Feature: Rename Namespaces 11276- **Added:** ✏️ Rename button in Namespace Explorer 11277- **Added:** Rename all events in a namespace at once 11278- **Added:** Automatic cleanup of old directory structure 11279 11280### Critical Fix: Recurring Events Actually Edit Now! 11281- **Fixed:** Editing recurring events now deletes ALL instances 11282- **Fixed:** Previously only deleted one instance, left orphans 11283- **Fixed:** Recurring events properly regenerated on edit 11284 11285### Namespace Rename Feature 11286 11287**Before**: Could only delete namespaces, not rename 11288 11289**After**: Click ✏️ to rename! 11290 11291``` 11292 work (15 events) [3] [✏️] [️] 11293 ↑ NEW! 11294``` 11295 11296**How It Works**: 112971. Click ✏️ rename button 112982. Enter new namespace name 112993. All events moved to new namespace 113004. Event `namespace` field updated in JSON 113015. Old directory cleaned up 11302 11303**Example**: 11304``` 11305Rename: "work" → "business" 11306 11307Before: 11308/data/meta/work/calendar/*.json 11309Events: {namespace: "work"} 11310 11311After: 11312/data/meta/business/calendar/*.json 11313Events: {namespace: "business"} 11314``` 11315 11316**Implementation**: 11317```php 11318private function renameNamespace() { 11319 // 1. Validate new name 11320 // 2. Rename directory 11321 // 3. Update all event namespace fields in JSON 11322 // 4. Clean up old empty directories 11323} 11324``` 11325 11326### Recurring Events Fix - The Problem 11327 11328**Before**: Editing didn't work! 11329``` 11330Original recurring event generates: 11331- Event-0 (Mon, Feb 10) 11332- Event-1 (Mon, Feb 17) 11333- Event-2 (Mon, Feb 24) 11334 11335User edits Event-0, changes title to "Updated" 11336 11337What SHOULD happen: 11338- Delete Event-0, Event-1, Event-2 11339- Generate new instances with "Updated" title 11340 11341What ACTUALLY happened: 11342- Delete Event-0 only ✗ 11343- Generate new instances 11344- Result: Event-1 and Event-2 still show old title! ✗ 11345``` 11346 11347**After**: Properly deletes ALL instances! 11348 11349**The Fix**: 11350```php 11351private function deleteEvent() { 11352 $event = getEvent($eventId); 11353 11354 // Check if recurring 11355 if ($event['recurring'] && $event['recurringId']) { 11356 // Delete ALL instances with same recurringId 11357 deleteAllRecurringInstances($recurringId); 11358 } 11359 11360 // Then normal delete for spanning events 11361} 11362 11363private function deleteAllRecurringInstances($recurringId) { 11364 // Scan ALL calendar JSON files 11365 foreach (glob('*.json') as $file) { 11366 // Filter out events with matching recurringId 11367 $events = array_filter($events, function($event) { 11368 return $event['recurringId'] !== $recurringId; 11369 }); 11370 } 11371} 11372``` 11373 11374**Result**: 11375- Edit "Weekly Team Meeting" → ALL instances updated ✓ 11376- Delete recurring event → ALL instances deleted ✓ 11377- No more orphaned events! ✓ 11378 11379### Recurring Event Fields 11380 11381Every recurring event has: 11382```json 11383{ 11384 "id": "abc123-0", 11385 "recurring": true, 11386 "recurringId": "abc123", ← Links all instances 11387 ... 11388} 11389``` 11390 11391When editing/deleting, we find ALL events with same `recurringId` and remove them! 11392 11393**Finally, recurring events work properly!** 11394 11395## Version 4.5.2 (2026-02-07) - FIX SORTING & PINK TOOLTIPS 11396 11397### Important Events Sorting - ACTUALLY FIXED! 11398- **Fixed:** Important Events now REALLY sorted by date first, then time 11399- **Fixed:** renderSidebarSection was re-sorting and breaking the order 11400- **Changed:** Important Events use date-first sorting, Today/Tomorrow use time-only 11401 11402### Pink Theme Tooltip Bling! 11403- **Added:** Pink gradient tooltips (hot pink → light pink) 11404- **Added:** Glowing pink border on tooltips 11405- **Added:** Sparkling heart () appears next to tooltip! 11406- **Added:** Heart has pink glow drop-shadow 11407 11408### The Sorting Bug - Root Cause 11409 11410**Problem**: Two sorts were happening! 11411 11412**Sort #1** (Line 2047): Before rendering 11413```php 11414usort($importantEvents, ...) // Sort by date ✓ 11415``` 11416 11417**Sort #2** (Line 2751): Inside renderSidebarSection 11418```php 11419usort($events, ...) // Sort by TIME ONLY ✗ 11420// This was breaking the date order! 11421``` 11422 11423**The Fix**: Different sorting for different sections 11424```php 11425if ($title === 'Important Events') { 11426 // Sort by DATE first, then time 11427 usort($events, function($a, $b) { 11428 if ($dateA !== $dateB) { 11429 return strcmp($dateA, $dateB); // DATE first! 11430 } 11431 // Same date - sort by time 11432 return timeCompare($a, $b); 11433 }); 11434} else { 11435 // Today/Tomorrow - sort by TIME only (same date) 11436 usort($events, function($a, $b) { 11437 return timeCompare($a, $b); 11438 }); 11439} 11440``` 11441 11442**Result**: Important Events now CORRECTLY sorted! 11443``` 11444✓ Sun, Feb 8 - 3:30 PM Super Bowl 11445✓ Tue, Feb 10 - 11:30 AM Doctor visit 11446✓ Sat, Feb 14 - Valentine's Day (all-day) 11447✓ Sat, Feb 14 - 8:00 PM Crab Shack 11448``` 11449 11450### Pink Tooltip Magic! 11451 11452**Normal Tooltips**: Black background, plain 11453```css 11454background: rgba(0, 0, 0, 0.95); 11455color: #fff; 11456``` 11457 11458**Pink Theme Tooltips**: FABULOUS! 11459```css 11460/* Pink gradient background */ 11461background: linear-gradient(135deg, #ff1493 0%, #ff69b4 100%); 11462 11463/* Glowing pink border */ 11464border: 2px solid #ff85c1; 11465 11466/* Double glow shadow */ 11467box-shadow: 11468 0 0 15px rgba(255, 20, 147, 0.6), 11469 0 4px 12px rgba(0, 0, 0, 0.4); 11470 11471/* Bold text */ 11472font-weight: 600; 11473``` 11474 11475**Plus**: Sparkling heart next to tooltip! 11476```css 11477.sidebar-pink [data-tooltip]:after { 11478 content: ''; 11479 font-size: 12px; 11480 filter: drop-shadow(0 0 3px rgba(255, 20, 147, 0.8)); 11481} 11482``` 11483 11484**The Effect**: 11485``` 11486Hover over ⚠ conflict warning: 11487┌────────────────────┐ 11488│ Conflicts with: │ ← Pink gradient 11489│ • Event 1 (3PM) │ ← Pink border 11490│ • Event 2 (4PM) │ ← Pink glow 11491└────────────────────┘ 11492``` 11493 11494**Maximum glamour on tooltips too!** ✨ 11495 11496## Version 4.5.1 (2026-02-07) - FIX IMPORTANT EVENTS SORTING 11497 11498### Important Events Order Fixed 11499- **Fixed:** Important Events now sorted by date (earliest first) 11500- **Fixed:** Events on same date sorted by time (chronological) 11501- **Fixed:** All-day events appear last within each date 11502 11503### Sorting Issue 11504 11505**Before**: Random order 11506``` 11507Important Events: 11508 Valentine's Day (Sat, Feb 14) 1150911:30 AM Doctor visit (Tue, Feb 10) ← Feb 10 after Feb 14! 115103:30 PM Super Bowl (Sun, Feb 8) ← Feb 8 after Feb 14! 115118:00 PM Crab Shack (Sat, Feb 14) 11512``` 11513 11514**After**: Chronological order 11515``` 11516Important Events: 115173:30 PM Super Bowl (Sun, Feb 8) ← Earliest! 1151811:30 AM Doctor visit (Tue, Feb 10) 11519 Valentine's Day (Sat, Feb 14) ← All-day event 115208:00 PM Crab Shack (Sat, Feb 14) ← Same day, sorted by time 11521``` 11522 11523### Sorting Logic 11524 11525**Primary Sort**: By date 11526```php 11527strcmp($dateA, $dateB); // "2026-02-08" < "2026-02-14" 11528``` 11529 11530**Secondary Sort**: By time (within same date) 11531```php 11532// All-day events (no time) go last 11533if (empty($timeA) && !empty($timeB)) return 1; 11534if (!empty($timeA) && empty($timeB)) return -1; 11535 11536// Both have times - sort chronologically 11537$aMinutes = timeToMinutes($timeA); // "11:30" = 690 minutes 11538$bMinutes = timeToMinutes($timeB); // "20:00" = 1200 minutes 11539return $aMinutes - $bMinutes; // 690 < 1200 11540``` 11541 11542**Result**: 115431. Sun, Feb 8 - 3:30 PM (earliest date & time) 115442. Tue, Feb 10 - 11:30 AM (next date) 115453. Sat, Feb 14 - Valentine's Day (all-day, so last on Feb 14) 115464. Sat, Feb 14 - 8:00 PM (timed event on Feb 14) 11547 11548**Perfect chronological order for next 2 weeks!** ✓ 11549 11550## Version 4.5.0 (2026-02-07) - SPARKLE EDITION ✨ 11551 11552### EXTREME PINK BLING EFFECTS! 11553- **Added:** Click sparkles - 8 sparkles burst out on every click! 11554- **Added:** Auto-sparkles - random sparkles appear every 3 seconds 11555- **Added:** Hover mega-glow - sidebar glows BRIGHT on hover 11556- **Added:** Pulsing border glow - constantly breathing pink glow 11557- **Added:** Drop shadows on sparkles for extra depth 11558- **Added:** More sparkle emojis - hearts, diamonds, crowns, bows! 11559 11560### Sparkle Effects Breakdown 11561 11562**Click Sparkles** : 11563```javascript 11564// 8 sparkles burst out when you click anywhere! 11565for (let i = 0; i < 8; i++) { 11566 // Staggered appearance (40ms apart) 11567 createSparkle(x, y); 11568} 11569 11570// Sparkle emojis: 11571["✨", "", "", "⭐", "", "", "", "", "", ""] 11572``` 11573 11574**Each sparkle**: 11575- Starts at click point 11576- Flies outward 30-60px in random direction 11577- Spins 360 degrees 11578- Fades in and out 11579- Has pink glow drop-shadow 11580- Disappears after 1 second 11581 11582**Auto Sparkles** ⏰: 11583```javascript 11584// Random sparkle every 3 seconds 11585setInterval(() => { 11586 const x = Math.random() * width; 11587 const y = Math.random() * height; 11588 createSparkle(x, y); 11589}, 3000); 11590``` 11591 11592**Result**: Constant magical sparkles even without clicking! ✨ 11593 11594**Hover Mega-Glow** : 11595```css 11596.sidebar-pink:hover { 11597 box-shadow: 11598 0 0 30px rgba(255, 20, 147, 0.9), 11599 0 0 50px rgba(255, 20, 147, 0.5) !important; 11600} 11601``` 11602 11603**Result**: Sidebar EXPLODES with pink glow when you hover over it! 11604 11605**Pulsing Border Glow** : 11606```css 11607@keyframes pulse-glow { 11608 0%, 100% { 11609 box-shadow: 0 0 10px rgba(255, 20, 147, 0.4); 11610 } 11611 50% { 11612 box-shadow: 11613 0 0 25px rgba(255, 20, 147, 0.8), 11614 0 0 40px rgba(255, 20, 147, 0.4); 11615 } 11616} 11617 11618animation: pulse-glow 3s ease-in-out infinite; 11619``` 11620 11621**Result**: Border continuously breathes with pink glow! 11622 11623**Sparkle Animation** : 11624```css 11625@keyframes sparkle { 11626 0% { 11627 opacity: 0; 11628 transform: translate(0, 0) scale(0) rotate(0deg); 11629 } 11630 50% { 11631 opacity: 1; 11632 transform: translate(halfway) scale(1) rotate(180deg); 11633 } 11634 100% { 11635 opacity: 0; 11636 transform: translate(far) scale(0) rotate(360deg); 11637 } 11638} 11639``` 11640 11641**Result**: Sparkles spin, grow, shrink, and fly! 11642 11643### Complete Pink Bling Experience: 11644 11645**Always Active**: 11646- ✨ Pulsing pink border glow (3 second cycle) 11647- ✨ Auto-sparkles every 3 seconds 11648 11649**On Hover**: 11650- MEGA GLOW EFFECT (2x brightness!) 11651 11652**On Click**: 11653- 8 sparkles EXPLODE outward! 11654- Random emojis (hearts, stars, diamonds, crowns!) 11655- Each sparkle spins 360° while flying 11656- Pink glow drop-shadow on each sparkle 11657 11658**The Result**: 11659- Click anywhere = SPARKLE EXPLOSION! 11660- Hover anywhere = MEGA GLOW! ✨ 11661- Always breathing and sparkling! 11662- Maximum glamour! 11663- Wife approval: 1000%! 11664 11665**THIS IS THE MOST FABULOUS CALENDAR EVER!** ✨ 11666 11667## Version 4.4.2 (2026-02-07) - FINAL PINK POLISH 11668 11669### Pink Theme Final Touches 11670- **Fixed:** Add Event text now black (was bright pink, hard to read) 11671- **Fixed:** Clock border now COMPLETELY pink on all sides (no more green!) 11672- **Removed:** Text shadow on Add Event button (cleaner with black text) 11673 11674### Add Event Text - Black & Readable! 11675 11676**Before**: Bright pink text (#ff1493) on dark pink background 11677```php 11678$addBtnTextColor = $themeStyles['text_bright']; // #ff1493 - hard to read! 11679text-shadow: 0 0 3px #ff1493; // Glowy pink 11680``` 11681 11682**After**: Black text, no shadow, perfect contrast! 11683```php 11684$addBtnTextColor = $theme === 'pink' ? '#000000' : ...; 11685$addBtnTextShadow = $theme === 'pink' ? 'none' : ...; 11686``` 11687 11688**Result**: 11689- Black text pops against dark pink background ✓ 11690- Easy to read ✓ 11691- Professional look with bling ✓ 11692 11693### Clock Border - All Pink! 11694 11695**The Problem**: Inline style only set `border-bottom`, CSS set other sides to green 11696 11697**Before**: 11698```php 11699// Inline style (only bottom): 11700style="border-bottom:2px solid #ff1493;" 11701 11702// CSS (all sides): 11703.eventlist-today-header { 11704 border: 2px solid #00cc07; // Green on top/sides! 11705} 11706``` 11707 11708**After**: Inline style overrides ALL sides 11709```php 11710style="border:2px solid #ff1493;" // All 4 sides pink! 11711``` 11712 11713**Result**: Clock box now 100% pink border on all four sides! ✓ 11714 11715### What Changed: 11716 11717**Add Event Button**: 11718- Background: #b8156f (dark pink) ✓ 11719- Text: **#000000 (black)** ← NEW! 11720- Text shadow: **none** ← NEW! 11721- Glow: 0 0 10px pink ✓ 11722 11723**Clock Border**: 11724- Top: **#ff1493 (pink)** ← FIXED! 11725- Right: **#ff1493 (pink)** ← FIXED! 11726- Bottom: #ff1493 (pink) ✓ 11727- Left: **#ff1493 (pink)** ← FIXED! 11728 11729**Perfect pink theme - wife approved!** ✨ 11730 11731## Version 4.4.1 (2026-02-07) - PINK THEME PERFECTION 11732 11733### Pink Theme Complete Makeover 11734- **Fixed:** Clock border now completely pink (was green on sides/top) 11735- **Changed:** Today/Tomorrow/Important sections now different shades of pink 11736- **Changed:** Add Event button now dark pink (was clashing blue) 11737- **Changed:** System status bars now pink gradient (3 shades!) 11738 11739### All-Pink Everything! 11740 11741**Clock Border**: 11742```css 11743/* Before: Green border */ 11744border: 2px solid #00cc07; 11745 11746/* After: Hot pink border */ 11747.sidebar-pink .eventlist-today-header { 11748 border-color: #ff1493; 11749 box-shadow: 0 0 10px rgba(255, 20, 147, 0.4); 11750} 11751``` 11752 11753**Section Colors** (Different Pink Shades): 11754```php 11755// Before: Orange, green, purple 11756'Today' => '#ff9800', 11757'Tomorrow' => '#4caf50', 11758'Important' => '#9b59b6' 11759 11760// After: Hot pink, pink, light pink 11761'Today' => '#ff1493', // Hot pink (DeepPink) 11762'Tomorrow' => '#ff69b4', // Pink (HotPink) 11763'Important' => '#ff85c1' // Light pink 11764``` 11765 11766**Add Event Button**: 11767```php 11768// Before: Clashing blue 11769background: #3498db; 11770 11771// After: Dark pink with glow 11772background: #b8156f; // Dark pink 11773hover: #8b0f54; // Darker pink 11774shadow: 0 0 10px rgba(255, 20, 147, 0.5); 11775``` 11776 11777**System Status Bars** (Pink Gradient): 11778```css 11779/* 5-min load average */ 11780.sidebar-pink .eventlist-cpu-fill { 11781 background: #ff1493; /* Hot pink */ 11782 box-shadow: 0 0 5px rgba(255, 20, 147, 0.7); 11783} 11784 11785/* Realtime CPU */ 11786.sidebar-pink .eventlist-cpu-fill-purple { 11787 background: #ff69b4; /* Pink */ 11788 box-shadow: 0 0 5px rgba(255, 105, 180, 0.7); 11789} 11790 11791/* Memory */ 11792.sidebar-pink .eventlist-cpu-fill-orange { 11793 background: #ff85c1; /* Light pink */ 11794 box-shadow: 0 0 5px rgba(255, 133, 193, 0.7); 11795} 11796``` 11797 11798### Pink Theme Visual Hierarchy: 11799 11800**Darkest → Lightest Pink Shades**: 118011. Add Event button: #b8156f (dark pink) 118022. Today section: #ff1493 (hot pink / deep pink) 118033. System bar 1: #ff1493 (hot pink) 118044. Tomorrow section: #ff69b4 (pink) 118055. System bar 2: #ff69b4 (pink) 118066. Important section: #ff85c1 (light pink) 118077. System bar 3: #ff85c1 (light pink) 11808 11809**Result**: Beautiful pink gradient throughout entire sidebar! ✨ 11810 11811### What's Pink Now: 11812 11813✅ Sidebar background & border 11814✅ **Clock border** ← FIXED! 11815✅ Header gradient 11816✅ Week grid 11817✅ **Add Event button** ← FIXED! 11818✅ **Today section** ← Different shade! 11819✅ **Tomorrow section** ← Different shade! 11820✅ **Important section** ← Different shade! 11821✅ Event text & bars 11822✅ **System status bars** ← All 3 different pink shades! 11823✅ All shadows & glows 11824 11825**EVERYTHING is pink and fabulous!** ✨ 11826 11827## Version 4.4.0 (2026-02-07) - PINK BLING THEME & PROFESSIONAL SHADOWS 11828 11829### ✨ New Theme: Pink Bling! 11830- **Added:** Glamorous hot pink theme with maximum sparkle 11831- **Features:** Deep pink (#ff1493), extra glow, hearts and diamonds aesthetic 11832- **Perfect for:** Fabulous calendars that demand attention ✨ 11833 11834### Professional Theme Shadow Fix 11835- **Fixed:** Section headers now have subtle shadow (not glow) 11836- **Fixed:** Clicked day panel header has proper shadow 11837 11838### Pink Bling Theme Colors 11839 11840**Background & Borders**: 11841```php 11842'bg' => '#1a0d14', // Dark rich pink-black 11843'border' => '#ff1493', // Hot pink (DeepPink) 11844'shadow' => 'rgba(255, 20, 147, 0.4)', // Strong pink glow 11845``` 11846 11847**Text Colors**: 11848```php 11849'text_primary' => '#ff69b4', // Hot pink 11850'text_bright' => '#ff1493', // Deep pink 11851'text_dim' => '#ff85c1', // Light pink 11852``` 11853 11854**Week Grid**: 11855```php 11856'grid_bg' => '#2d1a24', // Dark purple-pink 11857'cell_bg' => '#1a0d14', // Dark 11858'cell_today_bg' => '#3d2030', // Highlighted purple-pink 11859``` 11860 11861**Special Effects**: 11862```php 11863'bar_glow' => '0 0 5px', // Extra sparkly glow! 11864'header_shadow' => '0 0 12px rgba(255, 20, 147, 0.6)' // Maximum bling! 11865``` 11866 11867### Professional Theme Shadow Fix 11868 11869**Before**: Section headers had colored glow 11870```php 11871box-shadow: 0 0 8px #3498db; // Blue glow - wrong! 11872``` 11873 11874**After**: Section headers have subtle shadow 11875```php 11876$headerShadow = ($theme === 'professional') ? 11877 '0 2px 4px rgba(0, 0, 0, 0.15)' : // Shadow for professional 11878 '0 0 8px ' . $accentColor; // Glow for others 11879``` 11880 11881**Result**: 11882- **Matrix/Purple/Pink**: Colored glow on headers ✓ 11883- **Professional**: Clean grey shadow (no glow) ✓ 11884 11885### All Four Themes: 11886 11887** Matrix Edition**: 11888- Dark green (#00cc07) 11889- Neon glow effects 11890- Hacker aesthetic 11891 11892** Purple Dream**: 11893- Elegant purple (#9b59b6) 11894- Violet glow effects 11895- Royal aesthetic 11896 11897** Professional Blue**: 11898- Clean grey/blue (#4a90e2) 11899- Subtle shadows (NO glow) 11900- Corporate aesthetic 11901 11902** Pink Bling** (NEW!): 11903- Hot pink (#ff1493) 11904- MAXIMUM sparkle & glow 11905- Glamorous aesthetic ✨ 11906 11907### Technical Implementation 11908 11909**Theme Added To**: 11910- `getSidebarThemeStyles()` - color definitions 11911- `getSidebarTheme()` - validation 11912- `saveSidebarTheme()` - admin save 11913- Admin panel - UI with preview 11914- All shadow/glow calculations 11915- JavaScript theme colors 11916- Clicked day panel colors 11917 11918**Perfect for users who want FABULOUS pink calendars!** ✨ 11919 11920## Version 4.3.1 (2026-02-07) - REDUCE TEXT GLOW & CONSISTENCY 11921 11922### Text Glow Refinement 11923- **Changed:** Reduced text glow from 3px to 2px (less intense) 11924- **Fixed:** Clicked day panel now has same text glow as sections 11925 11926### Text Glow Reduction 11927 11928**Before**: Text glow was too strong (3px) 11929```php 11930// Sections: 11931text-shadow: 0 0 3px #00cc07; // Too bright! 11932 11933// Clicked day panel: 11934text-shadow: 0 0 3px #00cc07; // Too bright! 11935``` 11936 11937**After**: Subtler text glow (2px) 11938```php 11939// Sections: 11940text-shadow: 0 0 2px #00cc07; // Just right ✓ 11941 11942// Clicked day panel: 11943text-shadow: 0 0 2px #00cc07; // Just right ✓ 11944``` 11945 11946**Visual Impact**: 11947- **Matrix**: Softer green glow, easier to read 11948- **Purple**: Softer purple glow, more elegant 11949- **Professional**: Still no glow (clean) 11950 11951### Consistency Fix 11952 11953**Before**: Sections had glow, clicked day panel had NO glow 11954 11955**After**: Both sections AND clicked day panel have matching subtle glow 11956 11957**Where Glow Appears**: 11958- ✅ Today section event text 11959- ✅ Tomorrow section event text 11960- ✅ Important section event text 11961- ✅ **Clicked day panel event text** ← NOW CONSISTENT! 11962 11963**Result**: 11964- Glow is less intense and easier on eyes ✓ 11965- All event text has consistent styling ✓ 11966- Matrix/Purple themes more refined ✓ 11967 11968### Technical Details 11969 11970**PHP (Sections)**: 11971```php 11972$textShadow = ($theme === 'professional') ? '' : 'text-shadow:0 0 2px ' . $titleColor . ';'; 11973``` 11974 11975**JavaScript (Clicked Day Panel)**: 11976```javascript 11977themeColors.text_shadow = 'text-shadow:0 0 2px #00cc07'; // Or purple 11978eventHTML += "style='...color:" + color + "; " + themeColors.text_shadow + ";'"; 11979``` 11980 11981**Perfect consistency and subtle elegance!** ✨ 11982 11983## Version 4.3.0 (2026-02-07) - IMPORTANT EVENTS FUTURE + REMOVE GREY 11984 11985### ✨ Important Events Enhancement 11986- **Changed:** Important events now show from next 2 weeks (not just current week) 11987- **Fixed:** Important events on Sunday after current week now visible 11988- **Changed:** Events loaded 2 weeks into future for Important section 11989 11990### Background Cleanup 11991- **Removed:** Grey/white backgrounds from Today/Tomorrow/Important sections 11992- **Removed:** Grey backgrounds from individual events 11993- **Result:** Clean transparent backgrounds, original dark Matrix look restored 11994 11995### Important Events - Future Coverage 11996 11997**Before**: Only showed Important events from current week 11998```php 11999if ($isImportant && $dateKey >= $weekStart && $dateKey <= $weekEnd) { 12000 $importantEvents[] = $event; 12001} 12002``` 12003 12004**After**: Shows Important events from today through next 2 weeks 12005```php 12006// Load events 2 weeks out 12007$twoWeeksOut = date('Y-m-d', strtotime($weekEnd . ' +14 days')); 12008 12009// Show all important events from today forward 12010if ($isImportant && $dateKey >= $todayStr) { 12011 $importantEvents[] = $event; 12012} 12013``` 12014 12015**Example**: 12016- Today: Saturday Feb 7 12017- Current week: Sun Feb 1 → Sat Feb 7 12018- Important events shown: Feb 7 → Feb 21 (today + 14 days) 12019 12020**Result**: Important events on Sunday Feb 8 (next week) now visible! ✓ 12021 12022### Background Removal 12023 12024**Before**: Light grey/white backgrounds added 12025```php 12026// Section background: 12027$sectionBg = 'rgba(255, 255, 255, 0.05)'; // Grey overlay 12028 12029// Event background: 12030$eventBg = 'rgba(255, 255, 255, 0.03)'; // Grey overlay 12031``` 12032 12033**After**: No backgrounds (transparent) 12034```php 12035// Section: No background property 12036<div style="padding:4px 0;"> 12037 12038// Event: No background property 12039<div style="padding:4px 6px; ..."> 12040``` 12041 12042**Result**: 12043- Clean, dark Matrix aesthetic restored ✓ 12044- Purple theme darker and more elegant ✓ 12045- Professional theme still has its light grey sidebar bg ✓ 12046- Events stand out with just color bars and borders ✓ 12047 12048### What Changed: 12049 12050**Sections (Today/Tomorrow/Important)**: 12051- ❌ No more grey overlay 12052- ✓ Transparent background 12053- ✓ Colored borders & glows remain 12054 12055**Individual Events**: 12056- ❌ No more grey overlay 12057- ✓ Transparent background 12058- ✓ Colored bars & borders remain 12059 12060**Perfect! Back to the original clean dark look with future Important events!** 12061 12062## Version 4.2.6 (2026-02-07) - FIX SECTION SHADOWS & DESCRIPTION COLOR 12063 12064### Final Theme Polish 12065- **Fixed:** Today/Tomorrow/Important section shadows now match theme 12066- **Fixed:** Event description text color now uses theme dim color 12067 12068### Section Shadow Fix 12069 12070**Problem**: Sections always had green glow regardless of theme 12071 12072**Before**: 12073```php 12074// Hardcoded green: 12075box-shadow: 0 0 5px rgba(0, 204, 7, 0.2); 12076``` 12077 12078**After**: 12079```php 12080// Theme-aware: 12081$sectionShadow = $theme === 'matrix' ? '0 0 5px rgba(0, 204, 7, 0.2)' : 12082 ($theme === 'purple' ? '0 0 5px rgba(155, 89, 182, 0.2)' : 12083 '0 2px 4px rgba(0, 0, 0, 0.1)'); 12084``` 12085 12086**Result**: 12087- **Matrix**: Green glow around sections ✓ 12088- **Purple**: Purple glow around sections ✓ 12089- **Professional**: Subtle grey shadow (no glow) ✓ 12090 12091### Description Color Fix 12092 12093**Problem**: Description text always green in clicked day panel 12094 12095**Before**: 12096```javascript 12097color: #00aa00; // Always green 12098``` 12099 12100**After**: 12101```javascript 12102color: themeColors.text_dim; // Theme dim color 12103``` 12104 12105**Result**: 12106- **Matrix**: Dim green (#00aa00) ✓ 12107- **Purple**: Dim purple (#8e7ab8) ✓ 12108- **Professional**: Grey (#7f8c8d) ✓ 12109 12110### Now 100% Theme Consistent 12111 12112Every single visual element respects theme: 12113- ✅ Sidebar background & border 12114- ✅ Header colors & shadows 12115- ✅ Week grid & cells 12116- ✅ Add Event button 12117- ✅ Section borders & **shadows** ← Fixed! 12118- ✅ Event titles & times 12119- ✅ Event **descriptions** ← Fixed! 12120- ✅ Clicked day panel 12121- ✅ Event bars & glows 12122 12123**Absolute perfection across all three themes!** ✨ 12124 12125## Version 4.2.5 (2026-02-07) - CLICKED DAY PANEL THEMES & GREY BACKGROUND 12126 12127### Theme Improvements 12128- **Fixed:** Clicked day panel now uses correct theme colors 12129- **Changed:** Professional Blue background now light grey (not white) 12130- **Added:** Theme colors passed to JavaScript for dynamic rendering 12131 12132### Clicked Day Panel Theming 12133 12134**Before**: Always blue regardless of theme 12135```javascript 12136// Hardcoded blue: 12137color:#00cc07; // Always green 12138background:#3498db; // Always blue 12139``` 12140 12141**After**: Theme-aware colors 12142```php 12143// PHP passes theme to JavaScript: 12144window.themeColors_XXX = { 12145 text_primary: '#00cc07' or '#b19cd9' or '#2c3e50', 12146 text_bright: '#00dd00' or '#d4a5ff' or '#4a90e2', 12147 text_shadow: '0 0 3px ...' or '', 12148 event_bg: 'rgba(...)', 12149 border_color: 'rgba(...)', 12150 bar_shadow: '0 0 3px' or '0 1px 2px rgba(...)' 12151}; 12152 12153// JavaScript uses theme colors: 12154color: themeColors.text_primary; 12155background: themeColors.event_bg; 12156``` 12157 12158**Result**: 12159- Matrix: Green panel with green glow ✓ 12160- Purple: Purple panel with purple glow ✓ 12161- Professional: Blue panel, no glow, clean ✓ 12162 12163### Professional Theme Background Change 12164 12165**Before**: Almost white (#f5f7fa, #ffffff) 12166```php 12167'bg' => '#f5f7fa', // Very light 12168'cell_bg' => '#ffffff', // Pure white 12169``` 12170 12171**After**: Light grey tones 12172```php 12173'bg' => '#e8ecf1', // Soft grey-blue 12174'cell_bg' => '#f5f7fa', // Light grey 12175'grid_bg' => '#d5dbe3', // Medium grey 12176'cell_today_bg' => '#dce8f7' // Highlighted grey-blue 12177``` 12178 12179**Visual Impact**: 12180- Sidebar: Light grey-blue background (#e8ecf1) 12181- Week cells: Lighter grey (#f5f7fa) 12182- Today cell: Highlighted blue-grey (#dce8f7) 12183- More depth and contrast ✓ 12184- Professional appearance ✓ 12185 12186### All Theme Elements Now Consistent 12187 12188**Matrix (Green)**: 12189- Sidebar: Dark (#242424) 12190- Clicked panel: Dark with green 12191- Text: Green with glow 12192 12193**Purple Dream**: 12194- Sidebar: Dark purple (#2a2030) 12195- Clicked panel: Dark with purple 12196- Text: Purple with glow 12197 12198**Professional Blue**: 12199- Sidebar: Light grey (#e8ecf1) 12200- Clicked panel: Light with blue 12201- Text: Dark grey, no glow 12202 12203**Perfect theme consistency everywhere!** 12204 12205## Version 4.2.4 (2026-02-07) - FIX TOMORROW LOADING & DOUBLE ENCODING 12206 12207### Critical Fixes 12208- **Fixed:** Tomorrow events not loaded when outside current week 12209- **Fixed:** `&` showing instead of `&` (double HTML encoding) 12210 12211### Issue 1: Tomorrow Not Loading 12212 12213**Problem**: Sidebar only loaded events for current week 12214- Today (Saturday): Week ends today 12215- Tomorrow (Sunday): Start of NEXT week 12216- Tomorrow events never loaded from data files! 12217 12218**Before**: 12219```php 12220// Only load current week 12221$end = new DateTime($weekEnd); 12222$end->modify('+1 day'); 12223$period = new DatePeriod($start, $interval, $end); 12224// If tomorrow > weekEnd, it's not in period! 12225``` 12226 12227**After**: 12228```php 12229// Check if tomorrow is outside week 12230$tomorrowDate = date('Y-m-d', strtotime('+1 day')); 12231if ($tomorrowDate > $weekEnd) { 12232 // Extend to include tomorrow 12233 $end = new DateTime($tomorrowDate); 12234} 12235$end->modify('+1 day'); 12236$period = new DatePeriod($start, $interval, $end); 12237``` 12238 12239**Result**: Tomorrow events now loaded even at week boundary! ✓ 12240 12241### Issue 2: Double HTML Encoding 12242 12243**Problem**: `&` characters showing as `&` 12244 12245**Cause**: Double encoding on line 2625 and 2681 12246```php 12247// Line 2625: 12248$title = htmlspecialchars($event['title']); // "Coffee & Tea" → "Coffee & Tea" 12249 12250// Line 2681: 12251$html .= htmlspecialchars($title); // "Coffee & Tea" → "Coffee &amp; Tea" ❌ 12252``` 12253 12254**Fixed**: 12255```php 12256// Line 2625: 12257$title = htmlspecialchars($event['title']); // Encode once 12258 12259// Line 2681: 12260$html .= $title; // Use already-encoded value ✓ 12261``` 12262 12263**Result**: `&` displays correctly! ✓ 12264 12265### Both Fixes Critical 12266 12267These were **two separate bugs**: 122681. **Loading bug**: Tomorrow events not read from files 122692. **Display bug**: Double-encoding text 12270 12271Both needed fixing for Tomorrow section to work properly! 12272 12273## Version 4.2.3 (2026-02-07) - FIX TOMORROW SECTION AT WEEK BOUNDARY 12274 12275### Critical Fix 12276- **Fixed:** Tomorrow section missing when tomorrow is outside current week 12277- **Fixed:** Today section now always shows regardless of week boundaries 12278- **Changed:** Today/Tomorrow processed BEFORE week boundary checks 12279 12280### The Problem 12281 12282**Scenario**: Today is Saturday (last day of week) 12283- Week: Feb 1 (Sun) → Feb 7 (Sat) ← Today 12284- Tomorrow: Feb 8 (Sun) ← **Start of NEXT week** 12285 12286**BROKEN Logic** (v4.2.2): 12287```php 12288foreach ($events as $dateKey => $dayEvents) { 12289 if ($dateKey < $weekStart) continue; // Skip old events 12290 12291 // ...week processing... 12292 12293 if ($dateKey === $tomorrowStr) { // ← Never reached! 12294 $tomorrowEvents[] = $event; // Tomorrow > weekEnd 12295 } 12296} 12297``` 12298 12299**Result**: Tomorrow events never added because loop skipped them! ❌ 12300 12301### The Fix 12302 12303**Process Today/Tomorrow FIRST**: 12304```php 12305foreach ($events as $dateKey => $dayEvents) { 12306 $eventsWithConflicts = $this->detectTimeConflicts($dayEvents); 12307 12308 foreach ($eventsWithConflicts as $event) { 12309 // ALWAYS process Today and Tomorrow first! 12310 if ($dateKey === $todayStr) { 12311 $todayEvents[] = $event; // ✓ Always shows 12312 } 12313 if ($dateKey === $tomorrowStr) { 12314 $tomorrowEvents[] = $event; // ✓ Always shows 12315 } 12316 12317 // THEN check week boundaries for grid 12318 if ($dateKey >= $weekStart && $dateKey <= $weekEnd) { 12319 $weekEvents[$dateKey][] = $event; 12320 } 12321 12322 // Important events still week-only 12323 if ($isImportant && $dateKey >= $weekStart && $dateKey <= $weekEnd) { 12324 $importantEvents[] = $event; 12325 } 12326 } 12327} 12328``` 12329 12330### What Changed 12331 12332**Before**: 123331. Skip events < weekStart ❌ 123342. Process week grid 123353. Try to add Today/Tomorrow ← **Failed if outside week** 123364. Add Important events 12337 12338**After**: 123391. **Always add Today events** ✓ 123402. **Always add Tomorrow events** ✓ 123413. Add to week grid if in range 123424. Add Important events if in range 12343 12344**Result**: 12345- Today section: ✓ Always shows 12346- Tomorrow section: ✓ Always shows (even at week boundary!) 12347- Week grid: ✓ Only current week 12348- Important: ✓ Only current week 12349 12350### Edge Cases Fixed 12351 12352**Saturday → Sunday transition**: 12353- Today (Sat): Shows in Today section ✓ 12354- Tomorrow (Sun): Shows in Tomorrow section ✓ 12355- Week grid: Only shows Sat (today) ✓ 12356 12357**Sunday → Monday transition**: 12358- Today (Sun): Shows in Today section ✓ 12359- Tomorrow (Mon): Shows in Tomorrow section ✓ 12360- Week grid: Shows both Sun and Mon ✓ 12361 12362**Perfect! Tomorrow section now always works!** 12363 12364## Version 4.2.2 (2026-02-07) - SUNDAY NOT SATURDAY! 12365 12366### Corrected Week Options 12367- **Changed:** Week start options are now Monday vs **Sunday** (not Saturday!) 12368- **Changed:** Default is **Sunday** (US/Canada standard) 12369- **Fixed:** Day names array for Sunday start: S M T W T F S 12370 12371### Correct Week Start Options 12372 12373**Sunday Start** (Default): 12374- Grid shows: **S M T W T F S** 12375- Week: Sunday → Saturday 12376- US/Canada standard 12377- Most common worldwide 12378 12379**Monday Start**: 12380- Grid shows: **M T W T F S S** 12381- Week: Monday → Sunday 12382- ISO 8601 standard 12383- Common in Europe 12384 12385### Technical Changes 12386 12387**All References Updated**: 12388```php 12389// Changed from 'saturday' to 'sunday' in: 12390- Admin validation 12391- Week calculation logic 12392- Day names array 12393- Default value 12394- Comments 12395``` 12396 12397**Sunday Calculation** (when today is Saturday): 12398```php 12399$today = date('w'); // 0=Sun, 6=Sat 12400if ($today == 0) { 12401 $weekStart = date('Y-m-d'); // Today! 12402} else { 12403 // Go back $today days to last Sunday 12404 $weekStart = date('Y-m-d', strtotime('-' . $today . ' days')); 12405} 12406``` 12407 12408**Examples**: 12409- Today (Saturday): Week = Sun Feb 1 → Sat Feb 7 12410- Tomorrow (Sunday): Week = Sun Feb 8 → Sat Feb 14 12411 12412**Sorry for the confusion - it's Sunday not Saturday!** 12413 12414## Version 4.2.1 (2026-02-07) - FIX WEEK CALCULATION ON SATURDAY 12415 12416### Critical Fix 12417- **Fixed:** Week calculation broken when today is Saturday 12418- **Fixed:** Events not showing in Today/Important sections 12419- **Fixed:** Week grid event bars missing 12420- **Changed:** Default week start is Saturday (matches main calendar) 12421 12422### Technical Details 12423 12424**The Bug**: 12425```php 12426// BROKEN (v4.2.0): 12427$weekStart = date('Y-m-d', strtotime('saturday this week')); 12428// When TODAY is Saturday, this is ambiguous and fails! 12429 12430// FIXED (v4.2.1): 12431$today = date('w'); // 0 (Sun) to 6 (Sat) 12432if ($today == 6) { 12433 $weekStart = date('Y-m-d'); // Today! 12434} else { 12435 $daysBack = ($today == 0) ? 1 : ($today + 1); 12436 $weekStart = date('Y-m-d', strtotime('-' . $daysBack . ' days')); 12437} 12438$weekEnd = date('Y-m-d', strtotime($weekStart . ' +6 days')); 12439``` 12440 12441**Why It Failed**: 12442- `strtotime('saturday this week')` is ambiguous when run ON a Saturday 12443- PHP may interpret it as "next Saturday" or fail 12444- Result: Week range was wrong, events filtered out 12445 12446**The Fix**: 12447- Explicit calculation using day-of-week math 12448- Saturday (day 6): weekStart = today 12449- Sunday (day 0): weekStart = yesterday 12450- Monday-Friday: calculate days back to last Saturday 12451 12452**Result**: Works reliably every day of the week! 12453 12454**Default Changed**: Saturday start (was Monday in 4.2.0) 12455- Matches main calendar behavior 12456- Users can still switch to Monday in settings 12457 12458## Version 4.2.0 (2026-02-07) - WEEK START DAY SELECTOR 12459 12460### ✨ New Feature 12461- **Added:** Week start day selector in Themes tab 12462- **Added:** Choose between Monday (ISO standard) or Saturday week start 12463- **Added:** Week grid and all events now respect the selected start day 12464- **Changed:** Themes tab renamed to "Sidebar Widget Settings" 12465 12466### Week Start Options 12467 12468**Monday Start** (Default): 12469- Grid shows: M T W T F S S 12470- Week runs: Monday → Sunday 12471- ISO 8601 standard 12472- Common in Europe, most of world 12473 12474**Saturday Start**: 12475- Grid shows: S S M T W T F 12476- Week runs: Saturday → Friday 12477- Common in Middle East 12478- Sabbath-observant communities 12479 12480### Technical Details 12481 12482**Configuration**: 12483```php 12484// Saved in: data/meta/calendar_week_start.txt 12485// Values: 'monday' or 'saturday' 12486 12487// Week calculation: 12488if ($weekStartDay === 'saturday') { 12489 $weekStart = date('Y-m-d', strtotime('saturday this week')); 12490 $weekEnd = date('Y-m-d', strtotime('friday next week')); 12491} else { 12492 $weekStart = date('Y-m-d', strtotime('monday this week')); 12493 $weekEnd = date('Y-m-d', strtotime('sunday this week')); 12494} 12495``` 12496 12497**Day Names Array**: 12498```php 12499// Monday start: ['M', 'T', 'W', 'T', 'F', 'S', 'S'] 12500// Saturday start: ['S', 'S', 'M', 'T', 'W', 'T', 'F'] 12501``` 12502 12503**What Changes**: 12504- Week grid day letters 12505- Week grid date sequence 12506- Today/Tomorrow/Important event date ranges 12507- Week event grouping 12508 12509**What Stays Same**: 12510- All themes still work 12511- Event data unchanged 12512- Main calendar unaffected 12513 12514### How to Change: 12515 125161. Admin → Calendar → Themes tab 125172. Under "Week Start Day" section 125183. Select Monday or Saturday 125194. Click "Save Settings" 125205. Refresh sidebar to see changes 12521 12522**Perfect for international users or religious observances!** 12523 12524## Version 4.1.4 (2026-02-07) - WEEK STARTS SUNDAY & LIGHTER BACKGROUNDS 12525 12526### ️ Calendar Improvements 12527- **Changed:** Week grid now starts on Sunday and ends on Saturday (matches main calendar) 12528- **Changed:** Event section backgrounds much lighter (almost white) 12529- **Changed:** Individual event backgrounds lighter and more readable 12530- **Changed:** Event borders now theme-colored 12531 12532### Technical Details 12533 12534**Week Start Change**: 12535```php 12536// Before: 12537$weekStart = date('Y-m-d', strtotime('monday this week')); 12538$weekEnd = date('Y-m-d', strtotime('sunday this week')); 12539$dayNames = ['M', 'T', 'W', 'T', 'F', 'S', 'S']; 12540 12541// After: 12542$weekStart = date('Y-m-d', strtotime('sunday this week')); 12543$weekEnd = date('Y-m-d', strtotime('saturday this week')); 12544$dayNames = ['S', 'M', 'T', 'W', 'T', 'F', 'S']; 12545``` 12546 12547**Background Colors**: 12548```php 12549// Section backgrounds (Today, Tomorrow, Important): 12550Matrix: rgba(255, 255, 255, 0.05) // Very light overlay 12551Purple: rgba(255, 255, 255, 0.08) // Slightly lighter 12552Professional: rgba(255, 255, 255, 0.95) // Almost white! 12553 12554// Individual event backgrounds: 12555Matrix: rgba(255, 255, 255, 0.03) // Subtle 12556Purple: rgba(255, 255, 255, 0.05) // Light 12557Professional: rgba(255, 255, 255, 0.5) // Semi-transparent white 12558``` 12559 12560**Event Borders**: 12561```php 12562Matrix: rgba(0, 204, 7, 0.2) // Green 12563Purple: rgba(155, 89, 182, 0.2) // Purple 12564Professional: rgba(74, 144, 226, 0.2) // Blue 12565``` 12566 12567### Visual Result: 12568 12569**Before**: Dark backgrounds made text hard to read 12570**After**: Light backgrounds make events pop and text very readable 12571 12572**Week Grid**: 12573``` 12574Before: [M][T][W][T][F][S][S] 12575After: [S][M][T][W][T][F][S] ← Now matches main calendar! 12576``` 12577 12578## Version 4.1.3 (2026-02-07) - EVENT TEXT THEME COLORS 12579 12580### Final Theme Polish 12581- **Fixed:** Event titles in Today/Tomorrow/Important sections now use theme colors 12582- **Fixed:** Event times now use theme bright color 12583- **Fixed:** Event dates use theme dim color 12584- **Fixed:** Task checkboxes use theme bright color 12585- **Fixed:** Event color bars use theme-appropriate shadows 12586- **Fixed:** No text shadows on Professional theme 12587 12588### Technical Details 12589 12590**Event Text Colors**: 12591```php 12592// Matrix: 12593- Title: #00cc07 (green) 12594- Time: #00dd00 (bright green) 12595- Date: #00aa00 (dim green) 12596- Text shadow: 0 0 3px (glow) 12597 12598// Purple: 12599- Title: #b19cd9 (lavender) 12600- Time: #d4a5ff (bright purple) 12601- Date: #8e7ab8 (dim purple) 12602- Text shadow: 0 0 3px (glow) 12603 12604// Professional: 12605- Title: #2c3e50 (dark grey) 12606- Time: #4a90e2 (blue) 12607- Date: #7f8c8d (grey) 12608- Text shadow: none (clean) 12609``` 12610 12611**Color Bar Shadows**: 12612```php 12613// Matrix & Purple: Glow effect 12614box-shadow: 0 0 3px [event-color]; 12615 12616// Professional: Subtle shadow 12617box-shadow: 0 1px 2px rgba(0,0,0,0.2); 12618``` 12619 12620### What's Now Fully Themed: 12621 12622✅ Sidebar background & border 12623✅ Header (clock box) background, border, text 12624✅ Week grid background, borders, cells 12625✅ Week grid day letters & numbers 12626✅ Week grid event bars & "+N more" text 12627✅ Add Event button background & text 12628✅ Today/Tomorrow/Important event titles 12629✅ Event times 12630✅ Event dates (Important section) 12631✅ Task checkboxes 12632✅ Event color bars 12633✅ All text shadows (glow vs none) 12634 12635**Every single element now respects the theme!** 12636 12637## Version 4.1.2 (2026-02-07) - COMPLETE THEME INTEGRATION 12638 12639### Theme Improvements 12640- **Fixed:** Week calendar grid now uses theme colors (purple/blue) 12641- **Fixed:** Add Event button now uses theme colors 12642- **Fixed:** Clock box border now matches theme 12643- **Fixed:** All text shadows respect theme (no glow on professional) 12644- **Fixed:** Event bars use theme-appropriate shadows 12645 12646### Technical Details 12647 12648**Week Grid Theming**: 12649```php 12650// Matrix: Dark green (#1a3d1a) background, green (#00cc07) borders 12651// Purple: Dark purple (#3d2b4d) background, purple (#9b59b6) borders 12652// Professional: Light grey (#e8ecf1) background, blue (#4a90e2) borders 12653``` 12654 12655**Add Event Button**: 12656```php 12657// Matrix: Dark green (#006400) with bright green text 12658// Purple: Purple (#7d3c98) with lavender text 12659// Professional: Blue (#3498db) with white text 12660``` 12661 12662**Text Shadows**: 12663```php 12664// Matrix & Purple: Glow effects (text-shadow: 0 0 6px color) 12665// Professional: No glow (clean look) 12666``` 12667 12668**CSS Overrides**: 12669```css 12670/* Purple theme */ 12671.sidebar-purple .eventlist-today-header { 12672 border-color: #9b59b6; 12673 box-shadow: 0 0 8px rgba(155, 89, 182, 0.2); 12674} 12675 12676/* Professional theme */ 12677.sidebar-professional .eventlist-today-header { 12678 border-color: #4a90e2; 12679 box-shadow: 0 2px 4px rgba(0, 0, 0, 0.1); 12680} 12681``` 12682 12683### What Changed Per Theme: 12684 12685**Purple Dream**: 12686- Week grid: Purple borders and dark purple background 12687- Add Event: Purple button with lavender text 12688- Clock box: Purple border with purple glow 12689- Event bars: Purple glow instead of green 12690- All text: Purple/lavender shades 12691 12692**Professional Blue**: 12693- Week grid: Blue borders and light grey background 12694- Add Event: Blue button with white text 12695- Clock box: Blue border with subtle shadow (no glow) 12696- Event bars: Subtle shadows (no glow) 12697- All text: Dark grey and blue shades 12698 12699**Matrix Edition**: Unchanged (still perfect green theme!) 12700 12701## Version 4.1.1 (2026-02-07) - THEMES TAB & TOOLTIP LEFT POSITIONING 12702 12703### ✨ New Features 12704- **Added:** Themes tab in admin for sidebar widget theming 12705- **Added:** Three visual themes: Matrix (green), Purple Dream (purple), Professional Blue (blue/grey) 12706- **Added:** Theme selector with live previews 12707- **Added:** Theme persistence across page loads 12708 12709### Available Themes 12710 12711**Matrix Edition** (Default): 12712- Dark background (#242424) 12713- Green accents (#00cc07) 12714- Neon glow effects 12715- Original Matrix styling 12716 12717**Purple Dream**: 12718- Dark purple background (#2a2030) 12719- Purple/violet accents (#9b59b6) 12720- Elegant purple glow 12721- Rich purple color scheme 12722 12723**Professional Blue**: 12724- Light grey background (#f5f7fa) 12725- Blue accents (#4a90e2) 12726- Clean professional look 12727- Subtle shadows instead of glow 12728 12729### Bug Fix 12730- **Fixed:** Tooltips now go UP and to the LEFT (was going right) 12731- **Changed:** Tooltip offset from `rect.right` to `rect.left - 150px` 12732 12733### Technical Details 12734 12735**Theme System**: 12736```php 12737// Saved in: data/meta/calendar_theme.txt 12738// Applied dynamically in syntax.php 12739$theme = $this->getSidebarTheme(); // 'matrix', 'purple', or 'professional' 12740$styles = $this->getSidebarThemeStyles($theme); 12741 12742// Styles include: 12743- bg, border, shadow 12744- header_bg, header_border, header_shadow 12745- text_primary, text_bright, text_dim 12746- grid_bg, grid_border 12747- cell_bg, cell_today_bg 12748``` 12749 12750**Theme Changes**: 12751- Header background gradient 12752- Border colors 12753- Text colors 12754- Shadow/glow effects 12755- Grid colors 12756 12757**How to Change**: 127581. Admin → Calendar → Themes tab 127592. Select desired theme 127603. Click "Save Theme" 127614. Refresh page to see changes 12762 12763### Notes 12764- Themes only affect sidebar widget appearance 12765- Main calendar view unchanged 12766- Theme setting stored in `data/meta/calendar_theme.txt` 12767- Safe to switch themes - no data affected 12768 12769## Version 4.1.0 (2026-02-07) - FIX EVENT SORTING & TOOLTIP POSITIONING 12770 12771### Bug Fixes 12772- **Fixed:** Events now sort chronologically by time (was using string comparison) 12773- **Fixed:** Tooltip positioning using JavaScript like system tooltips 12774- **Fixed:** All-day events appear first, then events in time order 12775 12776### Technical Details 12777 12778**Event Sorting Fix**: 12779```php 12780// BROKEN (v4.0.9): 12781return strcmp($aTime, $bTime); 12782// String comparison: "10:00" < "8:00" because "1" < "8" 12783// Result: 10:00 AM shown BEFORE 8:00 AM ❌ 12784 12785// FIXED (v4.1.0): 12786$aMinutes = $this->timeToMinutes($aTime); // 8:00 = 480 12787$bMinutes = $this->timeToMinutes($bTime); // 10:00 = 600 12788return $aMinutes - $bMinutes; 12789// Result: 8:00 AM shown BEFORE 10:00 AM ✓ 12790``` 12791 12792**Example Before Fix**: 12793``` 12794 Weekend Ticket Duty (all-day) 127958:00 AM START TICKETS 1279610:00 AM Soul Winning ← Wrong! 127979:45 AM Coffee ← Should be before 10:00 AM 12798``` 12799 12800**Example After Fix**: 12801``` 12802 Weekend Ticket Duty (all-day) 128038:00 AM START TICKETS 128049:45 AM Coffee ← Correct! 1280510:00 AM Soul Winning 12806``` 12807 12808**Tooltip Positioning**: 12809- Added JavaScript to dynamically position tooltips using `getBoundingClientRect()` 12810- Uses CSS custom properties `--tooltip-left` and `--tooltip-top` 12811- Positioned on `mouseenter` event 12812- Matches system tooltip implementation (no cutoff) 12813 12814**JavaScript Implementation**: 12815```javascript 12816element.addEventListener("mouseenter", function() { 12817 const rect = element.getBoundingClientRect(); 12818 element.style.setProperty("--tooltip-left", (rect.right - 10) + "px"); 12819 element.style.setProperty("--tooltip-top", (rect.top - 30) + "px"); 12820}); 12821``` 12822 12823**Result**: Tooltips now extend beyond sidebar without cutoff, positioned dynamically! 12824 12825## Version 4.0.9 (2026-02-07) - COMPACT TOOLTIPS & OVERFLOW FIX 12826 12827### UI Improvements 12828- **Fixed:** Sidebar tooltips no longer cut off at sidebar edge 12829- **Fixed:** Changed inline `overflow:hidden` to `overflow:visible` in sidebar 12830- **Changed:** Main calendar conflict tooltip now much smaller (was too big) 12831 12832### Technical Details 12833 12834**Sidebar Overflow Fix**: 12835```php 12836// Before (line 2005): 12837style="...overflow:hidden..." // ← Blocked tooltips! 12838 12839// After: 12840style="...overflow:visible..." // ← Tooltips extend beyond! 12841``` 12842 12843**The Problem**: Inline `overflow:hidden` overrode CSS `overflow:visible !important` 12844 12845**Main Calendar Tooltip Size**: 12846```css 12847/* Before: */ 12848.conflict-tooltip { 12849 border: 2px solid #ff9800; 12850 border-radius: 6px; 12851 padding: 8px 12px; 12852 font-size: 12px; 12853 min-width: 200px; 12854 max-width: 350px; 12855} 12856 12857/* After: */ 12858.conflict-tooltip { 12859 border: 1px solid #ff9800; /* Thinner */ 12860 border-radius: 3px; /* Smaller */ 12861 padding: 4px 8px; /* Less padding */ 12862 font-size: 10px; /* Smaller header */ 12863 min-width: 120px; /* Narrower */ 12864 max-width: 200px; /* Narrower */ 12865} 12866 12867.conflict-tooltip-body { 12868 padding: 6px 8px; /* Was 10px 12px */ 12869 font-size: 9px; /* Was 11px */ 12870 line-height: 1.4; /* Was 1.6 */ 12871} 12872 12873.conflict-item { 12874 padding: 2px 0; /* Was 4px */ 12875 font-size: 9px; /* Added smaller font */ 12876} 12877``` 12878 12879**Result**: 12880- Main calendar tooltip ~50% smaller 12881- Sidebar tooltips now extend beyond borders 12882- Both tooltips compact and readable 12883 12884## Version 4.0.8 (2026-02-07) - FIX NEWLINES IN TOOLTIP 12885 12886### Bug Fix 12887- **Fixed:** Tooltip now shows actual line breaks (not literal `\n` text) 12888- **Changed:** Using HTML entity ` ` for newlines instead of `\n` 12889 12890### Technical Details 12891 12892**The Problem**: 12893```php 12894// Before (v4.0.7): 12895$conflictTooltip = 'Conflicts with:\n'; // Literal \n showed in tooltip 12896 12897// Displayed as: 12898"Conflicts with:\n• Event 1\n• Event 2" // ← Literal backslash-n 12899``` 12900 12901**The Fix**: 12902```php 12903// After (v4.0.8): 12904$conflictTooltip = "Conflicts with: "; // HTML entity for newline 12905 12906// Displays as: 12907Conflicts with: 12908• Event 1 12909• Event 2 12910``` 12911 12912**Why ` ` Works**: 12913- HTML entity for line feed character 12914- Works in data attributes 12915- CSS `white-space: pre-line` preserves the newlines 12916- Renders as actual line breaks in tooltip 12917 12918**Applied to**: 12919- PHP rendering (sidebar Today/Tomorrow/Important) 12920- JavaScript rendering (clicked day events) 12921 12922## Version 4.0.7 (2026-02-07) - COMPACT TOOLTIP & OVERFLOW FIX 12923 12924### UI Improvements 12925- **Changed:** Tooltip size reduced significantly (much more compact) 12926- **Fixed:** Tooltip now overflows sidebar borders (not cut off) 12927- **Changed:** Smaller padding (3px vs 6px), smaller font (9px vs 11px) 12928- **Changed:** Narrower width (120-200px vs 200-300px) 12929 12930### Technical Details 12931 12932**Tooltip Size Reduction**: 12933```css 12934/* Before (v4.0.6): 12935padding: 6px 10px; 12936font-size: 11px; 12937min-width: 200px; 12938max-width: 300px; 12939 12940/* After (v4.0.7): */ 12941padding: 3px 6px; 12942font-size: 9px; 12943min-width: 120px; 12944max-width: 200px; 12945``` 12946 12947**Overflow Fix**: 12948```css 12949/* Allow tooltip to extend beyond sidebar */ 12950.sidebar-widget, 12951.sidebar-matrix { 12952 overflow: visible !important; 12953} 12954 12955/* Position tooltip outside */ 12956[data-tooltip]:before { 12957 bottom: 120%; /* Further above */ 12958 right: -10px; /* Can extend beyond edge */ 12959 z-index: 10000; /* Always on top */ 12960} 12961``` 12962 12963**Visual Result**: 12964- Tooltip is ~40% smaller 12965- Extends beyond sidebar border if needed 12966- Still readable, just more compact 12967- Better for small screens 12968 12969## Version 4.0.6 (2026-02-07) - MATCH MAIN CALENDAR LOGIC & TOOLTIP POSITIONING 12970 12971### Critical Fix 12972- **Fixed:** Sidebar conflict detection now matches main calendar logic exactly 12973- **Fixed:** Checks both `end_time` (snake_case) and `endTime` (camelCase) field names 12974- **Fixed:** Events without end time now treated as zero-duration (not +1 hour) 12975- **Fixed:** Now matches what you see in main calendar view 12976 12977### ✨ UI Improvement 12978- **Changed:** Conflict tooltips now appear ABOVE and to the LEFT (not below/right) 12979- **Added:** Custom CSS tooltip with data-tooltip attribute 12980- **Improved:** Better tooltip positioning - doesn't overflow screen edges 12981 12982### Technical Details 12983 12984**The Problem - Field Name Mismatch**: 12985```php 12986// Main calendar (line 697): 12987$end1 = isset($evt1['endTime']) ? ... // ← Checks 'endTime' (camelCase) 12988 12989// Sidebar (before fix): 12990$endTime = isset($event['end_time']) ? ... // ← Only checked 'end_time' (snake_case) 12991``` 12992 12993**The Problem - Duration Logic**: 12994```php 12995// Main calendar (line 697): 12996$end1 = isset($evt1['endTime']) && !empty($evt1['endTime']) 12997 ? $evt1['endTime'] 12998 : $evt1['time']; // ← Uses START time (zero duration) 12999 13000// Sidebar (before fix): 13001$endTime = ... ? ... : $this->addHoursToTime($startTime, 1); // ← Added 1 hour! 13002``` 13003 13004**The Fix**: 13005```php 13006// Now checks BOTH field names: 13007if (isset($event['end_time']) && $event['end_time'] !== '') { 13008 $endTime = $event['end_time']; 13009} elseif (isset($event['endTime']) && $event['endTime'] !== '') { 13010 $endTime = $event['endTime']; 13011} else { 13012 $endTime = $startTime; // ← Matches main calendar! 13013} 13014``` 13015 13016**Tooltip Positioning**: 13017- Uses `data-tooltip` attribute instead of `title` 13018- CSS positions tooltip ABOVE badge (`bottom: 100%`) 13019- Aligns to RIGHT edge (`right: 0`) 13020- Arrow points down to badge 13021- Black background with white text 13022- Max width 300px 13023 13024### Example 13025 13026**6:00 PM Evening Service** (no end time): 13027- Old: 6:00 PM - 7:00 PM (assumed 1 hour) ❌ 13028- New: 6:00 PM - 6:00 PM (zero duration) ✓ Matches main calendar! 13029 13030**3:30 PM-7:00 PM Super Bowl** vs **6:00 PM Service**: 13031- Zero-duration events at 6:00 PM don't overlap with anything 13032- ONLY if service has explicit end time (e.g., 6:00-7:00) will it conflict 13033 13034**Tooltip appears**: 13035``` 13036 ┌────────────────────┐ 13037 │ Conflicts with: │ 13038 │ • Super Bowl │ 13039 │ (3:30 PM-7:00 PM)│ 13040 └─────────┬──────────┘ 13041 ▼ 13042 ⚠ 13043``` 13044 13045## Version 4.0.5 (2026-02-07) - FIX END_TIME DEFAULT HANDLING 13046 13047### Bug Fix 13048- **Fixed:** Events without end_time now properly get 1-hour default duration 13049- **Fixed:** Empty string end_time values now treated as missing (was causing issues) 13050- **Improved:** More robust checking for `end_time` field (checks both isset and not empty) 13051 13052### Technical Details 13053 13054**The Problem**: 13055```php 13056// Before (broken): 13057$endTime = isset($event['end_time']) ? $event['end_time'] : default; 13058 13059// If end_time exists but is empty string "": 13060isset($event['end_time']) = TRUE 13061$endTime = "" // ← Empty string, not default! 13062``` 13063 13064**The Fix**: 13065```php 13066// After (fixed): 13067$endTime = (isset($event['end_time']) && $event['end_time'] !== '') 13068 ? $event['end_time'] 13069 : $this->addHoursToTime($startTime, 1); 13070 13071// Now empty string gets the default 1-hour duration 13072``` 13073 13074**Why This Matters**: 13075Events 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. 13076 13077**Example**: 13078``` 13079Super Bowl: 3:30 PM - 7:00 PM 13080Evening Service: 6:00 PM - ??? (should be 7:00 PM) 13081 13082If end_time = "" (empty string): 13083 Old code: Uses "" → conflict detection fails 13084 New code: Uses 7:00 PM → conflict detected ✓ 13085``` 13086 13087### Testing 13088If you're still not seeing the conflict on the 6:00 PM service: 130891. Check if the event has `end_time` set in the JSON 130902. Clear cache (Admin → Manage Events → Clear Cache) 130913. The conflict should now appear 13092 13093## Version 4.0.4 (2026-02-07) - CONFLICT TOOLTIP WITH DETAILS 13094 13095### ✨ Feature Added 13096- **Added:** Hover over ⚠ badge to see which events are conflicting 13097- **Added:** Tooltip shows conflicting event titles and times 13098- **Added:** Works in both sidebar sections and clicked day events 13099 13100### Technical Details 13101 13102**Conflict Tracking Enhanced**: 13103```php 13104// Now tracks WHICH events conflict: 13105$event['conflictingWith'] = [ 13106 ['title' => 'Meeting', 'time' => '10:00', 'end_time' => '11:00'], 13107 ['title' => 'Call', 'time' => '10:30', 'end_time' => '11:30'] 13108]; 13109``` 13110 13111**Tooltip Format**: 13112``` 13113Conflicts with: 13114• Meeting (10:00 AM-11:00 AM) 13115• Call (10:30 AM-11:30 PM) 13116``` 13117 13118**Where It Works**: 13119- ✅ Today section (sidebar) 13120- ✅ Tomorrow section (sidebar) 13121- ✅ Important Events section (sidebar) 13122- ✅ Clicked day events (week grid) 13123 13124**Cursor**: Changes to `help` cursor on hover to indicate tooltip 13125 13126### Note on Multi-Day Events 13127The 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. 13128 13129## Version 4.0.3 (2026-02-07) - FIX CONFLICT BADGE & IMPORTANT EVENTS LOGIC 13130 13131### Bug Fixes 13132- **Fixed:** Conflict badge (⚠) now displays in sidebar Today/Tomorrow/Important sections 13133- **Fixed:** Important Events now shows events even if they're today or tomorrow 13134- **Fixed:** Field name mismatch - was checking `'conflicts'` (plural) but setting `'conflict'` (singular) 13135 13136### Technical Details 13137 13138**Conflict Badge Issue**: 13139```php 13140// BROKEN (line 2511): 13141$hasConflict = isset($event['conflicts']) && !empty($event['conflicts']); 13142// ↑ Checking 'conflicts' (plural) 13143 13144// But detectTimeConflicts() sets: 13145$event['conflict'] = true/false; 13146// ↑ Setting 'conflict' (singular) 13147 13148// FIXED: 13149$hasConflict = isset($event['conflict']) && $event['conflict']; 13150``` 13151 13152**Result**: Badge now shows for ALL conflicting events in sidebar sections 13153 13154**Important Events Logic Issue**: 13155```php 13156// BROKEN: 13157if ($dateKey === $todayStr) { 13158 $todayEvents[] = ...; 13159} elseif ($dateKey === $tomorrowStr) { 13160 $tomorrowEvents[] = ...; 13161} else { // ← Only checked if NOT today/tomorrow! 13162 if ($isImportant) { 13163 $importantEvents[] = ...; 13164 } 13165} 13166 13167// FIXED: 13168if ($dateKey === $todayStr) { 13169 $todayEvents[] = ...; 13170} 13171if ($dateKey === $tomorrowStr) { 13172 $tomorrowEvents[] = ...; 13173} 13174// ↑ Changed to separate 'if' statements 13175if ($isImportant && $dateKey in this week) { 13176 $importantEvents[] = ...; // ← Now includes today/tomorrow too! 13177} 13178``` 13179 13180**Result**: Important namespace events now show in Important section even if they're today or tomorrow 13181 13182### Conflict Badge Display 13183- Simplified to just ⚠ icon (no count) 13184- Orange color (#ff9800) 13185- 10px font size 13186- Hover shows "Time conflict detected" 13187 13188## Version 4.0.2 (2026-02-07) - FIX IMPORTANT EVENTS DISPLAY 13189 13190### Bug Fix 13191- **Fixed:** Important Events section now displays all events correctly 13192- **Fixed:** Single-event days now get conflict flag (was returning early without flag) 13193- **Fixed:** Conflict detection no longer causes events to disappear from Important section 13194 13195### Technical Details 13196 13197**The Problem**: 13198- `detectTimeConflicts()` returned early if only 1 event on a day 13199- Returned original array without adding 'conflict' field 13200- This inconsistency caused issues in event categorization 13201 13202**The Solution**: 13203```php 13204// Before (broken): 13205if (empty($dayEvents) || count($dayEvents) < 2) { 13206 return $dayEvents; // No 'conflict' field added! 13207} 13208 13209// After (fixed): 13210if (count($dayEvents) === 1) { 13211 return [array_merge($dayEvents[0], ['conflict' => false])]; // Always add flag 13212} 13213``` 13214 13215**Result**: 13216- All events now have 'conflict' field consistently 13217- Single events: conflict = false 13218- Multiple events: conflict = true/false based on overlap 13219- Important Events section displays correctly 13220 13221## Version 4.0.1 (2026-02-06) - CONFLICT DETECTION, TAB REORDER, FIXES 13222 13223### Bug Fixes 13224- **Fixed:** Conflict badge (⚠) now displays in clicked day events 13225- **Fixed:** Recurring events edit now updates time and end_time correctly 13226- **Fixed:** Field names changed from 'start'/'end' to 'time'/'end_time' in recurring edit 13227 13228### ✨ Features Added 13229- **Added:** Time conflict detection for overlapping events 13230- **Added:** detectTimeConflicts() function checks all events on same day 13231- **Added:** timesOverlap(), timeToMinutes(), addMinutesToTime() helper functions 13232- **Added:** Events now have 'conflict' flag set automatically 13233 13234### UI Changes 13235- **Changed:** Admin tab order: Manage Events (first), Update Plugin, ⚙️ Outlook Sync 13236- **Changed:** Default admin tab is now "Manage Events" (was "Update Plugin") 13237- **Changed:** Week view now shows 4 colored event bars before "+1" (was 3 bars) 13238 13239### Technical Details 13240 13241**Conflict Detection**: 13242```php 13243// Automatically detects overlapping events on same day 13244// Sets 'conflict' flag to true if event overlaps with another 13245$eventsWithConflicts = $this->detectTimeConflicts($dayEvents); 13246``` 13247 13248**Logic**: 13249- All-day events never conflict (no time set) 13250- Timed events check for overlap with other timed events 13251- Overlap = start1 < end2 AND start2 < end1 13252- Default duration is 60 minutes if no end_time 13253 13254**Recurring Events Fix**: 13255- Old: Updated `$event['start']` and `$event['end']` (wrong fields) 13256- New: Updates `$event['time']` and `$event['end_time']` (correct fields) 13257- Now edits actually save and update the events 13258 13259**Week View Bars**: 13260- Shows 4 colored bars instead of 3 13261- "+1" becomes "+2" with 5 events, "+3" with 6 events, etc. 13262 13263## Version 4.0.0 (2026-02-06) - MATRIX EDITION RELEASE 13264 13265**Major Release**: Complete Matrix-themed calendar plugin with advanced features! 13266 13267### Major Features 13268 13269#### Sidebar Widget 13270- **Week Grid**: Interactive 7-day calendar with click-to-view events 13271- **Live System Monitoring**: CPU load, real-time CPU, memory usage with tooltips 13272- **Live Clock**: Updates every second with date display 13273- **Real-time Weather**: Geolocation-based temperature with icon 13274- **Event Sections**: Today (orange), Tomorrow (green), Important (purple) 13275- **Add Event Button**: Dark green bar opens full event creation dialog 13276- **Matrix Theme**: Green glow effects throughout 13277 13278#### Event Management 13279- **Single Color Bars**: Clean 3px bars showing event's assigned color 13280- **All-Day Events First**: Then sorted chronologically by time 13281- **Conflict Detection**: Orange ⚠ badge on overlapping events 13282- **Rich Content**: Full DokuWiki formatting (**bold**, [[links]], //italic//) 13283- **HTML Rendering**: Pre-rendered for JavaScript display 13284- **Click-to-View**: Click week grid days to expand event details 13285 13286#### Admin Interface 13287- **Update Plugin Tab** (Default): Version info, changelog, prominent Clear Cache button 13288- **Outlook Sync Tab**: Microsoft Azure integration, category mapping, sync settings 13289- **Manage Events Tab**: Browse, edit, delete, move events across namespaces 13290 13291#### Outlook Sync 13292- **Bi-directional Sync**: DokuWiki ↔ Microsoft Outlook 13293- **Category Mapping**: Map colors to Outlook categories 13294- **Conflict Resolution**: Time conflict detection 13295- **Import/Export Config**: Encrypted configuration files 13296 13297### Design 13298- **Matrix Theme**: Authentic green glow aesthetic 13299- **Dark Backgrounds**: #1a1a1a header, rgba(36, 36, 36) sections 13300- **Color Scheme**: 13301 - Today: Orange #ff9800 13302 - Tomorrow: Green #4caf50 13303 - Important: Purple #9b59b6 13304 - Add Event: Dark green #006400 13305 - System bars: Green/Purple/Orange 13306 13307### Technical Highlights 13308- **Zero-margin Design**: Perfect flush alignment throughout 13309- **Flexbox Layout**: Modern, responsive structure 13310- **AJAX Operations**: No page reloads needed 13311- **Smart Sorting**: All-day events first, then chronological 13312- **Tooltip System**: Detailed stats on hover (working correctly) 13313- **Event Dialog**: Full form with drag support 13314- **Cache Management**: One-click cache clearing 13315 13316### Breaking Changes from v3.x 13317- Removed dual color bars (now single event color bar only) 13318- Add Event button moved to between header and week grid 13319- All-day events now appear FIRST (not last) 13320- Update Plugin tab is now the default admin tab 13321 13322### Bug Fixes (v3.10.x → v4.0.0) 13323- ✅ Fixed color bars not showing (align-self:stretch vs height:100%) 13324- ✅ Fixed tooltip function naming (sanitized calId for JavaScript) 13325- ✅ Fixed weather display (added updateWeather function) 13326- ✅ Fixed HTML rendering in events (title_html/description_html fields) 13327- ✅ Fixed Add Event dialog (null check for calendar element) 13328- ✅ Fixed text positioning in Add Event button 13329- ✅ Fixed spacing throughout sidebar widget 13330 13331### Complete Feature List 13332- Full calendar view (month grid) 13333- Sidebar widget (week view) 13334- Event panel (standalone) 13335- Event list (date ranges) 13336- Namespace support 13337- Color coding 13338- Time conflict detection 13339- DokuWiki syntax in events 13340- Outlook synchronization 13341- System monitoring 13342- Weather display 13343- Live clock 13344- Admin interface 13345- Cache management 13346- Draggable dialogs 13347- AJAX save/edit/delete 13348- Import/export config 13349 13350### Usage 13351 13352**Sidebar Widget**: 13353``` 13354{{calendar sidebar}} 13355{{calendar sidebar namespace=team}} 13356``` 13357 13358**Full Calendar**: 13359``` 13360{{calendar}} 13361{{calendar year=2026 month=6 namespace=team}} 13362``` 13363 13364**Event Panel**: 13365``` 13366{{eventpanel}} 13367``` 13368 13369**Event List**: 13370``` 13371{{eventlist daterange=2026-01-01:2026-01-31}} 13372``` 13373 13374### Stats 13375- **40+ versions** developed during v3.x iterations 13376- **3.10.0 → 3.11.4**: Polish and refinement 13377- **4.0.0**: Production-ready Matrix Edition 13378 13379### Credits 13380Massive iteration and refinement session resulting in a polished, feature-complete calendar plugin with authentic Matrix aesthetics and enterprise-grade Outlook integration. 13381 13382--- 13383 13384## Previous Versions (v3.11.4 and earlier) 13385 13386## Version 3.11.4 (2026-02-06) - RESTORE HEADER BOTTOM SPACING 13387- **Changed:** Restored 2px bottom padding to header (was 0px, now 2px) 13388- **Improved:** Small breathing room between system stats bars and Add Event button 13389- **Visual:** Better spacing for cleaner appearance 13390 13391### CSS Change: 13392**eventlist-today-header**: 13393- `padding: 6px 10px 0 10px` → `padding: 6px 10px 2px 10px` 13394 13395### Visual Result: 13396``` 13397│ ▓▓▓░░ ▓▓░░░ ▓▓▓▓░ │ ← Stats bars 13398│ │ ← 2px space (restored) 13399├───────────────────────┤ 13400│ + ADD EVENT │ ← Add Event bar 13401├───────────────────────┤ 13402``` 13403 13404**Before (v3.11.3)**: No space, bars directly touch Add Event button 13405**After (v3.11.4)**: 2px breathing room for better visual hierarchy 13406 13407## Version 3.11.3 (2026-02-06) - FIX ADD EVENT DIALOG & TEXT POSITION 13408- **Fixed:** openAddEvent() function now checks if calendar element exists before reading dataset 13409- **Fixed:** Add Event button no longer throws "Cannot read properties of null" error 13410- **Changed:** Add Event text moved up 1px (position:relative; top:-1px) 13411- **Changed:** Line-height reduced from 12px to 10px for better text centering 13412- **Improved:** openAddEvent() works for both regular calendars and sidebar widgets 13413 13414### JavaScript Fix: 13415**Problem**: Line 1084-1085 in calendar-main.js 13416```javascript 13417const calendar = document.getElementById(calId); 13418const filteredNamespace = calendar.dataset.filteredNamespace; // ← Null error! 13419``` 13420 13421**Solution**: Added null check 13422```javascript 13423const calendar = document.getElementById(calId); 13424const filteredNamespace = calendar ? calendar.dataset.filteredNamespace : null; 13425``` 13426 13427**Why This Happened**: 13428- Regular calendar has element with id=calId 13429- Sidebar widget doesn't have this element (different structure) 13430- Code tried to read .dataset on null, causing error 13431 13432### Text Position Fix: 13433**Before**: 13434- line-height: 12px 13435- vertical-align: middle 13436- Text slightly low 13437 13438**After**: 13439- line-height: 10px 13440- position: relative; top: -1px 13441- Text perfectly centered 13442 13443### What Works Now: 13444✅ Click "+ ADD EVENT" in sidebar → Dialog opens 13445✅ No console errors 13446✅ Text properly centered vertically 13447✅ Form pre-filled with today's date 13448✅ Save works correctly 13449 13450## Version 3.11.2 (2026-02-06) - ADD EVENT DIALOG IN SIDEBAR 13451- **Added:** Event dialog to sidebar widget (same as regular calendar) 13452- **Changed:** Add Event button now opens proper event form dialog 13453- **Added:** renderEventDialog() called in renderSidebarWidget() 13454- **Fixed:** Add Event button calls openAddEvent() with calId, namespace, and today's date 13455- **Improved:** Can now add events directly from sidebar widget 13456 13457### Add Event Button Behavior: 13458**Before (v3.11.1)**: Showed alert with instructions 13459**After (v3.11.2)**: Opens full event creation dialog 13460 13461**Dialog Features**: 13462- Date field (defaults to today) 13463- Title field (required) 13464- Time field (optional) 13465- End time field (optional) 13466- Color picker 13467- Category field 13468- Description field 13469- Save and Cancel buttons 13470- Draggable dialog 13471 13472### Technical Changes: 13473- Added `$html .= $this->renderEventDialog($calId, $namespace);` at end of renderSidebarWidget() 13474- Changed Add Event onclick from alert to `openAddEvent('calId', 'namespace', 'YYYY-MM-DD')` 13475- Dialog uses same structure as regular calendar 13476- Uses existing openAddEvent() and saveEventCompact() JavaScript functions 13477 13478### User Flow: 134791. User clicks "+ ADD EVENT" green bar 134802. Event dialog opens with today's date pre-filled 134813. User fills in event details 134824. User clicks Save 134835. Event saved via AJAX 134846. Dialog closes 134857. Sidebar refreshes to show new event 13486 13487## Version 3.11.1 (2026-02-06) - FLUSH HEADER & ADD EVENT DIALOG 13488- **Fixed:** Removed bottom padding from header (was 2px, now 0) 13489- **Fixed:** Removed margin from stats container (was margin-top:2px, now margin:0) 13490- **Fixed:** Add Event bar now flush against header with zero gap 13491- **Changed:** Add Event button now shows helpful alert dialog instead of navigating to admin 13492- **Improved:** Alert provides clear instructions on how to add events 13493 13494### CSS Changes: 13495**eventlist-today-header**: 13496- `padding: 6px 10px 2px 10px` → `padding: 6px 10px 0 10px` (removed 2px bottom) 13497 13498**eventlist-stats-container**: 13499- `margin-top: 2px` → `margin: 0` (removed all margins) 13500 13501### Add Event Button Behavior: 13502**Before**: Clicked → Navigated to Admin → Manage Events tab 13503**After**: Clicked → Shows alert with instructions 13504 13505**Alert Message**: 13506``` 13507To add an event, go to: 13508Admin → Calendar Management → Manage Events tab 13509or use the full calendar view {{calendar}} 13510``` 13511 13512### Visual Result: 13513``` 13514│ ▓▓▓░░ ▓▓░░░ ▓▓▓▓░ │ ← Stats (no margin-bottom) 13515├────────────────────────┤ 13516│ + ADD EVENT │ ← Perfectly flush! 13517├────────────────────────┤ 13518``` 13519 13520No gaps, perfectly aligned! 13521 13522## Version 3.11.0 (2026-02-06) - ADD EVENT BAR FINAL POSITION & SIZE 13523- **Moved:** Add Event bar back to original position (between header and week grid) 13524- **Changed:** Font size reduced from 9px to 8px (prevents text cutoff) 13525- **Changed:** Letter spacing reduced from 0.5px to 0.4px 13526- **Fixed:** Text now fully visible without being cut off 13527- **Final:** Optimal position and size determined 13528 13529### Final Layout: 13530``` 13531┌─────────────────────────────┐ 13532│ Clock | Weather | Stats │ ← Header 13533├─────────────────────────────┤ 13534│ + ADD EVENT │ ← Bar (back here, smaller text) 13535├─────────────────────────────┤ 13536│ M T W T F S S │ ← Week Grid 13537│ 3 4 5 6 7 8 9 │ 13538├─────────────────────────────┤ 13539│ Today │ ← Event sections 13540└─────────────────────────────┘ 13541``` 13542 13543### Text Size Changes: 13544**v3.10.9**: 9px font, 0.5px letter-spacing → Text slightly cut off 13545**v3.11.0**: 8px font, 0.4px letter-spacing → Text fully visible 13546 13547### Why This Position: 13548- Separates header from calendar 13549- Natural action point after viewing stats 13550- Users see stats → decide to add event → view calendar 13551- Consistent with original design intent 13552 13553## Version 3.10.9 (2026-02-06) - ADD EVENT BAR MOVED BELOW WEEK GRID 13554- **Moved:** Add Event bar repositioned from between header/grid to below week grid 13555- **Improved:** Better visual flow - header → stats → grid → add button → events 13556- **Changed:** Add Event bar now acts as separator between calendar and event sections 13557 13558### New Layout: 13559``` 13560┌─────────────────────────────┐ 13561│ Clock | Weather | Stats │ ← Header 13562├─────────────────────────────┤ 13563│ M T W T F S S │ ← Week Grid 13564│ 3 4 5 6 7 8 9 │ 13565├─────────────────────────────┤ 13566│ + ADD EVENT │ ← Add bar (moved here!) 13567├─────────────────────────────┤ 13568│ Today │ ← Event sections 13569│ Tomorrow │ 13570│ Important Events │ 13571└─────────────────────────────┘ 13572``` 13573 13574### Visual Flow: 13575**Before (v3.10.8)**: 135761. Header (clock, weather, stats) 135772. **+ ADD EVENT** bar 135783. Week grid 135794. Event sections 13580 13581**After (v3.10.9)**: 135821. Header (clock, weather, stats) 135832. Week grid (calendar days) 135843. **+ ADD EVENT** bar 135854. Event sections 13586 13587### Benefits: 13588- Natural reading flow: View calendar → Add event → See events 13589- Add button positioned between calendar and event list 13590- Acts as visual separator 13591- More logical action placement 13592 13593## Version 3.10.8 (2026-02-06) - SINGLE COLOR BAR & ZERO MARGIN ADD BAR 13594- **Removed:** Section color bar (blue/orange/green/purple) - now shows ONLY event color 13595- **Changed:** Events now display with single 3px color bar (event's assigned color only) 13596- **Fixed:** Add Event bar now has zero margin (margin:0) - touches header perfectly 13597- **Simplified:** Cleaner visual with one color bar instead of two 13598- **Improved:** More space for event content without extra bar 13599 13600### Visual Changes: 13601 13602**Before (v3.10.7)** - Dual color bars: 13603``` 13604├─ [Orange][Green] Event Title 13605├─ [Blue][Purple] Event Title 13606``` 13607 13608**After (v3.10.8)** - Single color bar: 13609``` 13610├─ [Green] Event Title ← Only event color! 13611├─ [Purple] Event Title ← Only event color! 13612``` 13613 13614### Add Bar Changes: 13615- Added `margin:0` to eliminate gaps 13616- Now flush against header (no space above) 13617- Now flush against week grid (no space below) 13618- Perfect seamless connection 13619 13620### Technical Changes: 13621**renderSidebarEvent()**: 13622- Removed section color bar (4px) 13623- Kept only event color bar (3px) 13624 13625**showDayEvents() JavaScript**: 13626- Removed section color bar (4px blue) 13627- Kept only event color bar (3px) 13628 13629**Add Event bar**: 13630- Added `margin:0` inline style 13631- Removed all top/bottom margins 13632 13633## Version 3.10.7 (2026-02-06) - COLOR BARS FIX FOR SECTIONS & DARK GREEN ADD BAR 13634- **Fixed:** Color bars now display in Today/Tomorrow/Important sections (was only showing in clicked day) 13635- **Fixed:** Changed Today/Tomorrow/Important event rendering to use `align-self:stretch` instead of `height:100%` 13636- **Changed:** Add Event bar color from orange to dark green (#006400) 13637- **Changed:** Add Event bar height increased from 6px to 12px (text no longer cut off) 13638- **Changed:** Add Event bar text now bright green (#00ff00) with green glow 13639- **Changed:** Add Event bar font size increased from 7px to 9px 13640- **Changed:** Add Event bar letter spacing increased to 0.5px 13641- **Improved:** Hover effect on Add Event bar now darker green (#004d00) 13642 13643### Color Bar Fix Details: 13644**Problem**: Today/Tomorrow/Important sections still used `height:100%` on color bars 13645**Solution**: Applied same fix as clicked day events: 13646- Changed parent div: `align-items:start` → `align-items:stretch` 13647- Added `min-height:20px` to parent 13648- Changed bars: `height:100%` → `align-self:stretch` 13649- Bars now properly fill vertical space in ALL sections 13650 13651### Add Event Bar Changes: 13652**Before**: 13653- Background: Orange (#ff9800) 13654- Text: Black (#000) 13655- Height: 6px (text cut off) 13656- Font: 7px 13657 13658**After**: 13659- Background: Dark green (#006400) 13660- Text: Bright green (#00ff00) with green glow 13661- Height: 12px (text fully visible) 13662- Font: 9px 13663- Hover: Darker green (#004d00) 13664- Matrix-themed green aesthetic 13665 13666## Version 3.10.6 (2026-02-06) - COLOR BARS FIX, SORTING REVERSAL, CONFLICT BADGE, README UPDATE 13667- **Fixed:** Event color bars now display correctly in clicked day events 13668- **Fixed:** Changed sorting - all-day events now appear FIRST, then timed events 13669- **Added:** Conflict badge (⚠) appears on right side of conflicting events 13670- **Updated:** Complete README.md rewrite with full Matrix theme documentation 13671- **Changed:** Color bars use `align-self:stretch` instead of `height:100%` (fixes rendering) 13672- **Changed:** Parent div uses `align-items:stretch` and `min-height:20px` 13673- **Improved:** Content wrapper now uses flexbox for proper conflict badge positioning 13674 13675### Color Bar Fix: 13676**Problem**: Bars had `height:100%` but parent had no explicit height 13677**Solution**: 13678- Changed to `align-self:stretch` on bars 13679- Parent uses `align-items:stretch` 13680- Added `min-height:20px` to parent 13681- Bars now properly fill vertical space 13682 13683### Sorting Change: 13684**Before**: Timed events first → All-day events last 13685**After**: All-day events FIRST → Timed events chronologically 13686 13687**Example**: 13688``` 13689Monday, Feb 5 13690├─ All Day - Project Deadline ← All-day first 13691├─ 8:00 AM - Morning Standup ← Earliest time 13692├─ 10:30 AM - Coffee with Bob 13693└─ 2:00 PM - Team Meeting ← Latest time 13694``` 13695 13696### Conflict Badge: 13697- Orange warning triangle (⚠) on right side 13698- 10px font size 13699- Only appears if `event.conflict` is true 13700- Title attribute shows "Time conflict detected" 13701- Small and unobtrusive 13702 13703### README Update: 13704- Complete rewrite with Matrix theme focus 13705- Full usage instructions for all features 13706- Admin interface documentation 13707- Outlook sync setup guide 13708- System monitoring details 13709- Troubleshooting section 13710- Color scheme reference 13711- File structure documentation 13712- Performance tips 13713- Security notes 13714- Quick start examples 13715 13716## Version 3.10.5 (2026-02-06) - TIME SORTING & THINNER ADD BAR 13717- **Added:** Events now sorted by time when clicking week grid days 13718- **Changed:** Add Event bar now ultra-thin (6px height, down from 12px) 13719- **Improved:** Events with times appear first, sorted chronologically 13720- **Improved:** All-day events appear after timed events 13721- **Changed:** Add Event bar font size reduced to 7px (from 10px) 13722- **Changed:** Add Event bar now has 0 padding and fixed 6px height 13723 13724### Sorting Logic: 13725- Events with times sorted by time (earliest first) 13726- All-day events (no time) appear at the end 13727- Sort algorithm: Convert time to minutes (HH:MM → total minutes) and compare 13728- Chronological order: 8:00 AM → 10:30 AM → 2:00 PM → All-day event 13729 13730### Add Event Bar Changes: 13731- **Height**: 6px (was ~12px with padding) 13732- **Padding**: 0 (was 4px top/bottom) 13733- **Font Size**: 7px (was 10px) 13734- **Letter Spacing**: 0.3px (was 0.5px) 13735- **Line Height**: 6px to match height 13736- **Vertical Align**: Middle for text centering 13737 13738## Version 3.10.4 (2026-02-06) - ADD EVENT BAR 13739- **Added:** Thin orange "Add Event" bar between header and week grid 13740- **Added:** Quick access to event creation from sidebar widget 13741- **Styled:** Sleek design with hover effects and glow 13742- **Interactive:** Clicks navigate to Manage Events tab in admin 13743- **Improved:** User workflow for adding events from sidebar 13744 13745### Visual Design: 13746- Orange background (#ff9800) matching Today section color 13747- 4px top/bottom padding for thin, sleek appearance 13748- Black text with white text-shadow for visibility 13749- Hover effect: Darkens to #ff7700 with enhanced glow 13750- Orange glow effect (box-shadow) matching Matrix theme 13751- Centered "+ ADD EVENT" text (10px, bold, letter-spacing) 13752 13753### Technical Changes: 13754- Added between header close and renderWeekGrid() call 13755- Inline onclick handler navigates to admin manage tab 13756- Inline onmouseover/onmouseout for hover effects 13757- Smooth 0.2s transition on all style changes 13758 13759## Version 3.10.3 (2026-02-06) - UI IMPROVEMENTS & CACHE BUTTON RELOCATION 13760- **Changed:** Update Plugin tab is now the default tab when opening admin 13761- **Moved:** Clear Cache button relocated from Outlook Sync tab to Update Plugin tab 13762- **Improved:** Clear Cache button now larger and more prominent with helpful description 13763- **Improved:** Tab order reorganized: Update Plugin (default) → Outlook Sync → Manage Events 13764- **Removed:** Debug console.log statements from day event display 13765- **Fixed:** Cache clear now redirects back to Update Plugin tab instead of Config tab 13766 13767### UI Changes: 13768- Update Plugin tab opens by default (was Config/Outlook Sync tab) 13769- Clear Cache button prominently displayed at top of Update Plugin tab 13770- Orange ️ button (10px 20px padding) with confirmation dialog 13771- Help text: "Clear the DokuWiki cache if changes aren't appearing or after updating the plugin" 13772- Success/error messages display on Update Plugin tab after cache clear 13773- Tab navigation reordered to put Update first 13774 13775### Technical Changes: 13776- Default tab changed from 'config' to 'update' in html() method 13777- Tab navigation HTML reordered to show Update Plugin tab first 13778- clearCache() method now redirects with 'update' tab parameter 13779- Removed Clear Cache button from renderConfigTab() 13780- Added Clear Cache button to renderUpdateTab() with message display 13781 13782## Version 3.10.2 (2026-02-06) - EVENT HTML RENDERING FIX 13783- **Fixed:** Event formatting (bold, links, italic) now displays correctly when clicking week grid days 13784- **Added:** renderDokuWikiToHtml() helper function to convert DokuWiki syntax to HTML 13785- **Changed:** Events in weekEvents now pre-rendered with title_html and description_html fields 13786- **Improved:** DokuWiki syntax (**bold**, [[links]], //italic//, etc.) properly rendered in clicked day events 13787 13788### Technical Changes: 13789- Added renderDokuWikiToHtml() private function using p_get_instructions() and p_render() 13790- Events added to weekEvents now include pre-rendered HTML versions 13791- title_html and description_html fields populated before json_encode() 13792- JavaScript now receives properly formatted HTML content 13793 13794## Version 3.10.1 (2026-02-06) - TOOLTIP FIX & WEATHER & CACHE BUTTON 13795- **Fixed:** System tooltip functions now use sanitized calId (showTooltip_sidebar_abc123 instead of showTooltip_sidebar-abc123) 13796- **Fixed:** HTML event handlers now call correctly sanitized function names 13797- **Fixed:** Weather temperature now updates correctly in sidebar widget 13798- **Added:** Weather update function to sidebar widget JavaScript 13799- **Added:** "Clear Cache" button in admin panel for easy cache refresh 13800- **Added:** Default weather location set to Irvine, CA when geolocation unavailable 13801- **Improved:** All tooltip functions now work correctly on system status bars 13802 13803### Technical Changes: 13804- Changed tooltip function names to use $jsCalId instead of $calId 13805- Changed HTML onmouseover/onmouseout to use $jsCalId 13806- Added updateWeather() function to sidebar widget 13807- Added getWeatherIcon() function to sidebar widget 13808- Added clearCache() method in admin.php 13809- Added recursiveDelete() helper method in admin.php 13810- Admin UI now has ️ Clear Cache button alongside Export/Import 13811 13812## Version 3.10.0 (2026-02-06) - JAVASCRIPT FIXES 13813- **Fixed:** JavaScript syntax error "Missing initializer in const declaration" 13814- **Fixed:** Event links and formatting not displaying in clicked day events 13815- **Fixed:** Sanitized calId to jsCalId by replacing dashes with underscores 13816- **Changed:** Event titles now use `title_html` field to preserve HTML formatting 13817- **Changed:** Event descriptions now use `description_html` field to preserve links and formatting 13818- **Improved:** All JavaScript variable names now use valid syntax 13819- **Improved:** Links, bold, italic, and other HTML formatting preserved in events 13820 13821### Technical Changes: 13822- Added variable sanitization: `$jsCalId = str_replace('-', '_', $calId);` 13823- JavaScript variables now use underscores instead of dashes 13824- Event HTML rendering preserves DokuWiki formatting 13825- Fixed "showTooltip_sidebar is not defined" errors 13826- Fixed "showDayEvents_cal is not defined" errors 13827 13828## Version 3.9.9 (2026-02-06) - JAVASCRIPT LOADING ORDER FIX 13829- **Fixed:** Critical JavaScript loading order issue causing ReferenceError 13830- **Fixed:** Functions now defined BEFORE HTML that uses them 13831- **Changed:** Consolidated all JavaScript into single comprehensive script block 13832- **Removed:** ~290 lines of duplicate JavaScript code 13833- **Added:** Shared state management with `sharedState_[calId]` object 13834- **Improved:** System tooltip functions now work correctly 13835- **Improved:** Week grid click events now work correctly 13836 13837### Technical Changes: 13838- Moved all JavaScript to beginning of widget (before HTML) 13839- Removed duplicate script blocks 13840- Unified tooltip and stats functions 13841- Shared latestStats and cpuHistory state 13842- Fixed "Uncaught ReferenceError: showTooltip_sidebar is not defined" 13843 13844## Version 3.9.8 (2026-02-05) - DUAL COLOR BARS & CLICK EVENTS 13845- **Added:** Dual color bars on events (section color + event color) 13846- **Added:** Click week grid days to view events (replaced hover tooltips) 13847- **Added:** Expandable section below week grid for selected day events 13848- **Added:** Blue theme for selected day section 13849- **Changed:** Week grid days now clickable instead of tooltips 13850- **Changed:** Section bar: 4px wide (left) 13851- **Changed:** Event bar: 3px wide (right) 13852- **Increased:** Gap between color bars from 3px to 6px 13853- **Improved:** Click is more reliable and mobile-friendly than hover tooltips 13854 13855### Visual Changes: 13856- Each event shows TWO color bars side-by-side 13857- Left bar (4px): Section context (Today=Orange, Tomorrow=Green, Important=Purple, Selected=Blue) 13858- Right bar (3px): Individual event's assigned color 13859- Click any day in week grid to expand event list 13860- X button to close selected day events 13861 13862## Version 3.9.7 (2026-02-05) - EVENT COLOR BAR VISIBILITY 13863- **Increased:** Event color bar width from 2px to 3px 13864- **Increased:** Gap between section and event bars from 3px to 6px 13865- **Improved:** Event color bars now more visible alongside section bars 13866- **Note:** Dual color bar system already in place from v3.9.6 13867 13868## Version 3.9.6 (2026-02-05) - UI REFINEMENTS 13869- **Changed:** Date in Important Events moved below event name (was above) 13870- **Changed:** Section headers now 9px font size (was 10px) 13871- **Changed:** Section headers now normal case (was ALL CAPS) 13872- **Changed:** Letter spacing reduced from 0.8px to 0.3px 13873- **Improved:** More natural reading flow with date below event name 13874- **Improved:** Cleaner, more subtle section headers 13875 13876### Header Changes: 13877- "TODAY" → "Today" 13878- "TOMORROW" → "Tomorrow" 13879- "IMPORTANT EVENTS" → "Important Events" 13880 13881## Version 3.9.0 (2026-02-05) - SIDEBAR WIDGET REDESIGN 13882- **Redesigned:** Complete overhaul of `sidebar` parameter 13883- **Added:** Compact week-at-a-glance itinerary view (200px wide) 13884- **Added:** Live clock widget at top of sidebar 13885- **Added:** 7-cell week grid showing event bars 13886- **Added:** Today section with orange header and left border 13887- **Added:** Tomorrow section with green header and left border 13888- **Added:** Important Events section with purple header and left border 13889- **Added:** Admin setting to configure important namespaces 13890- **Added:** Time conflict badges in sidebar events 13891- **Added:** Task checkboxes in sidebar events 13892- **Changed:** Sidebar now optimized for narrow spaces (200px) 13893- **Improved:** Perfect for dashboards, page sidebars, and quick glance widgets 13894 13895### New Features: 13896- Clock updates every second showing current time 13897- Week grid shows Mon-Sun with colored event bars 13898- Today/Tomorrow sections show full event details 13899- Important events highlighted in purple (configurable namespaces) 13900- All badges (conflict, time, etc.) shown in compact format 13901- Automatic time conflict detection 13902 13903## Version 3.8.0 (2026-02-05) - PRODUCTION CLEANUP 13904- **Removed:** 16 unused/debug/backup files 13905- **Removed:** 69 console.log() debug statements 13906- **Removed:** 3 orphaned object literals from console.log removal 13907- **Removed:** Temporary comments and markers 13908- **Fixed:** JavaScript syntax errors from cleanup 13909- **Improved:** Code quality and maintainability 13910- **Improved:** Reduced plugin size by removing unnecessary files 13911- **Status:** Production-ready, fully cleaned codebase 13912 13913### Files Removed: 13914- style.css.backup, script.js.backup 13915- admin_old_backup.php, admin_minimal.php, admin_new.php, admin_clean.php 13916- debug_events.php, debug_html.php, cleanup_events.php 13917- fix_corrupted_json.php, fix_wildcard_namespaces.php 13918- find_outlook_duplicates.php, update_namespace.php 13919- validate_calendar_json.php, admin.js 13920- test_date_field.html 13921 13922## Version 3.7.5 (2026-02-05) 13923- **Fixed:** PHP syntax error (duplicate foreach loop removed) 13924- **Fixed:** Time variable handling in grace period logic 13925 13926## Version 3.7.4 (2026-02-05) 13927- **Added:** 15-minute grace period for timed events 13928- **Changed:** Events with times now stay visible for 15 minutes after their start time 13929- **Changed:** Prevents events from immediately disappearing when they start 13930- **Improved:** Better user experience for ongoing events 13931- **Fixed:** Events from earlier today now properly handled with grace period 13932 13933## Version 3.7.3 (2026-02-05) 13934- **Changed:** Complete redesign of cleanup section for compact, sleek layout 13935- **Changed:** Radio buttons now in single row at top 13936- **Changed:** All options visible with grayed-out inactive states (opacity 0.4) 13937- **Changed:** Inline controls - no more grid layout or wrapper boxes 13938- **Changed:** Namespace filter now compact single-line input 13939- **Changed:** Smaller buttons and tighter spacing throughout 13940- **Improved:** More professional, space-efficient design 13941 13942## Version 3.7.2 (2026-02-04) 13943- **Fixed:** Strange boxes under cleanup options - now properly hidden 13944- **Changed:** Unified color scheme across all admin sections 13945- **Changed:** Green (#00cc07) - Primary actions and main theme 13946- **Changed:** Orange (#ff9800) - Warnings and cleanup features 13947- **Changed:** Purple (#7b1fa2) - Secondary actions and accents 13948- **Improved:** Consistent visual design throughout admin interface 13949 13950## Version 3.7.1 (2026-02-04) 13951- **Fixed:** Cleanup section background changed from orange to white 13952- **Fixed:** Event cleanup now properly scans all calendar directories 13953- **Added:** Debug info display when preview finds no events 13954- **Improved:** Better directory scanning logic matching other features 13955 13956## Version 3.7.0 (2026-02-04) 13957- **Added:** Event cleanup feature in Events Manager 13958- **Added:** Delete old events by age (months/years old) 13959- **Added:** Delete events by status (completed tasks, past events) 13960- **Added:** Delete events by date range 13961- **Added:** Namespace filter for targeted cleanup 13962- **Added:** Preview function to see what will be deleted 13963- **Added:** Automatic backup creation before cleanup 13964- **Changed:** Reduced changelog viewer height to 100px (was 400px) 13965 13966## Version 3.6.3 (2026-02-04) 13967- **Fixed:** Conflict tooltips now work properly after navigating between months 13968- **Added:** Changelog display in Update Plugin tab 13969- **Added:** CHANGELOG.md file with version history 13970- **Improved:** Changelog shows last 10 versions with color-coded change types 13971- **Fixed:** Removed debug console.log statements 13972 13973## Version 3.6.2 (2026-02-04) 13974- **Fixed:** Month title now updates correctly when navigating between months 13975- **Changed:** All eventpanel header elements reduced by 10% for more compact design 13976- **Changed:** Reduced header height from 78px to 70px 13977 13978## Version 3.6.1 (2026-02-04) 13979- **Changed:** Complete redesign of eventpanel header with practical two-row layout 13980- **Fixed:** Improved layout for narrow widths (~500px) 13981- **Changed:** Simplified color scheme (removed purple gradient) 13982 13983## Version 3.6.0 (2026-02-04) 13984- **Changed:** Redesigned eventpanel header with gradient background 13985- **Changed:** Consolidated multiple header rows into compact single-row design 13986 13987## Version 3.5.1 (2026-02-04) 13988- **Changed:** Moved event search bar into header row next to + Add button 13989- **Improved:** More compact UI with search integrated into header 13990 13991## Version 3.5.0 (2026-02-04) 13992- **Added:** Event search functionality in sidebar and eventpanel 13993- **Added:** Real-time filtering as you type 13994- **Added:** Clear button (✕) appears when searching 13995- **Added:** "No results" message when search returns nothing 13996 13997## Version 3.4.7 (2026-02-04) 13998- **Changed:** Made conflict badges smaller and more subtle (9px font, less padding) 13999- **Fixed:** Removed debug logging from console 14000- **Changed:** Updated export version number to match plugin version 14001 14002## Version 3.4.6 (2026-02-04) 14003- **Added:** Debug logging to diagnose conflict detection issues 14004- **Development:** Extensive console logging for troubleshooting 14005 14006## Version 3.4.5 (2026-02-04) 14007- **Added:** Debug logging to showDayPopup and conflict detection 14008- **Development:** Added logging to trace conflict detection flow 14009 14010## Version 3.4.4 (2026-02-04) 14011- **Fixed:** Conflict detection now persists across page refreshes (PHP-based) 14012- **Fixed:** Conflict tooltips now appear on hover 14013- **Added:** Dual conflict detection (PHP for initial load, JavaScript for navigation) 14014- **Added:** Conflict badges in both future and past events sections 14015 14016## Version 3.4.3 (2026-02-04) 14017- **Added:** Custom styled conflict tooltips with hover functionality 14018- **Changed:** Conflict badge shows count of conflicts (e.g., ⚠️ 2) 14019- **Improved:** Beautiful tooltip design with orange header and clean formatting 14020 14021## Version 3.4.2 (2026-02-04) 14022- **Fixed:** Attempted to fix tooltip newlines (reverted in 3.4.3) 14023 14024## Version 3.4.1 (2026-02-04) 14025- **Fixed:** End time field now properly saves to database 14026- **Fixed:** End time dropdown now filters to show only valid times after start time 14027- **Added:** Smart dropdown behavior - expands on focus, filters invalid options 14028- **Improved:** End time auto-suggests +1 hour when start time selected 14029 14030## Version 3.4.0 (2026-02-04) 14031- **Added:** End time support for events (start and end times) 14032- **Added:** Automatic time conflict detection 14033- **Added:** Conflict warning badges (⚠️) on events with overlapping times 14034- **Added:** Conflict tooltips showing which events conflict 14035- **Added:** Visual conflict indicators with pulse animation 14036- **Changed:** Time display now shows ranges (e.g., "2:00 PM - 4:00 PM") 14037 14038## Version 3.3.77 (2026-02-04) 14039- **Fixed:** Namespace badge onclick handlers restored after clearing filter 14040- **Fixed:** Namespace filtering works infinitely (filter → clear → filter) 14041 14042## Version 3.3.76 (2026-02-04) 14043- **Fixed:** Namespace badges now clickable after clearing namespace filter 14044 14045## Version 3.3.75 (2026-02-04) 14046- **Fixed:** Form resubmission warnings eliminated 14047- **Improved:** Implemented proper POST-Redirect-GET pattern with HTTP 303 14048- **Changed:** All admin redirects now use absolute URLs 14049 14050## Version 3.3.74 (2026-02-04) 14051- **Fixed:** Clearing namespace filter now restores original namespace instead of default 14052- **Added:** data-original-namespace attribute to preserve initial namespace setting 14053- **Improved:** Console logging for namespace filter debugging 14054 14055## Version 3.3.73 (2026-02-03) 14056- **Added:** Dynamic namespace filtering banner with clear button 14057- **Fixed:** JavaScript function accessibility issues 14058- **Fixed:** Namespace badge click handlers in event lists 14059- **Improved:** Persistent namespace filtering across views 14060 14061## Earlier Versions 14062See previous transcripts for complete history through v3.3.73, including: 14063- Recurring events with Outlook sync 14064- Multi-namespace support 14065- Event categories and mapping 14066- Backup/restore functionality 14067- System statistics bar 14068- Namespace selector with fuzzy search 14069- Events Manager with import/export 14070- And much more... 14071