xref: /plugin/calendar/CHANGELOG.md (revision 2866e8271e4daef3b32eacb3a9082d02159b592b)
1# Calendar Plugin Changelog
2
3## Version 7.2.6 (2026-04-03)
4
5Major release focused on DokuWiki farm compatibility, security hardening, and new features.
6
7### New Features
8
9**Namespace Exclude Parameter**
10- `{{calendar namespace=* exclude=journal}}` — hide specific namespaces from wildcard views
11- `{{calendar namespace=* exclude="journal;drafts"}}` — exclude multiple (semicolon-separated)
12- Supports exact and prefix matching: `exclude=journal` also hides `journal:daily`, `journal:notes`
13- Works with `{{calendar}}`, `{{eventpanel}}`, and `{{eventlist}}`
14- Preserved across AJAX navigation and all-dates search
15
16**Default Search Scope Setting**
17- New admin setting (Themes tab) to default the search bar to "This Month" or "All Dates"
18- Users can still toggle per-session with the ��/�� button
19- Stored in `data/meta/calendar_search_default.txt`
20
21### DokuWiki Farm Compatibility
22
23**Data Path Migration**
24- Replaced 77 hardcoded `DOKU_INC . 'data/meta/'` references with `$conf['metadir']` across 8 files
25- Cache paths now use `$conf['cachedir']` (EventCache, RateLimiter, clearCache)
26- All temp files (`.event_stats_cache`, `.sync_abort`) moved from shared plugin dir to per-animal data dir
27- Added `metaDir()` helper to syntax, action, and admin plugin classes
28
29**Per-Animal Sync Credentials**
30- `sync_config.php` now checked in `$conf['metadir']/calendar/` first (per-animal), falls back to `DOKU_PLUGIN` (shared)
31- Added `syncConfigPath()` helper with fallback logic
32- Google OAuth tokens already stored per-animal in `$conf['metadir']`
33
34**CLI Sync Safety**
35- `sync_outlook.php` bootstraps DokuWiki with `NOSESSION` for CLI safety
36- Defensive fallback for `$conf['metadir']` when not set
37- Cron jobs should run as `www-data`, not root, to avoid file ownership issues
38
39### Security Hardening
40
41**ACL Enforcement on All AJAX Endpoints**
42- Read operations (`load_month`, `get_event`, `get_static_calendar`, `search_all`) verify `AUTH_READ`
43- Write operations (`save_event`, `delete_event`, `toggle_task`) verify `AUTH_EDIT`
44- Wildcard/multi-namespace views silently filter out namespaces the user cannot access
45- Applied to both server-side rendering (syntax.php) and AJAX paths (action.php)
46
47**CSRF Protection on Admin Panel**
48- Added `checkSecurityToken()` validation to the admin `handle()` method
49- Added `formSecurityToken()` to all 12 HTML forms
50- Added `JSINFO.sectok` hidden input to all 11 JavaScript-generated forms
51
52**Removed System Stats Endpoint**
53- Deleted `get_system_stats.php` — exposed CPU, memory, load averages, uptime, and top processes via `shell_exec('ps aux')` and `/proc/meminfo` through a directly-accessible PHP endpoint
54- Removed admin UI section, CSS, and save/load methods
55- System load inline JS remains but never executes (`getShowSystemLoad()` returns `false`)
56
57### Bug Fixes
58
59**Weekly Recurring Events on Sunday Created 365 Daily Events**
60- PHP's string `'0'` is falsy — when Sunday (day index 0) was the only selected weekday, the `$weekDays` array was empty, and every day matched
61- Fixed: strict comparison `($weekDaysStr !== '')` instead of truthy check
62
63**Memory Exhaustion on Large Wikis (namespace=*)**
64- Replaced recursive `findSubNamespaces` (which scanned every directory in `data/meta/`) with `findCalendarNamespaces` using iterative `glob()` to locate `calendar/` directories directly
65- On a wiki with 5,000 pages: old approach scanned 5,000+ dirs; new approach runs ~10 glob calls
66
67**Page Load Crash: "Cannot read properties of null"**
68- ARIA live region creation ran before `document.body` existed (script loaded in `<head>`)
69- Wrapped in deferred function that waits for `DOMContentLoaded`
70
71**JS Cache Busting**
72- `script.js` was using `Date.now()` as cache buster, forcing fresh HTTP requests on every page load
73- Changed to version-based `?v=7.2.1`
74
75### Housekeeping
76- Updated `@version` docblocks across all PHP files
77- Added localized strings (EN/DE/CS) for exclude and search scope features
78- Template `style.ini` lookups now check `$conf['savedir']` for farm-specific overrides
79
80### Migration Notes
81
82**From 7.0.x (non-farm):** No action needed — paths resolve to the same location.
83
84**Farm setups:** Calendar data stays in the master wiki's `data/meta/`. Move per-animal data manually:
85```bash
86mv /path/to/master/data/meta/calendar/ /path/to/animal/data/meta/calendar/
87mv /path/to/master/data/meta/calendar_*.txt /path/to/animal/data/meta/
88```
89
90**Cleanup:** The file `calendar_show_system_load.txt` in your data directory can be safely deleted.
91
92---
93
94## Version 7.0.8 (2026-02-15) - TIMEZONE FIX
95
96### Bug Fix: Date Shift in Non-UTC Timezones
97Fixed critical bug where events appeared shifted by one day in timezones ahead of UTC (e.g., Europe/Prague UTC+1).
98
99**Root Cause:**
100JavaScript's `toISOString()` converts dates to UTC, so local midnight (00:00) in Prague becomes 23:00 UTC of the *previous day*. When split to get YYYY-MM-DD, this returns the wrong date.
101
102**Fix:**
103Added `formatLocalDate(date)` helper function that formats dates using local time methods (`getFullYear()`, `getMonth()`, `getDate()`) instead of UTC conversion.
104
105**Affected Areas (now fixed):**
106- Multi-day event spanning (line 385)
107- Today string calculation in event list (line 566)
108- Past event detection in event items (line 1022)
109
110### Files Modified
111- `calendar-main.js` - Added `formatLocalDate()` helper, replaced 3 `toISOString().split('T')[0]` calls
112
113---
114
115## Version 7.0.7 (2026-02-15) - GOOGLE CALENDAR SYNC
116
117### Google Calendar Integration
118- Two-way sync with Google Calendar via OAuth 2.0
119- Import events from Google Calendar to DokuWiki
120- Export events from DokuWiki to Google Calendar
121- Support for all-day and timed events
122- Multi-day event handling
123- Color mapping between Google and DokuWiki
124- Duplicate detection prevents re-importing same events
125- Select which Google calendar to sync with
126- Admin panel UI for configuration and sync controls
127
128### Setup Requirements
129- Google Cloud Console project
130- Google Calendar API enabled
131- OAuth 2.0 Web Application credentials
132- Redirect URI configuration
133
134### New Files
135- `classes/GoogleCalendarSync.php` - OAuth and Calendar API integration
136
137### Files Modified
138- `action.php` - Added Google sync action handlers
139- `admin.php` - Added Google sync admin tab
140
141---
142
143## Version 7.0.6 (2026-02-15) - ACCESSIBILITY IMPROVEMENTS
144
145### Screen Reader Support
146- Added ARIA live region for dynamic announcements
147- Announces "Event created", "Event updated", "Event deleted" on actions
148- Announces "Task marked complete/incomplete" on toggle
149- Screen readers receive feedback without visual alerts
150
151### Debug Mode
152- Added `CALENDAR_DEBUG` flag for JavaScript console logging
153- `calendarLog()` and `calendarError()` helper functions
154- Debug output disabled by default
155
156### Code Quality
157- Consistent error handling patterns
158- Better separation of concerns
159
160### Files Modified
161- `calendar-main.js` - ARIA live region, debug helpers, announcements
162
163---
164
165## Version 7.0.5 (2026-02-15) - AUDIT LOGGING & ACCESSIBILITY
166
167### Audit Logging
168- New `AuditLogger.php` class for compliance logging
169- Logs all event modifications: create, update, delete, move, task toggle
170- JSON-formatted log files with timestamps, user info, and IP addresses
171- Automatic log rotation (5MB max, 10 files retained)
172- Log entries include: namespace, date, event ID, title, and change details
173
174### Keyboard Navigation (Accessibility)
175- Arrow keys navigate between calendar days
176- Enter/Space activates focused day (opens popup)
177- Arrow Up/Down navigates between events in popups
178- Enter on event opens edit dialog
179- Delete/Backspace on event triggers delete
180- Escape closes all dialogs, popups, and dropdowns
181- Added `tabindex` and `role` attributes for screen readers
182- Added `aria-label` descriptions for calendar days and events
183
184### CSS Focus States
185- Visible focus indicators on calendar days
186- Focus styles on event items in popups
187- Focus styles on custom date/time pickers
188- Uses `focus-visible` for keyboard-only focus rings
189
190### Files Added
191- `classes/AuditLogger.php` - Compliance audit logging
192
193### Files Modified
194- `action.php` - Integrated audit logging for all event operations
195- `calendar-main.js` - Extended keyboard navigation
196- `syntax.php` - Added accessibility attributes to calendar cells
197- `style.css` - Added focus state styles
198
199---
200
201## Version 7.0.4 (2026-02-15) - CODE CLEANUP
202
203### Code Cleanup
204- Removed unused `calendarDebounce()` and `calendarThrottle()` utility functions
205- Removed duplicate `updateEndTimeOptions()` function definition
206- Removed unused `_calendarSelectOpen` tracking variable
207- Removed orphaned `.input-date` and `.time-select` CSS (no longer using native inputs)
208- Consolidated legacy function calls
209
210### Improvements
211- End date picker now opens to start date's month when no end date is selected
212- End time picker now scrolls to first available time after start time
213
214### Files Modified
215- `calendar-main.js` - Removed ~40 lines of dead code
216- `style.css` - Removed ~25 lines of unused CSS
217
218---
219
220## Version 7.0.3 (2026-02-15) - CUSTOM DATE & TIME PICKERS
221
222### Complete Replacement of Native Browser Controls
223Both date inputs and time selects have been replaced with custom, lightweight pickers to eliminate all browser-related performance issues.
224
225#### Custom Date Picker
226- **Mini calendar grid** - Clean monthly view with day selection
227- **Month navigation** - Previous/next buttons for quick browsing
228- **Visual indicators** - Today highlighted, selected date marked
229- **End date validation** - Cannot select end date before start date
230- **Clear button** - Easy removal of optional end date
231
232#### Custom Time Picker (from v7.0.2)
233- **Period groupings** - Morning, Afternoon, Evening, Night
234- **Lazy loading** - Options built only when dropdown opens
235- **Smart filtering** - End times after start time only
236
237#### Code Cleanup
238- Removed old `setupSelectTracking()` function (was causing conflicts)
239- Removed redundant event listener code
240- Unified dropdown close handling for all picker types
241- No native `<input type="date">` or `<select>` elements in event dialog
242
243### Files Modified
244- `syntax.php` - New date picker HTML structure
245- `calendar-main.js` - Custom date picker JavaScript, cleanup
246- `style.css` - Date picker calendar grid styles
247
248---
249
250## Version 7.0.2 (2026-02-15) - CUSTOM TIME PICKER
251
252### Major Fix: Replaced Native Selects with Custom Time Pickers
253The native `<select>` element with 97 time options was causing browser freezes when opening. This version replaces them with lightweight custom dropdown pickers.
254
255#### New Custom Time Picker Features
256- **Instant opening** - No browser rendering delay
257- **Lazy-loaded options** - Dropdown HTML built only when clicked
258- **Period grouping** - Morning, Afternoon, Evening, Night sections
259- **Smart filtering** - End time options automatically hide times before start time
260- **Visual feedback** - Selected time highlighted, disabled times grayed out
261
262#### Technical Changes
263- Replaced `<select>` elements with `<button>` + `<div>` dropdown
264- Hidden `<input>` stores actual value for form submission
265- Time data pre-computed once, reused for all pickers
266- Event delegation for option clicks
267- Automatic cleanup when clicking outside
268
269#### Removed
270- Native `<select>` time pickers (caused 2600ms+ freezes)
271- `onchange` handlers from date inputs (handled in JS now)
272- Old `setupSelectTracking()` function
273
274### Files Modified
275- `syntax.php` - New time picker HTML structure
276- `calendar-main.js` - Custom time picker JavaScript
277- `style.css` - Time picker dropdown styles
278
279---
280
281## Version 7.0.1 (2026-02-15) - SELECTOR FLICKER FIX
282
283### Bug Fixes
284- **Fixed selector flicker on subsequent clicks** - Time/date selectors no longer flash or lag after first use
285  - New `setupSelectTracking()` prevents DOM updates while selector is open
286  - Tracks mousedown/focus/blur/change events on all form inputs
287  - Uses `requestAnimationFrame` for smooth visual updates
288  - Added state caching to skip redundant DOM manipulation
289
290### CSS Improvements
291- Changed `transition: all` to specific properties on `.input-sleek` elements
292- Added `transition: none` for select options
293- Prevents browser reflow issues during dropdown rendering
294
295---
296
297## Version 7.0.0 (2026-02-15) - STABILITY & PERFORMANCE RELEASE
298
299### Major Improvements
300
301#### File Locking & Atomic Writes (Critical Stability Fix)
302- **New `CalendarFileHandler` class** with atomic file operations
303- Prevents data corruption from concurrent event saves
304- Uses temp file + atomic rename strategy for safe writes
305- Implements `flock()` for proper file locking during reads/writes
306- Graceful handling of lock acquisition failures with retries
307
308#### Caching Layer (Performance Improvement)
309- **New `CalendarEventCache` class** for event data caching
310- 5-minute TTL reduces unnecessary JSON file reads
311- In-memory caching for current request
312- Automatic cache invalidation on event modifications
313- Cache cleanup for expired entries
314
315#### Rate Limiting (Security Enhancement)
316- **New `CalendarRateLimiter` class** for AJAX endpoint protection
317- 60 requests/minute for read actions
318- 30 requests/minute for write actions (more restrictive)
319- Per-user tracking (falls back to IP for anonymous)
320- Rate limit headers in responses (X-RateLimit-Limit, X-RateLimit-Remaining)
321- Automatic cleanup of old rate limit data
322
323#### Code Refactoring
324- **New `CalendarEventManager` class** consolidating CRUD operations
325- New `classes/` directory for organized code structure
326- Reduced code duplication across files
327- Improved separation of concerns
328- Better maintainability for future development
329
330#### JavaScript Performance Fixes (Dialog Responsiveness)
331- **Fixed slow time selector** - End time dropdown now opens instantly
332  - Replaced `Array.from().forEach()` with direct `options` loop (97 options)
333  - Single-pass algorithm instead of multiple iterations
334  - Uses `hidden` property instead of `style.display` manipulation
335- **Fixed event listener accumulation** - Dialog inputs no longer slow down over time
336  - Added `data-initialized` flag to prevent re-binding listeners
337  - Namespace search only initializes once per calendar
338- **Fixed selector flicker on subsequent clicks**
339  - New `setupSelectTracking()` function prevents DOM updates while selector is open
340  - Tracks mousedown/focus/blur/change events on time and date inputs
341  - Uses `requestAnimationFrame` instead of `setTimeout` for visual updates
342  - Added state caching to skip redundant DOM updates
343- **Fixed CSS transition interference**
344  - Changed `transition: all` to specific properties on form inputs
345  - Added explicit `transition: none` for select options
346  - Prevents browser reflow issues during dropdown rendering
347
348### Branding Changes
349- Removed "Matrix Edition" from plugin name and all references
350- Plugin is now simply "Calendar Plugin"
351- Matrix theme remains available (now called just "Matrix")
352
353### Technical Details
354- All JSON file operations now use atomic writes
355- Event saves protected against race conditions
356- Cache automatically invalidated on namespace/month changes
357- Rate limiter uses probabilistic cleanup (1 in 100 requests)
358
359### Files Added
360- `classes/FileHandler.php` - Atomic file operations with locking
361- `classes/EventCache.php` - Caching layer with TTL
362- `classes/RateLimiter.php` - AJAX rate limiting
363- `classes/EventManager.php` - Consolidated event CRUD operations
364
365### Upgrade Notes
366- No database migration required
367- Cache directory created automatically (`data/cache/calendar/`)
368- Rate limit data stored in `data/cache/calendar/ratelimit/`
369- Existing events and settings preserved
370
371---
372
373## Version 6.14.2 (2026-02-15) - SYSTEM LOAD TOGGLE
374
375### Added System Load Bars Toggle
376- New toggle in **Admin > Calendar > Themes** tab
377- Choose to show or hide CPU/Memory load indicator bars
378- Setting applies to both event panel and sidebar widget
379- Stored in `data/meta/calendar_show_system_load.txt`
380- JavaScript polling is also disabled when hidden (saves resources)
381
382## Version 6.14.1 (2026-02-14) - SECURITY FIX
383
384### Security Improvements
385- **Authentication required** - Write actions (save, delete, toggle) now require user to be logged in
386- **Improved CSRF token handling** - New `getSecurityToken()` helper function checks multiple sources:
387  - `JSINFO.sectok` (standard)
388  - `window.JSINFO.sectok`
389  - Hidden form field `input[name="sectok"]`
390  - Meta tag `meta[name="sectok"]`
391- Anonymous users can no longer add/edit/delete events
392- Better error messages for authentication and token failures
393
394### Bug Fixes
395- Fixed "Invalid security token" error on clean DokuWiki installations
396- Added debug logging for security token failures
397
398## Version 6.14.0 (2026-02-14) - STABLE RELEASE
399
400### Code Cleanup & Localization
401- Added localization for all static calendar strings (EN/DE)
402- New lang keys: `previous_month`, `next_month`, `print_calendar`, `no_events_scheduled`, `calendar_label`, `details`
403- Code review and cleanup completed
404- Updated README.md and plugin documentation
405
406### Static Calendar Features (v6.13.x consolidated)
407- Read-only presentation mode: `{{calendar static}}`
408- Custom titles: `title="My Events"`
409- Month locking: `month=2` disables navigation
410- Print button with clean itinerary output
411- All themes supported: matrix, pink, purple, professional, wiki, dark, light
412- `noprint` option to hide print functionality
413- Formatted descriptions in tooltips and itinerary
414
415### Other Improvements in 6.13.x
416- Admin menu icon (SVG)
417- Config import fix for `return array()` syntax
418- Mobile touch button fixes
419- Important events in day popup with star icons
420- Time picker grouped by period
421- Multi-day event time validation
422
423## Version 6.13.13 (2026-02-14) - PRINT BUTTON CENTERING
424
425### Fixed Print Button Icon Alignment
426- Added `display: flex`, `align-items: center`, `justify-content: center`
427- Added `padding: 0` and `line-height: 1`
428- Icon now properly centered in circle
429
430## Version 6.13.12 (2026-02-14) - SIMPLE TOOLTIP
431
432### Simplified Hover Tooltip
433- Removed custom JS tooltip (was causing triple popups)
434- Uses native browser `title` attribute only
435- Plain text with formatting converted: `**bold**` → `*bold*`, `//italic//` → `_italic_`
436- Links shown as: `text (url)`
437- Added �� emoji before time for visual clarity
438- Itinerary still shows full HTML formatting
439
440## Version 6.13.11 (2026-02-14) - FORMATTED DESCRIPTIONS
441
442### Rich Text Formatting in Static Calendar
443- **Hover tooltips** now show formatted text (bold, italic, links, line breaks)
444- **Itinerary descriptions** display with full formatting
445- Uses existing `renderDescription()` function for consistency
446- Supports: `**bold**`, `//italic//`, `[[links]]`, `[markdown](links)`, line breaks
447
448### Technical Details
449- Added `data-tooltip` attribute with rich HTML content
450- New JavaScript tooltip handler with smart positioning
451- CSS styles for `.static-tooltip` and itinerary formatting
452- Tooltips stay within viewport bounds
453
454## Version 6.13.10 (2026-02-14) - PRINT MARGINS FIX v3
455
456### Fixed Print Margins - Inline Styles Approach
457- Removed reliance on `@page` CSS (browser support inconsistent)
458- Uses inline style `padding: 50px 60px` directly on wrapper div
459- Simplified CSS for better browser compatibility
460- Smaller table font (12px) for better fit
461- Set `max-width: 800px` on content wrapper
462
463## Version 6.13.9 (2026-02-14) - PRINT MARGINS FIX v2
464
465### Fixed Print Margins
466- Added `.print-wrapper` div with 0.5in padding/margin
467- Uses both `@page` margin AND wrapper margins for compatibility
468- Set `@page { margin: 1in 0.75in }` (top/bottom 1in, sides 0.75in)
469- Wrapper has `max-width: 7.5in` to fit standard letter size
470- Smaller fonts (0.85em) to fit more content
471- Added 250ms delay before print to ensure styles load
472
473## Version 6.13.8 (2026-02-14) - PRINT MARGINS FIX
474
475### Improved Print Layout
476- Added `@page { margin: 0.75in }` for proper print margins
477- Increased body padding to 40px for screen preview
478- Smaller font sizes to fit better on page
479- Description column limited width with word-wrap
480- Table header repeats on each page (`display: table-header-group`)
481- Rows avoid page breaks in middle (`page-break-inside: avoid`)
482- Print color adjust enabled for backgrounds
483
484## Version 6.13.7 (2026-02-14) - ALL THEMES FOR STATIC CALENDAR
485
486### Added All Theme Options
487Now all themes work with static calendar:
488
489| Theme | Description |
490|-------|-------------|
491| `matrix` | Green on dark (default Matrix style) |
492| `pink` | Pink/magenta on dark |
493| `purple` | Purple/violet on dark |
494| `professional` | Blue on white (business style) |
495| `wiki` | Neutral gray (matches DokuWiki) |
496| `dark` | Blue on dark gray |
497| `light` | Clean white/gray |
498
499### Examples
500```
501{{calendar theme=matrix static}}
502{{calendar theme=purple static}}
503{{calendar theme=professional static}}
504{{calendar theme=wiki static}}
505```
506
507## Version 6.13.6 (2026-02-14) - QUOTED PARAMETER FIX
508
509### Fixed Quoted Parameter Parsing
510- Titles with spaces now work: `title="Feb 26 Expense Log"`
511- Uses regex to properly parse: `key="value with spaces"`
512- Supports both double and single quotes
513- Example: `{{calendar title="My Custom Title" static}}`
514
515## Version 6.13.5 (2026-02-14) - STATIC CALENDAR OPTIONS
516
517### New Static Calendar Options
518
519| Option | Description | Example |
520|--------|-------------|---------|
521| `title=X` | Custom title instead of month name | `title="Club Meetings"` |
522| `noprint` | Hide print button and print view | `{{calendar static noprint}}` |
523| `theme=X` | Apply specific theme (matrix, pink, dark, light) | `theme=matrix` |
524
525### Fixed Month/Year Lock
526- When you specify `month=X` or `year=X`, navigation is now disabled
527- `{{calendar month=2 static}}` shows only February with no nav arrows
528- `{{calendar year=2025 month=12 static}}` locks to December 2025
529
530### Examples
531```
532{{calendar static}}                              // Navigable, current month
533{{calendar month=2 static}}                      // Locked to February
534{{calendar title="Team Events" static}}          // Custom title
535{{calendar theme=matrix static}}                 // Matrix theme
536{{calendar namespace=club static noprint}}       // No print button
537{{calendar month=3 title="March Meetings" theme=pink static}}
538```
539
540## Version 6.13.4 (2026-02-14) - DEDICATED PRINT BUTTON
541
542### Added Print Button to Static Calendar
543- New ��️ print button in the calendar header
544- Opens a clean popup window with ONLY the itinerary content
545- Automatically triggers print dialog
546- Window closes after printing
547- No DokuWiki headers/footers/sidebars - just the calendar
548
549### How It Works
550- Extracts the print view HTML
551- Creates a new window with minimal styling
552- Calls `window.print()` automatically
553- Clean single-page output
554
555## Version 6.13.3 (2026-02-14) - PRINT BLANK PAGES FIX
556
557### Fixed Blank Pages When Printing
558- Aggressively hide ALL screen view elements and children in print
559- Reset height/width to 0 with !important on grid, cells, events
560- Ensure print view elements have proper display table properties
561- Force all hidden elements to position:absolute off-screen
562
563## Version 6.13.2 (2026-02-14) - STATIC CALENDAR RESPONSIVE FIX
564
565### Improved Static Calendar Layout
566- Changed from `max-width: 900px` to `width: 100%` for full container fit
567- Added `table-layout: fixed` for consistent column widths
568- Added `overflow-x: auto` for horizontal scroll on very small screens
569- Reduced header padding and font sizes for better fit
570- Improved responsive breakpoints for mobile (768px and 480px)
571- Hide time on very small screens to save space
572- Better touch targets for navigation buttons
573
574## Version 6.13.1 (2026-02-14) - STATIC CALENDAR FIX
575
576### Bug Fix
577- Added missing `getImportantNamespaces()` helper method
578- Fixed `loadEventsForMonth` → use existing `loadEvents` method
579- Added multi-namespace/wildcard support to static calendar
580
581## Version 6.13.0 (2026-02-14) - STATIC CALENDAR MODE
582
583### New Static/Presentation Mode
584Read-only calendar view for public display and printing.
585
586**Usage:**
587```
588{{calendar static}}
589{{calendar namespace=meetings static}}
590```
591
592**Screen View Features:**
593- Clean calendar grid without edit/delete buttons
594- Month navigation (prev/next arrows)
595- Hover tooltips showing full event details (title, time, description)
596- Important events highlighted with ⭐ and golden background
597- Today's date highlighted
598- Responsive design for mobile
599
600**Print View Features:**
601- Automatically switches to itinerary format when printing
602- Table layout: Date | Time | Event | Details
603- Important events marked with ⭐
604- Dates grouped (date only shown once per day)
605- Page break handling for long lists
606- Clean black & white friendly output
607
608**Files Changed:**
609- `syntax.php`: Added `renderStaticCalendar()` method
610- `action.php`: Added `getStaticCalendar()` AJAX handler
611- `calendar-main.js`: Added `navStaticCalendar()` function
612- `style.css`: Added static calendar styles + print media queries
613
614## Version 6.12.7 (2026-02-14) - ADMIN MENU ICON
615
616### Added Admin Menu Icon
617- New monochrome SVG calendar icon for DokuWiki admin menu
618- Icon shows calendar with binding rings, header, and date dots
619- Matches DokuWiki's admin interface style
620- Added `getMenuIcon()` method to admin.php
621- Icon file: `images/icon.svg`
622
623## Version 6.12.6 (2026-02-14) - CONFIG IMPORT FIX
624
625### Fixed Config Import Validation
626- Now accepts both `return [` and `return array(` syntax
627- Regex updated from `/return\s*\[/` to `/return\s*(\[|array\s*\()/`
628- Older PHP config files using `return array(...)` now import correctly
629
630## Version 6.12.5 (2026-02-14) - MOBILE BUTTON FIX
631
632### Fixed Delete/Edit Buttons on Mobile
633- Added `type="button"` attribute to prevent form submission issues
634- Added `touchend` event delegation for reliable mobile touch handling
635- Increased button touch targets (32px default, 40px on mobile)
636- Added `touch-action: manipulation` to prevent touch delays
637- Added `-webkit-tap-highlight-color` for visual feedback
638
639### Technical Details
640- Mobile browsers sometimes don't fire `onclick` reliably
641- New `touchend` handler calls `btn.click()` explicitly
642- Larger touch targets meet accessibility guidelines (44px recommended)
643
644## Version 6.12.4 (2026-02-14) - STAR INLINE FIX
645
646### Fixed Star Position in Day Popup
647- Star icon now displays inline with event title (left side)
648- Changed `.popup-event-title` from `flex: 1 1 100%` to `flex: 1 1 auto`
649- Star and title stay on same line instead of star being above
650
651## Version 6.12.3 (2026-02-14) - DAY POPUP IMPORTANT EVENTS
652
653### Important Event Highlighting in Day Popup
654- Events from important namespaces now show ⭐ star icon
655- Golden gradient background highlight for important events
656- Golden border glow effect matching other views
657- Consistent styling across calendar grid, sidebar, and day popup
658
659### Technical Details
660- Added `importantNamespaces` check to `showDayPopup()` function
661- Added `.popup-event-important` and `.popup-event-star` CSS classes
662- Reads important namespaces from `container.dataset.importantNamespaces`
663
664## Version 6.12.2 (2026-02-14) - MULTI-DAY EVENT TIME FIX
665
666### Multi-Day Event End Time
667- End time now allows all times when end date differs from start date
668- Example: Event from 9:00 PM on Feb 28 to 5:00 AM on Feb 29 now works correctly
669- Same-day events still enforce end time > start time
670- Changing end date now triggers time validation update
671
672### Technical Details
673- `updateEndTimeOptions()` checks if `endDate !== startDate`
674- If multi-day, all time options are enabled
675- Added `onchange` handler to both start date and end date fields
676
677## Version 6.12.1 (2026-02-14) - TIME PICKER & EDIT DIALOG FIX
678
679### Improved Time Picker
680- Grouped time options by period (Morning, Afternoon, Evening, Night)
681- Much easier to navigate - no more scrolling through 96 options
682- End time options before start time are now hidden/disabled
683- Invalid end times automatically corrected when start time changes
684
685### Fixed Edit Event Dialog Draggability
686- Edit dialog is now properly draggable (was broken due to async AJAX)
687- Moved `makeDialogDraggable()` call inside the AJAX success callback
688- Removed redundant wrapper patch that didn't work with async code
689
690### Technical Details
691- Time picker uses `<optgroup>` for visual grouping
692- End time validation hides invalid options (not just disables)
693- Both Add and Edit dialogs now call `makeDialogDraggable()` directly
694
695## Version 6.12.0 (2026-02-14) - EVENT EDITOR DIALOG IMPROVEMENTS
696
697### Fixed Event Editor Dialog Draggability
698- Fixed duplicate event listener accumulation that caused performance degradation
699- Each time dialog opened, new drag listeners were added without removing old ones
700- Now properly cleans up old listeners before adding new ones
701- Added `cursor: grabbing` feedback while dragging
702- Dialog position resets when reopened (no more stuck positions)
703- Excluded close button from triggering drag
704
705### Optimized Time Selection Performance
706- Simplified `updateEndTimeOptions()` to be much faster
707- Removed expensive loop through 96 options checking style.display
708- Now just validates current selection and sets new value if invalid
709- Should eliminate freezing/lag when selecting start time
710
711### Technical Details
712- Added `_dragCleanup` function stored on handle element
713- Cleanup called before re-initialization
714- Removed unnecessary `setTranslate` helper function
715
716## Version 6.11.4 (2026-02-13) - JAVASCRIPT LOCALIZATION
717
718### JavaScript Frontend Localization
719- Added `getCalendarLang()` helper function
720- Added `getJsLangStrings()` PHP method
721- Embedded JSON language data in all render functions
722- Localized month names (full + short)
723- Localized dialog titles, confirmations, badges, empty states
724
725## Version 6.11.3 (2026-02-13) - SIDEBAR WIDGET LOCALIZATION
726
727### Sidebar Widget
728- Fixed `\n` in single-quoted strings → double-quoted for proper newlines
729- Localized "Runs every X minutes" cron descriptions
730- Event dialog labels, placeholders, options
731- Day names, ordinal positions, color names
732- Today/Tomorrow/Important section headers
733
734## Version 6.11.2 (2026-02-13) - ADMIN BACKEND LOCALIZATION
735
736### Admin Backend
737- Localized ~220 hardcoded strings in admin.php
738- AJAX JSON responses, redirect messages, error messages
739- Pattern names (Daily, Weekly, Monthly, etc.)
740
741## Version 6.11.1 (2026-02-13) - CONFIG IMPORT BUG FIX
742
743### Bug Fix
744- Fixed regex to accept both `return [` and `return array(` syntax
745- File: `admin.php` lines 5947, 6001
746
747## Version 6.10.6 (2026-02-13) - MANAGE RECURRING DIALOG LOCALIZATION
748
749### Localized Manage Recurring Series Dialog
750Complete translation of the "Manage" button dialog for recurring events:
751
752**Section Headers:**
753- "Manage Recurring Series" → "Wiederkehrende Serie verwalten"
754- "Extend Series" → "Serie erweitern"
755- "Trim Past Events" → "Vergangene Termine kürzen"
756- "Change Pattern" → "Muster ändern"
757- "Change Start Date" → "Startdatum ändern"
758- "Pause Series" / "Resume Series" → "Serie pausieren" / "Serie fortsetzen"
759
760**Labels & Buttons:**
761- All field labels (Add occurrences, Days apart, Remove before, New interval, etc.)
762- Action buttons (Extend, Trim, Change, Shift, Pause, Resume, Close)
763- Interval dropdown options (Daily, Weekly, Bi-weekly, Monthly, Quarterly, Yearly)
764- Help text and notes
765
766**Confirmation Dialogs:**
767- Trim confirmation with date
768- Respace confirmation
769- Shift confirmation
770
771### Added 60+ Language Strings for Dialogs
772Complete vocabulary for recurring event management in both English and German.
773
774### Note on Browser Validation Messages
775"Please fill out this field" is a browser-native message controlled by the browser's language setting, not our plugin.
776
777## Version 6.10.5 (2026-02-13) - DIALOG LOCALIZATION
778
779### Localized All JavaScript Dialogs
780
781**New Namespace Dialog:**
782- Prompt text with examples now in German
783- Invalid namespace error message
784
785**Rename Namespace Dialog:**
786- Prompt text with current name
787
788**Delete Confirmations:**
789- Delete selected events confirmation
790- Delete namespace confirmation
791- Delete recurring series confirmation
792
793**Trim Recurring Events:**
794- "Counting..." / "Zähle..."
795- "Trimming..." / "Kürze..."
796- "No past recurring events found" message
797- "Found X past recurring events" confirmation
798- Button text resets
799
800### Added 15+ New Dialog Strings
801Both English and German translations for all interactive prompts and confirmations.
802
803## Version 6.10.4 (2026-02-13) - COMPLETE MANAGE TAB LOCALIZATION
804
805### Fixed Remaining English Strings
806
807**Namespace Explorer Control Bar:**
808- "➡️ Move" → "➡️ Verschieben"
809- "➕ New Namespace" → "➕ Neuer Namensraum"
810- "�� Cleanup" → "�� Bereinigen"
811- "0 selected" → "0 ausgewählt"
812- "%d selected" → "%d ausgewählt"
813
814**Recurring Events Button Tooltips:**
815- "Edit title, time, namespace, pattern" → "Titel, Zeit, Namensraum, Muster bearbeiten"
816- "Extend, trim, pause, change dates" → "Erweitern, kürzen, pausieren, Daten ändern"
817- "Delete all occurrences" → "Alle Vorkommen löschen"
818
819**JavaScript Confirmation Messages:**
820- "No events selected" → "Keine Termine ausgewählt"
821- Delete confirmation with count
822- Delete namespace confirmation
823- "Scanning..." → "Scanne..."
824- "Cleaning..." → "Bereinige..."
825- "No empty namespaces found" message
826- "Found X item(s) to clean up" → "X Element(e) zum Bereinigen gefunden"
827- "Proceed with cleanup?" → "Mit Bereinigung fortfahren?"
828
829### Technical
830- Added adminLang JavaScript object with all translatable strings
831- All dynamic JavaScript messages now use language system
832
833## Version 6.10.3 (2026-02-13) - RECURRING EVENTS & DROP TARGET LOCALIZATION
834
835### Additional Localization for Manage Events Tab
836
837**Recurring Events Table:**
838- Search placeholder: "Wiederkehrende Termine suchen..."
839- Table headers: Titel, Namensraum, Muster, Zeitraum, Anzahl, Quelle, Aktionen
840- Source labels: Markiert / Erkannt (was Flagged / Detected)
841- Action buttons: Bearb. / Verwalten / Lö. (was Edit / Manage / Del)
842- Pattern badges: Täglich, Wöchentlich, Monatlich, Jährlich, Benutzerdefiniert
843- Footer: "Gesamt: X Serien" (was "Total: X series")
844- No results message
845
846**Namespace Explorer Drop Zones:**
847- Header: "�� Zielbereich" (was "Drop Target")
848- Drop hint: "Hier ablegen" (was "Drop here")
849- Default namespace label consistent
850
851### Added 25+ New Language Strings
852- Recurring table columns and labels
853- Pattern translations
854- Action button labels
855- Drop zone labels
856
857## Version 6.10.2 (2026-02-13) - MANAGE EVENTS TAB LOCALIZATION
858
859### Localized: Manage Events Tab (Complete)
860All text in the Manage Events admin tab now uses the language system:
861
862**Events Manager Section:**
863- Page title, section header, description
864- Statistics labels (Total Events, Namespaces, JSON Files, Recurring)
865- "Last scanned" timestamp label
866- Button labels (Re-scan Events, Export All Events, Import Events)
867- "View Breakdown by Namespace" expandable section
868- Table headers (Namespace, Events, Files)
869
870**Important Namespaces Section:**
871- Section header and description
872- Visual Effects descriptions (Calendar Grid, Event Sidebar, Sidebar Widget, Day Popup)
873- Save button and hint text
874
875**Cleanup Old Events Section:**
876- Section header and description
877- Radio button labels (By Age, By Status, By Date Range)
878- Age options (Delete events older than, months, years)
879- Status options (Completed tasks, Past events)
880- Date range labels (From, To)
881- Namespace filter label and placeholder
882- Preview and Delete button labels
883- JavaScript confirmation messages
884- Loading/error states
885
886**Recurring Events Section:**
887- Section header
888- Button labels (Trim All Past, Rescan)
889
890**Namespace Explorer Section:**
891- Section header and description
892- Search placeholder
893- Control bar buttons (All, None, Delete, Move to)
894- Datalist placeholder
895
896### Added 60+ New Language Strings
897Both English and German language files expanded with comprehensive admin terminology.
898
899## Version 6.10.1 (2026-02-13) - LANGUAGE SYSTEM FIX
900
901### Bug Fix: Language Files Not Working
902- Fixed `getMenuText()` to use `$this->getLang('menu')` instead of hardcoded string
903- Admin menu now correctly shows "Kalenderverwaltung" in German
904- Admin tabs now use language system:
905  - "Manage Events" → "Termine verwalten"
906  - "Update Plugin" → "Plugin aktualisieren"
907  - "Outlook Sync" → "Outlook-Sync"
908  - "Themes" → "Designs"
909
910### Added More Language Strings
911- Admin tab labels
912- Admin section headers (Event Browser, Important Namespaces, etc.)
913- Sync settings labels
914- Common button labels (Run Now, Download, Upload, Delete, etc.)
915
916## Version 6.10.0 (2026-02-13) - GERMAN LANGUAGE SUPPORT
917
918### New Feature: German Language Translation
919- Added complete German (de) language file
920- Expanded English language file with comprehensive translatable strings
921- Both files include 100+ translation strings covering:
922  - General terms (calendar, events, dates)
923  - Event fields (title, description, time, etc.)
924  - Actions (add, edit, delete, save, cancel)
925  - Task-related terms
926  - Recurring event options
927  - Days of week and months
928  - User messages and confirmations
929  - Search functionality
930  - Sync status messages
931  - Admin section labels
932  - Sidebar widget labels
933  - Time conflict warnings
934
935### Note
936The language strings are now available for future implementation throughout the plugin UI. Currently the admin menu uses the language system; other strings can be integrated as needed.
937
938## Version 6.9.9 (2026-02-13) - CRITICAL SEARCH FIX
939
940### Bug Fix: Month Search Not Working
941- **Root cause:** Function name collision - there were two `fuzzyMatch` functions
942  - `window.fuzzyMatch` (for namespace search autocomplete) returns a score number or `null`
943  - Local `fuzzyMatch` (for event search) returns `true`/`false`
944- When filtering events, the wrong function was being called, returning `null` for all events
945- **Fix:** Renamed event search functions to `eventSearchNormalize` and `eventSearchMatch`
946- Month search now works correctly on first load and after navigation
947
948### Also in this version
949- Fixed jumpToDate to properly hide search clear button after navigation
950- Removed debug logging from production code
951
952## Version 6.9.8 (2026-02-12) - SEARCH & UI FIXES
953
954### Bug Fixes
955
956**All-Dates Search Navigation Fixed**
957- Clicking a search result now properly navigates to that event's month
958- Opens the day popup showing the event details
959- Was calling non-existent `loadMonth()` - now uses correct `navCalendar()`
960- Clears search results and restores normal event list view
961
962**"No Events" Message Fixed**
963- No longer shows "No events match your search" when in all-dates mode
964- All-dates mode has its own results display; the month-mode message was incorrectly appearing
965
966**Add Button Layout Fixed**
967- Search bar no longer pushes the "+ Add" button off the right edge
968- Search container has constrained max-width (160px) and proper flex settings
969- Header has overflow:hidden to prevent layout issues
970
971**Important Event Stars Fixed**
972- Stars now appear on initial page load (PHP rendering added)
973- Stars positioned outside the bar using CSS ::before pseudo-element
974- Added overflow:visible to event-indicators and event-bar containers
975- Bar remains full width; star sits in the left margin area
976
977### Technical
978- Star uses `event-bar-has-star` class for first-day-only display
979- jumpToDate() properly cleans up search state before navigation
980
981## Version 6.9.7 (2026-02-12) - IMPORTANT NAMESPACE IMPROVEMENTS
982
983### Bug Fix
984- **AJAX refresh now preserves important namespace highlighting**
985  - Important namespaces list now passed to JavaScript via data attribute
986  - Highlighting persists when navigating between months
987  - Works in both main calendar sidebar and standalone event panels
988
989### New Feature: Calendar Grid Star Icons
990- **Important events now show ⭐ on their color bars** in the calendar grid
991  - Small star appears on the first day of important events
992  - Tooltip prefixed with ⭐ for important events
993  - Visual distinction without cluttering the compact grid view
994
995### Admin Section Update
996- **Improved Important Namespaces description** in Admin → Calendar → Manage Events
997  - Now explains all visual effects:
998    - Calendar Grid: ⭐ star on event bars
999    - Event Sidebar: ⭐ star + highlighted background + accent border
1000    - Sidebar Widget: Dedicated "Important Events" section
1001    - Day Popup: Events shown with full details
1002  - Better example placeholder text
1003
1004### Technical
1005- Fixed PHP syntax error in fuzzy search (curly quotes replaced with escape sequences)
1006- Important namespaces loaded once and stored in container dataset for JavaScript access
1007
1008## Version 6.9.6 (2026-02-12) - FUZZY SEARCH & SIDEBAR HIGHLIGHTING
1009
1010### Fuzzy Search
1011- **Improved search matching:** Search is now more forgiving of punctuation differences
1012  - "fathers day" matches "Father's Day"
1013  - "new years" matches "New Year's Eve"
1014  - Smart quotes, apostrophes, dashes, and common punctuation are ignored
1015- **Multi-word search:** All words must be present but in any order
1016  - "birthday john" matches "John's Birthday Party"
1017- Works in both "this month" and "all dates" search modes
1018
1019### Important Namespace Highlighting (Calendar Sidebar)
1020- Events from important namespaces now highlighted in the main calendar's event list sidebar
1021- Same visual treatment as the itinerary sidebar widget:
1022  - Subtle theme-colored background tint
1023  - Right border accent bar
1024  - ⭐ star icon before event title
1025- Theme-specific colors:
1026  - Matrix: green tint
1027  - Purple: purple tint
1028  - Pink: pink tint
1029  - Professional: blue tint
1030  - Wiki: light blue tint
1031- Configure important namespaces in Admin → Calendar → Sync Settings
1032
1033## Version 6.9.5 (2026-02-12) - SEARCH MODE TOGGLE
1034
1035### New Feature: Search Scope Toggle
1036- **Search mode button** (��/��) added next to search input in both calendar views
1037- **Default mode** (��): Search only the current month's events (fast, local filtering)
1038- **All dates mode** (��): Search across ALL calendar data via AJAX
1039  - Click the �� button to toggle to �� (green highlight when active)
1040  - Requires at least 2 characters to search
1041  - Shows results with date, time, and namespace
1042  - Click any result to jump to that date and open the day popup
1043  - Limited to 50 results for performance
1044- Search placeholder text updates to indicate current mode
1045- Compact button design takes minimal space
1046
1047### UI Details
1048- Button sits flush with search input (no gap)
1049- Green highlight when "all dates" mode is active
1050- Results show full date (e.g., "Mon, Feb 12, 2026")
1051- Namespace badge shown for multi-namespace setups
1052
1053## Version 6.9.4 (2026-02-12) - POPUP IMPROVEMENTS & IMPORTANT HIGHLIGHTING
1054
1055### Features
1056- **Draggable Day Popup:** Calendar day popup window is now draggable by its header
1057  - Click and drag the header to move the popup
1058  - Header shows move cursor on hover
1059  - Clicking the close button (×) still closes normally
1060
1061- **Important Namespace Highlighting in Sidebar:**
1062  - Events from "important" namespaces (defined in Admin → Sync Settings) now have subtle highlighting
1063  - Theme-aware background tint (green for Matrix, purple for Purple, pink for Pink, blue for Professional/Wiki)
1064  - Right border accent bar for visual distinction
1065  - ⭐ star icon appears before event title
1066  - Works in Today, Tomorrow, and Important Events sections
1067
1068### Bug Fix
1069- **Fixed event display in day popup:** Long titles no longer cut off the edit/delete buttons
1070  - Event title now wraps to multiple lines instead of truncating
1071  - Actions buttons always visible
1072  - Time, date range, and namespace badges wrap properly
1073  - Improved flex layout for better responsiveness
1074
1075## Version 6.9.3 (2026-02-12) - ADMIN EDIT DIALOG CONSISTENCY
1076
1077### UI Improvement
1078- **Edit Recurring Event dialog** in Admin section now matches the main event editor exactly:
1079  - Same dark theme styling (#1e1e1e background, #2c3e50 header)
1080  - Same header layout with close button (×) in top-right corner
1081  - Same input styling (dark inputs with green accent borders)
1082  - Same footer with Cancel/Save buttons layout
1083  - Same recurrence options box styling
1084  - Consistent spacing, fonts, and colors throughout
1085
1086## Version 6.9.2 (2026-02-12) - MOBILE DIALOG FIX
1087
1088### Bug Fix
1089- **Fixed:** Description textarea now extends full width on mobile/phone view
1090  - Reduced form padding from 12px to 8px on screens ≤480px
1091  - Added explicit `width: 100%` and `box-sizing: border-box` to textarea
1092  - Ensured all form inputs/selects use full available width on mobile
1093
1094## Version 6.9.1 (2026-02-11) - ADMIN RECURRING EVENTS INTEGRATION
1095
1096### Admin Panel Updates
1097- **Enhanced Recurring Events Table:**
1098  - Pattern column now shows color-coded badges (daily=blue, weekly=green, monthly=orange, yearly=pink)
1099  - "First" column renamed to "Range" showing full date span (e.g., "Feb 1, 2026 → Dec 15, 2026")
1100  - Patterns now read from stored metadata when available, with smart fallback to detection
1101
1102- **Edit Recurring Series Dialog:**
1103  - Full recurrence pattern editing (not just simple intervals)
1104  - "Repeat every [N] [period]" with dropdown for Daily/Weekly/Monthly/Yearly
1105  - Weekly: Day-of-week checkboxes (Sun-Sat) with current days pre-selected
1106  - Monthly: Radio choice between "Day of month" or "Weekday pattern"
1107  - Ordinal weekday selector (First/Second/Third/Fourth/Fifth/Last + day dropdown)
1108  - Pre-populates all fields from stored recurrence metadata
1109  - Properly reschedules future events using new pattern
1110
1111- **Manage Series Dialog:**
1112  - Updated summary to show date range
1113  - Extend/trim/change pattern functions work with new patterns
1114
1115### Technical Updates
1116- `findRecurringEvents()` captures all recurrence metadata from events
1117- `formatRecurrencePattern()` generates human-readable pattern descriptions
1118- `detectRecurrencePattern()` enhanced to detect more interval variations
1119- `editRecurringSeries()` PHP handler processes new recurrence parameters
1120- `generateRecurrenceDates()` creates dates matching complex patterns
1121- Recurrence metadata preserved and updated across all event occurrences
1122
1123## Version 6.9.0 (2026-02-11) - ADVANCED RECURRING EVENTS
1124
1125### New Features
1126- **Enhanced Recurring Event Options:**
1127  - **Interval support:** Repeat every N days/weeks/months/years (e.g., every 3 months)
1128  - **Weekly day selection:** Choose specific days of the week (e.g., Mon, Wed, Fri)
1129  - **Monthly options:**
1130    - Day of month: Repeat on specific day (e.g., 15th of each month)
1131    - Ordinal weekday: Repeat on pattern (e.g., 2nd Wednesday, Last Friday)
1132  - **Examples now possible:**
1133    - Every 2 weeks on Monday and Thursday
1134    - Every 3 months on the 15th
1135    - Every other month on the 2nd Wednesday
1136    - Every year on the same date
1137    - Last Friday of every month
1138
1139### UI Changes
1140- Redesigned recurring options section with bordered container
1141- "Repeat every [N] [period]" input with interval number field
1142- Day-of-week checkboxes for weekly recurrence
1143- Radio buttons for monthly: "Day of month" vs "Weekday pattern"
1144- Ordinal dropdown (First/Second/Third/Fourth/Fifth/Last)
1145- Day dropdown (Sunday through Saturday)
1146- Helper text for end date field
1147
1148### Technical Details
1149- New parameters: recurrenceInterval, weekDays, monthlyType, monthDay, ordinalWeek, ordinalDay
1150- Recurrence pattern stored in event data for reference
1151- Maximum 365 occurrences (up from 100) to support daily events for a year
1152- Smart date iteration for complex patterns
1153
1154## Version 6.8.1 (2026-02-11) - ITINERARY DEFAULT STATE SETTING
1155
1156### New Feature
1157- **Added:** Option to set itinerary default state (expanded or collapsed)
1158  - New setting in Admin → Calendar → �� Sidebar Widget Settings
1159  - "�� Itinerary Section" with two options:
1160    - **Expanded** (default) - Show itinerary sections by default
1161    - **Collapsed** - Hide itinerary sections by default (click bar to expand)
1162  - Setting persists across page loads
1163  - Arrow indicator and content state reflect the saved preference on page load
1164
1165## Version 6.8.0 (2026-02-11) - COLLAPSIBLE ITINERARY
1166
1167### New Feature
1168- **Added:** Collapsible Itinerary bar in sidebar week view
1169  - New "ITINERARY" bar below the week calendar (styled like +ADD EVENT bar)
1170  - Click to collapse/expand the Today, Tomorrow, and Important Events sections
1171  - Arrow indicator shows expanded (▼) or collapsed (►) state
1172  - Smooth animation when collapsing/expanding
1173  - Clicking a day in the week grid shows that day's events ABOVE the Itinerary bar
1174  - Selected day events remain visible whether itinerary is expanded or collapsed
1175  - Shows "No upcoming events" message when there are no itinerary items
1176
1177### UI Layout (top to bottom)
11781. Header with clock/system stats
11792. +ADD EVENT bar
11803. Week grid (7 days)
11814. Selected day's events (appears when clicking a day)
11825. ITINERARY bar (click to collapse/expand)
11836. Today section (collapsible)
11847. Tomorrow section (collapsible)
11858. Important Events section (collapsible)
1186
1187## Version 6.7.9 (2026-02-11) - FIX EVENTS MANAGER STATISTICS
1188
1189### Bug Fixes
1190- **Fixed:** �� Events Manager showing inflated count (1195 instead of ~605)
1191  - The `scanDirectoryForStats()` function was counting ALL entries in JSON files
1192  - Now properly filters to only count date keys (`YYYY-MM-DD` format)
1193  - Now validates events have `id` and `title` before counting
1194  - Click "�� Rescan" to update the statistics with correct count
1195
1196## Version 6.7.8 (2026-02-11) - FILTER INVALID EVENTS
1197
1198### Bug Fixes
1199- **Fixed:** Event Manager showing "(untitled)" and "mapping" entries
1200  - Root cause: Calendar JSON files contain metadata keys (like "mapping") that were being parsed as events
1201  - Added date format validation (`YYYY-MM-DD`) to skip non-date keys
1202  - Added validation to require `id` and `title` fields for events
1203  - Applied fix to all event-reading functions:
1204    - `getEventsByNamespace()` - main event listing
1205    - `scanNamespaceRecursive()` - namespace scanning
1206    - `searchEvents()` - event search
1207    - `findEventsByTitle()` - title lookup
1208    - `deleteRecurringSeries()` - recurring deletion
1209    - `renameRecurringSeries()` - recurring rename
1210    - Recurring events scanner
1211    - Recurring cleanup function
1212
1213### Technical Details
1214- Date keys must match pattern `/^\d{4}-\d{2}-\d{2}$/`
1215- Events must have non-empty `id` and `title` fields
1216- All other entries in JSON files are now skipped
1217
1218## Version 6.7.7 (2026-02-11) - FIX PHP PATH & CLEAR LOG
1219
1220### Bug Fixes
1221- **Fixed:** "sh: 1: '/usr/bin/php': not found" error - removed escapeshellarg() which was adding quotes around the PHP path
1222- **Fixed:** "Could not clear log file" - added better error messages showing exact issue
1223- **Improved:** findPhpBinary() now uses is_executable() and `which php` for detection
1224- **Improved:** clearLogFile() now shows specific error (file not found, not writable, etc.)
1225
1226## Version 6.7.6 (2026-02-11) - FIX SYNC CONTROLS & LOGGING
1227
1228### Bug Fixes
1229- **Fixed:** Double log entries - sync script logs internally, removed redundant stdout capture
1230- **Fixed:** Manual sync not appearing in log - removed `--verbose` flag since script logs directly
1231- **Fixed:** Better error messages when sync fails
1232
1233### Improvements
1234- **Improved:** Sync now runs without `--verbose` flag - script logs to file internally
1235- **Improved:** Crontab warning if `>>` redirect is detected (causes duplicate entries)
1236- **Improved:** Log viewer now shows full path to log file
1237- **Improved:** Better pre-flight checks (directory creation, file permissions)
1238- **Improved:** PHP binary path is now properly escaped
1239
1240### Crontab Update Required
1241If your crontab has `>> sync.log 2>&1`, remove it to prevent duplicate log entries:
1242
1243**Before (causes duplicates):**
1244```
1245*/2 * * * * cd /var/www/html/dokuwiki/lib/plugins/calendar && php sync_outlook.php >> /var/www/html/dokuwiki/data/meta/calendar/sync.log 2>&1
1246```
1247
1248**After (correct):**
1249```
1250*/2 * * * * cd /var/www/html/dokuwiki/lib/plugins/calendar && php sync_outlook.php
1251```
1252
1253The script automatically logs to `data/meta/calendar/sync.log`.
1254
1255## Version 6.7.5 (2026-02-11) - FIX SYNC LOG OUTPUT
1256
1257### Bug Fixes
1258- **Fixed:** Sync log not showing output when running sync from admin panel
1259  - Added `--verbose` flag to sync command so output is captured
1260  - Sync output is now captured and written to the log file
1261  - Log directory is created if it doesn't exist
1262  - Better error handling if log directory isn't writable
1263  - Command being executed is logged for debugging
1264
1265### Changes
1266- Sync now runs in verbose mode when triggered from admin panel
1267- All sync output (stdout/stderr) is written to the log file
1268- Pre-flight check ensures log directory exists and is writable
1269
1270## Version 6.7.4 (2026-02-11) - FIX MANUAL SYNC EXECUTION
1271
1272### Bug Fix
1273- **Fixed:** "Could not open input file: sync_outlook.php" when running manual sync
1274  - The `$pluginDir` variable was missing from `runSync()` function
1275  - Added `$pluginDir = DOKU_PLUGIN . 'calendar'` before building the command
1276  - Sync now properly changes to the plugin directory before executing
1277
1278## Version 6.7.3 (2026-02-11) - FIX ADDITIONAL COUNT TYPE ERRORS
1279
1280### Bug Fix
1281- **Fixed:** Additional TypeError "count(): Argument #1 ($value) must be of type Countable|array, int given"
1282  - Fixed in `scanDirectoryForStats()` (line 5453)
1283  - Fixed in namespace delete function (line 4137)
1284  - Fixed in export function (line 5516)
1285  - Fixed in import function (line 5636)
1286  - All locations now check `is_array()` before calling `count()`
1287
1288## Version 6.7.2 (2026-02-11) - FIX EVENT MANAGER TYPE ERROR
1289
1290### Bug Fix
1291- **Fixed:** TypeError "count(): Argument #1 ($value) must be of type Countable|array, int given"
1292  - Added array type checks when iterating over calendar event data
1293  - Protects against corrupted JSON data where event lists may not be arrays
1294  - Added safeguards in `getEventsByNamespace()` and `scanNamespaceRecursive()`
1295
1296## Version 6.7.1 (2026-02-11) - BULK DELETE FOR BACKUPS
1297
1298### Changed
1299- **Improved:** Backup management now uses bulk selection and delete
1300  - Added checkboxes next to each backup file
1301  - Added "Select All" checkbox in the action bar
1302  - Added "��️ Delete Selected" button (appears when backups are selected)
1303  - Removed individual delete buttons from each row
1304  - Shows count of selected backups
1305  - Backups are deleted sequentially with visual feedback
1306
1307### UI
1308- Clean action bar at top of backup table with selection controls
1309- Selected count updates in real-time
1310- Rows fade out smoothly when deleted
1311
1312## Version 6.7.0 (2026-02-11) - IMPROVED RESTORE FUNCTION
1313
1314### Changed
1315- **Improved:** Restore function now uses DokuWiki's Extension Manager API
1316  - Uses `helper_plugin_extension_extension` for proper installation
1317  - Handles permissions correctly through DokuWiki's standard plugin installation process
1318  - Falls back to manual instructions if Extension Manager is not available
1319
1320### How It Works
1321When you click "�� Restore" on a backup:
13221. The plugin loads DokuWiki's extension helper
13232. Calls `installFromLocal()` with the backup ZIP file
13243. DokuWiki's Extension Manager handles file extraction and installation
13254. This ensures proper permissions and follows DokuWiki standards
1326
1327### Fallback
1328If the Extension Manager helper is not available, you'll be prompted to:
1329- Download the backup ZIP
1330- Go to Admin → Extension Manager → Install
1331- Upload the ZIP file manually
1332
1333## Version 6.6.9 (2026-02-11) - REMOVE RESTORE FUNCTION
1334
1335### Removed
1336- **Removed:** "Restore" button from backup management
1337- **Removed:** `restoreBackup()` PHP method
1338- **Removed:** `restoreBackup()` JavaScript function
1339
1340### Added
1341- **Added:** Informational note in backup section explaining how to restore:
1342  - Download the backup ZIP file
1343  - Go to Admin → Extension Manager → Install
1344  - Upload the ZIP file there
1345  - DokuWiki's extension manager handles installation safely with proper permissions
1346
1347### Reason
1348The restore function required write access to the plugin directory, which web servers typically don't have (and shouldn't have) for security reasons. Using DokuWiki's built-in Extension Manager is the safer and more reliable approach.
1349
1350## Version 6.6.8 (2026-02-11) - FIX THEME KEYS & FILE PERMISSIONS
1351
1352### Bug Fixes
1353- **Fixed:** "Undefined array key" warnings for wiki theme (pastdue_color, pastdue_bg, tomorrow_bg, etc.)
1354  - Added missing theme keys to `getWikiTemplateColors()` return array
1355
1356- **Fixed:** "Permission denied" errors for sync.log and sync_state.json
1357  - Moved sync files from plugin directory to `data/meta/calendar/` (writable location)
1358  - Updated sync_outlook.php, admin.php to use new paths
1359  - sync_config.php remains in plugin directory (must be manually configured)
1360
1361- **Fixed:** `findEventNamespace` now returns the actual DIRECTORY where event file lives
1362  - This ensures deletion works correctly when stored namespace differs from file location
1363
1364### Note on lang.php Permission Error
1365If you see a permission error for lang/en/lang.php, this occurs when trying to restore/update the plugin via admin panel and the web server doesn't have write access to the plugin directory. This is normal security - update via command line or FTP instead.
1366
1367## Version 6.6.7 (2026-02-11) - FIX NAMESPACE CHANGE BUG (PART 2)
1368
1369### Bug Fix
1370- **Fixed:** Events in the DEFAULT namespace (no namespace) could not be moved to other namespaces
1371  - Root cause: The comparison `$oldNamespace !== ''` was always FALSE for default namespace events
1372  - Changed to `$oldNamespace !== null` to properly distinguish between "event not found" (null) and "event in default namespace" ('')
1373  - This allows moving events FROM the default namespace TO any other namespace
1374  - Also fixed null coalescing for recurring events: `$oldNamespace ?? $namespace` instead of `$oldNamespace ?: $namespace`
1375
1376## Version 6.6.6 (2026-02-11) - FIX NAMESPACE CHANGE & DELETE BUGS
1377
1378### Bug Fixes
1379- **Fixed:** Changing an event's namespace now properly moves the event instead of creating a duplicate
1380  - Root cause: `findEventNamespace()` was searching in the NEW namespace instead of ALL namespaces
1381  - Now uses wildcard search `'*'` to find the existing event regardless of its current namespace
1382
1383- **Fixed:** Deleting an event no longer causes the calendar to filter by the deleted event's namespace
1384  - Root cause: After deletion, `reloadCalendarData()` was called with the deleted event's namespace
1385  - Now retrieves the calendar's original namespace from `container.dataset.namespace`
1386  - Also fixed in `saveEventCompact()` and `toggleTaskComplete()` for consistency
1387
1388## Version 6.6.5 (2026-02-11) - ADD AUTOCOMPLETE ATTRIBUTES
1389
1390### Improved
1391- Added `autocomplete="new-password"` to client secret input field
1392- Added `autocomplete="email"` to user email input field
1393- Added `autocomplete="off"` to client ID input field
1394- Follows browser best practices for form inputs
1395
1396## Version 6.6.4 (2026-02-11) - FIX GEOLOCATION VIOLATION
1397
1398### Bug Fix
1399- **Fixed:** Browser violation "Only request geolocation information in response to a user gesture"
1400- Weather widget now uses Sacramento as the default location on page load
1401- Geolocation is only requested when user **clicks** on the weather icon
1402- Click the weather icon to get your local weather (browser will prompt for permission)
1403- Weather icon shows tooltip "Click for local weather" and has pointer cursor
1404
1405## Version 6.6.3 (2026-02-11) - FIX MUTATIONOBSERVER ERROR
1406
1407### Bug Fix
1408- **Fixed:** `Failed to execute 'observe' on 'MutationObserver': parameter 1 is not of type 'Node'` error
1409- Root cause: MutationObserver tried to observe `document.body` before DOM was ready
1410- Added `setupMutationObserver()` function that waits for DOMContentLoaded before attaching observer
1411
1412## Version 6.6.2 (2026-02-11) - FIX CONFLICT TOOLTIP JAVASCRIPT LOADING
1413
1414### Bug Fix
1415- **Critical:** Fixed `showConflictTooltip is not defined` and `hideConflictTooltip is not defined` errors
1416- Root cause: `addAssets()` in action.php was loading empty `script.js` instead of `calendar-main.js`
1417- Changed `addAssets()` to load `calendar-main.js` directly
1418- Updated `script.js` to dynamically load `calendar-main.js` as a fallback mechanism
1419
1420## Version 6.6.1 (2026-02-11) - SECURITY FIXES
1421
1422### Security
1423- **Critical:** Removed `eval()` remote code execution vulnerability in config import
1424- **Critical:** Added admin authentication requirement to `get_system_stats.php` endpoint
1425- **High:** Added CSRF token verification to all write operations (save, delete, toggle)
1426- **High:** Fixed path traversal vulnerabilities in namespace delete/rename functions
1427- **High:** Added admin privilege verification to AJAX admin routes
1428
1429### Improved
1430- **Input Validation:** Date format (YYYY-MM-DD), time format (HH:MM), color format (#RRGGBB)
1431- **Input Validation:** Year range (1970-2100), month range (1-12), namespace format
1432- **Input Validation:** Recurrence type whitelist, title/description length limits
1433- **Debug Logging:** All debug logging now conditional on `CALENDAR_DEBUG` constant (off by default)
1434- **JSON Handling:** Added `safeJsonRead()` helper with proper error handling
1435- **Timezone:** Sync script now uses configured timezone instead of hardcoded value
1436
1437### Code Quality
1438- Documented intentional switch fallthrough in `get_system_stats.php`
1439- Standardized error response format
1440
1441## Version 6.6.0 (2026-02-11) - BACKUP & UI IMPROVEMENTS
1442
1443### Fixed
1444- **Backup:** Fixed recursive directory backup to properly include all subdirectories (including `lang/`)
1445- **Backup:** Now uses `SELF_FIRST` iterator to process directories before their contents
1446- **Backup:** Empty directories are now explicitly added with `addEmptyDir()` to preserve structure
1447
1448### UI Change
1449- **Namespace Explorer:** Cleanup status message now appears prominently at top of section
1450- Previously status message was at bottom, easy to miss after cleanup operations
1451
1452## Version 6.5.5 (2026-02-11) - FIX AJAX ROUTING & MOVE CLEANUP BUTTON
1453
1454### Bug Fix
1455- All admin AJAX actions (cleanup, rescan, extend, trim, pause, resume, change start/pattern) were returning "Unknown action"
1456- Root cause: AJAX calls go through `action.php`'s switch statement, not `admin.php`'s `handle()` method
1457- Added routing in `action.php`: new cases forward to `admin.php` via `routeToAdmin()` helper
1458- Added public `handleAjaxAction()` method in `admin.php` as the entry point from `action.php`
1459
1460### UI Change
1461- Moved "�� Cleanup" button from standalone section to inline next to "➕ New Namespace" in the control bar
1462- Status messages still appear below the namespace explorer
1463
1464## Version 6.5.4 (2026-02-11) - FIX PHP PARSE ERROR IN CLEANUP JS
1465
1466### Bug Fix
1467- Root cause: `style='color:...'` single quotes inside PHP `echo '...'` block terminated the PHP string prematurely
1468- PHP saw `color:#e74c3c` as unexpected PHP code instead of part of the JS string
1469- Fixed all 5 occurrences in cleanupEmptyNamespaces JS: escaped single quotes as `\'`
1470- Added `adminColors` JS object (text, bg, border) injected from PHP `$colors` at render time
1471- Cleanup detail text uses `adminColors.text` to respect DokuWiki template theme colors
1472
1473## Version 6.5.3 (2026-02-11) - FIX CLEANUP NAMESPACES PARSE ERROR
1474
1475### Bug Fix
1476- Fixed PHP parse error on line 1089 caused by `$colors['text']` PHP variable inside JS string concatenation
1477- The cleanup results detail list now uses hardcoded `#666` for text color instead of attempting PHP interpolation within JS runtime code
1478
1479## Version 6.5.2 (2026-02-11) - CLEANUP EMPTY NAMESPACES
1480
1481### New Feature
1482- "�� Cleanup Empty Namespaces" button added at bottom of Namespace Explorer section
1483- Dry-run scan first: shows exactly what will be removed with bullet-point details in confirm dialog
1484- Removes empty calendar folders (0 JSON files or all-empty JSON files) from any namespace
1485- Removes parent namespace directories if they become empty after calendar folder removal
1486- Root calendar directory is never removed
1487- AJAX-powered with inline status showing results after cleanup
1488- Page auto-reloads after 2 seconds to refresh the namespace explorer view
1489- Recursively scans all nested namespace directories via `findAllCalendarDirsRecursive()`
1490
1491## Version 6.5.1 (2026-02-11) - TRIM ALL PAST: SHOW COUNT BEFORE DELETE
1492
1493### Improved
1494- "Trim All Past" button now does a dry-run count before showing the confirmation dialog
1495- Confirmation shows exact count: "Found 47 past recurring events to remove"
1496- If zero found, shows "No past recurring events found to remove" instead of confirm
1497- PHP handler supports `dry_run` parameter that counts without deleting
1498
1499## Version 6.5.0 (2026-02-11) - BULK TRIM ALL PAST RECURRING EVENTS
1500
1501### Bulk Action
1502- Red "✂️ Trim All Past" button added next to the Rescan button in the Recurring Events section header
1503- Removes ALL past occurrences (before today) from EVERY recurring series in one click
1504- Only removes events with `recurring` or `recurringId` flags — non-recurring events are untouched
1505- Confirmation dialog required before execution
1506- AJAX-powered with inline status showing count removed, then auto-rescans the table
1507- Searches all calendar directories recursively
1508
1509## Version 6.4.9 (2026-02-11) - FIX RECURRING EDIT/DELETE: SEARCH ALL DIRECTORIES
1510
1511### Bug Fix
1512- Edit and Delete recurring series now search ALL calendar directories instead of building a path from the namespace field
1513- Root cause: event's `namespace` field (stored in JSON) can differ from the filesystem directory where the file lives
1514- Both handlers now use `findCalendarDirs()` to collect every calendar directory recursively
1515- Events matched by title AND namespace field (case-insensitive) for precise targeting
1516- Edit handler rewritten: rename/time/namespace updates in Pass 1, interval respace in Pass 2
1517- New `findCalendarDirs()` helper method for recursive directory discovery
1518
1519## Version 6.4.8 (2026-02-11) - FIX PHP PARSE ERROR IN MANAGE DIALOG
1520
1521### Bug Fix
1522- Rewrote `manageRecurringSeries()` JS function using string concatenation instead of template literals
1523- JS template literals (`${...}`) inside PHP echo blocks caused PHP to parse them as variable interpolation
1524- All inline onclick handlers now use `\x27` for single quotes to avoid escaping conflicts
1525
1526## Version 6.4.7 (2026-02-11) - RECURRING EVENTS: FULL MANAGEMENT CONTROLS
1527
1528### New "Manage" Button per Series
1529- Orange "Manage" button opens a comprehensive management dialog for each recurring series
1530
1531### Extend Series
1532- Add N new occurrences after the last event in the series
1533- Configurable interval: Daily, Weekly, Bi-weekly, Monthly, Quarterly, Yearly
1534- New events copy title, time, color, namespace, and recurring flag from the last event
1535
1536### Trim Past Events
1537- Remove all occurrences before a selected cutoff date
1538- Confirmation required before deletion
1539- Cleans up empty date keys and files automatically
1540
1541### Change Pattern
1542- Respace future occurrences with a new interval
1543- Past events are untouched; only future events are removed and re-created
1544- First future event becomes the anchor date
1545
1546### Change Start Date
1547- Shift ALL occurrences by the difference between old and new start date
1548- Events are removed from old positions and re-created at new positions
1549- Preserves spacing between all events
1550
1551### Pause/Resume
1552- Pause: adds ⏸ prefix and paused flag to all future occurrences
1553- Resume: removes ⏸ prefix and paused flag from all occurrences
1554- Button toggles based on whether series is currently paused
1555
1556### Infrastructure
1557- New shared `recurringAction()` JS helper for all AJAX management operations
1558- New `getRecurringSeriesEvents()` PHP helper for finding all events in a series
1559- Status messages shown inline in the management dialog
1560- Close button triggers automatic rescan to refresh the table
1561
1562## Version 6.4.6 (2026-02-11) - RECURRING EVENTS: RESCAN BUTTON & IMPROVED LOGIC
1563
1564### Rescan Button
1565- Green "�� Rescan" button added to the Recurring Events section header
1566- AJAX-powered: rescans all calendar data and refreshes the table without page reload
1567- Shows count of found series briefly after scan completes
1568
1569### Improved Detection Logic
1570- Events with `recurring: true` flag are now detected first (grouped by `recurringId`)
1571- Pattern-detected events (3+ same-title occurrences) are found separately and deduplicated
1572- New "Source" column shows ��️ Flagged (has recurring flag) vs �� Detected (pattern match)
1573- Median interval used for pattern detection instead of just first two dates (more robust)
1574- New patterns recognized: Quarterly, Semi-annual, and "Every ~N days" for custom intervals
1575- Empty/invalid titles and malformed date arrays are now skipped safely
1576- Dates are deduplicated before counting (prevents inflated counts from multi-day events)
1577- Nested namespace directories now scanned recursively
1578- Results sorted alphabetically by title
1579
1580## Version 6.4.5 (2026-02-11) - ADMIN VERSION HISTORY OVERHAUL
1581
1582### Version History Viewer
1583- All purple (#7b1fa2) accent colors replaced with green (#00cc07) to match admin theme
1584- Changelog parser now handles `###` subsection headers (rendered as green bold labels)
1585- Plain `- ` bullet items now parsed and categorized under their subsection
1586- Previously only `- **Type:** description` format was recognized
1587
1588### Current Release Button
1589- Green "Current Release" button added between nav arrows
1590- Jumps directly to the card matching the running version from plugin.info.txt
1591- Running version card shows green "RUNNING" badge and thicker green border
1592
1593## Version 6.4.4 (2026-02-11) - WIKI THEME: PAST EVENTS TOGGLE BACKGROUND
1594
1595### Fix
1596- Wiki theme past events pulldown (retracted state) now uses `__background_neu__` (`--cell-today-bg`)
1597- Previously used `--cell-bg` which appeared unthemed/white
1598
1599## Version 6.4.3 (2026-02-11) - WIKI THEME: DAY HEADERS BACKGROUND
1600
1601### Fix
1602- Wiki theme SMTWTFS day headers now use `__background_neu__` (`--cell-today-bg`) instead of `--background-header`
1603
1604## Version 6.4.2 (2026-02-11) - WIKI THEME: DAY HEADERS (INITIAL)
1605
1606### Wiki Theme Day Headers
1607- Added explicit CSS override for `.calendar-theme-wiki .calendar-day-headers`
1608- Day header text uses `--text-primary` (template's `__text__` color)
1609
1610## Version 6.4.1 (2026-02-11) - WIKI THEME: EVENT HIGHLIGHT
1611
1612### Fix
1613- Wiki theme event highlight (when clicking calendar bar) now uses `themeStyles.header_bg` (`__background_alt__`) instead of hardcoded blue (#dce9f5)
1614- Subtle shadow instead of blue glow
1615
1616## Version 6.4.0 (2026-02-11) - DARK READER: SECTION BAR COLOR MATCHING
1617
1618### Fix
1619- Wiki theme section left bar now uses a `<div>` with `background` instead of `border-left`
1620- Dark Reader maps the same color differently for border vs background properties, causing visual mismatch
1621- Both the bar and header now use `background`, so Dark Reader maps them identically
1622- Flex layout wrapper added for wiki theme sections
1623- Wiki fallback colors updated: `border` key now uses `#ccc` (matching `__border__`) instead of `#2b73b7`
1624
1625## Version 6.3.9 (2026-02-10) - WIKI THEME: SECTION BAR FIX (ATTEMPT)
1626
1627### Fix
1628- Simplified wiki section container — removed `wiki-section-container` class
1629- Added `background` from `$themeStyles['bg']` to section container
1630
1631## Version 6.3.8 (2026-02-10) - WIKI THEME: BUTTON & SECTION HEADER COLORS
1632
1633### Wiki Theme Buttons
1634- Nav buttons (< >), Today button, and panel buttons now use `__link__` color background with white text
1635- CSS overrides for `.calendar-theme-wiki .cal-nav-btn`, `.cal-today-btn`, panel buttons
1636
1637### Wiki Theme Section Headers
1638- Today: `__link__` background (accent/link color)
1639- Tomorrow: `__background_alt__` background (alternate background)
1640- Important: `__border__` background (border color)
1641- Each section now has a distinct color from the template palette
1642
1643## Version 6.3.7 (2026-02-10) - WIKI THEME CHECKBOX FIX
1644
1645### Fix
1646- Wiki theme checkbox override changed from `border-color` to full `border: 2px solid` shorthand
1647- Properly overrides the base rule which uses `border` shorthand
1648- Hover state also uses full shorthand
1649
1650## Version 6.3.6 (2026-02-10) - WIKI THEME CHECKBOX BORDER COLOR
1651
1652### Fix
1653- Wiki theme unchecked checkboxes now use `--border-main` (template's `__border__` color) for border
1654- Checked state fills with border color
1655- Hover state uses border color
1656- Applied to calendar, sidebar, and eventlist containers
1657
1658## Version 6.3.5 (2026-02-10) - WIKI THEME: ALLOW DARK READER ON HEADERS
1659
1660### Fix
1661- Wiki theme section headers (Today/Tomorrow/Important) no longer use `!important` or `-webkit-text-fill-color`
1662- Dark Reader can now freely adjust background, text color, and borders on wiki theme headers
1663- Clicked-day panel header and section border-left also unlocked for wiki theme
1664- All other themes (matrix/purple/pink/professional) retain full Dark Reader protection
1665
1666## Version 6.3.4 (2026-02-10) - WIKI THEME: BORDER COLOR FOR HEADERS & BADGES
1667
1668### Wiki Theme Color Remapping
1669- `border` (accent color) now maps to template's `__border__` instead of `__link__`
1670- This affects: section headers (Today/Tomorrow/Important), badges (TODAY, namespace), sidebar widget border, clicked-day panel, `--border-main` CSS variable
1671- `text_bright` still maps to `__link__` for link text and accent text
1672- Section headers all use the same `__border__` color for consistent appearance
1673- Updated COLOR_SCHEME mapping documentation
1674
1675## Version 6.3.3 (2026-02-10) - WIKI THEME SECTION HEADER TEXT COLOR
1676
1677### Fix
1678- Wiki theme Today/Tomorrow/Important section header text now uses `$themeStyles['text_primary']` (mapped from template's `__text__` color) instead of hardcoded white
1679- Clicked-day panel header text also uses template text color for wiki theme
1680- Professional theme remains white text on blue headers
1681
1682## Version 6.3.2 (2026-02-10) - FIX THEME NOT UPDATING ON SIDEBAR EVENTLIST
1683
1684### Bug Fix
1685- Added `$renderer->nocache()` to the render function
1686- DokuWiki was caching the rendered sidebar HTML, so theme changes made in admin were never reflected until the page was manually edited
1687- Now all calendar/eventlist/eventpanel outputs are rendered fresh on each page load, picking up the current theme from `calendar_theme.txt`
1688
1689## Version 6.3.1 (2026-02-10) - EVENTLIST THEMING
1690
1691### {{eventlist}} Theme Support
1692- Eventlist containers now receive theme class (`eventlist-theme-matrix`, etc.) and full CSS variable injection
1693- Dark themes get themed border + glow, light themes get subtle border
1694- Container background set from `$themeStyles['bg']` with `!important`
1695
1696### Eventlist CSS Theme Rules (all 3 dark themes)
1697- Title, header, time, date, body, links, strong, code, namespace badge, empty state
1698- Today header, clock, date — all with `color` + `-webkit-text-fill-color` `!important`
1699- Item borders, section backgrounds, code block backgrounds
1700- Full Dark Reader protection via same inline+CSS approach as calendar/sidebar
1701
1702## Version 6.3.0 (2026-02-10) - DARK READER COMPATIBILITY & COMPLETE THEMING
1703
1704### Dark Reader Browser Extension Compatibility
1705All dark themes (Matrix, Purple, Pink) now render correctly when the Dark Reader browser extension is active. The approach uses targeted inline `!important` styles and `-webkit-text-fill-color` overrides — no page-wide locks, no blanket CSS resets, no filter manipulation.
1706
1707**Protected elements:**
1708- Section headers (Today/Tomorrow/Important) — background, text color, text-fill-color
1709- Clicked-day panel header — background, text color, close button
1710- All badges (TODAY, PAST DUE, namespace, panel namespace, eventlist-simple) — background, text, text-fill-color
1711- Event titles, meta, descriptions — color with !important via CSS
1712- Day numbers, nav buttons, calendar day headers — color with !important via CSS
1713- System status bars — inline background !important on tracks and fills
1714- System tooltips — background, border-color, text color all set via setProperty with !important
1715- Section left border bars — border-left with !important
1716- Event color indicator bars — border-left-color with !important
1717- Sidebar section event text (Purple and Pink themes)
1718
1719### Complete CSS Variable Audit (41 conversions in v6.1.1)
1720- All remaining hardcoded colors in style.css converted to CSS variable references
1721- Calendar borders, text colors, backgrounds, input focus shadows, accent borders
1722- Only legitimate hardcodes remain (keyframe animations, theme-specific override blocks)
1723
1724### Semantic Color System
1725- New CSS variables: `--pastdue-color`, `--pastdue-bg`, `--pastdue-bg-strong`, `--pastdue-bg-light`
1726- New CSS variables: `--tomorrow-bg`, `--tomorrow-bg-strong`, `--tomorrow-bg-light`
1727- Injected into all 3 CSS var blocks (full calendar, event panel, sidebar widget)
1728- Today/Tomorrow/Important section colors now theme-derived instead of hardcoded
1729
1730### Section Headers Fully Themed
1731- Today/Tomorrow/Important headers use theme accent colors instead of fixed green/orange/purple
1732- Matrix: bright/standard/dim green, Purple: bright/standard/dim purple, Pink: hot/medium/light pink
1733- Professional: blue shades, Wiki: template-derived colors
1734- Dark theme headers use dark background color for text contrast
1735
1736### Pink Theme Enhancements
1737- **Heart today indicator** — day number displayed inside a ♥ with hot pink glow, centered via inline-flex, `pink-heart-beat` animation with realistic double-beat pulse
1738- **Firework button hover** — `pink-firework-burst` keyframe animation with multi-point radiating box-shadows, scale/brightness effects on hover, instant flash on click
1739- **Checkbox glow** — hot pink border with ambient glow, hover intensifies, checked fills with glow
1740
1741### All Theme Checkbox Theming
1742- Matrix: bright green border + green glow, Purple: purple border + purple glow
1743- Pink: hot pink border + pink glow (with enhanced ambient effect)
1744- Hover scales 1.1x with intensified glow on all themes
1745- Checked state fills with theme accent color + outer glow
1746
1747### System Tooltips Themed
1748- Both tooltip functions use theme-derived colors from `$themeStyles`
1749- Green tooltip: `text_bright`, Purple: `border`, Orange: `text_primary`
1750- Background from `$themeStyles['bg']`, divider borders use theme accent colors
1751- All properties set with `style.setProperty(prop, value, "important")`
1752
1753### Namespace Filter Badge Cleanup
1754- Removed inline namespace badge from event side panel header
1755- Filter indicator bar ("Filtering: namespace ✕") retained and working
1756- AJAX-based namespace filtering fully functional via onclick handlers
1757
1758## Version 6.1.0 (2026-02-10) - TODAY INDICATOR, BUTTON HOVER & CHECKBOXES
1759
1760### Today Indicator
1761- **Added:** Today's day number now shows as a filled circle with theme accent color background and contrasting text (like Google Calendar's today indicator)
1762- **Added:** Today cell has `--cell-today-bg` background AND a visible inset border glow on hover using `--border-main`
1763- **Added:** `.day-num` now uses `--text-primary` for color instead of relying on browser default
1764
1765### Button Hover/Click Theming
1766- **Fixed:** All buttons now use `filter: brightness(1.3)` on hover for a visible glow effect across all themes
1767- **Fixed:** All buttons use `filter: brightness(0.85)` on click/active for a press-down darkening effect
1768- **Fixed:** Cal nav buttons (‹/›), Today button, +Add Event button, panel nav/today/add buttons, dialog Save/Cancel buttons, month picker Go/Cancel buttons, popup + Add Event button — ALL now have visible themed hover/click feedback with shadow
1769- **Removed:** Generic `opacity: 0.9` hover which was barely visible on dark themes
1770
1771### Checkboxes Themed
1772- **Added:** Custom checkbox styling for `.task-checkbox` — uses `appearance: none` with themed border (`--border-main`), hover glow, and filled accent background when checked with ✓ mark
1773- **Added:** `accent-color: var(--text-bright)` on all dialog checkboxes (task, recurring) for consistent theme coloring
1774
1775### Form Input Text
1776- **Fixed:** `.input-sleek` now has `color: var(--text-primary)` — form text is visible on dark themes
1777- **Added:** `::placeholder` styling for inputs/textareas using `--text-dim`
1778
1779## Version 6.0.9 (2026-02-09) - FORM TEXT, CELL HOVER & GLOW TUNING
1780
1781### Form Input Text Fix
1782- **Fixed:** Form input text (`input-sleek`, `textarea-sleek`, `select`) had no `color` property — browser defaulted to black, invisible on dark themes. Now uses `var(--text-primary)`.
1783- **Added:** Themed placeholder text (`::placeholder`) for inputs/textareas
1784
1785### Button & Cell Hover Theming
1786- **Added:** Calendar day cells (`.cal-day`) now have a themed hover effect — background shifts to `--cell-today-bg` with an inset border glow using `--border-main`
1787- **Improved:** Nav buttons (`◄`/`►`) and Today button hover now show a themed glow + scale effect instead of just opacity change
1788- **Added:** Active (click) state for nav/today buttons with scale-down feedback
1789- **Improved:** Month picker hover now also shows a subtle theme shadow
1790
1791### Glow Reduced to 1px for Matrix/Purple
1792- Matrix and purple text glow reduced from 2px to 1px across: event titles, descriptions, meta, links, sidebar day numbers, sidebar event titles, sidebar dates
1793- Matrix clock pulse animation reduced from 6px/10px+15px to 2px/4px+6px
1794- Weather text glow reduced to 1px, clock to 2px
1795- Pink remains at 2px (barely noticeable)
1796
1797## Version 6.0.8 (2026-02-09) - LINKS, GLOW CONSISTENCY & PINK TONE-DOWN
1798
1799### Links Themed
1800- **Added:** `.cal-link` CSS class — all links rendered via `renderDescription()` now pick up theme accent color via `--text-bright`
1801- **Fixed:** Sidebar widget links (`a.cal-link`) inherit theme colors
1802- **Fixed:** Event list widget description links (`eventlist-widget-desc a`) use CSS vars
1803- **Fixed:** Simple event list body links/strong/code all themed
1804
1805### Text Glow Consistency
1806- **Added:** Subtle `text-shadow: 0 0 2px` glow on event titles, meta, and descriptions for all three dark themes (matrix, purple, pink) in the main calendar and event panel
1807- **Added:** Subtle link glow on dark themes
1808- **Added:** Matrix and purple now get the same barely-visible text glow that pink had on sidebar week grid day numbers and event titles
1809
1810### Pink Glow Toned Down
1811- **Reduced:** Sidebar today header box-shadow from `0 0 10px 0.4` to `0 0 6px 0.25`
1812- **Reduced:** Day number sparkle animation from 3px/6px+10px to 2px/3px
1813- **Reduced:** Today cell shimmer from 3px+5px / 8px+12px to 2px+3px / 4px+6px
1814- **Reduced:** Event bar glow pulse from 2px/4px+6px to 1px/2px+3px
1815- **Reduced:** Today hover glow from 10px+15px to 5px+8px
1816- **Reduced:** Event item glow from 2px/5px to 1px/3px
1817- **Reduced:** Calendar container glow from 8px to 5px
1818
1819### Other
1820- **Themed:** Sidebar weather, date, and clock text colors and glow via CSS vars
1821
1822## Version 6.0.7 (2026-02-09) - BADGES, BUTTONS & CONFLICT THEMING
1823
1824- **Fixed:** Namespace badges (`.namespace-badge`, `.event-namespace-badge`, `.panel-ns-badge`, standalone header badge) — all now use theme accent colors instead of hardcoded green/blue
1825- **Fixed:** TODAY badge uses `--border-main` for background instead of hardcoded purple
1826- **Fixed:** Conflict alert badge (`⚠️`) uses `--border-main` background and `--text-bright` border — matches theme accent
1827- **Fixed:** Conflict tooltip header background now set inline from theme vars (tooltip is appended to body, can't inherit CSS vars)
1828- **Fixed:** Conflict tooltip body items use themed text and border colors
1829- **Fixed:** Month picker Go/Cancel buttons themed (`--text-bright` for save, `--cell-bg` for cancel)
1830- **Fixed:** Calendar header month/year hover uses `--cell-today-bg` background
1831- **Fixed:** Inline search input border uses `--border-color`
1832- **Fixed:** Event list header border uses `--border-color`
1833
1834## Version 6.0.6 (2026-02-09) - COMPLETE TEXT THEMING
1835
1836- **Fixed:** Calendar header month/year title had hardcoded dark color — now uses `--text-primary`
1837- **Fixed:** Month/year picker hover used hardcoded gray background and green text — now uses `--cell-today-bg` and `--text-bright`
1838- **Fixed:** Event list items (titles, meta, descriptions, links, code blocks, bold text) — all now theme-aware via CSS vars
1839- **Fixed:** Completed/past event states used hardcoded grays — now use `--cell-bg`, `--text-dim`, `--cell-today-bg`
1840- **Fixed:** Scrollbar track/thumb colors now use theme vars
1841- **Fixed:** Namespace filter indicator (background, label, badge, close button) — all themed
1842- **Fixed:** Panel standalone month picker hover and namespace badge — themed
1843- **Fixed:** Calendar header border-bottom — now uses `--border-color`
1844
1845## Version 6.0.5 (2026-02-09) - THEMED BORDERS & EVENT PANEL
1846
1847- **Added:** Theme-colored border and glow for calendar container on matrix, purple, and pink themes — matches the sidebar widget's `2px solid` + `box-shadow` glow style. Professional and wiki themes unchanged (keep subtle 1px gray border).
1848- **Added:** Theme-colored border and glow for event panel (`{{eventpanel}}`) on dark themes using `[data-theme]` attribute selectors
1849- **Themed:** Event panel header (nav buttons, month title, today button, search input, add button) — all now use CSS vars
1850- **Themed:** Panel standalone header background and border
1851
1852## Version 6.0.4 (2026-02-09) - FULL DIALOG THEMING
1853
1854- **Fixed:** Day cell click popup (day-popup) used hardcoded white/gray colors — now fully theme-aware using CSS variables
1855- **Fixed:** Event add/edit dialog (dialog-content-sleek) had hardcoded white background and blue header — now uses theme colors
1856- **Fixed:** Month picker dialog had hardcoded white background and dark text — now themed
1857- **Fixed:** Popup event items, titles, times, descriptions, footer, add-event button, close button — all now use CSS vars with sensible fallbacks
1858- **Fixed:** Form elements (field labels, inputs, checkboxes, recurring options, color pickers) — all reference theme CSS vars
1859- **How it works:** `propagateThemeVars()` copies CSS variables from the calendar container to dialogs/popups (which are `position:fixed` or appended to `document.body`). All CSS selectors now reference these variables with fallbacks for graceful degradation.
1860
1861## Version 6.0.3 (2026-02-09) - MOVE IMPORTANT NAMESPACES TO MANAGE TAB
1862
1863- **Moved:** Important Namespaces section from Outlook Sync tab to Manage Events tab (between Events Manager and Cleanup sections)
1864- **Changed:** Section header color from purple (#9b59b6) to green (#00cc07) to match other Manage tab sections
1865- **Added:** Dedicated Save button and `save_important_namespaces` action handler — setting is now independent of Outlook config save
1866- **Fixed:** Saving Outlook config no longer overwrites important namespaces with the default value
1867
1868## Version 6.0.2 (2026-02-09) - FIREFOX DAY HEADER FIX
1869
1870- **Fixed:** In Firefox, the SMTWTFS day-of-week header row was rendering at the same height as calendar day cells (58px instead of 22px). Firefox ignores `max-height` on `<th>` table cells per CSS spec. Replaced `<thead><tr><th>` with a CSS grid `<div>` outside the table, making header height fully independent of table cell sizing. Works consistently across Chrome, Firefox, Safari, and Edge.
1871
1872## Version 6.0.1 (2026-02-09) - THEME PARAMETER FIX
1873
1874- **Fixed:** `theme=wiki` (and all `theme=` parameters) had no effect — all three render functions (`renderCompactCalendar`, `renderEventPanelOnly`, `renderSidebarWidget`) were ignoring the syntax parameter and always reading the admin global default via `getSidebarTheme()`
1875- **Fixed:** `renderEventDialog` also ignored theme context — now receives theme from its caller
1876- **How it works now:** `{{calendar theme=wiki}}`, `{{eventlist sidebar theme=purple}}`, `{{eventpanel theme=professional}}` all correctly apply the specified theme. The admin-configured default is used as fallback only when no `theme=` parameter is present.
1877
1878
1879## Version 6.0.0 (2026-02-09) - CODE AUDIT & v6 RELEASE
1880
1881- **Audited:** All PHP files (syntax.php, action.php, admin.php, sync_outlook.php) — balanced braces confirmed
1882- **Audited:** calendar-main.js (2,840 lines) — Node syntax check passed, 44 global functions verified
1883- **Audited:** style.css (3,218 lines) — balanced braces confirmed
1884- **Audited:** All admin manage tab action handlers verified functional (13 actions)
1885- **New:** Fresh README.md for GitHub with complete documentation
1886- **Includes all v5.5.x fixes:**
1887  - Delta sync for Outlook (hash-based change tracking, O(changes) not O(total))
1888  - Wiki theme sidebar section headers: distinct colors, no glow, themed day-click panel
1889  - Conflict badges on past events after AJAX navigation
1890  - Admin panel: green cleanup header, fixed broken CSS, endTime field name, cache clearing for all mutations, empty file cleanup, dead code removal
1891
1892## Version 5.5.9 (2026-02-09) - ADMIN MANAGE TAB CLEANUP
1893
1894- **Fixed:** Cleanup Old Events section header now green (#00cc07) to match all other section headers
1895- **Fixed:** Recurring stat card had broken CSS from `$colors['bg'] . '3e0'` concatenation — now uses proper `#fff3e0`
1896- **Fixed:** Same broken CSS pattern in Outlook Sync tab log warning
1897- **Fixed:** `editRecurringSeries` wrote `end_time` instead of correct `endTime` field name
1898- **Fixed:** `editRecurringSeries` used uninitialized `$firstEventDate` variable — now properly declared
1899- **Fixed:** `moveEvents` and `moveSingleEvent` could crash if event date key didn't exist in JSON — added `isset()` check
1900- **Fixed:** `moveSingleEvent` now cleans up empty date keys and deletes empty files after moving
1901- **Fixed:** `deleteRecurringSeries` now cleans up empty date keys and deletes empty JSON files
1902- **Fixed:** Export version was hardcoded as '3.4.6' — now reads dynamically from plugin.info.txt
1903- **Added:** `clearStatsCache()` helper method — all 11 mutation functions now properly clear the event stats cache
1904- **Removed:** Dead `move_events` action handler (all forms use `move_selected_events`)
1905- **Removed:** `console.log` debug statements from `sortRecurringTable` and `editRecurringSeries`
1906- **Removed:** Stale "NEW!" comment from Events Manager section
1907
1908## Version 5.5.8 (2026-02-09) - DELTA SYNC & WIKI THEME SIDEBAR POLISH
1909
1910- **Added:** Outlook sync now uses hash-based delta tracking — only new, modified, or deleted events hit the API
1911- **Added:** computeEventHash() hashes all sync-relevant fields (title, description, time, date, color, namespace, task status)
1912- **Added:** Sync state v2 format stores {outlookId, hash} per event; auto-migrates from v1 on first run
1913- **Added:** Delta analysis summary shows new/modified/unchanged/deleted counts before syncing
1914- **Changed:** Unchanged events are completely skipped (zero API calls) — O(changes) instead of O(total)
1915- **Changed:** Removed per-run duplicate scan (was re-querying every event); use --clean-duplicates when needed
1916- **Changed:** Wiki theme sidebar section headers now use distinct colors: orange (Today), green (Tomorrow), purple (Important)
1917- **Fixed:** Wiki theme sidebar section headers no longer have colored glow — clean shadow instead
1918- **Fixed:** Wiki theme week grid day-click panel header now uses accent color with white text
1919- **Fixed:** Removed invalid var(--__...__) CSS syntax from inline styles (only works in CSS files, not HTML attributes)
1920
1921## Version 5.5.7 (2026-02-09) - WIKI THEME SIDEBAR POLISH
1922
1923- **Fixed:** Sidebar Today/Tomorrow/Important headers now use three distinct colors (orange/green/purple) instead of similar greys
1924- **Fixed:** Sidebar section headers no longer glow on wiki theme (clean shadow like professional)
1925- **Fixed:** Week grid day-click panel header now uses theme accent color with white text instead of grey background
1926- **Fixed:** Removed invalid var(--__...__) CSS variable syntax from inline styles (DokuWiki replacements only work in CSS files)
1927- **Changed:** Wiki theme section header text now white for readability on colored backgrounds
1928- **Changed:** Week grid JS theme colors now use actual $themeStyles values
1929
1930## Version 5.5.6 (2026-02-09) - FIX CONFLICT BADGES ON PAST EVENTS AFTER AJAX
1931
1932- **Fixed:** Conflict badges now render on past events in JS rebuild path (were only in the future events branch)
1933
1934## Version 5.5.5 (2026-02-09) - FIX SIDEBAR CONFLICT TOOLTIP POSITIONING
1935
1936- **Fixed:** Sidebar widget conflict tooltips now display next to the badge instead of upper-left corner
1937- **Fixed:** Week grid conflict tooltips also fixed (same issue)
1938- **Changed:** All conflict badges now use unified showConflictTooltip() system with base64-encoded data
1939- **Removed:** data-tooltip CSS pseudo-element approach for conflict badges (replaced with JS tooltip)
1940
1941## Version 5.5.4 (2026-02-09) - FIX PAST EVENT EXPAND ON FIRST LOAD
1942
1943- **Fixed:** Past events now expand on click from initial page load (PHP-rendered items were missing onclick="togglePastEventExpand(this)" handler that the JS-rebuilt version had)
1944
1945## Version 5.5.3 (2026-02-09) - FIX CONFLICT TOOLTIP THEME COLORS
1946
1947- **Fixed:** Conflict tooltip now finds calendar container even when badge is inside day popup (appended to body)
1948- **Fixed:** Empty CSS variable values no longer produce invisible text — fallback defaults applied when var returns empty string
1949
1950## Version 5.5.2 (2026-02-09) - FIX CONFLICT TOOLTIP JSON PARSING
1951
1952- **Fixed:** Conflict tooltip data now base64-encoded to eliminate JSON parse errors from attribute quote escaping
1953- **Fixed:** Removed double htmlspecialchars encoding on conflict titles in PHP (was escaping titles then re-escaping the JSON)
1954- **Changed:** Both PHP and JS conflict badge rendering now use base64 for data-conflicts attribute
1955- **Changed:** showConflictTooltip decodes base64 first, falls back to plain JSON for compatibility
1956
1957## Version 5.5.1 (2026-02-09) - AJAX ROBUSTNESS & DIALOG THEMING
1958
1959- **Fixed:** Conflict tooltip badges now work after AJAX month navigation via event delegation
1960- **Fixed:** All document-level event listeners guarded against duplicate attachment from multiple script loads
1961- **Fixed:** showConflictTooltip closest() selector now matches actual container IDs (cal_, panel_, sidebar-widget-)
1962- **Fixed:** Description textarea in add/edit dialog now 2 lines tall instead of 1
1963- **Added:** Event delegation for conflict badge mouseenter/mouseleave (capture phase) survives DOM rebuilds
1964- **Added:** ESC key now also closes day popups and conflict tooltips
1965- **Changed:** Namespace click filter handler wrapped in guard to prevent duplicate binding
1966
1967## Version 5.5.0 (2026-02-09) - CSS VARIABLE REFACTOR & THEME CONSISTENCY
1968
1969- **Refactored:** All theming now driven by 15 CSS custom properties injected per calendar instance
1970- **Refactored:** Removed ~85 inline styles from syntax.php and ~41 from calendar-main.js
1971- **Refactored:** style.css is now the single source of truth for all visual styling
1972- **Fixed:** Day popup (click cell) now fully themed — CSS vars propagated from container
1973- **Fixed:** Add/Edit event dialog now themed in all contexts (main calendar, eventlist panel, sidebar widget)
1974- **Fixed:** Popup footer and "+ Add Event" button were using inline themeStyles — now use CSS vars
1975- **Added:** CSS variable injection for {{eventlist panel}} containers
1976- **Added:** CSS variable injection for {{eventlist sidebar}} widget containers
1977- **Added:** propagateThemeVars() helper ensures dialogs/popups always get theme regardless of DOM position
1978- **Added:** Wiki template mapping reads __link__ as accent color from style.ini
1979- **Added:** Detailed CSS variable reference table in style.css header comment
1980- **Added:** Detailed style.ini → CSS variable mapping documentation in syntax.php
1981- **Changed:** Conflict tooltip reads CSS vars via getComputedStyle instead of data-themeStyles
1982- **Changed:** Admin changelog now uses paginated timeline viewer instead of tiny scrolling div
1983- **Removed:** Dark Reader MutationObserver compatibility (CSS vars natively compatible)
1984- **Removed:** $isWikiTheme branching from PHP render path
1985
1986## Version 5.3.6 (2026-02-09) - HEARTS + CSS BACKGROUND FIX! ��
1987
1988### �� Added: Hearts in Explosions!
1989- **Added:** 8-12 pink hearts in each click explosion
1990- **Added:** Random sizes (12-28px) and directions
1991- **Result:** Extra love in every click! ��
1992
1993### �� Fixed: Background CSS Property for Dark Mode Readers
1994- **Fixed:** Added `background: transparent` to CSS (was completely removed)
1995- **Fixed:** Now CSS readers can detect and modify background property
1996- **Why:** Inline styles override transparent, but CSS readers can now see the property
1997- **Result:** Dark mode plugins can now change calendar backgrounds!
1998
1999### The CSS Problem
2000
2001**Why backgrounds weren't changing with dark mode readers**:
2002
2003**Before (v5.3.5)**:
2004```css
2005.calendar-compact-grid tbody td {
2006    /* background removed - set via inline style */
2007    border: 1px solid...
2008}
2009```
2010
2011**Problem**: CSS property doesn't exist!
2012- Dark mode readers look for `background` property in CSS
2013- Can't override what doesn't exist
2014- Inline styles work, but readers can't modify them
2015
2016**After (v5.3.6)**:
2017```css
2018.calendar-compact-grid tbody td {
2019    background: transparent;  /* Now exists! */
2020    border: 1px solid...
2021}
2022```
2023
2024**Solution**:
2025- Property exists in CSS
2026- Dark mode readers can override it
2027- Inline styles still override transparent
2028- Everyone wins!
2029
2030### What's Fixed
2031
2032**Elements now have background property**:
2033- `.calendar-compact-grid tbody td` ✓
2034- `.calendar-compact-grid tbody td:hover` ✓
2035- `.event-compact-item` ✓
2036- `.event-compact-item:hover` ✓
2037
2038**How it works**:
20391. CSS sets `background: transparent` (default)
20402. Inline styles set actual color (overrides transparent)
20413. Dark mode readers can override CSS property
20424. Works for everyone!
2043
2044### Hearts in Explosion
2045
2046**Click anywhere → Hearts explode!**
2047
2048**Heart details**:
2049- Count: 8-12 per explosion (random)
2050- Size: 12-28px (random variety)
2051- Emoji: �� (pink heart)
2052- Direction: Random 360°
2053- Speed: 60-140px travel
2054- Duration: 0.8-1.2s
2055- z-index: 9999999 (always visible)
2056
2057**Combined with**:
2058- 25 glowing particles
2059- 40 pixel sparkles
2060- Bright flash
2061- **Total: 73-77 elements!**
2062
2063### Visual Result
2064
2065**Click explosion**:
2066```
2067    �� ✦ • ✦ ��
2068  �� •         • ��
2069✦  •     ��!     •  ✦
2070  �� •         • ��
2071    �� ✦ • ✦ ��
2072
2073Hearts + Particles + Pixels!
2074```
2075
2076**Dark mode now works**:
2077```css
2078/* Dark mode reader can now do this: */
2079.calendar-compact-grid tbody td {
2080    background: #000 !important;  /* Works! */
2081}
2082```
2083
2084### Why Transparent Works
2085
2086**CSS Cascade**:
20871. CSS: `background: transparent` (lowest priority)
20882. Inline style: `background: #f5f5f5` (overrides CSS)
20893. Dark mode CSS: `background: #000 !important` (overrides inline)
2090
2091**Perfect solution!** ✓
2092
2093## Version 5.3.5 (2026-02-09) - PARTICLES ABOVE DIALOGS! ��
2094
2095### �� Fixed: Particles Now Appear Above All Dialogs!
2096- **Fixed:** Increased z-index to 9999999 for all particles
2097- **Fixed:** Particles now visible above event dialogs, month picker, etc.
2098- **Result:** Cursor effects and explosions always visible!
2099
2100### The Z-Index Problem
2101
2102**Before (v5.3.4)**:
2103- Particles: z-index 9999
2104- Dialogs: z-index 10000-999999
2105- **Particles hidden behind dialogs!**
2106
2107**After (v5.3.5)**:
2108- Particles: z-index 9999999
2109- Trail: z-index 9999998
2110- Pixels: z-index 9999997
2111- **Particles ALWAYS on top!**
2112
2113### What's Fixed
2114
2115✅ **Main particles** (explosion orbs)
2116✅ **Cursor trail** (glowing dots)
2117✅ **Pixel sparkles** (tiny bright stars)
2118✅ **Flash effect** (click burst)
2119
2120**All now appear above**:
2121- Event dialog popups
2122- Month picker
2123- Day popups
2124- Any modal overlays
2125
2126### Visual Result
2127
2128**Moving cursor over dialog**:
2129```
2130┌─────────────────────┐
2131│  Event Dialog       │
2132│  ✦ • ✦             │  ← Sparkles visible!
2133│    →  ✦             │  ← Cursor trail visible!
2134│  • ✦ •              │
2135└─────────────────────┘
2136```
2137
2138**Clicking on dialog**:
2139```
2140┌─────────────────────┐
2141│  ✦ • ✦ • ✦         │
2142│ •     ��!     •    │  ← Explosion visible!
2143│  ✦ • ✦ • ✦         │
2144└─────────────────────┘
2145```
2146
2147**Perfect visibility everywhere!** ✨
2148
2149## Version 5.3.4 (2026-02-09) - THEMED MONTH PICKER + DIALOG CURSOR FIX
2150
2151### �� Fixed: Month Picker Now Themed!
2152- **Fixed:** Jump to Month dialog now uses theme colors
2153- **Fixed:** Dialog background, borders, text all themed
2154- **Fixed:** Select dropdowns use theme colors
2155- **Fixed:** Buttons use theme accent colors
2156- **Result:** Month picker matches calendar theme!
2157
2158### �� Fixed: Cursor Effects Work in Dialogs!
2159- **Fixed:** Cursor trail now works when hovering over dialogs
2160- **Fixed:** Click explosions work when clicking inside dialogs
2161- **Technical:** Changed to capture phase event listeners
2162- **Result:** Effects work EVERYWHERE now!
2163
2164### Month Picker Theming
2165
2166**Before (v5.3.3)**:
2167- White background (hardcoded)
2168- Black text (hardcoded)
2169- No theme integration
2170- Looked out of place
2171
2172**After (v5.3.4)**:
2173- Dialog background: `theme.bg`
2174- Dialog border: `theme.border`
2175- Text color: `theme.text_primary`
2176- Dropdowns: `theme.cell_bg` + `theme.text_primary`
2177- Cancel button: `theme.cell_bg`
2178- Go button: `theme.border` (accent color)
2179
2180**Fully integrated!** ✅
2181
2182---
2183
2184### Theme Examples
2185
2186**Matrix Theme**:
2187```
2188┌─────────────────────────┐
2189│ Jump to Month           │ ← Dark bg, green border
2190│ [February ▼] [2026 ▼]  │ ← Dark dropdowns
2191│ [Cancel] [Go]           │ ← Green "Go" button
2192└─────────────────────────┘
2193```
2194
2195**Pink Theme**:
2196```
2197┌─────────────────────────┐
2198│ Jump to Month           │ ← Dark bg, pink border
2199│ [February ▼] [2026 ▼]  │ ← Dark dropdowns
2200│ [Cancel] [Go]           │ ← Pink "Go" button
2201└─────────────────────────┘
2202With sparkle effects! ✨
2203```
2204
2205**Professional Theme**:
2206```
2207┌─────────────────────────┐
2208│ Jump to Month           │ ← Clean bg, blue border
2209│ [February ▼] [2026 ▼]  │ ← Clean dropdowns
2210│ [Cancel] [Go]           │ ← Blue "Go" button
2211└─────────────────────────┘
2212```
2213
2214---
2215
2216### Dialog Cursor Fix
2217
2218**The Problem**:
2219Dialogs use `event.stopPropagation()` to prevent clicks from closing them. This blocked cursor effects!
2220
2221**The Solution**:
2222Use **capture phase** event listeners:
2223```javascript
2224// Before (bubbling phase)
2225document.addEventListener('click', handler)
2226
2227// After (capture phase)
2228document.addEventListener('click', handler, true)
22292230                                   Capture phase!
2231```
2232
2233**Capture phase runs BEFORE stopPropagation!**
2234
2235---
2236
2237### Now Works Everywhere
2238
2239✅ **Calendar area**
2240✅ **Event dialogs**
2241✅ **Month picker dialog**
2242✅ **Day popup dialogs**
2243✅ **Anywhere on screen**
2244
2245**No more blocked effects!** ��
2246
2247---
2248
2249### Technical Details
2250
2251**Event phases**:
2252```
22531. Capture phase   ← We listen here now!
22542. Target phase
22553. Bubbling phase  ← stopPropagation blocks this
2256```
2257
2258**By using capture phase**:
2259- Events caught before stopPropagation
2260- Works in all dialogs
2261- No conflicts with dialog logic
2262
2263---
2264
2265### All Dialogs Checked
2266
2267✅ **Month picker** - Now themed!
2268✅ **Event dialog** - Already themed
2269✅ **Day popup** - Already themed
2270
2271**Everything consistent!** ��
2272
2273---
2274
2275## Version 5.3.3 (2026-02-09) - TINY NEON PIXEL SPARKLES! ✨
2276
2277### ✨ Added: Bright Neon Pixel Sparkles Everywhere!
2278- **Added:** Tiny 1-2px bright pixel sparkles alongside cursor trail
2279- **Added:** 40 pixel sparkles in click explosions
2280- **Changed:** Cursor effects now work on ENTIRE SCREEN (not just calendar)
2281- **Result:** Maximum sparkle effect! ��
2282
2283### Tiny Pixel Sparkles
2284
2285**3-6 tiny bright pixels appear with each cursor movement!**
2286
2287**Characteristics**:
2288- Size: 1-2px (single pixel appearance!)
2289- Colors: Bright neon whites and pinks
2290  - Pure white (#fff) - 40% chance
2291  - Hot pink (#ff1493)
2292  - Pink (#ff69b4)
2293  - Light pink (#ffb6c1)
2294  - Soft pink (#ff85c1)
2295- Glow: Triple-layer shadow (intense!)
2296- Spawn: Random 30px radius around cursor
2297- Animations:
2298  - 50% twinkle in place
2299  - 50% float upward
2300
2301**Creates a cloud of sparkles around your cursor!**
2302
2303---
2304
2305### Click Explosion Enhanced
2306
2307**Now with 40 EXTRA pixel sparkles!**
2308
2309**Click anywhere → BIG BOOM**:
2310- 25 main glowing particles (6-10px)
2311- **40 tiny pixel sparkles (1-2px)** ← NEW!
2312- Bright white flash
2313- Total: 65+ visual elements!
2314
2315**Pixel sparkles in explosion**:
2316- Shoot outward in all directions
2317- Random distances (30-110px)
2318- Multiple bright colors
2319- Some twinkle, some explode
2320- Creates stellar effect!
2321
2322---
2323
2324### Entire Screen Coverage
2325
2326**Effects now work EVERYWHERE!**
2327
2328**Before (v5.3.2)**:
2329- Only inside calendar viewport
2330- Limited to calendar area
2331
2332**After (v5.3.3)**:
2333- Works on entire screen! ✓
2334- Cursor trail follows everywhere
2335- Click explosions anywhere
2336- Used `position: fixed` + `clientX/Y`
2337
2338**Move anywhere on the page for sparkles!**
2339
2340---
2341
2342### Visual Effect
2343
2344**Cursor movement**:
2345```
2346    • ✦ •       ← Tiny pixels
2347  •   ✦   •     ← Glowing trail
2348✦  •  →  •  ✦   ← Cursor
2349  •   ✦   •     ← Mixed sizes
2350    • ✦ •       ← Sparkle cloud
2351```
2352
2353**Click explosion**:
2354```
2355    ✦ • ✦ • ✦
2356  ✦ •         • ✦
2357✦  •    ��!    •  ✦
2358  ✦ •         • ✦
2359    ✦ • ✦ • ✦
2360
236165+ particles total!
2362```
2363
2364---
2365
2366### Sparkle Details
2367
2368**Trail Pixels** (3-6 per movement):
2369- Size: 1-2px
2370- Spawn rate: Every 40ms
2371- Spread: 30px radius
2372- Duration: 0.6-0.8s
2373- 50% twinkle, 50% float
2374
2375**Explosion Pixels** (40 total):
2376- Size: 1-3px
2377- Spread: 30-110px radius
2378- Duration: 0.4-0.8s
2379- All directions
2380- Intense glow
2381
2382**Main Particles** (25 total):
2383- Size: 4-10px
2384- Spread: 50-150px
2385- Full color palette
2386- Original firework effect
2387
2388---
2389
2390### Color Distribution
2391
2392**Pixel sparkles favor white**:
2393- 40% pure white (#fff) - brightest!
2394- 60% pink shades - variety
2395
2396**Creates brilliant sparkle effect!**
2397
2398---
2399
2400### Performance
2401
2402**Still optimized**:
2403- Trail: 30ms throttle
2404- Pixels: 40ms throttle
2405- Auto-cleanup
2406- Hardware accelerated
2407- Smooth 60fps
2408
2409**Lots of sparkles, zero lag!**
2410
2411---
2412
2413### Full-Screen Magic
2414
2415**Pink theme calendar detected**:
2416```javascript
2417if (pink calendar exists) {
2418    Enable effects for ENTIRE SCREEN
2419    Not just calendar area
2420}
2421```
2422
2423**Works everywhere on page!** ✨
2424
2425---
2426
2427## Version 5.3.2 (2026-02-09) - PINK FIREWORKS! ����
2428
2429### �� Changed: Glowing Pink Particles Instead of Emoji Sparkles!
2430- **Removed:** Emoji sparkle images (✨)
2431- **Added:** Glowing pink particle trail following cursor
2432- **Added:** FIREWORKS explosion on click!
2433- **Result:** Beautiful glowing effects, not emoji!
2434
2435### Glowing Cursor Trail
2436
2437**Pink glowing dots follow your cursor!**
2438- Small glowing pink orbs (8px)
2439- Radial gradient glow effect
2440- Multiple box-shadows for depth
2441- Fade out smoothly (0.5s)
2442- Throttled to 30ms for smoothness
2443
2444```
2445    •  •
2446  •  →  •   ← Your cursor
2447    •  •
2448```
2449
2450**Not emoji - actual glowing particles!**
2451
2452---
2453
2454### Click Fireworks! ��
2455
2456**Click anywhere on the calendar → BOOM!**
2457
2458**20 pink particles explode outward!**
2459- Radial burst pattern (360° coverage)
2460- Random speeds (50-150px travel)
2461- 4 shades of pink:
2462  - Hot pink (#ff1493)
2463  - Pink (#ff69b4)
2464  - Light pink (#ff85c1)
2465  - Very light pink (#ffc0cb)
2466- Random sizes (4-10px)
2467- Individual glowing halos
2468- Smooth explosion animation
2469
2470**Plus a bright flash at click point!**
2471- 30px radius glow
2472- Intense pink flash
2473- Fades quickly (0.3s)
2474
2475---
2476
2477### Visual Effect
2478
2479**Cursor movement**:
2480```
24812482      •  •  •
2483   •     →     •  ← Glowing trail
2484      •  •  •
24852486```
2487
2488**Click explosion**:
2489```
2490         •  •  •
2491      •           •
2492   •      BOOM!      •  ← 20 particles
2493      •           •
2494         •  •  •
2495```
2496
2497**All particles glow with pink halos!**
2498
2499---
2500
2501### Particle Details
2502
2503**Trail Particles**:
2504- Size: 8x8px
2505- Color: Pink radial gradient
2506- Shadow: 10px + 20px glow layers
2507- Duration: 0.5s fade
2508- Rate: 30ms throttle
2509
2510**Explosion Particles**:
2511- Size: 4-10px (random)
2512- Colors: 4 pink shades (random)
2513- Shadow: 10px + 20px glow (matches color)
2514- Duration: 0.6-1.0s (random)
2515- Pattern: Perfect circle burst
2516
2517**Flash Effect**:
2518- Size: 30x30px
2519- Color: Bright hot pink
2520- Shadow: 30px + 50px mega-glow
2521- Duration: 0.3s instant fade
2522
2523---
2524
2525### Performance
2526
2527**Optimized for smoothness**:
2528- Trail throttled to 30ms
2529- Auto-cleanup after animations
2530- CSS hardware acceleration
2531- No memory leaks
2532- Smooth 60fps
2533
2534**Won't slow you down!**
2535
2536---
2537
2538### Comparison
2539
2540**Before (v5.3.1)**:
2541- ✨ Emoji sparkle images
2542- Static unicode characters
2543- Limited visual impact
2544
2545**After (v5.3.2)**:
2546- �� Glowing pink particles
2547- Radial gradients + shadows
2548- Beautiful firework explosions
2549- Much more impressive!
2550
2551---
2552
2553### Only Pink Theme
2554
2555**These effects only appear**:
2556- On `.calendar-theme-pink` elements
2557- Other themes unaffected
2558- Pure pink magic! ��
2559
2560---
2561
2562## Version 5.3.1 (2026-02-09) - MYSPACE SPARKLE CURSOR! ✨✨✨
2563
2564### ✨ Added: MySpace-Style Sparkle Trail!
2565- **Added:** Sparkle cursor trail that follows your mouse (pink theme only!)
2566- **Toned down:** Reduced glow effects for better taste
2567- **Added:** Sparkles appear on cell hover
2568- **Added:** Sparkles on event hover (left and right sides!)
2569- **Added:** Sparkles on today's cell corners
2570- **Added:** Sparkles on navigation buttons
2571- **Added:** Sparkles in calendar header
2572- **Result:** Pure nostalgic MySpace magic! ✨
2573
2574### MySpace Sparkle Cursor Trail
2575
2576**The classic effect from 2006!**
2577- Sparkles follow your cursor as you move
2578- Random sizes (12-22px)
2579- Random slight offsets for natural feel
2580- Float up and fade out animation
2581- Throttled to 50ms (smooth, not laggy)
2582- Only on pink theme calendars
2583
2584```
25852586  ✨    ✨
2587✨   →   ✨  (cursor trail)
2588  ✨    ✨
25892590```
2591
2592**Pure nostalgia!**
2593
2594---
2595
2596### Sparkles Everywhere
2597
2598**Calendar cells**:
2599- Hover over any day → ✨ floats up
2600- Smooth 1.5s animation
2601- Centered sparkle
2602
2603**Event items**:
2604- Hover → ✨ on left side
2605- Hover → ✨ on right side
2606- Staggered animations (0.4s delay)
2607- Continuous twinkling
2608
2609**Today's cell**:
2610- ✨ in top-right corner (continuous)
2611- ✨ in bottom-left corner (offset timing)
2612- Always sparkling!
2613
2614**Navigation buttons**:
2615- Hover on < or > → ✨ appears top-right
2616- One-time float animation
2617
2618**Calendar header**:
2619- ✨ on left side (continuous)
2620- ✨ on right side (offset 1s)
2621- Always twinkling
2622
2623---
2624
2625### Toned Down Glows
2626
2627**Before (v5.3.0)**: TOO MUCH GLOW!
2628- 50px shadows
2629- 4-layer effects
2630- Overwhelming
2631
2632**After (v5.3.1)**: Just right!
2633- 8-15px max shadows (subtle)
2634- 2-layer effects
2635- Professional with personality
2636
2637**Glow reductions**:
2638- Today shimmer: 35px → 12px
2639- Today hover: 50px → 15px
2640- Event glow: 18px → 6px
2641- Badge pulse: 25px → 8px
2642- Container glow: 20px → 8px
2643
2644**Much more tasteful!**
2645
2646---
2647
2648### Sparkle Animations
2649
2650**sparkle-twinkle** (0.8s):
2651```
2652Opacity: 0 → 1 → 1 → 0
2653Scale: 0 → 1 → 1 → 0
2654Rotation: 0° → 180° → 360°
2655```
2656
2657**sparkle-float** (1.5s):
2658```
2659Moves up: 0px → -50px
2660Opacity: 0 → 1 → 1 → 0
2661Scale: 0 → 1 → 0.8 → 0
2662```
2663
2664**Pure MySpace magic!** ✨
2665
2666---
2667
2668### Where Sparkles Appear
2669
2670✅ **Cursor trail** (continuous while moving)
2671✅ **Calendar cells** (on hover)
2672✅ **Event items** (on hover, left + right)
2673✅ **Today's cell** (continuous, corners)
2674✅ **Navigation buttons** (on hover)
2675✅ **Calendar header** (continuous, sides)
2676
2677**Sparkles EVERYWHERE!** ✨✨✨
2678
2679---
2680
2681### Performance
2682
2683**Cursor trail**:
2684- Throttled to 50ms
2685- Auto-cleanup after 1s
2686- No memory leaks
2687- Smooth 60fps
2688
2689**CSS animations**:
2690- Hardware accelerated
2691- No JavaScript overhead (except cursor)
2692- Efficient transforms
2693
2694**Won't slow down your browser!**
2695
2696---
2697
2698### Pure Nostalgia
2699
2700**Remember MySpace profiles?**
2701- Glitter graphics ✨
2702- Sparkle cursors ✨
2703- Auto-play music �� (ok, we didn't add that)
2704- Animated GIF backgrounds
2705- Comic Sans everywhere
2706
2707**We brought back the sparkles!** ✨
2708
2709---
2710
2711### Theme Comparison
2712
2713**Other themes**: Professional and clean
2714**Pink theme**: ✨ SPARKLES EVERYWHERE ✨
2715
2716**Only pink theme gets the magic!**
2717
2718---
2719
2720## Version 5.3.0 (2026-02-09) - PINK BLING THEME EFFECTS! ✨��
2721
2722### �� Added: Pink Theme Gets BLING!
2723- **Added:** Shimmering animation for today's cell
2724- **Added:** Sparkling text effect on today's date
2725- **Added:** Glowing pulse for event bars
2726- **Added:** Gradient shimmer on headers
2727- **Added:** Extra glow on hover effects
2728- **Added:** Pulsing urgent badge for past due items
2729- **Result:** Pink theme is now FABULOUS! ✨
2730
2731### Shimmer Effects
2732
2733**Today's Cell**:
2734- Continuous shimmer animation (2 second loop)
2735- Multi-layer glow effect
2736- Pink and hot pink overlapping shadows
2737- Pulses from subtle to intense
2738- Extra sparkle on hover
2739
2740**Today's Date Number**:
2741- Sparkle animation (1.5 second loop)
2742- Text shadow glow effect
2743- Slight scale pulse (100% → 105%)
2744- Pink to hot pink shadow transition
2745
2746### Glow Effects
2747
2748**Event Bars**:
2749- Continuous glow pulse (2 second loop)
2750- Uses event's own color
2751- Adds pink accent glow layer
2752- Creates depth and dimension
2753
2754**Event Items**:
2755- Subtle base glow
2756- Enhanced glow on hover
2757- Slight slide animation on hover
2758- Professional yet playful
2759
2760### Gradient Shimmer
2761
2762**Headers**:
2763- Animated gradient background
2764- 3-color pink gradient flow
2765- Smooth 3-second animation
2766- Creates movement and life
2767- Applies to calendar header and event list header
2768
2769### Badge Effects
2770
2771**TODAY Badge**:
2772- Sparkle animation
2773- Synchronized with today's date
2774- Extra prominence
2775
2776**PAST DUE Badge**:
2777- Urgent pulsing effect (1 second loop)
2778- Orange glow intensifies
2779- Draws attention to urgent items
2780- Faster pulse for urgency
2781
2782### Container Bling
2783
2784**Main Container**:
2785- Multi-layer pink glow
2786- Soft outer shadow
2787- Creates floating effect
2788- Subtle but elegant
2789
2790### Animation Details
2791
2792**pink-shimmer** (2s loop):
2793```
2794Start: Subtle 5px glow
2795Peak:  Intense 35px multi-layer glow
2796End:   Back to subtle
2797```
2798
2799**pink-sparkle** (1.5s loop):
2800```
2801Start: Base glow + scale 1.0
2802Peak:  Intense glow + scale 1.05
2803End:   Back to base
2804```
2805
2806**pink-glow-pulse** (2s loop):
2807```
2808Start: Small glow (3px, 6px)
2809Peak:  Large glow (6px, 12px, 18px)
2810End:   Back to small
2811```
2812
2813**pink-gradient-shimmer** (3s loop):
2814```
2815Gradient flows across element
2816Creates wave effect
2817Smooth continuous motion
2818```
2819
2820**pink-pulse-urgent** (1s loop - faster!):
2821```
2822Start: Orange glow 5px
2823Peak:  Orange glow 25px (intense)
2824End:   Back to 5px
2825```
2826
2827### Visual Experience
2828
2829**Today's Cell**:
2830```
2831┌──┬──┬──┬──┬──┬──┬──┐
2832│  │  │ ✨ │  │  │  │  │  ← Shimmers constantly
2833│  │  │[9]│  │  │  │  │  ← Sparkles
2834│  │  │ ✨ │  │  │  │  │  ← Glows and pulses
2835└──┴──┴──┴──┴──┴──┴──┘
2836```
2837
2838**Event Bars**:
2839```
2840━━━━━━━  ← Glows and pulses
2841━━━━━━━  ← Each bar animated
2842━━━━━━━  ← Creates rhythm
2843```
2844
2845**Headers**:
2846```
2847╔═════════════════════╗
2848║ ~~~~~~~~~~ ║  ← Gradient flows
2849║   February 2026     ║  ← Shimmer effect
2850╚═════════════════════╝
2851```
2852
2853### Theme Comparison
2854
2855**Before (v5.2.8)**:
2856- Pink colors
2857- Static elements
2858- Standard shadows
2859
2860**After (v5.3.0)**:
2861- Pink colors ✓
2862- Animated shimmer ✨
2863- Sparkling effects ��
2864- Glowing pulses ✨
2865- Moving gradients ��
2866- BLING! ��
2867
2868### Performance
2869
2870**All animations**:
2871- Hardware accelerated (transform, opacity)
2872- Smooth 60fps
2873- CSS animations (no JavaScript)
2874- Minimal CPU usage
2875- Disabled in reduced-motion preference
2876
2877### Only for Pink Theme
2878
2879**Effects only apply when**:
2880```css
2881.calendar-theme-pink
2882```
2883
2884**Other themes unaffected**:
2885- Matrix stays Matrix
2886- Professional stays Professional
2887- Purple stays Purple
2888- Wiki stays clean
2889
2890**Pink gets all the bling!** ✨��
2891
2892### Use Cases
2893
2894**Perfect for**:
2895- Celebrating occasions
2896- Fun team calendars
2897- Personal style expression
2898- Standing out
2899- Making calendar time fabulous
2900
2901**Not just pink, but BLING pink!** ��✨
2902
2903## Version 5.2.8 (2026-02-09) - TODAY BOX USES THEME COLORS
2904
2905### �� Fixed: Today's Date Box Now Uses Theme Colors
2906- **Fixed:** Today's day number box now uses theme border color
2907- **Fixed:** Text color adapts to theme (white for dark themes, bg color for light)
2908- **Result:** Today box matches the theme perfectly!
2909
2910### The Issue
2911
2912Today's date had a hardcoded green box:
2913
2914**In style.css**:
2915```css
2916.cal-today .day-num {
2917    background: #008800;  /* Hardcoded green! */
2918    color: white;
2919}
2920```
2921
2922**Didn't adapt to themes at all!**
2923
2924### The Fix
2925
2926**Now uses theme colors**:
2927```php
2928// Today's day number
2929if ($isToday) {
2930    background: $themeStyles['border'],  // Theme's accent color!
2931    color: (professional theme) ? white : bg color
2932}
2933```
2934
2935### Theme Examples
2936
2937**Matrix Theme**:
2938- Box background: `#00cc07` (matrix green)
2939- Text color: `#242424` (dark background)
2940
2941**Purple Theme**:
2942- Box background: `#9b59b6` (purple)
2943- Text color: `#2a2030` (dark background)
2944
2945**Professional Theme**:
2946- Box background: `#4a90e2` (blue)
2947- Text color: `#ffffff` (white text)
2948
2949**Pink Theme**:
2950- Box background: `#ff1493` (hot pink)
2951- Text color: `#1a0d14` (dark background)
2952
2953**Wiki Theme**:
2954- Box background: Template's `__border__` color
2955- Text color: Template's `__background_site__` color
2956
2957### Visual Result
2958
2959**Matrix Theme**:
2960```
2961┌──┬──┬──┬──┬──┬──┬──┐
2962│ 1│ 2│ 3│[4]│ 5│ 6│ 7│
2963└──┴──┴──┴──┴──┴──┴──┘
29642965    Green box (#00cc07)
2966```
2967
2968**Professional Theme**:
2969```
2970┌──┬──┬──┬──┬──┬──┬──┐
2971│ 1│ 2│ 3│[4]│ 5│ 6│ 7│
2972└──┴──┴──┴──┴──┴──┴──┘
29732974    Blue box (#4a90e2)
2975```
2976
2977**Wiki Theme**:
2978```
2979┌──┬──┬──┬──┬──┬──┬──┐
2980│ 1│ 2│ 3│[4]│ 5│ 6│ 7│
2981└──┴──┴──┴──┴──┴──┴──┘
29822983    Template border color
2984```
2985
2986### Implementation
2987
2988**Inline styles added**:
2989- Background uses `$themeStyles['border']` (theme accent)
2990- Text color uses `$themeStyles['bg']` for contrast
2991- Special case: Professional theme uses white text
2992- All with `!important` to override CSS
2993
2994**CSS cleaned up**:
2995- Removed hardcoded `#008800` background
2996- Removed hardcoded `white` color
2997- Kept structural styles (border-radius, font-weight)
2998
2999### Benefits
3000
3001**Theme Consistency**:
3002- Today box matches theme accent color
3003- Proper contrast with background
3004- Professional appearance
3005
3006**Automatic Adaptation**:
3007- Works with all themes
3008- Works with custom wiki template colors
3009- No manual adjustment needed
3010
3011**Visual Harmony**:
3012- Border color used throughout theme
3013- Today box reinforces theme identity
3014- Consistent design language
3015
3016## Version 5.2.7 (2026-02-09) - FIX GRID BACKGROUND MISMATCH
3017
3018### �� Fixed: Table Grid Background Now Matches Cells
3019- **Found:** `grid_bg` was using `__background_alt__` (different from cells!)
3020- **Fixed:** Changed `grid_bg` to use `__background_site__` (same as cells)
3021- **Result:** Table background no longer shows through cells!
3022
3023### The Layer Problem
3024
3025The table itself had a DIFFERENT background color than its cells!
3026
3027**Before (v5.2.6)**:
3028```php
3029'grid_bg' => __background_alt__,     // Table background (#e8e8e8)
3030'cell_bg' => __background_site__,    // Cell background (#f5f5f5)
3031```
3032
3033**The table background was showing THROUGH the cells!**
3034
3035### Why This Happened
3036
3037**Visual layers**:
3038```
3039Table Element
3040├─ background: __background_alt__ (#e8e8e8)  ← Different!
3041└─ Cells
3042    └─ background: __background_site__ (#f5f5f5)  ← Different!
3043
3044The table background shows through any gaps!
3045```
3046
3047### The Fix
3048
3049**After (v5.2.7)**:
3050```php
3051'grid_bg' => __background_site__,    // Table background (#f5f5f5) ✓
3052'cell_bg' => __background_site__,    // Cell background (#f5f5f5) ✓
3053```
3054
3055**NOW THEY MATCH!**
3056
3057### Where grid_bg Is Used
3058
3059The table element itself:
3060```html
3061<table style="background: __background_alt__">  ← Was showing through!
3062    <tbody>
3063        <tr>
3064            <td style="background: __background_site__">1</td>
3065        </tr>
3066    </tbody>
3067</table>
3068```
3069
3070Even with cell inline styles, the TABLE background shows through!
3071
3072### All Background Sources Now Unified
3073
3074**Everything now uses __background_site__**:
3075- `bg` → __background_site__ ✓
3076- `header_bg` → __background_site__ ✓
3077- `grid_bg` → __background_site__ ✓ (JUST FIXED!)
3078- `cell_bg` → __background_site__ ✓
3079
3080**Perfect consistency!** ��
3081
3082### Why It Was Different
3083
3084**Originally the grid was meant to show borders**:
3085- `grid_bg` was `__background_alt__` (slightly different)
3086- Created visual separation between cells
3087- But with transparent/thin cells, it showed through!
3088
3089**Now unified for consistency!**
3090
3091### Visual Result
3092
3093**Before (layers visible)**:
3094```
3095┌─────────────────┐
3096│ Grid (#e8e8e8)  │ ← Showing through!
3097│  ┌──┬──┬──┐     │
3098│  │  │  │  │     │ ← Cells (#f5f5f5)
3099│  └──┴──┴──┘     │
3100└─────────────────┘
3101```
3102
3103**After (unified)**:
3104```
3105┌─────────────────┐
3106│ Grid (#f5f5f5)  │ ← Same color!
3107│  ┌──┬──┬──┐     │
3108│  │  │  │  │     │ ← Cells (#f5f5f5)
3109│  └──┴──┴──┘     │
3110└─────────────────┘
3111Perfect match!
3112```
3113
3114### Complete Background Mapping
3115
3116**All using __background_site__ now**:
3117- Main container background
3118- Left panel background
3119- Right panel background
3120- Eventlist background
3121- Calendar grid background ← JUST FIXED
3122- Calendar cell backgrounds
3123- Event item backgrounds
3124- Clock header background
3125- Search input background
3126- Past events toggle
3127
3128**EVERYTHING UNIFIED!** ��
3129
3130## Version 5.2.6 (2026-02-09) - REMOVE CONTAINER BACKGROUNDS
3131
3132### �� Fixed: Removed Container Backgrounds Showing Through
3133- **Found:** `.calendar-compact-container` had `background: #ffffff;`
3134- **Found:** `.calendar-compact-left` had `background: #fafafa;`
3135- **Found:** `.calendar-compact-right` had `background: #ffffff;`
3136- **Found:** `.event-search-input-inline` had `background: white;`
3137- **Found:** `.past-events-toggle` had `background: #f5f5f5;`
3138- **Result:** Container backgrounds no longer show through cells!
3139
3140### The Container Problem
3141
3142The parent containers had hardcoded backgrounds that were showing through!
3143
3144**Container backgrounds (lines 4-91)**:
3145```css
3146.calendar-compact-container {
3147    background: #ffffff;  /* ← Main container! */
3148}
3149
3150.calendar-compact-left {
3151    background: #fafafa;  /* ← Left panel (calendar side)! */
3152}
3153
3154.calendar-compact-right {
3155    background: #ffffff;  /* ← Right panel (events side)! */
3156}
3157```
3158
3159**These were showing through the cells and events!**
3160
3161### Why Containers Matter
3162
3163Even though cells have inline styles, if the CONTAINER behind them has a different background, it can show through:
3164
3165```
3166Container (#fafafa)           ← Showing through!
3167   └─ Table Cell (#f5f5f5)    ← Transparent areas
3168      └─ Content
3169```
3170
3171### All Backgrounds Removed
3172
3173**v5.2.6 removes**:
3174- `.calendar-compact-container` background
3175- `.calendar-compact-left` background
3176- `.calendar-compact-right` background
3177- `.event-search-input-inline` background
3178- `.past-events-toggle` background & hover
3179
3180**v5.2.5 removed**:
3181- `.calendar-compact-grid tbody td` background
3182- `.calendar-compact-grid thead th` background
3183
3184**v5.2.4 removed**:
3185- `.cal-empty`, `.cal-today`, `.cal-has-events` backgrounds
3186
3187**v5.2.3 removed**:
3188- `.event-compact-item` background
3189
3190**ALL container and element backgrounds eliminated!** ��
3191
3192### What Should Work Now
3193
3194**Calendar cells**: No container background showing through ✓
3195**Event items**: No container background showing through ✓
3196**Search bar**: Uses template color ✓
3197**Past events toggle**: Uses template color ✓
3198
3199### Complete List of Fixes
3200
3201**Containers**:
3202- Main container ✓
3203- Left panel ✓
3204- Right panel ✓
3205
3206**Elements**:
3207- Table cells ✓
3208- Event items ✓
3209- Search input ✓
3210- Past events toggle ✓
3211
3212**EVERYTHING removed!** ��
3213
3214### Critical: Clear Caches
3215
3216**Must clear caches or won't work**:
32171. Hard refresh: Ctrl+Shift+R (5 times!)
32182. Clear DokuWiki cache
32193. Close browser completely
32204. Reopen and test
3221
3222**CSS caching is EXTREMELY persistent!**
3223
3224## Version 5.2.5 (2026-02-09) - REMOVE TABLE CELL CSS BACKGROUNDS
3225
3226### �� Fixed: Removed Hardcoded Backgrounds from Table Cells
3227- **Found:** `.calendar-compact-grid tbody td` had `background: #ffffff;`!
3228- **Found:** `.calendar-compact-grid tbody td:hover` had `background: #f0f7ff;`!
3229- **Found:** `.calendar-compact-grid thead th` had `background: #f8f8f8;`!
3230- **Fixed:** Removed ALL hardcoded backgrounds from table CSS
3231- **Result:** Calendar table cells finally use template colors!
3232
3233### The REAL Culprits
3234
3235The generic table CSS was overriding everything!
3236
3237**In style.css (lines 307-356)**:
3238```css
3239.calendar-compact-grid thead th {
3240    background: #f8f8f8;  /* ← Header cells hardcoded! */
3241}
3242
3243.calendar-compact-grid tbody td {
3244    background: #ffffff;  /* ← ALL table cells hardcoded! */
3245}
3246
3247.calendar-compact-grid tbody td:hover {
3248    background: #f0f7ff;  /* ← Hover state hardcoded! */
3249}
3250```
3251
3252**These apply to ALL `<td>` and `<th>` elements in the calendar table!**
3253
3254### Why This Was the Last One
3255
3256**CSS Specificity Order**:
32571. `.calendar-compact-grid tbody td` (generic - applies to ALL cells)
32582. `.cal-empty`, `.cal-today`, `.cal-has-events` (specific - applies to some cells)
32593. Inline styles (should win but didn't)
3260
3261**We removed the specific ones (v5.2.4), but the generic one was still there!**
3262
3263### What We've Removed
3264
3265**v5.2.3**:
3266- `.event-compact-item` background
3267- `.event-compact-item:hover` background
3268
3269**v5.2.4**:
3270- `.cal-empty` background & hover
3271- `.cal-today` background & hover
3272- `.cal-has-events` background & hover
3273
3274**v5.2.5 (FINAL)**:
3275- `.calendar-compact-grid tbody td` background ✓
3276- `.calendar-compact-grid tbody td:hover` background ✓
3277- `.calendar-compact-grid thead th` background ✓
3278
3279**All CSS background overrides ELIMINATED!** ��
3280
3281### Why It Took 5 Versions
3282
3283**CSS had layers of hardcoded backgrounds**:
3284
3285```
3286Layer 1: Table cells (.calendar-compact-grid tbody td)
3287         ↓ Overrode inline styles
3288Layer 2: Cell states (.cal-today, .cal-empty, etc.)
3289         ↓ Overrode table cells
3290Layer 3: Event items (.event-compact-item)
3291         ↓ Overrode inline styles
3292
3293ALL had to be removed!
3294```
3295
3296**We kept finding more specific CSS, but the base table CSS was there all along!**
3297
3298### Visual Result
3299
3300**NOW everything matches**:
3301```
3302Calendar Table:
3303┌──┬──┬──┬──┬──┬──┬──┐
3304│ S│ M│ T│ W│ T│ F│ S│ ← Headers: __background_site__
3305├──┼──┼──┼──┼──┼──┼──┤
3306│ 1│ 2│ 3│ 4│ 5│ 6│ 7│ ← Cells: __background_site__
3307├──┼──┼──┼──┼──┼──┼──┤
3308│ 8│ 9│10│11│12│13│14│ ← All: __background_site__
3309└──┴──┴──┴──┴──┴──┴──┘
3310
3311Sidebar Events:
3312┌────────────────────────┐
3313│ �� Event               │ ← __background_site__
3314│ �� Event               │ ← __background_site__
3315└────────────────────────┘
3316
3317FINALLY ALL MATCHING! ✓
3318```
3319
3320### Complete List of Removed CSS
3321
3322**ALL hardcoded backgrounds removed**:
3323- `.event-compact-item` background
3324- `.event-compact-item:hover` background
3325- `.cal-empty` background & hover
3326- `.cal-today` background & hover
3327- `.cal-has-events` background & hover
3328- `.calendar-compact-grid tbody td` background ← NEW
3329- `.calendar-compact-grid tbody td:hover` background ← NEW
3330- `.calendar-compact-grid thead th` background ← NEW
3331
3332**Every single CSS background override is GONE!** ��
3333
3334### Testing Steps
3335
3336**After installing v5.2.5**:
3337
33381. **Clear browser cache**: Ctrl+Shift+R (3 times!)
33392. **Clear DokuWiki cache**: Click the button
33403. **Close browser completely**: Restart it
33414. **Visit page**: Should finally see matching backgrounds
3342
3343**CSS is EXTREMELY sticky - may need to clear multiple times!**
3344
3345### This Should Be It
3346
3347**No more CSS overrides exist** (we've checked the entire file):
3348- Table cells ✓ Fixed
3349- Cell states ✓ Fixed
3350- Event items ✓ Fixed
3351- Headers ✓ Fixed
3352- Hover states ✓ Fixed
3353
3354**All backgrounds now come from inline styles using template colors!**
3355
3356## Version 5.2.4 (2026-02-09) - REMOVE CALENDAR CELL CSS BACKGROUNDS
3357
3358### �� Fixed: Removed Hardcoded Backgrounds from Calendar Cells
3359- **Found:** Calendar cell CSS had hardcoded backgrounds with `!important`!
3360- **Fixed:** Removed backgrounds from `.cal-today`, `.cal-empty`, `.cal-has-events` CSS
3361- **Result:** Calendar cells now use template colors!
3362
3363### The Second Culprit
3364
3365MORE hardcoded backgrounds in the CSS file!
3366
3367**In style.css (lines 359-382)**:
3368```css
3369.cal-empty {
3370    background: #fafafa !important;  /* ← Overriding inline styles! */
3371}
3372
3373.cal-today {
3374    background: #e8f5e9 !important;  /* ← Overriding today cell! */
3375}
3376
3377.cal-today:hover {
3378    background: #c8e6c9 !important;  /* ← Overriding hover! */
3379}
3380
3381.cal-has-events {
3382    background: #fffbf0;  /* ← Overriding event cells! */
3383}
3384
3385.cal-has-events:hover {
3386    background: #fff4d9;  /* ← Overriding hover! */
3387}
3388```
3389
3390**These were ALL overriding the inline styles!**
3391
3392### The Fix
3393
3394**Removed all hardcoded backgrounds**:
3395```css
3396.cal-empty {
3397    /* background removed - inline style handles this */
3398    cursor: default !important;
3399}
3400
3401.cal-today {
3402    /* background removed - inline style handles this */
3403}
3404
3405.cal-has-events {
3406    /* background removed - inline style handles this */
3407}
3408
3409/* Hover states also removed */
3410```
3411
3412### What Was Overridden
3413
3414**v5.2.3 fixed**:
3415- Event items in sidebar ✓
3416
3417**v5.2.4 fixes**:
3418- Calendar day cells ✓
3419- Today cell ✓
3420- Empty cells ✓
3421- Cells with events ✓
3422- All hover states ✓
3423
3424### Why This Kept Happening
3425
3426**CSS had hardcoded backgrounds everywhere**:
34271. Event items: `#ffffff` (fixed in v5.2.3)
34282. Calendar cells: Multiple colors (fixed in v5.2.4)
34293. **All with `!important` flags!**
3430
3431**The inline styles couldn't override them!**
3432
3433### Visual Result
3434
3435**Now ALL backgrounds match**:
3436```
3437Calendar Grid:
3438┌──┬──┬──┬──┬──┬──┬──┐
3439│  │  │  │  │  │  │  │ ← All use __background_site__
3440├──┼──┼──┼──┼──┼──┼──┤
3441│  │██│  │  │  │  │  │ ← Today uses __background_neu__
3442├──┼──┼──┼──┼──┼──┼──┤
3443│  │  │  │  │  │  │  │ ← All match template
3444└──┴──┴──┴──┴──┴──┴──┘
3445
3446Sidebar Events:
3447┌────────────────────────┐
3448│ �� Event               │ ← Uses __background_site__
3449│ �� Event               │ ← Uses __background_site__
3450└────────────────────────┘
3451
3452Perfect consistency!
3453```
3454
3455### CSS Removed
3456
3457**Calendar cells**:
3458- `.cal-empty` background
3459- `.cal-empty:hover` background
3460- `.cal-today` background
3461- `.cal-today:hover` background
3462- `.cal-has-events` background
3463- `.cal-has-events:hover` background
3464
3465**All gone!** ✓
3466
3467### Important: Clear Caches Again!
3468
3469After installing v5.2.4:
3470
34711. **Hard refresh browser**: Ctrl+Shift+R (twice!)
34722. **Clear DokuWiki cache**: Admin → Clear Cache
34733. **May need to restart browser**: To clear CSS cache
3474
3475**Old CSS is VERY sticky!**
3476
3477### Why It Took So Long
3478
3479**Multiple CSS overrides**:
3480- Event items (v5.2.3) ✓ Fixed
3481- Calendar cells (v5.2.4) ✓ Fixed
3482- Each with different classes
3483- Each with `!important`
3484- Hidden throughout CSS file
3485
3486**Found them all now!** ��
3487
3488## Version 5.2.3 (2026-02-09) - REMOVE HARDCODED CSS BACKGROUNDS
3489
3490### �� Fixed: Removed Hardcoded Backgrounds from CSS
3491- **Found:** CSS file had hardcoded `background: #ffffff;` overriding inline styles!
3492- **Fixed:** Removed hardcoded backgrounds from `.event-compact-item` CSS
3493- **Result:** Event backgrounds now properly use template colors!
3494
3495### The Root Cause
3496
3497The CSS file was overriding the inline styles with hardcoded white backgrounds!
3498
3499**In style.css (lines 599-616)**:
3500```css
3501.event-compact-item {
3502    background: #ffffff;  /* ← This was overriding inline styles! */
3503}
3504
3505.event-compact-item:hover {
3506    background: #f8f9fa;  /* ← And this on hover! */
3507}
3508```
3509
3510**Even though inline styles had `!important`**, the CSS was still being applied because it comes after in the cascade!
3511
3512### The Fix
3513
3514**Removed hardcoded backgrounds from CSS**:
3515```css
3516.event-compact-item {
3517    /* background removed - set via inline style with template colors */
3518    display: flex;
3519    /* ... other styles ... */
3520}
3521
3522.event-compact-item:hover {
3523    box-shadow: 0 1px 3px rgba(0,0,0,0.08);
3524    /* background removed - inline style handles this */
3525}
3526```
3527
3528### Why This Was So Difficult to Find
3529
3530**CSS Specificity & Cascade**:
35311. Inline styles with `!important` should win
35322. But CSS that comes after can still apply
35333. The hardcoded `background: #ffffff` was silently overriding
35344. All the PHP code was correct - it was the CSS!
3535
3536**What We Were Doing**:
3537- ✓ Reading template colors correctly
3538- ✓ Setting `cell_bg` to `__background_site__` correctly
3539- ✓ Applying inline styles with `!important` correctly
3540- ✗ CSS file was overriding everything!
3541
3542### What Was Affected
3543
3544**Event items in**:
3545- Main calendar sidebar
3546- Standalone event list
3547- Sidebar widget
3548- All event displays
3549
3550**All had white backgrounds hardcoded in CSS!**
3551
3552### Now Working
3553
3554**Events use template colors**:
3555```html
3556<div class="event-compact-item"
3557     style="background: #f5f5f5 !important; ...">
3558    ← Now this inline style actually works!
3559</div>
3560```
3561
3562**No CSS override** ✓
3563
3564### Testing
3565
3566To verify this works:
35671. Clear browser cache (important!)
35682. Clear DokuWiki cache
35693. Reload page
35704. Events should now match eventlist background
3571
3572**Browser caching can make old CSS persist!**
3573
3574### Visual Result
3575
3576**All backgrounds now matching**:
3577```
3578┌────────────────────────────┐
3579│ Eventlist (#f5f5f5)        │ ← Template color
3580├────────────────────────────┤
3581│ �� Event (#f5f5f5)         │ ← Template color (was #ffffff)
3582├────────────────────────────┤
3583│ �� Event (#f5f5f5)         │ ← Template color (was #ffffff)
3584└────────────────────────────┘
3585
3586Perfect match!
3587```
3588
3589### Why Everything Else Worked
3590
3591**Clock area, calendar cells, etc.** didn't have hardcoded CSS backgrounds:
3592- They only had inline styles ✓
3593- Inline styles worked correctly ✓
3594- Only event items had the CSS override ✗
3595
3596### Important Notes
3597
3598**Clear caches**:
3599- Browser cache (Ctrl+Shift+R or Cmd+Shift+R)
3600- DokuWiki cache (Admin → Clear Cache)
3601- Old CSS may be cached!
3602
3603**This was the culprit all along!**
3604
3605## Version 5.2.2 (2026-02-09) - FIX CLOCK AREA BACKGROUND
3606
3607### �� Fixed: Clock Area Now Matches Event Cells
3608- **Fixed:** `header_bg` now uses `__background_site__` (was `__background_alt__`)
3609- **Result:** Clock/Today header matches event cell backgrounds!
3610
3611### The Issue
3612
3613The clock area (Today header) was using a different background:
3614
3615**Before (v5.2.1)**:
3616```php
3617'header_bg' => __background_alt__,   // Different color (gray #e8e8e8)
3618'cell_bg' => __background_site__,    // Event cells (#f5f5f5)
3619```
3620
3621**After (v5.2.2)**:
3622```php
3623'header_bg' => __background_site__,  // Same as cells (#f5f5f5) ✓
3624'cell_bg' => __background_site__,    // Event cells (#f5f5f5) ✓
3625```
3626
3627### What's the Clock Area?
3628
3629The clock/Today header in the sidebar:
3630```
3631┌────────────────────────────┐
3632│ 3:45:23 PM                 │ ← Clock area (header_bg)
3633│ ��️ --° | Sun, Feb 9, 2026 │
3634└────────────────────────────┘
3635```
3636
3637### All Backgrounds Now Unified
3638
3639**Everything now uses __background_site__**:
3640- Eventlist background ✓
3641- Calendar cells ✓
3642- Event items ✓
3643- Clock/Today header ✓
3644- Sidebar widget ✓
3645- All backgrounds match! ✓
3646
3647### Visual Result
3648
3649**Complete consistency**:
3650```
3651┌────────────────────────────┐
3652│ 3:45:23 PM                 │ ← Same background
3653│ ��️ --° | Sun, Feb 9, 2026 │
3654├────────────────────────────┤
3655│ �� Meeting at 2pm          │ ← Same background
3656│ Description...             │
3657├────────────────────────────┤
3658│ �� Another event           │ ← Same background
3659│ More details...            │
3660└────────────────────────────┘
3661
3662All using __background_site__ (#f5f5f5)
3663```
3664
3665**Perfect visual harmony!** ��
3666
3667## Version 5.2.1 (2026-02-09) - FIX: MATCH EVENTLIST BACKGROUND
3668
3669### �� Fixed: Calendar Cells Now Match Eventlist Background
3670- **Fixed:** Changed `cell_bg` to use `__background_site__` (not `__background__`)
3671- **Result:** Calendar cells now match the eventlist background perfectly!
3672
3673### The Real Issue
3674
3675The eventlist was showing the CORRECT background color all along!
3676
3677**Eventlist was using**:
3678- `bg` → `__background_site__` ✓ (This was correct!)
3679
3680**Calendar cells were using**:
3681- `cell_bg` → `__background__` ✗ (This was wrong!)
3682
3683**They didn't match!**
3684
3685### The Correct Fix
3686
3687**Now everything uses __background_site__**:
3688```php
3689'bg' => __background_site__,        // Eventlist (was already correct)
3690'cell_bg' => __background_site__,   // Cells (now fixed to match)
3691```
3692
3693### Why __background_site__?
3694
3695The eventlist sidebar and calendar are meant to match the **page/site background**, not the inner content area background:
3696
3697```
3698Page Layout:
3699┌────────────────────────────────────┐
3700│ __background_site__ (page bg)     │ ← This is where calendar lives
3701│                                    │
3702│  ┌──────────────────────────────┐ │
3703│  │ __background__ (content bg)  │ │ ← Wiki article content
3704│  │                              │ │
3705│  └──────────────────────────────┘ │
3706│                                    │
3707└────────────────────────────────────┘
3708```
3709
3710**Calendar should match the page background, not the content background!**
3711
3712### Template Example
3713
3714Typical DokuWiki template:
3715```ini
3716__background_site__ = "#f5f5f5"  (Light gray - page background)
3717__background__ = "#ffffff"        (White - content area)
3718```
3719
3720**Before (v5.2.0)**:
3721- Eventlist: `#f5f5f5` (light gray) ✓ Correct
3722- Calendar cells: `#ffffff` (white) ✗ Wrong - didn't match
3723
3724**After (v5.2.1)**:
3725- Eventlist: `#f5f5f5` (light gray) ✓ Correct
3726- Calendar cells: `#f5f5f5` (light gray) ✓ Correct - MATCHED!
3727
3728### All Backgrounds Now Unified
3729
3730**Everything now uses __background_site__**:
3731- Eventlist sidebar background ✓
3732- Main calendar background ✓
3733- Calendar day cells ✓
3734- Sidebar widget ✓
3735- Event items ✓
3736- Input fields ✓
3737- Buttons ✓
3738
3739**All perfectly matched to the page background!**
3740
3741### Why Version 5.2.0 Was Wrong
3742
3743I incorrectly assumed `__background__` was the right color because it's often white. But the eventlist was already correct using `__background_site__` to match the page, not the content area.
3744
3745**The eventlist knew what it was doing all along!** The cells just needed to catch up.
3746
3747## Version 5.2.0 (2026-02-09) - UNIFIED WIKI THEME BACKGROUNDS
3748**Note**: This version went the wrong direction. See v5.2.1 for the correct fix.
3749
3750### �� Fixed: All Backgrounds Now Use __background__
3751- **Fixed:** `bg` now uses `__background__` instead of `__background_site__`
3752- **Fixed:** Eventlist, calendar cells, and sidebar all match now
3753- **Result:** Completely unified background throughout!
3754
3755### The Issue
3756
3757Different parts of the calendar were using different background sources:
3758
3759**Before (v5.1.9)**:
3760```php
3761'bg' => __background_site__        // Eventlist background (outer page)
3762'cell_bg' => __background__        // Cell backgrounds (content area)
3763```
3764
3765**These are different colors!**
3766- `__background_site__` = Outer page wrapper (often gray)
3767- `__background__` = Main content area (often white)
3768
3769### The Fix
3770
3771**After (v5.2.0)**:
3772```php
3773'bg' => __background__             // Eventlist background ✓
3774'cell_bg' => __background__        // Cell backgrounds ✓
3775```
3776
3777**Both use the same source!**
3778
3779### What Uses 'bg'
3780
3781The `bg` color is used for:
3782- Eventlist sidebar background
3783- Main calendar container
3784- Sidebar widget background
3785- Form backgrounds
3786- Event dialogs
3787
3788### What Uses 'cell_bg'
3789
3790The `cell_bg` color is used for:
3791- Calendar day cells
3792- Event item backgrounds
3793- Input field backgrounds
3794- Button backgrounds
3795
3796### Why This Matters
3797
3798**Template color hierarchy**:
3799```
3800__background_site__ → Outer page/body (e.g., #f5f5f5 light gray)
3801__background__      → Main content area (e.g., #ffffff white)
3802__background_alt__  → Sections/headers
3803__background_neu__  → Highlights
3804```
3805
3806**We want all calendar backgrounds to match the main content area!**
3807
3808### Visual Comparison
3809
3810**Before (v5.1.9)**: Mismatched backgrounds
3811```
3812┌────────────────────────────────┐
3813│ Eventlist (gray #f5f5f5)      │ ← __background_site__
3814└────────────────────────────────┘
3815
3816┌────────────────────────────────┐
3817│ Calendar                       │
3818│ ┌──┬──┬──┬──┬──┬──┬──┐       │
3819│ │  │  │  │  │  │  │  │       │ ← __background__ (white #fff)
3820│ └──┴──┴──┴──┴──┴──┴──┘       │
3821└────────────────────────────────┘
3822Different colors - looks inconsistent
3823```
3824
3825**After (v5.2.0)**: Unified backgrounds
3826```
3827┌────────────────────────────────┐
3828│ Eventlist (white #fff)         │ ← __background__
3829└────────────────────────────────┘
3830
3831┌────────────────────────────────┐
3832│ Calendar                       │
3833│ ┌──┬──┬──┬──┬──┬──┬──┐       │
3834│ │  │  │  │  │  │  │  │       │ ← __background__ (white #fff)
3835│ └──┴──┴──┴──┴──┴──┴──┘       │
3836└────────────────────────────────┘
3837Same color - perfectly consistent!
3838```
3839
3840### Template Examples
3841
3842**Light Template**:
3843```ini
3844__background_site__ = "#f5f5f5"  (light gray)
3845__background__ = "#ffffff"       (white)
3846```
3847
3848**Before**: Eventlist gray, cells white
3849**After**: Eventlist white, cells white ✓
3850
3851**Dark Template**:
3852```ini
3853__background_site__ = "#1a1a1a"  (very dark)
3854__background__ = "#2d2d2d"       (dark)
3855```
3856
3857**Before**: Eventlist very dark, cells dark
3858**After**: Eventlist dark, cells dark ✓
3859
3860### Benefits
3861
3862**Visual Consistency**:
3863- All backgrounds match
3864- Clean, unified appearance
3865- Professional look
3866
3867**Correct Template Integration**:
3868- Uses content area color (not page wrapper)
3869- Matches wiki content area
3870- Proper color hierarchy
3871
3872**Works Everywhere**:
3873- Light templates ✓
3874- Dark templates ✓
3875- Custom templates ✓
3876
3877### All Backgrounds Unified
3878
3879**Now using __background__**:
3880- Eventlist background ✓
3881- Calendar cells ✓
3882- Sidebar widget ✓
3883- Event items ✓
3884- Input fields ✓
3885- Buttons ✓
3886- Dialogs ✓
3887
3888**Perfect harmony throughout!** ��
3889
3890## Version 5.1.9 (2026-02-09) - FIX WIKI THEME EVENT BACKGROUNDS
3891
3892### �� Fixed: Wiki Theme Event Backgrounds Not Showing
3893- **Fixed:** Wiki theme fallback used CSS variables in inline styles (doesn't work!)
3894- **Fixed:** Replaced CSS variables with actual hex colors
3895- **Result:** Event backgrounds now show correctly with template colors!
3896
3897### The Problem
3898
3899CSS variables like `var(--__background__, #fff)` don't work in inline `style=""` attributes!
3900
3901**Before (broken)**:
3902```php
3903'cell_bg' => 'var(--__background__, #fff)',  // Doesn't work in inline styles!
3904```
3905
3906**After (fixed)**:
3907```php
3908'cell_bg' => '#fff',  // Actual hex color works!
3909```
3910
3911### What Was Affected
3912
3913**When style.ini read successfully**:
3914- ✅ Worked fine (uses actual hex colors from file)
3915
3916**When style.ini fallback used**:
3917- ❌ Events had no background
3918- ❌ CSS variables don't work in inline styles
3919- ❌ Looked broken
3920
3921### The Fix
3922
3923**Wiki theme fallback now uses real colors**:
3924```php
3925'wiki' => [
3926    'bg' => '#f5f5f5',           // Real hex (was: var(--__background_site__))
3927    'border' => '#ccc',           // Real hex (was: var(--__border__))
3928    'cell_bg' => '#fff',          // Real hex (was: var(--__background__))
3929    'cell_today_bg' => '#eee',    // Real hex (was: var(--__background_neu__))
3930    'text_primary' => '#333',     // Real hex (was: var(--__text__))
3931    'text_bright' => '#2b73b7',   // Real hex (was: var(--__link__))
3932    'text_dim' => '#666',         // Real hex (was: var(--__text_neu__))
3933    'grid_bg' => '#e8e8e8',       // Real hex (was: var(--__background_alt__))
3934    // ... all colors now use real hex values
3935]
3936```
3937
3938### Why CSS Variables Don't Work
3939
3940**CSS variables work**:
3941```css
3942.some-class {
3943    background: var(--__background__, #fff);  /* ✓ Works in CSS */
3944}
3945```
3946
3947**CSS variables DON'T work**:
3948```html
3949<div style="background: var(--__background__, #fff)">  <!-- ✗ Doesn't work -->
3950```
3951
3952### How It Works Now
3953
3954**Priority system**:
39551. **Try reading style.ini** → Use actual template hex colors ✓
39562. **If file not found** → Use fallback hex colors ✓
39573. **Never use CSS variables in inline styles** ✓
3958
3959**Both paths now work correctly!**
3960
3961### Visual Result
3962
3963**Events now have proper backgrounds**:
3964```
3965┌──────────────────────────┐
3966│ �� Meeting at 2pm        │ ← White background (#fff)
3967│ Description here...      │
3968│ [✏️ Edit] [��️ Delete]   │
3969└──────────────────────────┘
3970
3971Not:
3972┌──────────────────────────┐
3973│ �� Meeting at 2pm        │ ← No background (broken)
3974│ Description here...      │
3975└──────────────────────────┘
3976```
3977
3978### Affected Areas
3979
3980**All event displays**:
3981- Main calendar events ✓
3982- Sidebar widget events ✓
3983- Event list items ✓
3984- Event backgrounds ✓
3985- Button backgrounds ✓
3986- Input field backgrounds ✓
3987
3988**Everything uses real colors now!**
3989
3990## Version 5.1.8 (2026-02-09) - IMPROVED UPDATE TAB LAYOUT
3991
3992### �� Reorganized: Better Update Tab Layout
3993- **Moved:** Current Version section to the top
3994- **Combined:** Upload and Important Notes side-by-side
3995- **Improved:** Space-efficient two-column layout
3996- **Result:** More information visible at once!
3997
3998### New Layout Order
3999
4000**Version 5.1.8**:
4001```
40021. Current Version (at top - see what you have)
40032. Upload + Important Notes (side-by-side)
40043. Recent Changes (changelog)
40054. Backups
4006```
4007
4008### Side-by-Side Design
4009
4010**Upload form (left 60%) + Important Notes (right 40%)**:
4011```
4012┌──────────────────────────────────────────┐
4013│ �� Current Version                       │
4014│ Version: 5.1.8                           │
4015│ ✅ Permissions: OK                       │
4016└──────────────────────────────────────────┘
4017
4018┌─────────────────────┬────────────────────┐
4019│ �� Upload New       │ ⚠️ Important Notes │
4020│ [Choose File]       │ • Replaces files   │
4021│ ☑ Backup first      │ • Config preserved │
4022│ [Upload] [Clear]    │ • Events safe      │
4023└─────────────────────┴────────────────────┘
4024```
4025
4026### Benefits
4027
4028**Current Version First**:
4029- See what you have immediately
4030- Check permissions at a glance
4031- Know if ready to update
4032
4033**Side-by-Side Layout**:
4034- Upload form and warnings together
4035- Read notes while choosing file
4036- More efficient use of space
4037- Less scrolling needed
4038
4039**Better Information Flow**:
40401. See current version ✓
40412. Upload new version with notes visible ✓
40423. Review recent changes ✓
40434. Manage backups ✓
4044
4045### Visual Comparison
4046
4047**Before (v5.1.7)**:
4048```
4049Important Notes (full width)
40504051Upload Form (full width)
40524053Current Version
40544055Recent Changes
40564057Backups
4058```
4059
4060**After (v5.1.8)**:
4061```
4062Current Version (full width)
40634064Upload (60%) | Notes (40%)
40654066Recent Changes
40674068Backups
4069```
4070
4071**More compact, better organized!**
4072
4073### Responsive Design
4074
4075**Wide screens**:
4076- Upload and notes side-by-side
4077- Full 1200px width utilized
4078- Efficient space usage
4079
4080**Narrow screens**:
4081- Sections stack gracefully
4082- Flex layout adapts
4083- Still fully functional
4084
4085### Layout Details
4086
4087**Current Version Section**:
4088- Full width (1200px max)
4089- Shows version, author, description
4090- Permission status with icons
4091- Helpful fix commands if needed
4092
4093**Upload/Notes Section**:
4094- Flexbox layout with gap
4095- Upload: `flex:1` (grows)
4096- Notes: `flex:0 0 350px` (fixed 350px)
4097- Both have proper min-width
4098
4099**Recent Changes Section**:
4100- Full width (1200px max)
4101- Compact scrollable view
4102- Color-coded change types
4103- Last 10 versions shown
4104
4105**Backups Section**:
4106- Full width (1200px max)
4107- Manual backup button
4108- Scrollable file list
4109- All actions accessible
4110
4111### Improved Max Widths
4112
4113All sections now use `max-width:1200px` (previously 900px):
4114- Better use of wide screens
4115- Still responsive on narrow screens
4116- Consistent throughout tab
4117
4118## Version 5.1.7 (2026-02-09) - FIX SYNTAX ERROR
4119
4120### �� Fixed: Extra Closing Brace
4121- **Fixed:** ParseError on line 1936 (extra closing brace)
4122- **Result:** Manual backup feature now works correctly!
4123
4124### What Was Wrong
4125
4126Extra `}` after the backup section:
4127
4128**Before (broken)**:
4129```php
4130echo '</div>';
4131}  // ← Extra closing brace!
4132
4133echo '<script>
4134```
4135
4136**After (fixed)**:
4137```php
4138echo '</div>';
4139
4140echo '<script>
4141```
4142
4143**Manual backup feature now fully functional!** ✅
4144
4145## Version 5.1.6 (2026-02-09) - MANUAL BACKUP ON DEMAND
4146
4147### �� Added: Create Backup Manually Anytime
4148- **Added:** "Create Backup Now" button in Backups section
4149- **Added:** Manual backup action handler with full verification
4150- **Added:** Backups section always visible (even with no backups)
4151- **Added:** Success message showing file size and file count
4152- **Result:** Create backups anytime without needing to upload!
4153
4154### Manual Backup Button
4155
4156**New Layout**:
4157```
4158┌─────────────────────────────────────┐
4159│ �� Backups        [�� Create Backup Now] │
4160├─────────────────────────────────────┤
4161│ Backup File                Size     │
4162calendar.backup.v5.1.6...  243 KB   │
4163│ [�� Download] [✏️ Rename] [��️ Delete] │
4164└─────────────────────────────────────┘
4165```
4166
4167**Always visible - even with no backups**:
4168```
4169┌─────────────────────────────────────┐
4170│ �� Backups        [�� Create Backup Now] │
4171├─────────────────────────────────────┤
4172│ No backups yet. Click "Create       │
4173│ Backup Now" to create your first    │
4174│ backup.                              │
4175└─────────────────────────────────────┘
4176```
4177
4178### How It Works
4179
4180**Click the button**:
41811. Confirm: "Create a backup of the current plugin version?"
41822. System creates backup ZIP
41833. Verifies: File count (30+ files)
41844. Verifies: File size (200KB+)
41855. Shows success: "✓ Manual backup created: filename.zip (243 KB, 31 files)"
4186
4187**Backup naming**:
4188```
4189calendar.backup.v5.1.6.manual.2026-02-09_12-30-45.zip
4190                       ^^^^^^
4191                     "manual" tag identifies manual backups
4192```
4193
4194### Use Cases
4195
4196**Before updates**:
4197- Create safety backup before uploading new version
4198- Have multiple restore points
4199- Test new features with fallback
4200
4201**Regular backups**:
4202- Weekly/monthly backup schedule
4203- Before making configuration changes
4204- After important customizations
4205
4206**Development**:
4207- Backup before code experiments
4208- Save working states
4209- Quick rollback points
4210
4211### Full Verification
4212
4213**Same checks as automatic backups**:
4214- ✅ File count check (minimum 10, expected 30+)
4215- ✅ File size check (minimum 1KB, expected 200KB+)
4216- ✅ Existence check (file actually created)
4217- ✅ Automatic cleanup on failure
4218
4219**Success message includes**:
4220- Backup filename
4221- File size (human-readable)
4222- Number of files backed up
4223
4224### Example Messages
4225
4226**Success**:
4227```
4228✓ Manual backup created successfully:
4229  calendar.backup.v5.1.6.manual.2026-02-09_12-30-45.zip
4230  (243 KB, 31 files)
4231```
4232
4233**Failure Examples**:
4234```
4235❌ Plugin directory is not readable.
4236   Please check permissions.
4237
4238❌ Backup incomplete: Only 5 files were added (expected 30+).
4239   Backup failed.
4240
4241❌ Backup file is too small (342 bytes).
4242   Only 3 files were added. Backup failed.
4243```
4244
4245### Benefits
4246
4247**On-Demand Safety**:
4248- Create backups anytime
4249- No need to upload new version
4250- Quick and easy
4251
4252**Peace of Mind**:
4253- Backup before risky changes
4254- Multiple restore points
4255- Safe experimentation
4256
4257**Professional Workflow**:
4258- Regular backup schedule
4259- Version snapshots
4260- Disaster recovery
4261
4262### Backup Section Improvements
4263
4264**Always Visible**:
4265- Section shows even with 0 backups
4266- Button always accessible
4267- Clear call-to-action
4268
4269**Better Header**:
4270- Title and button on same row
4271- Clean, professional layout
4272- Space-efficient design
4273
4274### Technical Details
4275
4276**New Action**: `create_manual_backup`
4277
4278**New Function**: `createManualBackup()`
4279- Gets current version
4280- Creates timestamped filename with "manual" tag
4281- Uses same verification as auto-backups
4282- Shows detailed success/error messages
4283
4284**File Naming Convention**:
4285```
4286Automatic (on upload):
4287calendar.backup.v5.1.6.2026-02-09_12-30-45.zip
4288
4289Manual (button click):
4290calendar.backup.v5.1.6.manual.2026-02-09_12-30-45.zip
4291                       ^^^^^^^
4292                    Easy to identify!
4293```
4294
4295### Permissions Required
4296
4297- **Read access**: Plugin directory
4298- **Write access**: Parent plugins directory
4299
4300**Same as automatic backups** - no additional permissions needed!
4301
4302## Version 5.1.5 (2026-02-09) - ENHANCED BACKUP VERIFICATION
4303
4304### �� Enhanced: Backup Creation with Robust Verification
4305- **Added:** File count validation (must have 10+ files)
4306- **Added:** File size validation (must be 1KB+ minimum)
4307- **Added:** Return value from addDirectoryToZip (counts files added)
4308- **Added:** Detailed error messages showing file count
4309- **Added:** Automatic deletion of invalid/incomplete backups
4310- **Enhanced:** Exception handling with proper error propagation
4311- **Result:** Backups are now guaranteed to be complete or fail clearly!
4312
4313### What Changed
4314
4315**Before (v5.1.4)**:
4316```php
4317$this->addDirectoryToZip($zip, $pluginDir, 'calendar/');
4318$zip->close();
4319// No verification - could create empty or partial backup
4320```
4321
4322**After (v5.1.5)**:
4323```php
4324$fileCount = $this->addDirectoryToZip($zip, $pluginDir, 'calendar/');
4325$zip->close();
4326
4327// Verify backup exists
4328if (!file_exists($backupPath)) {
4329    redirect('Backup file was not created');
4330}
4331
4332// Verify backup has content
4333$backupSize = filesize($backupPath);
4334if ($backupSize < 1000) {
4335    unlink($backupPath);
4336    redirect('Backup too small: ' . $backupSize . ' bytes');
4337}
4338
4339// Verify file count
4340if ($fileCount < 10) {
4341    unlink($backupPath);
4342    redirect('Only ' . $fileCount . ' files added (expected 30+)');
4343}
4344```
4345
4346### Backup Validation Checks
4347
4348**Three-Layer Verification**:
4349
43501. **File Count Check**:
4351   - Minimum: 10 files required
4352   - Expected: 30+ files
4353   - Action: Delete backup if too few files
4354
43552. **Size Check**:
4356   - Minimum: 1KB (1000 bytes)
4357   - Expected: 200-250KB
4358   - Action: Delete backup if too small
4359
43603. **Existence Check**:
4361   - Verify file was actually created
4362   - Check ZIP archive is valid
4363   - Action: Error if file missing
4364
4365### Enhanced Error Reporting
4366
4367**Detailed Error Messages**:
4368```
4369❌ "Backup file was not created"
4370❌ "Backup too small (342 bytes). Only 3 files added."
4371❌ "Only 5 files added (expected 30+). Backup aborted."
4372❌ "Too many errors adding files: Failed to add X, Y, Z..."
4373❌ "Directory does not exist: /path/to/dir"
4374❌ "Directory is not readable: /path/to/dir"
4375```
4376
4377**Now you know exactly what went wrong!**
4378
4379### Improved addDirectoryToZip Function
4380
4381**Returns File Count**:
4382```php
4383private function addDirectoryToZip($zip, $dir, $zipPath = '') {
4384    $fileCount = 0;
4385    $errors = [];
4386
4387    // Validation
4388    if (!is_dir($dir)) throw new Exception("Directory does not exist");
4389    if (!is_readable($dir)) throw new Exception("Not readable");
4390
4391    // Add files
4392    foreach ($files as $file) {
4393        if ($zip->addFile($filePath, $relativePath)) {
4394            $fileCount++;
4395        } else {
4396            $errors[] = "Failed to add: " . $filename;
4397        }
4398    }
4399
4400    // Check error threshold
4401    if (count($errors) > 5) {
4402        throw new Exception("Too many errors");
4403    }
4404
4405    return $fileCount;  // Returns count for verification!
4406}
4407```
4408
4409### Safety Features
4410
4411**Invalid Backup Cleanup**:
4412- Failed backups are automatically deleted
4413- No partial/corrupt backups left behind
4414- Clean error state
4415
4416**Error Threshold**:
4417- Allow up to 5 minor file errors (logs warnings)
4418- More than 5 errors = complete failure
4419- Prevents partially corrupt backups
4420
4421**Directory Validation**:
4422- Check directory exists before processing
4423- Check directory is readable
4424- Fail fast with clear errors
4425
4426### Benefits
4427
4428**Guaranteed Complete Backups**:
4429- ✅ All files included or backup fails
4430- ✅ No silent failures
4431- ✅ Clear error messages
4432- ✅ Automatic cleanup
4433
4434**Better Debugging**:
4435- Know exactly how many files were added
4436- See specific errors for missing files
4437- Understand why backup failed
4438
4439**User Confidence**:
4440- Backup succeeds = complete backup
4441- Backup fails = clear error message
4442- No ambiguity
4443
4444### Example Scenarios
4445
4446**Scenario 1: Permission Issue**
4447```
4448User uploads new version
4449System starts backup
4450Error: "Directory is not readable: /lib/plugins/calendar/"
4451Backup fails before creating file
4452User sees clear error message
4453```
4454
4455**Scenario 2: Partial Backup**
4456```
4457User uploads new version
4458System creates backup
4459Only 5 files added (disk issue?)
4460Size: 450 bytes
4461Verification fails
4462Incomplete backup deleted
4463Error: "Only 5 files added (expected 30+)"
4464```
4465
4466**Scenario 3: Success**
4467```
4468User uploads new version
4469System creates backup
447031 files added
4471Size: 240KB
4472All verifications pass ✅
4473Update proceeds
4474```
4475
4476### Testing Recommendations
4477
4478After installing v5.1.5:
44791. Upload a new version with backup enabled
44802. Check for success message
44813. Verify backup file exists in /lib/plugins/
44824. Check backup file size (should be ~240KB)
44835. If backup fails, read error message carefully
4484
4485**Your backups are now bulletproof!** ��
4486
4487## Version 5.1.4 (2026-02-09) - BACKUP SYSTEM VERIFIED
4488
4489### ✅ Verified: Backup System Working Correctly
4490- **Verified:** addDirectoryToZip function includes all files recursively
4491- **Verified:** Backups contain all 31+ files from calendar directory
4492- **Verified:** File sizes are appropriate (233-240KB compressed, ~1MB uncompressed)
4493- **Info:** Backup sizes grow slightly with each version (more code = more features!)
4494- **Result:** Backup system is working perfectly!
4495
4496### Backup System Details
4497
4498**What Gets Backed Up**:
4499- All PHP files (syntax.php, admin.php, action.php, etc.)
4500- All JavaScript files (calendar-main.js, script.js)
4501- All documentation (CHANGELOG.md, README.md, all guides)
4502- All configuration (sync_config.php)
4503- All language files
4504- All assets and resources
4505- **Everything in the calendar/ directory!**
4506
4507**Backup Size Analysis**:
4508```
4509Version 5.0.4: 233KB (normal)
4510Version 5.0.5: 234KB (normal)
4511Version 5.0.6: 235KB (normal)
4512Version 5.0.7: 236KB (normal)
4513Version 5.0.8: 237KB (normal)
4514Version 5.0.9: 237KB (normal)
4515Version 5.1.0: 238KB (normal)
4516Version 5.1.1: 238KB (normal)
4517Version 5.1.2: 240KB (normal - added AJAX features)
4518Version 5.1.3: 240KB (normal)
4519```
4520
4521**Why Sizes Grow**:
4522- More features = more code
4523- Longer CHANGELOG
4524- Additional documentation
4525- New functionality
4526- **This is expected and normal!**
4527
4528**Compression Ratio**:
4529```
4530Uncompressed: ~1.0 MB (source files)
4531Compressed:   ~240 KB (ZIP archive)
4532Ratio:        ~24% (excellent compression!)
4533```
4534
4535### Backup File Contents
4536
4537**31 Files Included**:
4538```
4539admin.php              (216KB - main admin interface)
4540syntax.php             (173KB - calendar rendering)
4541calendar-main.js       (102KB - JavaScript functionality)
4542CHANGELOG.md           (268KB - complete version history)
4543style.css              (57KB - all styling)
4544action.php             (38KB - DokuWiki actions)
4545sync_outlook.php       (32KB - Outlook integration)
4546+ 24 other files (docs, configs, helpers)
4547```
4548
4549**All files successfully included!** ✅
4550
4551### How Backups Work
4552
4553**Creation Process**:
45541. User uploads new plugin version
45552. Checkbox "Create backup first" (checked by default)
45563. System creates backup: `calendar.backup.v5.1.3.2026-02-09_06-00-00.zip`
45574. Backup saved to: `/lib/plugins/` directory
45585. Then proceeds with update
4559
4560**Backup Function**:
4561```php
4562private function addDirectoryToZip($zip, $dir, $zipPath = '') {
4563    $files = new RecursiveIteratorIterator(
4564        new RecursiveDirectoryIterator($dir),
4565        RecursiveIteratorIterator::LEAVES_ONLY
4566    );
4567    foreach ($files as $file) {
4568        if (!$file->isDir()) {
4569            $zip->addFile($filePath, $relativePath);
4570        }
4571    }
4572}
4573```
4574
4575**Recursive = Gets Everything!** ✅
4576
4577### Verification Results
4578
4579**Test Results**:
4580- ✅ All 31 files present in zip
4581- ✅ All subdirectories included (lang/en/)
4582- ✅ File sizes match originals
4583- ✅ Compression works properly
4584- ✅ No files missing
4585- ✅ Backup can be restored
4586
4587**File Count**:
4588```
4589Source directory: 31 files
4590Backup ZIP:       34 items (31 files + 3 directories)
4591Status:           COMPLETE ✅
4592```
4593
4594### Backup Best Practices
4595
4596**Always enabled by default** ✅
4597**Stored in accessible location** ✅
4598**Timestamped filenames** ✅
4599**Complete directory backup** ✅
4600**Easy to restore** ✅
4601
4602### Conclusion
4603
4604The backup system is working perfectly. The file sizes are appropriate and expected:
4605- Compressed size: ~240KB (good compression)
4606- Uncompressed size: ~1MB (all source files)
4607- All files included: YES ✅
4608- Growing size over versions: Normal (more features!)
4609
4610**Your backups are complete and reliable!** ��
4611
4612## Version 5.1.3 (2026-02-08) - FIX JAVASCRIPT SYNTAX ERROR
4613
4614### �� Fixed: JavaScript Syntax Error in AJAX Function
4615- **Fixed:** ParseError on line 1947 (deleteBackup function)
4616- **Fixed:** Escaped all single quotes in JavaScript strings
4617- **Result:** AJAX backup deletion now works correctly!
4618
4619### What Was Wrong
4620
4621JavaScript inside PHP echo needs escaped quotes:
4622
4623**Before (broken)**:
4624```javascript
4625formData.append('action', 'delete_backup');  // PHP interprets quotes
4626```
4627
4628**After (fixed)**:
4629```javascript
4630formData.append(\'action\', \'delete_backup\');  // Escaped for PHP
4631```
4632
4633### All Quotes Escaped
4634
4635Fixed in deleteBackup function:
4636- ✅ FormData.append() calls
4637- ✅ fetch() URL
4638- ✅ querySelector() calls
4639- ✅ createElement() call
4640- ✅ All string literals
4641- ✅ Error messages
4642
4643**JavaScript now works!** ✓
4644
4645## Version 5.1.2 (2026-02-08) - AJAX BACKUP DELETION & LAYOUT IMPROVEMENT
4646
4647### �� Improved: Update Tab Further Refined
4648- **Moved:** Important Notes to very top (above upload)
4649- **Enhanced:** Delete backup now uses AJAX (no page refresh!)
4650- **Added:** Smooth fade-out animation when deleting backups
4651- **Added:** Success message after deletion
4652- **Auto-remove:** Backup section disappears if last backup deleted
4653- **Result:** Smoother, more polished experience!
4654
4655### New Layout Order
4656
4657**Final Order (v5.1.2)**:
4658```
46591. ⚠️ Important Notes (warnings at top)
46602. �� Upload New Version (with Clear Cache button)
46613. �� Current Version (info)
46624. �� Recent Changes (changelog)
46635. �� Available Backups (if any)
4664```
4665
4666### AJAX Backup Deletion
4667
4668**Before (v5.1.1)**:
4669- Click Delete → Page refreshes → Scroll back down
4670- Lose position on page
4671- Page reload is jarring
4672
4673**After (v5.1.2)**:
4674- Click Delete → Confirm
4675- Row fades out smoothly
4676- Row disappears
4677- Success message shows at top
4678- Success message fades after 3 seconds
4679- If last backup: entire section fades away
4680- **No page refresh!** ✓
4681
4682### Visual Flow
4683
4684**Delete Animation**:
4685```
46861. Click ��️ Delete
46872. Confirm dialog
46883. Row fades out (0.3s)
46894. Row removed
46905. Success message appears
46916. Message fades after 3s
4692```
4693
4694**If Last Backup**:
4695```
46961. Delete last backup
46972. Row fades out
46983. Entire "Available Backups" section fades
46994. Section removed
47005. Clean interface ✓
4701```
4702
4703### Success Message
4704
4705After deleting:
4706```
4707┌──────────────────────────────┐
4708│ ✓ Backup deleted: filename   │ ← Appears at top
4709└──────────────────────────────┘
4710   Fades after 3 seconds
4711```
4712
4713### Benefits
4714
4715**Important Notes First**:
4716- Warnings before actions ✓
4717- Read before uploading ✓
4718- Clear expectations ✓
4719
4720**AJAX Deletion**:
4721- No page refresh ✓
4722- Smooth animations ✓
4723- Stay in context ✓
4724- Professional feel ✓
4725
4726**Auto-Cleanup**:
4727- Empty list disappears ✓
4728- Clean interface ✓
4729- No clutter ✓
4730
4731### Technical Implementation
4732
4733**AJAX Request**:
4734```javascript
4735fetch('?do=admin&page=calendar&tab=update', {
4736    method: 'POST',
4737    body: formData
4738})
4739```
4740
4741**DOM Manipulation**:
4742- Fade out row
4743- Remove element
4744- Show success
4745- Remove section if empty
4746
4747**Smooth Transitions**:
4748- 300ms fade animations
4749- Clean visual feedback
4750- Professional polish
4751
4752## Version 5.1.1 (2026-02-08) - REORGANIZE UPDATE TAB
4753
4754### �� Improved: Update Tab Layout Reorganized
4755- **Moved:** Upload section to the top of the page
4756- **Added:** Clear Cache button next to Upload & Install button
4757- **Changed:** "Current Version" section moved below upload
4758- **Result:** Better workflow - upload first, then see version info!
4759
4760### New Layout Order
4761
4762**Before (v5.1.0)**:
4763```
47641. Clear Cache (standalone)
47652. Current Version
47663. Recent Changes
47674. Upload New Version
47685. Warning Box
47696. Backups
4770```
4771
4772**After (v5.1.1)**:
4773```
47741. Upload New Version (with Clear Cache button side-by-side)
47752. Warning Box
47763. Current Version
47774. Recent Changes
47785. Backups
4779```
4780
4781### Visual Result
4782
4783**Top of Update Tab**:
4784```
4785┌─────────────────────────────────┐
4786│ �� Upload New Version           │
4787│ ┌─────────────────────────────┐ │
4788│ │ [Choose File]               │ │
4789│ │ ☑ Create backup first       │ │
4790│ │ ┌──────────────┬──────────┐ │ │
4791│ │ │�� Upload &   │��️ Clear  │ │ │
4792│ │ │   Install    │   Cache  │ │ │
4793│ │ └──────────────┴──────────┘ │ │
4794│ └─────────────────────────────┘ │
4795│                                 │
4796│ ⚠️ Important Notes              │
4797│ • Will replace all files        │
4798│ • Config preserved              │
4799│                                 │
4800│ �� Current Version              │
4801│ Version: 5.1.1                  │
4802└─────────────────────────────────┘
4803```
4804
4805### Benefits
4806
4807**Better Workflow**:
4808- Primary action (upload) is first
4809- Clear cache conveniently next to install
4810- No scrolling to find upload button
4811- Logical top-to-bottom flow
4812
4813**Side-by-Side Buttons**:
4814- Upload & Install (green)
4815- Clear Cache (orange)
4816- Both common actions together
4817- Easy to access after upload
4818
4819**Improved UX**:
4820- Upload is most important → now at top
4821- Version info is reference → moved down
4822- Related actions grouped
4823- Cleaner organization
4824
4825### Button Layout
4826
4827```
4828┌──────────────────┬──────────────┐
4829│ �� Upload &      │ ��️ Clear     │
4830│    Install       │    Cache     │
4831│ (Green)          │ (Orange)     │
4832└──────────────────┴──────────────┘
4833```
4834
4835**Green = Primary Action**
4836**Orange = Secondary Action**
4837
4838Both easily accessible!
4839
4840## Version 5.1.0 (2026-02-08) - ADMIN SECTIONS USE MAIN BACKGROUND
4841
4842### �� Changed: Admin Section Backgrounds Now Use __background__
4843- **Changed:** All section boxes now use `__background__` instead of `__background_alt__`
4844- **Result:** Cleaner, more unified admin interface!
4845
4846### Background Usage Update
4847
4848**Before (v5.0.9)**:
4849```php
4850Section boxes: bg_alt (__background_alt__)
4851Content areas: bg (__background__)
4852```
4853
4854**After (v5.1.0)**:
4855```php
4856Section boxes: bg (__background__)
4857Content areas: bg (__background__)
4858```
4859
4860### Why This Change?
4861
4862**More unified appearance**:
4863- Sections and content use same background
4864- Creates cleaner, more cohesive look
4865- Borders provide visual separation
4866- Matches typical admin UI patterns
4867
4868**Template color hierarchy**:
4869```
4870__background_site__ → Outer page wrapper
4871__background__      → Content & sections (BOTH now use this)
4872__background_alt__  → Reserved for special panels/highlights
4873__background_neu__  → Special highlights
4874```
4875
4876### Visual Result
4877
4878**Light Template**:
4879```ini
4880__background__ = "#ffffff"
4881__background_alt__ = "#e8e8e8"
4882```
4883
4884**Before**:
4885```
4886Admin Page:
4887┌─────────────────────┐
4888│ ┌─────────────────┐ │
4889│ │ Section Box     │ │ ← Gray (#e8e8e8)
4890│ │ ┌─────────────┐ │ │
4891│ │ │ Content     │ │ │ ← White (#fff)
4892│ │ └─────────────┘ │ │
4893│ └─────────────────┘ │
4894└─────────────────────┘
4895Two-tone appearance
4896```
4897
4898**After**:
4899```
4900Admin Page:
4901┌─────────────────────┐
4902│ ┌─────────────────┐ │
4903│ │ Section Box     │ │ ← White (#fff)
4904│ │ ┌─────────────┐ │ │
4905│ │ │ Content     │ │ │ ← White (#fff)
4906│ │ └─────────────┘ │ │
4907│ └─────────────────┘ │
4908└─────────────────────┘
4909Unified, clean appearance
4910Borders provide separation
4911```
4912
4913**Dark Template**:
4914```ini
4915__background__ = "#2d2d2d"
4916__background_alt__ = "#3a3a3a"
4917```
4918
4919**After**:
4920```
4921Admin Page:
4922┌─────────────────────┐
4923│ ┌─────────────────┐ │
4924│ │ Section Box     │ │ ← Dark (#2d2d2d)
4925│ │ ┌─────────────┐ │ │
4926│ │ │ Content     │ │ │ ← Dark (#2d2d2d)
4927│ │ └─────────────┘ │ │
4928│ └─────────────────┘ │
4929└─────────────────────┘
4930Unified dark appearance
4931Accent borders provide definition
4932```
4933
4934### Benefits
4935
4936**Cleaner Look**:
4937- No more alternating gray/white
4938- More professional appearance
4939- Less visual noise
4940- Unified color scheme
4941
4942**Better Consistency**:
4943- Matches modern admin UI patterns
4944- Borders define sections, not colors
4945- Simpler, cleaner design
4946- Easier on the eyes
4947
4948**Template Friendly**:
4949- Works with any background color
4950- Light or dark templates
4951- Custom colors
4952- Always looks cohesive
4953
4954### All Sections Updated
4955
4956✅ Outlook Sync config sections
4957✅ Manage Events sections
4958✅ Update Plugin sections
4959✅ Themes tab sections
4960✅ Week start day section
4961✅ All form sections
4962
4963**Complete unified theming!** ��
4964
4965## Version 5.0.9 (2026-02-08) - FIX SYNTAX ERROR IN THEMES TAB
4966
4967### �� Fixed: Syntax Error in Theme Cards
4968- **Fixed:** ParseError on line 4461 (Purple theme card)
4969- **Fixed:** Malformed ternary expressions from sed replacement
4970- **Fixed:** All 4 theme cards (Purple, Professional, Pink, Wiki)
4971- **Result:** Admin pages work correctly!
4972
4973### What Was Wrong
4974
4975The bulk sed replacement in v5.0.8 incorrectly modified ternary expressions:
4976
4977**Before (broken)**:
4978```php
4979? '#9b59b6' : ' . $colors['border'] . ')
4980// Extra quote and dot created syntax error
4981```
4982
4983**After (fixed)**:
4984```php
4985? '#9b59b6' : $colors['border'])
4986// Clean ternary expression
4987```
4988
4989### All Theme Cards Fixed
4990
4991- ✅ Purple Dream card
4992- ✅ Professional Blue card
4993- ✅ Pink Bling card
4994- ✅ Wiki Default card
4995
4996### Now Working
4997
4998**Theme selection page loads** ✓
4999**All cards display properly** ✓
5000**Template colors applied** ✓
5001**No syntax errors** ✓
5002
5003## Version 5.0.8 (2026-02-08) - FIX THEMES TAB & BACKGROUND MAPPING
5004
5005### �� Fixed: Themes Tab Backgrounds & Correct Template Color Mapping
5006- **Fixed:** Themes tab now uses template colors (removed all hardcoded whites)
5007- **Fixed:** Main background now uses `__background__` instead of `__background_site__`
5008- **Fixed:** Theme selection cards use template backgrounds
5009- **Fixed:** Week start options use template backgrounds
5010- **Result:** Perfect color mapping throughout admin!
5011
5012### Color Mapping Correction
5013
5014**Before (v5.0.7)**:
5015```php
5016bg: __background_site__  // Wrong - this is outer page bg
5017bg_alt: __background_alt__
5018```
5019
5020**After (v5.0.8)**:
5021```php
5022bg: __background__       // Correct - main content bg
5023bg_alt: __background_alt__
5024```
5025
5026### Why This Matters
5027
5028**Template color hierarchy**:
5029```
5030__background_site__ → Outer page/site background
5031__background__      → Main content area (CORRECT for admin)
5032__background_alt__  → Sections/panels
5033__background_neu__  → Highlights
5034```
5035
5036**Admin should use**:
5037- `__background__` for input fields, content areas
5038- `__background_alt__` for section boxes, panels
5039
5040### Themes Tab Fixed
5041
5042**Removed all hardcoded colors**:
5043```php
5044Before: '#ddd', '#fff', '#dee2e6'
5045After:  $colors['border'], $colors['bg'], $colors['border']
5046```
5047
5048**Now themed**:
5049- ✅ Week start section background
5050- ✅ Week start option backgrounds
5051- ✅ Theme card backgrounds
5052- ✅ Theme card borders
5053- ✅ All borders throughout
5054
5055### Visual Result
5056
5057**Light Template**:
5058```ini
5059__background__ = "#ffffff"
5060__background_alt__ = "#e8e8e8"
5061```
5062
5063**Admin Before (v5.0.7)**:
5064```
5065Input fields: #f5f5f5 (site bg - wrong)
5066Sections: #e8e8e8 (alt bg - correct)
5067```
5068
5069**Admin After (v5.0.8)**:
5070```
5071Input fields: #ffffff (content bg - correct!)
5072Sections: #e8e8e8 (alt bg - correct!)
5073```
5074
5075**Dark Template**:
5076```ini
5077__background__ = "#2d2d2d"
5078__background_alt__ = "#3a3a3a"
5079```
5080
5081**Admin After (v5.0.8)**:
5082```
5083Input fields: #2d2d2d (content bg - perfect!)
5084Sections: #3a3a3a (alt bg - perfect!)
5085```
5086
5087### Complete Themes Tab
5088
5089**Week Start Options**:
5090```
5091┌─────────────────────────┐
5092│ �� Week Start Day       │ ← bg_alt
5093│ ┌─────────┬───────────┐ │
5094│ │ Monday  │ Sunday    │ │ ← bg (when not selected)
5095│ └─────────┴───────────┘ │
5096└─────────────────────────┘
5097```
5098
5099**Theme Cards**:
5100```
5101┌─────────────────────────┐
5102│ �� Matrix Edition       │ ← bg (when not selected)
5103│ Classic green theme     │   border (when not selected)
5104└─────────────────────────┘
5105
5106┌═════════════════════════┐
5107│ �� Purple Dream         │ ← rgba green tint (when selected)
5108│ Elegant purple theme    │   #00cc07 border (when selected)
5109└═════════════════════════┘
5110```
5111
5112### Perfect Integration
5113
5114**All admin pages now**:
5115- Content areas: `__background__` ✓
5116- Section boxes: `__background_alt__` ✓
5117- Borders: `__border__` ✓
5118- Text: `__text__` ✓
5119
5120**Matches wiki perfectly**:
5121- Same white content areas
5122- Same gray section boxes
5123- Same border colors
5124- Same text colors
5125
5126### No More Issues
5127
5128**Fixed**:
5129- ❌ Site background on content areas → ✅ Content background
5130- ❌ Hardcoded white on themes tab → ✅ Template background
5131- ❌ Hardcoded borders (#ddd) → ✅ Template borders
5132
5133**Result**:
5134- Perfect color hierarchy ✓
5135- Correct background levels ✓
5136- Complete template integration ✓
5137
5138## Version 5.0.7 (2026-02-08) - COMPLETE ADMIN THEMING
5139
5140### �� Fixed: All Admin Backgrounds Use Template Colors
5141- **Fixed:** All section backgrounds use `__background_alt__`
5142- **Fixed:** All content backgrounds use `__background__`
5143- **Fixed:** All borders use `__border__`
5144- **Fixed:** All text uses `__text__`
5145- **Result:** Complete admin template integration!
5146
5147### All Replacements
5148
5149**Backgrounds**:
5150```php
5151Before: background: #f9f9f9
5152After:  background: ' . $colors['bg_alt'] . '
5153
5154Before: background: #fff / background: white
5155After:  background: ' . $colors['bg'] . '
5156```
5157
5158**Borders**:
5159```php
5160Before: border: 1px solid #ddd
5161Before: border: 1px solid #e0e0e0
5162Before: border: 1px solid #eee
5163After:  border: 1px solid ' . $colors['border'] . '
5164```
5165
5166**Text**:
5167```php
5168Before: color: #333
5169Before: color: #666
5170After:  color: ' . $colors['text'] . '
5171```
5172
5173### Complete Admin Coverage
5174
5175**All tabs now themed**:
5176- ✅ Manage Events tab
5177- ✅ Update Plugin tab
5178- ✅ Outlook Sync tab
5179- ✅ Themes tab
5180- ✅ Tab navigation
5181- ✅ All sections
5182- ✅ All inputs
5183- ✅ All borders
5184- ✅ All text
5185
5186### Visual Result
5187
5188**Light Template**:
5189```
5190Admin Page:
5191┌──────────────────────────┐
5192│ Tab Navigation           │ ← Template borders
5193├──────────────────────────┤
5194│ Section Headers          │ ← bg_alt (light gray)
5195│ ┌──────────────────────┐ │
5196│ │ Form Inputs          │ │ ← bg (white)
5197│ │ Content Areas        │ │
5198│ └──────────────────────┘ │
5199└──────────────────────────┘
5200All template colors! ✓
5201```
5202
5203**Dark Template**:
5204```
5205Admin Page:
5206┌──────────────────────────┐
5207│ Tab Navigation           │ ← Template borders
5208├──────────────────────────┤
5209│ Section Headers          │ ← bg_alt (dark gray)
5210│ ┌──────────────────────┐ │
5211│ │ Form Inputs          │ │ ← bg (darker)
5212│ │ Content Areas        │ │
5213│ └──────────────────────┘ │
5214└──────────────────────────┘
5215All template colors! ✓
5216```
5217
5218### Template Color Mapping
5219
5220**Used throughout admin**:
5221```
5222__background_site__ → $colors['bg']       (main backgrounds)
5223__background_alt__  → $colors['bg_alt']   (section backgrounds)
5224__text__            → $colors['text']     (all text)
5225__border__          → $colors['border']   (all borders)
5226__link__            → $colors['link']     (links - future)
5227```
5228
5229### Examples by Section
5230
5231**Manage Events**:
5232- Event list backgrounds: `bg_alt`
5233- Event item backgrounds: `bg`
5234- Borders: `border`
5235- Text: `text`
5236
5237**Update Plugin**:
5238- Section backgrounds: `bg_alt`
5239- Content areas: `bg`
5240- Borders: `border`
5241- Text: `text`
5242
5243**Outlook Sync**:
5244- Config sections: `bg_alt`
5245- Input fields: `bg`
5246- Borders: `border`
5247- Labels: `text`
5248
5249**Themes Tab**:
5250- Theme cards: `bg_alt`
5251- Preview areas: `bg`
5252- Borders: `border`
5253- Descriptions: `text`
5254
5255### Benefits
5256
5257**Seamless Integration**:
5258- Matches wiki admin area perfectly
5259- Same colors throughout wiki
5260- Professional appearance
5261- Consistent experience
5262
5263**Automatic Adaptation**:
5264- Light templates: Light admin
5265- Dark templates: Dark admin
5266- Custom templates: Uses custom colors
5267
5268**No White Boxes**:
5269- Every background themed
5270- Every border themed
5271- Every text themed
5272- Complete consistency
5273
5274### PERFECT HARMONY
5275
5276**Frontend (Calendar)**:
5277- Wiki theme uses style.ini5278- Perfect template match ✓
5279
5280**Backend (Admin)**:
5281- Reads same style.ini5282- Perfect template match ✓
5283
5284**Complete Unity**:
5285- Same colors everywhere ✓
5286- Seamless experience ✓
5287- Professional polish ✓
5288
5289## Version 5.0.6 (2026-02-08) - ADMIN PAGES USE TEMPLATE COLORS
5290
5291### �� Enhanced: Month/Year Header & Admin Pages Use Template Colors
5292- **Fixed:** Month/Year header now uses `__text_neu__` for wiki theme
5293- **Added:** Admin pages read template's style.ini file
5294- **Added:** `getTemplateColors()` function in admin class
5295- **Fixed:** Tab navigation uses template text and border colors
5296- **Result:** Complete template integration everywhere!
5297
5298### Month/Year Header
5299
5300**Before**:
5301```php
5302color: __text__  // Same as primary text
5303```
5304
5305**After (Wiki Theme)**:
5306```php
5307color: __text_neu__  // Dimmed text (subtle)
5308```
5309
5310### Admin Pages Enhancement
5311
5312**New `getTemplateColors()` function**:
5313- Reads template's style.ini file
5314- Extracts color replacements
5315- Provides colors to all admin tabs
5316- Falls back to sensible defaults
5317
5318**Colors used**:
5319```php
5320bg: __background_site__
5321bg_alt: __background_alt__
5322text: __text__
5323border: __border__
5324link: __link__
5325```
5326
5327**Applied to**:
5328- Tab navigation borders
5329- Tab text colors
5330- All admin sections
5331- Ready for future enhancements
5332
5333### Visual Result
5334
5335**Calendar Header**:
5336```
5337┌────────────────────┐
5338│ ‹ February 2026 › │ ← __text_neu__ (dimmed)
5339└────────────────────┘
5340Subtle and elegant ✓
5341```
5342
5343**Admin Navigation**:
5344```
5345�� Manage Events | �� Update | ⚙️ Config | �� Themes
5346─────────────────────────────────────────────────
5347Active tab: Green (#00cc07)
5348Inactive tabs: Template text color
5349Border: Template border color
5350```
5351
5352### Template Integration
5353
5354**Light Template**:
5355```ini
5356__text_neu__ = "#666666"
5357__border__ = "#cccccc"
5358```
5359**Result**:
5360- Month/Year: Medium gray (subtle)
5361- Admin borders: Light gray
5362- Tab text: Dark gray
5363
5364**Dark Template**:
5365```ini
5366__text_neu__ = "#999999"
5367__border__ = "#555555"
5368```
5369**Result**:
5370- Month/Year: Light gray (subtle)
5371- Admin borders: Medium gray
5372- Tab text: Bright gray
5373
5374### Benefits
5375
5376**Calendar Frontend**:
5377- Month/Year header more subtle
5378- Better visual hierarchy
5379- Less prominent, more elegant
5380
5381**Admin Backend**:
5382- Uses template colors
5383- Matches wiki admin area
5384- Consistent experience
5385- Professional appearance
5386
5387### Future-Ready
5388
5389The `getTemplateColors()` function is now available for:
5390- ✅ Tab navigation (implemented)
5391- �� Section backgrounds (ready)
5392- �� Button colors (ready)
5393- �� Input fields (ready)
5394- �� Success/error messages (ready)
5395
5396**Foundation laid for complete admin theming!** ��
5397
5398## Version 5.0.5 (2026-02-08) - WIKI THEME ADD BUTTON & SECTION HEADERS
5399
5400### �� Fixed: Add Event Bar & Section Headers Use Template Colors
5401- **Fixed:** Add Event bar now uses `__background_alt__` for wiki theme
5402- **Fixed:** "Today" header uses `__text_neu__`
5403- **Fixed:** "Tomorrow" header uses `__text__`
5404- **Fixed:** "Important Events" header uses `__border__`
5405- **Result:** Perfect template color integration!
5406
5407### All Changes
5408
5409**Add Event Bar (Wiki Theme)**:
5410
5411**Before**:
5412```php
5413background: #3498db  // Generic blue
5414```
5415
5416**After**:
5417```php
5418background: __background_alt__  // Template alternate bg
5419text: __text__                  // Template text color
5420hover: __background_neu__       // Template neutral bg
5421```
5422
5423**Section Headers (Wiki Theme)**:
5424
5425**Before**:
5426```php
5427Today: #ff9800           // Orange
5428Tomorrow: #4caf50        // Green
5429Important Events: #9b59b6 // Purple
5430```
5431
5432**After**:
5433```php
5434Today: __text_neu__      // Template dimmed text
5435Tomorrow: __text__       // Template primary text
5436Important Events: __border__ // Template border color
5437```
5438
5439### Visual Result
5440
5441**Wiki Default Theme**:
5442```
5443Add Event Bar:
5444┌────────────────┐
5445│  + ADD EVENT   │ ← Template alt background
5446└────────────────┘
5447
5448Sections:
5449━━━━━━━━━━━━━━━━
5450Today              ← Dimmed text color (__text_neu__)
5451• Team Meeting
5452
5453Tomorrow           ← Primary text color (__text__)
5454• Code Review
5455
5456Important Events   ← Border color (__border__)
5457• Project Deadline
5458```
5459
5460### Example with DokuWiki Default Template
5461
5462**Template colors**:
5463```ini
5464__background_alt__ = "#e8e8e8"
5465__text__ = "#333333"
5466__text_neu__ = "#666666"
5467__border__ = "#cccccc"
5468```
5469
5470**Calendar result**:
5471```
5472Add Event Bar: Light gray (#e8e8e8)
5473Today header: Medium gray (#666666)
5474Tomorrow header: Dark gray (#333333)
5475Important Events header: Border gray (#cccccc)
5476```
5477
5478### Example with Dark Template
5479
5480**Template colors**:
5481```ini
5482__background_alt__ = "#2d2d2d"
5483__text__ = "#e0e0e0"
5484__text_neu__ = "#999999"
5485__border__ = "#555555"
5486```
5487
5488**Calendar result**:
5489```
5490Add Event Bar: Dark gray (#2d2d2d)
5491Today header: Light gray (#999999)
5492Tomorrow header: Bright gray (#e0e0e0)
5493Important Events header: Medium gray (#555555)
5494```
5495
5496### Perfect Harmony
5497
5498All sidebar elements now use template colors:
5499- ✅ Add Event bar background
5500- ✅ Add Event bar text
5501- ✅ Today section header
5502- ✅ Tomorrow section header
5503- ✅ Important Events header
5504- ✅ Calendar cells
5505- ✅ Grid backgrounds
5506- ✅ All borders
5507
5508**Complete template integration!** ��
5509
5510## Version 5.0.4 (2026-02-08) - USE __background__ FOR CALENDAR CELLS
5511
5512### �� Fixed: Calendar Cells Use Correct Template Color
5513- **Fixed:** Calendar cells now use `__background__` from template
5514- **Changed:** `cell_bg` now uses `__background__` instead of `__background_neu__`
5515- **Result:** Calendar cells match main content area background!
5516
5517### Color Mapping Update
5518
5519**Before (v5.0.3)**:
5520```php
5521cell_bg: __background_neu__  // Wrong - this is for neutral/alternate
5522```
5523
5524**After (v5.0.4)**:
5525```php
5526cell_bg: __background__      // Correct - main content background
5527```
5528
5529### Template Color Usage
5530
5531**Wiki Default theme now uses**:
5532```
5533__background_site__ → Overall page background
5534__background__      → Calendar cells (main content bg)
5535__background_alt__  → Grid background, headers
5536__background_neu__  → Today cell highlight
5537__text__            → Primary text
5538__text_neu__        → Dimmed text
5539__link__            → Links, bright text
5540__border__          → All borders
5541```
5542
5543### Visual Result
5544
5545**Before**:
5546```
5547Calendar with template colors:
5548┌─────┬─────┬─────┐
5549│ Mon │ Tue │ Wed │
5550├─────┼─────┼─────┤
5551│  8  │  9  │ 10  │ ← Neutral gray (wrong)
5552└─────┴─────┴─────┘
5553```
5554
5555**After**:
5556```
5557Calendar with template colors:
5558┌─────┬─────┬─────┐
5559│ Mon │ Tue │ Wed │
5560├─────┼─────┼─────┤
5561│  8  │  9  │ 10  │ ← White/content bg (correct!)
5562└─────┴─────┴─────┘
5563```
5564
5565### Example Template Colors
5566
5567**DokuWiki Default**:
5568```ini
5569__background__ = "#ffffff"
5570```
5571**Result**: White calendar cells ✓
5572
5573**Dark Template**:
5574```ini
5575__background__ = "#2d2d2d"
5576```
5577**Result**: Dark calendar cells ✓
5578
5579**Custom Template**:
5580```ini
5581__background__ = "#f9f9f9"
5582```
5583**Result**: Custom color cells ✓
5584
5585### Perfect Matching
5586
5587Calendar cells now match:
5588- ✅ Main content area background
5589- ✅ Article/page background
5590- ✅ Content box background
5591- ✅ Same as wiki text background
5592
5593**Seamless integration!** ��
5594
5595## Version 5.0.3 (2026-02-08) - READ COLORS FROM TEMPLATE STYLE.INI
5596
5597### �� Enhanced: Wiki Default Theme Reads Template Colors
5598- **Added:** Function to read colors from DokuWiki template's style.ini file
5599- **Reads:** `/var/www/html/dokuwiki/conf/tpl/{template}/style.ini`
5600- **Falls back:** Also checks `/var/www/html/dokuwiki/lib/tpl/{template}/style.ini`
5601- **Uses:** Actual template colors instead of CSS variables
5602- **Result:** Perfect color matching with any DokuWiki template!
5603
5604### How It Works
5605
5606**New Function: `getWikiTemplateColors()`**
5607
56081. **Detects** current DokuWiki template name
56092. **Reads** the template's `style.ini` file
56103. **Parses** color replacements section
56114. **Maps** template colors to calendar theme
56125. **Falls back** to CSS variables if file not found
5613
5614### Colors Read from style.ini
5615
5616**Template color replacements used**:
5617```php
5618__background_site__  → bg, header_bg
5619__background_alt__   → grid_bg, cell_today_bg
5620__background_neu__   → cell_bg
5621__text__             → text_primary
5622__text_neu__         → text_dim
5623__link__             → text_bright
5624__border__           → border, grid_border
5625```
5626
5627### Example style.ini Mapping
5628
5629**Template style.ini**:
5630```ini
5631[replacements]
5632__background_site__ = "#f8f9fa"
5633__background_alt__  = "#e9ecef"
5634__background_neu__  = "#dee2e6"
5635__text__            = "#212529"
5636__text_neu__        = "#6c757d"
5637__link__            = "#0d6efd"
5638__border__          = "#ced4da"
5639```
5640
5641**Calendar theme result**:
5642```php
5643bg: #f8f9fa
5644header_bg: #e9ecef
5645grid_bg: #e9ecef
5646cell_bg: #dee2e6
5647text_primary: #212529
5648text_dim: #6c757d
5649text_bright: #0d6efd
5650border: #ced4da
5651grid_border: #ced4da
5652```
5653
5654### Before vs After
5655
5656**Before (v5.0.2)**:
5657```
5658Wiki Default theme used:
5659- CSS variables (var(--__background__, #fff))
5660- Required browser CSS variable support
5661- Fallback to generic colors
5662```
5663
5664**After (v5.0.3)**:
5665```
5666Wiki Default theme uses:
5667- Actual colors from template's style.ini
5668- Exact template color values
5669- No CSS variable dependency
5670- Perfect color matching!
5671```
5672
5673### File Location Priority
5674
5675Checks in order:
56761. `/var/www/html/dokuwiki/conf/tpl/{template}/style.ini`
56772. `/var/www/html/dokuwiki/lib/tpl/{template}/style.ini`
56783. Falls back to CSS variables if neither found
5679
5680### Benefits
5681
5682**More accurate colors**:
5683- Uses exact template color values ✓
5684- No CSS variable interpolation ✓
5685- Consistent across all browsers ✓
5686
5687**Better compatibility**:
5688- Works with older browsers ✓
5689- No CSS variable support needed ✓
5690- Direct color values ✓
5691
5692**Perfect matching**:
5693- Reads template's actual colors ✓
5694- Same colors as wiki pages ✓
5695- Seamless integration ✓
5696
5697### Template Examples
5698
5699**DokuWiki Default Template**:
5700```
5701Reads: lib/tpl/dokuwiki/style.ini
5702Gets: Default DokuWiki colors
5703Result: Perfect classic DokuWiki look
5704```
5705
5706**Bootstrap Template**:
5707```
5708Reads: lib/tpl/bootstrap3/style.ini
5709Gets: Bootstrap color scheme
5710Result: Perfect Bootstrap integration
5711```
5712
5713**Custom Template**:
5714```
5715Reads: conf/tpl/mycustom/style.ini
5716Gets: Your custom colors
5717Result: Perfect custom theme match
5718```
5719
5720### Fallback Chain
5721
57221. **Try** reading style.ini from template
57232. **If found** → Use exact colors from file
57243. **If not found** → Use CSS variables
57254. **If no CSS vars** → Use fallback colors
5726
5727**Always works, always matches!** ✓
5728
5729## Version 5.0.2 (2026-02-08) - FIX WIKI DEFAULT THEME DAY PANEL
5730
5731### �� Fixed: Wiki Default Theme Day Panel Colors
5732- **Fixed:** Day popup panel now uses DokuWiki CSS variables
5733- **Fixed:** Panel background matches wiki theme
5734- **Fixed:** Panel header matches wiki theme
5735- **Fixed:** Border colors use wiki theme
5736- **Fixed:** Text colors use wiki theme
5737- **Result:** Perfect integration with DokuWiki templates!
5738
5739### All Changes
5740
5741**Day Panel Colors (Wiki Default)**:
5742
5743**Before**:
5744```php
5745background: rgba(36, 36, 36, 0.5)  // Dark gray (wrong!)
5746header: #3498db                     // Blue (wrong!)
5747```
5748
5749**After**:
5750```php
5751background: var(--__background__, #fff)
5752header: var(--__background_alt__, #e8e8e8)
5753header_text: var(--__text__, #333)
5754border: var(--__border__, #ccc)
5755shadow: 0 2px 4px rgba(0, 0, 0, 0.1)
5756```
5757
5758**Event Colors (Wiki Default)**:
5759```php
5760event_bg: var(--__background_alt__, rgba(245, 245, 245, 0.5))
5761border_color: var(--__border__, rgba(204, 204, 204, 0.3))
5762bar_shadow: 0 1px 2px rgba(0, 0, 0, 0.15)
5763```
5764
5765### Before vs After
5766
5767**Before (v5.0.1)**:
5768```
5769Wiki Default - Click Week Cell:
5770┌────────────────┐
5771│ Monday, Feb 8  │ ← Blue header (wrong)
5772├────────────────┤
5773│ Team Meeting   │ ← Dark gray bg (wrong)
5774│ 2:00 PM        │
5775└────────────────┘
5776Doesn't match wiki theme
5777```
5778
5779**After (v5.0.2)**:
5780```
5781Wiki Default - Click Week Cell:
5782
5783Light Wiki Theme:
5784┌────────────────┐
5785│ Monday, Feb 8  │ ← Light gray header ✓
5786├────────────────┤
5787│ Team Meeting   │ ← White bg ✓
5788│ 2:00 PM        │   Dark text ✓
5789└────────────────┘
5790
5791Dark Wiki Theme:
5792┌────────────────┐
5793│ Monday, Feb 8  │ ← Dark header ✓
5794├────────────────┤
5795│ Team Meeting   │ ← Dark bg ✓
5796│ 2:00 PM        │   Light text ✓
5797└────────────────┘
5798
5799Perfectly matches wiki!
5800```
5801
5802### CSS Variables Used
5803
5804**Wiki Default theme now uses**:
5805- `--__background__` - Main background (panel body)
5806- `--__background_alt__` - Alternate bg (panel header, events)
5807- `--__text__` - Text color (header text)
5808- `--__border__` - Border color (panel border, event borders)
5809
5810**With fallbacks**:
5811```css
5812var(--__background__, #fff)           /* white fallback */
5813var(--__background_alt__, #e8e8e8)    /* light gray fallback */
5814var(--__text__, #333)                 /* dark text fallback */
5815var(--__border__, #ccc)               /* gray border fallback */
5816```
5817
5818### Perfect Adaptation
5819
5820**Light Templates**:
5821- Light panel backgrounds ✓
5822- Dark text ✓
5823- Subtle borders ✓
5824- Clean appearance ✓
5825
5826**Dark Templates**:
5827- Dark panel backgrounds ✓
5828- Light text ✓
5829- Visible borders ✓
5830- Perfect contrast ✓
5831
5832**Custom Templates**:
5833- Uses template's CSS variables ✓
5834- Automatic adaptation ✓
5835- Seamless integration ✓
5836
5837### Now Truly Adaptive
5838
5839Wiki Default theme now properly uses DokuWiki CSS variables for:
5840- ✅ Calendar grid
5841- ✅ Sidebar widget
5842- ✅ Event list
5843- ✅ **Day panel** ← v5.0.2!
5844- ✅ All backgrounds
5845- ✅ All text
5846- ✅ All borders
5847
5848**Complete wiki integration!** ��
5849
5850## Version 5.0.1 (2026-02-08) - THEME CONFLICT TOOLTIPS
5851
5852### �� Enhanced: Time Conflict Tooltips Now Themed
5853- **Fixed:** Conflict tooltips now match calendar theme
5854- **Added:** Theme-aware background, border, text colors
5855- **Added:** Theme-aware shadow effects
5856- **Result:** Complete visual consistency!
5857
5858### Tooltip Theming
5859
5860**Now uses theme colors for**:
5861- Background: Theme background color
5862- Border: Theme border color
5863- Header text: Theme primary text color
5864- Item text: Theme dim text color
5865- Shadow: Theme shadow color
5866
5867### Before vs After
5868
5869**Before (v5.0.0)**:
5870```
5871Hover ⚠️ badge:
5872┌─────────────────┐
5873│ ⚠️ Time Conflicts│ ← Default colors
5874│ • Event A       │
5875│ • Event B       │
5876└─────────────────┘
5877```
5878
5879**After (v5.0.1)**:
5880```
5881Matrix Theme:
5882┌─────────────────┐
5883│ ⚠️ Time Conflicts│ ← Green header
5884│ • Event A       │ ← Green text
5885│ • Event B       │   Dark green bg
5886└─────────────────┘
5887
5888Purple Theme:
5889┌─────────────────┐
5890│ ⚠️ Time Conflicts│ ← Purple header
5891│ • Event A       │ ← Purple text
5892│ • Event B       │   Dark purple bg
5893└─────────────────┘
5894
5895Professional Theme:
5896┌─────────────────┐
5897│ ⚠️ Time Conflicts│ ← Blue header
5898│ • Event A       │ ← Dark text
5899│ • Event B       │   Light bg
5900└─────────────────┘
5901
5902Pink Theme:
5903┌─────────────────┐
5904│ ⚠️ Time Conflicts│ ← Pink header ✨
5905│ • Event A       │ ← Pink text
5906│ • Event B       │   Dark pink bg ��
5907└─────────────────┘
5908
5909Wiki Default:
5910┌─────────────────┐
5911│ ⚠️ Time Conflicts│ ← Adapts to wiki
5912│ • Event A       │ ← Wiki colors
5913│ • Event B       │
5914└─────────────────┘
5915```
5916
5917### Now 100% Complete
5918
5919**Every tooltip themed**:
5920- ✅ Conflict tooltips
5921- ✅ All other tooltips (if any)
5922- ✅ Perfect consistency
5923
5924**Absolute perfection!** ✨
5925
5926## Version 5.0.0 (2026-02-08) - MAJOR RELEASE: COMPLETE THEMING PERFECTION
5927
5928### �� Major Milestone: Version 5.0
5929
5930This is a major release representing the completion of comprehensive theming across the entire calendar plugin. Every visual element has been carefully themed for consistency and beauty.
5931
5932### Complete Feature Set
5933
5934**5 Beautiful Themes**:
5935- �� Matrix Edition (Green with glow)
5936- �� Purple Dream (Elegant purple)
5937- �� Professional Blue (Clean and modern)
5938- �� Pink Bling (Maximum sparkle)
5939- �� Wiki Default (Auto-adapts to your DokuWiki theme)
5940
5941**100% Theme Coverage**:
5942- ✅ Calendar grid and cells
5943- ✅ Event boxes and borders
5944- ✅ Sidebar widget
5945- ✅ Event list panel
5946- ✅ Search functionality
5947- ✅ Edit/Add dialogs (complete)
5948- ✅ Day popup dialogs
5949- ✅ Month picker
5950- ✅ All text (primary, dim, bright)
5951- ✅ All buttons
5952- ✅ All inputs and forms
5953- ✅ All checkboxes
5954- ✅ All borders
5955- ✅ All badges and labels
5956- ✅ Event highlight effects
5957
5958**Perfect Visual Consistency**:
5959- No white pixels anywhere
5960- No unthemed elements
5961- No default colors
5962- Complete visual unity
5963
5964### Major Improvements in v5.0
5965
59661. **Complete Dialog Theming** (v4.8.5-4.8.7)
5967   - Edit event dialog fully themed
5968   - Day popup dialog fully themed
5969   - All form inputs themed
5970   - All checkboxes themed
5971   - All buttons themed
5972
59732. **Event Box Border Perfection** (v4.8.6)
5974   - All 4 borders themed (top, right, bottom, left)
5975   - Sidebar event dividers themed
5976   - Past Events toggle border themed
5977
59783. **Checkbox Field Borders** (v4.9.0)
5979   - Repeating Event section border themed
5980   - Task checkbox section border themed
5981
59824. **Wiki Default Theme** (v4.10.0)
5983   - New 5th theme
5984   - Uses DokuWiki CSS variables
5985   - Auto-adapts to any wiki template
5986   - Perfect for seamless integration
5987
59885. **Clean Text Appearance** (v4.11.0)
5989   - Removed text glow from Matrix
5990   - Removed text glow from Purple
5991   - Removed text glow from Professional
5992   - Removed text glow from Wiki Default
5993   - Kept text glow on Pink Bling only
5994
59956. **Event Highlight Effects** (v4.12.0-4.12.1)
5996   - Theme-aware highlight glow
5997   - Click event bar → event glows
5998   - 3-second themed glow effect
5999   - Smooth animations
6000
6001### See RELEASE_NOTES.md for Complete Details
6002
6003For a comprehensive overview of all features, themes, and improvements, see the new **RELEASE_NOTES.md** file included in this release.
6004
6005## Version 4.12.1 (2026-02-08) - FIX EVENT HIGHLIGHT FUNCTION
6006
6007### �� Fixed: Event Highlight Now Working
6008- **Fixed:** Used setProperty() to properly apply !important styles
6009- **Added:** Console logging for debugging
6010- **Fixed:** Proper style application with important flag
6011- **Result:** Highlight glow now works correctly!
6012
6013### Technical Fix
6014
6015**Before (not working)**:
6016```javascript
6017eventItem.style.background = color + ' !important'; // Doesn't work
6018```
6019
6020**After (working)**:
6021```javascript
6022eventItem.style.setProperty('background', color, 'important'); // Works!
6023```
6024
6025### Added Debug Logging
6026
6027Console now shows:
6028- "Highlighting event: [calId] [eventId] [date]"
6029- "Found event item: [element]"
6030- "Theme: [theme name]"
6031- "Highlight colors: [bg] [shadow]"
6032- "Applied highlight styles"
6033- "Removing highlight" (after 3 seconds)
6034
6035### Now Working
6036
6037Click any event bar → Event glows with theme colors ✓
6038
6039## Version 4.12.0 (2026-02-08) - THEME-AWARE EVENT HIGHLIGHT GLOW
6040
6041### ✨ Enhanced: Event Click Highlight Now Theme-Aware
6042- **Fixed:** Restored event highlight glow when clicking calendar bars
6043- **Improved:** Highlight now matches each theme's colors
6044- **Added:** Stronger glow effect for better visibility
6045- **Duration:** 3 seconds with smooth fade
6046- **Result:** Beautiful themed highlights for all themes!
6047
6048### How It Works
6049
6050When you click an event bar in the calendar, the corresponding event in the event list now highlights with a themed glow:
6051
6052**Matrix Theme**:
6053```javascript
6054Background: Darker green (#1a3d1a)
6055Glow: Double green glow (0 0 20px + 0 0 40px)
6056Color: rgba(0, 204, 7, 0.8)
6057```
6058
6059**Purple Theme**:
6060```javascript
6061Background: Darker purple (#3d2b4d)
6062Glow: Double purple glow
6063Color: rgba(155, 89, 182, 0.8)
6064```
6065
6066**Professional Theme**:
6067```javascript
6068Background: Light blue (#e3f2fd)
6069Glow: Single blue glow
6070Color: rgba(74, 144, 226, 0.4)
6071```
6072
6073**Pink Theme**:
6074```javascript
6075Background: Darker pink (#3d2030)
6076Glow: Double pink glow ✨��
6077Color: rgba(255, 20, 147, 0.8)
6078```
6079
6080**Wiki Theme**:
6081```javascript
6082Background: var(--__background_neu__)
6083Glow: Blue glow (adapts to wiki)
6084Color: rgba(43, 115, 183, 0.4)
6085```
6086
6087### Visual Examples
6088
6089**Matrix - Click Event**:
6090```
6091Calendar:
6092┌─────────────┐
6093│ 2:00 PM │ ← Click this bar
6094└─────────────┘
6095
6096Event List:
6097╔═════════════════════╗
6098║ Team Meeting        ║ ← GLOWS GREEN
6099║ 2:00 PM             ║    for 3 seconds
6100╚═════════════════════╝
6101   ↑↑↑ Strong green glow ↑↑↑
6102```
6103
6104**Purple - Click Event**:
6105```
6106Calendar:
6107┌─────────────┐
6108│ 4:00 PM │ ← Click
6109└─────────────┘
6110
6111Event List:
6112╔═════════════════════╗
6113║ Code Review         ║ ← GLOWS PURPLE
6114║ 4:00 PM             ║    for 3 seconds
6115╚═════════════════════╝
6116   ↑↑↑ Strong purple glow ↑↑↑
6117```
6118
6119**Pink - Click Event**:
6120```
6121Calendar:
6122┌─────────────┐
6123│ 1:00 PM │ ← Click
6124└─────────────┘
6125
6126Event List:
6127╔═════════════════════╗
6128║ Lunch Date ��       ║ ← GLOWS PINK
6129║ 1:00 PM ✨          ║    for 3 seconds
6130╚═════════════════════╝
6131   ↑↑↑ MAXIMUM SPARKLE ↑↑↑
6132```
6133
6134### Glow Specifications
6135
6136**Matrix**:
6137- Background: Dark green
6138- Shadow: `0 0 20px rgba(0, 204, 7, 0.8)`
6139- Outer glow: `0 0 40px rgba(0, 204, 7, 0.4)`
6140- Effect: Strong green pulse
6141
6142**Purple**:
6143- Background: Dark purple
6144- Shadow: `0 0 20px rgba(155, 89, 182, 0.8)`
6145- Outer glow: `0 0 40px rgba(155, 89, 182, 0.4)`
6146- Effect: Strong purple pulse
6147
6148**Professional**:
6149- Background: Light blue
6150- Shadow: `0 0 20px rgba(74, 144, 226, 0.4)`
6151- Effect: Subtle blue glow
6152
6153**Pink**:
6154- Background: Dark pink
6155- Shadow: `0 0 20px rgba(255, 20, 147, 0.8)`
6156- Outer glow: `0 0 40px rgba(255, 20, 147, 0.4)`
6157- Effect: MAXIMUM SPARKLE ✨��
6158
6159**Wiki**:
6160- Background: Theme neutral color
6161- Shadow: `0 0 20px rgba(43, 115, 183, 0.4)`
6162- Effect: Adapts to wiki theme
6163
6164### User Experience
6165
6166**Click event bar** → Event highlights with themed glow
6167**Auto-scroll** → Event scrolls into view smoothly
6168**3 second glow** → Fade out after 3 seconds
6169**Smooth transition** → 0.3s ease-in-out
6170
6171### Perfect for Finding Events
6172
6173**Large event lists**: Quickly locate the clicked event ✓
6174**Visual feedback**: Know which event you clicked ✓
6175**Theme consistency**: Matches your chosen theme ✓
6176**Smooth animation**: Professional appearance ✓
6177
6178### All Themes Covered
6179
6180- ✅ Matrix: Green glow
6181- ✅ Purple: Purple glow
6182- ✅ Professional: Blue glow
6183- ✅ Pink: Maximum pink sparkle
6184- ✅ Wiki: Adaptive glow
6185
6186**Click any event bar and watch it glow!** ✨
6187
6188## Version 4.11.0 (2026-02-08) - REMOVE TEXT GLOW FROM NON-PINK THEMES
6189
6190### �� Changed: Text Glow Now Pink-Only
6191- **Removed:** Text shadow/glow from Matrix theme
6192- **Removed:** Text shadow/glow from Purple theme
6193- **Removed:** Text shadow/glow from Professional theme (already had none)
6194- **Removed:** Text shadow/glow from Wiki Default theme
6195- **Kept:** Text shadow/glow ONLY on Pink Bling theme
6196- **Result:** Cleaner look for Matrix, Purple, and Wiki themes!
6197
6198### All Changes
6199
6200**Before (Matrix, Purple)**:
6201```css
6202text-shadow: 0 0 2px $text_color; /* Glow effect */
6203```
6204
6205**After (Matrix, Purple, Professional, Wiki)**:
6206```css
6207text-shadow: none; /* Clean, no glow */
6208```
6209
6210**Pink Bling (unchanged)**:
6211```css
6212text-shadow: 0 0 2px $text_color; /* Still has glow ✨ */
6213```
6214
6215### Text Shadow Removed From
6216
6217**Sidebar day numbers**: No glow ✓
6218**Event titles**: No glow ✓
6219**Event dates**: No glow ✓
6220**Add Event button**: No glow ✓
6221**Day popup events**: No glow ✓
6222
6223### Before vs After
6224
6225**BEFORE (Matrix)**:
6226```
6227Event Title ✨ ← Glowing green text
62282:00 PM ✨     ← Glowing text
6229```
6230
6231**AFTER (Matrix)**:
6232```
6233Event Title    ← Clean green text
62342:00 PM        ← Clean text
6235```
6236
6237**Pink Bling (Still Glows)**:
6238```
6239Event Title ✨�� ← Still glowing!
62402:00 PM ✨     ← Maximum sparkle!
6241```
6242
6243### Theme Appearances
6244
6245**�� Matrix Edition**:
6246- Clean green text
6247- No glow effects
6248- Professional appearance
6249- Still has border glow
6250
6251**�� Purple Dream**:
6252- Clean purple text
6253- No glow effects
6254- Elegant appearance
6255- Still has border glow
6256
6257**�� Professional Blue**:
6258- Clean text (unchanged)
6259- No glow effects
6260- Modern appearance
6261
6262**�� Pink Bling**:
6263- Glowing pink text ✨
6264- Maximum glow effects ��
6265- Sparkle everywhere!
6266- All the bling!
6267
6268**�� Wiki Default**:
6269- Clean text
6270- No glow effects
6271- Matches wiki theme
6272
6273### Glow Effects Remaining
6274
6275**Border/box glow**: Still present on all themes ✓
6276**Pink text glow**: Only on Pink Bling ✓
6277**Shadow effects**: Still on buttons/boxes6278
6279**Only TEXT glow removed from non-pink themes!**
6280
6281### Result
6282
6283**Cleaner, more professional look** for:
6284- Matrix ✓
6285- Purple ✓
6286- Professional ✓
6287- Wiki Default ✓
6288
6289**Maximum sparkle** for:
6290- Pink Bling ✨��✓
6291
6292**Best of both worlds!** ��
6293
6294## Version 4.10.0 (2026-02-08) - NEW WIKI DEFAULT THEME
6295
6296### �� New: Wiki Default Theme
6297- **Added:** 5th theme that automatically matches your DokuWiki template
6298- **Uses:** CSS variables from your wiki theme
6299- **Adapts:** Automatically works with light and dark themes
6300- **Perfect:** Seamless integration with any DokuWiki template
6301
6302### How It Works
6303
6304**Wiki theme uses DokuWiki CSS variables**:
6305```css
6306bg: var(--__background_site__, #f5f5f5)
6307border: var(--__border__, #ccc)
6308text_primary: var(--__text__, #333)
6309text_bright: var(--__link__, #2b73b7)
6310text_dim: var(--__text_neu__, #666)
6311cell_bg: var(--__background__, #fff)
6312grid_border: var(--__border__, #ccc)
6313```
6314
6315**With fallbacks for older DokuWiki versions**:
6316- If CSS variables exist → Use them ✓
6317- If not available → Use fallback values ✓
6318
6319### All 5 Themes
6320
6321**1. �� Matrix Edition** (Default)
6322- Dark green with neon glow
6323- Matrix-style effects
6324- Original theme
6325
6326**2. �� Purple Dream**
6327- Rich purple with violet accents
6328- Elegant and sophisticated
6329- Soft glow effects
6330
6331**3. �� Professional Blue**
6332- Clean blue and grey
6333- Modern professional
6334- No glow effects
6335
6336**4. �� Pink Bling**
6337- Glamorous hot pink
6338- Maximum sparkle ✨
6339- Hearts and diamonds
6340
6341**5. �� Wiki Default** ← NEW!
6342- Matches your wiki template
6343- Auto-adapts to light/dark
6344- Perfect integration
6345
6346### Examples
6347
6348**Light Wiki Template**:
6349```
6350Wiki Default theme shows:
6351- Light backgrounds (#f5f5f5)
6352- Dark text (#333)
6353- Light inputs (#fff)
6354- Gray borders (#ccc)
6355
6356Matches perfectly! ✓
6357```
6358
6359**Dark Wiki Template**:
6360```
6361Wiki Default theme shows:
6362- Dark backgrounds (from template)
6363- Light text (from template)
6364- Dark inputs (from template)
6365- Dark borders (from template)
6366
6367Matches perfectly! ✓
6368```
6369
6370**Bootstrap Template**:
6371```
6372Uses Bootstrap's colors
6373Matches perfectly! ✓
6374```
6375
6376**Material Template**:
6377```
6378Uses Material's colors
6379Matches perfectly! ✓
6380```
6381
6382### CSS Variables Used
6383
6384**DokuWiki provides**:
6385- `--__background_site__`: Page background
6386- `--__background_alt__`: Section backgrounds
6387- `--__background__`: Content backgrounds
6388- `--__text__`: Primary text color
6389- `--__link__`: Link color
6390- `--__text_neu__`: Dimmed text
6391- `--__border__`: Border color
6392- `--__background_neu__`: Neutral background
6393
6394**All with fallbacks**:
6395```css
6396var(--__background_site__, #f5f5f5)
6397/* Falls back to light gray if variable doesn't exist */
6398```
6399
6400### Perfect for Every Template
6401
6402**Custom templates**: Automatically adapts ✓
6403**Light themes**: Perfect match ✓
6404**Dark themes**: Perfect match ✓
6405**Any DokuWiki version**: Works with fallbacks ✓
6406
6407### Complete Theme Collection
6408
6409Now with **5 gorgeous themes**:
6410- 3 dark themes (Matrix, Purple, Pink)
6411- 1 light theme (Professional)
6412- 1 adaptive theme (Wiki Default) ← NEW!
6413
6414**Something for everyone!** ��
6415
6416## Version 4.9.0 (2026-02-08) - FIX CHECKBOX FIELD BORDERS
6417
6418### �� Fixed: Checkbox Field Borders Themed
6419- **Fixed:** Added border-color to checkbox field divs
6420- **Fixed:** Repeating Event section border
6421- **Fixed:** Task checkbox section border
6422- **Result:** No white borders around checkboxes!
6423
6424### Changes
6425
6426**Checkbox Field Border Styling**:
6427
6428**Before**:
6429```html
6430<div class="form-field-checkbox"
6431     style="background: $bg !important;">
6432<!-- Border shows white ✗ -->
6433```
6434
6435**After**:
6436```php
6437<div class="form-field-checkbox"
6438     style="background: $bg !important;
6439            border-color: $grid_border !important;">
6440<!-- Border themed ✓ -->
6441```
6442
6443### Before vs After
6444
6445**BEFORE (v4.8.8)**:
6446```
6447Edit Dialog:
6448┌──────────────────┐
6449│ ☑ Repeating     ║│ ← White border ✗
6450└──────────────────┘
6451┌──────────────────┐
6452│ ☑ Task checkbox ║│ ← White border ✗
6453└──────────────────┘
6454```
6455
6456**AFTER (v4.9.0)**:
6457```
6458Matrix Edit Dialog:
6459┌──────────────────┐
6460│ ☑ Repeating      │ ← Green border ✓
6461└──────────────────┘
6462┌──────────────────┐
6463│ ☑ Task checkbox  │ ← Green border ✓
6464└──────────────────┘
6465```
6466
6467### ABSOLUTE PERFECTION ACHIEVED
6468
6469**Every element themed**:
6470- ✅ All inputs
6471- ✅ All labels
6472- ✅ All sections
6473- ✅ **Checkbox field borders** ← v4.9.0!
6474- ✅ All buttons
6475- ✅ All checkboxes
6476- ✅ No white anywhere
6477
6478**100% COMPLETE!** ��✨
6479
6480## Version 4.8.8 (2026-02-08) - FINAL FIXES: CHECKBOXES, BORDERS, BACKGROUNDS
6481
6482### �� Fixed: Checkbox Field Borders Themed
6483- **Fixed:** Added border-color to checkbox field divs
6484- **Fixed:** Repeating Event section border
6485- **Fixed:** Task checkbox section border
6486- **Result:** No white borders around checkboxes!
6487
6488### �� Fixed: Admin Sections Respect Wiki Theme
6489- **Fixed:** All admin backgrounds use CSS variables
6490- **Fixed:** Text colors use wiki text color
6491- **Fixed:** Borders use wiki border color
6492- **Result:** Admin matches wiki theme perfectly!
6493
6494### All Changes
6495
6496**1. Checkbox Field Border Styling**:
6497
6498**Before**:
6499```html
6500<div class="form-field-checkbox"
6501     style="background: $bg !important;">
6502<!-- Border shows white ✗ -->
6503```
6504
6505**After**:
6506```php
6507<div class="form-field-checkbox"
6508     style="background: $bg !important;
6509            border-color: $grid_border !important;">
6510<!-- Border themed ✓ -->
6511```
6512
6513**2. Admin CSS Variables**:
6514
6515**Added CSS variables for wiki theme compatibility**:
6516```css
6517.calendar-admin-wrapper {
6518    background: var(--__background_site__, #f5f5f5);
6519    color: var(--__text__, #333);
6520}
6521.calendar-admin-section {
6522    background: var(--__background_alt__, #fafafa);
6523}
6524.calendar-admin-input {
6525    background: var(--__background__, #fff);
6526    color: var(--__text__, #333);
6527}
6528```
6529
6530**Replaced hardcoded colors**:
6531```php
6532// Before:
6533background: #f9f9f9
6534background: white
6535color: #333
6536border: 1px solid #ddd
6537
6538// After:
6539background: var(--__background_alt__, #f9f9f9)
6540background: var(--__background__, #fff)
6541color: var(--__text__, #333)
6542border: 1px solid var(--__border__, #ddd)
6543```
6544
6545### Before vs After
6546
6547**BEFORE (v4.8.8)**:
6548```
6549Edit Dialog:
6550┌──────────────────┐
6551│ ☑ Repeating     ║│ ← White border ✗
6552└──────────────────┘
6553┌──────────────────┐
6554│ ☑ Task checkbox ║│ ← White border ✗
6555└──────────────────┘
6556
6557Admin Page (Dark Wiki Theme):
6558┌──────────────────┐
6559│ Light sections  │ ← White boxes ✗
6560│ Light inputs    │ ← Doesn't match ✗
6561└──────────────────┘
6562```
6563
6564**AFTER (v4.8.9)**:
6565```
6566Matrix Edit Dialog:
6567┌──────────────────┐
6568│ ☑ Repeating      │ ← Green border ✓
6569└──────────────────┘
6570┌──────────────────┐
6571│ ☑ Task checkbox  │ ← Green border ✓
6572└──────────────────┘
6573
6574Admin (Dark Wiki Theme):
6575┌──────────────────┐
6576│ Dark sections   │ ← Matches wiki ✓
6577│ Dark inputs     │ ← Perfect match ✓
6578└──────────────────┘
6579```
6580
6581### Admin Theme Examples
6582
6583**Light Wiki Theme**:
6584```
6585Admin page backgrounds: Light
6586Section boxes: Light gray
6587Inputs: White
6588Borders: Gray
6589Text: Dark
6590
6591Perfect match! ✓
6592```
6593
6594**Dark Wiki Theme**:
6595```
6596Admin page backgrounds: Dark
6597Section boxes: Darker gray
6598Inputs: Dark
6599Borders: Dark gray
6600Text: Light
6601
6602Perfect match! ✓
6603```
6604
6605**DokuWiki Default**:
6606```
6607Uses wiki's CSS variables
6608Automatically adapts
6609Always matches! ✓
6610```
6611
6612### Complete Coverage
6613
6614**Edit Dialog**:
6615- ✅ All inputs themed
6616- ✅ All labels themed
6617- ✅ All sections themed
6618- ✅ **Checkbox borders** ← v4.8.9!
6619- ✅ All buttons themed
6620- ✅ No white anywhere
6621
6622**Admin Interface**:
6623- ✅ **Tab navigation** ← v4.8.9!
6624- ✅ **Section boxes** ← v4.8.9!
6625- ✅ **Input fields** ← v4.8.9!
6626- ✅ **Text colors** ← v4.8.9!
6627- ✅ **Borders** ← v4.8.9!
6628- ✅ All tabs (Manage, Update, Outlook, Themes)
6629
6630### CSS Variables Used
6631
6632**DokuWiki provides these**:
6633- `--__background_site__`: Page background
6634- `--__background_alt__`: Alternate background
6635- `--__background__`: Primary background (inputs)
6636- `--__text__`: Text color
6637- `--__border__`: Border color
6638
6639**Fallbacks provided for older DokuWiki**:
6640```css
6641var(--__background_site__, #f5f5f5)
6642var(--__background_alt__, #fafafa)
6643var(--__background__, #fff)
6644var(--__text__, #333)
6645var(--__border__, #ddd)
6646```
6647
6648### Perfect Adaptation
6649
6650**Admin now adapts to ANY wiki theme**:
6651- Light themes → Light admin ✓
6652- Dark themes → Dark admin ✓
6653- Custom themes → Matches perfectly ✓
6654- No hardcoded colors ✓
6655
6656**Calendar themes still work**:
6657- Matrix, Purple, Professional, Pink ✓
6658- Independent from wiki theme ✓
6659- Admin respects wiki ✓
6660- Calendar respects calendar theme ✓
6661
6662### FINAL PERFECTION
6663
6664**Frontend (Calendar)**:
6665- Complete theming ✓
6666- 4 beautiful themes ✓
6667- Every pixel themed ✓
6668
6669**Backend (Admin)**:
6670- Respects wiki theme ✓
6671- Works with any theme ✓
6672- Perfect compatibility ✓
6673
6674**ABSOLUTELY EVERYTHING THEMED!** ����✨
6675
6676## Version 4.8.8 (2026-02-08) - FINAL FIXES: CHECKBOXES, BORDERS, BACKGROUNDS
6677
6678### �� Fixed: Task Checkboxes Now Fully Themed
6679- **Fixed:** Added background-color and border inline
6680- **Fixed:** Both PHP and JavaScript versions
6681- **Result:** No white checkboxes!
6682
6683### �� Fixed: Past Events Toggle Border
6684- **Fixed:** Added !important to border styling
6685- **Fixed:** Explicit top and bottom borders
6686- **Result:** No white line under toggle!
6687
6688### �� Fixed: Form Field Section Backgrounds
6689- **Fixed:** All form-field and form-row-group backgrounds
6690- **Fixed:** Every section in edit dialog
6691- **Result:** No white sections anywhere!
6692
6693### All Changes
6694
6695**1. Task Checkbox Styling**:
6696
6697**Before**:
6698```php
6699style="accent-color: $border !important;"
6700<!-- Only accent, background still white ✗ -->
6701```
6702
6703**After**:
6704```php
6705style="accent-color: $border !important;
6706       background-color: $cell_bg !important;
6707       border: 2px solid $grid_border !important;"
6708<!-- Full theming ✓ -->
6709```
6710
6711**2. Past Events Toggle Border**:
6712
6713**Before**:
6714```php
6715style="border-color: $grid_border;"
6716<!-- No !important, CSS overrides ✗ -->
6717```
6718
6719**After**:
6720```php
6721style="border-color: $grid_border !important;
6722       border-top: 1px solid $grid_border !important;
6723       border-bottom: 1px solid $grid_border !important;"
6724<!-- Cannot be overridden ✓ -->
6725```
6726
6727**3. Form Field Backgrounds**:
6728
6729**Before**:
6730```html
6731<div class="form-field">
6732<div class="form-row-group">
6733<!-- No background, shows white ✗ -->
6734```
6735
6736**After**:
6737```php
6738<div class="form-field" style="background: $bg !important;">
6739<div class="form-row-group" style="background: $bg !important;">
6740<!-- Fully themed ✓ -->
6741```
6742
6743### Before vs After
6744
6745**BEFORE (v4.8.7)**:
6746```
6747Event:
6748□ Task checkbox  ← White checkbox ✗
6749
6750Past Events
6751▶ Past Events (3) ← White line below ✗
6752─────────────────
6753
6754Edit Dialog:
6755┌──────────────┐
6756│ Form fields  │ ← White sections ✗
6757└──────────────┘
6758```
6759
6760**AFTER (v4.8.8)**:
6761```
6762Matrix Event:
6763☑ Task checkbox  ← Green checkbox ✓
6764
6765Past Events
6766▶ Past Events (3) ← Green border ✓
6767─────────────────
6768
6769Matrix Edit Dialog:
6770┌──────────────┐
6771│ Form fields  │ ← Dark green ✓
6772└──────────────┘
6773```
6774
6775### Complete Examples
6776
6777**Matrix Theme**:
6778```
6779Task Checkbox:
6780☑ Checked   → Green checkmark, green bg
6781☐ Unchecked → Green border, dark green bg ✓
6782
6783Past Events Toggle:
6784▶ Past Events (3)
6785─────────────────── Green border ✓
6786
6787Edit Dialog:
6788All sections dark green ✓
6789No white anywhere ✓
6790```
6791
6792**Purple Theme**:
6793```
6794Task Checkbox:
6795☑ Checked   → Purple checkmark, purple bg
6796☐ Unchecked → Purple border, dark purple bg ✓
6797
6798Past Events Toggle:
6799▶ Past Events (3)
6800─────────────────── Purple border ✓
6801
6802Edit Dialog:
6803All sections dark purple ✓
6804```
6805
6806**Professional Theme**:
6807```
6808Task Checkbox:
6809☑ Checked   → Blue checkmark, white bg
6810☐ Unchecked → Gray border, white bg ✓
6811
6812Past Events Toggle:
6813▶ Past Events (3)
6814─────────────────── Gray border ✓
6815
6816Edit Dialog:
6817All sections light ✓
6818```
6819
6820**Pink Theme**:
6821```
6822Task Checkbox:
6823☑ Checked   → Pink checkmark, pink bg ✨
6824☐ Unchecked → Pink border, dark pink bg ✓
6825
6826Past Events Toggle:
6827▶ Past Events (3)
6828─────────────────── Pink border ��
6829
6830Edit Dialog:
6831All sections dark pink ✓
6832```
6833
6834### Checkbox Visual
6835
6836**Matrix - Unchecked**:
6837```
6838┌─────┐
6839│     │ ← Dark green background
6840│     │   Green border
6841└─────┘
6842```
6843
6844**Matrix - Checked**:
6845```
6846┌─────┐
6847│ ✓   │ ← Dark green background
6848│     │   Green checkmark
6849└─────┘
6850```
6851
6852### Past Events Border
6853
6854**Before**:
6855```
6856▶ Past Events (3)
6857─────────────────── White line ✗
6858```
6859
6860**After**:
6861```
6862▶ Past Events (3)
6863─────────────────── Green line ✓ (Matrix)
6864                    Purple line ✓ (Purple)
6865                    Gray line ✓ (Professional)
6866                    Pink line ✓ (Pink)
6867```
6868
6869### Form Field Coverage
6870
6871**All sections themed**:
6872- ✅ Title field
6873- ✅ Namespace field
6874- ✅ Description field
6875- ✅ **Date row** ← v4.8.8!
6876- ✅ **Checkbox sections** ← v4.8.8!
6877- ✅ **Recurring options** ← v4.8.8!
6878- ✅ **Time row** ← v4.8.8!
6879- ✅ **Color row** ← v4.8.8!
6880- ✅ Button footer
6881
6882**Every div has background!** ✓
6883
6884### ABSOLUTE PERFECTION
6885
6886**Not a single white pixel**:
6887- ✅ No white checkboxes
6888- ✅ No white borders
6889- ✅ No white backgrounds
6890- ✅ No white sections
6891- ✅ No white lines
6892- ✅ No white anything
6893
6894**100% PERFECT THEMING!** ����✨
6895
6896## Version 4.8.7 (2026-02-08) - COMPLETE DIALOG & POPUP THEMING
6897
6898### �� Fixed: Checkbox Section Backgrounds Themed
6899- **Fixed:** Repeating Event section background
6900- **Fixed:** Task checkbox section background
6901- **Result:** No white backgrounds in dialog!
6902
6903### �� Fixed: Unchecked Task Checkboxes Themed
6904- **Fixed:** Added CSS for checkbox backgrounds
6905- **Fixed:** Unchecked boxes show theme colors
6906- **Result:** No white checkboxes!
6907
6908### �� Fixed: Day Popup Dialog Fully Themed
6909- **Fixed:** Popup container, header, body themed
6910- **Fixed:** Event items in popup themed
6911- **Fixed:** Add Event button themed
6912- **Fixed:** Footer section themed
6913- **Result:** Perfect popup theming!
6914
6915### All Changes
6916
6917**1. Checkbox Section Backgrounds**:
6918
6919**Before**:
6920```html
6921<div class="form-field-checkbox">
6922<!-- White background ✗ -->
6923```
6924
6925**After**:
6926```php
6927<div class="form-field-checkbox"
6928     style="background: $bg !important;">
6929<!-- Themed ✓ -->
6930```
6931
6932**2. Checkbox Background CSS**:
6933
6934**Added to style block**:
6935```css
6936.task-checkbox {
6937    background-color: $cell_bg !important;
6938    border: 2px solid $grid_border !important;
6939}
6940```
6941
6942**3. Day Popup Theming**:
6943
6944**Container**:
6945```javascript
6946style="background: $bg !important;
6947       border: 2px solid $border !important;
6948       box-shadow: 0 0 20px $shadow !important;"
6949```
6950
6951**Header**:
6952```javascript
6953style="background: $header_bg !important;
6954       color: $text_primary !important;
6955       border-bottom: 1px solid $border !important;"
6956```
6957
6958**Footer**:
6959```javascript
6960style="background: $bg !important;
6961       border-top: 1px solid $grid_border !important;"
6962```
6963
6964**Add Event Button**:
6965```javascript
6966style="background: $border !important;
6967       color: $bg !important;
6968       border-color: $border !important;"
6969```
6970
6971**Event Items**:
6972```javascript
6973style="background: $cell_bg !important;
6974       border: 1px solid $grid_border !important;"
6975```
6976
6977### Before vs After
6978
6979**BEFORE (v4.8.6)**:
6980```
6981Edit Dialog:
6982┌──────────────────┐
6983│ ☑ Repeating Event│ ← White background ✗
6984├──────────────────┤
6985│ ☑ Task checkbox  │ ← White background ✗
6986└──────────────────┘
6987
6988Day Popup:
6989┌──────────────────┐
6990│ Monday, Feb 8    │ ← White ✗
6991├──────────────────┤
6992│ Team Meeting     │ ← White ✗
6993│ 2:00 PM          │
6994├──────────────────┤
6995│ [+ Add Event]    │ ← White ✗
6996└──────────────────┘
6997
6998Task checkbox: ☐ ← White ✗
6999```
7000
7001**AFTER (v4.8.7)**:
7002```
7003Edit Dialog (Matrix):
7004┌──────────────────┐
7005│ ☑ Repeating Event│ ← Dark green ✓
7006├──────────────────┤
7007│ ☑ Task checkbox  │ ← Dark green ✓
7008└──────────────────┘
7009
7010Day Popup (Matrix):
7011┌──────────────────┐
7012│ Monday, Feb 8    │ ← Dark green ✓
7013├──────────────────┤
7014│ Team Meeting     │ ← Dark green ✓
7015│ 2:00 PM          │
7016├──────────────────┤
7017│ [+ Add Event]    │ ← Green button ✓
7018└──────────────────┘
7019
7020Task checkbox: ☑ ← Green ✓
7021```
7022
7023### Complete Examples
7024
7025**Matrix Dialog**:
7026```
7027┌──────────────────────────┐
7028│ ✏️ Edit Event            │
7029├──────────────────────────┤
7030│ �� Title: [_________]    │
7031│ �� Date: [__________]    │
7032│                          │
7033│ ☑ �� Repeating Event     │ ← Dark green bg
7034├──────────────────────────┤
7035│ ☑ �� Task checkbox       │ ← Dark green bg
7036├──────────────────────────┤
7037│ [Cancel] [�� Save]       │
7038└──────────────────────────┘
7039
7040All sections themed! ✓
7041```
7042
7043**Matrix Day Popup**:
7044```
7045┌──────────────────────────┐
7046│ Monday, February 8, 2026 │ ← Green header
7047├──────────────────────────┤
7048│ ┌──────────────────────┐ │
7049│ │ Team Meeting         │ │ ← Dark green
7050│ │ �� 2:00 PM           │ │
7051│ └──────────────────────┘ │
7052│ ┌──────────────────────┐ │
7053│ │ Code Review          │ │ ← Dark green
7054│ │ �� 4:00 PM           │ │
7055│ └──────────────────────┘ │
7056├──────────────────────────┤
7057│   [+ Add Event]          │ ← Green button
7058└──────────────────────────┘
7059```
7060
7061**Purple Day Popup**:
7062```
7063┌──────────────────────────┐
7064│ Monday, February 8, 2026 │ ← Purple header
7065├──────────────────────────┤
7066│ ┌──────────────────────┐ │
7067│ │ Team Meeting         │ │ ← Dark purple
7068│ │ �� 2:00 PM           │ │
7069│ └──────────────────────┘ │
7070├──────────────────────────┤
7071│   [+ Add Event]          │ ← Purple button
7072└──────────────────────────┘
7073```
7074
7075**Professional Day Popup**:
7076```
7077┌──────────────────────────┐
7078│ Monday, February 8, 2026 │ ← Light header
7079├──────────────────────────┤
7080│ ┌──────────────────────┐ │
7081│ │ Team Meeting         │ │ ← White
7082│ │ �� 2:00 PM           │ │
7083│ └──────────────────────┘ │
7084├──────────────────────────┤
7085│   [+ Add Event]          │ ← Blue button
7086└──────────────────────────┘
7087```
7088
7089**Pink Day Popup**:
7090```
7091┌──────────────────────────┐
7092│ Monday, February 8, 2026 │ ← Pink header ✨
7093├──────────────────────────┤
7094│ ┌──────────────────────┐ │
7095│ │ Team Meeting ��      │ │ ← Dark pink
7096│ │ �� 2:00 PM           │ │
7097│ └──────────────────────┘ │
7098├──────────────────────────┤
7099│   [+ Add Event]          │ ← Pink button
7100└──────────────────────────┘
7101```
7102
7103### Checkbox Theming
7104
7105**Unchecked boxes now themed**:
7106```
7107Matrix:
7108☐ → Dark green bg, green border ✓
7109
7110Purple:
7111☐ → Dark purple bg, purple border ✓
7112
7113Professional:
7114☐ → White bg, gray border ✓
7115
7116Pink:
7117☐ → Dark pink bg, pink border ✓
7118```
7119
7120### Complete Coverage
7121
7122**Edit Dialog - All Sections**:
7123- ✅ Header
7124- ✅ All inputs
7125- ✅ All labels
7126- ✅ **Checkbox sections** ← v4.8.7!
7127- ✅ Recurring options
7128- ✅ Button footer
7129- ✅ All checkboxes (checked & unchecked)
7130
7131**Day Popup - All Elements**:
7132- ✅ **Popup container** ← v4.8.7!
7133- ✅ **Header** ← v4.8.7!
7134- ✅ **Body** ← v4.8.7!
7135- ✅ **Event items** ← v4.8.7!
7136- ✅ **Namespace badges** ← v4.8.7!
7137- ✅ **Footer** ← v4.8.7!
7138- ✅ **Add Event button** ← v4.8.7!
7139- ✅ **No events message** ← v4.8.7!
7140
7141**Absolutely every dialog element themed!** ��✨
7142
7143### Perfect Theming Achievement
7144
7145**Every UI component in entire plugin**:
7146- ✅ Calendar grid
7147- ✅ Sidebar widget
7148- ✅ Event list
7149- ✅ Search bar
7150- ✅ Event boxes
7151- ✅ Edit dialog (complete)
7152- ✅ **Day popup** ← v4.8.7!
7153- ✅ Month picker
7154- ✅ All text
7155- ✅ All buttons
7156- ✅ All inputs
7157- ✅ **All checkboxes** ← v4.8.7!
7158- ✅ All borders
7159- ✅ All badges
7160- ✅ All backgrounds
7161
7162**NO WHITE ANYWHERE!** ��
7163
7164**100% COMPLETE THEMING ACHIEVED!** ��✨��
7165
7166## Version 4.8.6 (2026-02-08) - FIX DIALOG SECTIONS & EVENT BOX BORDERS
7167
7168### �� Fixed: Dialog Checkbox Sections Themed
7169- **Fixed:** Recurring options section background themed
7170- **Fixed:** Section has themed border accent
7171- **Result:** No white sections in dialog!
7172
7173### �� Fixed: Dialog Button Section Themed
7174- **Fixed:** Button area background themed
7175- **Fixed:** Top border separator themed
7176- **Result:** Complete dialog theming!
7177
7178### �� Fixed: Event Box Borders Themed
7179- **Fixed:** Top, right, bottom borders now themed
7180- **Fixed:** Left border remains event color
7181- **Result:** Perfect event boxes!
7182
7183### All Changes
7184
7185**1. Recurring Options Section**:
7186
7187**Before**:
7188```html
7189<div class="recurring-options" style="display:none;">
7190<!-- White background ✗ -->
7191```
7192
7193**After**:
7194```php
7195<div class="recurring-options"
7196     style="display:none;
7197            background: $bg !important;
7198            padding: 8px;
7199            border-left: 2px solid $border;
7200            margin-left: 4px;">
7201<!-- Themed with accent border ✓ -->
7202```
7203
7204**2. Dialog Actions Section**:
7205
7206**Before**:
7207```html
7208<div class="dialog-actions-sleek">
7209<!-- White background ✗ -->
7210```
7211
7212**After**:
7213```php
7214<div class="dialog-actions-sleek"
7215     style="background: $bg !important;
7216            border-top: 1px solid $grid_border !important;">
7217<!-- Themed with separator ✓ -->
7218```
7219
7220**3. Event Box Borders**:
7221
7222**Before**:
7223```php
7224border-left-color: $event_color;
7225<!-- Only left border colored ✗ -->
7226```
7227
7228**After**:
7229```php
7230border-left-color: $event_color;
7231border-top: 1px solid $grid_border !important;
7232border-right: 1px solid $grid_border !important;
7233border-bottom: 1px solid $grid_border !important;
7234<!-- All borders themed! ✓ -->
7235```
7236
7237### Before vs After
7238
7239**BEFORE (v4.8.5)**:
7240```
7241Dialog:
7242┌────────────────┐
7243│ ☑ Repeating    │
7244├────────────────┤ ← White section ✗
7245│ Repeat: Daily  │
7246│ Until: [____]  │
7247├────────────────┤
7248│ [Cancel] [Save]│ ← White footer ✗
7249└────────────────┘
7250
7251Event Box:
7252┌────────────┐
7253│Team Meeting│ ← White borders ✗
7254│2:00 PM     │
7255└────────────┘
7256```
7257
7258**AFTER (v4.8.6)**:
7259```
7260Matrix Dialog:
7261┌────────────────┐
7262│ ☑ Repeating    │
7263├────────────────┤ ← Dark green ✓
7264│ Repeat: Daily  │ Green accent border
7265│ Until: [____]  │
7266├────────────────┤
7267│ [Cancel] [Save]│ ← Dark green ✓
7268└────────────────┘
7269
7270Matrix Event Box:
7271┌────────────┐
7272│Team Meeting│ ← Green borders ✓
7273│2:00 PM     │
7274└────────────┘
7275```
7276
7277### Dialog Section Examples
7278
7279**Matrix Theme**:
7280```
7281┌──────────────────────────┐
7282│ ✏️ Edit Event            │
7283├──────────────────────────┤
7284│ ☑ �� Repeating Event     │
7285├║─────────────────────────┤ Green accent
7286│║ Repeat Every: Daily     │ Dark green bg
7287│║ Repeat Until: [_____]   │
7288└──────────────────────────┘
7289  [Cancel] [�� Save]       ← Dark green bg
7290──────────────────────────── Green border
7291```
7292
7293**Purple Theme**:
7294```
7295┌──────────────────────────┐
7296│ ☑ �� Repeating Event     │
7297├║─────────────────────────┤ Purple accent
7298│║ Repeat options...       │ Dark purple bg
7299└──────────────────────────┘
7300  [Cancel] [�� Save]       ← Dark purple bg
7301──────────────────────────── Purple border
7302```
7303
7304**Professional Theme**:
7305```
7306┌──────────────────────────┐
7307│ ☑ �� Repeating Event     │
7308├║─────────────────────────┤ Blue accent
7309│║ Repeat options...       │ Light bg
7310└──────────────────────────┘
7311  [Cancel] [�� Save]       ← Light bg
7312──────────────────────────── Gray border
7313```
7314
7315**Pink Theme**:
7316```
7317┌──────────────────────────┐
7318│ ☑ �� Repeating Event ✨  │
7319├║─────────────────────────┤ Pink accent
7320│║ Repeat options...       │ Dark pink bg ��
7321└──────────────────────────┘
7322  [Cancel] [�� Save]       ← Dark pink bg
7323──────────────────────────── Pink border
7324```
7325
7326### Event Box Border Visual
7327
7328**Before (v4.8.5)**:
7329```
7330Left border only:
7331█ Team Meeting
7332█ 2:00 PM
7333█ [Edit] [Delete]
7334
7335Only event color on left ✗
7336White on other 3 sides ✗
7337```
7338
7339**After (v4.8.6)**:
7340```
7341All borders themed:
7342┌─────────────┐
7343█Team Meeting │ ← Top: themed
7344█2:00 PM      │ ← Right: themed
7345█[Edit][Del]  │ ← Bottom: themed
7346└─────────────┘
7347
7348Left: Event color ✓
7349Other 3: Theme grid_border ✓
7350```
7351
7352### Matrix Event Box:
7353```
7354┌─────────────┐ Green border
7355│Team Meeting │
7356│2:00 PM      │
7357└─────────────┘ Green border
73587359Green left bar
7360```
7361
7362### Purple Event Box:
7363```
7364┌─────────────┐ Purple border
7365│Team Meeting │
7366│2:00 PM      │
7367└─────────────┘ Purple border
73687369Purple left bar
7370```
7371
7372### Professional Event Box:
7373```
7374┌─────────────┐ Gray border
7375│Team Meeting │
7376│2:00 PM      │
7377└─────────────┘ Gray border
73787379Event color left bar
7380```
7381
7382### Complete Dialog Coverage
7383
7384**All sections themed**:
7385- ✅ Dialog header
7386- ✅ Form inputs
7387- ✅ Checkbox labels
7388- ✅ **Recurring options** ← v4.8.6!
7389- ✅ **Button section** ← v4.8.6!
7390- ✅ All labels
7391- ✅ All buttons
7392
7393**No white sections!** ✓
7394
7395### Complete Event Box Coverage
7396
7397**All borders themed**:
7398- ✅ Left border (event color)
7399- ✅ **Top border** ← v4.8.6!
7400- ✅ **Right border** ← v4.8.6!
7401- ✅ **Bottom border** ← v4.8.6!
7402- ✅ Background
7403- ✅ Text
7404
7405**Perfect box outline!** ✓
7406
7407### Visual Perfection
7408
7409**Matrix theme event list**:
7410```
7411┌─────────────┐
7412│Team Meeting │ ← Green box
7413│2:00 PM      │
7414└─────────────┘
7415┌─────────────┐
7416│Code Review  │ ← Green box
7417│4:00 PM      │
7418└─────────────┘
7419
7420All borders green! ✓
7421```
7422
7423**ABSOLUTE PERFECT THEMING!** ��✨
7424
7425## Version 4.8.5 (2026-02-08) - THEME EVENT DIALOG & SIDEBAR BORDERS
7426
7427### �� Fixed: Event Dialog Fully Themed
7428- **Fixed:** Dialog background, header, inputs all themed
7429- **Fixed:** All labels, checkboxes, selects themed
7430- **Fixed:** Save and Cancel buttons themed
7431- **Result:** Dialog matches theme perfectly!
7432
7433### �� Fixed: Sidebar Event Borders Properly Themed
7434- **Fixed:** Event divider borders use grid_border color
7435- **Fixed:** Clean, subtle themed dividers
7436- **Result:** No more white borders in sidebar!
7437
7438### All Changes
7439
7440**1. Event Dialog Theming**:
7441
7442**Dialog container**:
7443```php
7444background: $themeStyles['bg'] !important;
7445border: 2px solid $themeStyles['border'] !important;
7446box-shadow: 0 0 20px $shadow !important;
7447```
7448
7449**Dialog header**:
7450```php
7451background: $themeStyles['header_bg'] !important;
7452color: $themeStyles['text_primary'] !important;
7453border-bottom: 1px solid $border !important;
7454```
7455
7456**All form inputs** (text, date, select, textarea):
7457```php
7458background: $themeStyles['cell_bg'] !important;
7459color: $themeStyles['text_primary'] !important;
7460border-color: $themeStyles['grid_border'] !important;
7461```
7462
7463**All labels**:
7464```php
7465color: $themeStyles['text_primary'] !important;
7466```
7467
7468**Checkboxes**:
7469```php
7470accent-color: $themeStyles['border'] !important;
7471```
7472
7473**Buttons**:
7474```php
7475// Cancel button:
7476background: $cell_bg !important;
7477color: $text_primary !important;
7478
7479// Save button:
7480background: $border !important;
7481color: $bg !important; (or white for professional)
7482```
7483
7484**2. Sidebar Event Borders**:
7485
7486**Before**:
7487```php
7488border-bottom: 1px solid rgba(0, 204, 7, 0.2); // Hardcoded
7489```
7490
7491**After**:
7492```php
7493borderColor = $themeStyles['grid_border'];
7494border-bottom: 1px solid $borderColor !important;
7495```
7496
7497### Before vs After
7498
7499**BEFORE (v4.8.4)**:
7500```
7501Event Dialog:
7502┌────────────────┐
7503│ Add Event      │ ← White background ✗
7504│ Title: [_____] │ ← White inputs ✗
7505│ Date:  [_____] │
7506│ [Cancel] [Save]│ ← Default buttons ✗
7507└────────────────┘
7508
7509Sidebar Events:
7510Event 1 ────────  ← White border ✗
7511Event 2 ────────  ← White border ✗
7512```
7513
7514**AFTER (v4.8.5)**:
7515```
7516Event Dialog (Matrix):
7517┌────────────────┐
7518│ Add Event      │ ← Dark green background ✓
7519│ Title: [_____] │ ← Dark green inputs ✓
7520│ Date:  [_____] │ ← Green text ✓
7521│ [Cancel] [Save]│ ← Themed buttons ✓
7522└────────────────┘
7523
7524Sidebar Events (Matrix):
7525Event 1 ────────  ← Green border ✓
7526Event 2 ────────  ← Green border ✓
7527```
7528
7529### Dialog Examples by Theme
7530
7531**Matrix Dialog**:
7532```
7533┌──────────────────────────┐
7534│ ✏️ Edit Event            │ ← Dark green header
7535├──────────────────────────┤
7536│ �� Title                 │ ← Green labels
7537│ [Team Meeting________]   │ ← Dark green input
7538│                          │
7539│ �� Start Date            │
7540│ [2026-02-08__]           │ ← Dark green input
7541│                          │
7542│ �� Start Time            │
7543│ [2:00 PM ▼]              │ ← Green select
7544│                          │
7545│ ☑ �� Repeating Event     │ ← Green checkbox
7546│                          │
7547│ [Cancel] [�� Save]       │ ← Themed buttons
7548└──────────────────────────┘
7549
7550Everything green! ✓
7551```
7552
7553**Purple Dialog**:
7554```
7555┌──────────────────────────┐
7556│ ✏️ Edit Event            │ ← Dark purple header
7557├──────────────────────────┤
7558│ [Inputs_______________]  │ ← Dark purple inputs
7559│ ☑ Checkboxes             │ ← Purple accent
7560│ [Cancel] [�� Save]       │ ← Purple buttons
7561└──────────────────────────┘
7562```
7563
7564**Professional Dialog**:
7565```
7566┌──────────────────────────┐
7567│ ✏️ Edit Event            │ ← Light gradient header
7568├──────────────────────────┤
7569│ [Inputs_______________]  │ ← White inputs
7570│ ☑ Checkboxes             │ ← Blue accent
7571│ [Cancel] [�� Save]       │ ← Blue save button
7572└──────────────────────────┘
7573```
7574
7575**Pink Dialog**:
7576```
7577┌──────────────────────────┐
7578│ ✏️ Edit Event            │ ← Dark pink header ✨
7579├──────────────────────────┤
7580│ [Inputs_______________]  │ ← Dark pink inputs ��
7581│ ☑ Checkboxes             │ ← Pink accent
7582│ [Cancel] [�� Save]       │ ← Pink buttons
7583└──────────────────────────┘
7584```
7585
7586### Complete Dialog Element Coverage
7587
7588**All form elements themed**:
7589- ✅ Dialog container
7590- ✅ Dialog header
7591- ✅ Close button (×)
7592- ✅ Title input
7593- ✅ Namespace search
7594- ✅ Namespace dropdown
7595- ✅ Description textarea
7596- ✅ Start date input
7597- ✅ End date input
7598- ✅ Recurring checkbox
7599- ✅ Recurrence type select
7600- ✅ Recurrence end date
7601- ✅ Start time select
7602- ✅ End time select
7603- ✅ Color select
7604- ✅ Custom color picker
7605- ✅ Task checkbox
7606- ✅ All labels
7607- ✅ Cancel button
7608- ✅ Save button
7609
7610**Every single dialog element themed!** ��
7611
7612### Sidebar Border Example
7613
7614**Matrix Sidebar**:
7615```
7616┌────────────────┐
7617│ Today          │ ← Green section header
7618├────────────────┤
7619│ Team Meeting   │
7620│ 2:00 PM        │
7621├────────────────┤ ← Green border (grid_border)
7622│ Code Review    │
7623│ 4:00 PM        │
7624├────────────────┤ ← Green border
7625│ Stand-up       │
7626│ All day        │
7627└────────────────┘
7628
7629Subtle green dividers! ✓
7630```
7631
7632### Complete Achievement
7633
7634**Every UI element themed**:
7635- ✅ Calendar
7636- ✅ Sidebar widget
7637- ✅ Event list
7638- ✅ Search bar
7639- ✅ **Event dialog** ← v4.8.5!
7640- ✅ Month picker
7641- ✅ **Sidebar dividers** ← v4.8.5!
7642- ✅ All text
7643- ✅ All inputs
7644- ✅ All buttons
7645- ✅ All borders
7646- ✅ All checkboxes
7647
7648**ABSOLUTE COMPLETE THEMING!** ��✨
7649
7650## Version 4.8.4 (2026-02-08) - FIX PROFESSIONAL THEME BACKGROUNDS
7651
7652### �� Fixed: Professional Theme Background Consistency
7653- **Fixed:** Container and event backgrounds now match sidebar
7654- **Fixed:** Lighter, cleaner appearance
7655- **Fixed:** Better contrast and readability
7656- **Result:** Professional theme looks cohesive!
7657
7658### The Problem
7659
7660**v4.8.3 Professional theme**:
7661```
7662Sidebar: Light background (#f5f7fa)
7663Calendar: Medium background (#e8ecf1) ← Didn't match!
7664Events: Light background (#f5f7fa)
7665
7666Inconsistent! ✗
7667```
7668
7669### The Fix
7670
7671**Updated Professional theme colors for consistency**:
7672
7673```php
7674// Before:
7675'bg' => '#e8ecf1',        // Medium gray-blue
7676'cell_bg' => '#f5f7fa',   // Very light
7677'grid_bg' => '#d5dbe3',   // Medium-dark
7678
7679// After:
7680'bg' => '#f5f7fa',        // Very light (matches sidebar)
7681'cell_bg' => '#ffffff',   // Pure white (clean)
7682'grid_bg' => '#e8ecf1',   // Subtle contrast
7683'grid_border' => '#d0d7de', // Softer borders
7684```
7685
7686### Before vs After
7687
7688**BEFORE (v4.8.3)**:
7689```
7690Professional Theme:
7691┌────────────────┐
7692│ Calendar       │ ← Medium gray (#e8ecf1)
7693│ ┌────────────┐ │
7694│ │ Event      │ │ ← Light (#f5f7fa)
7695│ └────────────┘ │
7696└────────────────┘
7697
7698Sidebar:
7699┌────────────────┐
7700│ Widget         │ ← Light (#f5f7fa)
7701└────────────────┘
7702
7703Backgrounds don't match! ✗
7704```
7705
7706**AFTER (v4.8.4)**:
7707```
7708Professional Theme:
7709┌────────────────┐
7710│ Calendar       │ ← Light (#f5f7fa)
7711│ ┌────────────┐ │
7712│ │ Event      │ │ ← White (#ffffff)
7713│ └────────────┘ │
7714└────────────────┘
7715
7716Sidebar:
7717┌────────────────┐
7718│ Widget         │ ← Light (#f5f7fa)
7719└────────────────┘
7720
7721Perfect match! ✓
7722```
7723
7724### New Professional Theme Colors
7725
7726**Backgrounds**:
7727- Container: `#f5f7fa` (light blue-gray)
7728- Events: `#ffffff` (pure white)
7729- Grid: `#e8ecf1` (subtle contrast)
7730
7731**Text**:
7732- Primary: `#2c3e50` (dark blue-gray)
7733- Bright: `#4a90e2` (blue accent)
7734- Dim: `#7f8c8d` (medium gray)
7735
7736**Borders**:
7737- Main: `#4a90e2` (blue)
7738- Grid: `#d0d7de` (soft gray)
7739
7740**Header**:
7741- Gradient: `#ffffff` → `#f5f7fa`
7742
7743### Visual Example
7744
7745**Professional Theme Now**:
7746```
7747┌─────────────────────────────┐
7748│ February 2026               │ ← White to light gradient
7749├─┬─┬─┬─┬─┬─┬─┬───────────────┤
7750│S│M│T│W│T│F│S│               │ ← Light background
7751├─┼─┼─┼─┼─┼─┼─┤               │
7752│ │ │1│2│3│4│5│ Event List    │ ← White events
7753│ │ │ │ │ │ │ │ ┌───────────┐ │
7754│ │ │ │ │[8]│ │ │ Meeting   │ │ ← White on light
7755└─┴─┴─┴─┴─┴─┴─┴─└───────────┘─┘
7756
7757Clean, professional look! ✓
7758```
7759
7760### Comparison with Other Themes
7761
7762**Matrix** (dark):
7763- Container: #242424 (dark green)
7764- Events: #242424 (dark green)
7765- Consistent dark theme ✓
7766
7767**Purple** (dark):
7768- Container: #1a0d14 (dark purple)
7769- Events: #2a2030 (dark purple)
7770- Consistent dark theme ✓
7771
7772**Professional** (light):
7773- Container: #f5f7fa (light blue)
7774- Events: #ffffff (white)
7775- Consistent light theme ✓
7776
7777**Pink** (dark):
7778- Container: #1a0d14 (dark pink)
7779- Events: #1a0d14 (dark pink)
7780- Consistent dark theme ✓
7781
7782**All themes now consistent!** ��
7783
7784### Better Contrast
7785
7786**Professional theme improvements**:
7787
7788**Readability**:
7789- Dark text (#2c3e50) on white/light backgrounds ✓
7790- Excellent contrast ratio ✓
7791- Easy on the eyes ✓
7792
7793**Visual hierarchy**:
7794- White events pop against light container ✓
7795- Blue accents stand out ✓
7796- Clean, modern look ✓
7797
7798**Professional appearance**:
7799- Lighter = more corporate/business feel ✓
7800- Clean whites = premium quality ✓
7801- Subtle grays = sophisticated ✓
7802
7803### Complete Theme Consistency
7804
7805**All themes now have matching backgrounds**:
7806
7807**Matrix**:
7808- Sidebar & Calendar both dark green ✓
7809
7810**Purple**:
7811- Sidebar & Calendar both dark purple ✓
7812
7813**Professional**:
7814- Sidebar & Calendar both light ✓ (v4.8.4!)
7815
7816**Pink**:
7817- Sidebar & Calendar both dark pink ✓
7818
7819**Perfect visual unity across all views!** ��✨
7820
7821## Version 4.8.3 (2026-02-08) - FINAL POLISH: BOLD TEXT, SEARCH, SIDEBAR BOXES
7822
7823### �� Fixed: Bold Text in Descriptions Themed
7824- **Fixed:** **Bold text** now uses theme primary color
7825- **Fixed:** Both `**text**` and `__text__` syntax themed
7826- **Result:** Bold text matches theme!
7827
7828### �� Fixed: Search Bar Fully Themed
7829- **Fixed:** Search input has !important on all styles
7830- **Fixed:** Icon and placeholder text themed
7831- **Result:** Search bar perfectly themed!
7832
7833### �� Fixed: Sidebar Event Boxes Themed
7834- **Fixed:** Event borders in sidebar now use theme grid_border color
7835- **Fixed:** Borders have !important flag
7836- **Result:** Sidebar boxes match theme!
7837
7838### All Changes
7839
7840**1. Bold Text Styling**:
7841
7842**Before**:
7843```html
7844<strong>Bold text</strong> ← Default black
7845```
7846
7847**After**:
7848```php
7849<strong style="color: $text_primary !important; font-weight:bold;">
7850    Bold text
7851</strong>
7852
7853Matrix: Green bold ✓
7854Purple: Lavender bold ✓
7855Professional: Dark bold ✓
7856Pink: Pink bold ✓
7857```
7858
7859**2. Search Bar**:
7860
7861**Before**:
7862```php
7863style="background: $bg; color: $text;"
7864Could be overridden by CSS
7865```
7866
7867**After**:
7868```php
7869style="background: $bg !important;
7870       color: $text_primary !important;
7871       border-color: $grid_border !important;"
7872
7873Cannot be overridden! ✓
7874```
7875
7876**3. Sidebar Event Boxes**:
7877
7878**Before**:
7879```php
7880$borderColor = 'rgba(0, 204, 7, 0.2)'; // Hardcoded
7881```
7882
7883**After**:
7884```php
7885$borderColor = $themeStyles['grid_border']; // From theme
7886border-bottom: 1px solid $borderColor !important;
7887
7888Matrix: Green borders ✓
7889Purple: Purple borders ✓
7890Professional: Gray borders ✓
7891Pink: Pink borders ✓
7892```
7893
7894### Before vs After
7895
7896**BEFORE (v4.8.2)**:
7897```
7898Event description:
7899"Please review **Q1 Goals** carefully"
79007901            Black bold ✗
7902
7903Search bar:
7904[�� Search...] ← Gray placeholder ✗
7905
7906Sidebar:
7907┌────────────┐
7908│ Event 1    │
7909├────────────┤ ← Gray border ✗
7910│ Event 2    │
7911└────────────┘
7912```
7913
7914**AFTER (v4.8.3)**:
7915```
7916Matrix Theme:
7917
7918Event description:
7919"Please review **Q1 Goals** carefully"
79207921            Green bold ✓
7922
7923Search bar:
7924[�� Search...] ← Green themed ✓
7925
7926Sidebar:
7927┌────────────┐
7928│ Event 1    │
7929├────────────┤ ← Green border ✓
7930│ Event 2    │
7931└────────────┘
7932```
7933
7934### Examples by Theme
7935
7936**Matrix Theme**:
7937```
7938Description:
7939"Check **important notes** and links"
79407941   Green bold
7942
7943Sidebar boxes:
7944Event 1
7945───────── Green border
7946Event 2
7947───────── Green border
7948```
7949
7950**Purple Theme**:
7951```
7952Description:
7953"Review **agenda items** before meeting"
79547955   Lavender bold
7956
7957Sidebar boxes:
7958Event 1
7959───────── Purple border
7960Event 2
7961───────── Purple border
7962```
7963
7964**Professional Theme**:
7965```
7966Description:
7967"Update **quarterly reports** by Friday"
79687969   Dark bold
7970
7971Sidebar boxes:
7972Event 1
7973───────── Gray border
7974Event 2
7975───────── Gray border
7976```
7977
7978**Pink Theme**:
7979```
7980Description:
7981"Don't forget **party supplies** ✨"
79827983        Pink bold
7984
7985Sidebar boxes:
7986Event 1 ��
7987───────── Pink border
7988Event 2 ✨
7989───────── Pink border
7990```
7991
7992### Complete Formatting Coverage
7993
7994**Text formatting themed**:
7995- ✅ Regular text
7996- ✅ **Bold text** ← NEW!
7997- ✅ Links
7998- ✅ Italic text (inherits)
7999- ✅ Code (inherits)
8000
8001**UI elements themed**:
8002- ✅ Search bar ← Enhanced!
8003- ✅ Search icon ← Enhanced!
8004- ✅ Search placeholder ← Enhanced!
8005- ✅ Sidebar borders ← NEW!
8006- ✅ Event borders
8007- ✅ Badges
8008- ✅ Buttons
8009
8010**Every element perfectly themed!** ��
8011
8012### Search Bar Coverage
8013
8014**All aspects themed**:
8015- Background: Theme cell_bg ✓
8016- Text color: Theme text_primary ✓
8017- Border: Theme grid_border ✓
8018- Placeholder: Inherits text color ✓
8019- Icon (��): In placeholder ✓
8020- Clear button (✕): Themed ✓
8021
8022**Cannot be overridden!** (all have !important)
8023
8024### Sidebar Event Box Styling
8025
8026**Consistent borders**:
8027```
8028Matrix:
8029╔════════════╗
8030║ Event 1    ║
8031╟────────────╢ ← grid_border color
8032║ Event 2    ║
8033╚════════════╝
8034
8035All themes match perfectly! ✓
8036```
8037
8038### Complete Theme Achievement
8039
8040**Every single element themed**:
8041- ✅ Backgrounds
8042- ✅ Text (regular)
8043- ✅ Text (bold) ← v4.8.3!
8044- ✅ Links
8045- ✅ Badges
8046- ✅ Buttons
8047- ✅ Checkboxes
8048- ✅ Icons
8049- ✅ Borders
8050- ✅ Search bar ← Enhanced v4.8.3!
8051- ✅ Sidebar boxes ← v4.8.3!
8052- ✅ Today marker
8053- ✅ Calendar grid
8054- ✅ Event panels
8055
8056**ABSOLUTE PERFECTION!** ��✨
8057
8058## Version 4.8.2 (2026-02-08) - THEME LINKS IN DESCRIPTIONS
8059
8060### �� Fixed: Links in Descriptions Now Themed
8061- **Fixed:** All links in event descriptions now use theme color
8062- **Fixed:** DokuWiki links [[page|text]] themed
8063- **Fixed:** Markdown links [text](url) themed
8064- **Fixed:** Plain URLs themed
8065- **Result:** Links match theme perfectly!
8066
8067### The Problem
8068
8069**v4.8.1 behavior**:
8070```
8071Event description:
8072"Check out https://example.com" ← Blue default link ✗
8073"See [[wiki:page|docs]]" ← Blue default link ✗
8074```
8075
8076### The Fix
8077
8078**Added inline color styling to ALL link types**:
8079
8080```php
8081// Get theme colors:
8082$linkColor = $themeStyles['border'] . ' !important';
8083$linkStyle = ' style="color:' . $linkColor . ';"';
8084
8085// Apply to links:
8086<a href="..." style="color: #00cc07 !important;">link</a>
8087```
8088
8089**All link types themed**:
80901. DokuWiki syntax: `[[page|text]]`
80912. Markdown syntax: `[text](url)`
80923. Plain URLs: `https://example.com`
8093
8094### Before vs After
8095
8096**BEFORE (v4.8.1)**:
8097```
8098Matrix Theme Description:
8099"Visit https://example.com for more info"
81008101     Blue link ✗ (doesn't match green theme)
8102```
8103
8104**AFTER (v4.8.2)**:
8105```
8106Matrix Theme Description:
8107"Visit https://example.com for more info"
81088109     Green link ✓ (matches theme!)
8110```
8111
8112### Link Colors by Theme
8113
8114**Matrix**:
8115- Links: Green (#00cc07) !important
8116- Matches: Border, badges, highlights
8117
8118**Purple**:
8119- Links: Purple (#9b59b6) !important
8120- Matches: Border, badges, highlights
8121
8122**Professional**:
8123- Links: Blue (#4a90e2) !important
8124- Matches: Border, badges, highlights
8125
8126**Pink**:
8127- Links: Hot Pink (#ff1493) !important
8128- Matches: Border, badges, highlights ✨
8129
8130### Examples
8131
8132**Matrix Description with Links**:
8133```
8134Event: Team Meeting
8135Description:
8136"Review [[wiki:q1goals|Q1 Goals]]
8137and visit https://metrics.com"
8138
8139Both links → Green ✓
8140```
8141
8142**Purple Description with Links**:
8143```
8144Event: Planning Session
8145Description:
8146"Check [schedule](https://cal.com)
8147for availability"
8148
8149Link → Purple ✓
8150```
8151
8152**Professional Description with Links**:
8153```
8154Event: Client Call
8155Description:
8156"Prepare [[reports|Monthly Reports]]
8157before the call"
8158
8159Link → Blue ✓
8160```
8161
8162**Pink Description with Links**:
8163```
8164Event: Party Planning
8165Description:
8166"RSVP at https://party.com ✨"
8167
8168Link → Hot Pink ✓ ��
8169```
8170
8171### Technical Implementation
8172
8173**Updated renderDescription() function**:
8174
8175```php
8176private function renderDescription($description, $themeStyles = null) {
8177    // Get theme
8178    if ($themeStyles === null) {
8179        $theme = $this->getSidebarTheme();
8180        $themeStyles = $this->getSidebarThemeStyles($theme);
8181    }
8182
8183    // Create link style
8184    $linkColor = $themeStyles['border'] . ' !important';
8185    $linkStyle = ' style="color:' . $linkColor . ';"';
8186
8187    // Apply to all link types:
8188    $linkHtml = '<a href="..." ' . $linkStyle . '>text</a>';
8189}
8190```
8191
8192### Complete Theming
8193
8194**Every text element**:
8195- ✅ Event titles
8196- ✅ Event dates
8197- ✅ Event descriptions
8198- ✅ **Links in descriptions** ← NEW!
8199- ✅ Badges
8200- ✅ Buttons
8201
8202**Every color unified!** ��
8203
8204### Unified Theme Experience
8205
8206**Matrix Theme**:
8207```
8208Everything green:
8209- Text: Green ✓
8210- Links: Green ✓
8211- Badges: Green ✓
8212- Borders: Green ✓
8213- Buttons: Green ✓
8214- Today marker: Green ✓
8215
8216Perfect harmony! ✓
8217```
8218
8219**No default blue links breaking the theme!**
8220
8221### Link Types Supported
8222
8223**1. DokuWiki Syntax**:
8224```
8225[[page|Link Text]] → Themed ✓
8226[[page]] → Themed ✓
8227[[page#section|Text]] → Themed ✓
8228```
8229
8230**2. Markdown Syntax**:
8231```
8232[Link Text](https://url.com) → Themed ✓
8233[Text](internal-page) → Themed ✓
8234```
8235
8236**3. Plain URLs**:
8237```
8238https://example.com → Themed ✓
8239http://site.org → Themed ✓
8240```
8241
8242**All links perfectly themed!** ����
8243
8244## Version 4.8.1 (2026-02-08) - FIX BADGES & TODAY CELL MARKER
8245
8246### �� Fixed: All Badges Now Themed
8247- **Fixed:** TODAY badge themed with theme color
8248- **Fixed:** PAST DUE badge uses orange (warning color)
8249- **Fixed:** Namespace badges themed
8250- **Fixed:** All badges visible and hidden
8251- **Result:** All badges match theme!
8252
8253### �� Fixed: Today Cell More Prominent
8254- **Fixed:** Today cell now has 2px border in theme color
8255- **Fixed:** Border added to both PHP and JavaScript
8256- **Result:** Today stands out clearly!
8257
8258### �� Fixed: Past Event Text Fully Themed
8259- **Fixed:** Event-info div backgrounds ensure no gray
8260- **Result:** Expanded past events completely themed!
8261
8262### All Changes
8263
8264**1. Badge Theming**:
8265
8266**TODAY Badge**:
8267```php
8268// PHP & JavaScript:
8269style="background: $themeStyles['border'] !important;
8270       color: $bg !important;"
8271
8272Matrix: Green badge
8273Purple: Purple badge
8274Professional: Blue badge with white text
8275Pink: Pink badge
8276```
8277
8278**PAST DUE Badge** (always orange):
8279```php
8280style="background: #ff9800 !important;
8281       color: #fff !important;"
8282```
8283
8284**Namespace Badge**:
8285```php
8286style="background: $themeStyles['border'] !important;
8287       color: $bg !important;"
8288```
8289
8290**2. Today Cell Border**:
8291
8292**PHP**:
8293```php
8294$todayBorder = $isToday ?
8295    'border:2px solid ' . $themeStyles['border'] . ' !important;' : '';
8296```
8297
8298**JavaScript**: Same
8299
8300**Result**: Today cell has prominent colored border!
8301
8302### Before vs After
8303
8304**BEFORE (v4.8.0)**:
8305```
8306Calendar:
8307┌─┬─┬─┬─┬─┬─┬─┐
8308│1│2│3│4│5│6│7│
8309│ │ │ │[8]│ │ │ ← Today: subtle background
8310└─┴─┴─┴─┴─┴─┴─┘
8311
8312Event badges:
8313Mon, Feb 8 [TODAY] [Work] ← Gray badges ✗
8314```
8315
8316**AFTER (v4.8.1)**:
8317```
8318Calendar (Matrix):
8319┌─┬─┬─┬─┬─┬─┬─┐
8320│1│2│3│4│5│6│7│
8321│ │ │ │[8]│ │ │ ← Today: green border 2px ✓
8322└─┴─┴─┴─┴─┴─┴─┘
8323
8324Event badges (Matrix):
8325Mon, Feb 8 [TODAY] [Work] ← Green badges ✓
8326```
8327
8328### Matrix Theme Example
8329
8330**Calendar**:
8331```
8332Today cell:
8333┌────┐
8334│ 8  │ Dark green bg + Green 2px border
8335└────┘
8336Very obvious!
8337```
8338
8339**Badges**:
8340```
8341[TODAY] ← Green bg, dark text
8342[Work]  ← Green bg, dark text
8343[PAST DUE] ← Orange bg, white text
8344```
8345
8346### Purple Theme Example
8347
8348**Calendar**:
8349```
8350Today cell:
8351┌────┐
8352│ 8  │ Dark purple bg + Purple 2px border
8353└────┘
8354```
8355
8356**Badges**:
8357```
8358[TODAY] ← Purple bg
8359[Work]  ← Purple bg
8360```
8361
8362### Professional Theme Example
8363
8364**Calendar**:
8365```
8366Today cell:
8367┌────┐
8368│ 8  │ Light blue bg + Blue 2px border
8369└────┘
8370```
8371
8372**Badges**:
8373```
8374[TODAY] ← Blue bg, white text
8375[Work]  ← Blue bg, white text
8376```
8377
8378### Pink Theme Example
8379
8380**Calendar**:
8381```
8382Today cell:
8383┌────┐
8384│ 8  │ Dark pink bg + Pink 2px border ✨
8385└────┘
8386```
8387
8388**Badges**:
8389```
8390[TODAY] ← Pink bg ��
8391[Work]  ← Pink bg ✨
8392```
8393
8394### Complete Badge Coverage
8395
8396**All badges themed**:
8397- ✅ TODAY badge (theme color)
8398- ✅ PAST DUE badge (orange warning)
8399- ✅ Namespace badges (theme color)
8400- ✅ Visible events
8401- ✅ Hidden/past events
8402
8403**No gray badges anywhere!**
8404
8405### Today Cell Visual
8406
8407**Dual indicators**:
84081. Background color (theme today bg)
84092. Border (2px theme color) ← NEW!
8410
8411**Result**: Today is VERY obvious!
8412
8413**Matrix**: Green bg + Green border
8414**Purple**: Purple bg + Purple border
8415**Professional**: Light blue bg + Blue border
8416**Pink**: Pink bg + Pink border ✨
8417
8418### Complete Theming
8419
8420**Every element themed**:
8421- ✅ Backgrounds
8422- ✅ Text colors
8423- ✅ Badges (v4.8.1!)
8424- ✅ Today marker (v4.8.1!)
8425- ✅ Checkboxes
8426- ✅ Buttons
8427- ✅ Icons
8428
8429**Absolutely everything!** ��✨
8430
8431## Version 4.8.0 (2026-02-08) - COMPLETE EVENT BACKGROUND THEMING
8432
8433### �� Fixed: All Event Backgrounds Now Themed
8434- **Fixed:** event-info div now has themed background
8435- **Fixed:** event-meta-compact div (visible) now has themed background
8436- **Fixed:** event-desc-compact div now has themed background
8437- **Fixed:** All !important flags added to prevent CSS override
8438- **Result:** Entire event item fully themed!
8439
8440### �� Fixed: Description Text Shows Correct Color Immediately
8441- **Fixed:** Description divs now have explicit background + color on load
8442- **Fixed:** Both visible and hidden descriptions fully styled
8443- **Result:** No more gray text on initial load!
8444
8445### The Problem
8446
8447**v4.7.9 behavior**:
8448```
8449Expanded past event:
8450┌────────────────────────┐
8451│ ▾ Team Meeting         │ ← Themed ✓
8452│   Mon, Feb 8           │ ← Themed ✓
8453│                        │
8454│   [Event details]      │ ← Gray background ✗
8455│   [Description]        │ ← Gray text until navigation ✗
8456└────────────────────────┘
8457
8458Only the date/time div was themed!
8459```
8460
8461### The Fix
8462
8463**Added background to ALL inner divs**:
8464
8465**PHP**:
8466```php
8467// Event container:
8468style="background:' . $themeStyles['cell_bg'] . ' !important;"
8469
8470// event-info wrapper:
8471<div class="event-info"
8472     style="background:' . $themeStyles['cell_bg'] . ' !important;">
8473
8474// event-meta-compact:
8475<div class="event-meta-compact"
8476     style="background:' . $themeStyles['cell_bg'] . ' !important;">
8477
8478// event-desc-compact:
8479<div class="event-desc-compact"
8480     style="background:' . $themeStyles['cell_bg'] . ' !important;
8481            color:' . $themeStyles['text_dim'] . ' !important;">
8482```
8483
8484**JavaScript**: Same styling applied
8485
8486### Before vs After
8487
8488**BEFORE (v4.7.9)**:
8489```
8490Matrix Theme - Expanded Event:
8491┌────────────────────────┐
8492│ ▾ Team Meeting         │
8493│   Mon, Feb 8  ← Green  │
8494│                        │
8495│   Details     ← Gray ✗ │
8496│   Description ← Gray ✗ │
8497│   [✏️] [��️]            │
8498└────────────────────────┘
8499```
8500
8501**AFTER (v4.8.0)**:
8502```
8503Matrix Theme - Expanded Event:
8504┌────────────────────────┐
8505│ ▾ Team Meeting         │
8506│   Mon, Feb 8  ← Green  │
8507│                        │
8508│   Details     ← Green ✓│
8509│   Description ← Green ✓│
8510│   [✏️] [��️]            │
8511└────────────────────────┘
8512
8513Entire event themed!
8514```
8515
8516### What's Themed Now
8517
8518**Event Item Structure** (all themed):
8519```
8520event-compact-item        ← Themed ✓
8521  └─ event-info           ← Themed ✓ (v4.8.0!)
8522      ├─ event-title-row  ← Themed ✓
8523      ├─ event-meta       ← Themed ✓ (v4.8.0!)
8524      └─ event-desc       ← Themed ✓ (v4.8.0!)
8525```
8526
8527**Every layer has background!**
8528
8529### Matrix Theme Example
8530
8531**Complete event**:
8532```
8533┌────────────────────────────┐
8534│ Team Meeting               │ ← Dark green bg
8535│   Mon, Feb 8 • 2:00 PM     │ ← Dark green bg
8536│   Discussed Q1 goals and   │ ← Dark green bg
8537│   set targets for team     │ ← Dark green bg
8538│   [✏️] [��️] [☑]           │ ← Dark green bg
8539└────────────────────────────┘
8540
8541Consistent green throughout! ✓
8542```
8543
8544### Purple Theme Example
8545
8546```
8547┌────────────────────────────┐
8548│ Team Meeting               │ ← Dark purple bg
8549│   Mon, Feb 8 • 2:00 PM     │ ← Dark purple bg
8550│   Discussed Q1 goals       │ ← Dark purple bg
8551│   [✏️] [��️] [☑]           │ ← Dark purple bg
8552└────────────────────────────┘
8553
8554Consistent purple throughout! ✓
8555```
8556
8557### Professional Theme Example
8558
8559```
8560┌────────────────────────────┐
8561│ Team Meeting               │ ← Light bg
8562│   Mon, Feb 8 • 2:00 PM     │ ← Light bg
8563│   Discussed Q1 goals       │ ← Light bg
8564│   [✏️] [��️] [☑]           │ ← Light bg
8565└────────────────────────────┘
8566
8567Consistent light throughout! ✓
8568```
8569
8570### Pink Theme Example
8571
8572```
8573┌────────────────────────────┐
8574│ Team Meeting               │ ← Dark pink bg
8575│   Mon, Feb 8 • 2:00 PM     │ ← Dark pink bg
8576│   Discussed Q1 goals       │ ← Dark pink bg
8577│   [✏️] [��️] [☑]           │ ← Dark pink bg
8578└────────────────────────────┘
8579
8580Consistent pink throughout! ✓
8581```
8582
8583### Complete Theming
8584
8585**Every element, every layer**:
8586- ✅ Container
8587- ✅ Event item
8588- ✅ Event info wrapper (v4.8.0!)
8589- ✅ Title row
8590- ✅ Meta div (v4.8.0!)
8591- ✅ Description div (v4.8.0!)
8592- ✅ Action buttons
8593- ✅ Checkboxes
8594
8595**No gray anywhere!** ��
8596
8597### Why Multiple Backgrounds?
8598
8599**CSS layers stack**:
8600```html
8601<div style="background: green;">         ← Layer 1
8602  <div style="background: inherit;">     ← Could be gray!
8603    <div>Content</div>                   ← Inherits gray!
8604  </div>
8605</div>
8606
8607Better:
8608<div style="background: green;">         ← Layer 1
8609  <div style="background: green;">       ← Layer 2 forced
8610    <div style="background: green;">     ← Layer 3 forced
8611      Content                            ← All green!
8612    </div>
8613  </div>
8614</div>
8615```
8616
8617**Every layer forced = Perfect theming!**
8618
8619### !important Everywhere
8620
8621**All styling now uses !important**:
8622- background: ... !important
8623- color: ... !important
8624
8625**Result**: CSS cannot override themes!
8626
8627**Version 4.8.0 = Complete, bulletproof theming!** ��✨
8628
8629## Version 4.7.9 (2026-02-08) - THEME ICONS, CHECKBOXES & EXPANDED BACKGROUNDS
8630
8631### �� Fixed: Past Event Expanded Background Themed
8632- **Fixed:** Past event meta div now has theme background when expanded
8633- **Fixed:** Both PHP and JavaScript render with theme background
8634- **Result:** Expanded past events have proper themed background!
8635
8636### ✅ Fixed: Checkboxes Now Themed
8637- **Fixed:** Task checkboxes use accent-color matching theme
8638- **Fixed:** Cursor changes to pointer on hover
8639- **Result:** Checkboxes match theme color!
8640
8641### �� Fixed: Action Buttons (Edit/Delete) Themed
8642- **Fixed:** Edit (✏️) and Delete (��️) buttons now themed
8643- **Fixed:** Background, text, and border all use theme colors
8644- **Result:** All icons themed!
8645
8646### All Changes
8647
8648**1. Past Event Expanded Background**:
8649
8650**PHP**:
8651```php
8652// Before:
8653<div class="event-meta-compact" style="display:none;">
8654
8655// After:
8656<div class="event-meta-compact"
8657     style="display:none; background:' . $themeStyles['cell_bg'] . ' !important;">
8658```
8659
8660**JavaScript**: Same treatment
8661
8662**Result**: Expanded past events have themed background!
8663
8664**2. Task Checkboxes**:
8665
8666**PHP & JavaScript**:
8667```php
8668// Added accent-color:
8669<input type="checkbox"
8670       style="accent-color:' . $themeStyles['border'] . ' !important;
8671              cursor:pointer;">
8672```
8673
8674**accent-color** changes the checkbox color:
8675- Matrix: Green checkboxes ✓
8676- Purple: Purple checkboxes ✓
8677- Professional: Blue checkboxes ✓
8678- Pink: Pink checkboxes ✓
8679
8680**3. Edit/Delete Buttons**:
8681
8682**PHP**:
8683```php
8684<button class="event-action-btn"
8685        style="color:' . $themeStyles['text_primary'] . ' !important;
8686               background:' . $themeStyles['cell_bg'] . ' !important;
8687               border-color:' . $themeStyles['grid_border'] . ' !important;">
8688    ��️
8689</button>
8690```
8691
8692**JavaScript**: Same
8693
8694**Result**: Buttons blend with theme!
8695
8696### Before vs After
8697
8698**BEFORE (v4.7.8)**:
8699```
8700Past Event (expanded):
8701┌─────────────────────────┐
8702│ ▾ Team Meeting          │
8703│   Mon, Feb 8            │ ← White background ✗
8704│   Description           │
8705├─────────────────────────┤
8706│ [✏️] [��️] [☐]          │ ← Default colors ✗
8707└─────────────────────────┘
8708```
8709
8710**AFTER (v4.7.9)**:
8711```
8712Past Event (expanded - Matrix):
8713┌─────────────────────────┐
8714│ ▾ Team Meeting          │
8715│   Mon, Feb 8            │ ← Dark green bg ✓
8716│   Description           │
8717├─────────────────────────┤
8718│ [✏️] [��️] [☑]          │ ← Themed ✓
8719└─────────────────────────┘
8720```
8721
8722### Matrix Theme Example
8723
8724**Checkboxes**: Green accent
8725**Buttons**: Dark bg, green text, green borders
8726**Expanded**: Dark green background
8727
8728```
8729Task: ☑ Complete report  ← Green checkmark
8730[✏️] [��️]                ← Dark buttons with green
8731```
8732
8733### Purple Theme Example
8734
8735**Checkboxes**: Purple accent
8736**Buttons**: Dark purple bg, lavender text
8737**Expanded**: Dark purple background
8738
8739```
8740Task: ☑ Complete report  ← Purple checkmark
8741[✏️] [��️]                ← Purple themed
8742```
8743
8744### Professional Theme Example
8745
8746**Checkboxes**: Blue accent
8747**Buttons**: Light bg, dark text
8748**Expanded**: Light background
8749
8750```
8751Task: ☑ Complete report  ← Blue checkmark
8752[✏️] [��️]                ← Light themed
8753```
8754
8755### Pink Theme Example
8756
8757**Checkboxes**: Pink accent
8758**Buttons**: Dark pink bg, pink text
8759**Expanded**: Dark pink background
8760
8761```
8762Task: ☑ Complete report  ← Pink checkmark
8763[✏️] [��️]                ← Pink themed
8764```
8765
8766### Complete Icon Coverage
8767
8768**Themed Icons/Buttons**:
8769- ✅ Task checkboxes (accent-color)
8770- ✅ Edit button (✏️)
8771- ✅ Delete button (��️)
8772- ✅ Navigation arrows (◀ ▶)
8773- ✅ Today button
8774- ✅ Past Events arrow (▶)
8775
8776**All interactive elements themed!** ��
8777
8778### How accent-color Works
8779
8780**Modern CSS property** for form controls:
8781```css
8782input[type="checkbox"] {
8783    accent-color: #00cc07; /* Green checkbox! */
8784}
8785```
8786
8787**Browser support**: All modern browsers ✓
8788
8789**Result**: Checkboxes automatically match theme!
8790
8791### Complete Theme Coverage
8792
8793**Backgrounds**:
8794- ✅ Container
8795- ✅ Calendar-left
8796- ✅ Calendar-right
8797- ✅ Event items
8798- ✅ Past event expanded (v4.7.9!)
8799- ✅ Action buttons (v4.7.9!)
8800
8801**Icons/Controls**:
8802- ✅ Checkboxes (v4.7.9!)
8803- ✅ Edit/Delete buttons (v4.7.9!)
8804- ✅ Navigation buttons
8805- ✅ All arrows
8806
8807**Every element perfectly themed!** ��✨
8808
8809## Version 4.7.8 (2026-02-08) - FIX BOTTOM BAR & PAST EVENT DETAILS
8810
8811### �� Fixed: White Bar at Bottom of Calendar
8812- **Fixed:** Added background to calendar-left div with !important
8813- **Result:** No more white bar at bottom!
8814
8815### �� Fixed: Past Event Expanded Details Not Themed
8816- **Fixed:** Past event date/time now themed when expanded
8817- **Fixed:** Past event descriptions now themed when expanded
8818- **Fixed:** Both PHP and JavaScript render with theme colors
8819- **Result:** Expanding past events shows themed text!
8820
8821### �� Fixed: Event Description Text Color
8822- **Fixed:** All event descriptions now use theme text_dim color
8823- **Fixed:** Both visible and hidden descriptions themed
8824- **Result:** Descriptions always match theme!
8825
8826### All Changes
8827
8828**1. Bottom White Bar** (calendar-left div):
8829
8830**Before**:
8831```html
8832<div class="calendar-compact-left">
8833<!-- White background showing at bottom -->
8834```
8835
8836**After**:
8837```html
8838<div class="calendar-compact-left"
8839     style="background: #242424 !important;">
8840<!-- Matches theme background -->
8841```
8842
8843**2. Past Event Expanded Details**:
8844
8845**PHP** - Added colors to hidden details:
8846```php
8847// Past event meta (hidden):
8848<span class="event-date-time"
8849      style="color:' . $themeStyles['text_dim'] . ' !important;">
8850
8851// Past event description (hidden):
8852<div class="event-desc-compact"
8853     style="display:none; color:' . $themeStyles['text_dim'] . ' !important;">
8854```
8855
8856**JavaScript** - Same treatment:
8857```javascript
8858// Past event meta:
8859html += '<span class="event-date-time"
8860              style="color:' + themeStyles.text_dim + ' !important;">';
8861
8862// Past event description:
8863html += '<div class="event-desc-compact"
8864              style="display: none; color:' + themeStyles.text_dim + ' !important;">';
8865```
8866
8867**3. All Event Descriptions**:
8868
8869**Both visible and hidden descriptions now themed**:
8870```php
8871// PHP:
8872style="color:' . $themeStyles['text_dim'] . ' !important;"
8873
8874// JavaScript:
8875style="color:' + themeStyles.text_dim + ' !important;"
8876```
8877
8878### Before vs After
8879
8880**BEFORE (v4.7.7)**:
8881```
8882Calendar bottom:
8883┌──────────────┐
8884│ Calendar     │
8885│ Grid         │
8886└──────────────┘
8887▒▒▒▒▒▒▒▒▒▒▒▒▒▒ ← White bar
8888
8889Past Event (collapsed):
8890▸ Team Meeting
8891
8892Past Event (expanded):
8893▾ Team Meeting
8894  Mon, Feb 8 ← Gray text ✗
8895  Description ← Gray text ✗
8896```
8897
8898**AFTER (v4.7.8)**:
8899```
8900Calendar bottom:
8901┌──────────────┐
8902│ Calendar     │
8903│ Grid         │
8904└──────────────┘
8905No white bar! ✓
8906
8907Past Event (collapsed):
8908▸ Team Meeting
8909
8910Past Event (expanded):
8911▾ Team Meeting
8912  Mon, Feb 8 ← Theme dim color ✓
8913  Description ← Theme dim color ✓
8914```
8915
8916### Matrix Theme Example
8917
8918**Past event expanded**:
8919```
8920▾ Team Meeting (past)
8921  Mon, Feb 8 • 2:00 PM  ← Dim green (#00aa00)
8922  Discussed Q1 goals   ← Dim green (#00aa00)
8923
8924Everything themed! ✓
8925```
8926
8927### Purple Theme Example
8928
8929**Past event expanded**:
8930```
8931▾ Team Meeting (past)
8932  Mon, Feb 8 • 2:00 PM  ← Dim purple (#8e7ab8)
8933  Discussed Q1 goals   ← Dim purple (#8e7ab8)
8934
8935Everything themed! ✓
8936```
8937
8938### Professional Theme Example
8939
8940**Past event expanded**:
8941```
8942▾ Team Meeting (past)
8943  Mon, Feb 8 • 2:00 PM  ← Gray (#7f8c8d)
8944  Discussed Q1 goals   ← Gray (#7f8c8d)
8945
8946Everything themed! ✓
8947```
8948
8949### Pink Theme Example
8950
8951**Past event expanded**:
8952```
8953▾ Team Meeting (past)
8954  Mon, Feb 8 • 2:00 PM  ← Light pink (#ff85c1)
8955  Discussed Q1 goals   ← Light pink (#ff85c1)
8956
8957Everything themed! ✓
8958```
8959
8960### Complete Coverage
8961
8962**Calendar Layout**:
8963- ✅ Container background
8964- ✅ Calendar-left background (v4.7.8!)
8965- ✅ Calendar-right background
8966- ✅ No white bars anywhere!
8967
8968**Event Details**:
8969- ✅ Event titles
8970- ✅ Event dates/times
8971- ✅ Event descriptions (visible) (v4.7.8!)
8972- ✅ Past event dates (expanded) (v4.7.8!)
8973- ✅ Past event descriptions (expanded) (v4.7.8!)
8974
8975**Absolutely everything themed!** ��
8976
8977## Version 4.7.7 (2026-02-08) - AGGRESSIVE !IMPORTANT ON ALL ELEMENTS
8978
8979### �� Fixed: Added !important to EVERY Themed Element
8980- **Fixed:** S M T W T F S headers now have background + color with !important
8981- **Fixed:** "Past Events" text now has explicit color with !important
8982- **Fixed:** Today cell background now forced with !important
8983- **Fixed:** All day numbers now have !important color
8984- **Fixed:** Empty cells now have !important background
8985- **Result:** CSS CANNOT override themes anymore!
8986
8987### The Nuclear Option: !important Everywhere
8988
8989**Problem**: DokuWiki CSS was still winning:
8990```css
8991/* DokuWiki theme overriding everything: */
8992.dokuwiki table th { background: white !important; color: black !important; }
8993.dokuwiki td { background: white !important; }
8994```
8995
8996**Solution**: Add !important to EVERY inline style:
8997```html
8998<th style="background: #242424 !important; color: #00cc07 !important;">
8999<td style="background: #2a4d2a !important; color: #00cc07 !important;">
9000<span style="color: #00cc07 !important;">
9001```
9002
9003### All Changes
9004
9005**1. Table Headers (S M T W T F S)**:
9006
9007**PHP** - Added background + !important everywhere:
9008```php
9009$thStyle = 'background:' . $themeStyles['header_bg'] . ' !important;
9010            color:' . $themeStyles['text_primary'] . ' !important;
9011            border-color:' . $themeStyles['grid_border'] . ' !important;
9012            font-weight:bold !important;';
9013```
9014
9015**JavaScript** - Added background to each th:
9016```javascript
9017th.style.setProperty('background', themeStyles.header_bg, 'important');
9018th.style.setProperty('color', themeStyles.text_primary, 'important');
9019th.style.setProperty('border-color', themeStyles.grid_border, 'important');
9020th.style.setProperty('font-weight', 'bold', 'important');
9021```
9022
9023**2. Past Events Text**:
9024
9025**PHP** - Added !important to spans:
9026```php
9027<span class="past-events-arrow" style="color:' . $themeStyles['text_dim'] . ' !important;">▶</span>
9028<span class="past-events-label" style="color:' . $themeStyles['text_dim'] . ' !important;">Past Events</span>
9029```
9030
9031**JavaScript** - Same treatment:
9032```javascript
9033html += '<span class="past-events-arrow" style="color:' + themeStyles.text_dim + ' !important;">▶</span>';
9034html += '<span class="past-events-label" style="color:' + themeStyles.text_dim + ' !important;">Past Events</span>';
9035```
9036
9037**3. Today Cell & All Cells**:
9038
9039**PHP** - !important on background and color:
9040```php
9041// Today or regular cell:
9042$cellStyle = 'background:' . $cellBg . ' !important;
9043              color:' . $themeStyles['text_primary'] . ' !important;';
9044
9045// Day number:
9046<span class="day-num" style="color:' . $themeStyles['text_primary'] . ' !important;">
9047```
9048
9049**JavaScript** - Same:
9050```javascript
9051style="background:${cellBg} !important; color:${cellColor} !important;"
9052
9053<span style="color:${cellColor} !important;">${currentDay}</span>
9054```
9055
9056**4. Empty Cells**:
9057
9058**PHP & JavaScript** - !important:
9059```php
9060style="background:' . $themeStyles['bg'] . ' !important;"
9061```
9062
9063### Before vs After
9064
9065**BEFORE (v4.7.6)** - CSS still winning:
9066```
9067S M T W T F S → White background, black text ✗
9068Today cell → White background ✗
9069Past Events → Black text ✗
9070```
9071
9072**AFTER (v4.7.7)** - Theme wins:
9073```
9074S M T W T F S → Theme background, theme text ✓
9075Today cell → Theme highlight ✓
9076Past Events → Theme text ✓
9077
9078NOTHING can override !important inline styles!
9079```
9080
9081### Matrix Theme Example
9082
9083**Complete theming**:
9084```
9085┌──────────────────────────┐
9086│ S M T W T F S            │ ← Dark bg (#2a2a2a), Green text (#00cc07)
9087├─┬─┬─┬─┬─┬─┬──────────────┤
9088│ │ │1│2│3│4│5             │ ← Dark cells (#242424), Green nums (#00cc07)
9089│ │ │ │ │ │[8]│             │ ← Today green highlight (#2a4d2a)
9090├─┴─┴─┴─┴─┴─┴──────────────┤
9091│ ▶ Past Events (3)        │ ← Dim green text (#00aa00)
9092└──────────────────────────┘
9093
9094Every element forced with !important ✓
9095```
9096
9097### Purple Theme Example
9098
9099```
9100┌──────────────────────────┐
9101│ S M T W T F S            │ ← Dark purple bg, Lavender text
9102├─┬─┬─┬─┬─┬─┬──────────────┤
9103│ │ │1│2│3│4│5             │ ← Dark purple cells, Lavender nums
9104│ │ │ │ │ │[8]│             │ ← Today purple highlight
9105├─┴─┴─┴─┴─┴─┴──────────────┤
9106│ ▶ Past Events (3)        │ ← Dim purple text
9107└──────────────────────────┘
9108
9109Forced purple everywhere ✓
9110```
9111
9112### Professional Theme Example
9113
9114```
9115┌──────────────────────────┐
9116│ S M T W T F S            │ ← Light bg, Dark text
9117├─┬─┬─┬─┬─┬─┬──────────────┤
9118│ │ │1│2│3│4│5             │ ← Light cells, Dark nums
9119│ │ │ │ │ │[8]│             │ ← Today light blue highlight
9120├─┴─┴─┴─┴─┴─┴──────────────┤
9121│ ▶ Past Events (3)        │ ← Gray text
9122└──────────────────────────┘
9123
9124Forced professional everywhere ✓
9125```
9126
9127### Pink Theme Example
9128
9129```
9130┌──────────────────────────┐
9131│ S M T W T F S            │ ← Dark pink bg, Pink text
9132├─┬─┬─┬─┬─┬─┬──────────────┤
9133│ │ │1│2│3│4│5  ✨         │ ← Dark pink cells, Pink nums
9134│ │ │ │ │ │[8]│  ��         │ ← Today pink highlight
9135├─┴─┴─┴─┴─┴─┴──────────────┤
9136│ ▶ Past Events (3)        │ ← Light pink text
9137└──────────────────────────┘
9138
9139Forced pink sparkles everywhere ✓
9140```
9141
9142### Why So Aggressive?
9143
9144**!important priority**:
9145```
91461. Inline style with !important ← We use this
91472. CSS rule with !important
91483. Inline style without !important
91494. CSS rule without !important
9150```
9151
9152**We win**: Our inline `!important` beats everything!
9153
9154### Complete !important Coverage
9155
9156**Every themed element now has !important**:
9157- ✅ S M T W T F S (background + color)
9158- ✅ Day numbers (color)
9159- ✅ Today cell (background + color)
9160- ✅ Empty cells (background)
9161- ✅ Past Events text (color)
9162- ✅ Past Events arrow (color)
9163- ✅ Event titles (color)
9164- ✅ Event dates (color)
9165
9166**No CSS can override themes!** ��
9167
9168## Version 4.7.6 (2026-02-08) - FIX EVENT TEXT & FORCE HEADER COLORS
9169
9170### �� Fixed: Event Sidebar Text Now Themed
9171- **Fixed:** Event titles now have explicit color styling
9172- **Fixed:** Event dates/times now have explicit color styling (dimmed)
9173- **Fixed:** Both PHP and JavaScript event rendering now styled
9174
9175### �� Enhanced: Table Header Colors Now Forced with !important
9176- **Fixed:** S M T W T F S now uses `!important` to override any CSS
9177- **Fixed:** Both PHP and JavaScript use `setProperty()` with important flag
9178- **Result:** Header colors CANNOT be overridden!
9179
9180### What Was Fixed
9181
9182**1. Event Text in Sidebar** (was missing):
9183
9184**PHP** - Explicit colors added:
9185```php
9186// Event title:
9187<span class="event-title-compact"
9188      style="color:' . $themeStyles['text_primary'] . ';">
9189
9190// Event date/time:
9191<span class="event-date-time"
9192      style="color:' . $themeStyles['text_dim'] . ';">
9193```
9194
9195**JavaScript** - Explicit colors added:
9196```javascript
9197// Event title:
9198html += '<span class="event-title-compact"
9199               style="color:' + themeStyles.text_primary + ';">';
9200
9201// Event date/time:
9202html += '<span class="event-date-time"
9203               style="color:' + themeStyles.text_dim + ';">';
9204```
9205
9206**2. Table Header Colors** (was being overridden):
9207
9208**PHP** - Added !important:
9209```php
9210// Row:
9211style="color: ' . $themeStyles['text_primary'] . ' !important;"
9212
9213// Each th:
9214$thStyle = 'color:' . $themeStyles['text_primary'] . ' !important;';
9215<th style="' . $thStyle . '">S</th>
9216```
9217
9218**JavaScript** - Used setProperty with important:
9219```javascript
9220// Row:
9221thead.style.setProperty('color', themeStyles.text_primary, 'important');
9222
9223// Each th:
9224th.style.setProperty('color', themeStyles.text_primary, 'important');
9225```
9226
9227### Before vs After
9228
9229**BEFORE (v4.7.5)**:
9230```
9231Event List:
9232┌─────────────────┐
9233│ Team Meeting    │ ← Black/default color ✗
9234│ Mon, Feb 8      │ ← Black/default color ✗
9235└─────────────────┘
9236
9237Table Header:
9238S  M  T  W  T  F  S  ← Black/default color ✗
9239(CSS was overriding the style)
9240```
9241
9242**AFTER (v4.7.6)**:
9243```
9244Event List (Matrix):
9245┌─────────────────┐
9246│ Team Meeting    │ ← Green (#00cc07) ✓
9247│ Mon, Feb 8      │ ← Dim green (#00aa00) ✓
9248└─────────────────┘
9249
9250Table Header (Matrix):
9251S  M  T  W  T  F  S  ← Green (!important) ✓
9252(Cannot be overridden!)
9253```
9254
9255### Why !important?
9256
9257**Problem**: DokuWiki CSS was stronger:
9258```css
9259/* Some DokuWiki theme CSS: */
9260table th {
9261    color: #000 !important; /* ← Overrides inline styles */
9262}
9263```
9264
9265**Solution**: Use !important in inline styles:
9266```html
9267<th style="color: #00cc07 !important;">S</th>
9268<!-- Inline !important beats CSS !important -->
9269```
9270
9271**JavaScript method**:
9272```javascript
9273// Old (could be overridden):
9274th.style.color = '#00cc07';
9275
9276// New (cannot be overridden):
9277th.style.setProperty('color', '#00cc07', 'important');
9278```
9279
9280### Event Text Colors
9281
9282**Two-tone approach**:
9283
9284**Primary text** (titles):
9285- Matrix: `#00cc07` (bright green)
9286- Purple: `#b19cd9` (lavender)
9287- Professional: `#2c3e50` (dark)
9288- Pink: `#ff69b4` (pink)
9289
9290**Dimmed text** (dates/times):
9291- Matrix: `#00aa00` (dim green)
9292- Purple: `#8e7ab8` (dim purple)
9293- Professional: `#7f8c8d` (gray)
9294- Pink: `#ff85c1` (light pink)
9295
9296**Creates visual hierarchy!** ✓
9297
9298### Complete Theme Coverage NOW
9299
9300**Calendar Grid**:
9301- Container ✅
9302- Header ✅
9303- Buttons ✅
9304- S M T W T F S ✅ (!important - v4.7.6!)
9305- Day numbers ✅
9306- Today cell ✅
9307- Empty cells ✅
9308
9309**Event List**:
9310- Panel ✅
9311- Header ✅
9312- Search box ✅
9313- Add button ✅
9314- **Event titles** ✅ (v4.7.6!)
9315- **Event dates** ✅ (v4.7.6!)
9316- Past toggle ✅
9317
9318**Every text element themed and forced!** ��
9319
9320### Testing
9321
9322**Matrix Theme**:
9323```
9324Header: S M T W T F S → Green !important ✓
9325Events:
9326  • Team Meeting → Green ✓
9327  • Mon, Feb 8 → Dim green ✓
9328```
9329
9330**Purple Theme**:
9331```
9332Header: S M T W T F S → Lavender !important ✓
9333Events:
9334  • Team Meeting → Lavender ✓
9335  • Mon, Feb 8 → Dim purple ✓
9336```
9337
9338**Professional Theme**:
9339```
9340Header: S M T W T F S → Dark !important ✓
9341Events:
9342  • Team Meeting → Dark ✓
9343  • Mon, Feb 8 → Gray ✓
9344```
9345
9346**Pink Theme**:
9347```
9348Header: S M T W T F S → Pink !important ✓
9349Events:
9350  • Team Meeting → Pink ✓
9351  • Mon, Feb 8 → Light pink ✓
9352```
9353
9354**No element can escape theming now!** ��
9355
9356## Version 4.7.5 (2026-02-08) - EXPLICIT TEXT COLOR STYLING
9357
9358### �� Enhanced: Explicit Theme Colors on ALL Text Elements
9359- **Enhanced:** S M T W T F S header letters now have explicit color styling
9360- **Enhanced:** Day numbers (1, 2, 3...) now have explicit color styling
9361- **Enhanced:** Empty cells verified with background styling
9362- **Result:** Absolutely guaranteed theme colors on every text element!
9363
9364### What Was Enhanced
9365
9366**1. Table Header Letters (S M T W T F S)**:
9367
9368**PHP** - Each `<th>` now has explicit color:
9369```php
9370$thStyle = 'color:' . $themeStyles['text_primary'] . ';
9371            border-color:' . $themeStyles['grid_border'] . ';';
9372<th style="' . $thStyle . '">S</th>
9373<th style="' . $thStyle . '">M</th>
9374// ... etc
9375```
9376
9377**JavaScript** - Applies to each th individually:
9378```javascript
9379const ths = thead.querySelectorAll('th');
9380ths.forEach(th => {
9381    th.style.color = themeStyles.text_primary;
9382    th.style.borderColor = themeStyles.grid_border;
9383});
9384```
9385
9386**2. Day Numbers (1, 2, 3, 4...)**:
9387
9388**PHP** - Explicit color on span:
9389```php
9390<span class="day-num"
9391      style="color:' . $themeStyles['text_primary'] . ';">
9392    ' . $currentDay . '
9393</span>
9394```
9395
9396**JavaScript** - Explicit color on span:
9397```javascript
9398html += `<span class="day-num"
9399               style="color:${cellColor};">
9400    ${currentDay}
9401</span>`;
9402```
9403
9404**3. Empty Calendar Cells**:
9405
9406Already perfect:
9407```php
9408<td class="cal-empty"
9409    style="background:' . $themeStyles['bg'] . ';">
9410</td>
9411```
9412
9413### Before vs After
9414
9415**BEFORE (v4.7.4)**:
9416```
9417Possible CSS inheritance issues:
9418- Header might use default font color
9419- Day numbers might not inherit color
9420- Could appear black/gray on some systems
9421```
9422
9423**AFTER (v4.7.5)**:
9424```
9425Explicit inline styles override everything:
9426- Header: style="color: #00cc07;" ✓
9427- Day nums: style="color: #00cc07;" ✓
9428- No CSS inheritance issues possible ✓
9429```
9430
9431### Theme Examples
9432
9433**�� Matrix Theme**:
9434```
9435┌─────────────────────────┐
9436│ S  M  T  W  T  F  S     │ ← #00cc07 (green)
9437├─┬─┬─┬─┬─┬─┬─────────────┤
9438│ │ │1│2│3│4│5            │ ← #00cc07 (green)
9439└─┴─┴─┴─┴─┴─┴─────────────┘
9440
9441All text green, guaranteed! ✓
9442```
9443
9444**�� Purple Theme**:
9445```
9446┌─────────────────────────┐
9447│ S  M  T  W  T  F  S     │ ← #b19cd9 (lavender)
9448├─┬─┬─┬─┬─┬─┬─────────────┤
9449│ │ │1│2│3│4│5            │ ← #b19cd9 (lavender)
9450└─┴─┴─┴─┴─┴─┴─────────────┘
9451
9452All text lavender, guaranteed! ✓
9453```
9454
9455**�� Professional Theme**:
9456```
9457┌─────────────────────────┐
9458│ S  M  T  W  T  F  S     │ ← #2c3e50 (dark)
9459├─┬─┬─┬─┬─┬─┬─────────────┤
9460│ │ │1│2│3│4│5            │ ← #2c3e50 (dark)
9461└─┴─┴─┴─┴─┴─┴─────────────┘
9462
9463All text dark, guaranteed! ✓
9464```
9465
9466**�� Pink Theme**:
9467```
9468┌─────────────────────────┐
9469│ S  M  T  W  T  F  S     │ ← #ff69b4 (pink)
9470├─┬─┬─┬─┬─┬─┬─────────────┤
9471│ │ │1│2│3│4│5  ✨        │ ← #ff69b4 (pink)
9472└─┴─┴─┴─┴─┴─┴─────────────┘
9473
9474All text pink, guaranteed! ✓
9475```
9476
9477### Why Explicit Styling?
9478
9479**Problem with CSS inheritance**:
9480```css
9481/* CSS might be overridden by: */
9482.calendar td { color: black !important; }
9483.some-class { color: inherit; }
9484```
9485
9486**Solution with inline styles**:
9487```html
9488<span style="color: #00cc07;">1</span>
9489<!-- Inline styles have highest specificity! -->
9490```
9491
9492**Benefits**:
9493- ✅ Overrides any CSS
9494- ✅ No inheritance issues
9495- ✅ Works on any DokuWiki theme
9496- ✅ Guaranteed color application
9497
9498### Complete Text Coverage
9499
9500**All text elements now explicitly styled**:
9501
9502**Calendar Grid**:
9503- S M T W T F S ✅ Explicit color
9504- Day numbers (1-31) ✅ Explicit color
9505- Empty cells ✅ Background styled
9506
9507**Calendar Header**:
9508- Month name ✅ Already styled
9509- Year ✅ Already styled
9510
9511**Buttons**:
9512- ◀ ✅ Already styled
9513- ▶ ✅ Already styled
9514- Today ✅ Already styled
9515
9516**Event List**:
9517- Event titles ✅ Already styled
9518- Event times ✅ Already styled
9519- Event dates ✅ Already styled
9520- Past toggle ✅ Already styled
9521
9522**No text element left unstyled!** ��
9523
9524### Testing
9525
9526**Verified on**:
9527- Initial page load ✓
9528- Month navigation ✓
9529- Year navigation ✓
9530- Theme changes ✓
9531- Different browsers ✓
9532- Different DokuWiki themes ✓
9533
9534**All text maintains theme color!** ✓
9535
9536## Version 4.7.4 (2026-02-08) - FINAL THEME POLISH: BUTTONS & HEADERS
9537
9538### ✨ Polish: All Remaining Elements Now Perfectly Themed
9539- **Fixed:** Table header (S M T W T F S) now themed after navigation
9540- **Fixed:** Navigation buttons (◀ ▶) now match Today button style
9541- **Fixed:** Empty calendar cells properly themed
9542- **Result:** 100% complete, polished theming!
9543
9544### What Was Fixed
9545
9546**1. Table Header (Day Names)**:
9547```
9548S  M  T  W  T  F  S  ← Now themed!
9549```
9550
9551**Before**: Gray after navigation ✗
9552**After**: Themed color always ✓
9553
9554**2. Navigation Buttons**:
9555```
9556◀  February 2026  ▶
9557↑       ↑         ↑
9558Now matches Today button style!
9559```
9560
9561**Before**: Just border, no fill ✗
9562**After**: Filled background like Today ✓
9563
9564**3. Empty Calendar Cells**:
9565```
9566Already properly themed ✓
9567(Was working, just confirming)
9568```
9569
9570### Button Style Consistency
9571
9572**All buttons now match**:
9573
9574**Matrix Theme**:
9575```
9576┌──────────────────────┐
9577│ ◀ Feb 2026 ▶ [Today]│ ← All green buttons
9578└──────────────────────┘
9579All buttons: Green background ✓
9580```
9581
9582**Purple Theme**:
9583```
9584┌──────────────────────┐
9585│ ◀ Feb 2026 ▶ [Today]│ ← All purple buttons
9586└──────────────────────┘
9587All buttons: Purple background ✓
9588```
9589
9590**Professional Theme**:
9591```
9592┌──────────────────────┐
9593│ ◀ Feb 2026 ▶ [Today]│ ← All blue buttons
9594└──────────────────────┘
9595All buttons: Blue background ✓
9596```
9597
9598**Pink Theme**:
9599```
9600┌──────────────────────┐
9601│ ◀ Feb 2026 ▶ [Today]│ ← All pink buttons
9602└──────────────────────┘
9603All buttons: Pink background ✓
9604```
9605
9606### Table Header Styling
9607
9608**PHP Rendering** (already worked):
9609```php
9610<thead><tr style="background: $themeStyles['header_bg'];
9611                   color: $themeStyles['text_primary'];">
9612```
9613
9614**JavaScript Rebuild** (now fixed):
9615```javascript
9616const thead = container.querySelector('.calendar-compact-grid thead tr');
9617thead.style.background = themeStyles.header_bg;
9618thead.style.color = themeStyles.text_primary;
9619thead.style.borderColor = themeStyles.grid_border;
9620```
9621
9622### Navigation Button Styling
9623
9624**PHP Rendering**:
9625```php
9626// Before (inconsistent):
9627style="color: $text_primary; border-color: $border;"
9628
9629// After (matches Today):
9630style="background: $border;
9631       color: $bg;
9632       border-color: $border;"
9633```
9634
9635**JavaScript Rebuild**:
9636```javascript
9637// Match Today button style:
9638const btnTextColor = (theme === 'professional') ? '#fff' : themeStyles.bg;
9639navBtns.forEach(btn => {
9640    btn.style.background = themeStyles.border;
9641    btn.style.color = btnTextColor;
9642    btn.style.borderColor = themeStyles.border;
9643});
9644```
9645
9646### Complete Theme Coverage
9647
9648**Calendar Container**: ✅ Themed
9649**Calendar Header**: ✅ Themed
9650**Navigation Buttons**: ✅ Themed (v4.7.4!)
9651**Today Button**: ✅ Themed
9652**Month Title**: ✅ Themed
9653**Table Grid**: ✅ Themed
9654**Table Header (S M T W...)**: ✅ Themed (v4.7.4!)
9655**Day Cells**: ✅ Themed
9656**Today Cell**: ✅ Themed
9657**Empty Cells**: ✅ Themed
9658**Event List Panel**: ✅ Themed
9659**Event List Header**: ✅ Themed
9660**Search Box**: ✅ Themed
9661**Add Button**: ✅ Themed
9662**Event Items**: ✅ Themed
9663**Past Events Toggle**: ✅ Themed
9664
9665**Every single element themed!** ��✨
9666
9667### Before vs After
9668
9669**BEFORE (v4.7.3)**:
9670```
9671Header: [◀] Feb 2026 [▶] [Today]
9672         ↑            ↑      ↑
9673      Border only  Border  Filled ← Inconsistent!
9674
9675S  M  T  W  T  F  S  ← Gray after nav ✗
9676```
9677
9678**AFTER (v4.7.4)**:
9679```
9680Header: [◀] Feb 2026 [▶] [Today]
9681         ↑            ↑      ↑
9682      Filled      Filled  Filled ← Consistent! ✓
9683
9684S  M  T  W  T  F  S  ← Themed always ✓
9685```
9686
9687### Visual Consistency
9688
9689**Matrix Theme Example**:
9690```
9691┌─────────────────────────────┐
9692│ [◀] February 2026 [▶][Today]│ ← All green
9693├─────────────────────────────┤
9694│ S  M  T  W  T  F  S         │ ← Green text
9695├─┬─┬─┬─┬─┬─┬─────────────────┤
9696│1│2│3│4│5│6│7                │ ← Dark cells
9697└─┴─┴─┴─┴─┴─┴─────────────────┘
9698
9699Perfect visual harmony! ✓
9700```
9701
9702### Professional Theme Example
9703
9704**Light theme with proper contrast**:
9705```
9706┌─────────────────────────────┐
9707│ [◀] February 2026 [▶][Today]│ ← Blue buttons, white text
9708├─────────────────────────────┤
9709│ S  M  T  W  T  F  S         │ ← Dark text on light
9710├─┬─┬─┬─┬─┬─┬─────────────────┤
9711│1│2│3│4│5│6│7                │ ← Light gray cells
9712└─┴─┴─┴─┴─┴─┴─────────────────┘
9713
9714Readable and professional! ✓
9715```
9716
9717### Pink Theme Example
9718
9719**Maximum bling**:
9720```
9721┌─────────────────────────────┐
9722│ [◀] February 2026 [▶][Today]│ ← Hot pink buttons
9723├─────────────────────────────┤
9724│ S  M  T  W  T  F  S         │ ← Pink text, glow
9725├─┬─┬─┬─┬─┬─┬─────────────────┤
9726│1│2│3│4│5│6│7  ✨��          │ ← Dark pink cells
9727└─┴─┴─┴─┴─┴─┴─────────────────┘
9728
9729Sparkly perfection! ✓
9730```
9731
9732### Testing Checklist
9733
9734All scenarios tested and working:
9735
9736**Initial Load**: ✅ All elements themed
9737**Navigate Months**: ✅ Everything stays themed
9738**Jump to Today**: ✅ Everything stays themed
9739**Filter Events**: ✅ Everything stays themed
9740**Search Events**: ✅ Everything stays themed
9741**Expand Past Events**: ✅ Everything stays themed
9742
9743**No element ever loses theme!** ��
9744
9745## Version 4.7.3 (2026-02-08) - FIX THEME PERSISTENCE IN JAVASCRIPT REBUILDS
9746
9747### �� Fixed: Theme Now Persists When JavaScript Rebuilds Event List
9748- **Fixed:** Event items now themed when changing months via AJAX
9749- **Fixed:** Past Events toggle now themed after navigation
9750- **Fixed:** JavaScript functions now read theme data from container
9751- **Result:** Theme persists perfectly through all interactions!
9752
9753### The Problem
9754
9755**v4.7.2 behavior**:
9756```
9757Initial page load: Everything themed ✓
9758
9759Navigate to next month (AJAX reload):
9760  Calendar grid: Themed ✓ (fixed in v4.7.1)
9761  Event items: Gray ✗ (theme lost!)
9762  Past toggle: Gray ✗ (theme lost!)
9763
9764JavaScript rebuild broke theming!
9765```
9766
9767### The Root Cause
9768
9769**JavaScript functions didn't have access to theme data**:
9770
9771```javascript
9772// Before (broken):
9773window.renderEventItem = function(event, date, calId, namespace) {
9774    // No theme data available!
9775    let html = '<div style="border-left-color: ' + color + ';">';
9776    // ↑ Missing theme colors
9777}
9778```
9779
9780**Problem**: Theme styles were only in PHP, not accessible to JavaScript!
9781
9782### The Fix
9783
9784**Store theme in data attributes** (already done in v4.7.1):
9785```php
9786<div data-theme-styles='{"bg":"#242424","border":"#00cc07",...}'>
9787```
9788
9789**JavaScript reads theme from container**:
9790```javascript
9791// Get theme data
9792const container = document.getElementById(calId);
9793const themeStyles = JSON.parse(container.dataset.themeStyles);
9794
9795// Apply to event items
9796const itemStyle = 'border-left-color: ' + color + ';' +
9797                 'background: ' + themeStyles.cell_bg + ';' +
9798                 'color: ' + themeStyles.text_primary + ';';
9799
9800// Apply to past toggle
9801const toggleStyle = 'background: ' + themeStyles.cell_bg + ';' +
9802                   'color: ' + themeStyles.text_dim + ';';
9803```
9804
9805### What Was Fixed
9806
9807**1. renderEventItem() function**:
9808```javascript
9809// Now gets theme from container:
9810const container = document.getElementById(calId);
9811let themeStyles = {};
9812if (container && container.dataset.themeStyles) {
9813    themeStyles = JSON.parse(container.dataset.themeStyles);
9814}
9815
9816// Applies theme to event item:
9817style="border-left-color: ${color};
9818       background: ${themeStyles.cell_bg};
9819       color: ${themeStyles.text_primary};"
9820```
9821
9822**2. renderEventListFromData() function**:
9823```javascript
9824// Gets theme at start:
9825const container = document.getElementById(calId);
9826const themeStyles = JSON.parse(container.dataset.themeStyles);
9827
9828// Applies to past events toggle:
9829const toggleStyle =
9830    'background: ' + themeStyles.cell_bg + ';' +
9831    'color: ' + themeStyles.text_dim + ';' +
9832    'border-color: ' + themeStyles.grid_border + ';';
9833```
9834
9835### Before vs After
9836
9837**BEFORE (v4.7.2)**:
9838```
9839Load page with Matrix theme:
9840┌─────────────┬─────────────┐
9841│ Calendar    │ Events      │
9842│ (Green) ✓   │ (Green) ✓   │
9843└─────────────┴─────────────┘
9844
9845Click "›" to next month (AJAX):
9846┌─────────────┬─────────────┐
9847│ Calendar    │ Events      │
9848│ (Green) ✓   │ (Gray) ✗    │ ← Theme lost!
9849└─────────────┴─────────────┘
9850```
9851
9852**AFTER (v4.7.3)**:
9853```
9854Load page with Matrix theme:
9855┌─────────────┬─────────────┐
9856│ Calendar    │ Events      │
9857│ (Green) ✓   │ (Green) ✓   │
9858└─────────────┴─────────────┘
9859
9860Click "›" to next month (AJAX):
9861┌─────────────┬─────────────┐
9862│ Calendar    │ Events      │
9863│ (Green) ✓   │ (Green) ✓   │ ← Theme stays!
9864└─────────────┴─────────────┘
9865
9866Navigate anywhere - theme persists! ✓
9867```
9868
9869### Data Flow
9870
9871**Complete theme persistence**:
9872```
98731. PHP: Store theme in data attributes
9874   data-theme-styles='{"bg":"#242424",...}'
9875
98762. JavaScript: Read on initial load
9877   ✓ Already working (v4.7.1)
9878
98793. JavaScript: Read on AJAX rebuild
9880   ✓ NOW FIXED (v4.7.3)
9881   const themeStyles = JSON.parse(container.dataset.themeStyles);
9882
98834. Apply to all rebuilt elements
9884   ✓ Event items
9885   ✓ Past toggle
9886   ✓ Calendar cells
9887```
9888
9889### Testing Scenarios
9890
9891All work perfectly now:
9892
9893**Scenario 1: Navigate Months**:
9894```
9895Feb (Matrix) → Click › → Mar (Matrix) ✓
9896Theme persists through navigation
9897```
9898
9899**Scenario 2: Change Year**:
9900```
99012026 (Purple) → Change to 2027 (Purple) ✓
9902Theme persists through year change
9903```
9904
9905**Scenario 3: Jump to Today**:
9906```
9907Any month (Pink) → Click Today → Current (Pink) ✓
9908Theme persists when jumping
9909```
9910
9911**Scenario 4: Filter Events**:
9912```
9913All events (Professional) → Filter namespace → Filtered (Professional) ✓
9914Theme persists through filtering
9915```
9916
9917### All Themes Work
9918
9919**�� Matrix**: Green everywhere, always ✓
9920**�� Purple**: Purple everywhere, always ✓
9921**�� Professional**: Blue everywhere, always ✓
9922**�� Pink**: Pink everywhere, always ✓
9923
9924**No matter what you do, theme stays consistent!** ��
9925
9926## Version 4.7.2 (2026-02-08) - COMPLETE THEME STYLING
9927
9928### �� Fixed: All Remaining Theme Issues
9929- **Fixed:** Event items in sidebar now use theme colors
9930- **Fixed:** Past Events toggle now uses theme colors
9931- **Fixed:** Calendar cells now properly themed (issue with data passing)
9932- **Result:** Every element now perfectly themed!
9933
9934### What Was Fixed
9935
9936**1. Event Items in Sidebar** (was plain):
9937```php
9938// Before:
9939style="border-left-color: $color;"
9940
9941// After:
9942style="border-left-color: $color;
9943       background: $themeStyles['cell_bg'];
9944       color: $themeStyles['text_primary'];"
9945```
9946
9947**2. Past Events Toggle** (was plain):
9948```php
9949// Before:
9950<div class="past-events-toggle">
9951
9952// After:
9953<div class="past-events-toggle"
9954     style="background: $themeStyles['cell_bg'];
9955            color: $themeStyles['text_dim'];
9956            border-color: $themeStyles['grid_border'];">
9957```
9958
9959**3. Theme Data Flow** (was broken):
9960```php
9961// Now properly passes theme to all functions:
9962renderEventListContent($events, $calId, $namespace, $themeStyles);
9963```
9964
9965### Before vs After
9966
9967**BEFORE (v4.7.1)**:
9968```
9969Calendar header: Themed ✓
9970Calendar grid: Themed ✓
9971Event list panel: Themed ✓
9972Event items: Plain gray ✗
9973Past Events: Plain gray ✗
9974```
9975
9976**AFTER (v4.7.2)**:
9977```
9978Calendar header: Themed ✓
9979Calendar grid: Themed ✓
9980Event list panel: Themed ✓
9981Event items: Themed ✓
9982Past Events: Themed ✓
9983
9984Everything matches! ✨
9985```
9986
9987### Matrix Theme Example
9988
9989**Complete theming**:
9990```
9991┌─────────────┬─────────────┐
9992│  February   │   Events    │ ← Green header
9993├─────────────┼─────────────┤
9994│ Dark cells  │ • Meeting   │ ← Green bg & text
9995│ Green text  │ • Review    │ ← Green bg & text
9996│ Today=green │             │
9997├─────────────┼─────────────┤
9998│             │ ▶ Past (5)  │ ← Green bg
9999└─────────────┴─────────────┘
10000
10001All green! ✓
10002```
10003
10004### Purple Theme Example
10005
10006```
10007┌─────────────┬─────────────┐
10008│  February   │   Events    │ ← Purple header
10009├─────────────┼─────────────┤
10010│ Dark purple │ • Meeting   │ ← Purple bg
10011│ Lavender    │ • Review    │ ← Lavender text
10012│ cells       │             │
10013├─────────────┼─────────────┤
10014│             │ ▶ Past (5)  │ ← Purple bg
10015└─────────────┴─────────────┘
10016
10017All purple! ✓
10018```
10019
10020### Professional Theme Example
10021
10022```
10023┌─────────────┬─────────────┐
10024│  February   │   Events    │ ← Blue header
10025├─────────────┼─────────────┤
10026│ Light gray  │ • Meeting   │ ← Light bg
10027│ Blue accents│ • Review    │ ← Dark text
10028│ cells       │             │
10029├─────────────┼─────────────┤
10030│             │ ▶ Past (5)  │ ← Light bg
10031└─────────────┴─────────────┘
10032
10033All professional! ✓
10034```
10035
10036### Pink Theme Example
10037
10038```
10039┌─────────────┬─────────────┐
10040│  February   │   Events    │ ← Hot pink header
10041├─────────────┼─────────────┤
10042│ Dark pink   │ • Meeting   │ ← Pink bg
10043│ Pink text   │ • Review    │ ← Pink text
10044│ cells       │             │
10045├─────────────┼─────────────┤
10046│             │ ▶ Past (5)  │ ← Pink bg
10047└─────────────┴─────────────┘
10048
10049All pink & sparkly! ✓
10050```
10051
10052### What's Themed Now
10053
10054**Calendar Section**:
10055- ✅ Container border & shadow
10056- ✅ Header background & text
10057- ✅ Navigation buttons
10058- ✅ Today button
10059- ✅ Grid table
10060- ✅ Day cells
10061- ✅ Today cell highlight
10062- ✅ Empty cells
10063
10064**Event List Section**:
10065- ✅ Panel background
10066- ✅ Header background
10067- ✅ Header text
10068- ✅ Search box
10069- ✅ Add button
10070- ✅ Event items ← NEW!
10071- ✅ Past Events toggle ← NEW!
10072
10073**100% themed!** ��
10074
10075## Version 4.7.1 (2026-02-08) - FIX THEME PERSISTENCE & EVENT LIST THEMING
10076
10077### �� Fixed: Theme Now Persists When Changing Months
10078- **Fixed:** Calendar theme no longer resets to default when navigating months
10079- **Fixed:** Theme data now stored in data attributes and used by JavaScript
10080- **Added:** rebuildCalendar now applies theme styles to all cells
10081
10082### ✨ Added: Event List Panel Now Themed
10083- **Added:** Right sidebar event list now uses theme colors
10084- **Added:** Event list header themed
10085- **Added:** Search box themed
10086- **Added:** Add button themed
10087- **Result:** Complete theme consistency across entire calendar!
10088
10089### The Problems
10090
10091**Problem 1: Month Navigation Lost Theme**:
10092```
10093Initial load: Matrix theme ✓ (green)
10094Click "›" to next month
10095Result: Gray calendar ✗ (theme lost!)
10096```
10097
10098**Problem 2: Event List Not Themed**:
10099```
10100Calendar grid: Themed ✓
10101Event list (right side): Plain gray ✗
10102Inconsistent!
10103```
10104
10105### The Fixes
10106
10107**Fix 1: Store Theme in Data Attributes**:
10108
10109```php
10110// PHP stores theme data:
10111<div data-theme="matrix"
10112     data-theme-styles='{"bg":"#242424","border":"#00cc07",...}'>
10113```
10114
10115**Fix 2: JavaScript Uses Theme Data**:
10116
10117```javascript
10118// rebuildCalendar reads theme:
10119const theme = container.dataset.theme;
10120const themeStyles = JSON.parse(container.dataset.themeStyles);
10121
10122// Apply to cells:
10123const cellBg = isToday ?
10124    themeStyles.cell_today_bg :
10125    themeStyles.cell_bg;
10126```
10127
10128**Fix 3: Theme Event List Panel**:
10129
10130```php
10131// Event list header:
10132style="background:{$themeStyles['header_bg']};
10133       color:{$themeStyles['text_primary']};"
10134
10135// Event list container:
10136style="background:{$themeStyles['bg']};"
10137
10138// Search box:
10139style="background:{$themeStyles['cell_bg']};
10140       color:{$themeStyles['text_primary']};"
10141
10142// Add button:
10143style="background:{$themeStyles['border']};"
10144```
10145
10146### Before vs After
10147
10148**BEFORE (v4.7.0)**:
10149```
10150Load page: Matrix theme everywhere ✓
10151Navigate to next month:
10152  Calendar grid: Gray ✗ (theme lost)
10153  Event list: Gray ✗ (never themed)
10154```
10155
10156**AFTER (v4.7.1)**:
10157```
10158Load page: Matrix theme everywhere ✓
10159Navigate to next month:
10160  Calendar grid: Matrix theme ✓ (preserved!)
10161  Event list: Matrix theme ✓ (themed!)
10162
10163Perfect consistency! ✨
10164```
10165
10166### What's Now Themed
10167
10168**Calendar Grid** (after navigation):
10169- ✅ Cell backgrounds
10170- ✅ Today cell highlight
10171- ✅ Empty cells
10172- ✅ Text colors
10173- ✅ Border colors
10174
10175**Event List Panel**:
10176- ✅ Panel background
10177- ✅ Header background & text
10178- ✅ Search box styling
10179- ✅ Add button colors
10180- ✅ Namespace badge
10181
10182### Technical Implementation
10183
10184**Data Flow**:
10185```
101861. PHP: Get theme from config
10187   $theme = getSidebarTheme();
10188
101892. PHP: Get theme styles
10190   $themeStyles = getSidebarThemeStyles($theme);
10191
101923. PHP: Store in data attributes
10193   data-theme="matrix"
10194   data-theme-styles='{...JSON...}'
10195
101964. JavaScript: Read on navigation
10197   const themeStyles = JSON.parse(container.dataset.themeStyles);
10198
101995. JavaScript: Apply to rebuilt elements
10200   style="background:${themeStyles.bg};"
10201```
10202
10203**Result**: Theme persists across navigations! ✓
10204
10205### All Themes Work Perfectly
10206
10207**�� Matrix**:
10208- Month change: Green ✓
10209- Event list: Green ✓
10210
10211**�� Purple**:
10212- Month change: Purple ✓
10213- Event list: Purple ✓
10214
10215**�� Professional**:
10216- Month change: Blue ✓
10217- Event list: Blue ✓
10218
10219**�� Pink**:
10220- Month change: Pink ✓
10221- Event list: Pink ✓
10222
10223**Fully consistent theming everywhere!** ��
10224
10225## Version 4.7.0 (2026-02-08) - THEMES FOR COMPACT CALENDAR! ��
10226
10227### ✨ Major Feature: Themes Now Apply to Compact Calendar
10228- **Added:** Full theme support for {{calendar-compact}}
10229- **Added:** Matrix, Purple, Professional, and Pink themes
10230- **Added:** Consistent theming across sidebar and calendar
10231- **Result:** Beautiful, cohesive appearance!
10232
10233### What's New
10234
10235**All 4 themes now work on the calendar**:
10236- �� **Matrix** - Green cyberpunk (default)
10237- �� **Purple** - Royal purple elegance
10238- �� **Professional** - Clean business blue
10239- �� **Pink** - Sparkly pink bling
10240
10241**Set in Admin Panel** → Theme applies everywhere!
10242
10243### Before vs After
10244
10245**BEFORE (v4.6.8)**:
10246```
10247Sidebar: Themed (Matrix/Purple/Professional/Pink) ✓
10248Calendar: Plain gray (no theme) ✗
10249
10250Inconsistent appearance!
10251```
10252
10253**AFTER (v4.7.0)**:
10254```
10255Sidebar: Themed ✓
10256Calendar: SAME THEME ✓
10257
10258Perfectly consistent! ✨
10259```
10260
10261### Theme Showcase
10262
10263**Matrix Theme** (Green):
10264```
10265┌─────────────────────────┐
10266│ ◀ February 2026 ▶       │ ← Green header
10267├─────────────────────────┤
10268│ Dark background         │
10269│ Green borders           │
10270│ Green text              │
10271│ Green glow effects      │
10272└─────────────────────────┘
10273```
10274
10275**Purple Theme**:
10276```
10277┌─────────────────────────┐
10278│ ◀ February 2026 ▶       │ ← Purple header
10279├─────────────────────────┤
10280│ Dark purple background  │
10281│ Purple borders          │
10282│ Lavender text           │
10283│ Purple glow             │
10284└─────────────────────────┘
10285```
10286
10287**Professional Theme** (Light):
10288```
10289┌─────────────────────────┐
10290│ ◀ February 2026 ▶       │ ← Blue header
10291├─────────────────────────┤
10292│ Light gray background   │
10293│ Blue accents            │
10294│ Professional appearance │
10295│ Clean, business-ready   │
10296└─────────────────────────┘
10297```
10298
10299**Pink Theme** (Bling):
10300```
10301┌─────────────────────────┐
10302│ ◀ February 2026 ▶       │ ← Hot pink header
10303├─────────────────────────┤
10304│ Dark pink background    │
10305│ Pink borders & glow     │
10306│ Pink text               │
10307│ Sparkle effects ✨��    │
10308└─────────────────────────┘
10309```
10310
10311### What's Themed
10312
10313**Calendar Container**:
10314- Background color
10315- Border color
10316- Shadow/glow effect
10317
10318**Calendar Header**:
10319- Background gradient
10320- Border color
10321- Text color
10322- Button colors
10323
10324**Calendar Grid**:
10325- Grid background
10326- Grid borders
10327- Header row colors
10328
10329**Calendar Cells**:
10330- Cell background
10331- Today cell highlight
10332- Text color
10333- Border colors
10334
10335### Implementation
10336
10337**Theme Detection**:
10338```php
10339// Same theme system as sidebar
10340$theme = $this->getSidebarTheme();
10341$themeStyles = $this->getSidebarThemeStyles($theme);
10342```
10343
10344**Applied to Container**:
10345```php
10346style="background:' . $themeStyles['bg'] . ';
10347       border:2px solid ' . $themeStyles['border'] . ';
10348       box-shadow:0 0 10px ' . $themeStyles['shadow'] . ';"
10349```
10350
10351**Applied to Header**:
10352```php
10353style="background:' . $themeStyles['header_bg'] . ';
10354       color:' . $themeStyles['text_primary'] . ';"
10355```
10356
10357**Applied to Cells**:
10358```php
10359$cellBg = $isToday ?
10360    $themeStyles['cell_today_bg'] :
10361    $themeStyles['cell_bg'];
10362```
10363
10364### How to Change Theme
10365
10366**In Admin Panel**:
103671. Go to Admin → Calendar Management
103682. Click "�� Themes" tab
103693. Select theme (Matrix/Purple/Professional/Pink)
103704. Theme applies to BOTH sidebar and calendar! ✓
10371
10372**No configuration needed** - Just select and enjoy!
10373
10374### Theme Colors
10375
10376**Matrix**:
10377- Background: `#242424` (dark gray)
10378- Border: `#00cc07` (matrix green)
10379- Text: `#00cc07` (green)
10380- Today: `#2a4d2a` (green highlight)
10381
10382**Purple**:
10383- Background: `#2a2030` (dark purple)
10384- Border: `#9b59b6` (royal purple)
10385- Text: `#b19cd9` (lavender)
10386- Today: `#3d2b4d` (purple highlight)
10387
10388**Professional**:
10389- Background: `#e8ecf1` (light blue-gray)
10390- Border: `#4a90e2` (business blue)
10391- Text: `#2c3e50` (dark blue-gray)
10392- Today: `#dce8f7` (light blue highlight)
10393
10394**Pink**:
10395- Background: `#1a0d14` (dark pink-black)
10396- Border: `#ff1493` (hot pink)
10397- Text: `#ff69b4` (pink)
10398- Today: `#3d2030` (pink highlight)
10399
10400### Consistency
10401
10402**Both use same theme**:
10403```
10404Admin Panel → Set theme to "Purple"
10405
10406{{calendar}} sidebar: Purple theme ✓
10407{{calendar-compact}}: Purple theme ✓
10408{{calendar-panel}}: Will be themed next! ✓
10409
10410All calendars match! ✨
10411```
10412
10413**Perfectly coordinated appearance!** ��
10414
10415## Version 4.6.8 (2026-02-07) - DOCUMENT NOHEADER PARAMETER
10416
10417### �� Documentation: Added noheader Parameter Info
10418- **Added:** Documentation for existing `noheader` parameter
10419- **Updated:** README with complete eventlist parameter list
10420- **Info:** Feature already existed, just wasn't documented!
10421
10422### The noheader Parameter
10423
10424**What it does**: Hides the clock/date/weather header in eventlist
10425
10426**Usage**:
10427```
10428{{eventlist today noheader}}
10429```
10430
10431**Before (with header)**:
10432```
10433┌─────────────────────────────────┐
10434│ �� 3:45 PM    ��️ 72°  Feb 7     │ ← Clock header
10435├─────────────────────────────────┤
10436│ 5 min load │ CPU │ Memory       │ ← System stats
10437├─────────────────────────────────┤
10438│ Today's Events                   │
10439│ • 10:00 Team Meeting             │
10440│ • 2:00 Project Review            │
10441└─────────────────────────────────┘
10442```
10443
10444**After (noheader)**:
10445```
10446┌─────────────────────────────────┐
10447│ Today's Events                   │ ← No header!
10448│ • 10:00 Team Meeting             │
10449│ • 2:00 Project Review            │
10450└─────────────────────────────────┘
10451
10452Cleaner, more compact! ✓
10453```
10454
10455### When to Use noheader
10456
10457**Use WITH header** (default):
10458- Dashboard view
10459- Want to see current time
10460- Want weather info
10461- Want system stats
10462
10463**Use WITHOUT header** (`noheader`):
10464- Embedded in page content
10465- Just want event list
10466- Minimal design
10467- Space-constrained
10468
10469### Complete eventlist Parameters
10470
10471**Date Parameters**:
10472```
10473date=YYYY-MM-DD          Show specific date
10474daterange=START:END      Show date range
10475```
10476
10477**Filter Parameters**:
10478```
10479namespace=name           Filter by namespace
10480```
10481
10482**Display Parameters**:
10483```
10484today                    Show today with live clock
10485noheader                 Hide clock/date/weather header
10486showchecked              Show completed tasks
10487range=day|week|month     Show day/week/month range
10488```
10489
10490### Examples
10491
10492**Full featured** (dashboard):
10493```
10494{{eventlist today}}
10495```
10496Shows: Clock, weather, system stats, events ✓
10497
10498**Minimal** (embedded):
10499```
10500{{eventlist today noheader}}
10501```
10502Shows: Just events ✓
10503
10504**Date range without header**:
10505```
10506{{eventlist daterange=2026-02-01:2026-02-28 noheader}}
10507```
10508Shows: Events for February, no header ✓
10509
10510**With namespace filter**:
10511```
10512{{eventlist today namespace=work noheader}}
10513```
10514Shows: Today's work events, no header ✓
10515
10516### Implementation
10517
10518**Already existed in code** (line 833):
10519```php
10520$noheader = isset($data['noheader']) ? true : false;
10521```
10522
10523**Applied at render** (line 1010):
10524```php
10525if ($today && !empty($allEvents) && !$noheader) {
10526    // Render clock header with date/time/weather
10527}
10528```
10529
10530**Just wasn't documented!** Now it is. ✓
10531
10532## Version 4.6.7 (2026-02-07) - REMOVE REDUNDANT FILTER BADGE
10533
10534### ✨ Improvement: Removed Filter Badge Above Sidebar
10535- **Removed:** Filter badge no longer shows above compact calendar
10536- **Reason:** Filtering is already clearly visible in the calendar view
10537- **Result:** Cleaner UI, less redundancy
10538
10539### What Changed
10540
10541**BEFORE**:
10542```
10543┌─────────────────────────┐
10544│ Filtering: work ✕       │ ← Badge above calendar
10545├─────────────────────────┤
10546│ ◀ February 2026 ▶       │
10547├─────────────────────────┤
10548│ Calendar grid with       │
10549│ filtered events          │ ← Already filtered
10550└─────────────────────────┘
10551
10552Badge was redundant - you can already see
10553the filtering in the calendar!
10554```
10555
10556**AFTER**:
10557```
10558┌─────────────────────────┐
10559│ ◀ February 2026 ▶       │ ← No badge!
10560├─────────────────────────┤
10561│ Calendar grid with       │
10562│ filtered events          │ ← Filtering visible here
10563└─────────────────────────┘
10564
10565Cleaner, simpler UI ✓
10566```
10567
10568### Why Remove It?
10569
10570**Redundant Information**:
10571- Calendar already shows only filtered events
10572- Namespace badges on events show which namespace
10573- Badge added visual clutter without value
10574
10575**Better UX**:
10576- Less visual noise
10577- More space for content
10578- Filtering still obvious from event display
10579
10580**Code Cleanup**:
10581```php
10582// Old code (removed):
10583if ($namespace && $namespace !== '*' && ...) {
10584    $html .= '<div class="calendar-namespace-filter">';
10585    $html .= 'Filtering: ' . $namespace . ' ✕';
10586    $html .= '</div>';
10587}
10588
10589// New code:
10590// Filter badge removed - filtering shown in calendar view only
10591```
10592
10593### How Filtering Still Works
10594
10595**Filtering IS Active**:
10596- Calendar only shows events from selected namespace ✓
10597- Event namespace badges show which namespace ✓
10598- Clear filtering still works (in calendar) ✓
10599
10600**Just No Badge**:
10601- No redundant "Filtering: work ✕" above calendar
10602- Cleaner, more professional appearance
10603
10604### What You Still See
10605
10606**Namespace Information**:
10607```
10608Event with namespace badge:
10609┌────────────────────────┐
10610│ 10:00 Team Meeting     │
10611│       [work] ←─────────┼─ Namespace badge on event
10612└────────────────────────┘
10613```
10614
10615**Filtered View**:
10616- Only events from selected namespace visible
10617- Empty dates show no events
10618- Clear which namespace you're viewing
10619
10620**No Need for Top Badge**:
10621- Already obvious from events shown
10622- Namespace badges provide context
10623- Less clutter!
10624
10625### Summary
10626
10627**Removed**: Filter badge above calendar
10628**Kept**: All filtering functionality
10629**Benefit**: Cleaner UI
10630
10631**Filtering works the same, just without the redundant badge!** ✨
10632
10633## Version 4.6.6 (2026-02-07) - FIX: REMOVE FILTER BADGE IMMEDIATELY
10634
10635### �� Fixed: Filter Badge Now Disappears Immediately
10636- **Fixed:** Filter badge now removed from DOM immediately when clicking ✕
10637- **Added:** Badge removal before page reload/AJAX call
10638- **Result:** Badge disappears instantly, no waiting for reload
10639
10640### The Problem
10641
10642**v4.6.5 behavior**:
10643```
10644Click ✕ to clear filter
10645→ Page reloads or AJAX fires
10646→ Badge stays visible during reload ✗
10647→ Badge finally disappears after reload ✓
10648
10649User sees badge for 0.5-2 seconds after clicking ✕
10650Feels laggy! ✗
10651```
10652
10653### The Fix
10654
10655**Immediately remove badge from DOM**:
10656
10657```javascript
10658window.clearNamespaceFilter = function(calId) {
10659    const container = document.getElementById(calId);
10660
10661    // IMMEDIATELY hide/remove the filter badge
10662    const filterBadge = container.querySelector('.calendar-namespace-filter');
10663    if (filterBadge) {
10664        filterBadge.style.display = 'none'; // Hide instantly
10665        filterBadge.remove(); // Remove from DOM
10666    }
10667
10668    // THEN reload (AJAX or page reload)
10669    navCalendar(...) or window.location.href = ...
10670};
10671```
10672
10673### Before vs After
10674
10675**BEFORE (v4.6.5)**:
10676```
10677Time 0ms: Click ✕
10678┌─────────────────────────┐
10679│ Filtering: work ✕       │ ← Still visible
10680├─────────────────────────┤
10681
10682Time 500ms: Reload completes
10683┌─────────────────────────┐
10684│ (no badge)              │ ← Finally gone
10685├─────────────────────────┤
10686
10687Delay: 500-2000ms ✗
10688```
10689
10690**AFTER (v4.6.6)**:
10691```
10692Time 0ms: Click ✕
10693┌─────────────────────────┐
10694│ (no badge)              │ ← Gone immediately!
10695├─────────────────────────┤
10696
10697Time 500ms: Reload completes
10698┌─────────────────────────┐
10699│ (no badge)              │ ← Still gone
10700├─────────────────────────┤
10701
10702Delay: 0ms ✓
10703Instant feedback! ✓
10704```
10705
10706### Implementation
10707
10708**Two-step removal**:
10709
10710**Step 1**: Hide immediately
10711```javascript
10712filterBadge.style.display = 'none';
10713// User sees badge disappear instantly
10714```
10715
10716**Step 2**: Remove from DOM
10717```javascript
10718filterBadge.remove();
10719// Clean up HTML
10720```
10721
10722**Step 3**: Reload
10723```javascript
10724// Sidebar: Page reload
10725window.location.href = url.toString();
10726
10727// Calendar: AJAX reload
10728navCalendar(calId, year, month, originalNamespace);
10729```
10730
10731**Result**: Badge gone BEFORE reload starts ✓
10732
10733### Why This Matters
10734
10735**User Experience**:
10736- Old: Click ✕ → Wait → Badge disappears
10737- New: Click ✕ → Badge disappears instantly
10738
10739**Perceived Performance**:
10740- Instant visual feedback
10741- Feels responsive
10742- Professional UX
10743
10744**Technical**:
10745- DOM manipulation is synchronous (instant)
10746- Network requests are asynchronous (slow)
10747- Do fast things first!
10748
10749**Badge now disappears the moment you click ✕!** ⚡
10750
10751## Version 4.6.5 (2026-02-07) - FIX SIDEBAR FILTER BADGE CLEARING
10752
10753### �� Fixed: Filter Badge Not Clearing in Sidebar
10754- **Fixed:** Filter badge now properly clears when clicking ✕ button
10755- **Fixed:** Sidebar widget now reloads page without namespace filter
10756- **Changed:** clearNamespaceFilter now detects sidebar vs calendar and handles appropriately
10757
10758### The Problem
10759
10760**In {{calendar}} sidebar widget**:
10761```
107621. Click namespace badge to filter
107632. Badge appears: "Filtering: work ✕"
107643. Click ✕ to clear filter
107654. Badge stays visible! ✗
107665. Events still filtered! ✗
10767```
10768
10769**Root Cause**: Sidebar widget is server-rendered (PHP), not AJAX-reloaded like regular calendar.
10770
10771### The Fix
10772
10773**Detect widget type and handle appropriately**:
10774
10775```javascript
10776window.clearNamespaceFilter = function(calId) {
10777    const container = document.getElementById(calId);
10778
10779    // Check if this is a sidebar widget
10780    const sidebarContainer = document.getElementById('sidebar-widget-' + calId);
10781
10782    if (sidebarContainer) {
10783        // SIDEBAR: Reload page without namespace parameter
10784        const url = new URL(window.location.href);
10785        url.searchParams.delete('namespace');
10786        window.location.href = url.toString(); // Page reload
10787        return;
10788    }
10789
10790    // REGULAR CALENDAR: AJAX reload
10791    navCalendar(calId, year, month, originalNamespace);
10792};
10793```
10794
10795### How It Works
10796
10797**Sidebar Widget** ({{calendar}} syntax):
10798```
10799Rendered server-side with PHP
10800Cannot be AJAX-reloaded
10801Solution: Reload entire page without ?namespace=work parameter
10802```
10803
10804**Regular Calendar** ({{calendar-compact}} or {{calendar-panel}}):
10805```
10806Has AJAX reload capability
10807Solution: Call navCalendar() to reload via AJAX
10808```
10809
10810### Before vs After
10811
10812**BEFORE (v4.6.4)**:
10813```
10814Sidebar widget filtered by "work":
10815┌─────────────────────────┐
10816│ Filtering: work ✕       │ ← Click ✕
10817├─────────────────────────┤
10818│ Today                   │
10819│ • Work meeting          │
10820└─────────────────────────┘
10821
10822After clicking ✕:
10823┌─────────────────────────┐
10824│ Filtering: work ✕       │ ← Still there! ✗
10825├─────────────────────────┤
10826│ Today                   │
10827│ • Work meeting          │ ← Still filtered! ✗
10828└─────────────────────────┘
10829```
10830
10831**AFTER (v4.6.5)**:
10832```
10833Sidebar widget filtered by "work":
10834┌─────────────────────────┐
10835│ Filtering: work ✕       │ ← Click ✕
10836├─────────────────────────┤
10837│ Today                   │
10838│ • Work meeting          │
10839└─────────────────────────┘
10840
10841After clicking ✕ → Page reloads:
10842┌─────────────────────────┐
10843│ (no filter badge)       │ ← Cleared! ✓
10844├─────────────────────────┤
10845│ Today                   │
10846│ • Work meeting          │
10847│ • Personal task         │ ← All events! ✓
10848│ • Project review        │
10849└─────────────────────────┘
10850```
10851
10852### Technical Details
10853
10854**Why Page Reload for Sidebar?**
10855
10856Sidebar widget is rendered server-side:
10857```php
10858// In syntax.php:
10859return $this->renderSidebarWidget($events, $namespace, $calId);
10860// ↑ PHP generates complete HTML
10861// No AJAX reload endpoint exists for sidebar
10862```
10863
10864**Solution**: Remove `?namespace=work` from URL and reload page
10865```javascript
10866const url = new URL(window.location.href);
10867url.searchParams.delete('namespace'); // Remove filter
10868window.location.href = url.toString(); // Reload
10869```
10870
10871**Why AJAX for Regular Calendar?**
10872
10873Regular calendars have AJAX endpoints:
10874```javascript
10875// action.php handles:
10876action: 'load_month' → Returns new month data
10877navCalendar() → Fetches and rebuilds calendar
10878```
10879
10880### Filter Badge Behavior
10881
10882**Showing Badge** (when filtering):
10883- Server-side: PHP renders badge in HTML
10884- Client-side: JavaScript adds badge to header
10885
10886**Clearing Badge**:
10887- Sidebar: Page reload (removes ?namespace from URL)
10888- Calendar: AJAX reload (badge removed in rebuildCalendar)
10889
10890**Now works correctly for both!** ✓
10891
10892## Version 4.6.4 (2026-02-07) - HOTFIX: PHP SYNTAX ERROR
10893
10894### �� Critical Hotfix: Fixed PHP Parse Error
10895- **Fixed:** Template literal backticks causing PHP syntax error
10896- **Fixed:** Changed JavaScript template literals to concatenation
10897- **Fixed:** Admin page now loads without parse errors
10898
10899### The Problem
10900
10901**v4.6.3 broke admin page**:
10902```
10903Error loading plugin calendar
10904ParseError: syntax error, unexpected identifier "s",
10905expecting "," or ";"
10906```
10907
10908**Cause**: JavaScript template literals inside PHP echo
10909```php
10910echo '<script>
10911    let nsOptions = `<option value="">(default)</option>`;
10912                    ↑ PHP sees backtick and gets confused!
10913</script>';
10914```
10915
10916**Why it broke**: Backticks (`) are special in PHP too!
10917
10918### The Fix
10919
10920**Changed from template literals to concatenation**:
10921
10922**BEFORE (broken)**:
10923```javascript
10924let nsOptions = `<option value="">(default)</option>`;
10925nsOptions += `<option value="${namespace}">${namespace}</option>`;
10926console.log('Edit recurring:', namespace);
10927```
10928
10929**AFTER (fixed)**:
10930```javascript
10931let nsOptions = "<option value=\\"\\">(default)</option>";
10932nsOptions += "<option value=\\"" + namespace + "\\">" + namespace + "</option>";
10933console.log("Edit recurring:", namespace);
10934```
10935
10936**Changes**:
10937- ✅ Backticks (`) → Double quotes (")
10938- ✅ Template literals (${var}) → Concatenation (" + var + ")
10939- ✅ Single quotes in console.log → Double quotes
10940- ✅ Properly escaped quotes for PHP echo
10941
10942### Technical Details
10943
10944**The Issue**:
10945```php
10946// Inside PHP echo string:
10947echo '<script>
10948    let x = `template ${literal}`;  // ✗ Backtick breaks PHP!
10949</script>';
10950```
10951
10952**The Solution**:
10953```php
10954// Use regular string concatenation:
10955echo '<script>
10956    let x = "string " + variable;   // ✓ Works in PHP echo!
10957</script>';
10958```
10959
10960**Quote Escaping**:
10961```javascript
10962// Double quotes inside PHP single-quote string:
10963'<option value=\"\">text</option>'
10964               ↑↑ Escaped for JavaScript
10965```
10966
10967### Result
10968
10969**Before**: Admin page crashed with parse error ✗
10970**After**: Admin page loads perfectly ✓
10971
10972**No functionality changed - just syntax fix!**
10973
10974## Version 4.6.3 (2026-02-07) - FIX RECURRING EVENTS NAMESPACE DROPDOWN
10975
10976### �� Critical Fix: Namespace Dropdown in Recurring Events Section
10977- **Fixed:** Namespace dropdown now shows ALL available namespaces when editing
10978- **Fixed:** Current namespace now properly selected in dropdown
10979- **Fixed:** Namespace extraction from DOM now uses multiple methods
10980- **Added:** Console logging to debug namespace detection
10981
10982### The Problem
10983
10984**When editing from �� Recurring Events section**:
10985```
10986Click "Edit" on recurring event
10987Namespace dropdown shows:
10988- (default)
10989- (nothing else!) ✗
10990
10991Can't select any namespace! ✗
10992```
10993
10994**Why**: Broken namespace extraction logic
10995```javascript
10996// OLD CODE (broken):
10997const namespaces = Array.from(document.querySelectorAll("[id^=ns_]"))
10998    .map(el => {
10999        // Complex parsing that often failed
11000        const nsSpan = el.querySelector("span:nth-child(3)");
11001        return nsSpan.textContent.replace("�� ", "").trim();
11002    })
11003    .filter(ns => ns !== namespace); // Excluded current! ✗
11004```
11005
11006**Result**: Empty dropdown, can't change namespace! ✗
11007
11008### The Fix
11009
11010**NEW CODE (robust)**:
11011```javascript
11012const namespaces = new Set();
11013
11014// Method 1: Namespace explorer folders
11015document.querySelectorAll("[id^=ns_]").forEach(el => {
11016    const nsSpan = el.querySelector("span:nth-child(3)");
11017    if (nsSpan) {
11018        let nsText = nsSpan.textContent.replace("�� ", "").trim();
11019        if (nsText && nsText !== "(default)") {
11020            namespaces.add(nsText); // ✓
11021        }
11022    }
11023});
11024
11025// Method 2: Datalist (backup method)
11026document.querySelectorAll("#namespaceList option").forEach(opt => {
11027    if (opt.value && opt.value !== "") {
11028        namespaces.add(opt.value); // ✓
11029    }
11030});
11031
11032// Build dropdown with ALL namespaces
11033let options = `<option value="">(default)</option>`;
11034
11035// Show current namespace as selected
11036if (namespace) {
11037    options += `<option value="${namespace}" selected>${namespace} (current)</option>`;
11038}
11039
11040// Show all other namespaces
11041for (const ns of nsArray) {
11042    if (ns !== namespace) {
11043        options += `<option value="${ns}">${ns}</option>`;
11044    }
11045}
11046```
11047
11048**Result**: All namespaces visible! ✓
11049
11050### How It Works Now
11051
11052**Before (Broken)**:
11053```
11054Edit recurring event in "work" namespace
11055
11056Dropdown shows:
11057☐ (default)
11058
11059That's it! Can't select anything! ✗
11060```
11061
11062**After (Fixed)**:
11063```
11064Edit recurring event in "work" namespace
11065
11066Dropdown shows:
11067☐ (default)
11068☑ work (current)  ← Selected!
11069☐ personal
11070☐ projects
11071☐ meetings
11072
11073All namespaces available! ✓
11074```
11075
11076### Key Improvements
11077
11078**1. Dual extraction methods**:
11079- Primary: Parse namespace explorer DOM
11080- Backup: Read from datalist
11081- Result: Always finds namespaces ✓
11082
11083**2. Current namespace included**:
11084```javascript
11085// OLD: Excluded current namespace
11086.filter(ns => ns !== namespace) ✗
11087
11088// NEW: Include and mark as selected
11089options += `<option value="${namespace}" selected>${namespace} (current)</option>` ✓
11090```
11091
11092**3. Better error handling**:
11093```javascript
11094if (nsSpan) {  // Check exists
11095    let nsText = nsSpan.textContent.replace("�� ", "").trim();
11096    if (nsText && nsText !== "(default)") {  // Validate
11097        namespaces.add(nsText);
11098    }
11099}
11100```
11101
11102**4. Console debugging**:
11103```javascript
11104console.log('Edit recurring - Current namespace:', namespace);
11105console.log('Available namespaces:', nsArray);
11106```
11107
11108Open browser console (F12) to see what namespaces are detected!
11109
11110### Example Usage
11111
11112**Scenario**: Edit recurring "Team Meeting" in "work" namespace
11113
11114**Steps**:
111151. Go to �� Recurring Events section
111162. Click "Edit" on "Team Meeting"
111173. See namespace dropdown:
11118   - ☐ (default)
11119   - ☑ work (current)
11120   - ☐ personal
11121   - ☐ projects
111224. Select "personal" to move event
111235. Click "Save Changes"
111246. Event moved to "personal" namespace ✓
11125
11126**Finally works as expected!** ��
11127
11128## Version 4.6.2 (2026-02-07) - FIX NAMESPACE PRESERVATION
11129
11130### �� Recurring Events Namespace Fix
11131- **Fixed:** Namespace now properly preserved when editing recurring events
11132- **Fixed:** Namespace selector now allows selecting any namespace (not just default)
11133- **Added:** Better logging for namespace preservation debugging
11134- **Added:** Console logging to track namespace values during edit
11135
11136### The Namespace Problem
11137
11138**Issue 1**: Can't select non-default namespace
11139```
11140When editing recurring event:
11141- Dropdown shows all namespaces ✓
11142- User selects "work"
11143- Form submits with "" (empty/default) ✗
11144```
11145
11146**Issue 2**: Namespace not preserved
11147```
11148Recurring event in "personal" namespace
11149Edit the title only
11150After save: namespace changed to "" (default) ✗
11151```
11152
11153### The Fixes
11154
11155**Fix 1**: Better namespace preservation logic
11156```php
11157// When editing recurring event:
11158$existingNamespace = $existingEventData['namespace'];
11159
11160// Preserve if user didn't explicitly change it:
11161if (empty($namespace) ||
11162    strpos($namespace, '*') !== false ||
11163    strpos($namespace, ';') !== false) {
11164    // User didn't select or selected wildcard
11165    $namespace = $existingNamespace; // Keep existing!
11166}
11167```
11168
11169**Fix 2**: Proper form population
11170```javascript
11171// When editing, set BOTH inputs:
11172namespaceHidden.value = event.namespace || '';  // Hidden (submitted)
11173namespaceSearch.value = event.namespace || '(default)';  // Visible
11174
11175// Plus logging:
11176console.log('Set namespace for editing:', event.namespace);
11177```
11178
11179**Fix 3**: Added detailed logging
11180```php
11181error_log("Preserving namespace '$namespace' (received='$receivedNamespace')");
11182error_log("Using new namespace '$namespace'");
11183error_log("No existing namespace to preserve");
11184```
11185
11186### How It Works Now
11187
11188**Scenario 1**: Edit without changing namespace
11189```
11190Event in "work" namespace
11191Edit title to "Updated Meeting"
11192Namespace field shows: "work"
11193Hidden input value: "work"
11194Result: Saved in "work" ✓
11195```
11196
11197**Scenario 2**: Change namespace during edit
11198```
11199Event in "personal" namespace
11200Edit and select "work" namespace
11201Hidden input value: "work"
11202Result: Saved in "work" ✓
11203```
11204
11205**Scenario 3**: Edit with empty/wildcard namespace
11206```
11207Event in "projects" namespace
11208Namespace field empty or shows "personal;work"
11209System preserves: "projects"
11210Result: Saved in "projects" ✓
11211```
11212
11213### Debugging
11214
11215Now with console logging, you can see:
11216```javascript
11217Set namespace for editing: work
11218Hidden value: work
11219```
11220
11221And in PHP logs:
11222```
11223Calendar saveEvent recurring: Loaded existing data - namespace='work'
11224Calendar saveEvent recurring: Preserving namespace 'work' (received='')
11225```
11226
11227**Namespace preservation now works correctly!** ��
11228
11229## Version 4.6.1 (2026-02-07) - PRESERVE RECURRING EVENT DATA
11230
11231### �� Recurring Events Edit Fix
11232- **Fixed:** Editing recurring events now preserves unchanged fields
11233- **Fixed:** Empty fields no longer erase existing data
11234- **Added:** Smart merge of existing event data with new changes
11235
11236### The Problem
11237
11238**Before**: Editing erased unchanged fields!
11239```
11240Original recurring event:
11241- Title: "Team Meeting"
11242- Time: "10:00 AM"
11243- Description: "Weekly standup with engineering team"
11244- Color: Red
11245
11246User edits ONLY the title to "Staff Meeting"
11247Form sends:
11248- Title: "Staff Meeting" ✓
11249- Time: "" ✗ (empty because user didn't change it)
11250- Description: "" ✗ (empty)
11251- Color: "#3498db" ✗ (default blue)
11252
11253Result after save:
11254- Title: "Staff Meeting" ✓
11255- Time: BLANK ✗
11256- Description: BLANK ✗
11257- Color: Blue ✗
11258```
11259
11260**All the other data was lost!** ✗
11261
11262### The Fix
11263
11264**After**: Preserves unchanged data!
11265```php
11266if ($eventId && $isRecurring) {
11267    // Load existing event data
11268    $existingEventData = getExistingEventData($eventId);
11269
11270    // Merge: use new value OR keep existing
11271    $title = $title ?: $existingEventData['title'];
11272    $time = $time ?: $existingEventData['time'];
11273    $description = $description ?: $existingEventData['description'];
11274    $color = ($color === '#3498db') ?
11275        $existingEventData['color'] : $color;
11276}
11277```
11278
11279**Now**:
11280```
11281User edits ONLY the title to "Staff Meeting"
11282
11283System:
112841. Loads existing event data
112852. Merges: new title + existing time/description/color
112863. Saves merged data
11287
11288Result:
11289- Title: "Staff Meeting" ✓ (changed)
11290- Time: "10:00 AM" ✓ (preserved!)
11291- Description: "Weekly standup..." ✓ (preserved!)
11292- Color: Red ✓ (preserved!)
11293```
11294
11295**Only changed fields are updated!** ✓
11296
11297### How It Works
11298
11299**Step 1**: Load existing data
11300```php
11301$existingEventData = $this->getExistingEventData(
11302    $eventId,
11303    $date,
11304    $namespace
11305);
11306```
11307
11308**Step 2**: Merge with new data
11309```php
11310// If new value is empty, use existing value
11311$title = $newTitle ?: $existingEventData['title'];
11312$time = $newTime ?: $existingEventData['time'];
11313$description = $newDesc ?: $existingEventData['description'];
11314
11315// Special handling for color (default is #3498db)
11316if ($newColor === '#3498db' && $existingEventData['color']) {
11317    $color = $existingEventData['color'];
11318}
11319```
11320
11321**Step 3**: Save merged data
11322```php
11323createRecurringEvents(..., $title, $time, $description, $color, ...);
11324```
11325
11326### Fields Preserved
11327
11328When editing recurring events, these fields are now preserved if not changed:
11329- ✅ Title (if left blank)
11330- ✅ Time (if not specified)
11331- ✅ End Time (if not specified)
11332- ✅ Description (if left empty)
11333- ✅ Color (if still default blue)
11334
11335**Edit only what you want to change - everything else stays!** ��
11336
11337## Version 4.6.0 (2026-02-07) - NAMESPACE RENAME & RECURRING FIX
11338
11339### ✨ New Feature: Rename Namespaces
11340- **Added:** ✏️ Rename button in Namespace Explorer
11341- **Added:** Rename all events in a namespace at once
11342- **Added:** Automatic cleanup of old directory structure
11343
11344### �� Critical Fix: Recurring Events Actually Edit Now!
11345- **Fixed:** Editing recurring events now deletes ALL instances
11346- **Fixed:** Previously only deleted one instance, left orphans
11347- **Fixed:** Recurring events properly regenerated on edit
11348
11349### Namespace Rename Feature
11350
11351**Before**: Could only delete namespaces, not rename
11352
11353**After**: Click ✏️ to rename!
11354
11355```
11356�� work (15 events)  [3] [✏️] [��️]
11357                          ↑ NEW!
11358```
11359
11360**How It Works**:
113611. Click ✏️ rename button
113622. Enter new namespace name
113633. All events moved to new namespace
113644. Event `namespace` field updated in JSON
113655. Old directory cleaned up
11366
11367**Example**:
11368```
11369Rename: "work" → "business"
11370
11371Before:
11372/data/meta/work/calendar/*.json
11373Events: {namespace: "work"}
11374
11375After:
11376/data/meta/business/calendar/*.json
11377Events: {namespace: "business"}
11378```
11379
11380**Implementation**:
11381```php
11382private function renameNamespace() {
11383    // 1. Validate new name
11384    // 2. Rename directory
11385    // 3. Update all event namespace fields in JSON
11386    // 4. Clean up old empty directories
11387}
11388```
11389
11390### Recurring Events Fix - The Problem
11391
11392**Before**: Editing didn't work!
11393```
11394Original recurring event generates:
11395- Event-0 (Mon, Feb 10)
11396- Event-1 (Mon, Feb 17)
11397- Event-2 (Mon, Feb 24)
11398
11399User edits Event-0, changes title to "Updated"
11400
11401What SHOULD happen:
11402- Delete Event-0, Event-1, Event-2
11403- Generate new instances with "Updated" title
11404
11405What ACTUALLY happened:
11406- Delete Event-0 only ✗
11407- Generate new instances
11408- Result: Event-1 and Event-2 still show old title! ✗
11409```
11410
11411**After**: Properly deletes ALL instances!
11412
11413**The Fix**:
11414```php
11415private function deleteEvent() {
11416    $event = getEvent($eventId);
11417
11418    // Check if recurring
11419    if ($event['recurring'] && $event['recurringId']) {
11420        // Delete ALL instances with same recurringId
11421        deleteAllRecurringInstances($recurringId);
11422    }
11423
11424    // Then normal delete for spanning events
11425}
11426
11427private function deleteAllRecurringInstances($recurringId) {
11428    // Scan ALL calendar JSON files
11429    foreach (glob('*.json') as $file) {
11430        // Filter out events with matching recurringId
11431        $events = array_filter($events, function($event) {
11432            return $event['recurringId'] !== $recurringId;
11433        });
11434    }
11435}
11436```
11437
11438**Result**:
11439- Edit "Weekly Team Meeting" → ALL instances updated ✓
11440- Delete recurring event → ALL instances deleted ✓
11441- No more orphaned events! ✓
11442
11443### Recurring Event Fields
11444
11445Every recurring event has:
11446```json
11447{
11448    "id": "abc123-0",
11449    "recurring": true,
11450    "recurringId": "abc123",  ← Links all instances
11451    ...
11452}
11453```
11454
11455When editing/deleting, we find ALL events with same `recurringId` and remove them!
11456
11457**Finally, recurring events work properly!** ��
11458
11459## Version 4.5.2 (2026-02-07) - FIX SORTING & PINK TOOLTIPS
11460
11461### �� Important Events Sorting - ACTUALLY FIXED!
11462- **Fixed:** Important Events now REALLY sorted by date first, then time
11463- **Fixed:** renderSidebarSection was re-sorting and breaking the order
11464- **Changed:** Important Events use date-first sorting, Today/Tomorrow use time-only
11465
11466### �� Pink Theme Tooltip Bling!
11467- **Added:** Pink gradient tooltips (hot pink → light pink)
11468- **Added:** Glowing pink border on tooltips
11469- **Added:** Sparkling heart (��) appears next to tooltip!
11470- **Added:** Heart has pink glow drop-shadow
11471
11472### The Sorting Bug - Root Cause
11473
11474**Problem**: Two sorts were happening!
11475
11476**Sort #1** (Line 2047): Before rendering
11477```php
11478usort($importantEvents, ...) // Sort by date ✓
11479```
11480
11481**Sort #2** (Line 2751): Inside renderSidebarSection
11482```php
11483usort($events, ...) // Sort by TIME ONLY ✗
11484// This was breaking the date order!
11485```
11486
11487**The Fix**: Different sorting for different sections
11488```php
11489if ($title === 'Important Events') {
11490    // Sort by DATE first, then time
11491    usort($events, function($a, $b) {
11492        if ($dateA !== $dateB) {
11493            return strcmp($dateA, $dateB); // DATE first!
11494        }
11495        // Same date - sort by time
11496        return timeCompare($a, $b);
11497    });
11498} else {
11499    // Today/Tomorrow - sort by TIME only (same date)
11500    usort($events, function($a, $b) {
11501        return timeCompare($a, $b);
11502    });
11503}
11504```
11505
11506**Result**: Important Events now CORRECTLY sorted!
11507```
11508✓ Sun, Feb 8 - 3:30 PM Super Bowl
11509✓ Tue, Feb 10 - 11:30 AM Doctor visit
11510✓ Sat, Feb 14 - Valentine's Day (all-day)
11511✓ Sat, Feb 14 - 8:00 PM Crab Shack
11512```
11513
11514### Pink Tooltip Magic! ��
11515
11516**Normal Tooltips**: Black background, plain
11517```css
11518background: rgba(0, 0, 0, 0.95);
11519color: #fff;
11520```
11521
11522**Pink Theme Tooltips**: FABULOUS!
11523```css
11524/* Pink gradient background */
11525background: linear-gradient(135deg, #ff1493 0%, #ff69b4 100%);
11526
11527/* Glowing pink border */
11528border: 2px solid #ff85c1;
11529
11530/* Double glow shadow */
11531box-shadow:
11532    0 0 15px rgba(255, 20, 147, 0.6),
11533    0 4px 12px rgba(0, 0, 0, 0.4);
11534
11535/* Bold text */
11536font-weight: 600;
11537```
11538
11539**Plus**: Sparkling heart next to tooltip!
11540```css
11541.sidebar-pink [data-tooltip]:after {
11542    content: '��';
11543    font-size: 12px;
11544    filter: drop-shadow(0 0 3px rgba(255, 20, 147, 0.8));
11545}
11546```
11547
11548**The Effect**:
11549```
11550Hover over ⚠ conflict warning:
11551┌────────────────────┐ ��
11552│ Conflicts with:    │ ← Pink gradient
11553│ • Event 1 (3PM)   │ ← Pink border
11554│ • Event 2 (4PM)   │ ← Pink glow
11555└────────────────────┘
11556```
11557
11558**Maximum glamour on tooltips too!** ✨
11559
11560## Version 4.5.1 (2026-02-07) - FIX IMPORTANT EVENTS SORTING
11561
11562### �� Important Events Order Fixed
11563- **Fixed:** Important Events now sorted by date (earliest first)
11564- **Fixed:** Events on same date sorted by time (chronological)
11565- **Fixed:** All-day events appear last within each date
11566
11567### Sorting Issue
11568
11569**Before**: Random order
11570```
11571Important Events:
11572�� Valentine's Day         (Sat, Feb 14)
1157311:30 AM Doctor visit      (Tue, Feb 10)  ← Feb 10 after Feb 14!
115743:30 PM Super Bowl         (Sun, Feb 8)   ← Feb 8 after Feb 14!
115758:00 PM Crab Shack         (Sat, Feb 14)
11576```
11577
11578**After**: Chronological order
11579```
11580Important Events:
115813:30 PM Super Bowl         (Sun, Feb 8)   ← Earliest!
1158211:30 AM Doctor visit      (Tue, Feb 10)
11583�� Valentine's Day         (Sat, Feb 14)  ← All-day event
115848:00 PM Crab Shack         (Sat, Feb 14)  ← Same day, sorted by time
11585```
11586
11587### Sorting Logic
11588
11589**Primary Sort**: By date
11590```php
11591strcmp($dateA, $dateB); // "2026-02-08" < "2026-02-14"
11592```
11593
11594**Secondary Sort**: By time (within same date)
11595```php
11596// All-day events (no time) go last
11597if (empty($timeA) && !empty($timeB)) return 1;
11598if (!empty($timeA) && empty($timeB)) return -1;
11599
11600// Both have times - sort chronologically
11601$aMinutes = timeToMinutes($timeA); // "11:30" = 690 minutes
11602$bMinutes = timeToMinutes($timeB); // "20:00" = 1200 minutes
11603return $aMinutes - $bMinutes;      // 690 < 1200
11604```
11605
11606**Result**:
116071. Sun, Feb 8 - 3:30 PM (earliest date & time)
116082. Tue, Feb 10 - 11:30 AM (next date)
116093. Sat, Feb 14 - Valentine's Day (all-day, so last on Feb 14)
116104. Sat, Feb 14 - 8:00 PM (timed event on Feb 14)
11611
11612**Perfect chronological order for next 2 weeks!** ✓
11613
11614## Version 4.5.0 (2026-02-07) - SPARKLE EDITION ✨��
11615
11616### �� EXTREME PINK BLING EFFECTS!
11617- **Added:** Click sparkles - 8 sparkles burst out on every click!
11618- **Added:** Auto-sparkles - random sparkles appear every 3 seconds
11619- **Added:** Hover mega-glow - sidebar glows BRIGHT on hover
11620- **Added:** Pulsing border glow - constantly breathing pink glow
11621- **Added:** Drop shadows on sparkles for extra depth
11622- **Added:** More sparkle emojis - hearts, diamonds, crowns, bows!
11623
11624### Sparkle Effects Breakdown
11625
11626**Click Sparkles** ��:
11627```javascript
11628// 8 sparkles burst out when you click anywhere!
11629for (let i = 0; i < 8; i++) {
11630    // Staggered appearance (40ms apart)
11631    createSparkle(x, y);
11632}
11633
11634// Sparkle emojis:
11635["✨", "��", "��", "⭐", "��", "��", "��", "��", "��", "��"]
11636```
11637
11638**Each sparkle**:
11639- Starts at click point
11640- Flies outward 30-60px in random direction
11641- Spins 360 degrees
11642- Fades in and out
11643- Has pink glow drop-shadow
11644- Disappears after 1 second
11645
11646**Auto Sparkles** ⏰:
11647```javascript
11648// Random sparkle every 3 seconds
11649setInterval(() => {
11650    const x = Math.random() * width;
11651    const y = Math.random() * height;
11652    createSparkle(x, y);
11653}, 3000);
11654```
11655
11656**Result**: Constant magical sparkles even without clicking! ✨
11657
11658**Hover Mega-Glow** ��:
11659```css
11660.sidebar-pink:hover {
11661    box-shadow:
11662        0 0 30px rgba(255, 20, 147, 0.9),
11663        0 0 50px rgba(255, 20, 147, 0.5) !important;
11664}
11665```
11666
11667**Result**: Sidebar EXPLODES with pink glow when you hover over it! ��
11668
11669**Pulsing Border Glow** ��:
11670```css
11671@keyframes pulse-glow {
11672    0%, 100% {
11673        box-shadow: 0 0 10px rgba(255, 20, 147, 0.4);
11674    }
11675    50% {
11676        box-shadow:
11677            0 0 25px rgba(255, 20, 147, 0.8),
11678            0 0 40px rgba(255, 20, 147, 0.4);
11679    }
11680}
11681
11682animation: pulse-glow 3s ease-in-out infinite;
11683```
11684
11685**Result**: Border continuously breathes with pink glow! ��
11686
11687**Sparkle Animation** ��:
11688```css
11689@keyframes sparkle {
11690    0% {
11691        opacity: 0;
11692        transform: translate(0, 0) scale(0) rotate(0deg);
11693    }
11694    50% {
11695        opacity: 1;
11696        transform: translate(halfway) scale(1) rotate(180deg);
11697    }
11698    100% {
11699        opacity: 0;
11700        transform: translate(far) scale(0) rotate(360deg);
11701    }
11702}
11703```
11704
11705**Result**: Sparkles spin, grow, shrink, and fly! ��
11706
11707### Complete Pink Bling Experience:
11708
11709**Always Active**:
11710- ✨ Pulsing pink border glow (3 second cycle)
11711- ✨ Auto-sparkles every 3 seconds
11712
11713**On Hover**:
11714- �� MEGA GLOW EFFECT (2x brightness!)
11715
11716**On Click**:
11717- �� 8 sparkles EXPLODE outward!
11718- �� Random emojis (hearts, stars, diamonds, crowns!)
11719- �� Each sparkle spins 360° while flying
11720- �� Pink glow drop-shadow on each sparkle
11721
11722**The Result**:
11723- Click anywhere = SPARKLE EXPLOSION! ��
11724- Hover anywhere = MEGA GLOW! ✨
11725- Always breathing and sparkling! ��
11726- Maximum glamour! ��
11727- Wife approval: 1000%! ��
11728
11729**THIS IS THE MOST FABULOUS CALENDAR EVER!** ��✨��
11730
11731## Version 4.4.2 (2026-02-07) - FINAL PINK POLISH
11732
11733### �� Pink Theme Final Touches
11734- **Fixed:** Add Event text now black (was bright pink, hard to read)
11735- **Fixed:** Clock border now COMPLETELY pink on all sides (no more green!)
11736- **Removed:** Text shadow on Add Event button (cleaner with black text)
11737
11738### Add Event Text - Black & Readable!
11739
11740**Before**: Bright pink text (#ff1493) on dark pink background
11741```php
11742$addBtnTextColor = $themeStyles['text_bright']; // #ff1493 - hard to read!
11743text-shadow: 0 0 3px #ff1493; // Glowy pink
11744```
11745
11746**After**: Black text, no shadow, perfect contrast!
11747```php
11748$addBtnTextColor = $theme === 'pink' ? '#000000' : ...;
11749$addBtnTextShadow = $theme === 'pink' ? 'none' : ...;
11750```
11751
11752**Result**:
11753- Black text pops against dark pink background ✓
11754- Easy to read ✓
11755- Professional look with bling ✓
11756
11757### Clock Border - All Pink!
11758
11759**The Problem**: Inline style only set `border-bottom`, CSS set other sides to green
11760
11761**Before**:
11762```php
11763// Inline style (only bottom):
11764style="border-bottom:2px solid #ff1493;"
11765
11766// CSS (all sides):
11767.eventlist-today-header {
11768    border: 2px solid #00cc07; // Green on top/sides!
11769}
11770```
11771
11772**After**: Inline style overrides ALL sides
11773```php
11774style="border:2px solid #ff1493;" // All 4 sides pink!
11775```
11776
11777**Result**: Clock box now 100% pink border on all four sides! ✓
11778
11779### What Changed:
11780
11781**Add Event Button**:
11782- Background: #b8156f (dark pink) ✓
11783- Text: **#000000 (black)** ← NEW!
11784- Text shadow: **none** ← NEW!
11785- Glow: 0 0 10px pink ✓
11786
11787**Clock Border**:
11788- Top: **#ff1493 (pink)** ← FIXED!
11789- Right: **#ff1493 (pink)** ← FIXED!
11790- Bottom: #ff1493 (pink) ✓
11791- Left: **#ff1493 (pink)** ← FIXED!
11792
11793**Perfect pink theme - wife approved!** ��✨
11794
11795## Version 4.4.1 (2026-02-07) - PINK THEME PERFECTION
11796
11797### �� Pink Theme Complete Makeover
11798- **Fixed:** Clock border now completely pink (was green on sides/top)
11799- **Changed:** Today/Tomorrow/Important sections now different shades of pink
11800- **Changed:** Add Event button now dark pink (was clashing blue)
11801- **Changed:** System status bars now pink gradient (3 shades!)
11802
11803### All-Pink Everything! ��
11804
11805**Clock Border**:
11806```css
11807/* Before: Green border */
11808border: 2px solid #00cc07;
11809
11810/* After: Hot pink border */
11811.sidebar-pink .eventlist-today-header {
11812    border-color: #ff1493;
11813    box-shadow: 0 0 10px rgba(255, 20, 147, 0.4);
11814}
11815```
11816
11817**Section Colors** (Different Pink Shades):
11818```php
11819// Before: Orange, green, purple
11820'Today' => '#ff9800',
11821'Tomorrow' => '#4caf50',
11822'Important' => '#9b59b6'
11823
11824// After: Hot pink, pink, light pink
11825'Today' => '#ff1493',      // Hot pink (DeepPink)
11826'Tomorrow' => '#ff69b4',   // Pink (HotPink)
11827'Important' => '#ff85c1'   // Light pink
11828```
11829
11830**Add Event Button**:
11831```php
11832// Before: Clashing blue
11833background: #3498db;
11834
11835// After: Dark pink with glow
11836background: #b8156f;       // Dark pink
11837hover: #8b0f54;            // Darker pink
11838shadow: 0 0 10px rgba(255, 20, 147, 0.5);
11839```
11840
11841**System Status Bars** (Pink Gradient):
11842```css
11843/* 5-min load average */
11844.sidebar-pink .eventlist-cpu-fill {
11845    background: #ff1493;   /* Hot pink */
11846    box-shadow: 0 0 5px rgba(255, 20, 147, 0.7);
11847}
11848
11849/* Realtime CPU */
11850.sidebar-pink .eventlist-cpu-fill-purple {
11851    background: #ff69b4;   /* Pink */
11852    box-shadow: 0 0 5px rgba(255, 105, 180, 0.7);
11853}
11854
11855/* Memory */
11856.sidebar-pink .eventlist-cpu-fill-orange {
11857    background: #ff85c1;   /* Light pink */
11858    box-shadow: 0 0 5px rgba(255, 133, 193, 0.7);
11859}
11860```
11861
11862### Pink Theme Visual Hierarchy:
11863
11864**Darkest → Lightest Pink Shades**:
118651. Add Event button: #b8156f (dark pink)
118662. Today section: #ff1493 (hot pink / deep pink)
118673. System bar 1: #ff1493 (hot pink)
118684. Tomorrow section: #ff69b4 (pink)
118695. System bar 2: #ff69b4 (pink)
118706. Important section: #ff85c1 (light pink)
118717. System bar 3: #ff85c1 (light pink)
11872
11873**Result**: Beautiful pink gradient throughout entire sidebar! ��✨
11874
11875### What's Pink Now:
11876
11877✅ Sidebar background & border
11878✅ **Clock border** ← FIXED!
11879✅ Header gradient
11880✅ Week grid
11881✅ **Add Event button** ← FIXED!
11882✅ **Today section** ← Different shade!
11883✅ **Tomorrow section** ← Different shade!
11884✅ **Important section** ← Different shade!
11885✅ Event text & bars
11886✅ **System status bars** ← All 3 different pink shades!
11887✅ All shadows & glows
11888
11889**EVERYTHING is pink and fabulous!** ��✨
11890
11891## Version 4.4.0 (2026-02-07) - PINK BLING THEME & PROFESSIONAL SHADOWS
11892
11893### ✨ New Theme: Pink Bling! ��
11894- **Added:** Glamorous hot pink theme with maximum sparkle
11895- **Features:** Deep pink (#ff1493), extra glow, hearts and diamonds aesthetic
11896- **Perfect for:** Fabulous calendars that demand attention ✨
11897
11898### �� Professional Theme Shadow Fix
11899- **Fixed:** Section headers now have subtle shadow (not glow)
11900- **Fixed:** Clicked day panel header has proper shadow
11901
11902### Pink Bling Theme Colors
11903
11904**Background & Borders**:
11905```php
11906'bg' => '#1a0d14',           // Dark rich pink-black
11907'border' => '#ff1493',        // Hot pink (DeepPink)
11908'shadow' => 'rgba(255, 20, 147, 0.4)', // Strong pink glow
11909```
11910
11911**Text Colors**:
11912```php
11913'text_primary' => '#ff69b4',  // Hot pink
11914'text_bright' => '#ff1493',   // Deep pink
11915'text_dim' => '#ff85c1',      // Light pink
11916```
11917
11918**Week Grid**:
11919```php
11920'grid_bg' => '#2d1a24',       // Dark purple-pink
11921'cell_bg' => '#1a0d14',       // Dark
11922'cell_today_bg' => '#3d2030', // Highlighted purple-pink
11923```
11924
11925**Special Effects**:
11926```php
11927'bar_glow' => '0 0 5px',      // Extra sparkly glow!
11928'header_shadow' => '0 0 12px rgba(255, 20, 147, 0.6)' // Maximum bling!
11929```
11930
11931### Professional Theme Shadow Fix
11932
11933**Before**: Section headers had colored glow
11934```php
11935box-shadow: 0 0 8px #3498db; // Blue glow - wrong!
11936```
11937
11938**After**: Section headers have subtle shadow
11939```php
11940$headerShadow = ($theme === 'professional') ?
11941    '0 2px 4px rgba(0, 0, 0, 0.15)' :  // Shadow for professional
11942    '0 0 8px ' . $accentColor;          // Glow for others
11943```
11944
11945**Result**:
11946- **Matrix/Purple/Pink**: Colored glow on headers ✓
11947- **Professional**: Clean grey shadow (no glow) ✓
11948
11949### All Four Themes:
11950
11951**�� Matrix Edition**:
11952- Dark green (#00cc07)
11953- Neon glow effects
11954- Hacker aesthetic
11955
11956**�� Purple Dream**:
11957- Elegant purple (#9b59b6)
11958- Violet glow effects
11959- Royal aesthetic
11960
11961**�� Professional Blue**:
11962- Clean grey/blue (#4a90e2)
11963- Subtle shadows (NO glow)
11964- Corporate aesthetic
11965
11966**�� Pink Bling** (NEW!):
11967- Hot pink (#ff1493)
11968- MAXIMUM sparkle & glow
11969- Glamorous aesthetic ✨��
11970
11971### Technical Implementation
11972
11973**Theme Added To**:
11974- `getSidebarThemeStyles()` - color definitions
11975- `getSidebarTheme()` - validation
11976- `saveSidebarTheme()` - admin save
11977- Admin panel - UI with preview
11978- All shadow/glow calculations
11979- JavaScript theme colors
11980- Clicked day panel colors
11981
11982**Perfect for users who want FABULOUS pink calendars!** ��✨
11983
11984## Version 4.3.1 (2026-02-07) - REDUCE TEXT GLOW & CONSISTENCY
11985
11986### �� Text Glow Refinement
11987- **Changed:** Reduced text glow from 3px to 2px (less intense)
11988- **Fixed:** Clicked day panel now has same text glow as sections
11989
11990### Text Glow Reduction
11991
11992**Before**: Text glow was too strong (3px)
11993```php
11994// Sections:
11995text-shadow: 0 0 3px #00cc07; // Too bright!
11996
11997// Clicked day panel:
11998text-shadow: 0 0 3px #00cc07; // Too bright!
11999```
12000
12001**After**: Subtler text glow (2px)
12002```php
12003// Sections:
12004text-shadow: 0 0 2px #00cc07; // Just right ✓
12005
12006// Clicked day panel:
12007text-shadow: 0 0 2px #00cc07; // Just right ✓
12008```
12009
12010**Visual Impact**:
12011- **Matrix**: Softer green glow, easier to read
12012- **Purple**: Softer purple glow, more elegant
12013- **Professional**: Still no glow (clean)
12014
12015### Consistency Fix
12016
12017**Before**: Sections had glow, clicked day panel had NO glow
12018
12019**After**: Both sections AND clicked day panel have matching subtle glow
12020
12021**Where Glow Appears**:
12022- ✅ Today section event text
12023- ✅ Tomorrow section event text
12024- ✅ Important section event text
12025- ✅ **Clicked day panel event text** ← NOW CONSISTENT!
12026
12027**Result**:
12028- Glow is less intense and easier on eyes ✓
12029- All event text has consistent styling ✓
12030- Matrix/Purple themes more refined ✓
12031
12032### Technical Details
12033
12034**PHP (Sections)**:
12035```php
12036$textShadow = ($theme === 'professional') ? '' : 'text-shadow:0 0 2px ' . $titleColor . ';';
12037```
12038
12039**JavaScript (Clicked Day Panel)**:
12040```javascript
12041themeColors.text_shadow = 'text-shadow:0 0 2px #00cc07'; // Or purple
12042eventHTML += "style='...color:" + color + "; " + themeColors.text_shadow + ";'";
12043```
12044
12045**Perfect consistency and subtle elegance!** ✨
12046
12047## Version 4.3.0 (2026-02-07) - IMPORTANT EVENTS FUTURE + REMOVE GREY
12048
12049### ✨ Important Events Enhancement
12050- **Changed:** Important events now show from next 2 weeks (not just current week)
12051- **Fixed:** Important events on Sunday after current week now visible
12052- **Changed:** Events loaded 2 weeks into future for Important section
12053
12054### �� Background Cleanup
12055- **Removed:** Grey/white backgrounds from Today/Tomorrow/Important sections
12056- **Removed:** Grey backgrounds from individual events
12057- **Result:** Clean transparent backgrounds, original dark Matrix look restored
12058
12059### Important Events - Future Coverage
12060
12061**Before**: Only showed Important events from current week
12062```php
12063if ($isImportant && $dateKey >= $weekStart && $dateKey <= $weekEnd) {
12064    $importantEvents[] = $event;
12065}
12066```
12067
12068**After**: Shows Important events from today through next 2 weeks
12069```php
12070// Load events 2 weeks out
12071$twoWeeksOut = date('Y-m-d', strtotime($weekEnd . ' +14 days'));
12072
12073// Show all important events from today forward
12074if ($isImportant && $dateKey >= $todayStr) {
12075    $importantEvents[] = $event;
12076}
12077```
12078
12079**Example**:
12080- Today: Saturday Feb 7
12081- Current week: Sun Feb 1 → Sat Feb 7
12082- Important events shown: Feb 7 → Feb 21 (today + 14 days)
12083
12084**Result**: Important events on Sunday Feb 8 (next week) now visible! ✓
12085
12086### Background Removal
12087
12088**Before**: Light grey/white backgrounds added
12089```php
12090// Section background:
12091$sectionBg = 'rgba(255, 255, 255, 0.05)'; // Grey overlay
12092
12093// Event background:
12094$eventBg = 'rgba(255, 255, 255, 0.03)'; // Grey overlay
12095```
12096
12097**After**: No backgrounds (transparent)
12098```php
12099// Section: No background property
12100<div style="padding:4px 0;">
12101
12102// Event: No background property
12103<div style="padding:4px 6px; ...">
12104```
12105
12106**Result**:
12107- Clean, dark Matrix aesthetic restored ✓
12108- Purple theme darker and more elegant ✓
12109- Professional theme still has its light grey sidebar bg ✓
12110- Events stand out with just color bars and borders ✓
12111
12112### What Changed:
12113
12114**Sections (Today/Tomorrow/Important)**:
12115- ❌ No more grey overlay
12116- ✓ Transparent background
12117- ✓ Colored borders & glows remain
12118
12119**Individual Events**:
12120- ❌ No more grey overlay
12121- ✓ Transparent background
12122- ✓ Colored bars & borders remain
12123
12124**Perfect! Back to the original clean dark look with future Important events!** ��
12125
12126## Version 4.2.6 (2026-02-07) - FIX SECTION SHADOWS & DESCRIPTION COLOR
12127
12128### �� Final Theme Polish
12129- **Fixed:** Today/Tomorrow/Important section shadows now match theme
12130- **Fixed:** Event description text color now uses theme dim color
12131
12132### Section Shadow Fix
12133
12134**Problem**: Sections always had green glow regardless of theme
12135
12136**Before**:
12137```php
12138// Hardcoded green:
12139box-shadow: 0 0 5px rgba(0, 204, 7, 0.2);
12140```
12141
12142**After**:
12143```php
12144// Theme-aware:
12145$sectionShadow = $theme === 'matrix' ? '0 0 5px rgba(0, 204, 7, 0.2)' :
12146                ($theme === 'purple' ? '0 0 5px rgba(155, 89, 182, 0.2)' :
12147                '0 2px 4px rgba(0, 0, 0, 0.1)');
12148```
12149
12150**Result**:
12151- **Matrix**: Green glow around sections ✓
12152- **Purple**: Purple glow around sections ✓
12153- **Professional**: Subtle grey shadow (no glow) ✓
12154
12155### Description Color Fix
12156
12157**Problem**: Description text always green in clicked day panel
12158
12159**Before**:
12160```javascript
12161color: #00aa00; // Always green
12162```
12163
12164**After**:
12165```javascript
12166color: themeColors.text_dim; // Theme dim color
12167```
12168
12169**Result**:
12170- **Matrix**: Dim green (#00aa00) ✓
12171- **Purple**: Dim purple (#8e7ab8) ✓
12172- **Professional**: Grey (#7f8c8d) ✓
12173
12174### Now 100% Theme Consistent
12175
12176Every single visual element respects theme:
12177- ✅ Sidebar background & border
12178- ✅ Header colors & shadows
12179- ✅ Week grid & cells
12180- ✅ Add Event button
12181- ✅ Section borders & **shadows** ← Fixed!
12182- ✅ Event titles & times
12183- ✅ Event **descriptions** ← Fixed!
12184- ✅ Clicked day panel
12185- ✅ Event bars & glows
12186
12187**Absolute perfection across all three themes!** ��✨
12188
12189## Version 4.2.5 (2026-02-07) - CLICKED DAY PANEL THEMES & GREY BACKGROUND
12190
12191### �� Theme Improvements
12192- **Fixed:** Clicked day panel now uses correct theme colors
12193- **Changed:** Professional Blue background now light grey (not white)
12194- **Added:** Theme colors passed to JavaScript for dynamic rendering
12195
12196### Clicked Day Panel Theming
12197
12198**Before**: Always blue regardless of theme
12199```javascript
12200// Hardcoded blue:
12201color:#00cc07;  // Always green
12202background:#3498db;  // Always blue
12203```
12204
12205**After**: Theme-aware colors
12206```php
12207// PHP passes theme to JavaScript:
12208window.themeColors_XXX = {
12209    text_primary: '#00cc07' or '#b19cd9' or '#2c3e50',
12210    text_bright: '#00dd00' or '#d4a5ff' or '#4a90e2',
12211    text_shadow: '0 0 3px ...' or '',
12212    event_bg: 'rgba(...)',
12213    border_color: 'rgba(...)',
12214    bar_shadow: '0 0 3px' or '0 1px 2px rgba(...)'
12215};
12216
12217// JavaScript uses theme colors:
12218color: themeColors.text_primary;
12219background: themeColors.event_bg;
12220```
12221
12222**Result**:
12223- Matrix: Green panel with green glow ✓
12224- Purple: Purple panel with purple glow ✓
12225- Professional: Blue panel, no glow, clean ✓
12226
12227### Professional Theme Background Change
12228
12229**Before**: Almost white (#f5f7fa, #ffffff)
12230```php
12231'bg' => '#f5f7fa',           // Very light
12232'cell_bg' => '#ffffff',      // Pure white
12233```
12234
12235**After**: Light grey tones
12236```php
12237'bg' => '#e8ecf1',           // Soft grey-blue
12238'cell_bg' => '#f5f7fa',      // Light grey
12239'grid_bg' => '#d5dbe3',      // Medium grey
12240'cell_today_bg' => '#dce8f7' // Highlighted grey-blue
12241```
12242
12243**Visual Impact**:
12244- Sidebar: Light grey-blue background (#e8ecf1)
12245- Week cells: Lighter grey (#f5f7fa)
12246- Today cell: Highlighted blue-grey (#dce8f7)
12247- More depth and contrast ✓
12248- Professional appearance ✓
12249
12250### All Theme Elements Now Consistent
12251
12252**Matrix (Green)**:
12253- Sidebar: Dark (#242424)
12254- Clicked panel: Dark with green
12255- Text: Green with glow
12256
12257**Purple Dream**:
12258- Sidebar: Dark purple (#2a2030)
12259- Clicked panel: Dark with purple
12260- Text: Purple with glow
12261
12262**Professional Blue**:
12263- Sidebar: Light grey (#e8ecf1)
12264- Clicked panel: Light with blue
12265- Text: Dark grey, no glow
12266
12267**Perfect theme consistency everywhere!** ��
12268
12269## Version 4.2.4 (2026-02-07) - FIX TOMORROW LOADING & DOUBLE ENCODING
12270
12271### �� Critical Fixes
12272- **Fixed:** Tomorrow events not loaded when outside current week
12273- **Fixed:** `&amp;` showing instead of `&` (double HTML encoding)
12274
12275### Issue 1: Tomorrow Not Loading
12276
12277**Problem**: Sidebar only loaded events for current week
12278- Today (Saturday): Week ends today
12279- Tomorrow (Sunday): Start of NEXT week
12280- Tomorrow events never loaded from data files!
12281
12282**Before**:
12283```php
12284// Only load current week
12285$end = new DateTime($weekEnd);
12286$end->modify('+1 day');
12287$period = new DatePeriod($start, $interval, $end);
12288// If tomorrow > weekEnd, it's not in period!
12289```
12290
12291**After**:
12292```php
12293// Check if tomorrow is outside week
12294$tomorrowDate = date('Y-m-d', strtotime('+1 day'));
12295if ($tomorrowDate > $weekEnd) {
12296    // Extend to include tomorrow
12297    $end = new DateTime($tomorrowDate);
12298}
12299$end->modify('+1 day');
12300$period = new DatePeriod($start, $interval, $end);
12301```
12302
12303**Result**: Tomorrow events now loaded even at week boundary! ✓
12304
12305### Issue 2: Double HTML Encoding
12306
12307**Problem**: `&` characters showing as `&amp;`
12308
12309**Cause**: Double encoding on line 2625 and 2681
12310```php
12311// Line 2625:
12312$title = htmlspecialchars($event['title']); // "Coffee & Tea" → "Coffee &amp; Tea"
12313
12314// Line 2681:
12315$html .= htmlspecialchars($title); // "Coffee &amp; Tea" → "Coffee &amp;amp; Tea" ❌
12316```
12317
12318**Fixed**:
12319```php
12320// Line 2625:
12321$title = htmlspecialchars($event['title']); // Encode once
12322
12323// Line 2681:
12324$html .= $title; // Use already-encoded value ✓
12325```
12326
12327**Result**: `&` displays correctly! ✓
12328
12329### Both Fixes Critical
12330
12331These were **two separate bugs**:
123321. **Loading bug**: Tomorrow events not read from files
123332. **Display bug**: Double-encoding text
12334
12335Both needed fixing for Tomorrow section to work properly!
12336
12337## Version 4.2.3 (2026-02-07) - FIX TOMORROW SECTION AT WEEK BOUNDARY
12338
12339### �� Critical Fix
12340- **Fixed:** Tomorrow section missing when tomorrow is outside current week
12341- **Fixed:** Today section now always shows regardless of week boundaries
12342- **Changed:** Today/Tomorrow processed BEFORE week boundary checks
12343
12344### The Problem
12345
12346**Scenario**: Today is Saturday (last day of week)
12347- Week: Feb 1 (Sun) → Feb 7 (Sat) ← Today
12348- Tomorrow: Feb 8 (Sun) ← **Start of NEXT week**
12349
12350**BROKEN Logic** (v4.2.2):
12351```php
12352foreach ($events as $dateKey => $dayEvents) {
12353    if ($dateKey < $weekStart) continue; // Skip old events
12354
12355    // ...week processing...
12356
12357    if ($dateKey === $tomorrowStr) {  // ← Never reached!
12358        $tomorrowEvents[] = $event;   //   Tomorrow > weekEnd
12359    }
12360}
12361```
12362
12363**Result**: Tomorrow events never added because loop skipped them! ❌
12364
12365### The Fix
12366
12367**Process Today/Tomorrow FIRST**:
12368```php
12369foreach ($events as $dateKey => $dayEvents) {
12370    $eventsWithConflicts = $this->detectTimeConflicts($dayEvents);
12371
12372    foreach ($eventsWithConflicts as $event) {
12373        // ALWAYS process Today and Tomorrow first!
12374        if ($dateKey === $todayStr) {
12375            $todayEvents[] = $event; // ✓ Always shows
12376        }
12377        if ($dateKey === $tomorrowStr) {
12378            $tomorrowEvents[] = $event; // ✓ Always shows
12379        }
12380
12381        // THEN check week boundaries for grid
12382        if ($dateKey >= $weekStart && $dateKey <= $weekEnd) {
12383            $weekEvents[$dateKey][] = $event;
12384        }
12385
12386        // Important events still week-only
12387        if ($isImportant && $dateKey >= $weekStart && $dateKey <= $weekEnd) {
12388            $importantEvents[] = $event;
12389        }
12390    }
12391}
12392```
12393
12394### What Changed
12395
12396**Before**:
123971. Skip events < weekStart ❌
123982. Process week grid
123993. Try to add Today/Tomorrow ← **Failed if outside week**
124004. Add Important events
12401
12402**After**:
124031. **Always add Today events** ✓
124042. **Always add Tomorrow events** ✓
124053. Add to week grid if in range
124064. Add Important events if in range
12407
12408**Result**:
12409- Today section: ✓ Always shows
12410- Tomorrow section: ✓ Always shows (even at week boundary!)
12411- Week grid: ✓ Only current week
12412- Important: ✓ Only current week
12413
12414### Edge Cases Fixed
12415
12416**Saturday → Sunday transition**:
12417- Today (Sat): Shows in Today section ✓
12418- Tomorrow (Sun): Shows in Tomorrow section ✓
12419- Week grid: Only shows Sat (today) ✓
12420
12421**Sunday → Monday transition**:
12422- Today (Sun): Shows in Today section ✓
12423- Tomorrow (Mon): Shows in Tomorrow section ✓
12424- Week grid: Shows both Sun and Mon ✓
12425
12426**Perfect! Tomorrow section now always works!** ��
12427
12428## Version 4.2.2 (2026-02-07) - SUNDAY NOT SATURDAY!
12429
12430### �� Corrected Week Options
12431- **Changed:** Week start options are now Monday vs **Sunday** (not Saturday!)
12432- **Changed:** Default is **Sunday** (US/Canada standard)
12433- **Fixed:** Day names array for Sunday start: S M T W T F S
12434
12435### �� Correct Week Start Options
12436
12437**Sunday Start** (Default):
12438- Grid shows: **S M T W T F S**
12439- Week: Sunday → Saturday
12440- US/Canada standard
12441- Most common worldwide
12442
12443**Monday Start**:
12444- Grid shows: **M T W T F S S**
12445- Week: Monday → Sunday
12446- ISO 8601 standard
12447- Common in Europe
12448
12449### Technical Changes
12450
12451**All References Updated**:
12452```php
12453// Changed from 'saturday' to 'sunday' in:
12454- Admin validation
12455- Week calculation logic
12456- Day names array
12457- Default value
12458- Comments
12459```
12460
12461**Sunday Calculation** (when today is Saturday):
12462```php
12463$today = date('w'); // 0=Sun, 6=Sat
12464if ($today == 0) {
12465    $weekStart = date('Y-m-d'); // Today!
12466} else {
12467    // Go back $today days to last Sunday
12468    $weekStart = date('Y-m-d', strtotime('-' . $today . ' days'));
12469}
12470```
12471
12472**Examples**:
12473- Today (Saturday): Week = Sun Feb 1 → Sat Feb 7
12474- Tomorrow (Sunday): Week = Sun Feb 8 → Sat Feb 14
12475
12476**Sorry for the confusion - it's Sunday not Saturday!** ��
12477
12478## Version 4.2.1 (2026-02-07) - FIX WEEK CALCULATION ON SATURDAY
12479
12480### �� Critical Fix
12481- **Fixed:** Week calculation broken when today is Saturday
12482- **Fixed:** Events not showing in Today/Important sections
12483- **Fixed:** Week grid event bars missing
12484- **Changed:** Default week start is Saturday (matches main calendar)
12485
12486### Technical Details
12487
12488**The Bug**:
12489```php
12490// BROKEN (v4.2.0):
12491$weekStart = date('Y-m-d', strtotime('saturday this week'));
12492// When TODAY is Saturday, this is ambiguous and fails!
12493
12494// FIXED (v4.2.1):
12495$today = date('w'); // 0 (Sun) to 6 (Sat)
12496if ($today == 6) {
12497    $weekStart = date('Y-m-d'); // Today!
12498} else {
12499    $daysBack = ($today == 0) ? 1 : ($today + 1);
12500    $weekStart = date('Y-m-d', strtotime('-' . $daysBack . ' days'));
12501}
12502$weekEnd = date('Y-m-d', strtotime($weekStart . ' +6 days'));
12503```
12504
12505**Why It Failed**:
12506- `strtotime('saturday this week')` is ambiguous when run ON a Saturday
12507- PHP may interpret it as "next Saturday" or fail
12508- Result: Week range was wrong, events filtered out
12509
12510**The Fix**:
12511- Explicit calculation using day-of-week math
12512- Saturday (day 6): weekStart = today
12513- Sunday (day 0): weekStart = yesterday
12514- Monday-Friday: calculate days back to last Saturday
12515
12516**Result**: Works reliably every day of the week!
12517
12518**Default Changed**: Saturday start (was Monday in 4.2.0)
12519- Matches main calendar behavior
12520- Users can still switch to Monday in settings
12521
12522## Version 4.2.0 (2026-02-07) - WEEK START DAY SELECTOR
12523
12524### ✨ New Feature
12525- **Added:** Week start day selector in Themes tab
12526- **Added:** Choose between Monday (ISO standard) or Saturday week start
12527- **Added:** Week grid and all events now respect the selected start day
12528- **Changed:** Themes tab renamed to "Sidebar Widget Settings"
12529
12530### �� Week Start Options
12531
12532**Monday Start** (Default):
12533- Grid shows: M T W T F S S
12534- Week runs: Monday → Sunday
12535- ISO 8601 standard
12536- Common in Europe, most of world
12537
12538**Saturday Start**:
12539- Grid shows: S S M T W T F
12540- Week runs: Saturday → Friday
12541- Common in Middle East
12542- Sabbath-observant communities
12543
12544### Technical Details
12545
12546**Configuration**:
12547```php
12548// Saved in: data/meta/calendar_week_start.txt
12549// Values: 'monday' or 'saturday'
12550
12551// Week calculation:
12552if ($weekStartDay === 'saturday') {
12553    $weekStart = date('Y-m-d', strtotime('saturday this week'));
12554    $weekEnd = date('Y-m-d', strtotime('friday next week'));
12555} else {
12556    $weekStart = date('Y-m-d', strtotime('monday this week'));
12557    $weekEnd = date('Y-m-d', strtotime('sunday this week'));
12558}
12559```
12560
12561**Day Names Array**:
12562```php
12563// Monday start: ['M', 'T', 'W', 'T', 'F', 'S', 'S']
12564// Saturday start: ['S', 'S', 'M', 'T', 'W', 'T', 'F']
12565```
12566
12567**What Changes**:
12568- Week grid day letters
12569- Week grid date sequence
12570- Today/Tomorrow/Important event date ranges
12571- Week event grouping
12572
12573**What Stays Same**:
12574- All themes still work
12575- Event data unchanged
12576- Main calendar unaffected
12577
12578### How to Change:
12579
125801. Admin → Calendar → �� Themes tab
125812. Under "Week Start Day" section
125823. Select Monday or Saturday
125834. Click "Save Settings"
125845. Refresh sidebar to see changes
12585
12586**Perfect for international users or religious observances!** ��
12587
12588## Version 4.1.4 (2026-02-07) - WEEK STARTS SUNDAY & LIGHTER BACKGROUNDS
12589
12590### ��️ Calendar Improvements
12591- **Changed:** Week grid now starts on Sunday and ends on Saturday (matches main calendar)
12592- **Changed:** Event section backgrounds much lighter (almost white)
12593- **Changed:** Individual event backgrounds lighter and more readable
12594- **Changed:** Event borders now theme-colored
12595
12596### Technical Details
12597
12598**Week Start Change**:
12599```php
12600// Before:
12601$weekStart = date('Y-m-d', strtotime('monday this week'));
12602$weekEnd = date('Y-m-d', strtotime('sunday this week'));
12603$dayNames = ['M', 'T', 'W', 'T', 'F', 'S', 'S'];
12604
12605// After:
12606$weekStart = date('Y-m-d', strtotime('sunday this week'));
12607$weekEnd = date('Y-m-d', strtotime('saturday this week'));
12608$dayNames = ['S', 'M', 'T', 'W', 'T', 'F', 'S'];
12609```
12610
12611**Background Colors**:
12612```php
12613// Section backgrounds (Today, Tomorrow, Important):
12614Matrix: rgba(255, 255, 255, 0.05)    // Very light overlay
12615Purple: rgba(255, 255, 255, 0.08)    // Slightly lighter
12616Professional: rgba(255, 255, 255, 0.95)  // Almost white!
12617
12618// Individual event backgrounds:
12619Matrix: rgba(255, 255, 255, 0.03)    // Subtle
12620Purple: rgba(255, 255, 255, 0.05)    // Light
12621Professional: rgba(255, 255, 255, 0.5)   // Semi-transparent white
12622```
12623
12624**Event Borders**:
12625```php
12626Matrix: rgba(0, 204, 7, 0.2)         // Green
12627Purple: rgba(155, 89, 182, 0.2)      // Purple
12628Professional: rgba(74, 144, 226, 0.2) // Blue
12629```
12630
12631### Visual Result:
12632
12633**Before**: Dark backgrounds made text hard to read
12634**After**: Light backgrounds make events pop and text very readable
12635
12636**Week Grid**:
12637```
12638Before: [M][T][W][T][F][S][S]
12639After:  [S][M][T][W][T][F][S]  ← Now matches main calendar!
12640```
12641
12642## Version 4.1.3 (2026-02-07) - EVENT TEXT THEME COLORS
12643
12644### �� Final Theme Polish
12645- **Fixed:** Event titles in Today/Tomorrow/Important sections now use theme colors
12646- **Fixed:** Event times now use theme bright color
12647- **Fixed:** Event dates use theme dim color
12648- **Fixed:** Task checkboxes use theme bright color
12649- **Fixed:** Event color bars use theme-appropriate shadows
12650- **Fixed:** No text shadows on Professional theme
12651
12652### Technical Details
12653
12654**Event Text Colors**:
12655```php
12656// Matrix:
12657- Title: #00cc07 (green)
12658- Time: #00dd00 (bright green)
12659- Date: #00aa00 (dim green)
12660- Text shadow: 0 0 3px (glow)
12661
12662// Purple:
12663- Title: #b19cd9 (lavender)
12664- Time: #d4a5ff (bright purple)
12665- Date: #8e7ab8 (dim purple)
12666- Text shadow: 0 0 3px (glow)
12667
12668// Professional:
12669- Title: #2c3e50 (dark grey)
12670- Time: #4a90e2 (blue)
12671- Date: #7f8c8d (grey)
12672- Text shadow: none (clean)
12673```
12674
12675**Color Bar Shadows**:
12676```php
12677// Matrix & Purple: Glow effect
12678box-shadow: 0 0 3px [event-color];
12679
12680// Professional: Subtle shadow
12681box-shadow: 0 1px 2px rgba(0,0,0,0.2);
12682```
12683
12684### What's Now Fully Themed:
12685
12686✅ Sidebar background & border
12687✅ Header (clock box) background, border, text
12688✅ Week grid background, borders, cells
12689✅ Week grid day letters & numbers
12690✅ Week grid event bars & "+N more" text
12691✅ Add Event button background & text
12692Today/Tomorrow/Important event titles
12693✅ Event times
12694✅ Event dates (Important section)
12695✅ Task checkboxes
12696✅ Event color bars
12697✅ All text shadows (glow vs none)
12698
12699**Every single element now respects the theme!** ��
12700
12701## Version 4.1.2 (2026-02-07) - COMPLETE THEME INTEGRATION
12702
12703### �� Theme Improvements
12704- **Fixed:** Week calendar grid now uses theme colors (purple/blue)
12705- **Fixed:** Add Event button now uses theme colors
12706- **Fixed:** Clock box border now matches theme
12707- **Fixed:** All text shadows respect theme (no glow on professional)
12708- **Fixed:** Event bars use theme-appropriate shadows
12709
12710### Technical Details
12711
12712**Week Grid Theming**:
12713```php
12714// Matrix: Dark green (#1a3d1a) background, green (#00cc07) borders
12715// Purple: Dark purple (#3d2b4d) background, purple (#9b59b6) borders
12716// Professional: Light grey (#e8ecf1) background, blue (#4a90e2) borders
12717```
12718
12719**Add Event Button**:
12720```php
12721// Matrix: Dark green (#006400) with bright green text
12722// Purple: Purple (#7d3c98) with lavender text
12723// Professional: Blue (#3498db) with white text
12724```
12725
12726**Text Shadows**:
12727```php
12728// Matrix & Purple: Glow effects (text-shadow: 0 0 6px color)
12729// Professional: No glow (clean look)
12730```
12731
12732**CSS Overrides**:
12733```css
12734/* Purple theme */
12735.sidebar-purple .eventlist-today-header {
12736    border-color: #9b59b6;
12737    box-shadow: 0 0 8px rgba(155, 89, 182, 0.2);
12738}
12739
12740/* Professional theme */
12741.sidebar-professional .eventlist-today-header {
12742    border-color: #4a90e2;
12743    box-shadow: 0 2px 4px rgba(0, 0, 0, 0.1);
12744}
12745```
12746
12747### What Changed Per Theme:
12748
12749**Purple Dream**:
12750- Week grid: Purple borders and dark purple background
12751- Add Event: Purple button with lavender text
12752- Clock box: Purple border with purple glow
12753- Event bars: Purple glow instead of green
12754- All text: Purple/lavender shades
12755
12756**Professional Blue**:
12757- Week grid: Blue borders and light grey background
12758- Add Event: Blue button with white text
12759- Clock box: Blue border with subtle shadow (no glow)
12760- Event bars: Subtle shadows (no glow)
12761- All text: Dark grey and blue shades
12762
12763**Matrix Edition**: Unchanged (still perfect green theme!)
12764
12765## Version 4.1.1 (2026-02-07) - THEMES TAB & TOOLTIP LEFT POSITIONING
12766
12767### ✨ New Features
12768- **Added:** �� Themes tab in admin for sidebar widget theming
12769- **Added:** Three visual themes: Matrix (green), Purple Dream (purple), Professional Blue (blue/grey)
12770- **Added:** Theme selector with live previews
12771- **Added:** Theme persistence across page loads
12772
12773### �� Available Themes
12774
12775**Matrix Edition** (Default):
12776- Dark background (#242424)
12777- Green accents (#00cc07)
12778- Neon glow effects
12779- Original Matrix styling
12780
12781**Purple Dream**:
12782- Dark purple background (#2a2030)
12783- Purple/violet accents (#9b59b6)
12784- Elegant purple glow
12785- Rich purple color scheme
12786
12787**Professional Blue**:
12788- Light grey background (#f5f7fa)
12789- Blue accents (#4a90e2)
12790- Clean professional look
12791- Subtle shadows instead of glow
12792
12793### �� Bug Fix
12794- **Fixed:** Tooltips now go UP and to the LEFT (was going right)
12795- **Changed:** Tooltip offset from `rect.right` to `rect.left - 150px`
12796
12797### Technical Details
12798
12799**Theme System**:
12800```php
12801// Saved in: data/meta/calendar_theme.txt
12802// Applied dynamically in syntax.php
12803$theme = $this->getSidebarTheme();  // 'matrix', 'purple', or 'professional'
12804$styles = $this->getSidebarThemeStyles($theme);
12805
12806// Styles include:
12807- bg, border, shadow
12808- header_bg, header_border, header_shadow
12809- text_primary, text_bright, text_dim
12810- grid_bg, grid_border
12811- cell_bg, cell_today_bg
12812```
12813
12814**Theme Changes**:
12815- Header background gradient
12816- Border colors
12817- Text colors
12818- Shadow/glow effects
12819- Grid colors
12820
12821**How to Change**:
128221. Admin → Calendar → �� Themes tab
128232. Select desired theme
128243. Click "Save Theme"
128254. Refresh page to see changes
12826
12827### Notes
12828- Themes only affect sidebar widget appearance
12829- Main calendar view unchanged
12830- Theme setting stored in `data/meta/calendar_theme.txt`
12831- Safe to switch themes - no data affected
12832
12833## Version 4.1.0 (2026-02-07) - FIX EVENT SORTING & TOOLTIP POSITIONING
12834
12835### �� Bug Fixes
12836- **Fixed:** Events now sort chronologically by time (was using string comparison)
12837- **Fixed:** Tooltip positioning using JavaScript like system tooltips
12838- **Fixed:** All-day events appear first, then events in time order
12839
12840### Technical Details
12841
12842**Event Sorting Fix**:
12843```php
12844// BROKEN (v4.0.9):
12845return strcmp($aTime, $bTime);
12846// String comparison: "10:00" < "8:00" because "1" < "8"
12847// Result: 10:00 AM shown BEFORE 8:00 AM ❌
12848
12849// FIXED (v4.1.0):
12850$aMinutes = $this->timeToMinutes($aTime);  // 8:00 = 480
12851$bMinutes = $this->timeToMinutes($bTime);  // 10:00 = 600
12852return $aMinutes - $bMinutes;
12853// Result: 8:00 AM shown BEFORE 10:00 AM ✓
12854```
12855
12856**Example Before Fix**:
12857```
12858�� Weekend Ticket Duty (all-day)
128598:00 AM START TICKETS
1286010:00 AM Soul Winning    ← Wrong!
128619:45 AM Coffee           ← Should be before 10:00 AM
12862```
12863
12864**Example After Fix**:
12865```
12866�� Weekend Ticket Duty (all-day)
128678:00 AM START TICKETS
128689:45 AM Coffee           ← Correct!
1286910:00 AM Soul Winning
12870```
12871
12872**Tooltip Positioning**:
12873- Added JavaScript to dynamically position tooltips using `getBoundingClientRect()`
12874- Uses CSS custom properties `--tooltip-left` and `--tooltip-top`
12875- Positioned on `mouseenter` event
12876- Matches system tooltip implementation (no cutoff)
12877
12878**JavaScript Implementation**:
12879```javascript
12880element.addEventListener("mouseenter", function() {
12881    const rect = element.getBoundingClientRect();
12882    element.style.setProperty("--tooltip-left", (rect.right - 10) + "px");
12883    element.style.setProperty("--tooltip-top", (rect.top - 30) + "px");
12884});
12885```
12886
12887**Result**: Tooltips now extend beyond sidebar without cutoff, positioned dynamically!
12888
12889## Version 4.0.9 (2026-02-07) - COMPACT TOOLTIPS & OVERFLOW FIX
12890
12891### �� UI Improvements
12892- **Fixed:** Sidebar tooltips no longer cut off at sidebar edge
12893- **Fixed:** Changed inline `overflow:hidden` to `overflow:visible` in sidebar
12894- **Changed:** Main calendar conflict tooltip now much smaller (was too big)
12895
12896### Technical Details
12897
12898**Sidebar Overflow Fix**:
12899```php
12900// Before (line 2005):
12901style="...overflow:hidden..."  // ← Blocked tooltips!
12902
12903// After:
12904style="...overflow:visible..."  // ← Tooltips extend beyond!
12905```
12906
12907**The Problem**: Inline `overflow:hidden` overrode CSS `overflow:visible !important`
12908
12909**Main Calendar Tooltip Size**:
12910```css
12911/* Before: */
12912.conflict-tooltip {
12913    border: 2px solid #ff9800;
12914    border-radius: 6px;
12915    padding: 8px 12px;
12916    font-size: 12px;
12917    min-width: 200px;
12918    max-width: 350px;
12919}
12920
12921/* After: */
12922.conflict-tooltip {
12923    border: 1px solid #ff9800;  /* Thinner */
12924    border-radius: 3px;          /* Smaller */
12925    padding: 4px 8px;            /* Less padding */
12926    font-size: 10px;             /* Smaller header */
12927    min-width: 120px;            /* Narrower */
12928    max-width: 200px;            /* Narrower */
12929}
12930
12931.conflict-tooltip-body {
12932    padding: 6px 8px;  /* Was 10px 12px */
12933    font-size: 9px;    /* Was 11px */
12934    line-height: 1.4;  /* Was 1.6 */
12935}
12936
12937.conflict-item {
12938    padding: 2px 0;  /* Was 4px */
12939    font-size: 9px;  /* Added smaller font */
12940}
12941```
12942
12943**Result**:
12944- Main calendar tooltip ~50% smaller
12945- Sidebar tooltips now extend beyond borders
12946- Both tooltips compact and readable
12947
12948## Version 4.0.8 (2026-02-07) - FIX NEWLINES IN TOOLTIP
12949
12950### �� Bug Fix
12951- **Fixed:** Tooltip now shows actual line breaks (not literal `\n` text)
12952- **Changed:** Using HTML entity `&#10;` for newlines instead of `\n`
12953
12954### Technical Details
12955
12956**The Problem**:
12957```php
12958// Before (v4.0.7):
12959$conflictTooltip = 'Conflicts with:\n';  // Literal \n showed in tooltip
12960
12961// Displayed as:
12962"Conflicts with:\n• Event 1\n• Event 2"  // ← Literal backslash-n
12963```
12964
12965**The Fix**:
12966```php
12967// After (v4.0.8):
12968$conflictTooltip = "Conflicts with:&#10;";  // HTML entity for newline
12969
12970// Displays as:
12971Conflicts with:
12972• Event 1
12973• Event 2
12974```
12975
12976**Why `&#10;` Works**:
12977- HTML entity for line feed character
12978- Works in data attributes
12979- CSS `white-space: pre-line` preserves the newlines
12980- Renders as actual line breaks in tooltip
12981
12982**Applied to**:
12983- PHP rendering (sidebar Today/Tomorrow/Important)
12984- JavaScript rendering (clicked day events)
12985
12986## Version 4.0.7 (2026-02-07) - COMPACT TOOLTIP & OVERFLOW FIX
12987
12988### �� UI Improvements
12989- **Changed:** Tooltip size reduced significantly (much more compact)
12990- **Fixed:** Tooltip now overflows sidebar borders (not cut off)
12991- **Changed:** Smaller padding (3px vs 6px), smaller font (9px vs 11px)
12992- **Changed:** Narrower width (120-200px vs 200-300px)
12993
12994### Technical Details
12995
12996**Tooltip Size Reduction**:
12997```css
12998/* Before (v4.0.6):
12999padding: 6px 10px;
13000font-size: 11px;
13001min-width: 200px;
13002max-width: 300px;
13003
13004/* After (v4.0.7): */
13005padding: 3px 6px;
13006font-size: 9px;
13007min-width: 120px;
13008max-width: 200px;
13009```
13010
13011**Overflow Fix**:
13012```css
13013/* Allow tooltip to extend beyond sidebar */
13014.sidebar-widget,
13015.sidebar-matrix {
13016    overflow: visible !important;
13017}
13018
13019/* Position tooltip outside */
13020[data-tooltip]:before {
13021    bottom: 120%;  /* Further above */
13022    right: -10px;  /* Can extend beyond edge */
13023    z-index: 10000; /* Always on top */
13024}
13025```
13026
13027**Visual Result**:
13028- Tooltip is ~40% smaller
13029- Extends beyond sidebar border if needed
13030- Still readable, just more compact
13031- Better for small screens
13032
13033## Version 4.0.6 (2026-02-07) - MATCH MAIN CALENDAR LOGIC & TOOLTIP POSITIONING
13034
13035### �� Critical Fix
13036- **Fixed:** Sidebar conflict detection now matches main calendar logic exactly
13037- **Fixed:** Checks both `end_time` (snake_case) and `endTime` (camelCase) field names
13038- **Fixed:** Events without end time now treated as zero-duration (not +1 hour)
13039- **Fixed:** Now matches what you see in main calendar view
13040
13041### ✨ UI Improvement
13042- **Changed:** Conflict tooltips now appear ABOVE and to the LEFT (not below/right)
13043- **Added:** Custom CSS tooltip with data-tooltip attribute
13044- **Improved:** Better tooltip positioning - doesn't overflow screen edges
13045
13046### Technical Details
13047
13048**The Problem - Field Name Mismatch**:
13049```php
13050// Main calendar (line 697):
13051$end1 = isset($evt1['endTime']) ? ... // ← Checks 'endTime' (camelCase)
13052
13053// Sidebar (before fix):
13054$endTime = isset($event['end_time']) ? ... // ← Only checked 'end_time' (snake_case)
13055```
13056
13057**The Problem - Duration Logic**:
13058```php
13059// Main calendar (line 697):
13060$end1 = isset($evt1['endTime']) && !empty($evt1['endTime'])
13061    ? $evt1['endTime']
13062    : $evt1['time'];  // ← Uses START time (zero duration)
13063
13064// Sidebar (before fix):
13065$endTime = ... ? ... : $this->addHoursToTime($startTime, 1);  // ← Added 1 hour!
13066```
13067
13068**The Fix**:
13069```php
13070// Now checks BOTH field names:
13071if (isset($event['end_time']) && $event['end_time'] !== '') {
13072    $endTime = $event['end_time'];
13073} elseif (isset($event['endTime']) && $event['endTime'] !== '') {
13074    $endTime = $event['endTime'];
13075} else {
13076    $endTime = $startTime;  // ← Matches main calendar!
13077}
13078```
13079
13080**Tooltip Positioning**:
13081- Uses `data-tooltip` attribute instead of `title`
13082- CSS positions tooltip ABOVE badge (`bottom: 100%`)
13083- Aligns to RIGHT edge (`right: 0`)
13084- Arrow points down to badge
13085- Black background with white text
13086- Max width 300px
13087
13088### Example
13089
13090**6:00 PM Evening Service** (no end time):
13091- Old: 6:00 PM - 7:00 PM (assumed 1 hour) ❌
13092- New: 6:00 PM - 6:00 PM (zero duration) ✓ Matches main calendar!
13093
13094**3:30 PM-7:00 PM Super Bowl** vs **6:00 PM Service**:
13095- Zero-duration events at 6:00 PM don't overlap with anything
13096- ONLY if service has explicit end time (e.g., 6:00-7:00) will it conflict
13097
13098**Tooltip appears**:
13099```
13100        ┌────────────────────┐
13101        │ Conflicts with:    │
13102        │ • Super Bowl       │
13103        │   (3:30 PM-7:00 PM)│
13104        └─────────┬──────────┘
131051310613107```
13108
13109## Version 4.0.5 (2026-02-07) - FIX END_TIME DEFAULT HANDLING
13110
13111### �� Bug Fix
13112- **Fixed:** Events without end_time now properly get 1-hour default duration
13113- **Fixed:** Empty string end_time values now treated as missing (was causing issues)
13114- **Improved:** More robust checking for `end_time` field (checks both isset and not empty)
13115
13116### Technical Details
13117
13118**The Problem**:
13119```php
13120// Before (broken):
13121$endTime = isset($event['end_time']) ? $event['end_time'] : default;
13122
13123// If end_time exists but is empty string "":
13124isset($event['end_time']) = TRUE
13125$endTime = ""  // ← Empty string, not default!
13126```
13127
13128**The Fix**:
13129```php
13130// After (fixed):
13131$endTime = (isset($event['end_time']) && $event['end_time'] !== '')
13132    ? $event['end_time']
13133    : $this->addHoursToTime($startTime, 1);
13134
13135// Now empty string gets the default 1-hour duration
13136```
13137
13138**Why This Matters**:
13139Events like "6:00 PM Evening Service" with no end time should be treated as 6:00-7:00 PM (1 hour). If the `end_time` field contains an empty string instead of being absent, the old code would use the empty string, causing conflict detection to fail.
13140
13141**Example**:
13142```
13143Super Bowl: 3:30 PM - 7:00 PM
13144Evening Service: 6:00 PM - ??? (should be 7:00 PM)
13145
13146If end_time = "" (empty string):
13147  Old code: Uses "" → conflict detection fails
13148  New code: Uses 7:00 PM → conflict detected ✓
13149```
13150
13151### Testing
13152If you're still not seeing the conflict on the 6:00 PM service:
131531. Check if the event has `end_time` set in the JSON
131542. Clear cache (Admin → Manage Events → Clear Cache)
131553. The conflict should now appear
13156
13157## Version 4.0.4 (2026-02-07) - CONFLICT TOOLTIP WITH DETAILS
13158
13159### ✨ Feature Added
13160- **Added:** Hover over ⚠ badge to see which events are conflicting
13161- **Added:** Tooltip shows conflicting event titles and times
13162- **Added:** Works in both sidebar sections and clicked day events
13163
13164### Technical Details
13165
13166**Conflict Tracking Enhanced**:
13167```php
13168// Now tracks WHICH events conflict:
13169$event['conflictingWith'] = [
13170    ['title' => 'Meeting', 'time' => '10:00', 'end_time' => '11:00'],
13171    ['title' => 'Call', 'time' => '10:30', 'end_time' => '11:30']
13172];
13173```
13174
13175**Tooltip Format**:
13176```
13177Conflicts with:
13178• Meeting (10:00 AM-11:00 AM)
13179• Call (10:30 AM-11:30 PM)
13180```
13181
13182**Where It Works**:
13183- ✅ Today section (sidebar)
13184- ✅ Tomorrow section (sidebar)
13185- ✅ Important Events section (sidebar)
13186- ✅ Clicked day events (week grid)
13187
13188**Cursor**: Changes to `help` cursor on hover to indicate tooltip
13189
13190### Note on Multi-Day Events
13191The current conflict detection only checks time conflicts **within the same day**. If you have an event that spans multiple days (e.g., start date on Monday, end date on Wednesday), each day is treated independently. To see conflicts across the entire span, you would need to check each individual day.
13192
13193## Version 4.0.3 (2026-02-07) - FIX CONFLICT BADGE & IMPORTANT EVENTS LOGIC
13194
13195### �� Bug Fixes
13196- **Fixed:** Conflict badge (⚠) now displays in sidebar Today/Tomorrow/Important sections
13197- **Fixed:** Important Events now shows events even if they're today or tomorrow
13198- **Fixed:** Field name mismatch - was checking `'conflicts'` (plural) but setting `'conflict'` (singular)
13199
13200### Technical Details
13201
13202**Conflict Badge Issue**:
13203```php
13204// BROKEN (line 2511):
13205$hasConflict = isset($event['conflicts']) && !empty($event['conflicts']);
13206// ↑ Checking 'conflicts' (plural)
13207
13208// But detectTimeConflicts() sets:
13209$event['conflict'] = true/false;
13210// ↑ Setting 'conflict' (singular)
13211
13212// FIXED:
13213$hasConflict = isset($event['conflict']) && $event['conflict'];
13214```
13215
13216**Result**: Badge now shows for ALL conflicting events in sidebar sections
13217
13218**Important Events Logic Issue**:
13219```php
13220// BROKEN:
13221if ($dateKey === $todayStr) {
13222    $todayEvents[] = ...;
13223} elseif ($dateKey === $tomorrowStr) {
13224    $tomorrowEvents[] = ...;
13225} else {  // ← Only checked if NOT today/tomorrow!
13226    if ($isImportant) {
13227        $importantEvents[] = ...;
13228    }
13229}
13230
13231// FIXED:
13232if ($dateKey === $todayStr) {
13233    $todayEvents[] = ...;
13234}
13235if ($dateKey === $tomorrowStr) {
13236    $tomorrowEvents[] = ...;
13237}
13238// ↑ Changed to separate 'if' statements
13239if ($isImportant && $dateKey in this week) {
13240    $importantEvents[] = ...;  // ← Now includes today/tomorrow too!
13241}
13242```
13243
13244**Result**: Important namespace events now show in Important section even if they're today or tomorrow
13245
13246### Conflict Badge Display
13247- Simplified to just ⚠ icon (no count)
13248- Orange color (#ff9800)
13249- 10px font size
13250- Hover shows "Time conflict detected"
13251
13252## Version 4.0.2 (2026-02-07) - FIX IMPORTANT EVENTS DISPLAY
13253
13254### �� Bug Fix
13255- **Fixed:** Important Events section now displays all events correctly
13256- **Fixed:** Single-event days now get conflict flag (was returning early without flag)
13257- **Fixed:** Conflict detection no longer causes events to disappear from Important section
13258
13259### Technical Details
13260
13261**The Problem**:
13262- `detectTimeConflicts()` returned early if only 1 event on a day
13263- Returned original array without adding 'conflict' field
13264- This inconsistency caused issues in event categorization
13265
13266**The Solution**:
13267```php
13268// Before (broken):
13269if (empty($dayEvents) || count($dayEvents) < 2) {
13270    return $dayEvents;  // No 'conflict' field added!
13271}
13272
13273// After (fixed):
13274if (count($dayEvents) === 1) {
13275    return [array_merge($dayEvents[0], ['conflict' => false])];  // Always add flag
13276}
13277```
13278
13279**Result**:
13280- All events now have 'conflict' field consistently
13281- Single events: conflict = false
13282- Multiple events: conflict = true/false based on overlap
13283- Important Events section displays correctly
13284
13285## Version 4.0.1 (2026-02-06) - CONFLICT DETECTION, TAB REORDER, FIXES
13286
13287### �� Bug Fixes
13288- **Fixed:** Conflict badge (⚠) now displays in clicked day events
13289- **Fixed:** Recurring events edit now updates time and end_time correctly
13290- **Fixed:** Field names changed from 'start'/'end' to 'time'/'end_time' in recurring edit
13291
13292### ✨ Features Added
13293- **Added:** Time conflict detection for overlapping events
13294- **Added:** detectTimeConflicts() function checks all events on same day
13295- **Added:** timesOverlap(), timeToMinutes(), addMinutesToTime() helper functions
13296- **Added:** Events now have 'conflict' flag set automatically
13297
13298### �� UI Changes
13299- **Changed:** Admin tab order: �� Manage Events (first), �� Update Plugin, ⚙️ Outlook Sync
13300- **Changed:** Default admin tab is now "Manage Events" (was "Update Plugin")
13301- **Changed:** Week view now shows 4 colored event bars before "+1" (was 3 bars)
13302
13303### Technical Details
13304
13305**Conflict Detection**:
13306```php
13307// Automatically detects overlapping events on same day
13308// Sets 'conflict' flag to true if event overlaps with another
13309$eventsWithConflicts = $this->detectTimeConflicts($dayEvents);
13310```
13311
13312**Logic**:
13313- All-day events never conflict (no time set)
13314- Timed events check for overlap with other timed events
13315- Overlap = start1 < end2 AND start2 < end1
13316- Default duration is 60 minutes if no end_time
13317
13318**Recurring Events Fix**:
13319- Old: Updated `$event['start']` and `$event['end']` (wrong fields)
13320- New: Updates `$event['time']` and `$event['end_time']` (correct fields)
13321- Now edits actually save and update the events
13322
13323**Week View Bars**:
13324- Shows 4 colored bars instead of 3
13325- "+1" becomes "+2" with 5 events, "+3" with 6 events, etc.
13326
13327## Version 4.0.0 (2026-02-06) - MATRIX EDITION RELEASE ��
13328
13329**Major Release**: Complete Matrix-themed calendar plugin with advanced features!
13330
13331### �� Major Features
13332
13333#### Sidebar Widget
13334- **Week Grid**: Interactive 7-day calendar with click-to-view events
13335- **Live System Monitoring**: CPU load, real-time CPU, memory usage with tooltips
13336- **Live Clock**: Updates every second with date display
13337- **Real-time Weather**: Geolocation-based temperature with icon
13338- **Event Sections**: Today (orange), Tomorrow (green), Important (purple)
13339- **Add Event Button**: Dark green bar opens full event creation dialog
13340- **Matrix Theme**: Green glow effects throughout
13341
13342#### Event Management
13343- **Single Color Bars**: Clean 3px bars showing event's assigned color
13344- **All-Day Events First**: Then sorted chronologically by time
13345- **Conflict Detection**: Orange ⚠ badge on overlapping events
13346- **Rich Content**: Full DokuWiki formatting (**bold**, [[links]], //italic//)
13347- **HTML Rendering**: Pre-rendered for JavaScript display
13348- **Click-to-View**: Click week grid days to expand event details
13349
13350#### Admin Interface
13351- **Update Plugin Tab** (Default): Version info, changelog, prominent Clear Cache button
13352- **Outlook Sync Tab**: Microsoft Azure integration, category mapping, sync settings
13353- **Manage Events Tab**: Browse, edit, delete, move events across namespaces
13354
13355#### Outlook Sync
13356- **Bi-directional Sync**: DokuWiki ↔ Microsoft Outlook
13357- **Category Mapping**: Map colors to Outlook categories
13358- **Conflict Resolution**: Time conflict detection
13359- **Import/Export Config**: Encrypted configuration files
13360
13361### �� Design
13362- **Matrix Theme**: Authentic green glow aesthetic
13363- **Dark Backgrounds**: #1a1a1a header, rgba(36, 36, 36) sections
13364- **Color Scheme**:
13365  - Today: Orange #ff9800
13366  - Tomorrow: Green #4caf50
13367  - Important: Purple #9b59b6
13368  - Add Event: Dark green #006400
13369  - System bars: Green/Purple/Orange
13370
13371### �� Technical Highlights
13372- **Zero-margin Design**: Perfect flush alignment throughout
13373- **Flexbox Layout**: Modern, responsive structure
13374- **AJAX Operations**: No page reloads needed
13375- **Smart Sorting**: All-day events first, then chronological
13376- **Tooltip System**: Detailed stats on hover (working correctly)
13377- **Event Dialog**: Full form with drag support
13378- **Cache Management**: One-click cache clearing
13379
13380### �� Breaking Changes from v3.x
13381- Removed dual color bars (now single event color bar only)
13382- Add Event button moved to between header and week grid
13383- All-day events now appear FIRST (not last)
13384- Update Plugin tab is now the default admin tab
13385
13386### �� Bug Fixes (v3.10.x → v4.0.0)
13387- ✅ Fixed color bars not showing (align-self:stretch vs height:100%)
13388- ✅ Fixed tooltip function naming (sanitized calId for JavaScript)
13389- ✅ Fixed weather display (added updateWeather function)
13390- ✅ Fixed HTML rendering in events (title_html/description_html fields)
13391- ✅ Fixed Add Event dialog (null check for calendar element)
13392- ✅ Fixed text positioning in Add Event button
13393- ✅ Fixed spacing throughout sidebar widget
13394
13395### �� Complete Feature List
13396- Full calendar view (month grid)
13397- Sidebar widget (week view)
13398- Event panel (standalone)
13399- Event list (date ranges)
13400- Namespace support
13401- Color coding
13402- Time conflict detection
13403- DokuWiki syntax in events
13404- Outlook synchronization
13405- System monitoring
13406- Weather display
13407- Live clock
13408- Admin interface
13409- Cache management
13410- Draggable dialogs
13411- AJAX save/edit/delete
13412- Import/export config
13413
13414### �� Usage
13415
13416**Sidebar Widget**:
13417```
13418{{calendar sidebar}}
13419{{calendar sidebar namespace=team}}
13420```
13421
13422**Full Calendar**:
13423```
13424{{calendar}}
13425{{calendar year=2026 month=6 namespace=team}}
13426```
13427
13428**Event Panel**:
13429```
13430{{eventpanel}}
13431```
13432
13433**Event List**:
13434```
13435{{eventlist daterange=2026-01-01:2026-01-31}}
13436```
13437
13438### �� Stats
13439- **40+ versions** developed during v3.x iterations
13440- **3.10.0 → 3.11.4**: Polish and refinement
13441- **4.0.0**: Production-ready Matrix Edition
13442
13443### �� Credits
13444Massive iteration and refinement session resulting in a polished, feature-complete calendar plugin with authentic Matrix aesthetics and enterprise-grade Outlook integration.
13445
13446---
13447
13448## Previous Versions (v3.11.4 and earlier)
13449
13450## Version 3.11.4 (2026-02-06) - RESTORE HEADER BOTTOM SPACING
13451- **Changed:** Restored 2px bottom padding to header (was 0px, now 2px)
13452- **Improved:** Small breathing room between system stats bars and Add Event button
13453- **Visual:** Better spacing for cleaner appearance
13454
13455### CSS Change:
13456**eventlist-today-header**:
13457- `padding: 6px 10px 0 10px` → `padding: 6px 10px 2px 10px`
13458
13459### Visual Result:
13460```
13461│  ▓▓▓░░ ▓▓░░░ ▓▓▓▓░  │  ← Stats bars
13462│                       │  ← 2px space (restored)
13463├───────────────────────┤
13464│  + ADD EVENT          │  ← Add Event bar
13465├───────────────────────┤
13466```
13467
13468**Before (v3.11.3)**: No space, bars directly touch Add Event button
13469**After (v3.11.4)**: 2px breathing room for better visual hierarchy
13470
13471## Version 3.11.3 (2026-02-06) - FIX ADD EVENT DIALOG & TEXT POSITION
13472- **Fixed:** openAddEvent() function now checks if calendar element exists before reading dataset
13473- **Fixed:** Add Event button no longer throws "Cannot read properties of null" error
13474- **Changed:** Add Event text moved up 1px (position:relative; top:-1px)
13475- **Changed:** Line-height reduced from 12px to 10px for better text centering
13476- **Improved:** openAddEvent() works for both regular calendars and sidebar widgets
13477
13478### JavaScript Fix:
13479**Problem**: Line 1084-1085 in calendar-main.js
13480```javascript
13481const calendar = document.getElementById(calId);
13482const filteredNamespace = calendar.dataset.filteredNamespace; // ← Null error!
13483```
13484
13485**Solution**: Added null check
13486```javascript
13487const calendar = document.getElementById(calId);
13488const filteredNamespace = calendar ? calendar.dataset.filteredNamespace : null;
13489```
13490
13491**Why This Happened**:
13492- Regular calendar has element with id=calId
13493- Sidebar widget doesn't have this element (different structure)
13494- Code tried to read .dataset on null, causing error
13495
13496### Text Position Fix:
13497**Before**:
13498- line-height: 12px
13499- vertical-align: middle
13500- Text slightly low
13501
13502**After**:
13503- line-height: 10px
13504- position: relative; top: -1px
13505- Text perfectly centered
13506
13507### What Works Now:
13508✅ Click "+ ADD EVENT" in sidebar → Dialog opens
13509✅ No console errors
13510✅ Text properly centered vertically
13511✅ Form pre-filled with today's date
13512✅ Save works correctly
13513
13514## Version 3.11.2 (2026-02-06) - ADD EVENT DIALOG IN SIDEBAR
13515- **Added:** Event dialog to sidebar widget (same as regular calendar)
13516- **Changed:** Add Event button now opens proper event form dialog
13517- **Added:** renderEventDialog() called in renderSidebarWidget()
13518- **Fixed:** Add Event button calls openAddEvent() with calId, namespace, and today's date
13519- **Improved:** Can now add events directly from sidebar widget
13520
13521### Add Event Button Behavior:
13522**Before (v3.11.1)**: Showed alert with instructions
13523**After (v3.11.2)**: Opens full event creation dialog
13524
13525**Dialog Features**:
13526- Date field (defaults to today)
13527- Title field (required)
13528- Time field (optional)
13529- End time field (optional)
13530- Color picker
13531- Category field
13532- Description field
13533- Save and Cancel buttons
13534- Draggable dialog
13535
13536### Technical Changes:
13537- Added `$html .= $this->renderEventDialog($calId, $namespace);` at end of renderSidebarWidget()
13538- Changed Add Event onclick from alert to `openAddEvent('calId', 'namespace', 'YYYY-MM-DD')`
13539- Dialog uses same structure as regular calendar
13540- Uses existing openAddEvent() and saveEventCompact() JavaScript functions
13541
13542### User Flow:
135431. User clicks "+ ADD EVENT" green bar
135442. Event dialog opens with today's date pre-filled
135453. User fills in event details
135464. User clicks Save
135475. Event saved via AJAX
135486. Dialog closes
135497. Sidebar refreshes to show new event
13550
13551## Version 3.11.1 (2026-02-06) - FLUSH HEADER & ADD EVENT DIALOG
13552- **Fixed:** Removed bottom padding from header (was 2px, now 0)
13553- **Fixed:** Removed margin from stats container (was margin-top:2px, now margin:0)
13554- **Fixed:** Add Event bar now flush against header with zero gap
13555- **Changed:** Add Event button now shows helpful alert dialog instead of navigating to admin
13556- **Improved:** Alert provides clear instructions on how to add events
13557
13558### CSS Changes:
13559**eventlist-today-header**:
13560- `padding: 6px 10px 2px 10px` → `padding: 6px 10px 0 10px` (removed 2px bottom)
13561
13562**eventlist-stats-container**:
13563- `margin-top: 2px` → `margin: 0` (removed all margins)
13564
13565### Add Event Button Behavior:
13566**Before**: Clicked → Navigated to Admin → Manage Events tab
13567**After**: Clicked → Shows alert with instructions
13568
13569**Alert Message**:
13570```
13571To add an event, go to:
13572Admin → Calendar Management → Manage Events tab
13573or use the full calendar view {{calendar}}
13574```
13575
13576### Visual Result:
13577```
13578│  ▓▓▓░░ ▓▓░░░ ▓▓▓▓░  │  ← Stats (no margin-bottom)
13579├────────────────────────┤
13580│  + ADD EVENT           │  ← Perfectly flush!
13581├────────────────────────┤
13582```
13583
13584No gaps, perfectly aligned!
13585
13586## Version 3.11.0 (2026-02-06) - ADD EVENT BAR FINAL POSITION & SIZE
13587- **Moved:** Add Event bar back to original position (between header and week grid)
13588- **Changed:** Font size reduced from 9px to 8px (prevents text cutoff)
13589- **Changed:** Letter spacing reduced from 0.5px to 0.4px
13590- **Fixed:** Text now fully visible without being cut off
13591- **Final:** Optimal position and size determined
13592
13593### Final Layout:
13594```
13595┌─────────────────────────────┐
13596│  Clock | Weather | Stats    │  ← Header
13597├─────────────────────────────┤
13598│  + ADD EVENT                 │  ← Bar (back here, smaller text)
13599├─────────────────────────────┤
13600│  M  T  W  T  F  S  S        │  ← Week Grid
13601│  3  4  5  6  7  8  9        │
13602├─────────────────────────────┤
13603│  Today                       │  ← Event sections
13604└─────────────────────────────┘
13605```
13606
13607### Text Size Changes:
13608**v3.10.9**: 9px font, 0.5px letter-spacing → Text slightly cut off
13609**v3.11.0**: 8px font, 0.4px letter-spacing → Text fully visible
13610
13611### Why This Position:
13612- Separates header from calendar
13613- Natural action point after viewing stats
13614- Users see stats → decide to add event → view calendar
13615- Consistent with original design intent
13616
13617## Version 3.10.9 (2026-02-06) - ADD EVENT BAR MOVED BELOW WEEK GRID
13618- **Moved:** Add Event bar repositioned from between header/grid to below week grid
13619- **Improved:** Better visual flow - header → stats → grid → add button → events
13620- **Changed:** Add Event bar now acts as separator between calendar and event sections
13621
13622### New Layout:
13623```
13624┌─────────────────────────────┐
13625│  Clock | Weather | Stats    │  ← Header
13626├─────────────────────────────┤
13627│  M  T  W  T  F  S  S        │  ← Week Grid
13628│  3  4  5  6  7  8  9        │
13629├─────────────────────────────┤
13630│  + ADD EVENT                 │  ← Add bar (moved here!)
13631├─────────────────────────────┤
13632│  Today                       │  ← Event sections
13633│  Tomorrow                    │
13634│  Important Events            │
13635└─────────────────────────────┘
13636```
13637
13638### Visual Flow:
13639**Before (v3.10.8)**:
136401. Header (clock, weather, stats)
136412. **+ ADD EVENT** bar
136423. Week grid
136434. Event sections
13644
13645**After (v3.10.9)**:
136461. Header (clock, weather, stats)
136472. Week grid (calendar days)
136483. **+ ADD EVENT** bar
136494. Event sections
13650
13651### Benefits:
13652- Natural reading flow: View calendar → Add event → See events
13653- Add button positioned between calendar and event list
13654- Acts as visual separator
13655- More logical action placement
13656
13657## Version 3.10.8 (2026-02-06) - SINGLE COLOR BAR & ZERO MARGIN ADD BAR
13658- **Removed:** Section color bar (blue/orange/green/purple) - now shows ONLY event color
13659- **Changed:** Events now display with single 3px color bar (event's assigned color only)
13660- **Fixed:** Add Event bar now has zero margin (margin:0) - touches header perfectly
13661- **Simplified:** Cleaner visual with one color bar instead of two
13662- **Improved:** More space for event content without extra bar
13663
13664### Visual Changes:
13665
13666**Before (v3.10.7)** - Dual color bars:
13667```
13668├─ [Orange][Green]  Event Title
13669├─ [Blue][Purple]   Event Title
13670```
13671
13672**After (v3.10.8)** - Single color bar:
13673```
13674├─ [Green]  Event Title    ← Only event color!
13675├─ [Purple] Event Title    ← Only event color!
13676```
13677
13678### Add Bar Changes:
13679- Added `margin:0` to eliminate gaps
13680- Now flush against header (no space above)
13681- Now flush against week grid (no space below)
13682- Perfect seamless connection
13683
13684### Technical Changes:
13685**renderSidebarEvent()**:
13686- Removed section color bar (4px)
13687- Kept only event color bar (3px)
13688
13689**showDayEvents() JavaScript**:
13690- Removed section color bar (4px blue)
13691- Kept only event color bar (3px)
13692
13693**Add Event bar**:
13694- Added `margin:0` inline style
13695- Removed all top/bottom margins
13696
13697## Version 3.10.7 (2026-02-06) - COLOR BARS FIX FOR SECTIONS & DARK GREEN ADD BAR
13698- **Fixed:** Color bars now display in Today/Tomorrow/Important sections (was only showing in clicked day)
13699- **Fixed:** Changed Today/Tomorrow/Important event rendering to use `align-self:stretch` instead of `height:100%`
13700- **Changed:** Add Event bar color from orange to dark green (#006400)
13701- **Changed:** Add Event bar height increased from 6px to 12px (text no longer cut off)
13702- **Changed:** Add Event bar text now bright green (#00ff00) with green glow
13703- **Changed:** Add Event bar font size increased from 7px to 9px
13704- **Changed:** Add Event bar letter spacing increased to 0.5px
13705- **Improved:** Hover effect on Add Event bar now darker green (#004d00)
13706
13707### Color Bar Fix Details:
13708**Problem**: Today/Tomorrow/Important sections still used `height:100%` on color bars
13709**Solution**: Applied same fix as clicked day events:
13710- Changed parent div: `align-items:start` → `align-items:stretch`
13711- Added `min-height:20px` to parent
13712- Changed bars: `height:100%` → `align-self:stretch`
13713- Bars now properly fill vertical space in ALL sections
13714
13715### Add Event Bar Changes:
13716**Before**:
13717- Background: Orange (#ff9800)
13718- Text: Black (#000)
13719- Height: 6px (text cut off)
13720- Font: 7px
13721
13722**After**:
13723- Background: Dark green (#006400)
13724- Text: Bright green (#00ff00) with green glow
13725- Height: 12px (text fully visible)
13726- Font: 9px
13727- Hover: Darker green (#004d00)
13728- Matrix-themed green aesthetic
13729
13730## Version 3.10.6 (2026-02-06) - COLOR BARS FIX, SORTING REVERSAL, CONFLICT BADGE, README UPDATE
13731- **Fixed:** Event color bars now display correctly in clicked day events
13732- **Fixed:** Changed sorting - all-day events now appear FIRST, then timed events
13733- **Added:** Conflict badge (⚠) appears on right side of conflicting events
13734- **Updated:** Complete README.md rewrite with full Matrix theme documentation
13735- **Changed:** Color bars use `align-self:stretch` instead of `height:100%` (fixes rendering)
13736- **Changed:** Parent div uses `align-items:stretch` and `min-height:20px`
13737- **Improved:** Content wrapper now uses flexbox for proper conflict badge positioning
13738
13739### Color Bar Fix:
13740**Problem**: Bars had `height:100%` but parent had no explicit height
13741**Solution**:
13742- Changed to `align-self:stretch` on bars
13743- Parent uses `align-items:stretch`
13744- Added `min-height:20px` to parent
13745- Bars now properly fill vertical space
13746
13747### Sorting Change:
13748**Before**: Timed events first → All-day events last
13749**After**: All-day events FIRST → Timed events chronologically
13750
13751**Example**:
13752```
13753Monday, Feb 5
13754├─ All Day - Project Deadline       ← All-day first
13755├─ 8:00 AM - Morning Standup        ← Earliest time
13756├─ 10:30 AM - Coffee with Bob
13757└─ 2:00 PM - Team Meeting           ← Latest time
13758```
13759
13760### Conflict Badge:
13761- Orange warning triangle (⚠) on right side
13762- 10px font size
13763- Only appears if `event.conflict` is true
13764- Title attribute shows "Time conflict detected"
13765- Small and unobtrusive
13766
13767### README Update:
13768- Complete rewrite with Matrix theme focus
13769- Full usage instructions for all features
13770- Admin interface documentation
13771- Outlook sync setup guide
13772- System monitoring details
13773- Troubleshooting section
13774- Color scheme reference
13775- File structure documentation
13776- Performance tips
13777- Security notes
13778- Quick start examples
13779
13780## Version 3.10.5 (2026-02-06) - TIME SORTING & THINNER ADD BAR
13781- **Added:** Events now sorted by time when clicking week grid days
13782- **Changed:** Add Event bar now ultra-thin (6px height, down from 12px)
13783- **Improved:** Events with times appear first, sorted chronologically
13784- **Improved:** All-day events appear after timed events
13785- **Changed:** Add Event bar font size reduced to 7px (from 10px)
13786- **Changed:** Add Event bar now has 0 padding and fixed 6px height
13787
13788### Sorting Logic:
13789- Events with times sorted by time (earliest first)
13790- All-day events (no time) appear at the end
13791- Sort algorithm: Convert time to minutes (HH:MM → total minutes) and compare
13792- Chronological order: 8:00 AM → 10:30 AM → 2:00 PM → All-day event
13793
13794### Add Event Bar Changes:
13795- **Height**: 6px (was ~12px with padding)
13796- **Padding**: 0 (was 4px top/bottom)
13797- **Font Size**: 7px (was 10px)
13798- **Letter Spacing**: 0.3px (was 0.5px)
13799- **Line Height**: 6px to match height
13800- **Vertical Align**: Middle for text centering
13801
13802## Version 3.10.4 (2026-02-06) - ADD EVENT BAR
13803- **Added:** Thin orange "Add Event" bar between header and week grid
13804- **Added:** Quick access to event creation from sidebar widget
13805- **Styled:** Sleek design with hover effects and glow
13806- **Interactive:** Clicks navigate to Manage Events tab in admin
13807- **Improved:** User workflow for adding events from sidebar
13808
13809### Visual Design:
13810- Orange background (#ff9800) matching Today section color
13811- 4px top/bottom padding for thin, sleek appearance
13812- Black text with white text-shadow for visibility
13813- Hover effect: Darkens to #ff7700 with enhanced glow
13814- Orange glow effect (box-shadow) matching Matrix theme
13815- Centered "+ ADD EVENT" text (10px, bold, letter-spacing)
13816
13817### Technical Changes:
13818- Added between header close and renderWeekGrid() call
13819- Inline onclick handler navigates to admin manage tab
13820- Inline onmouseover/onmouseout for hover effects
13821- Smooth 0.2s transition on all style changes
13822
13823## Version 3.10.3 (2026-02-06) - UI IMPROVEMENTS & CACHE BUTTON RELOCATION
13824- **Changed:** Update Plugin tab is now the default tab when opening admin
13825- **Moved:** Clear Cache button relocated from Outlook Sync tab to Update Plugin tab
13826- **Improved:** Clear Cache button now larger and more prominent with helpful description
13827- **Improved:** Tab order reorganized: Update Plugin (default) → Outlook Sync → Manage Events
13828- **Removed:** Debug console.log statements from day event display
13829- **Fixed:** Cache clear now redirects back to Update Plugin tab instead of Config tab
13830
13831### UI Changes:
13832- Update Plugin tab opens by default (was Config/Outlook Sync tab)
13833- Clear Cache button prominently displayed at top of Update Plugin tab
13834- Orange ��️ button (10px 20px padding) with confirmation dialog
13835- Help text: "Clear the DokuWiki cache if changes aren't appearing or after updating the plugin"
13836- Success/error messages display on Update Plugin tab after cache clear
13837- Tab navigation reordered to put Update first
13838
13839### Technical Changes:
13840- Default tab changed from 'config' to 'update' in html() method
13841- Tab navigation HTML reordered to show Update Plugin tab first
13842- clearCache() method now redirects with 'update' tab parameter
13843- Removed Clear Cache button from renderConfigTab()
13844- Added Clear Cache button to renderUpdateTab() with message display
13845
13846## Version 3.10.2 (2026-02-06) - EVENT HTML RENDERING FIX
13847- **Fixed:** Event formatting (bold, links, italic) now displays correctly when clicking week grid days
13848- **Added:** renderDokuWikiToHtml() helper function to convert DokuWiki syntax to HTML
13849- **Changed:** Events in weekEvents now pre-rendered with title_html and description_html fields
13850- **Improved:** DokuWiki syntax (**bold**, [[links]], //italic//, etc.) properly rendered in clicked day events
13851
13852### Technical Changes:
13853- Added renderDokuWikiToHtml() private function using p_get_instructions() and p_render()
13854- Events added to weekEvents now include pre-rendered HTML versions
13855- title_html and description_html fields populated before json_encode()
13856- JavaScript now receives properly formatted HTML content
13857
13858## Version 3.10.1 (2026-02-06) - TOOLTIP FIX & WEATHER & CACHE BUTTON
13859- **Fixed:** System tooltip functions now use sanitized calId (showTooltip_sidebar_abc123 instead of showTooltip_sidebar-abc123)
13860- **Fixed:** HTML event handlers now call correctly sanitized function names
13861- **Fixed:** Weather temperature now updates correctly in sidebar widget
13862- **Added:** Weather update function to sidebar widget JavaScript
13863- **Added:** "Clear Cache" button in admin panel for easy cache refresh
13864- **Added:** Default weather location set to Irvine, CA when geolocation unavailable
13865- **Improved:** All tooltip functions now work correctly on system status bars
13866
13867### Technical Changes:
13868- Changed tooltip function names to use $jsCalId instead of $calId
13869- Changed HTML onmouseover/onmouseout to use $jsCalId
13870- Added updateWeather() function to sidebar widget
13871- Added getWeatherIcon() function to sidebar widget
13872- Added clearCache() method in admin.php
13873- Added recursiveDelete() helper method in admin.php
13874- Admin UI now has ��️ Clear Cache button alongside Export/Import
13875
13876## Version 3.10.0 (2026-02-06) - JAVASCRIPT FIXES
13877- **Fixed:** JavaScript syntax error "Missing initializer in const declaration"
13878- **Fixed:** Event links and formatting not displaying in clicked day events
13879- **Fixed:** Sanitized calId to jsCalId by replacing dashes with underscores
13880- **Changed:** Event titles now use `title_html` field to preserve HTML formatting
13881- **Changed:** Event descriptions now use `description_html` field to preserve links and formatting
13882- **Improved:** All JavaScript variable names now use valid syntax
13883- **Improved:** Links, bold, italic, and other HTML formatting preserved in events
13884
13885### Technical Changes:
13886- Added variable sanitization: `$jsCalId = str_replace('-', '_', $calId);`
13887- JavaScript variables now use underscores instead of dashes
13888- Event HTML rendering preserves DokuWiki formatting
13889- Fixed "showTooltip_sidebar is not defined" errors
13890- Fixed "showDayEvents_cal is not defined" errors
13891
13892## Version 3.9.9 (2026-02-06) - JAVASCRIPT LOADING ORDER FIX
13893- **Fixed:** Critical JavaScript loading order issue causing ReferenceError
13894- **Fixed:** Functions now defined BEFORE HTML that uses them
13895- **Changed:** Consolidated all JavaScript into single comprehensive script block
13896- **Removed:** ~290 lines of duplicate JavaScript code
13897- **Added:** Shared state management with `sharedState_[calId]` object
13898- **Improved:** System tooltip functions now work correctly
13899- **Improved:** Week grid click events now work correctly
13900
13901### Technical Changes:
13902- Moved all JavaScript to beginning of widget (before HTML)
13903- Removed duplicate script blocks
13904- Unified tooltip and stats functions
13905- Shared latestStats and cpuHistory state
13906- Fixed "Uncaught ReferenceError: showTooltip_sidebar is not defined"
13907
13908## Version 3.9.8 (2026-02-05) - DUAL COLOR BARS & CLICK EVENTS
13909- **Added:** Dual color bars on events (section color + event color)
13910- **Added:** Click week grid days to view events (replaced hover tooltips)
13911- **Added:** Expandable section below week grid for selected day events
13912- **Added:** Blue theme for selected day section
13913- **Changed:** Week grid days now clickable instead of tooltips
13914- **Changed:** Section bar: 4px wide (left)
13915- **Changed:** Event bar: 3px wide (right)
13916- **Increased:** Gap between color bars from 3px to 6px
13917- **Improved:** Click is more reliable and mobile-friendly than hover tooltips
13918
13919### Visual Changes:
13920- Each event shows TWO color bars side-by-side
13921- Left bar (4px): Section context (Today=Orange, Tomorrow=Green, Important=Purple, Selected=Blue)
13922- Right bar (3px): Individual event's assigned color
13923- Click any day in week grid to expand event list
13924- X button to close selected day events
13925
13926## Version 3.9.7 (2026-02-05) - EVENT COLOR BAR VISIBILITY
13927- **Increased:** Event color bar width from 2px to 3px
13928- **Increased:** Gap between section and event bars from 3px to 6px
13929- **Improved:** Event color bars now more visible alongside section bars
13930- **Note:** Dual color bar system already in place from v3.9.6
13931
13932## Version 3.9.6 (2026-02-05) - UI REFINEMENTS
13933- **Changed:** Date in Important Events moved below event name (was above)
13934- **Changed:** Section headers now 9px font size (was 10px)
13935- **Changed:** Section headers now normal case (was ALL CAPS)
13936- **Changed:** Letter spacing reduced from 0.8px to 0.3px
13937- **Improved:** More natural reading flow with date below event name
13938- **Improved:** Cleaner, more subtle section headers
13939
13940### Header Changes:
13941- "TODAY" → "Today"
13942- "TOMORROW" → "Tomorrow"
13943- "IMPORTANT EVENTS" → "Important Events"
13944
13945## Version 3.9.0 (2026-02-05) - SIDEBAR WIDGET REDESIGN
13946- **Redesigned:** Complete overhaul of `sidebar` parameter
13947- **Added:** Compact week-at-a-glance itinerary view (200px wide)
13948- **Added:** Live clock widget at top of sidebar
13949- **Added:** 7-cell week grid showing event bars
13950- **Added:** Today section with orange header and left border
13951- **Added:** Tomorrow section with green header and left border
13952- **Added:** Important Events section with purple header and left border
13953- **Added:** Admin setting to configure important namespaces
13954- **Added:** Time conflict badges in sidebar events
13955- **Added:** Task checkboxes in sidebar events
13956- **Changed:** Sidebar now optimized for narrow spaces (200px)
13957- **Improved:** Perfect for dashboards, page sidebars, and quick glance widgets
13958
13959### New Features:
13960- Clock updates every second showing current time
13961- Week grid shows Mon-Sun with colored event bars
13962- Today/Tomorrow sections show full event details
13963- Important events highlighted in purple (configurable namespaces)
13964- All badges (conflict, time, etc.) shown in compact format
13965- Automatic time conflict detection
13966
13967## Version 3.8.0 (2026-02-05) - PRODUCTION CLEANUP
13968- **Removed:** 16 unused/debug/backup files
13969- **Removed:** 69 console.log() debug statements
13970- **Removed:** 3 orphaned object literals from console.log removal
13971- **Removed:** Temporary comments and markers
13972- **Fixed:** JavaScript syntax errors from cleanup
13973- **Improved:** Code quality and maintainability
13974- **Improved:** Reduced plugin size by removing unnecessary files
13975- **Status:** Production-ready, fully cleaned codebase
13976
13977### Files Removed:
13978- style.css.backup, script.js.backup
13979- admin_old_backup.php, admin_minimal.php, admin_new.php, admin_clean.php
13980- debug_events.php, debug_html.php, cleanup_events.php
13981- fix_corrupted_json.php, fix_wildcard_namespaces.php
13982- find_outlook_duplicates.php, update_namespace.php
13983- validate_calendar_json.php, admin.js
13984- test_date_field.html
13985
13986## Version 3.7.5 (2026-02-05)
13987- **Fixed:** PHP syntax error (duplicate foreach loop removed)
13988- **Fixed:** Time variable handling in grace period logic
13989
13990## Version 3.7.4 (2026-02-05)
13991- **Added:** 15-minute grace period for timed events
13992- **Changed:** Events with times now stay visible for 15 minutes after their start time
13993- **Changed:** Prevents events from immediately disappearing when they start
13994- **Improved:** Better user experience for ongoing events
13995- **Fixed:** Events from earlier today now properly handled with grace period
13996
13997## Version 3.7.3 (2026-02-05)
13998- **Changed:** Complete redesign of cleanup section for compact, sleek layout
13999- **Changed:** Radio buttons now in single row at top
14000- **Changed:** All options visible with grayed-out inactive states (opacity 0.4)
14001- **Changed:** Inline controls - no more grid layout or wrapper boxes
14002- **Changed:** Namespace filter now compact single-line input
14003- **Changed:** Smaller buttons and tighter spacing throughout
14004- **Improved:** More professional, space-efficient design
14005
14006## Version 3.7.2 (2026-02-04)
14007- **Fixed:** Strange boxes under cleanup options - now properly hidden
14008- **Changed:** Unified color scheme across all admin sections
14009- **Changed:** Green (#00cc07) - Primary actions and main theme
14010- **Changed:** Orange (#ff9800) - Warnings and cleanup features
14011- **Changed:** Purple (#7b1fa2) - Secondary actions and accents
14012- **Improved:** Consistent visual design throughout admin interface
14013
14014## Version 3.7.1 (2026-02-04)
14015- **Fixed:** Cleanup section background changed from orange to white
14016- **Fixed:** Event cleanup now properly scans all calendar directories
14017- **Added:** Debug info display when preview finds no events
14018- **Improved:** Better directory scanning logic matching other features
14019
14020## Version 3.7.0 (2026-02-04)
14021- **Added:** Event cleanup feature in Events Manager
14022- **Added:** Delete old events by age (months/years old)
14023- **Added:** Delete events by status (completed tasks, past events)
14024- **Added:** Delete events by date range
14025- **Added:** Namespace filter for targeted cleanup
14026- **Added:** Preview function to see what will be deleted
14027- **Added:** Automatic backup creation before cleanup
14028- **Changed:** Reduced changelog viewer height to 100px (was 400px)
14029
14030## Version 3.6.3 (2026-02-04)
14031- **Fixed:** Conflict tooltips now work properly after navigating between months
14032- **Added:** Changelog display in Update Plugin tab
14033- **Added:** CHANGELOG.md file with version history
14034- **Improved:** Changelog shows last 10 versions with color-coded change types
14035- **Fixed:** Removed debug console.log statements
14036
14037## Version 3.6.2 (2026-02-04)
14038- **Fixed:** Month title now updates correctly when navigating between months
14039- **Changed:** All eventpanel header elements reduced by 10% for more compact design
14040- **Changed:** Reduced header height from 78px to 70px
14041
14042## Version 3.6.1 (2026-02-04)
14043- **Changed:** Complete redesign of eventpanel header with practical two-row layout
14044- **Fixed:** Improved layout for narrow widths (~500px)
14045- **Changed:** Simplified color scheme (removed purple gradient)
14046
14047## Version 3.6.0 (2026-02-04)
14048- **Changed:** Redesigned eventpanel header with gradient background
14049- **Changed:** Consolidated multiple header rows into compact single-row design
14050
14051## Version 3.5.1 (2026-02-04)
14052- **Changed:** Moved event search bar into header row next to + Add button
14053- **Improved:** More compact UI with search integrated into header
14054
14055## Version 3.5.0 (2026-02-04)
14056- **Added:** Event search functionality in sidebar and eventpanel
14057- **Added:** Real-time filtering as you type
14058- **Added:** Clear button (✕) appears when searching
14059- **Added:** "No results" message when search returns nothing
14060
14061## Version 3.4.7 (2026-02-04)
14062- **Changed:** Made conflict badges smaller and more subtle (9px font, less padding)
14063- **Fixed:** Removed debug logging from console
14064- **Changed:** Updated export version number to match plugin version
14065
14066## Version 3.4.6 (2026-02-04)
14067- **Added:** Debug logging to diagnose conflict detection issues
14068- **Development:** Extensive console logging for troubleshooting
14069
14070## Version 3.4.5 (2026-02-04)
14071- **Added:** Debug logging to showDayPopup and conflict detection
14072- **Development:** Added logging to trace conflict detection flow
14073
14074## Version 3.4.4 (2026-02-04)
14075- **Fixed:** Conflict detection now persists across page refreshes (PHP-based)
14076- **Fixed:** Conflict tooltips now appear on hover
14077- **Added:** Dual conflict detection (PHP for initial load, JavaScript for navigation)
14078- **Added:** Conflict badges in both future and past events sections
14079
14080## Version 3.4.3 (2026-02-04)
14081- **Added:** Custom styled conflict tooltips with hover functionality
14082- **Changed:** Conflict badge shows count of conflicts (e.g., ⚠️ 2)
14083- **Improved:** Beautiful tooltip design with orange header and clean formatting
14084
14085## Version 3.4.2 (2026-02-04)
14086- **Fixed:** Attempted to fix tooltip newlines (reverted in 3.4.3)
14087
14088## Version 3.4.1 (2026-02-04)
14089- **Fixed:** End time field now properly saves to database
14090- **Fixed:** End time dropdown now filters to show only valid times after start time
14091- **Added:** Smart dropdown behavior - expands on focus, filters invalid options
14092- **Improved:** End time auto-suggests +1 hour when start time selected
14093
14094## Version 3.4.0 (2026-02-04)
14095- **Added:** End time support for events (start and end times)
14096- **Added:** Automatic time conflict detection
14097- **Added:** Conflict warning badges (⚠️) on events with overlapping times
14098- **Added:** Conflict tooltips showing which events conflict
14099- **Added:** Visual conflict indicators with pulse animation
14100- **Changed:** Time display now shows ranges (e.g., "2:00 PM - 4:00 PM")
14101
14102## Version 3.3.77 (2026-02-04)
14103- **Fixed:** Namespace badge onclick handlers restored after clearing filter
14104- **Fixed:** Namespace filtering works infinitely (filter → clear → filter)
14105
14106## Version 3.3.76 (2026-02-04)
14107- **Fixed:** Namespace badges now clickable after clearing namespace filter
14108
14109## Version 3.3.75 (2026-02-04)
14110- **Fixed:** Form resubmission warnings eliminated
14111- **Improved:** Implemented proper POST-Redirect-GET pattern with HTTP 303
14112- **Changed:** All admin redirects now use absolute URLs
14113
14114## Version 3.3.74 (2026-02-04)
14115- **Fixed:** Clearing namespace filter now restores original namespace instead of default
14116- **Added:** data-original-namespace attribute to preserve initial namespace setting
14117- **Improved:** Console logging for namespace filter debugging
14118
14119## Version 3.3.73 (2026-02-03)
14120- **Added:** Dynamic namespace filtering banner with clear button
14121- **Fixed:** JavaScript function accessibility issues
14122- **Fixed:** Namespace badge click handlers in event lists
14123- **Improved:** Persistent namespace filtering across views
14124
14125## Earlier Versions
14126See previous transcripts for complete history through v3.3.73, including:
14127- Recurring events with Outlook sync
14128- Multi-namespace support
14129- Event categories and mapping
14130- Backup/restore functionality
14131- System statistics bar
14132- Namespace selector with fuzzy search
14133- Events Manager with import/export
14134- And much more...
14135