1# Calendar Plugin Changelog
2
3## Version 7.0.8 (2026-02-15) - TIMEZONE FIX
4
5### Bug Fix: Date Shift in Non-UTC Timezones
6Fixed critical bug where events appeared shifted by one day in timezones ahead of UTC (e.g., Europe/Prague UTC+1).
7
8**Root Cause:**
9JavaScript'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.
10
11**Fix:**
12Added `formatLocalDate(date)` helper function that formats dates using local time methods (`getFullYear()`, `getMonth()`, `getDate()`) instead of UTC conversion.
13
14**Affected Areas (now fixed):**
15- Multi-day event spanning (line 385)
16- Today string calculation in event list (line 566)
17- Past event detection in event items (line 1022)
18
19### Files Modified
20- `calendar-main.js` - Added `formatLocalDate()` helper, replaced 3 `toISOString().split('T')[0]` calls
21
22---
23
24## Version 7.0.7 (2026-02-15) - GOOGLE CALENDAR SYNC
25
26### Google Calendar Integration
27- Two-way sync with Google Calendar via OAuth 2.0
28- Import events from Google Calendar to DokuWiki
29- Export events from DokuWiki to Google Calendar
30- Support for all-day and timed events
31- Multi-day event handling
32- Color mapping between Google and DokuWiki
33- Duplicate detection prevents re-importing same events
34- Select which Google calendar to sync with
35- Admin panel UI for configuration and sync controls
36
37### Setup Requirements
38- Google Cloud Console project
39- Google Calendar API enabled
40- OAuth 2.0 Web Application credentials
41- Redirect URI configuration
42
43### New Files
44- `classes/GoogleCalendarSync.php` - OAuth and Calendar API integration
45
46### Files Modified
47- `action.php` - Added Google sync action handlers
48- `admin.php` - Added Google sync admin tab
49
50---
51
52## Version 7.0.6 (2026-02-15) - ACCESSIBILITY IMPROVEMENTS
53
54### Screen Reader Support
55- Added ARIA live region for dynamic announcements
56- Announces "Event created", "Event updated", "Event deleted" on actions
57- Announces "Task marked complete/incomplete" on toggle
58- Screen readers receive feedback without visual alerts
59
60### Debug Mode
61- Added `CALENDAR_DEBUG` flag for JavaScript console logging
62- `calendarLog()` and `calendarError()` helper functions
63- Debug output disabled by default
64
65### Code Quality
66- Consistent error handling patterns
67- Better separation of concerns
68
69### Files Modified
70- `calendar-main.js` - ARIA live region, debug helpers, announcements
71
72---
73
74## Version 7.0.5 (2026-02-15) - AUDIT LOGGING & ACCESSIBILITY
75
76### Audit Logging
77- New `AuditLogger.php` class for compliance logging
78- Logs all event modifications: create, update, delete, move, task toggle
79- JSON-formatted log files with timestamps, user info, and IP addresses
80- Automatic log rotation (5MB max, 10 files retained)
81- Log entries include: namespace, date, event ID, title, and change details
82
83### Keyboard Navigation (Accessibility)
84- Arrow keys navigate between calendar days
85- Enter/Space activates focused day (opens popup)
86- Arrow Up/Down navigates between events in popups
87- Enter on event opens edit dialog
88- Delete/Backspace on event triggers delete
89- Escape closes all dialogs, popups, and dropdowns
90- Added `tabindex` and `role` attributes for screen readers
91- Added `aria-label` descriptions for calendar days and events
92
93### CSS Focus States
94- Visible focus indicators on calendar days
95- Focus styles on event items in popups
96- Focus styles on custom date/time pickers
97- Uses `focus-visible` for keyboard-only focus rings
98
99### Files Added
100- `classes/AuditLogger.php` - Compliance audit logging
101
102### Files Modified
103- `action.php` - Integrated audit logging for all event operations
104- `calendar-main.js` - Extended keyboard navigation
105- `syntax.php` - Added accessibility attributes to calendar cells
106- `style.css` - Added focus state styles
107
108---
109
110## Version 7.0.4 (2026-02-15) - CODE CLEANUP
111
112### Code Cleanup
113- Removed unused `calendarDebounce()` and `calendarThrottle()` utility functions
114- Removed duplicate `updateEndTimeOptions()` function definition
115- Removed unused `_calendarSelectOpen` tracking variable
116- Removed orphaned `.input-date` and `.time-select` CSS (no longer using native inputs)
117- Consolidated legacy function calls
118
119### Improvements
120- End date picker now opens to start date's month when no end date is selected
121- End time picker now scrolls to first available time after start time
122
123### Files Modified
124- `calendar-main.js` - Removed ~40 lines of dead code
125- `style.css` - Removed ~25 lines of unused CSS
126
127---
128
129## Version 7.0.3 (2026-02-15) - CUSTOM DATE & TIME PICKERS
130
131### Complete Replacement of Native Browser Controls
132Both date inputs and time selects have been replaced with custom, lightweight pickers to eliminate all browser-related performance issues.
133
134#### Custom Date Picker
135- **Mini calendar grid** - Clean monthly view with day selection
136- **Month navigation** - Previous/next buttons for quick browsing
137- **Visual indicators** - Today highlighted, selected date marked
138- **End date validation** - Cannot select end date before start date
139- **Clear button** - Easy removal of optional end date
140
141#### Custom Time Picker (from v7.0.2)
142- **Period groupings** - Morning, Afternoon, Evening, Night
143- **Lazy loading** - Options built only when dropdown opens
144- **Smart filtering** - End times after start time only
145
146#### Code Cleanup
147- Removed old `setupSelectTracking()` function (was causing conflicts)
148- Removed redundant event listener code
149- Unified dropdown close handling for all picker types
150- No native `<input type="date">` or `<select>` elements in event dialog
151
152### Files Modified
153- `syntax.php` - New date picker HTML structure
154- `calendar-main.js` - Custom date picker JavaScript, cleanup
155- `style.css` - Date picker calendar grid styles
156
157---
158
159## Version 7.0.2 (2026-02-15) - CUSTOM TIME PICKER
160
161### Major Fix: Replaced Native Selects with Custom Time Pickers
162The native `<select>` element with 97 time options was causing browser freezes when opening. This version replaces them with lightweight custom dropdown pickers.
163
164#### New Custom Time Picker Features
165- **Instant opening** - No browser rendering delay
166- **Lazy-loaded options** - Dropdown HTML built only when clicked
167- **Period grouping** - Morning, Afternoon, Evening, Night sections
168- **Smart filtering** - End time options automatically hide times before start time
169- **Visual feedback** - Selected time highlighted, disabled times grayed out
170
171#### Technical Changes
172- Replaced `<select>` elements with `<button>` + `<div>` dropdown
173- Hidden `<input>` stores actual value for form submission
174- Time data pre-computed once, reused for all pickers
175- Event delegation for option clicks
176- Automatic cleanup when clicking outside
177
178#### Removed
179- Native `<select>` time pickers (caused 2600ms+ freezes)
180- `onchange` handlers from date inputs (handled in JS now)
181- Old `setupSelectTracking()` function
182
183### Files Modified
184- `syntax.php` - New time picker HTML structure
185- `calendar-main.js` - Custom time picker JavaScript
186- `style.css` - Time picker dropdown styles
187
188---
189
190## Version 7.0.1 (2026-02-15) - SELECTOR FLICKER FIX
191
192### Bug Fixes
193- **Fixed selector flicker on subsequent clicks** - Time/date selectors no longer flash or lag after first use
194  - New `setupSelectTracking()` prevents DOM updates while selector is open
195  - Tracks mousedown/focus/blur/change events on all form inputs
196  - Uses `requestAnimationFrame` for smooth visual updates
197  - Added state caching to skip redundant DOM manipulation
198
199### CSS Improvements
200- Changed `transition: all` to specific properties on `.input-sleek` elements
201- Added `transition: none` for select options
202- Prevents browser reflow issues during dropdown rendering
203
204---
205
206## Version 7.0.0 (2026-02-15) - STABILITY & PERFORMANCE RELEASE
207
208### Major Improvements
209
210#### File Locking & Atomic Writes (Critical Stability Fix)
211- **New `CalendarFileHandler` class** with atomic file operations
212- Prevents data corruption from concurrent event saves
213- Uses temp file + atomic rename strategy for safe writes
214- Implements `flock()` for proper file locking during reads/writes
215- Graceful handling of lock acquisition failures with retries
216
217#### Caching Layer (Performance Improvement)
218- **New `CalendarEventCache` class** for event data caching
219- 5-minute TTL reduces unnecessary JSON file reads
220- In-memory caching for current request
221- Automatic cache invalidation on event modifications
222- Cache cleanup for expired entries
223
224#### Rate Limiting (Security Enhancement)
225- **New `CalendarRateLimiter` class** for AJAX endpoint protection
226- 60 requests/minute for read actions
227- 30 requests/minute for write actions (more restrictive)
228- Per-user tracking (falls back to IP for anonymous)
229- Rate limit headers in responses (X-RateLimit-Limit, X-RateLimit-Remaining)
230- Automatic cleanup of old rate limit data
231
232#### Code Refactoring
233- **New `CalendarEventManager` class** consolidating CRUD operations
234- New `classes/` directory for organized code structure
235- Reduced code duplication across files
236- Improved separation of concerns
237- Better maintainability for future development
238
239#### JavaScript Performance Fixes (Dialog Responsiveness)
240- **Fixed slow time selector** - End time dropdown now opens instantly
241  - Replaced `Array.from().forEach()` with direct `options` loop (97 options)
242  - Single-pass algorithm instead of multiple iterations
243  - Uses `hidden` property instead of `style.display` manipulation
244- **Fixed event listener accumulation** - Dialog inputs no longer slow down over time
245  - Added `data-initialized` flag to prevent re-binding listeners
246  - Namespace search only initializes once per calendar
247- **Fixed selector flicker on subsequent clicks**
248  - New `setupSelectTracking()` function prevents DOM updates while selector is open
249  - Tracks mousedown/focus/blur/change events on time and date inputs
250  - Uses `requestAnimationFrame` instead of `setTimeout` for visual updates
251  - Added state caching to skip redundant DOM updates
252- **Fixed CSS transition interference**
253  - Changed `transition: all` to specific properties on form inputs
254  - Added explicit `transition: none` for select options
255  - Prevents browser reflow issues during dropdown rendering
256
257### Branding Changes
258- Removed "Matrix Edition" from plugin name and all references
259- Plugin is now simply "Calendar Plugin"
260- Matrix theme remains available (now called just "Matrix")
261
262### Technical Details
263- All JSON file operations now use atomic writes
264- Event saves protected against race conditions
265- Cache automatically invalidated on namespace/month changes
266- Rate limiter uses probabilistic cleanup (1 in 100 requests)
267
268### Files Added
269- `classes/FileHandler.php` - Atomic file operations with locking
270- `classes/EventCache.php` - Caching layer with TTL
271- `classes/RateLimiter.php` - AJAX rate limiting
272- `classes/EventManager.php` - Consolidated event CRUD operations
273
274### Upgrade Notes
275- No database migration required
276- Cache directory created automatically (`data/cache/calendar/`)
277- Rate limit data stored in `data/cache/calendar/ratelimit/`
278- Existing events and settings preserved
279
280---
281
282## Version 6.14.2 (2026-02-15) - SYSTEM LOAD TOGGLE
283
284### Added System Load Bars Toggle
285- New toggle in **Admin > Calendar > Themes** tab
286- Choose to show or hide CPU/Memory load indicator bars
287- Setting applies to both event panel and sidebar widget
288- Stored in `data/meta/calendar_show_system_load.txt`
289- JavaScript polling is also disabled when hidden (saves resources)
290
291## Version 6.14.1 (2026-02-14) - SECURITY FIX
292
293### Security Improvements
294- **Authentication required** - Write actions (save, delete, toggle) now require user to be logged in
295- **Improved CSRF token handling** - New `getSecurityToken()` helper function checks multiple sources:
296  - `JSINFO.sectok` (standard)
297  - `window.JSINFO.sectok`
298  - Hidden form field `input[name="sectok"]`
299  - Meta tag `meta[name="sectok"]`
300- Anonymous users can no longer add/edit/delete events
301- Better error messages for authentication and token failures
302
303### Bug Fixes
304- Fixed "Invalid security token" error on clean DokuWiki installations
305- Added debug logging for security token failures
306
307## Version 6.14.0 (2026-02-14) - STABLE RELEASE
308
309### Code Cleanup & Localization
310- Added localization for all static calendar strings (EN/DE)
311- New lang keys: `previous_month`, `next_month`, `print_calendar`, `no_events_scheduled`, `calendar_label`, `details`
312- Code review and cleanup completed
313- Updated README.md and plugin documentation
314
315### Static Calendar Features (v6.13.x consolidated)
316- Read-only presentation mode: `{{calendar static}}`
317- Custom titles: `title="My Events"`
318- Month locking: `month=2` disables navigation
319- Print button with clean itinerary output
320- All themes supported: matrix, pink, purple, professional, wiki, dark, light
321- `noprint` option to hide print functionality
322- Formatted descriptions in tooltips and itinerary
323
324### Other Improvements in 6.13.x
325- Admin menu icon (SVG)
326- Config import fix for `return array()` syntax
327- Mobile touch button fixes
328- Important events in day popup with star icons
329- Time picker grouped by period
330- Multi-day event time validation
331
332## Version 6.13.13 (2026-02-14) - PRINT BUTTON CENTERING
333
334### Fixed Print Button Icon Alignment
335- Added `display: flex`, `align-items: center`, `justify-content: center`
336- Added `padding: 0` and `line-height: 1`
337- Icon now properly centered in circle
338
339## Version 6.13.12 (2026-02-14) - SIMPLE TOOLTIP
340
341### Simplified Hover Tooltip
342- Removed custom JS tooltip (was causing triple popups)
343- Uses native browser `title` attribute only
344- Plain text with formatting converted: `**bold**` → `*bold*`, `//italic//` → `_italic_`
345- Links shown as: `text (url)`
346- Added �� emoji before time for visual clarity
347- Itinerary still shows full HTML formatting
348
349## Version 6.13.11 (2026-02-14) - FORMATTED DESCRIPTIONS
350
351### Rich Text Formatting in Static Calendar
352- **Hover tooltips** now show formatted text (bold, italic, links, line breaks)
353- **Itinerary descriptions** display with full formatting
354- Uses existing `renderDescription()` function for consistency
355- Supports: `**bold**`, `//italic//`, `[[links]]`, `[markdown](links)`, line breaks
356
357### Technical Details
358- Added `data-tooltip` attribute with rich HTML content
359- New JavaScript tooltip handler with smart positioning
360- CSS styles for `.static-tooltip` and itinerary formatting
361- Tooltips stay within viewport bounds
362
363## Version 6.13.10 (2026-02-14) - PRINT MARGINS FIX v3
364
365### Fixed Print Margins - Inline Styles Approach
366- Removed reliance on `@page` CSS (browser support inconsistent)
367- Uses inline style `padding: 50px 60px` directly on wrapper div
368- Simplified CSS for better browser compatibility
369- Smaller table font (12px) for better fit
370- Set `max-width: 800px` on content wrapper
371
372## Version 6.13.9 (2026-02-14) - PRINT MARGINS FIX v2
373
374### Fixed Print Margins
375- Added `.print-wrapper` div with 0.5in padding/margin
376- Uses both `@page` margin AND wrapper margins for compatibility
377- Set `@page { margin: 1in 0.75in }` (top/bottom 1in, sides 0.75in)
378- Wrapper has `max-width: 7.5in` to fit standard letter size
379- Smaller fonts (0.85em) to fit more content
380- Added 250ms delay before print to ensure styles load
381
382## Version 6.13.8 (2026-02-14) - PRINT MARGINS FIX
383
384### Improved Print Layout
385- Added `@page { margin: 0.75in }` for proper print margins
386- Increased body padding to 40px for screen preview
387- Smaller font sizes to fit better on page
388- Description column limited width with word-wrap
389- Table header repeats on each page (`display: table-header-group`)
390- Rows avoid page breaks in middle (`page-break-inside: avoid`)
391- Print color adjust enabled for backgrounds
392
393## Version 6.13.7 (2026-02-14) - ALL THEMES FOR STATIC CALENDAR
394
395### Added All Theme Options
396Now all themes work with static calendar:
397
398| Theme | Description |
399|-------|-------------|
400| `matrix` | Green on dark (default Matrix style) |
401| `pink` | Pink/magenta on dark |
402| `purple` | Purple/violet on dark |
403| `professional` | Blue on white (business style) |
404| `wiki` | Neutral gray (matches DokuWiki) |
405| `dark` | Blue on dark gray |
406| `light` | Clean white/gray |
407
408### Examples
409```
410{{calendar theme=matrix static}}
411{{calendar theme=purple static}}
412{{calendar theme=professional static}}
413{{calendar theme=wiki static}}
414```
415
416## Version 6.13.6 (2026-02-14) - QUOTED PARAMETER FIX
417
418### Fixed Quoted Parameter Parsing
419- Titles with spaces now work: `title="Feb 26 Expense Log"`
420- Uses regex to properly parse: `key="value with spaces"`
421- Supports both double and single quotes
422- Example: `{{calendar title="My Custom Title" static}}`
423
424## Version 6.13.5 (2026-02-14) - STATIC CALENDAR OPTIONS
425
426### New Static Calendar Options
427
428| Option | Description | Example |
429|--------|-------------|---------|
430| `title=X` | Custom title instead of month name | `title="Club Meetings"` |
431| `noprint` | Hide print button and print view | `{{calendar static noprint}}` |
432| `theme=X` | Apply specific theme (matrix, pink, dark, light) | `theme=matrix` |
433
434### Fixed Month/Year Lock
435- When you specify `month=X` or `year=X`, navigation is now disabled
436- `{{calendar month=2 static}}` shows only February with no nav arrows
437- `{{calendar year=2025 month=12 static}}` locks to December 2025
438
439### Examples
440```
441{{calendar static}}                              // Navigable, current month
442{{calendar month=2 static}}                      // Locked to February
443{{calendar title="Team Events" static}}          // Custom title
444{{calendar theme=matrix static}}                 // Matrix theme
445{{calendar namespace=club static noprint}}       // No print button
446{{calendar month=3 title="March Meetings" theme=pink static}}
447```
448
449## Version 6.13.4 (2026-02-14) - DEDICATED PRINT BUTTON
450
451### Added Print Button to Static Calendar
452- New ��️ print button in the calendar header
453- Opens a clean popup window with ONLY the itinerary content
454- Automatically triggers print dialog
455- Window closes after printing
456- No DokuWiki headers/footers/sidebars - just the calendar
457
458### How It Works
459- Extracts the print view HTML
460- Creates a new window with minimal styling
461- Calls `window.print()` automatically
462- Clean single-page output
463
464## Version 6.13.3 (2026-02-14) - PRINT BLANK PAGES FIX
465
466### Fixed Blank Pages When Printing
467- Aggressively hide ALL screen view elements and children in print
468- Reset height/width to 0 with !important on grid, cells, events
469- Ensure print view elements have proper display table properties
470- Force all hidden elements to position:absolute off-screen
471
472## Version 6.13.2 (2026-02-14) - STATIC CALENDAR RESPONSIVE FIX
473
474### Improved Static Calendar Layout
475- Changed from `max-width: 900px` to `width: 100%` for full container fit
476- Added `table-layout: fixed` for consistent column widths
477- Added `overflow-x: auto` for horizontal scroll on very small screens
478- Reduced header padding and font sizes for better fit
479- Improved responsive breakpoints for mobile (768px and 480px)
480- Hide time on very small screens to save space
481- Better touch targets for navigation buttons
482
483## Version 6.13.1 (2026-02-14) - STATIC CALENDAR FIX
484
485### Bug Fix
486- Added missing `getImportantNamespaces()` helper method
487- Fixed `loadEventsForMonth` → use existing `loadEvents` method
488- Added multi-namespace/wildcard support to static calendar
489
490## Version 6.13.0 (2026-02-14) - STATIC CALENDAR MODE
491
492### New Static/Presentation Mode
493Read-only calendar view for public display and printing.
494
495**Usage:**
496```
497{{calendar static}}
498{{calendar namespace=meetings static}}
499```
500
501**Screen View Features:**
502- Clean calendar grid without edit/delete buttons
503- Month navigation (prev/next arrows)
504- Hover tooltips showing full event details (title, time, description)
505- Important events highlighted with ⭐ and golden background
506- Today's date highlighted
507- Responsive design for mobile
508
509**Print View Features:**
510- Automatically switches to itinerary format when printing
511- Table layout: Date | Time | Event | Details
512- Important events marked with ⭐
513- Dates grouped (date only shown once per day)
514- Page break handling for long lists
515- Clean black & white friendly output
516
517**Files Changed:**
518- `syntax.php`: Added `renderStaticCalendar()` method
519- `action.php`: Added `getStaticCalendar()` AJAX handler
520- `calendar-main.js`: Added `navStaticCalendar()` function
521- `style.css`: Added static calendar styles + print media queries
522
523## Version 6.12.7 (2026-02-14) - ADMIN MENU ICON
524
525### Added Admin Menu Icon
526- New monochrome SVG calendar icon for DokuWiki admin menu
527- Icon shows calendar with binding rings, header, and date dots
528- Matches DokuWiki's admin interface style
529- Added `getMenuIcon()` method to admin.php
530- Icon file: `images/icon.svg`
531
532## Version 6.12.6 (2026-02-14) - CONFIG IMPORT FIX
533
534### Fixed Config Import Validation
535- Now accepts both `return [` and `return array(` syntax
536- Regex updated from `/return\s*\[/` to `/return\s*(\[|array\s*\()/`
537- Older PHP config files using `return array(...)` now import correctly
538
539## Version 6.12.5 (2026-02-14) - MOBILE BUTTON FIX
540
541### Fixed Delete/Edit Buttons on Mobile
542- Added `type="button"` attribute to prevent form submission issues
543- Added `touchend` event delegation for reliable mobile touch handling
544- Increased button touch targets (32px default, 40px on mobile)
545- Added `touch-action: manipulation` to prevent touch delays
546- Added `-webkit-tap-highlight-color` for visual feedback
547
548### Technical Details
549- Mobile browsers sometimes don't fire `onclick` reliably
550- New `touchend` handler calls `btn.click()` explicitly
551- Larger touch targets meet accessibility guidelines (44px recommended)
552
553## Version 6.12.4 (2026-02-14) - STAR INLINE FIX
554
555### Fixed Star Position in Day Popup
556- Star icon now displays inline with event title (left side)
557- Changed `.popup-event-title` from `flex: 1 1 100%` to `flex: 1 1 auto`
558- Star and title stay on same line instead of star being above
559
560## Version 6.12.3 (2026-02-14) - DAY POPUP IMPORTANT EVENTS
561
562### Important Event Highlighting in Day Popup
563- Events from important namespaces now show ⭐ star icon
564- Golden gradient background highlight for important events
565- Golden border glow effect matching other views
566- Consistent styling across calendar grid, sidebar, and day popup
567
568### Technical Details
569- Added `importantNamespaces` check to `showDayPopup()` function
570- Added `.popup-event-important` and `.popup-event-star` CSS classes
571- Reads important namespaces from `container.dataset.importantNamespaces`
572
573## Version 6.12.2 (2026-02-14) - MULTI-DAY EVENT TIME FIX
574
575### Multi-Day Event End Time
576- End time now allows all times when end date differs from start date
577- Example: Event from 9:00 PM on Feb 28 to 5:00 AM on Feb 29 now works correctly
578- Same-day events still enforce end time > start time
579- Changing end date now triggers time validation update
580
581### Technical Details
582- `updateEndTimeOptions()` checks if `endDate !== startDate`
583- If multi-day, all time options are enabled
584- Added `onchange` handler to both start date and end date fields
585
586## Version 6.12.1 (2026-02-14) - TIME PICKER & EDIT DIALOG FIX
587
588### Improved Time Picker
589- Grouped time options by period (Morning, Afternoon, Evening, Night)
590- Much easier to navigate - no more scrolling through 96 options
591- End time options before start time are now hidden/disabled
592- Invalid end times automatically corrected when start time changes
593
594### Fixed Edit Event Dialog Draggability
595- Edit dialog is now properly draggable (was broken due to async AJAX)
596- Moved `makeDialogDraggable()` call inside the AJAX success callback
597- Removed redundant wrapper patch that didn't work with async code
598
599### Technical Details
600- Time picker uses `<optgroup>` for visual grouping
601- End time validation hides invalid options (not just disables)
602- Both Add and Edit dialogs now call `makeDialogDraggable()` directly
603
604## Version 6.12.0 (2026-02-14) - EVENT EDITOR DIALOG IMPROVEMENTS
605
606### Fixed Event Editor Dialog Draggability
607- Fixed duplicate event listener accumulation that caused performance degradation
608- Each time dialog opened, new drag listeners were added without removing old ones
609- Now properly cleans up old listeners before adding new ones
610- Added `cursor: grabbing` feedback while dragging
611- Dialog position resets when reopened (no more stuck positions)
612- Excluded close button from triggering drag
613
614### Optimized Time Selection Performance
615- Simplified `updateEndTimeOptions()` to be much faster
616- Removed expensive loop through 96 options checking style.display
617- Now just validates current selection and sets new value if invalid
618- Should eliminate freezing/lag when selecting start time
619
620### Technical Details
621- Added `_dragCleanup` function stored on handle element
622- Cleanup called before re-initialization
623- Removed unnecessary `setTranslate` helper function
624
625## Version 6.11.4 (2026-02-13) - JAVASCRIPT LOCALIZATION
626
627### JavaScript Frontend Localization
628- Added `getCalendarLang()` helper function
629- Added `getJsLangStrings()` PHP method
630- Embedded JSON language data in all render functions
631- Localized month names (full + short)
632- Localized dialog titles, confirmations, badges, empty states
633
634## Version 6.11.3 (2026-02-13) - SIDEBAR WIDGET LOCALIZATION
635
636### Sidebar Widget
637- Fixed `\n` in single-quoted strings → double-quoted for proper newlines
638- Localized "Runs every X minutes" cron descriptions
639- Event dialog labels, placeholders, options
640- Day names, ordinal positions, color names
641- Today/Tomorrow/Important section headers
642
643## Version 6.11.2 (2026-02-13) - ADMIN BACKEND LOCALIZATION
644
645### Admin Backend
646- Localized ~220 hardcoded strings in admin.php
647- AJAX JSON responses, redirect messages, error messages
648- Pattern names (Daily, Weekly, Monthly, etc.)
649
650## Version 6.11.1 (2026-02-13) - CONFIG IMPORT BUG FIX
651
652### Bug Fix
653- Fixed regex to accept both `return [` and `return array(` syntax
654- File: `admin.php` lines 5947, 6001
655
656## Version 6.10.6 (2026-02-13) - MANAGE RECURRING DIALOG LOCALIZATION
657
658### Localized Manage Recurring Series Dialog
659Complete translation of the "Manage" button dialog for recurring events:
660
661**Section Headers:**
662- "Manage Recurring Series" → "Wiederkehrende Serie verwalten"
663- "Extend Series" → "Serie erweitern"
664- "Trim Past Events" → "Vergangene Termine kürzen"
665- "Change Pattern" → "Muster ändern"
666- "Change Start Date" → "Startdatum ändern"
667- "Pause Series" / "Resume Series" → "Serie pausieren" / "Serie fortsetzen"
668
669**Labels & Buttons:**
670- All field labels (Add occurrences, Days apart, Remove before, New interval, etc.)
671- Action buttons (Extend, Trim, Change, Shift, Pause, Resume, Close)
672- Interval dropdown options (Daily, Weekly, Bi-weekly, Monthly, Quarterly, Yearly)
673- Help text and notes
674
675**Confirmation Dialogs:**
676- Trim confirmation with date
677- Respace confirmation
678- Shift confirmation
679
680### Added 60+ Language Strings for Dialogs
681Complete vocabulary for recurring event management in both English and German.
682
683### Note on Browser Validation Messages
684"Please fill out this field" is a browser-native message controlled by the browser's language setting, not our plugin.
685
686## Version 6.10.5 (2026-02-13) - DIALOG LOCALIZATION
687
688### Localized All JavaScript Dialogs
689
690**New Namespace Dialog:**
691- Prompt text with examples now in German
692- Invalid namespace error message
693
694**Rename Namespace Dialog:**
695- Prompt text with current name
696
697**Delete Confirmations:**
698- Delete selected events confirmation
699- Delete namespace confirmation
700- Delete recurring series confirmation
701
702**Trim Recurring Events:**
703- "Counting..." / "Zähle..."
704- "Trimming..." / "Kürze..."
705- "No past recurring events found" message
706- "Found X past recurring events" confirmation
707- Button text resets
708
709### Added 15+ New Dialog Strings
710Both English and German translations for all interactive prompts and confirmations.
711
712## Version 6.10.4 (2026-02-13) - COMPLETE MANAGE TAB LOCALIZATION
713
714### Fixed Remaining English Strings
715
716**Namespace Explorer Control Bar:**
717- "➡️ Move" → "➡️ Verschieben"
718- "➕ New Namespace" → "➕ Neuer Namensraum"
719- "�� Cleanup" → "�� Bereinigen"
720- "0 selected" → "0 ausgewählt"
721- "%d selected" → "%d ausgewählt"
722
723**Recurring Events Button Tooltips:**
724- "Edit title, time, namespace, pattern" → "Titel, Zeit, Namensraum, Muster bearbeiten"
725- "Extend, trim, pause, change dates" → "Erweitern, kürzen, pausieren, Daten ändern"
726- "Delete all occurrences" → "Alle Vorkommen löschen"
727
728**JavaScript Confirmation Messages:**
729- "No events selected" → "Keine Termine ausgewählt"
730- Delete confirmation with count
731- Delete namespace confirmation
732- "Scanning..." → "Scanne..."
733- "Cleaning..." → "Bereinige..."
734- "No empty namespaces found" message
735- "Found X item(s) to clean up" → "X Element(e) zum Bereinigen gefunden"
736- "Proceed with cleanup?" → "Mit Bereinigung fortfahren?"
737
738### Technical
739- Added adminLang JavaScript object with all translatable strings
740- All dynamic JavaScript messages now use language system
741
742## Version 6.10.3 (2026-02-13) - RECURRING EVENTS & DROP TARGET LOCALIZATION
743
744### Additional Localization for Manage Events Tab
745
746**Recurring Events Table:**
747- Search placeholder: "Wiederkehrende Termine suchen..."
748- Table headers: Titel, Namensraum, Muster, Zeitraum, Anzahl, Quelle, Aktionen
749- Source labels: Markiert / Erkannt (was Flagged / Detected)
750- Action buttons: Bearb. / Verwalten / Lö. (was Edit / Manage / Del)
751- Pattern badges: Täglich, Wöchentlich, Monatlich, Jährlich, Benutzerdefiniert
752- Footer: "Gesamt: X Serien" (was "Total: X series")
753- No results message
754
755**Namespace Explorer Drop Zones:**
756- Header: "�� Zielbereich" (was "Drop Target")
757- Drop hint: "Hier ablegen" (was "Drop here")
758- Default namespace label consistent
759
760### Added 25+ New Language Strings
761- Recurring table columns and labels
762- Pattern translations
763- Action button labels
764- Drop zone labels
765
766## Version 6.10.2 (2026-02-13) - MANAGE EVENTS TAB LOCALIZATION
767
768### Localized: Manage Events Tab (Complete)
769All text in the Manage Events admin tab now uses the language system:
770
771**Events Manager Section:**
772- Page title, section header, description
773- Statistics labels (Total Events, Namespaces, JSON Files, Recurring)
774- "Last scanned" timestamp label
775- Button labels (Re-scan Events, Export All Events, Import Events)
776- "View Breakdown by Namespace" expandable section
777- Table headers (Namespace, Events, Files)
778
779**Important Namespaces Section:**
780- Section header and description
781- Visual Effects descriptions (Calendar Grid, Event Sidebar, Sidebar Widget, Day Popup)
782- Save button and hint text
783
784**Cleanup Old Events Section:**
785- Section header and description
786- Radio button labels (By Age, By Status, By Date Range)
787- Age options (Delete events older than, months, years)
788- Status options (Completed tasks, Past events)
789- Date range labels (From, To)
790- Namespace filter label and placeholder
791- Preview and Delete button labels
792- JavaScript confirmation messages
793- Loading/error states
794
795**Recurring Events Section:**
796- Section header
797- Button labels (Trim All Past, Rescan)
798
799**Namespace Explorer Section:**
800- Section header and description
801- Search placeholder
802- Control bar buttons (All, None, Delete, Move to)
803- Datalist placeholder
804
805### Added 60+ New Language Strings
806Both English and German language files expanded with comprehensive admin terminology.
807
808## Version 6.10.1 (2026-02-13) - LANGUAGE SYSTEM FIX
809
810### Bug Fix: Language Files Not Working
811- Fixed `getMenuText()` to use `$this->getLang('menu')` instead of hardcoded string
812- Admin menu now correctly shows "Kalenderverwaltung" in German
813- Admin tabs now use language system:
814  - "Manage Events" → "Termine verwalten"
815  - "Update Plugin" → "Plugin aktualisieren"
816  - "Outlook Sync" → "Outlook-Sync"
817  - "Themes" → "Designs"
818
819### Added More Language Strings
820- Admin tab labels
821- Admin section headers (Event Browser, Important Namespaces, etc.)
822- Sync settings labels
823- Common button labels (Run Now, Download, Upload, Delete, etc.)
824
825## Version 6.10.0 (2026-02-13) - GERMAN LANGUAGE SUPPORT
826
827### New Feature: German Language Translation
828- Added complete German (de) language file
829- Expanded English language file with comprehensive translatable strings
830- Both files include 100+ translation strings covering:
831  - General terms (calendar, events, dates)
832  - Event fields (title, description, time, etc.)
833  - Actions (add, edit, delete, save, cancel)
834  - Task-related terms
835  - Recurring event options
836  - Days of week and months
837  - User messages and confirmations
838  - Search functionality
839  - Sync status messages
840  - Admin section labels
841  - Sidebar widget labels
842  - Time conflict warnings
843
844### Note
845The 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.
846
847## Version 6.9.9 (2026-02-13) - CRITICAL SEARCH FIX
848
849### Bug Fix: Month Search Not Working
850- **Root cause:** Function name collision - there were two `fuzzyMatch` functions
851  - `window.fuzzyMatch` (for namespace search autocomplete) returns a score number or `null`
852  - Local `fuzzyMatch` (for event search) returns `true`/`false`
853- When filtering events, the wrong function was being called, returning `null` for all events
854- **Fix:** Renamed event search functions to `eventSearchNormalize` and `eventSearchMatch`
855- Month search now works correctly on first load and after navigation
856
857### Also in this version
858- Fixed jumpToDate to properly hide search clear button after navigation
859- Removed debug logging from production code
860
861## Version 6.9.8 (2026-02-12) - SEARCH & UI FIXES
862
863### Bug Fixes
864
865**All-Dates Search Navigation Fixed**
866- Clicking a search result now properly navigates to that event's month
867- Opens the day popup showing the event details
868- Was calling non-existent `loadMonth()` - now uses correct `navCalendar()`
869- Clears search results and restores normal event list view
870
871**"No Events" Message Fixed**
872- No longer shows "No events match your search" when in all-dates mode
873- All-dates mode has its own results display; the month-mode message was incorrectly appearing
874
875**Add Button Layout Fixed**
876- Search bar no longer pushes the "+ Add" button off the right edge
877- Search container has constrained max-width (160px) and proper flex settings
878- Header has overflow:hidden to prevent layout issues
879
880**Important Event Stars Fixed**
881- Stars now appear on initial page load (PHP rendering added)
882- Stars positioned outside the bar using CSS ::before pseudo-element
883- Added overflow:visible to event-indicators and event-bar containers
884- Bar remains full width; star sits in the left margin area
885
886### Technical
887- Star uses `event-bar-has-star` class for first-day-only display
888- jumpToDate() properly cleans up search state before navigation
889
890## Version 6.9.7 (2026-02-12) - IMPORTANT NAMESPACE IMPROVEMENTS
891
892### Bug Fix
893- **AJAX refresh now preserves important namespace highlighting**
894  - Important namespaces list now passed to JavaScript via data attribute
895  - Highlighting persists when navigating between months
896  - Works in both main calendar sidebar and standalone event panels
897
898### New Feature: Calendar Grid Star Icons
899- **Important events now show ⭐ on their color bars** in the calendar grid
900  - Small star appears on the first day of important events
901  - Tooltip prefixed with ⭐ for important events
902  - Visual distinction without cluttering the compact grid view
903
904### Admin Section Update
905- **Improved Important Namespaces description** in Admin → Calendar → Manage Events
906  - Now explains all visual effects:
907    - Calendar Grid: ⭐ star on event bars
908    - Event Sidebar: ⭐ star + highlighted background + accent border
909    - Sidebar Widget: Dedicated "Important Events" section
910    - Day Popup: Events shown with full details
911  - Better example placeholder text
912
913### Technical
914- Fixed PHP syntax error in fuzzy search (curly quotes replaced with escape sequences)
915- Important namespaces loaded once and stored in container dataset for JavaScript access
916
917## Version 6.9.6 (2026-02-12) - FUZZY SEARCH & SIDEBAR HIGHLIGHTING
918
919### Fuzzy Search
920- **Improved search matching:** Search is now more forgiving of punctuation differences
921  - "fathers day" matches "Father's Day"
922  - "new years" matches "New Year's Eve"
923  - Smart quotes, apostrophes, dashes, and common punctuation are ignored
924- **Multi-word search:** All words must be present but in any order
925  - "birthday john" matches "John's Birthday Party"
926- Works in both "this month" and "all dates" search modes
927
928### Important Namespace Highlighting (Calendar Sidebar)
929- Events from important namespaces now highlighted in the main calendar's event list sidebar
930- Same visual treatment as the itinerary sidebar widget:
931  - Subtle theme-colored background tint
932  - Right border accent bar
933  - ⭐ star icon before event title
934- Theme-specific colors:
935  - Matrix: green tint
936  - Purple: purple tint
937  - Pink: pink tint
938  - Professional: blue tint
939  - Wiki: light blue tint
940- Configure important namespaces in Admin → Calendar → Sync Settings
941
942## Version 6.9.5 (2026-02-12) - SEARCH MODE TOGGLE
943
944### New Feature: Search Scope Toggle
945- **Search mode button** (��/��) added next to search input in both calendar views
946- **Default mode** (��): Search only the current month's events (fast, local filtering)
947- **All dates mode** (��): Search across ALL calendar data via AJAX
948  - Click the �� button to toggle to �� (green highlight when active)
949  - Requires at least 2 characters to search
950  - Shows results with date, time, and namespace
951  - Click any result to jump to that date and open the day popup
952  - Limited to 50 results for performance
953- Search placeholder text updates to indicate current mode
954- Compact button design takes minimal space
955
956### UI Details
957- Button sits flush with search input (no gap)
958- Green highlight when "all dates" mode is active
959- Results show full date (e.g., "Mon, Feb 12, 2026")
960- Namespace badge shown for multi-namespace setups
961
962## Version 6.9.4 (2026-02-12) - POPUP IMPROVEMENTS & IMPORTANT HIGHLIGHTING
963
964### Features
965- **Draggable Day Popup:** Calendar day popup window is now draggable by its header
966  - Click and drag the header to move the popup
967  - Header shows move cursor on hover
968  - Clicking the close button (×) still closes normally
969
970- **Important Namespace Highlighting in Sidebar:**
971  - Events from "important" namespaces (defined in Admin → Sync Settings) now have subtle highlighting
972  - Theme-aware background tint (green for Matrix, purple for Purple, pink for Pink, blue for Professional/Wiki)
973  - Right border accent bar for visual distinction
974  - ⭐ star icon appears before event title
975  - Works in Today, Tomorrow, and Important Events sections
976
977### Bug Fix
978- **Fixed event display in day popup:** Long titles no longer cut off the edit/delete buttons
979  - Event title now wraps to multiple lines instead of truncating
980  - Actions buttons always visible
981  - Time, date range, and namespace badges wrap properly
982  - Improved flex layout for better responsiveness
983
984## Version 6.9.3 (2026-02-12) - ADMIN EDIT DIALOG CONSISTENCY
985
986### UI Improvement
987- **Edit Recurring Event dialog** in Admin section now matches the main event editor exactly:
988  - Same dark theme styling (#1e1e1e background, #2c3e50 header)
989  - Same header layout with close button (×) in top-right corner
990  - Same input styling (dark inputs with green accent borders)
991  - Same footer with Cancel/Save buttons layout
992  - Same recurrence options box styling
993  - Consistent spacing, fonts, and colors throughout
994
995## Version 6.9.2 (2026-02-12) - MOBILE DIALOG FIX
996
997### Bug Fix
998- **Fixed:** Description textarea now extends full width on mobile/phone view
999  - Reduced form padding from 12px to 8px on screens ≤480px
1000  - Added explicit `width: 100%` and `box-sizing: border-box` to textarea
1001  - Ensured all form inputs/selects use full available width on mobile
1002
1003## Version 6.9.1 (2026-02-11) - ADMIN RECURRING EVENTS INTEGRATION
1004
1005### Admin Panel Updates
1006- **Enhanced Recurring Events Table:**
1007  - Pattern column now shows color-coded badges (daily=blue, weekly=green, monthly=orange, yearly=pink)
1008  - "First" column renamed to "Range" showing full date span (e.g., "Feb 1, 2026 → Dec 15, 2026")
1009  - Patterns now read from stored metadata when available, with smart fallback to detection
1010
1011- **Edit Recurring Series Dialog:**
1012  - Full recurrence pattern editing (not just simple intervals)
1013  - "Repeat every [N] [period]" with dropdown for Daily/Weekly/Monthly/Yearly
1014  - Weekly: Day-of-week checkboxes (Sun-Sat) with current days pre-selected
1015  - Monthly: Radio choice between "Day of month" or "Weekday pattern"
1016  - Ordinal weekday selector (First/Second/Third/Fourth/Fifth/Last + day dropdown)
1017  - Pre-populates all fields from stored recurrence metadata
1018  - Properly reschedules future events using new pattern
1019
1020- **Manage Series Dialog:**
1021  - Updated summary to show date range
1022  - Extend/trim/change pattern functions work with new patterns
1023
1024### Technical Updates
1025- `findRecurringEvents()` captures all recurrence metadata from events
1026- `formatRecurrencePattern()` generates human-readable pattern descriptions
1027- `detectRecurrencePattern()` enhanced to detect more interval variations
1028- `editRecurringSeries()` PHP handler processes new recurrence parameters
1029- `generateRecurrenceDates()` creates dates matching complex patterns
1030- Recurrence metadata preserved and updated across all event occurrences
1031
1032## Version 6.9.0 (2026-02-11) - ADVANCED RECURRING EVENTS
1033
1034### New Features
1035- **Enhanced Recurring Event Options:**
1036  - **Interval support:** Repeat every N days/weeks/months/years (e.g., every 3 months)
1037  - **Weekly day selection:** Choose specific days of the week (e.g., Mon, Wed, Fri)
1038  - **Monthly options:**
1039    - Day of month: Repeat on specific day (e.g., 15th of each month)
1040    - Ordinal weekday: Repeat on pattern (e.g., 2nd Wednesday, Last Friday)
1041  - **Examples now possible:**
1042    - Every 2 weeks on Monday and Thursday
1043    - Every 3 months on the 15th
1044    - Every other month on the 2nd Wednesday
1045    - Every year on the same date
1046    - Last Friday of every month
1047
1048### UI Changes
1049- Redesigned recurring options section with bordered container
1050- "Repeat every [N] [period]" input with interval number field
1051- Day-of-week checkboxes for weekly recurrence
1052- Radio buttons for monthly: "Day of month" vs "Weekday pattern"
1053- Ordinal dropdown (First/Second/Third/Fourth/Fifth/Last)
1054- Day dropdown (Sunday through Saturday)
1055- Helper text for end date field
1056
1057### Technical Details
1058- New parameters: recurrenceInterval, weekDays, monthlyType, monthDay, ordinalWeek, ordinalDay
1059- Recurrence pattern stored in event data for reference
1060- Maximum 365 occurrences (up from 100) to support daily events for a year
1061- Smart date iteration for complex patterns
1062
1063## Version 6.8.1 (2026-02-11) - ITINERARY DEFAULT STATE SETTING
1064
1065### New Feature
1066- **Added:** Option to set itinerary default state (expanded or collapsed)
1067  - New setting in Admin → Calendar → �� Sidebar Widget Settings
1068  - "�� Itinerary Section" with two options:
1069    - **Expanded** (default) - Show itinerary sections by default
1070    - **Collapsed** - Hide itinerary sections by default (click bar to expand)
1071  - Setting persists across page loads
1072  - Arrow indicator and content state reflect the saved preference on page load
1073
1074## Version 6.8.0 (2026-02-11) - COLLAPSIBLE ITINERARY
1075
1076### New Feature
1077- **Added:** Collapsible Itinerary bar in sidebar week view
1078  - New "ITINERARY" bar below the week calendar (styled like +ADD EVENT bar)
1079  - Click to collapse/expand the Today, Tomorrow, and Important Events sections
1080  - Arrow indicator shows expanded (▼) or collapsed (►) state
1081  - Smooth animation when collapsing/expanding
1082  - Clicking a day in the week grid shows that day's events ABOVE the Itinerary bar
1083  - Selected day events remain visible whether itinerary is expanded or collapsed
1084  - Shows "No upcoming events" message when there are no itinerary items
1085
1086### UI Layout (top to bottom)
10871. Header with clock/system stats
10882. +ADD EVENT bar
10893. Week grid (7 days)
10904. Selected day's events (appears when clicking a day)
10915. ITINERARY bar (click to collapse/expand)
10926. Today section (collapsible)
10937. Tomorrow section (collapsible)
10948. Important Events section (collapsible)
1095
1096## Version 6.7.9 (2026-02-11) - FIX EVENTS MANAGER STATISTICS
1097
1098### Bug Fixes
1099- **Fixed:** �� Events Manager showing inflated count (1195 instead of ~605)
1100  - The `scanDirectoryForStats()` function was counting ALL entries in JSON files
1101  - Now properly filters to only count date keys (`YYYY-MM-DD` format)
1102  - Now validates events have `id` and `title` before counting
1103  - Click "�� Rescan" to update the statistics with correct count
1104
1105## Version 6.7.8 (2026-02-11) - FILTER INVALID EVENTS
1106
1107### Bug Fixes
1108- **Fixed:** Event Manager showing "(untitled)" and "mapping" entries
1109  - Root cause: Calendar JSON files contain metadata keys (like "mapping") that were being parsed as events
1110  - Added date format validation (`YYYY-MM-DD`) to skip non-date keys
1111  - Added validation to require `id` and `title` fields for events
1112  - Applied fix to all event-reading functions:
1113    - `getEventsByNamespace()` - main event listing
1114    - `scanNamespaceRecursive()` - namespace scanning
1115    - `searchEvents()` - event search
1116    - `findEventsByTitle()` - title lookup
1117    - `deleteRecurringSeries()` - recurring deletion
1118    - `renameRecurringSeries()` - recurring rename
1119    - Recurring events scanner
1120    - Recurring cleanup function
1121
1122### Technical Details
1123- Date keys must match pattern `/^\d{4}-\d{2}-\d{2}$/`
1124- Events must have non-empty `id` and `title` fields
1125- All other entries in JSON files are now skipped
1126
1127## Version 6.7.7 (2026-02-11) - FIX PHP PATH & CLEAR LOG
1128
1129### Bug Fixes
1130- **Fixed:** "sh: 1: '/usr/bin/php': not found" error - removed escapeshellarg() which was adding quotes around the PHP path
1131- **Fixed:** "Could not clear log file" - added better error messages showing exact issue
1132- **Improved:** findPhpBinary() now uses is_executable() and `which php` for detection
1133- **Improved:** clearLogFile() now shows specific error (file not found, not writable, etc.)
1134
1135## Version 6.7.6 (2026-02-11) - FIX SYNC CONTROLS & LOGGING
1136
1137### Bug Fixes
1138- **Fixed:** Double log entries - sync script logs internally, removed redundant stdout capture
1139- **Fixed:** Manual sync not appearing in log - removed `--verbose` flag since script logs directly
1140- **Fixed:** Better error messages when sync fails
1141
1142### Improvements
1143- **Improved:** Sync now runs without `--verbose` flag - script logs to file internally
1144- **Improved:** Crontab warning if `>>` redirect is detected (causes duplicate entries)
1145- **Improved:** Log viewer now shows full path to log file
1146- **Improved:** Better pre-flight checks (directory creation, file permissions)
1147- **Improved:** PHP binary path is now properly escaped
1148
1149### Crontab Update Required
1150If your crontab has `>> sync.log 2>&1`, remove it to prevent duplicate log entries:
1151
1152**Before (causes duplicates):**
1153```
1154*/2 * * * * cd /var/www/html/dokuwiki/lib/plugins/calendar && php sync_outlook.php >> /var/www/html/dokuwiki/data/meta/calendar/sync.log 2>&1
1155```
1156
1157**After (correct):**
1158```
1159*/2 * * * * cd /var/www/html/dokuwiki/lib/plugins/calendar && php sync_outlook.php
1160```
1161
1162The script automatically logs to `data/meta/calendar/sync.log`.
1163
1164## Version 6.7.5 (2026-02-11) - FIX SYNC LOG OUTPUT
1165
1166### Bug Fixes
1167- **Fixed:** Sync log not showing output when running sync from admin panel
1168  - Added `--verbose` flag to sync command so output is captured
1169  - Sync output is now captured and written to the log file
1170  - Log directory is created if it doesn't exist
1171  - Better error handling if log directory isn't writable
1172  - Command being executed is logged for debugging
1173
1174### Changes
1175- Sync now runs in verbose mode when triggered from admin panel
1176- All sync output (stdout/stderr) is written to the log file
1177- Pre-flight check ensures log directory exists and is writable
1178
1179## Version 6.7.4 (2026-02-11) - FIX MANUAL SYNC EXECUTION
1180
1181### Bug Fix
1182- **Fixed:** "Could not open input file: sync_outlook.php" when running manual sync
1183  - The `$pluginDir` variable was missing from `runSync()` function
1184  - Added `$pluginDir = DOKU_PLUGIN . 'calendar'` before building the command
1185  - Sync now properly changes to the plugin directory before executing
1186
1187## Version 6.7.3 (2026-02-11) - FIX ADDITIONAL COUNT TYPE ERRORS
1188
1189### Bug Fix
1190- **Fixed:** Additional TypeError "count(): Argument #1 ($value) must be of type Countable|array, int given"
1191  - Fixed in `scanDirectoryForStats()` (line 5453)
1192  - Fixed in namespace delete function (line 4137)
1193  - Fixed in export function (line 5516)
1194  - Fixed in import function (line 5636)
1195  - All locations now check `is_array()` before calling `count()`
1196
1197## Version 6.7.2 (2026-02-11) - FIX EVENT MANAGER TYPE ERROR
1198
1199### Bug Fix
1200- **Fixed:** TypeError "count(): Argument #1 ($value) must be of type Countable|array, int given"
1201  - Added array type checks when iterating over calendar event data
1202  - Protects against corrupted JSON data where event lists may not be arrays
1203  - Added safeguards in `getEventsByNamespace()` and `scanNamespaceRecursive()`
1204
1205## Version 6.7.1 (2026-02-11) - BULK DELETE FOR BACKUPS
1206
1207### Changed
1208- **Improved:** Backup management now uses bulk selection and delete
1209  - Added checkboxes next to each backup file
1210  - Added "Select All" checkbox in the action bar
1211  - Added "��️ Delete Selected" button (appears when backups are selected)
1212  - Removed individual delete buttons from each row
1213  - Shows count of selected backups
1214  - Backups are deleted sequentially with visual feedback
1215
1216### UI
1217- Clean action bar at top of backup table with selection controls
1218- Selected count updates in real-time
1219- Rows fade out smoothly when deleted
1220
1221## Version 6.7.0 (2026-02-11) - IMPROVED RESTORE FUNCTION
1222
1223### Changed
1224- **Improved:** Restore function now uses DokuWiki's Extension Manager API
1225  - Uses `helper_plugin_extension_extension` for proper installation
1226  - Handles permissions correctly through DokuWiki's standard plugin installation process
1227  - Falls back to manual instructions if Extension Manager is not available
1228
1229### How It Works
1230When you click "�� Restore" on a backup:
12311. The plugin loads DokuWiki's extension helper
12322. Calls `installFromLocal()` with the backup ZIP file
12333. DokuWiki's Extension Manager handles file extraction and installation
12344. This ensures proper permissions and follows DokuWiki standards
1235
1236### Fallback
1237If the Extension Manager helper is not available, you'll be prompted to:
1238- Download the backup ZIP
1239- Go to Admin → Extension Manager → Install
1240- Upload the ZIP file manually
1241
1242## Version 6.6.9 (2026-02-11) - REMOVE RESTORE FUNCTION
1243
1244### Removed
1245- **Removed:** "Restore" button from backup management
1246- **Removed:** `restoreBackup()` PHP method
1247- **Removed:** `restoreBackup()` JavaScript function
1248
1249### Added
1250- **Added:** Informational note in backup section explaining how to restore:
1251  - Download the backup ZIP file
1252  - Go to Admin → Extension Manager → Install
1253  - Upload the ZIP file there
1254  - DokuWiki's extension manager handles installation safely with proper permissions
1255
1256### Reason
1257The 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.
1258
1259## Version 6.6.8 (2026-02-11) - FIX THEME KEYS & FILE PERMISSIONS
1260
1261### Bug Fixes
1262- **Fixed:** "Undefined array key" warnings for wiki theme (pastdue_color, pastdue_bg, tomorrow_bg, etc.)
1263  - Added missing theme keys to `getWikiTemplateColors()` return array
1264
1265- **Fixed:** "Permission denied" errors for sync.log and sync_state.json
1266  - Moved sync files from plugin directory to `data/meta/calendar/` (writable location)
1267  - Updated sync_outlook.php, admin.php to use new paths
1268  - sync_config.php remains in plugin directory (must be manually configured)
1269
1270- **Fixed:** `findEventNamespace` now returns the actual DIRECTORY where event file lives
1271  - This ensures deletion works correctly when stored namespace differs from file location
1272
1273### Note on lang.php Permission Error
1274If 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.
1275
1276## Version 6.6.7 (2026-02-11) - FIX NAMESPACE CHANGE BUG (PART 2)
1277
1278### Bug Fix
1279- **Fixed:** Events in the DEFAULT namespace (no namespace) could not be moved to other namespaces
1280  - Root cause: The comparison `$oldNamespace !== ''` was always FALSE for default namespace events
1281  - Changed to `$oldNamespace !== null` to properly distinguish between "event not found" (null) and "event in default namespace" ('')
1282  - This allows moving events FROM the default namespace TO any other namespace
1283  - Also fixed null coalescing for recurring events: `$oldNamespace ?? $namespace` instead of `$oldNamespace ?: $namespace`
1284
1285## Version 6.6.6 (2026-02-11) - FIX NAMESPACE CHANGE & DELETE BUGS
1286
1287### Bug Fixes
1288- **Fixed:** Changing an event's namespace now properly moves the event instead of creating a duplicate
1289  - Root cause: `findEventNamespace()` was searching in the NEW namespace instead of ALL namespaces
1290  - Now uses wildcard search `'*'` to find the existing event regardless of its current namespace
1291
1292- **Fixed:** Deleting an event no longer causes the calendar to filter by the deleted event's namespace
1293  - Root cause: After deletion, `reloadCalendarData()` was called with the deleted event's namespace
1294  - Now retrieves the calendar's original namespace from `container.dataset.namespace`
1295  - Also fixed in `saveEventCompact()` and `toggleTaskComplete()` for consistency
1296
1297## Version 6.6.5 (2026-02-11) - ADD AUTOCOMPLETE ATTRIBUTES
1298
1299### Improved
1300- Added `autocomplete="new-password"` to client secret input field
1301- Added `autocomplete="email"` to user email input field
1302- Added `autocomplete="off"` to client ID input field
1303- Follows browser best practices for form inputs
1304
1305## Version 6.6.4 (2026-02-11) - FIX GEOLOCATION VIOLATION
1306
1307### Bug Fix
1308- **Fixed:** Browser violation "Only request geolocation information in response to a user gesture"
1309- Weather widget now uses Sacramento as the default location on page load
1310- Geolocation is only requested when user **clicks** on the weather icon
1311- Click the weather icon to get your local weather (browser will prompt for permission)
1312- Weather icon shows tooltip "Click for local weather" and has pointer cursor
1313
1314## Version 6.6.3 (2026-02-11) - FIX MUTATIONOBSERVER ERROR
1315
1316### Bug Fix
1317- **Fixed:** `Failed to execute 'observe' on 'MutationObserver': parameter 1 is not of type 'Node'` error
1318- Root cause: MutationObserver tried to observe `document.body` before DOM was ready
1319- Added `setupMutationObserver()` function that waits for DOMContentLoaded before attaching observer
1320
1321## Version 6.6.2 (2026-02-11) - FIX CONFLICT TOOLTIP JAVASCRIPT LOADING
1322
1323### Bug Fix
1324- **Critical:** Fixed `showConflictTooltip is not defined` and `hideConflictTooltip is not defined` errors
1325- Root cause: `addAssets()` in action.php was loading empty `script.js` instead of `calendar-main.js`
1326- Changed `addAssets()` to load `calendar-main.js` directly
1327- Updated `script.js` to dynamically load `calendar-main.js` as a fallback mechanism
1328
1329## Version 6.6.1 (2026-02-11) - SECURITY FIXES
1330
1331### Security
1332- **Critical:** Removed `eval()` remote code execution vulnerability in config import
1333- **Critical:** Added admin authentication requirement to `get_system_stats.php` endpoint
1334- **High:** Added CSRF token verification to all write operations (save, delete, toggle)
1335- **High:** Fixed path traversal vulnerabilities in namespace delete/rename functions
1336- **High:** Added admin privilege verification to AJAX admin routes
1337
1338### Improved
1339- **Input Validation:** Date format (YYYY-MM-DD), time format (HH:MM), color format (#RRGGBB)
1340- **Input Validation:** Year range (1970-2100), month range (1-12), namespace format
1341- **Input Validation:** Recurrence type whitelist, title/description length limits
1342- **Debug Logging:** All debug logging now conditional on `CALENDAR_DEBUG` constant (off by default)
1343- **JSON Handling:** Added `safeJsonRead()` helper with proper error handling
1344- **Timezone:** Sync script now uses configured timezone instead of hardcoded value
1345
1346### Code Quality
1347- Documented intentional switch fallthrough in `get_system_stats.php`
1348- Standardized error response format
1349
1350## Version 6.6.0 (2026-02-11) - BACKUP & UI IMPROVEMENTS
1351
1352### Fixed
1353- **Backup:** Fixed recursive directory backup to properly include all subdirectories (including `lang/`)
1354- **Backup:** Now uses `SELF_FIRST` iterator to process directories before their contents
1355- **Backup:** Empty directories are now explicitly added with `addEmptyDir()` to preserve structure
1356
1357### UI Change
1358- **Namespace Explorer:** Cleanup status message now appears prominently at top of section
1359- Previously status message was at bottom, easy to miss after cleanup operations
1360
1361## Version 6.5.5 (2026-02-11) - FIX AJAX ROUTING & MOVE CLEANUP BUTTON
1362
1363### Bug Fix
1364- All admin AJAX actions (cleanup, rescan, extend, trim, pause, resume, change start/pattern) were returning "Unknown action"
1365- Root cause: AJAX calls go through `action.php`'s switch statement, not `admin.php`'s `handle()` method
1366- Added routing in `action.php`: new cases forward to `admin.php` via `routeToAdmin()` helper
1367- Added public `handleAjaxAction()` method in `admin.php` as the entry point from `action.php`
1368
1369### UI Change
1370- Moved "�� Cleanup" button from standalone section to inline next to "➕ New Namespace" in the control bar
1371- Status messages still appear below the namespace explorer
1372
1373## Version 6.5.4 (2026-02-11) - FIX PHP PARSE ERROR IN CLEANUP JS
1374
1375### Bug Fix
1376- Root cause: `style='color:...'` single quotes inside PHP `echo '...'` block terminated the PHP string prematurely
1377- PHP saw `color:#e74c3c` as unexpected PHP code instead of part of the JS string
1378- Fixed all 5 occurrences in cleanupEmptyNamespaces JS: escaped single quotes as `\'`
1379- Added `adminColors` JS object (text, bg, border) injected from PHP `$colors` at render time
1380- Cleanup detail text uses `adminColors.text` to respect DokuWiki template theme colors
1381
1382## Version 6.5.3 (2026-02-11) - FIX CLEANUP NAMESPACES PARSE ERROR
1383
1384### Bug Fix
1385- Fixed PHP parse error on line 1089 caused by `$colors['text']` PHP variable inside JS string concatenation
1386- The cleanup results detail list now uses hardcoded `#666` for text color instead of attempting PHP interpolation within JS runtime code
1387
1388## Version 6.5.2 (2026-02-11) - CLEANUP EMPTY NAMESPACES
1389
1390### New Feature
1391- "�� Cleanup Empty Namespaces" button added at bottom of Namespace Explorer section
1392- Dry-run scan first: shows exactly what will be removed with bullet-point details in confirm dialog
1393- Removes empty calendar folders (0 JSON files or all-empty JSON files) from any namespace
1394- Removes parent namespace directories if they become empty after calendar folder removal
1395- Root calendar directory is never removed
1396- AJAX-powered with inline status showing results after cleanup
1397- Page auto-reloads after 2 seconds to refresh the namespace explorer view
1398- Recursively scans all nested namespace directories via `findAllCalendarDirsRecursive()`
1399
1400## Version 6.5.1 (2026-02-11) - TRIM ALL PAST: SHOW COUNT BEFORE DELETE
1401
1402### Improved
1403- "Trim All Past" button now does a dry-run count before showing the confirmation dialog
1404- Confirmation shows exact count: "Found 47 past recurring events to remove"
1405- If zero found, shows "No past recurring events found to remove" instead of confirm
1406- PHP handler supports `dry_run` parameter that counts without deleting
1407
1408## Version 6.5.0 (2026-02-11) - BULK TRIM ALL PAST RECURRING EVENTS
1409
1410### Bulk Action
1411- Red "✂️ Trim All Past" button added next to the Rescan button in the Recurring Events section header
1412- Removes ALL past occurrences (before today) from EVERY recurring series in one click
1413- Only removes events with `recurring` or `recurringId` flags — non-recurring events are untouched
1414- Confirmation dialog required before execution
1415- AJAX-powered with inline status showing count removed, then auto-rescans the table
1416- Searches all calendar directories recursively
1417
1418## Version 6.4.9 (2026-02-11) - FIX RECURRING EDIT/DELETE: SEARCH ALL DIRECTORIES
1419
1420### Bug Fix
1421- Edit and Delete recurring series now search ALL calendar directories instead of building a path from the namespace field
1422- Root cause: event's `namespace` field (stored in JSON) can differ from the filesystem directory where the file lives
1423- Both handlers now use `findCalendarDirs()` to collect every calendar directory recursively
1424- Events matched by title AND namespace field (case-insensitive) for precise targeting
1425- Edit handler rewritten: rename/time/namespace updates in Pass 1, interval respace in Pass 2
1426- New `findCalendarDirs()` helper method for recursive directory discovery
1427
1428## Version 6.4.8 (2026-02-11) - FIX PHP PARSE ERROR IN MANAGE DIALOG
1429
1430### Bug Fix
1431- Rewrote `manageRecurringSeries()` JS function using string concatenation instead of template literals
1432- JS template literals (`${...}`) inside PHP echo blocks caused PHP to parse them as variable interpolation
1433- All inline onclick handlers now use `\x27` for single quotes to avoid escaping conflicts
1434
1435## Version 6.4.7 (2026-02-11) - RECURRING EVENTS: FULL MANAGEMENT CONTROLS
1436
1437### New "Manage" Button per Series
1438- Orange "Manage" button opens a comprehensive management dialog for each recurring series
1439
1440### Extend Series
1441- Add N new occurrences after the last event in the series
1442- Configurable interval: Daily, Weekly, Bi-weekly, Monthly, Quarterly, Yearly
1443- New events copy title, time, color, namespace, and recurring flag from the last event
1444
1445### Trim Past Events
1446- Remove all occurrences before a selected cutoff date
1447- Confirmation required before deletion
1448- Cleans up empty date keys and files automatically
1449
1450### Change Pattern
1451- Respace future occurrences with a new interval
1452- Past events are untouched; only future events are removed and re-created
1453- First future event becomes the anchor date
1454
1455### Change Start Date
1456- Shift ALL occurrences by the difference between old and new start date
1457- Events are removed from old positions and re-created at new positions
1458- Preserves spacing between all events
1459
1460### Pause/Resume
1461- Pause: adds ⏸ prefix and paused flag to all future occurrences
1462- Resume: removes ⏸ prefix and paused flag from all occurrences
1463- Button toggles based on whether series is currently paused
1464
1465### Infrastructure
1466- New shared `recurringAction()` JS helper for all AJAX management operations
1467- New `getRecurringSeriesEvents()` PHP helper for finding all events in a series
1468- Status messages shown inline in the management dialog
1469- Close button triggers automatic rescan to refresh the table
1470
1471## Version 6.4.6 (2026-02-11) - RECURRING EVENTS: RESCAN BUTTON & IMPROVED LOGIC
1472
1473### Rescan Button
1474- Green "�� Rescan" button added to the Recurring Events section header
1475- AJAX-powered: rescans all calendar data and refreshes the table without page reload
1476- Shows count of found series briefly after scan completes
1477
1478### Improved Detection Logic
1479- Events with `recurring: true` flag are now detected first (grouped by `recurringId`)
1480- Pattern-detected events (3+ same-title occurrences) are found separately and deduplicated
1481- New "Source" column shows ��️ Flagged (has recurring flag) vs �� Detected (pattern match)
1482- Median interval used for pattern detection instead of just first two dates (more robust)
1483- New patterns recognized: Quarterly, Semi-annual, and "Every ~N days" for custom intervals
1484- Empty/invalid titles and malformed date arrays are now skipped safely
1485- Dates are deduplicated before counting (prevents inflated counts from multi-day events)
1486- Nested namespace directories now scanned recursively
1487- Results sorted alphabetically by title
1488
1489## Version 6.4.5 (2026-02-11) - ADMIN VERSION HISTORY OVERHAUL
1490
1491### Version History Viewer
1492- All purple (#7b1fa2) accent colors replaced with green (#00cc07) to match admin theme
1493- Changelog parser now handles `###` subsection headers (rendered as green bold labels)
1494- Plain `- ` bullet items now parsed and categorized under their subsection
1495- Previously only `- **Type:** description` format was recognized
1496
1497### Current Release Button
1498- Green "Current Release" button added between nav arrows
1499- Jumps directly to the card matching the running version from plugin.info.txt
1500- Running version card shows green "RUNNING" badge and thicker green border
1501
1502## Version 6.4.4 (2026-02-11) - WIKI THEME: PAST EVENTS TOGGLE BACKGROUND
1503
1504### Fix
1505- Wiki theme past events pulldown (retracted state) now uses `__background_neu__` (`--cell-today-bg`)
1506- Previously used `--cell-bg` which appeared unthemed/white
1507
1508## Version 6.4.3 (2026-02-11) - WIKI THEME: DAY HEADERS BACKGROUND
1509
1510### Fix
1511- Wiki theme SMTWTFS day headers now use `__background_neu__` (`--cell-today-bg`) instead of `--background-header`
1512
1513## Version 6.4.2 (2026-02-11) - WIKI THEME: DAY HEADERS (INITIAL)
1514
1515### Wiki Theme Day Headers
1516- Added explicit CSS override for `.calendar-theme-wiki .calendar-day-headers`
1517- Day header text uses `--text-primary` (template's `__text__` color)
1518
1519## Version 6.4.1 (2026-02-11) - WIKI THEME: EVENT HIGHLIGHT
1520
1521### Fix
1522- Wiki theme event highlight (when clicking calendar bar) now uses `themeStyles.header_bg` (`__background_alt__`) instead of hardcoded blue (#dce9f5)
1523- Subtle shadow instead of blue glow
1524
1525## Version 6.4.0 (2026-02-11) - DARK READER: SECTION BAR COLOR MATCHING
1526
1527### Fix
1528- Wiki theme section left bar now uses a `<div>` with `background` instead of `border-left`
1529- Dark Reader maps the same color differently for border vs background properties, causing visual mismatch
1530- Both the bar and header now use `background`, so Dark Reader maps them identically
1531- Flex layout wrapper added for wiki theme sections
1532- Wiki fallback colors updated: `border` key now uses `#ccc` (matching `__border__`) instead of `#2b73b7`
1533
1534## Version 6.3.9 (2026-02-10) - WIKI THEME: SECTION BAR FIX (ATTEMPT)
1535
1536### Fix
1537- Simplified wiki section container — removed `wiki-section-container` class
1538- Added `background` from `$themeStyles['bg']` to section container
1539
1540## Version 6.3.8 (2026-02-10) - WIKI THEME: BUTTON & SECTION HEADER COLORS
1541
1542### Wiki Theme Buttons
1543- Nav buttons (< >), Today button, and panel buttons now use `__link__` color background with white text
1544- CSS overrides for `.calendar-theme-wiki .cal-nav-btn`, `.cal-today-btn`, panel buttons
1545
1546### Wiki Theme Section Headers
1547- Today: `__link__` background (accent/link color)
1548- Tomorrow: `__background_alt__` background (alternate background)
1549- Important: `__border__` background (border color)
1550- Each section now has a distinct color from the template palette
1551
1552## Version 6.3.7 (2026-02-10) - WIKI THEME CHECKBOX FIX
1553
1554### Fix
1555- Wiki theme checkbox override changed from `border-color` to full `border: 2px solid` shorthand
1556- Properly overrides the base rule which uses `border` shorthand
1557- Hover state also uses full shorthand
1558
1559## Version 6.3.6 (2026-02-10) - WIKI THEME CHECKBOX BORDER COLOR
1560
1561### Fix
1562- Wiki theme unchecked checkboxes now use `--border-main` (template's `__border__` color) for border
1563- Checked state fills with border color
1564- Hover state uses border color
1565- Applied to calendar, sidebar, and eventlist containers
1566
1567## Version 6.3.5 (2026-02-10) - WIKI THEME: ALLOW DARK READER ON HEADERS
1568
1569### Fix
1570- Wiki theme section headers (Today/Tomorrow/Important) no longer use `!important` or `-webkit-text-fill-color`
1571- Dark Reader can now freely adjust background, text color, and borders on wiki theme headers
1572- Clicked-day panel header and section border-left also unlocked for wiki theme
1573- All other themes (matrix/purple/pink/professional) retain full Dark Reader protection
1574
1575## Version 6.3.4 (2026-02-10) - WIKI THEME: BORDER COLOR FOR HEADERS & BADGES
1576
1577### Wiki Theme Color Remapping
1578- `border` (accent color) now maps to template's `__border__` instead of `__link__`
1579- This affects: section headers (Today/Tomorrow/Important), badges (TODAY, namespace), sidebar widget border, clicked-day panel, `--border-main` CSS variable
1580- `text_bright` still maps to `__link__` for link text and accent text
1581- Section headers all use the same `__border__` color for consistent appearance
1582- Updated COLOR_SCHEME mapping documentation
1583
1584## Version 6.3.3 (2026-02-10) - WIKI THEME SECTION HEADER TEXT COLOR
1585
1586### Fix
1587- Wiki theme Today/Tomorrow/Important section header text now uses `$themeStyles['text_primary']` (mapped from template's `__text__` color) instead of hardcoded white
1588- Clicked-day panel header text also uses template text color for wiki theme
1589- Professional theme remains white text on blue headers
1590
1591## Version 6.3.2 (2026-02-10) - FIX THEME NOT UPDATING ON SIDEBAR EVENTLIST
1592
1593### Bug Fix
1594- Added `$renderer->nocache()` to the render function
1595- DokuWiki was caching the rendered sidebar HTML, so theme changes made in admin were never reflected until the page was manually edited
1596- Now all calendar/eventlist/eventpanel outputs are rendered fresh on each page load, picking up the current theme from `calendar_theme.txt`
1597
1598## Version 6.3.1 (2026-02-10) - EVENTLIST THEMING
1599
1600### {{eventlist}} Theme Support
1601- Eventlist containers now receive theme class (`eventlist-theme-matrix`, etc.) and full CSS variable injection
1602- Dark themes get themed border + glow, light themes get subtle border
1603- Container background set from `$themeStyles['bg']` with `!important`
1604
1605### Eventlist CSS Theme Rules (all 3 dark themes)
1606- Title, header, time, date, body, links, strong, code, namespace badge, empty state
1607- Today header, clock, date — all with `color` + `-webkit-text-fill-color` `!important`
1608- Item borders, section backgrounds, code block backgrounds
1609- Full Dark Reader protection via same inline+CSS approach as calendar/sidebar
1610
1611## Version 6.3.0 (2026-02-10) - DARK READER COMPATIBILITY & COMPLETE THEMING
1612
1613### Dark Reader Browser Extension Compatibility
1614All 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.
1615
1616**Protected elements:**
1617- Section headers (Today/Tomorrow/Important) — background, text color, text-fill-color
1618- Clicked-day panel header — background, text color, close button
1619- All badges (TODAY, PAST DUE, namespace, panel namespace, eventlist-simple) — background, text, text-fill-color
1620- Event titles, meta, descriptions — color with !important via CSS
1621- Day numbers, nav buttons, calendar day headers — color with !important via CSS
1622- System status bars — inline background !important on tracks and fills
1623- System tooltips — background, border-color, text color all set via setProperty with !important
1624- Section left border bars — border-left with !important
1625- Event color indicator bars — border-left-color with !important
1626- Sidebar section event text (Purple and Pink themes)
1627
1628### Complete CSS Variable Audit (41 conversions in v6.1.1)
1629- All remaining hardcoded colors in style.css converted to CSS variable references
1630- Calendar borders, text colors, backgrounds, input focus shadows, accent borders
1631- Only legitimate hardcodes remain (keyframe animations, theme-specific override blocks)
1632
1633### Semantic Color System
1634- New CSS variables: `--pastdue-color`, `--pastdue-bg`, `--pastdue-bg-strong`, `--pastdue-bg-light`
1635- New CSS variables: `--tomorrow-bg`, `--tomorrow-bg-strong`, `--tomorrow-bg-light`
1636- Injected into all 3 CSS var blocks (full calendar, event panel, sidebar widget)
1637- Today/Tomorrow/Important section colors now theme-derived instead of hardcoded
1638
1639### Section Headers Fully Themed
1640- Today/Tomorrow/Important headers use theme accent colors instead of fixed green/orange/purple
1641- Matrix: bright/standard/dim green, Purple: bright/standard/dim purple, Pink: hot/medium/light pink
1642- Professional: blue shades, Wiki: template-derived colors
1643- Dark theme headers use dark background color for text contrast
1644
1645### Pink Theme Enhancements
1646- **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
1647- **Firework button hover** — `pink-firework-burst` keyframe animation with multi-point radiating box-shadows, scale/brightness effects on hover, instant flash on click
1648- **Checkbox glow** — hot pink border with ambient glow, hover intensifies, checked fills with glow
1649
1650### All Theme Checkbox Theming
1651- Matrix: bright green border + green glow, Purple: purple border + purple glow
1652- Pink: hot pink border + pink glow (with enhanced ambient effect)
1653- Hover scales 1.1x with intensified glow on all themes
1654- Checked state fills with theme accent color + outer glow
1655
1656### System Tooltips Themed
1657- Both tooltip functions use theme-derived colors from `$themeStyles`
1658- Green tooltip: `text_bright`, Purple: `border`, Orange: `text_primary`
1659- Background from `$themeStyles['bg']`, divider borders use theme accent colors
1660- All properties set with `style.setProperty(prop, value, "important")`
1661
1662### Namespace Filter Badge Cleanup
1663- Removed inline namespace badge from event side panel header
1664- Filter indicator bar ("Filtering: namespace ✕") retained and working
1665- AJAX-based namespace filtering fully functional via onclick handlers
1666
1667## Version 6.1.0 (2026-02-10) - TODAY INDICATOR, BUTTON HOVER & CHECKBOXES
1668
1669### Today Indicator
1670- **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)
1671- **Added:** Today cell has `--cell-today-bg` background AND a visible inset border glow on hover using `--border-main`
1672- **Added:** `.day-num` now uses `--text-primary` for color instead of relying on browser default
1673
1674### Button Hover/Click Theming
1675- **Fixed:** All buttons now use `filter: brightness(1.3)` on hover for a visible glow effect across all themes
1676- **Fixed:** All buttons use `filter: brightness(0.85)` on click/active for a press-down darkening effect
1677- **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
1678- **Removed:** Generic `opacity: 0.9` hover which was barely visible on dark themes
1679
1680### Checkboxes Themed
1681- **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
1682- **Added:** `accent-color: var(--text-bright)` on all dialog checkboxes (task, recurring) for consistent theme coloring
1683
1684### Form Input Text
1685- **Fixed:** `.input-sleek` now has `color: var(--text-primary)` — form text is visible on dark themes
1686- **Added:** `::placeholder` styling for inputs/textareas using `--text-dim`
1687
1688## Version 6.0.9 (2026-02-09) - FORM TEXT, CELL HOVER & GLOW TUNING
1689
1690### Form Input Text Fix
1691- **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)`.
1692- **Added:** Themed placeholder text (`::placeholder`) for inputs/textareas
1693
1694### Button & Cell Hover Theming
1695- **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`
1696- **Improved:** Nav buttons (`◄`/`►`) and Today button hover now show a themed glow + scale effect instead of just opacity change
1697- **Added:** Active (click) state for nav/today buttons with scale-down feedback
1698- **Improved:** Month picker hover now also shows a subtle theme shadow
1699
1700### Glow Reduced to 1px for Matrix/Purple
1701- Matrix and purple text glow reduced from 2px to 1px across: event titles, descriptions, meta, links, sidebar day numbers, sidebar event titles, sidebar dates
1702- Matrix clock pulse animation reduced from 6px/10px+15px to 2px/4px+6px
1703- Weather text glow reduced to 1px, clock to 2px
1704- Pink remains at 2px (barely noticeable)
1705
1706## Version 6.0.8 (2026-02-09) - LINKS, GLOW CONSISTENCY & PINK TONE-DOWN
1707
1708### Links Themed
1709- **Added:** `.cal-link` CSS class — all links rendered via `renderDescription()` now pick up theme accent color via `--text-bright`
1710- **Fixed:** Sidebar widget links (`a.cal-link`) inherit theme colors
1711- **Fixed:** Event list widget description links (`eventlist-widget-desc a`) use CSS vars
1712- **Fixed:** Simple event list body links/strong/code all themed
1713
1714### Text Glow Consistency
1715- **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
1716- **Added:** Subtle link glow on dark themes
1717- **Added:** Matrix and purple now get the same barely-visible text glow that pink had on sidebar week grid day numbers and event titles
1718
1719### Pink Glow Toned Down
1720- **Reduced:** Sidebar today header box-shadow from `0 0 10px 0.4` to `0 0 6px 0.25`
1721- **Reduced:** Day number sparkle animation from 3px/6px+10px to 2px/3px
1722- **Reduced:** Today cell shimmer from 3px+5px / 8px+12px to 2px+3px / 4px+6px
1723- **Reduced:** Event bar glow pulse from 2px/4px+6px to 1px/2px+3px
1724- **Reduced:** Today hover glow from 10px+15px to 5px+8px
1725- **Reduced:** Event item glow from 2px/5px to 1px/3px
1726- **Reduced:** Calendar container glow from 8px to 5px
1727
1728### Other
1729- **Themed:** Sidebar weather, date, and clock text colors and glow via CSS vars
1730
1731## Version 6.0.7 (2026-02-09) - BADGES, BUTTONS & CONFLICT THEMING
1732
1733- **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
1734- **Fixed:** TODAY badge uses `--border-main` for background instead of hardcoded purple
1735- **Fixed:** Conflict alert badge (`⚠️`) uses `--border-main` background and `--text-bright` border — matches theme accent
1736- **Fixed:** Conflict tooltip header background now set inline from theme vars (tooltip is appended to body, can't inherit CSS vars)
1737- **Fixed:** Conflict tooltip body items use themed text and border colors
1738- **Fixed:** Month picker Go/Cancel buttons themed (`--text-bright` for save, `--cell-bg` for cancel)
1739- **Fixed:** Calendar header month/year hover uses `--cell-today-bg` background
1740- **Fixed:** Inline search input border uses `--border-color`
1741- **Fixed:** Event list header border uses `--border-color`
1742
1743## Version 6.0.6 (2026-02-09) - COMPLETE TEXT THEMING
1744
1745- **Fixed:** Calendar header month/year title had hardcoded dark color — now uses `--text-primary`
1746- **Fixed:** Month/year picker hover used hardcoded gray background and green text — now uses `--cell-today-bg` and `--text-bright`
1747- **Fixed:** Event list items (titles, meta, descriptions, links, code blocks, bold text) — all now theme-aware via CSS vars
1748- **Fixed:** Completed/past event states used hardcoded grays — now use `--cell-bg`, `--text-dim`, `--cell-today-bg`
1749- **Fixed:** Scrollbar track/thumb colors now use theme vars
1750- **Fixed:** Namespace filter indicator (background, label, badge, close button) — all themed
1751- **Fixed:** Panel standalone month picker hover and namespace badge — themed
1752- **Fixed:** Calendar header border-bottom — now uses `--border-color`
1753
1754## Version 6.0.5 (2026-02-09) - THEMED BORDERS & EVENT PANEL
1755
1756- **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).
1757- **Added:** Theme-colored border and glow for event panel (`{{eventpanel}}`) on dark themes using `[data-theme]` attribute selectors
1758- **Themed:** Event panel header (nav buttons, month title, today button, search input, add button) — all now use CSS vars
1759- **Themed:** Panel standalone header background and border
1760
1761## Version 6.0.4 (2026-02-09) - FULL DIALOG THEMING
1762
1763- **Fixed:** Day cell click popup (day-popup) used hardcoded white/gray colors — now fully theme-aware using CSS variables
1764- **Fixed:** Event add/edit dialog (dialog-content-sleek) had hardcoded white background and blue header — now uses theme colors
1765- **Fixed:** Month picker dialog had hardcoded white background and dark text — now themed
1766- **Fixed:** Popup event items, titles, times, descriptions, footer, add-event button, close button — all now use CSS vars with sensible fallbacks
1767- **Fixed:** Form elements (field labels, inputs, checkboxes, recurring options, color pickers) — all reference theme CSS vars
1768- **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.
1769
1770## Version 6.0.3 (2026-02-09) - MOVE IMPORTANT NAMESPACES TO MANAGE TAB
1771
1772- **Moved:** Important Namespaces section from Outlook Sync tab to Manage Events tab (between Events Manager and Cleanup sections)
1773- **Changed:** Section header color from purple (#9b59b6) to green (#00cc07) to match other Manage tab sections
1774- **Added:** Dedicated Save button and `save_important_namespaces` action handler — setting is now independent of Outlook config save
1775- **Fixed:** Saving Outlook config no longer overwrites important namespaces with the default value
1776
1777## Version 6.0.2 (2026-02-09) - FIREFOX DAY HEADER FIX
1778
1779- **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.
1780
1781## Version 6.0.1 (2026-02-09) - THEME PARAMETER FIX
1782
1783- **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()`
1784- **Fixed:** `renderEventDialog` also ignored theme context — now receives theme from its caller
1785- **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.
1786
1787
1788## Version 6.0.0 (2026-02-09) - CODE AUDIT & v6 RELEASE
1789
1790- **Audited:** All PHP files (syntax.php, action.php, admin.php, sync_outlook.php) — balanced braces confirmed
1791- **Audited:** calendar-main.js (2,840 lines) — Node syntax check passed, 44 global functions verified
1792- **Audited:** style.css (3,218 lines) — balanced braces confirmed
1793- **Audited:** All admin manage tab action handlers verified functional (13 actions)
1794- **New:** Fresh README.md for GitHub with complete documentation
1795- **Includes all v5.5.x fixes:**
1796  - Delta sync for Outlook (hash-based change tracking, O(changes) not O(total))
1797  - Wiki theme sidebar section headers: distinct colors, no glow, themed day-click panel
1798  - Conflict badges on past events after AJAX navigation
1799  - Admin panel: green cleanup header, fixed broken CSS, endTime field name, cache clearing for all mutations, empty file cleanup, dead code removal
1800
1801## Version 5.5.9 (2026-02-09) - ADMIN MANAGE TAB CLEANUP
1802
1803- **Fixed:** Cleanup Old Events section header now green (#00cc07) to match all other section headers
1804- **Fixed:** Recurring stat card had broken CSS from `$colors['bg'] . '3e0'` concatenation — now uses proper `#fff3e0`
1805- **Fixed:** Same broken CSS pattern in Outlook Sync tab log warning
1806- **Fixed:** `editRecurringSeries` wrote `end_time` instead of correct `endTime` field name
1807- **Fixed:** `editRecurringSeries` used uninitialized `$firstEventDate` variable — now properly declared
1808- **Fixed:** `moveEvents` and `moveSingleEvent` could crash if event date key didn't exist in JSON — added `isset()` check
1809- **Fixed:** `moveSingleEvent` now cleans up empty date keys and deletes empty files after moving
1810- **Fixed:** `deleteRecurringSeries` now cleans up empty date keys and deletes empty JSON files
1811- **Fixed:** Export version was hardcoded as '3.4.6' — now reads dynamically from plugin.info.txt
1812- **Added:** `clearStatsCache()` helper method — all 11 mutation functions now properly clear the event stats cache
1813- **Removed:** Dead `move_events` action handler (all forms use `move_selected_events`)
1814- **Removed:** `console.log` debug statements from `sortRecurringTable` and `editRecurringSeries`
1815- **Removed:** Stale "NEW!" comment from Events Manager section
1816
1817## Version 5.5.8 (2026-02-09) - DELTA SYNC & WIKI THEME SIDEBAR POLISH
1818
1819- **Added:** Outlook sync now uses hash-based delta tracking — only new, modified, or deleted events hit the API
1820- **Added:** computeEventHash() hashes all sync-relevant fields (title, description, time, date, color, namespace, task status)
1821- **Added:** Sync state v2 format stores {outlookId, hash} per event; auto-migrates from v1 on first run
1822- **Added:** Delta analysis summary shows new/modified/unchanged/deleted counts before syncing
1823- **Changed:** Unchanged events are completely skipped (zero API calls) — O(changes) instead of O(total)
1824- **Changed:** Removed per-run duplicate scan (was re-querying every event); use --clean-duplicates when needed
1825- **Changed:** Wiki theme sidebar section headers now use distinct colors: orange (Today), green (Tomorrow), purple (Important)
1826- **Fixed:** Wiki theme sidebar section headers no longer have colored glow — clean shadow instead
1827- **Fixed:** Wiki theme week grid day-click panel header now uses accent color with white text
1828- **Fixed:** Removed invalid var(--__...__) CSS syntax from inline styles (only works in CSS files, not HTML attributes)
1829
1830## Version 5.5.7 (2026-02-09) - WIKI THEME SIDEBAR POLISH
1831
1832- **Fixed:** Sidebar Today/Tomorrow/Important headers now use three distinct colors (orange/green/purple) instead of similar greys
1833- **Fixed:** Sidebar section headers no longer glow on wiki theme (clean shadow like professional)
1834- **Fixed:** Week grid day-click panel header now uses theme accent color with white text instead of grey background
1835- **Fixed:** Removed invalid var(--__...__) CSS variable syntax from inline styles (DokuWiki replacements only work in CSS files)
1836- **Changed:** Wiki theme section header text now white for readability on colored backgrounds
1837- **Changed:** Week grid JS theme colors now use actual $themeStyles values
1838
1839## Version 5.5.6 (2026-02-09) - FIX CONFLICT BADGES ON PAST EVENTS AFTER AJAX
1840
1841- **Fixed:** Conflict badges now render on past events in JS rebuild path (were only in the future events branch)
1842
1843## Version 5.5.5 (2026-02-09) - FIX SIDEBAR CONFLICT TOOLTIP POSITIONING
1844
1845- **Fixed:** Sidebar widget conflict tooltips now display next to the badge instead of upper-left corner
1846- **Fixed:** Week grid conflict tooltips also fixed (same issue)
1847- **Changed:** All conflict badges now use unified showConflictTooltip() system with base64-encoded data
1848- **Removed:** data-tooltip CSS pseudo-element approach for conflict badges (replaced with JS tooltip)
1849
1850## Version 5.5.4 (2026-02-09) - FIX PAST EVENT EXPAND ON FIRST LOAD
1851
1852- **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)
1853
1854## Version 5.5.3 (2026-02-09) - FIX CONFLICT TOOLTIP THEME COLORS
1855
1856- **Fixed:** Conflict tooltip now finds calendar container even when badge is inside day popup (appended to body)
1857- **Fixed:** Empty CSS variable values no longer produce invisible text — fallback defaults applied when var returns empty string
1858
1859## Version 5.5.2 (2026-02-09) - FIX CONFLICT TOOLTIP JSON PARSING
1860
1861- **Fixed:** Conflict tooltip data now base64-encoded to eliminate JSON parse errors from attribute quote escaping
1862- **Fixed:** Removed double htmlspecialchars encoding on conflict titles in PHP (was escaping titles then re-escaping the JSON)
1863- **Changed:** Both PHP and JS conflict badge rendering now use base64 for data-conflicts attribute
1864- **Changed:** showConflictTooltip decodes base64 first, falls back to plain JSON for compatibility
1865
1866## Version 5.5.1 (2026-02-09) - AJAX ROBUSTNESS & DIALOG THEMING
1867
1868- **Fixed:** Conflict tooltip badges now work after AJAX month navigation via event delegation
1869- **Fixed:** All document-level event listeners guarded against duplicate attachment from multiple script loads
1870- **Fixed:** showConflictTooltip closest() selector now matches actual container IDs (cal_, panel_, sidebar-widget-)
1871- **Fixed:** Description textarea in add/edit dialog now 2 lines tall instead of 1
1872- **Added:** Event delegation for conflict badge mouseenter/mouseleave (capture phase) survives DOM rebuilds
1873- **Added:** ESC key now also closes day popups and conflict tooltips
1874- **Changed:** Namespace click filter handler wrapped in guard to prevent duplicate binding
1875
1876## Version 5.5.0 (2026-02-09) - CSS VARIABLE REFACTOR & THEME CONSISTENCY
1877
1878- **Refactored:** All theming now driven by 15 CSS custom properties injected per calendar instance
1879- **Refactored:** Removed ~85 inline styles from syntax.php and ~41 from calendar-main.js
1880- **Refactored:** style.css is now the single source of truth for all visual styling
1881- **Fixed:** Day popup (click cell) now fully themed — CSS vars propagated from container
1882- **Fixed:** Add/Edit event dialog now themed in all contexts (main calendar, eventlist panel, sidebar widget)
1883- **Fixed:** Popup footer and "+ Add Event" button were using inline themeStyles — now use CSS vars
1884- **Added:** CSS variable injection for {{eventlist panel}} containers
1885- **Added:** CSS variable injection for {{eventlist sidebar}} widget containers
1886- **Added:** propagateThemeVars() helper ensures dialogs/popups always get theme regardless of DOM position
1887- **Added:** Wiki template mapping reads __link__ as accent color from style.ini
1888- **Added:** Detailed CSS variable reference table in style.css header comment
1889- **Added:** Detailed style.ini → CSS variable mapping documentation in syntax.php
1890- **Changed:** Conflict tooltip reads CSS vars via getComputedStyle instead of data-themeStyles
1891- **Changed:** Admin changelog now uses paginated timeline viewer instead of tiny scrolling div
1892- **Removed:** Dark Reader MutationObserver compatibility (CSS vars natively compatible)
1893- **Removed:** $isWikiTheme branching from PHP render path
1894
1895## Version 5.3.6 (2026-02-09) - HEARTS + CSS BACKGROUND FIX! ��
1896
1897### �� Added: Hearts in Explosions!
1898- **Added:** 8-12 pink hearts in each click explosion
1899- **Added:** Random sizes (12-28px) and directions
1900- **Result:** Extra love in every click! ��
1901
1902### �� Fixed: Background CSS Property for Dark Mode Readers
1903- **Fixed:** Added `background: transparent` to CSS (was completely removed)
1904- **Fixed:** Now CSS readers can detect and modify background property
1905- **Why:** Inline styles override transparent, but CSS readers can now see the property
1906- **Result:** Dark mode plugins can now change calendar backgrounds!
1907
1908### The CSS Problem
1909
1910**Why backgrounds weren't changing with dark mode readers**:
1911
1912**Before (v5.3.5)**:
1913```css
1914.calendar-compact-grid tbody td {
1915    /* background removed - set via inline style */
1916    border: 1px solid...
1917}
1918```
1919
1920**Problem**: CSS property doesn't exist!
1921- Dark mode readers look for `background` property in CSS
1922- Can't override what doesn't exist
1923- Inline styles work, but readers can't modify them
1924
1925**After (v5.3.6)**:
1926```css
1927.calendar-compact-grid tbody td {
1928    background: transparent;  /* Now exists! */
1929    border: 1px solid...
1930}
1931```
1932
1933**Solution**:
1934- Property exists in CSS
1935- Dark mode readers can override it
1936- Inline styles still override transparent
1937- Everyone wins!
1938
1939### What's Fixed
1940
1941**Elements now have background property**:
1942- `.calendar-compact-grid tbody td` ✓
1943- `.calendar-compact-grid tbody td:hover` ✓
1944- `.event-compact-item` ✓
1945- `.event-compact-item:hover` ✓
1946
1947**How it works**:
19481. CSS sets `background: transparent` (default)
19492. Inline styles set actual color (overrides transparent)
19503. Dark mode readers can override CSS property
19514. Works for everyone!
1952
1953### Hearts in Explosion
1954
1955**Click anywhere → Hearts explode!**
1956
1957**Heart details**:
1958- Count: 8-12 per explosion (random)
1959- Size: 12-28px (random variety)
1960- Emoji: �� (pink heart)
1961- Direction: Random 360°
1962- Speed: 60-140px travel
1963- Duration: 0.8-1.2s
1964- z-index: 9999999 (always visible)
1965
1966**Combined with**:
1967- 25 glowing particles
1968- 40 pixel sparkles
1969- Bright flash
1970- **Total: 73-77 elements!**
1971
1972### Visual Result
1973
1974**Click explosion**:
1975```
1976    �� ✦ • ✦ ��
1977  �� •         • ��
1978✦  •     ��!     •  ✦
1979  �� •         • ��
1980    �� ✦ • ✦ ��
1981
1982Hearts + Particles + Pixels!
1983```
1984
1985**Dark mode now works**:
1986```css
1987/* Dark mode reader can now do this: */
1988.calendar-compact-grid tbody td {
1989    background: #000 !important;  /* Works! */
1990}
1991```
1992
1993### Why Transparent Works
1994
1995**CSS Cascade**:
19961. CSS: `background: transparent` (lowest priority)
19972. Inline style: `background: #f5f5f5` (overrides CSS)
19983. Dark mode CSS: `background: #000 !important` (overrides inline)
1999
2000**Perfect solution!** ✓
2001
2002## Version 5.3.5 (2026-02-09) - PARTICLES ABOVE DIALOGS! ��
2003
2004### �� Fixed: Particles Now Appear Above All Dialogs!
2005- **Fixed:** Increased z-index to 9999999 for all particles
2006- **Fixed:** Particles now visible above event dialogs, month picker, etc.
2007- **Result:** Cursor effects and explosions always visible!
2008
2009### The Z-Index Problem
2010
2011**Before (v5.3.4)**:
2012- Particles: z-index 9999
2013- Dialogs: z-index 10000-999999
2014- **Particles hidden behind dialogs!**
2015
2016**After (v5.3.5)**:
2017- Particles: z-index 9999999
2018- Trail: z-index 9999998
2019- Pixels: z-index 9999997
2020- **Particles ALWAYS on top!**
2021
2022### What's Fixed
2023
2024✅ **Main particles** (explosion orbs)
2025✅ **Cursor trail** (glowing dots)
2026✅ **Pixel sparkles** (tiny bright stars)
2027✅ **Flash effect** (click burst)
2028
2029**All now appear above**:
2030- Event dialog popups
2031- Month picker
2032- Day popups
2033- Any modal overlays
2034
2035### Visual Result
2036
2037**Moving cursor over dialog**:
2038```
2039┌─────────────────────┐
2040│  Event Dialog       │
2041│  ✦ • ✦             │  ← Sparkles visible!
2042│    →  ✦             │  ← Cursor trail visible!
2043│  • ✦ •              │
2044└─────────────────────┘
2045```
2046
2047**Clicking on dialog**:
2048```
2049┌─────────────────────┐
2050│  ✦ • ✦ • ✦         │
2051│ •     ��!     •    │  ← Explosion visible!
2052│  ✦ • ✦ • ✦         │
2053└─────────────────────┘
2054```
2055
2056**Perfect visibility everywhere!** ✨
2057
2058## Version 5.3.4 (2026-02-09) - THEMED MONTH PICKER + DIALOG CURSOR FIX
2059
2060### �� Fixed: Month Picker Now Themed!
2061- **Fixed:** Jump to Month dialog now uses theme colors
2062- **Fixed:** Dialog background, borders, text all themed
2063- **Fixed:** Select dropdowns use theme colors
2064- **Fixed:** Buttons use theme accent colors
2065- **Result:** Month picker matches calendar theme!
2066
2067### �� Fixed: Cursor Effects Work in Dialogs!
2068- **Fixed:** Cursor trail now works when hovering over dialogs
2069- **Fixed:** Click explosions work when clicking inside dialogs
2070- **Technical:** Changed to capture phase event listeners
2071- **Result:** Effects work EVERYWHERE now!
2072
2073### Month Picker Theming
2074
2075**Before (v5.3.3)**:
2076- White background (hardcoded)
2077- Black text (hardcoded)
2078- No theme integration
2079- Looked out of place
2080
2081**After (v5.3.4)**:
2082- Dialog background: `theme.bg`
2083- Dialog border: `theme.border`
2084- Text color: `theme.text_primary`
2085- Dropdowns: `theme.cell_bg` + `theme.text_primary`
2086- Cancel button: `theme.cell_bg`
2087- Go button: `theme.border` (accent color)
2088
2089**Fully integrated!** ✅
2090
2091---
2092
2093### Theme Examples
2094
2095**Matrix Theme**:
2096```
2097┌─────────────────────────┐
2098│ Jump to Month           │ ← Dark bg, green border
2099│ [February ▼] [2026 ▼]  │ ← Dark dropdowns
2100│ [Cancel] [Go]           │ ← Green "Go" button
2101└─────────────────────────┘
2102```
2103
2104**Pink Theme**:
2105```
2106┌─────────────────────────┐
2107│ Jump to Month           │ ← Dark bg, pink border
2108│ [February ▼] [2026 ▼]  │ ← Dark dropdowns
2109│ [Cancel] [Go]           │ ← Pink "Go" button
2110└─────────────────────────┘
2111With sparkle effects! ✨
2112```
2113
2114**Professional Theme**:
2115```
2116┌─────────────────────────┐
2117│ Jump to Month           │ ← Clean bg, blue border
2118│ [February ▼] [2026 ▼]  │ ← Clean dropdowns
2119│ [Cancel] [Go]           │ ← Blue "Go" button
2120└─────────────────────────┘
2121```
2122
2123---
2124
2125### Dialog Cursor Fix
2126
2127**The Problem**:
2128Dialogs use `event.stopPropagation()` to prevent clicks from closing them. This blocked cursor effects!
2129
2130**The Solution**:
2131Use **capture phase** event listeners:
2132```javascript
2133// Before (bubbling phase)
2134document.addEventListener('click', handler)
2135
2136// After (capture phase)
2137document.addEventListener('click', handler, true)
21382139                                   Capture phase!
2140```
2141
2142**Capture phase runs BEFORE stopPropagation!**
2143
2144---
2145
2146### Now Works Everywhere
2147
2148✅ **Calendar area**
2149✅ **Event dialogs**
2150✅ **Month picker dialog**
2151✅ **Day popup dialogs**
2152✅ **Anywhere on screen**
2153
2154**No more blocked effects!** ��
2155
2156---
2157
2158### Technical Details
2159
2160**Event phases**:
2161```
21621. Capture phase   ← We listen here now!
21632. Target phase
21643. Bubbling phase  ← stopPropagation blocks this
2165```
2166
2167**By using capture phase**:
2168- Events caught before stopPropagation
2169- Works in all dialogs
2170- No conflicts with dialog logic
2171
2172---
2173
2174### All Dialogs Checked
2175
2176✅ **Month picker** - Now themed!
2177✅ **Event dialog** - Already themed
2178✅ **Day popup** - Already themed
2179
2180**Everything consistent!** ��
2181
2182---
2183
2184## Version 5.3.3 (2026-02-09) - TINY NEON PIXEL SPARKLES! ✨
2185
2186### ✨ Added: Bright Neon Pixel Sparkles Everywhere!
2187- **Added:** Tiny 1-2px bright pixel sparkles alongside cursor trail
2188- **Added:** 40 pixel sparkles in click explosions
2189- **Changed:** Cursor effects now work on ENTIRE SCREEN (not just calendar)
2190- **Result:** Maximum sparkle effect! ��
2191
2192### Tiny Pixel Sparkles
2193
2194**3-6 tiny bright pixels appear with each cursor movement!**
2195
2196**Characteristics**:
2197- Size: 1-2px (single pixel appearance!)
2198- Colors: Bright neon whites and pinks
2199  - Pure white (#fff) - 40% chance
2200  - Hot pink (#ff1493)
2201  - Pink (#ff69b4)
2202  - Light pink (#ffb6c1)
2203  - Soft pink (#ff85c1)
2204- Glow: Triple-layer shadow (intense!)
2205- Spawn: Random 30px radius around cursor
2206- Animations:
2207  - 50% twinkle in place
2208  - 50% float upward
2209
2210**Creates a cloud of sparkles around your cursor!**
2211
2212---
2213
2214### Click Explosion Enhanced
2215
2216**Now with 40 EXTRA pixel sparkles!**
2217
2218**Click anywhere → BIG BOOM**:
2219- 25 main glowing particles (6-10px)
2220- **40 tiny pixel sparkles (1-2px)** ← NEW!
2221- Bright white flash
2222- Total: 65+ visual elements!
2223
2224**Pixel sparkles in explosion**:
2225- Shoot outward in all directions
2226- Random distances (30-110px)
2227- Multiple bright colors
2228- Some twinkle, some explode
2229- Creates stellar effect!
2230
2231---
2232
2233### Entire Screen Coverage
2234
2235**Effects now work EVERYWHERE!**
2236
2237**Before (v5.3.2)**:
2238- Only inside calendar viewport
2239- Limited to calendar area
2240
2241**After (v5.3.3)**:
2242- Works on entire screen! ✓
2243- Cursor trail follows everywhere
2244- Click explosions anywhere
2245- Used `position: fixed` + `clientX/Y`
2246
2247**Move anywhere on the page for sparkles!**
2248
2249---
2250
2251### Visual Effect
2252
2253**Cursor movement**:
2254```
2255    • ✦ •       ← Tiny pixels
2256  •   ✦   •     ← Glowing trail
2257✦  •  →  •  ✦   ← Cursor
2258  •   ✦   •     ← Mixed sizes
2259    • ✦ •       ← Sparkle cloud
2260```
2261
2262**Click explosion**:
2263```
2264    ✦ • ✦ • ✦
2265  ✦ •         • ✦
2266✦  •    ��!    •  ✦
2267  ✦ •         • ✦
2268    ✦ • ✦ • ✦
2269
227065+ particles total!
2271```
2272
2273---
2274
2275### Sparkle Details
2276
2277**Trail Pixels** (3-6 per movement):
2278- Size: 1-2px
2279- Spawn rate: Every 40ms
2280- Spread: 30px radius
2281- Duration: 0.6-0.8s
2282- 50% twinkle, 50% float
2283
2284**Explosion Pixels** (40 total):
2285- Size: 1-3px
2286- Spread: 30-110px radius
2287- Duration: 0.4-0.8s
2288- All directions
2289- Intense glow
2290
2291**Main Particles** (25 total):
2292- Size: 4-10px
2293- Spread: 50-150px
2294- Full color palette
2295- Original firework effect
2296
2297---
2298
2299### Color Distribution
2300
2301**Pixel sparkles favor white**:
2302- 40% pure white (#fff) - brightest!
2303- 60% pink shades - variety
2304
2305**Creates brilliant sparkle effect!**
2306
2307---
2308
2309### Performance
2310
2311**Still optimized**:
2312- Trail: 30ms throttle
2313- Pixels: 40ms throttle
2314- Auto-cleanup
2315- Hardware accelerated
2316- Smooth 60fps
2317
2318**Lots of sparkles, zero lag!**
2319
2320---
2321
2322### Full-Screen Magic
2323
2324**Pink theme calendar detected**:
2325```javascript
2326if (pink calendar exists) {
2327    Enable effects for ENTIRE SCREEN
2328    Not just calendar area
2329}
2330```
2331
2332**Works everywhere on page!** ✨
2333
2334---
2335
2336## Version 5.3.2 (2026-02-09) - PINK FIREWORKS! ����
2337
2338### �� Changed: Glowing Pink Particles Instead of Emoji Sparkles!
2339- **Removed:** Emoji sparkle images (✨)
2340- **Added:** Glowing pink particle trail following cursor
2341- **Added:** FIREWORKS explosion on click!
2342- **Result:** Beautiful glowing effects, not emoji!
2343
2344### Glowing Cursor Trail
2345
2346**Pink glowing dots follow your cursor!**
2347- Small glowing pink orbs (8px)
2348- Radial gradient glow effect
2349- Multiple box-shadows for depth
2350- Fade out smoothly (0.5s)
2351- Throttled to 30ms for smoothness
2352
2353```
2354    •  •
2355  •  →  •   ← Your cursor
2356    •  •
2357```
2358
2359**Not emoji - actual glowing particles!**
2360
2361---
2362
2363### Click Fireworks! ��
2364
2365**Click anywhere on the calendar → BOOM!**
2366
2367**20 pink particles explode outward!**
2368- Radial burst pattern (360° coverage)
2369- Random speeds (50-150px travel)
2370- 4 shades of pink:
2371  - Hot pink (#ff1493)
2372  - Pink (#ff69b4)
2373  - Light pink (#ff85c1)
2374  - Very light pink (#ffc0cb)
2375- Random sizes (4-10px)
2376- Individual glowing halos
2377- Smooth explosion animation
2378
2379**Plus a bright flash at click point!**
2380- 30px radius glow
2381- Intense pink flash
2382- Fades quickly (0.3s)
2383
2384---
2385
2386### Visual Effect
2387
2388**Cursor movement**:
2389```
23902391      •  •  •
2392   •     →     •  ← Glowing trail
2393      •  •  •
23942395```
2396
2397**Click explosion**:
2398```
2399         •  •  •
2400      •           •
2401   •      BOOM!      •  ← 20 particles
2402      •           •
2403         •  •  •
2404```
2405
2406**All particles glow with pink halos!**
2407
2408---
2409
2410### Particle Details
2411
2412**Trail Particles**:
2413- Size: 8x8px
2414- Color: Pink radial gradient
2415- Shadow: 10px + 20px glow layers
2416- Duration: 0.5s fade
2417- Rate: 30ms throttle
2418
2419**Explosion Particles**:
2420- Size: 4-10px (random)
2421- Colors: 4 pink shades (random)
2422- Shadow: 10px + 20px glow (matches color)
2423- Duration: 0.6-1.0s (random)
2424- Pattern: Perfect circle burst
2425
2426**Flash Effect**:
2427- Size: 30x30px
2428- Color: Bright hot pink
2429- Shadow: 30px + 50px mega-glow
2430- Duration: 0.3s instant fade
2431
2432---
2433
2434### Performance
2435
2436**Optimized for smoothness**:
2437- Trail throttled to 30ms
2438- Auto-cleanup after animations
2439- CSS hardware acceleration
2440- No memory leaks
2441- Smooth 60fps
2442
2443**Won't slow you down!**
2444
2445---
2446
2447### Comparison
2448
2449**Before (v5.3.1)**:
2450- ✨ Emoji sparkle images
2451- Static unicode characters
2452- Limited visual impact
2453
2454**After (v5.3.2)**:
2455- �� Glowing pink particles
2456- Radial gradients + shadows
2457- Beautiful firework explosions
2458- Much more impressive!
2459
2460---
2461
2462### Only Pink Theme
2463
2464**These effects only appear**:
2465- On `.calendar-theme-pink` elements
2466- Other themes unaffected
2467- Pure pink magic! ��
2468
2469---
2470
2471## Version 5.3.1 (2026-02-09) - MYSPACE SPARKLE CURSOR! ✨✨✨
2472
2473### ✨ Added: MySpace-Style Sparkle Trail!
2474- **Added:** Sparkle cursor trail that follows your mouse (pink theme only!)
2475- **Toned down:** Reduced glow effects for better taste
2476- **Added:** Sparkles appear on cell hover
2477- **Added:** Sparkles on event hover (left and right sides!)
2478- **Added:** Sparkles on today's cell corners
2479- **Added:** Sparkles on navigation buttons
2480- **Added:** Sparkles in calendar header
2481- **Result:** Pure nostalgic MySpace magic! ✨
2482
2483### MySpace Sparkle Cursor Trail
2484
2485**The classic effect from 2006!**
2486- Sparkles follow your cursor as you move
2487- Random sizes (12-22px)
2488- Random slight offsets for natural feel
2489- Float up and fade out animation
2490- Throttled to 50ms (smooth, not laggy)
2491- Only on pink theme calendars
2492
2493```
24942495  ✨    ✨
2496✨   →   ✨  (cursor trail)
2497  ✨    ✨
24982499```
2500
2501**Pure nostalgia!**
2502
2503---
2504
2505### Sparkles Everywhere
2506
2507**Calendar cells**:
2508- Hover over any day → ✨ floats up
2509- Smooth 1.5s animation
2510- Centered sparkle
2511
2512**Event items**:
2513- Hover → ✨ on left side
2514- Hover → ✨ on right side
2515- Staggered animations (0.4s delay)
2516- Continuous twinkling
2517
2518**Today's cell**:
2519- ✨ in top-right corner (continuous)
2520- ✨ in bottom-left corner (offset timing)
2521- Always sparkling!
2522
2523**Navigation buttons**:
2524- Hover on < or > → ✨ appears top-right
2525- One-time float animation
2526
2527**Calendar header**:
2528- ✨ on left side (continuous)
2529- ✨ on right side (offset 1s)
2530- Always twinkling
2531
2532---
2533
2534### Toned Down Glows
2535
2536**Before (v5.3.0)**: TOO MUCH GLOW!
2537- 50px shadows
2538- 4-layer effects
2539- Overwhelming
2540
2541**After (v5.3.1)**: Just right!
2542- 8-15px max shadows (subtle)
2543- 2-layer effects
2544- Professional with personality
2545
2546**Glow reductions**:
2547- Today shimmer: 35px → 12px
2548- Today hover: 50px → 15px
2549- Event glow: 18px → 6px
2550- Badge pulse: 25px → 8px
2551- Container glow: 20px → 8px
2552
2553**Much more tasteful!**
2554
2555---
2556
2557### Sparkle Animations
2558
2559**sparkle-twinkle** (0.8s):
2560```
2561Opacity: 0 → 1 → 1 → 0
2562Scale: 0 → 1 → 1 → 0
2563Rotation: 0° → 180° → 360°
2564```
2565
2566**sparkle-float** (1.5s):
2567```
2568Moves up: 0px → -50px
2569Opacity: 0 → 1 → 1 → 0
2570Scale: 0 → 1 → 0.8 → 0
2571```
2572
2573**Pure MySpace magic!** ✨
2574
2575---
2576
2577### Where Sparkles Appear
2578
2579✅ **Cursor trail** (continuous while moving)
2580✅ **Calendar cells** (on hover)
2581✅ **Event items** (on hover, left + right)
2582✅ **Today's cell** (continuous, corners)
2583✅ **Navigation buttons** (on hover)
2584✅ **Calendar header** (continuous, sides)
2585
2586**Sparkles EVERYWHERE!** ✨✨✨
2587
2588---
2589
2590### Performance
2591
2592**Cursor trail**:
2593- Throttled to 50ms
2594- Auto-cleanup after 1s
2595- No memory leaks
2596- Smooth 60fps
2597
2598**CSS animations**:
2599- Hardware accelerated
2600- No JavaScript overhead (except cursor)
2601- Efficient transforms
2602
2603**Won't slow down your browser!**
2604
2605---
2606
2607### Pure Nostalgia
2608
2609**Remember MySpace profiles?**
2610- Glitter graphics ✨
2611- Sparkle cursors ✨
2612- Auto-play music �� (ok, we didn't add that)
2613- Animated GIF backgrounds
2614- Comic Sans everywhere
2615
2616**We brought back the sparkles!** ✨
2617
2618---
2619
2620### Theme Comparison
2621
2622**Other themes**: Professional and clean
2623**Pink theme**: ✨ SPARKLES EVERYWHERE ✨
2624
2625**Only pink theme gets the magic!**
2626
2627---
2628
2629## Version 5.3.0 (2026-02-09) - PINK BLING THEME EFFECTS! ✨��
2630
2631### �� Added: Pink Theme Gets BLING!
2632- **Added:** Shimmering animation for today's cell
2633- **Added:** Sparkling text effect on today's date
2634- **Added:** Glowing pulse for event bars
2635- **Added:** Gradient shimmer on headers
2636- **Added:** Extra glow on hover effects
2637- **Added:** Pulsing urgent badge for past due items
2638- **Result:** Pink theme is now FABULOUS! ✨
2639
2640### Shimmer Effects
2641
2642**Today's Cell**:
2643- Continuous shimmer animation (2 second loop)
2644- Multi-layer glow effect
2645- Pink and hot pink overlapping shadows
2646- Pulses from subtle to intense
2647- Extra sparkle on hover
2648
2649**Today's Date Number**:
2650- Sparkle animation (1.5 second loop)
2651- Text shadow glow effect
2652- Slight scale pulse (100% → 105%)
2653- Pink to hot pink shadow transition
2654
2655### Glow Effects
2656
2657**Event Bars**:
2658- Continuous glow pulse (2 second loop)
2659- Uses event's own color
2660- Adds pink accent glow layer
2661- Creates depth and dimension
2662
2663**Event Items**:
2664- Subtle base glow
2665- Enhanced glow on hover
2666- Slight slide animation on hover
2667- Professional yet playful
2668
2669### Gradient Shimmer
2670
2671**Headers**:
2672- Animated gradient background
2673- 3-color pink gradient flow
2674- Smooth 3-second animation
2675- Creates movement and life
2676- Applies to calendar header and event list header
2677
2678### Badge Effects
2679
2680**TODAY Badge**:
2681- Sparkle animation
2682- Synchronized with today's date
2683- Extra prominence
2684
2685**PAST DUE Badge**:
2686- Urgent pulsing effect (1 second loop)
2687- Orange glow intensifies
2688- Draws attention to urgent items
2689- Faster pulse for urgency
2690
2691### Container Bling
2692
2693**Main Container**:
2694- Multi-layer pink glow
2695- Soft outer shadow
2696- Creates floating effect
2697- Subtle but elegant
2698
2699### Animation Details
2700
2701**pink-shimmer** (2s loop):
2702```
2703Start: Subtle 5px glow
2704Peak:  Intense 35px multi-layer glow
2705End:   Back to subtle
2706```
2707
2708**pink-sparkle** (1.5s loop):
2709```
2710Start: Base glow + scale 1.0
2711Peak:  Intense glow + scale 1.05
2712End:   Back to base
2713```
2714
2715**pink-glow-pulse** (2s loop):
2716```
2717Start: Small glow (3px, 6px)
2718Peak:  Large glow (6px, 12px, 18px)
2719End:   Back to small
2720```
2721
2722**pink-gradient-shimmer** (3s loop):
2723```
2724Gradient flows across element
2725Creates wave effect
2726Smooth continuous motion
2727```
2728
2729**pink-pulse-urgent** (1s loop - faster!):
2730```
2731Start: Orange glow 5px
2732Peak:  Orange glow 25px (intense)
2733End:   Back to 5px
2734```
2735
2736### Visual Experience
2737
2738**Today's Cell**:
2739```
2740┌──┬──┬──┬──┬──┬──┬──┐
2741│  │  │ ✨ │  │  │  │  │  ← Shimmers constantly
2742│  │  │[9]│  │  │  │  │  ← Sparkles
2743│  │  │ ✨ │  │  │  │  │  ← Glows and pulses
2744└──┴──┴──┴──┴──┴──┴──┘
2745```
2746
2747**Event Bars**:
2748```
2749━━━━━━━  ← Glows and pulses
2750━━━━━━━  ← Each bar animated
2751━━━━━━━  ← Creates rhythm
2752```
2753
2754**Headers**:
2755```
2756╔═════════════════════╗
2757║ ~~~~~~~~~~ ║  ← Gradient flows
2758║   February 2026     ║  ← Shimmer effect
2759╚═════════════════════╝
2760```
2761
2762### Theme Comparison
2763
2764**Before (v5.2.8)**:
2765- Pink colors
2766- Static elements
2767- Standard shadows
2768
2769**After (v5.3.0)**:
2770- Pink colors ✓
2771- Animated shimmer ✨
2772- Sparkling effects ��
2773- Glowing pulses ✨
2774- Moving gradients ��
2775- BLING! ��
2776
2777### Performance
2778
2779**All animations**:
2780- Hardware accelerated (transform, opacity)
2781- Smooth 60fps
2782- CSS animations (no JavaScript)
2783- Minimal CPU usage
2784- Disabled in reduced-motion preference
2785
2786### Only for Pink Theme
2787
2788**Effects only apply when**:
2789```css
2790.calendar-theme-pink
2791```
2792
2793**Other themes unaffected**:
2794- Matrix stays Matrix
2795- Professional stays Professional
2796- Purple stays Purple
2797- Wiki stays clean
2798
2799**Pink gets all the bling!** ✨��
2800
2801### Use Cases
2802
2803**Perfect for**:
2804- Celebrating occasions
2805- Fun team calendars
2806- Personal style expression
2807- Standing out
2808- Making calendar time fabulous
2809
2810**Not just pink, but BLING pink!** ��✨
2811
2812## Version 5.2.8 (2026-02-09) - TODAY BOX USES THEME COLORS
2813
2814### �� Fixed: Today's Date Box Now Uses Theme Colors
2815- **Fixed:** Today's day number box now uses theme border color
2816- **Fixed:** Text color adapts to theme (white for dark themes, bg color for light)
2817- **Result:** Today box matches the theme perfectly!
2818
2819### The Issue
2820
2821Today's date had a hardcoded green box:
2822
2823**In style.css**:
2824```css
2825.cal-today .day-num {
2826    background: #008800;  /* Hardcoded green! */
2827    color: white;
2828}
2829```
2830
2831**Didn't adapt to themes at all!**
2832
2833### The Fix
2834
2835**Now uses theme colors**:
2836```php
2837// Today's day number
2838if ($isToday) {
2839    background: $themeStyles['border'],  // Theme's accent color!
2840    color: (professional theme) ? white : bg color
2841}
2842```
2843
2844### Theme Examples
2845
2846**Matrix Theme**:
2847- Box background: `#00cc07` (matrix green)
2848- Text color: `#242424` (dark background)
2849
2850**Purple Theme**:
2851- Box background: `#9b59b6` (purple)
2852- Text color: `#2a2030` (dark background)
2853
2854**Professional Theme**:
2855- Box background: `#4a90e2` (blue)
2856- Text color: `#ffffff` (white text)
2857
2858**Pink Theme**:
2859- Box background: `#ff1493` (hot pink)
2860- Text color: `#1a0d14` (dark background)
2861
2862**Wiki Theme**:
2863- Box background: Template's `__border__` color
2864- Text color: Template's `__background_site__` color
2865
2866### Visual Result
2867
2868**Matrix Theme**:
2869```
2870┌──┬──┬──┬──┬──┬──┬──┐
2871│ 1│ 2│ 3│[4]│ 5│ 6│ 7│
2872└──┴──┴──┴──┴──┴──┴──┘
28732874    Green box (#00cc07)
2875```
2876
2877**Professional Theme**:
2878```
2879┌──┬──┬──┬──┬──┬──┬──┐
2880│ 1│ 2│ 3│[4]│ 5│ 6│ 7│
2881└──┴──┴──┴──┴──┴──┴──┘
28822883    Blue box (#4a90e2)
2884```
2885
2886**Wiki Theme**:
2887```
2888┌──┬──┬──┬──┬──┬──┬──┐
2889│ 1│ 2│ 3│[4]│ 5│ 6│ 7│
2890└──┴──┴──┴──┴──┴──┴──┘
28912892    Template border color
2893```
2894
2895### Implementation
2896
2897**Inline styles added**:
2898- Background uses `$themeStyles['border']` (theme accent)
2899- Text color uses `$themeStyles['bg']` for contrast
2900- Special case: Professional theme uses white text
2901- All with `!important` to override CSS
2902
2903**CSS cleaned up**:
2904- Removed hardcoded `#008800` background
2905- Removed hardcoded `white` color
2906- Kept structural styles (border-radius, font-weight)
2907
2908### Benefits
2909
2910**Theme Consistency**:
2911- Today box matches theme accent color
2912- Proper contrast with background
2913- Professional appearance
2914
2915**Automatic Adaptation**:
2916- Works with all themes
2917- Works with custom wiki template colors
2918- No manual adjustment needed
2919
2920**Visual Harmony**:
2921- Border color used throughout theme
2922- Today box reinforces theme identity
2923- Consistent design language
2924
2925## Version 5.2.7 (2026-02-09) - FIX GRID BACKGROUND MISMATCH
2926
2927### �� Fixed: Table Grid Background Now Matches Cells
2928- **Found:** `grid_bg` was using `__background_alt__` (different from cells!)
2929- **Fixed:** Changed `grid_bg` to use `__background_site__` (same as cells)
2930- **Result:** Table background no longer shows through cells!
2931
2932### The Layer Problem
2933
2934The table itself had a DIFFERENT background color than its cells!
2935
2936**Before (v5.2.6)**:
2937```php
2938'grid_bg' => __background_alt__,     // Table background (#e8e8e8)
2939'cell_bg' => __background_site__,    // Cell background (#f5f5f5)
2940```
2941
2942**The table background was showing THROUGH the cells!**
2943
2944### Why This Happened
2945
2946**Visual layers**:
2947```
2948Table Element
2949├─ background: __background_alt__ (#e8e8e8)  ← Different!
2950└─ Cells
2951    └─ background: __background_site__ (#f5f5f5)  ← Different!
2952
2953The table background shows through any gaps!
2954```
2955
2956### The Fix
2957
2958**After (v5.2.7)**:
2959```php
2960'grid_bg' => __background_site__,    // Table background (#f5f5f5) ✓
2961'cell_bg' => __background_site__,    // Cell background (#f5f5f5) ✓
2962```
2963
2964**NOW THEY MATCH!**
2965
2966### Where grid_bg Is Used
2967
2968The table element itself:
2969```html
2970<table style="background: __background_alt__">  ← Was showing through!
2971    <tbody>
2972        <tr>
2973            <td style="background: __background_site__">1</td>
2974        </tr>
2975    </tbody>
2976</table>
2977```
2978
2979Even with cell inline styles, the TABLE background shows through!
2980
2981### All Background Sources Now Unified
2982
2983**Everything now uses __background_site__**:
2984- `bg` → __background_site__ ✓
2985- `header_bg` → __background_site__ ✓
2986- `grid_bg` → __background_site__ ✓ (JUST FIXED!)
2987- `cell_bg` → __background_site__ ✓
2988
2989**Perfect consistency!** ��
2990
2991### Why It Was Different
2992
2993**Originally the grid was meant to show borders**:
2994- `grid_bg` was `__background_alt__` (slightly different)
2995- Created visual separation between cells
2996- But with transparent/thin cells, it showed through!
2997
2998**Now unified for consistency!**
2999
3000### Visual Result
3001
3002**Before (layers visible)**:
3003```
3004┌─────────────────┐
3005│ Grid (#e8e8e8)  │ ← Showing through!
3006│  ┌──┬──┬──┐     │
3007│  │  │  │  │     │ ← Cells (#f5f5f5)
3008│  └──┴──┴──┘     │
3009└─────────────────┘
3010```
3011
3012**After (unified)**:
3013```
3014┌─────────────────┐
3015│ Grid (#f5f5f5)  │ ← Same color!
3016│  ┌──┬──┬──┐     │
3017│  │  │  │  │     │ ← Cells (#f5f5f5)
3018│  └──┴──┴──┘     │
3019└─────────────────┘
3020Perfect match!
3021```
3022
3023### Complete Background Mapping
3024
3025**All using __background_site__ now**:
3026- Main container background
3027- Left panel background
3028- Right panel background
3029- Eventlist background
3030- Calendar grid background ← JUST FIXED
3031- Calendar cell backgrounds
3032- Event item backgrounds
3033- Clock header background
3034- Search input background
3035- Past events toggle
3036
3037**EVERYTHING UNIFIED!** ��
3038
3039## Version 5.2.6 (2026-02-09) - REMOVE CONTAINER BACKGROUNDS
3040
3041### �� Fixed: Removed Container Backgrounds Showing Through
3042- **Found:** `.calendar-compact-container` had `background: #ffffff;`
3043- **Found:** `.calendar-compact-left` had `background: #fafafa;`
3044- **Found:** `.calendar-compact-right` had `background: #ffffff;`
3045- **Found:** `.event-search-input-inline` had `background: white;`
3046- **Found:** `.past-events-toggle` had `background: #f5f5f5;`
3047- **Result:** Container backgrounds no longer show through cells!
3048
3049### The Container Problem
3050
3051The parent containers had hardcoded backgrounds that were showing through!
3052
3053**Container backgrounds (lines 4-91)**:
3054```css
3055.calendar-compact-container {
3056    background: #ffffff;  /* ← Main container! */
3057}
3058
3059.calendar-compact-left {
3060    background: #fafafa;  /* ← Left panel (calendar side)! */
3061}
3062
3063.calendar-compact-right {
3064    background: #ffffff;  /* ← Right panel (events side)! */
3065}
3066```
3067
3068**These were showing through the cells and events!**
3069
3070### Why Containers Matter
3071
3072Even though cells have inline styles, if the CONTAINER behind them has a different background, it can show through:
3073
3074```
3075Container (#fafafa)           ← Showing through!
3076   └─ Table Cell (#f5f5f5)    ← Transparent areas
3077      └─ Content
3078```
3079
3080### All Backgrounds Removed
3081
3082**v5.2.6 removes**:
3083- `.calendar-compact-container` background
3084- `.calendar-compact-left` background
3085- `.calendar-compact-right` background
3086- `.event-search-input-inline` background
3087- `.past-events-toggle` background & hover
3088
3089**v5.2.5 removed**:
3090- `.calendar-compact-grid tbody td` background
3091- `.calendar-compact-grid thead th` background
3092
3093**v5.2.4 removed**:
3094- `.cal-empty`, `.cal-today`, `.cal-has-events` backgrounds
3095
3096**v5.2.3 removed**:
3097- `.event-compact-item` background
3098
3099**ALL container and element backgrounds eliminated!** ��
3100
3101### What Should Work Now
3102
3103**Calendar cells**: No container background showing through ✓
3104**Event items**: No container background showing through ✓
3105**Search bar**: Uses template color ✓
3106**Past events toggle**: Uses template color ✓
3107
3108### Complete List of Fixes
3109
3110**Containers**:
3111- Main container ✓
3112- Left panel ✓
3113- Right panel ✓
3114
3115**Elements**:
3116- Table cells ✓
3117- Event items ✓
3118- Search input ✓
3119- Past events toggle ✓
3120
3121**EVERYTHING removed!** ��
3122
3123### Critical: Clear Caches
3124
3125**Must clear caches or won't work**:
31261. Hard refresh: Ctrl+Shift+R (5 times!)
31272. Clear DokuWiki cache
31283. Close browser completely
31294. Reopen and test
3130
3131**CSS caching is EXTREMELY persistent!**
3132
3133## Version 5.2.5 (2026-02-09) - REMOVE TABLE CELL CSS BACKGROUNDS
3134
3135### �� Fixed: Removed Hardcoded Backgrounds from Table Cells
3136- **Found:** `.calendar-compact-grid tbody td` had `background: #ffffff;`!
3137- **Found:** `.calendar-compact-grid tbody td:hover` had `background: #f0f7ff;`!
3138- **Found:** `.calendar-compact-grid thead th` had `background: #f8f8f8;`!
3139- **Fixed:** Removed ALL hardcoded backgrounds from table CSS
3140- **Result:** Calendar table cells finally use template colors!
3141
3142### The REAL Culprits
3143
3144The generic table CSS was overriding everything!
3145
3146**In style.css (lines 307-356)**:
3147```css
3148.calendar-compact-grid thead th {
3149    background: #f8f8f8;  /* ← Header cells hardcoded! */
3150}
3151
3152.calendar-compact-grid tbody td {
3153    background: #ffffff;  /* ← ALL table cells hardcoded! */
3154}
3155
3156.calendar-compact-grid tbody td:hover {
3157    background: #f0f7ff;  /* ← Hover state hardcoded! */
3158}
3159```
3160
3161**These apply to ALL `<td>` and `<th>` elements in the calendar table!**
3162
3163### Why This Was the Last One
3164
3165**CSS Specificity Order**:
31661. `.calendar-compact-grid tbody td` (generic - applies to ALL cells)
31672. `.cal-empty`, `.cal-today`, `.cal-has-events` (specific - applies to some cells)
31683. Inline styles (should win but didn't)
3169
3170**We removed the specific ones (v5.2.4), but the generic one was still there!**
3171
3172### What We've Removed
3173
3174**v5.2.3**:
3175- `.event-compact-item` background
3176- `.event-compact-item:hover` background
3177
3178**v5.2.4**:
3179- `.cal-empty` background & hover
3180- `.cal-today` background & hover
3181- `.cal-has-events` background & hover
3182
3183**v5.2.5 (FINAL)**:
3184- `.calendar-compact-grid tbody td` background ✓
3185- `.calendar-compact-grid tbody td:hover` background ✓
3186- `.calendar-compact-grid thead th` background ✓
3187
3188**All CSS background overrides ELIMINATED!** ��
3189
3190### Why It Took 5 Versions
3191
3192**CSS had layers of hardcoded backgrounds**:
3193
3194```
3195Layer 1: Table cells (.calendar-compact-grid tbody td)
3196         ↓ Overrode inline styles
3197Layer 2: Cell states (.cal-today, .cal-empty, etc.)
3198         ↓ Overrode table cells
3199Layer 3: Event items (.event-compact-item)
3200         ↓ Overrode inline styles
3201
3202ALL had to be removed!
3203```
3204
3205**We kept finding more specific CSS, but the base table CSS was there all along!**
3206
3207### Visual Result
3208
3209**NOW everything matches**:
3210```
3211Calendar Table:
3212┌──┬──┬──┬──┬──┬──┬──┐
3213│ S│ M│ T│ W│ T│ F│ S│ ← Headers: __background_site__
3214├──┼──┼──┼──┼──┼──┼──┤
3215│ 1│ 2│ 3│ 4│ 5│ 6│ 7│ ← Cells: __background_site__
3216├──┼──┼──┼──┼──┼──┼──┤
3217│ 8│ 9│10│11│12│13│14│ ← All: __background_site__
3218└──┴──┴──┴──┴──┴──┴──┘
3219
3220Sidebar Events:
3221┌────────────────────────┐
3222│ �� Event               │ ← __background_site__
3223│ �� Event               │ ← __background_site__
3224└────────────────────────┘
3225
3226FINALLY ALL MATCHING! ✓
3227```
3228
3229### Complete List of Removed CSS
3230
3231**ALL hardcoded backgrounds removed**:
3232- `.event-compact-item` background
3233- `.event-compact-item:hover` background
3234- `.cal-empty` background & hover
3235- `.cal-today` background & hover
3236- `.cal-has-events` background & hover
3237- `.calendar-compact-grid tbody td` background ← NEW
3238- `.calendar-compact-grid tbody td:hover` background ← NEW
3239- `.calendar-compact-grid thead th` background ← NEW
3240
3241**Every single CSS background override is GONE!** ��
3242
3243### Testing Steps
3244
3245**After installing v5.2.5**:
3246
32471. **Clear browser cache**: Ctrl+Shift+R (3 times!)
32482. **Clear DokuWiki cache**: Click the button
32493. **Close browser completely**: Restart it
32504. **Visit page**: Should finally see matching backgrounds
3251
3252**CSS is EXTREMELY sticky - may need to clear multiple times!**
3253
3254### This Should Be It
3255
3256**No more CSS overrides exist** (we've checked the entire file):
3257- Table cells ✓ Fixed
3258- Cell states ✓ Fixed
3259- Event items ✓ Fixed
3260- Headers ✓ Fixed
3261- Hover states ✓ Fixed
3262
3263**All backgrounds now come from inline styles using template colors!**
3264
3265## Version 5.2.4 (2026-02-09) - REMOVE CALENDAR CELL CSS BACKGROUNDS
3266
3267### �� Fixed: Removed Hardcoded Backgrounds from Calendar Cells
3268- **Found:** Calendar cell CSS had hardcoded backgrounds with `!important`!
3269- **Fixed:** Removed backgrounds from `.cal-today`, `.cal-empty`, `.cal-has-events` CSS
3270- **Result:** Calendar cells now use template colors!
3271
3272### The Second Culprit
3273
3274MORE hardcoded backgrounds in the CSS file!
3275
3276**In style.css (lines 359-382)**:
3277```css
3278.cal-empty {
3279    background: #fafafa !important;  /* ← Overriding inline styles! */
3280}
3281
3282.cal-today {
3283    background: #e8f5e9 !important;  /* ← Overriding today cell! */
3284}
3285
3286.cal-today:hover {
3287    background: #c8e6c9 !important;  /* ← Overriding hover! */
3288}
3289
3290.cal-has-events {
3291    background: #fffbf0;  /* ← Overriding event cells! */
3292}
3293
3294.cal-has-events:hover {
3295    background: #fff4d9;  /* ← Overriding hover! */
3296}
3297```
3298
3299**These were ALL overriding the inline styles!**
3300
3301### The Fix
3302
3303**Removed all hardcoded backgrounds**:
3304```css
3305.cal-empty {
3306    /* background removed - inline style handles this */
3307    cursor: default !important;
3308}
3309
3310.cal-today {
3311    /* background removed - inline style handles this */
3312}
3313
3314.cal-has-events {
3315    /* background removed - inline style handles this */
3316}
3317
3318/* Hover states also removed */
3319```
3320
3321### What Was Overridden
3322
3323**v5.2.3 fixed**:
3324- Event items in sidebar ✓
3325
3326**v5.2.4 fixes**:
3327- Calendar day cells ✓
3328- Today cell ✓
3329- Empty cells ✓
3330- Cells with events ✓
3331- All hover states ✓
3332
3333### Why This Kept Happening
3334
3335**CSS had hardcoded backgrounds everywhere**:
33361. Event items: `#ffffff` (fixed in v5.2.3)
33372. Calendar cells: Multiple colors (fixed in v5.2.4)
33383. **All with `!important` flags!**
3339
3340**The inline styles couldn't override them!**
3341
3342### Visual Result
3343
3344**Now ALL backgrounds match**:
3345```
3346Calendar Grid:
3347┌──┬──┬──┬──┬──┬──┬──┐
3348│  │  │  │  │  │  │  │ ← All use __background_site__
3349├──┼──┼──┼──┼──┼──┼──┤
3350│  │██│  │  │  │  │  │ ← Today uses __background_neu__
3351├──┼──┼──┼──┼──┼──┼──┤
3352│  │  │  │  │  │  │  │ ← All match template
3353└──┴──┴──┴──┴──┴──┴──┘
3354
3355Sidebar Events:
3356┌────────────────────────┐
3357│ �� Event               │ ← Uses __background_site__
3358│ �� Event               │ ← Uses __background_site__
3359└────────────────────────┘
3360
3361Perfect consistency!
3362```
3363
3364### CSS Removed
3365
3366**Calendar cells**:
3367- `.cal-empty` background
3368- `.cal-empty:hover` background
3369- `.cal-today` background
3370- `.cal-today:hover` background
3371- `.cal-has-events` background
3372- `.cal-has-events:hover` background
3373
3374**All gone!** ✓
3375
3376### Important: Clear Caches Again!
3377
3378After installing v5.2.4:
3379
33801. **Hard refresh browser**: Ctrl+Shift+R (twice!)
33812. **Clear DokuWiki cache**: Admin → Clear Cache
33823. **May need to restart browser**: To clear CSS cache
3383
3384**Old CSS is VERY sticky!**
3385
3386### Why It Took So Long
3387
3388**Multiple CSS overrides**:
3389- Event items (v5.2.3) ✓ Fixed
3390- Calendar cells (v5.2.4) ✓ Fixed
3391- Each with different classes
3392- Each with `!important`
3393- Hidden throughout CSS file
3394
3395**Found them all now!** ��
3396
3397## Version 5.2.3 (2026-02-09) - REMOVE HARDCODED CSS BACKGROUNDS
3398
3399### �� Fixed: Removed Hardcoded Backgrounds from CSS
3400- **Found:** CSS file had hardcoded `background: #ffffff;` overriding inline styles!
3401- **Fixed:** Removed hardcoded backgrounds from `.event-compact-item` CSS
3402- **Result:** Event backgrounds now properly use template colors!
3403
3404### The Root Cause
3405
3406The CSS file was overriding the inline styles with hardcoded white backgrounds!
3407
3408**In style.css (lines 599-616)**:
3409```css
3410.event-compact-item {
3411    background: #ffffff;  /* ← This was overriding inline styles! */
3412}
3413
3414.event-compact-item:hover {
3415    background: #f8f9fa;  /* ← And this on hover! */
3416}
3417```
3418
3419**Even though inline styles had `!important`**, the CSS was still being applied because it comes after in the cascade!
3420
3421### The Fix
3422
3423**Removed hardcoded backgrounds from CSS**:
3424```css
3425.event-compact-item {
3426    /* background removed - set via inline style with template colors */
3427    display: flex;
3428    /* ... other styles ... */
3429}
3430
3431.event-compact-item:hover {
3432    box-shadow: 0 1px 3px rgba(0,0,0,0.08);
3433    /* background removed - inline style handles this */
3434}
3435```
3436
3437### Why This Was So Difficult to Find
3438
3439**CSS Specificity & Cascade**:
34401. Inline styles with `!important` should win
34412. But CSS that comes after can still apply
34423. The hardcoded `background: #ffffff` was silently overriding
34434. All the PHP code was correct - it was the CSS!
3444
3445**What We Were Doing**:
3446- ✓ Reading template colors correctly
3447- ✓ Setting `cell_bg` to `__background_site__` correctly
3448- ✓ Applying inline styles with `!important` correctly
3449- ✗ CSS file was overriding everything!
3450
3451### What Was Affected
3452
3453**Event items in**:
3454- Main calendar sidebar
3455- Standalone event list
3456- Sidebar widget
3457- All event displays
3458
3459**All had white backgrounds hardcoded in CSS!**
3460
3461### Now Working
3462
3463**Events use template colors**:
3464```html
3465<div class="event-compact-item"
3466     style="background: #f5f5f5 !important; ...">
3467    ← Now this inline style actually works!
3468</div>
3469```
3470
3471**No CSS override** ✓
3472
3473### Testing
3474
3475To verify this works:
34761. Clear browser cache (important!)
34772. Clear DokuWiki cache
34783. Reload page
34794. Events should now match eventlist background
3480
3481**Browser caching can make old CSS persist!**
3482
3483### Visual Result
3484
3485**All backgrounds now matching**:
3486```
3487┌────────────────────────────┐
3488│ Eventlist (#f5f5f5)        │ ← Template color
3489├────────────────────────────┤
3490│ �� Event (#f5f5f5)         │ ← Template color (was #ffffff)
3491├────────────────────────────┤
3492│ �� Event (#f5f5f5)         │ ← Template color (was #ffffff)
3493└────────────────────────────┘
3494
3495Perfect match!
3496```
3497
3498### Why Everything Else Worked
3499
3500**Clock area, calendar cells, etc.** didn't have hardcoded CSS backgrounds:
3501- They only had inline styles ✓
3502- Inline styles worked correctly ✓
3503- Only event items had the CSS override ✗
3504
3505### Important Notes
3506
3507**Clear caches**:
3508- Browser cache (Ctrl+Shift+R or Cmd+Shift+R)
3509- DokuWiki cache (Admin → Clear Cache)
3510- Old CSS may be cached!
3511
3512**This was the culprit all along!**
3513
3514## Version 5.2.2 (2026-02-09) - FIX CLOCK AREA BACKGROUND
3515
3516### �� Fixed: Clock Area Now Matches Event Cells
3517- **Fixed:** `header_bg` now uses `__background_site__` (was `__background_alt__`)
3518- **Result:** Clock/Today header matches event cell backgrounds!
3519
3520### The Issue
3521
3522The clock area (Today header) was using a different background:
3523
3524**Before (v5.2.1)**:
3525```php
3526'header_bg' => __background_alt__,   // Different color (gray #e8e8e8)
3527'cell_bg' => __background_site__,    // Event cells (#f5f5f5)
3528```
3529
3530**After (v5.2.2)**:
3531```php
3532'header_bg' => __background_site__,  // Same as cells (#f5f5f5) ✓
3533'cell_bg' => __background_site__,    // Event cells (#f5f5f5) ✓
3534```
3535
3536### What's the Clock Area?
3537
3538The clock/Today header in the sidebar:
3539```
3540┌────────────────────────────┐
3541│ 3:45:23 PM                 │ ← Clock area (header_bg)
3542│ ��️ --° | Sun, Feb 9, 2026 │
3543└────────────────────────────┘
3544```
3545
3546### All Backgrounds Now Unified
3547
3548**Everything now uses __background_site__**:
3549- Eventlist background ✓
3550- Calendar cells ✓
3551- Event items ✓
3552- Clock/Today header ✓
3553- Sidebar widget ✓
3554- All backgrounds match! ✓
3555
3556### Visual Result
3557
3558**Complete consistency**:
3559```
3560┌────────────────────────────┐
3561│ 3:45:23 PM                 │ ← Same background
3562│ ��️ --° | Sun, Feb 9, 2026 │
3563├────────────────────────────┤
3564│ �� Meeting at 2pm          │ ← Same background
3565│ Description...             │
3566├────────────────────────────┤
3567│ �� Another event           │ ← Same background
3568│ More details...            │
3569└────────────────────────────┘
3570
3571All using __background_site__ (#f5f5f5)
3572```
3573
3574**Perfect visual harmony!** ��
3575
3576## Version 5.2.1 (2026-02-09) - FIX: MATCH EVENTLIST BACKGROUND
3577
3578### �� Fixed: Calendar Cells Now Match Eventlist Background
3579- **Fixed:** Changed `cell_bg` to use `__background_site__` (not `__background__`)
3580- **Result:** Calendar cells now match the eventlist background perfectly!
3581
3582### The Real Issue
3583
3584The eventlist was showing the CORRECT background color all along!
3585
3586**Eventlist was using**:
3587- `bg` → `__background_site__` ✓ (This was correct!)
3588
3589**Calendar cells were using**:
3590- `cell_bg` → `__background__` ✗ (This was wrong!)
3591
3592**They didn't match!**
3593
3594### The Correct Fix
3595
3596**Now everything uses __background_site__**:
3597```php
3598'bg' => __background_site__,        // Eventlist (was already correct)
3599'cell_bg' => __background_site__,   // Cells (now fixed to match)
3600```
3601
3602### Why __background_site__?
3603
3604The eventlist sidebar and calendar are meant to match the **page/site background**, not the inner content area background:
3605
3606```
3607Page Layout:
3608┌────────────────────────────────────┐
3609│ __background_site__ (page bg)     │ ← This is where calendar lives
3610│                                    │
3611│  ┌──────────────────────────────┐ │
3612│  │ __background__ (content bg)  │ │ ← Wiki article content
3613│  │                              │ │
3614│  └──────────────────────────────┘ │
3615│                                    │
3616└────────────────────────────────────┘
3617```
3618
3619**Calendar should match the page background, not the content background!**
3620
3621### Template Example
3622
3623Typical DokuWiki template:
3624```ini
3625__background_site__ = "#f5f5f5"  (Light gray - page background)
3626__background__ = "#ffffff"        (White - content area)
3627```
3628
3629**Before (v5.2.0)**:
3630- Eventlist: `#f5f5f5` (light gray) ✓ Correct
3631- Calendar cells: `#ffffff` (white) ✗ Wrong - didn't match
3632
3633**After (v5.2.1)**:
3634- Eventlist: `#f5f5f5` (light gray) ✓ Correct
3635- Calendar cells: `#f5f5f5` (light gray) ✓ Correct - MATCHED!
3636
3637### All Backgrounds Now Unified
3638
3639**Everything now uses __background_site__**:
3640- Eventlist sidebar background ✓
3641- Main calendar background ✓
3642- Calendar day cells ✓
3643- Sidebar widget ✓
3644- Event items ✓
3645- Input fields ✓
3646- Buttons ✓
3647
3648**All perfectly matched to the page background!**
3649
3650### Why Version 5.2.0 Was Wrong
3651
3652I 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.
3653
3654**The eventlist knew what it was doing all along!** The cells just needed to catch up.
3655
3656## Version 5.2.0 (2026-02-09) - UNIFIED WIKI THEME BACKGROUNDS
3657**Note**: This version went the wrong direction. See v5.2.1 for the correct fix.
3658
3659### �� Fixed: All Backgrounds Now Use __background__
3660- **Fixed:** `bg` now uses `__background__` instead of `__background_site__`
3661- **Fixed:** Eventlist, calendar cells, and sidebar all match now
3662- **Result:** Completely unified background throughout!
3663
3664### The Issue
3665
3666Different parts of the calendar were using different background sources:
3667
3668**Before (v5.1.9)**:
3669```php
3670'bg' => __background_site__        // Eventlist background (outer page)
3671'cell_bg' => __background__        // Cell backgrounds (content area)
3672```
3673
3674**These are different colors!**
3675- `__background_site__` = Outer page wrapper (often gray)
3676- `__background__` = Main content area (often white)
3677
3678### The Fix
3679
3680**After (v5.2.0)**:
3681```php
3682'bg' => __background__             // Eventlist background ✓
3683'cell_bg' => __background__        // Cell backgrounds ✓
3684```
3685
3686**Both use the same source!**
3687
3688### What Uses 'bg'
3689
3690The `bg` color is used for:
3691- Eventlist sidebar background
3692- Main calendar container
3693- Sidebar widget background
3694- Form backgrounds
3695- Event dialogs
3696
3697### What Uses 'cell_bg'
3698
3699The `cell_bg` color is used for:
3700- Calendar day cells
3701- Event item backgrounds
3702- Input field backgrounds
3703- Button backgrounds
3704
3705### Why This Matters
3706
3707**Template color hierarchy**:
3708```
3709__background_site__ → Outer page/body (e.g., #f5f5f5 light gray)
3710__background__      → Main content area (e.g., #ffffff white)
3711__background_alt__  → Sections/headers
3712__background_neu__  → Highlights
3713```
3714
3715**We want all calendar backgrounds to match the main content area!**
3716
3717### Visual Comparison
3718
3719**Before (v5.1.9)**: Mismatched backgrounds
3720```
3721┌────────────────────────────────┐
3722│ Eventlist (gray #f5f5f5)      │ ← __background_site__
3723└────────────────────────────────┘
3724
3725┌────────────────────────────────┐
3726│ Calendar                       │
3727│ ┌──┬──┬──┬──┬──┬──┬──┐       │
3728│ │  │  │  │  │  │  │  │       │ ← __background__ (white #fff)
3729│ └──┴──┴──┴──┴──┴──┴──┘       │
3730└────────────────────────────────┘
3731Different colors - looks inconsistent
3732```
3733
3734**After (v5.2.0)**: Unified backgrounds
3735```
3736┌────────────────────────────────┐
3737│ Eventlist (white #fff)         │ ← __background__
3738└────────────────────────────────┘
3739
3740┌────────────────────────────────┐
3741│ Calendar                       │
3742│ ┌──┬──┬──┬──┬──┬──┬──┐       │
3743│ │  │  │  │  │  │  │  │       │ ← __background__ (white #fff)
3744│ └──┴──┴──┴──┴──┴──┴──┘       │
3745└────────────────────────────────┘
3746Same color - perfectly consistent!
3747```
3748
3749### Template Examples
3750
3751**Light Template**:
3752```ini
3753__background_site__ = "#f5f5f5"  (light gray)
3754__background__ = "#ffffff"       (white)
3755```
3756
3757**Before**: Eventlist gray, cells white
3758**After**: Eventlist white, cells white ✓
3759
3760**Dark Template**:
3761```ini
3762__background_site__ = "#1a1a1a"  (very dark)
3763__background__ = "#2d2d2d"       (dark)
3764```
3765
3766**Before**: Eventlist very dark, cells dark
3767**After**: Eventlist dark, cells dark ✓
3768
3769### Benefits
3770
3771**Visual Consistency**:
3772- All backgrounds match
3773- Clean, unified appearance
3774- Professional look
3775
3776**Correct Template Integration**:
3777- Uses content area color (not page wrapper)
3778- Matches wiki content area
3779- Proper color hierarchy
3780
3781**Works Everywhere**:
3782- Light templates ✓
3783- Dark templates ✓
3784- Custom templates ✓
3785
3786### All Backgrounds Unified
3787
3788**Now using __background__**:
3789- Eventlist background ✓
3790- Calendar cells ✓
3791- Sidebar widget ✓
3792- Event items ✓
3793- Input fields ✓
3794- Buttons ✓
3795- Dialogs ✓
3796
3797**Perfect harmony throughout!** ��
3798
3799## Version 5.1.9 (2026-02-09) - FIX WIKI THEME EVENT BACKGROUNDS
3800
3801### �� Fixed: Wiki Theme Event Backgrounds Not Showing
3802- **Fixed:** Wiki theme fallback used CSS variables in inline styles (doesn't work!)
3803- **Fixed:** Replaced CSS variables with actual hex colors
3804- **Result:** Event backgrounds now show correctly with template colors!
3805
3806### The Problem
3807
3808CSS variables like `var(--__background__, #fff)` don't work in inline `style=""` attributes!
3809
3810**Before (broken)**:
3811```php
3812'cell_bg' => 'var(--__background__, #fff)',  // Doesn't work in inline styles!
3813```
3814
3815**After (fixed)**:
3816```php
3817'cell_bg' => '#fff',  // Actual hex color works!
3818```
3819
3820### What Was Affected
3821
3822**When style.ini read successfully**:
3823- ✅ Worked fine (uses actual hex colors from file)
3824
3825**When style.ini fallback used**:
3826- ❌ Events had no background
3827- ❌ CSS variables don't work in inline styles
3828- ❌ Looked broken
3829
3830### The Fix
3831
3832**Wiki theme fallback now uses real colors**:
3833```php
3834'wiki' => [
3835    'bg' => '#f5f5f5',           // Real hex (was: var(--__background_site__))
3836    'border' => '#ccc',           // Real hex (was: var(--__border__))
3837    'cell_bg' => '#fff',          // Real hex (was: var(--__background__))
3838    'cell_today_bg' => '#eee',    // Real hex (was: var(--__background_neu__))
3839    'text_primary' => '#333',     // Real hex (was: var(--__text__))
3840    'text_bright' => '#2b73b7',   // Real hex (was: var(--__link__))
3841    'text_dim' => '#666',         // Real hex (was: var(--__text_neu__))
3842    'grid_bg' => '#e8e8e8',       // Real hex (was: var(--__background_alt__))
3843    // ... all colors now use real hex values
3844]
3845```
3846
3847### Why CSS Variables Don't Work
3848
3849**CSS variables work**:
3850```css
3851.some-class {
3852    background: var(--__background__, #fff);  /* ✓ Works in CSS */
3853}
3854```
3855
3856**CSS variables DON'T work**:
3857```html
3858<div style="background: var(--__background__, #fff)">  <!-- ✗ Doesn't work -->
3859```
3860
3861### How It Works Now
3862
3863**Priority system**:
38641. **Try reading style.ini** → Use actual template hex colors ✓
38652. **If file not found** → Use fallback hex colors ✓
38663. **Never use CSS variables in inline styles** ✓
3867
3868**Both paths now work correctly!**
3869
3870### Visual Result
3871
3872**Events now have proper backgrounds**:
3873```
3874┌──────────────────────────┐
3875│ �� Meeting at 2pm        │ ← White background (#fff)
3876│ Description here...      │
3877│ [✏️ Edit] [��️ Delete]   │
3878└──────────────────────────┘
3879
3880Not:
3881┌──────────────────────────┐
3882│ �� Meeting at 2pm        │ ← No background (broken)
3883│ Description here...      │
3884└──────────────────────────┘
3885```
3886
3887### Affected Areas
3888
3889**All event displays**:
3890- Main calendar events ✓
3891- Sidebar widget events ✓
3892- Event list items ✓
3893- Event backgrounds ✓
3894- Button backgrounds ✓
3895- Input field backgrounds ✓
3896
3897**Everything uses real colors now!**
3898
3899## Version 5.1.8 (2026-02-09) - IMPROVED UPDATE TAB LAYOUT
3900
3901### �� Reorganized: Better Update Tab Layout
3902- **Moved:** Current Version section to the top
3903- **Combined:** Upload and Important Notes side-by-side
3904- **Improved:** Space-efficient two-column layout
3905- **Result:** More information visible at once!
3906
3907### New Layout Order
3908
3909**Version 5.1.8**:
3910```
39111. Current Version (at top - see what you have)
39122. Upload + Important Notes (side-by-side)
39133. Recent Changes (changelog)
39144. Backups
3915```
3916
3917### Side-by-Side Design
3918
3919**Upload form (left 60%) + Important Notes (right 40%)**:
3920```
3921┌──────────────────────────────────────────┐
3922│ �� Current Version                       │
3923│ Version: 5.1.8                           │
3924│ ✅ Permissions: OK                       │
3925└──────────────────────────────────────────┘
3926
3927┌─────────────────────┬────────────────────┐
3928│ �� Upload New       │ ⚠️ Important Notes │
3929│ [Choose File]       │ • Replaces files   │
3930│ ☑ Backup first      │ • Config preserved │
3931│ [Upload] [Clear]    │ • Events safe      │
3932└─────────────────────┴────────────────────┘
3933```
3934
3935### Benefits
3936
3937**Current Version First**:
3938- See what you have immediately
3939- Check permissions at a glance
3940- Know if ready to update
3941
3942**Side-by-Side Layout**:
3943- Upload form and warnings together
3944- Read notes while choosing file
3945- More efficient use of space
3946- Less scrolling needed
3947
3948**Better Information Flow**:
39491. See current version ✓
39502. Upload new version with notes visible ✓
39513. Review recent changes ✓
39524. Manage backups ✓
3953
3954### Visual Comparison
3955
3956**Before (v5.1.7)**:
3957```
3958Important Notes (full width)
39593960Upload Form (full width)
39613962Current Version
39633964Recent Changes
39653966Backups
3967```
3968
3969**After (v5.1.8)**:
3970```
3971Current Version (full width)
39723973Upload (60%) | Notes (40%)
39743975Recent Changes
39763977Backups
3978```
3979
3980**More compact, better organized!**
3981
3982### Responsive Design
3983
3984**Wide screens**:
3985- Upload and notes side-by-side
3986- Full 1200px width utilized
3987- Efficient space usage
3988
3989**Narrow screens**:
3990- Sections stack gracefully
3991- Flex layout adapts
3992- Still fully functional
3993
3994### Layout Details
3995
3996**Current Version Section**:
3997- Full width (1200px max)
3998- Shows version, author, description
3999- Permission status with icons
4000- Helpful fix commands if needed
4001
4002**Upload/Notes Section**:
4003- Flexbox layout with gap
4004- Upload: `flex:1` (grows)
4005- Notes: `flex:0 0 350px` (fixed 350px)
4006- Both have proper min-width
4007
4008**Recent Changes Section**:
4009- Full width (1200px max)
4010- Compact scrollable view
4011- Color-coded change types
4012- Last 10 versions shown
4013
4014**Backups Section**:
4015- Full width (1200px max)
4016- Manual backup button
4017- Scrollable file list
4018- All actions accessible
4019
4020### Improved Max Widths
4021
4022All sections now use `max-width:1200px` (previously 900px):
4023- Better use of wide screens
4024- Still responsive on narrow screens
4025- Consistent throughout tab
4026
4027## Version 5.1.7 (2026-02-09) - FIX SYNTAX ERROR
4028
4029### �� Fixed: Extra Closing Brace
4030- **Fixed:** ParseError on line 1936 (extra closing brace)
4031- **Result:** Manual backup feature now works correctly!
4032
4033### What Was Wrong
4034
4035Extra `}` after the backup section:
4036
4037**Before (broken)**:
4038```php
4039echo '</div>';
4040}  // ← Extra closing brace!
4041
4042echo '<script>
4043```
4044
4045**After (fixed)**:
4046```php
4047echo '</div>';
4048
4049echo '<script>
4050```
4051
4052**Manual backup feature now fully functional!** ✅
4053
4054## Version 5.1.6 (2026-02-09) - MANUAL BACKUP ON DEMAND
4055
4056### �� Added: Create Backup Manually Anytime
4057- **Added:** "Create Backup Now" button in Backups section
4058- **Added:** Manual backup action handler with full verification
4059- **Added:** Backups section always visible (even with no backups)
4060- **Added:** Success message showing file size and file count
4061- **Result:** Create backups anytime without needing to upload!
4062
4063### Manual Backup Button
4064
4065**New Layout**:
4066```
4067┌─────────────────────────────────────┐
4068│ �� Backups        [�� Create Backup Now] │
4069├─────────────────────────────────────┤
4070│ Backup File                Size     │
4071calendar.backup.v5.1.6...  243 KB   │
4072│ [�� Download] [✏️ Rename] [��️ Delete] │
4073└─────────────────────────────────────┘
4074```
4075
4076**Always visible - even with no backups**:
4077```
4078┌─────────────────────────────────────┐
4079│ �� Backups        [�� Create Backup Now] │
4080├─────────────────────────────────────┤
4081│ No backups yet. Click "Create       │
4082│ Backup Now" to create your first    │
4083│ backup.                              │
4084└─────────────────────────────────────┘
4085```
4086
4087### How It Works
4088
4089**Click the button**:
40901. Confirm: "Create a backup of the current plugin version?"
40912. System creates backup ZIP
40923. Verifies: File count (30+ files)
40934. Verifies: File size (200KB+)
40945. Shows success: "✓ Manual backup created: filename.zip (243 KB, 31 files)"
4095
4096**Backup naming**:
4097```
4098calendar.backup.v5.1.6.manual.2026-02-09_12-30-45.zip
4099                       ^^^^^^
4100                     "manual" tag identifies manual backups
4101```
4102
4103### Use Cases
4104
4105**Before updates**:
4106- Create safety backup before uploading new version
4107- Have multiple restore points
4108- Test new features with fallback
4109
4110**Regular backups**:
4111- Weekly/monthly backup schedule
4112- Before making configuration changes
4113- After important customizations
4114
4115**Development**:
4116- Backup before code experiments
4117- Save working states
4118- Quick rollback points
4119
4120### Full Verification
4121
4122**Same checks as automatic backups**:
4123- ✅ File count check (minimum 10, expected 30+)
4124- ✅ File size check (minimum 1KB, expected 200KB+)
4125- ✅ Existence check (file actually created)
4126- ✅ Automatic cleanup on failure
4127
4128**Success message includes**:
4129- Backup filename
4130- File size (human-readable)
4131- Number of files backed up
4132
4133### Example Messages
4134
4135**Success**:
4136```
4137✓ Manual backup created successfully:
4138  calendar.backup.v5.1.6.manual.2026-02-09_12-30-45.zip
4139  (243 KB, 31 files)
4140```
4141
4142**Failure Examples**:
4143```
4144❌ Plugin directory is not readable.
4145   Please check permissions.
4146
4147❌ Backup incomplete: Only 5 files were added (expected 30+).
4148   Backup failed.
4149
4150❌ Backup file is too small (342 bytes).
4151   Only 3 files were added. Backup failed.
4152```
4153
4154### Benefits
4155
4156**On-Demand Safety**:
4157- Create backups anytime
4158- No need to upload new version
4159- Quick and easy
4160
4161**Peace of Mind**:
4162- Backup before risky changes
4163- Multiple restore points
4164- Safe experimentation
4165
4166**Professional Workflow**:
4167- Regular backup schedule
4168- Version snapshots
4169- Disaster recovery
4170
4171### Backup Section Improvements
4172
4173**Always Visible**:
4174- Section shows even with 0 backups
4175- Button always accessible
4176- Clear call-to-action
4177
4178**Better Header**:
4179- Title and button on same row
4180- Clean, professional layout
4181- Space-efficient design
4182
4183### Technical Details
4184
4185**New Action**: `create_manual_backup`
4186
4187**New Function**: `createManualBackup()`
4188- Gets current version
4189- Creates timestamped filename with "manual" tag
4190- Uses same verification as auto-backups
4191- Shows detailed success/error messages
4192
4193**File Naming Convention**:
4194```
4195Automatic (on upload):
4196calendar.backup.v5.1.6.2026-02-09_12-30-45.zip
4197
4198Manual (button click):
4199calendar.backup.v5.1.6.manual.2026-02-09_12-30-45.zip
4200                       ^^^^^^^
4201                    Easy to identify!
4202```
4203
4204### Permissions Required
4205
4206- **Read access**: Plugin directory
4207- **Write access**: Parent plugins directory
4208
4209**Same as automatic backups** - no additional permissions needed!
4210
4211## Version 5.1.5 (2026-02-09) - ENHANCED BACKUP VERIFICATION
4212
4213### �� Enhanced: Backup Creation with Robust Verification
4214- **Added:** File count validation (must have 10+ files)
4215- **Added:** File size validation (must be 1KB+ minimum)
4216- **Added:** Return value from addDirectoryToZip (counts files added)
4217- **Added:** Detailed error messages showing file count
4218- **Added:** Automatic deletion of invalid/incomplete backups
4219- **Enhanced:** Exception handling with proper error propagation
4220- **Result:** Backups are now guaranteed to be complete or fail clearly!
4221
4222### What Changed
4223
4224**Before (v5.1.4)**:
4225```php
4226$this->addDirectoryToZip($zip, $pluginDir, 'calendar/');
4227$zip->close();
4228// No verification - could create empty or partial backup
4229```
4230
4231**After (v5.1.5)**:
4232```php
4233$fileCount = $this->addDirectoryToZip($zip, $pluginDir, 'calendar/');
4234$zip->close();
4235
4236// Verify backup exists
4237if (!file_exists($backupPath)) {
4238    redirect('Backup file was not created');
4239}
4240
4241// Verify backup has content
4242$backupSize = filesize($backupPath);
4243if ($backupSize < 1000) {
4244    unlink($backupPath);
4245    redirect('Backup too small: ' . $backupSize . ' bytes');
4246}
4247
4248// Verify file count
4249if ($fileCount < 10) {
4250    unlink($backupPath);
4251    redirect('Only ' . $fileCount . ' files added (expected 30+)');
4252}
4253```
4254
4255### Backup Validation Checks
4256
4257**Three-Layer Verification**:
4258
42591. **File Count Check**:
4260   - Minimum: 10 files required
4261   - Expected: 30+ files
4262   - Action: Delete backup if too few files
4263
42642. **Size Check**:
4265   - Minimum: 1KB (1000 bytes)
4266   - Expected: 200-250KB
4267   - Action: Delete backup if too small
4268
42693. **Existence Check**:
4270   - Verify file was actually created
4271   - Check ZIP archive is valid
4272   - Action: Error if file missing
4273
4274### Enhanced Error Reporting
4275
4276**Detailed Error Messages**:
4277```
4278❌ "Backup file was not created"
4279❌ "Backup too small (342 bytes). Only 3 files added."
4280❌ "Only 5 files added (expected 30+). Backup aborted."
4281❌ "Too many errors adding files: Failed to add X, Y, Z..."
4282❌ "Directory does not exist: /path/to/dir"
4283❌ "Directory is not readable: /path/to/dir"
4284```
4285
4286**Now you know exactly what went wrong!**
4287
4288### Improved addDirectoryToZip Function
4289
4290**Returns File Count**:
4291```php
4292private function addDirectoryToZip($zip, $dir, $zipPath = '') {
4293    $fileCount = 0;
4294    $errors = [];
4295
4296    // Validation
4297    if (!is_dir($dir)) throw new Exception("Directory does not exist");
4298    if (!is_readable($dir)) throw new Exception("Not readable");
4299
4300    // Add files
4301    foreach ($files as $file) {
4302        if ($zip->addFile($filePath, $relativePath)) {
4303            $fileCount++;
4304        } else {
4305            $errors[] = "Failed to add: " . $filename;
4306        }
4307    }
4308
4309    // Check error threshold
4310    if (count($errors) > 5) {
4311        throw new Exception("Too many errors");
4312    }
4313
4314    return $fileCount;  // Returns count for verification!
4315}
4316```
4317
4318### Safety Features
4319
4320**Invalid Backup Cleanup**:
4321- Failed backups are automatically deleted
4322- No partial/corrupt backups left behind
4323- Clean error state
4324
4325**Error Threshold**:
4326- Allow up to 5 minor file errors (logs warnings)
4327- More than 5 errors = complete failure
4328- Prevents partially corrupt backups
4329
4330**Directory Validation**:
4331- Check directory exists before processing
4332- Check directory is readable
4333- Fail fast with clear errors
4334
4335### Benefits
4336
4337**Guaranteed Complete Backups**:
4338- ✅ All files included or backup fails
4339- ✅ No silent failures
4340- ✅ Clear error messages
4341- ✅ Automatic cleanup
4342
4343**Better Debugging**:
4344- Know exactly how many files were added
4345- See specific errors for missing files
4346- Understand why backup failed
4347
4348**User Confidence**:
4349- Backup succeeds = complete backup
4350- Backup fails = clear error message
4351- No ambiguity
4352
4353### Example Scenarios
4354
4355**Scenario 1: Permission Issue**
4356```
4357User uploads new version
4358System starts backup
4359Error: "Directory is not readable: /lib/plugins/calendar/"
4360Backup fails before creating file
4361User sees clear error message
4362```
4363
4364**Scenario 2: Partial Backup**
4365```
4366User uploads new version
4367System creates backup
4368Only 5 files added (disk issue?)
4369Size: 450 bytes
4370Verification fails
4371Incomplete backup deleted
4372Error: "Only 5 files added (expected 30+)"
4373```
4374
4375**Scenario 3: Success**
4376```
4377User uploads new version
4378System creates backup
437931 files added
4380Size: 240KB
4381All verifications pass ✅
4382Update proceeds
4383```
4384
4385### Testing Recommendations
4386
4387After installing v5.1.5:
43881. Upload a new version with backup enabled
43892. Check for success message
43903. Verify backup file exists in /lib/plugins/
43914. Check backup file size (should be ~240KB)
43925. If backup fails, read error message carefully
4393
4394**Your backups are now bulletproof!** ��
4395
4396## Version 5.1.4 (2026-02-09) - BACKUP SYSTEM VERIFIED
4397
4398### ✅ Verified: Backup System Working Correctly
4399- **Verified:** addDirectoryToZip function includes all files recursively
4400- **Verified:** Backups contain all 31+ files from calendar directory
4401- **Verified:** File sizes are appropriate (233-240KB compressed, ~1MB uncompressed)
4402- **Info:** Backup sizes grow slightly with each version (more code = more features!)
4403- **Result:** Backup system is working perfectly!
4404
4405### Backup System Details
4406
4407**What Gets Backed Up**:
4408- All PHP files (syntax.php, admin.php, action.php, etc.)
4409- All JavaScript files (calendar-main.js, script.js)
4410- All documentation (CHANGELOG.md, README.md, all guides)
4411- All configuration (sync_config.php)
4412- All language files
4413- All assets and resources
4414- **Everything in the calendar/ directory!**
4415
4416**Backup Size Analysis**:
4417```
4418Version 5.0.4: 233KB (normal)
4419Version 5.0.5: 234KB (normal)
4420Version 5.0.6: 235KB (normal)
4421Version 5.0.7: 236KB (normal)
4422Version 5.0.8: 237KB (normal)
4423Version 5.0.9: 237KB (normal)
4424Version 5.1.0: 238KB (normal)
4425Version 5.1.1: 238KB (normal)
4426Version 5.1.2: 240KB (normal - added AJAX features)
4427Version 5.1.3: 240KB (normal)
4428```
4429
4430**Why Sizes Grow**:
4431- More features = more code
4432- Longer CHANGELOG
4433- Additional documentation
4434- New functionality
4435- **This is expected and normal!**
4436
4437**Compression Ratio**:
4438```
4439Uncompressed: ~1.0 MB (source files)
4440Compressed:   ~240 KB (ZIP archive)
4441Ratio:        ~24% (excellent compression!)
4442```
4443
4444### Backup File Contents
4445
4446**31 Files Included**:
4447```
4448admin.php              (216KB - main admin interface)
4449syntax.php             (173KB - calendar rendering)
4450calendar-main.js       (102KB - JavaScript functionality)
4451CHANGELOG.md           (268KB - complete version history)
4452style.css              (57KB - all styling)
4453action.php             (38KB - DokuWiki actions)
4454sync_outlook.php       (32KB - Outlook integration)
4455+ 24 other files (docs, configs, helpers)
4456```
4457
4458**All files successfully included!** ✅
4459
4460### How Backups Work
4461
4462**Creation Process**:
44631. User uploads new plugin version
44642. Checkbox "Create backup first" (checked by default)
44653. System creates backup: `calendar.backup.v5.1.3.2026-02-09_06-00-00.zip`
44664. Backup saved to: `/lib/plugins/` directory
44675. Then proceeds with update
4468
4469**Backup Function**:
4470```php
4471private function addDirectoryToZip($zip, $dir, $zipPath = '') {
4472    $files = new RecursiveIteratorIterator(
4473        new RecursiveDirectoryIterator($dir),
4474        RecursiveIteratorIterator::LEAVES_ONLY
4475    );
4476    foreach ($files as $file) {
4477        if (!$file->isDir()) {
4478            $zip->addFile($filePath, $relativePath);
4479        }
4480    }
4481}
4482```
4483
4484**Recursive = Gets Everything!** ✅
4485
4486### Verification Results
4487
4488**Test Results**:
4489- ✅ All 31 files present in zip
4490- ✅ All subdirectories included (lang/en/)
4491- ✅ File sizes match originals
4492- ✅ Compression works properly
4493- ✅ No files missing
4494- ✅ Backup can be restored
4495
4496**File Count**:
4497```
4498Source directory: 31 files
4499Backup ZIP:       34 items (31 files + 3 directories)
4500Status:           COMPLETE ✅
4501```
4502
4503### Backup Best Practices
4504
4505**Always enabled by default** ✅
4506**Stored in accessible location** ✅
4507**Timestamped filenames** ✅
4508**Complete directory backup** ✅
4509**Easy to restore** ✅
4510
4511### Conclusion
4512
4513The backup system is working perfectly. The file sizes are appropriate and expected:
4514- Compressed size: ~240KB (good compression)
4515- Uncompressed size: ~1MB (all source files)
4516- All files included: YES ✅
4517- Growing size over versions: Normal (more features!)
4518
4519**Your backups are complete and reliable!** ��
4520
4521## Version 5.1.3 (2026-02-08) - FIX JAVASCRIPT SYNTAX ERROR
4522
4523### �� Fixed: JavaScript Syntax Error in AJAX Function
4524- **Fixed:** ParseError on line 1947 (deleteBackup function)
4525- **Fixed:** Escaped all single quotes in JavaScript strings
4526- **Result:** AJAX backup deletion now works correctly!
4527
4528### What Was Wrong
4529
4530JavaScript inside PHP echo needs escaped quotes:
4531
4532**Before (broken)**:
4533```javascript
4534formData.append('action', 'delete_backup');  // PHP interprets quotes
4535```
4536
4537**After (fixed)**:
4538```javascript
4539formData.append(\'action\', \'delete_backup\');  // Escaped for PHP
4540```
4541
4542### All Quotes Escaped
4543
4544Fixed in deleteBackup function:
4545- ✅ FormData.append() calls
4546- ✅ fetch() URL
4547- ✅ querySelector() calls
4548- ✅ createElement() call
4549- ✅ All string literals
4550- ✅ Error messages
4551
4552**JavaScript now works!** ✓
4553
4554## Version 5.1.2 (2026-02-08) - AJAX BACKUP DELETION & LAYOUT IMPROVEMENT
4555
4556### �� Improved: Update Tab Further Refined
4557- **Moved:** Important Notes to very top (above upload)
4558- **Enhanced:** Delete backup now uses AJAX (no page refresh!)
4559- **Added:** Smooth fade-out animation when deleting backups
4560- **Added:** Success message after deletion
4561- **Auto-remove:** Backup section disappears if last backup deleted
4562- **Result:** Smoother, more polished experience!
4563
4564### New Layout Order
4565
4566**Final Order (v5.1.2)**:
4567```
45681. ⚠️ Important Notes (warnings at top)
45692. �� Upload New Version (with Clear Cache button)
45703. �� Current Version (info)
45714. �� Recent Changes (changelog)
45725. �� Available Backups (if any)
4573```
4574
4575### AJAX Backup Deletion
4576
4577**Before (v5.1.1)**:
4578- Click Delete → Page refreshes → Scroll back down
4579- Lose position on page
4580- Page reload is jarring
4581
4582**After (v5.1.2)**:
4583- Click Delete → Confirm
4584- Row fades out smoothly
4585- Row disappears
4586- Success message shows at top
4587- Success message fades after 3 seconds
4588- If last backup: entire section fades away
4589- **No page refresh!** ✓
4590
4591### Visual Flow
4592
4593**Delete Animation**:
4594```
45951. Click ��️ Delete
45962. Confirm dialog
45973. Row fades out (0.3s)
45984. Row removed
45995. Success message appears
46006. Message fades after 3s
4601```
4602
4603**If Last Backup**:
4604```
46051. Delete last backup
46062. Row fades out
46073. Entire "Available Backups" section fades
46084. Section removed
46095. Clean interface ✓
4610```
4611
4612### Success Message
4613
4614After deleting:
4615```
4616┌──────────────────────────────┐
4617│ ✓ Backup deleted: filename   │ ← Appears at top
4618└──────────────────────────────┘
4619   Fades after 3 seconds
4620```
4621
4622### Benefits
4623
4624**Important Notes First**:
4625- Warnings before actions ✓
4626- Read before uploading ✓
4627- Clear expectations ✓
4628
4629**AJAX Deletion**:
4630- No page refresh ✓
4631- Smooth animations ✓
4632- Stay in context ✓
4633- Professional feel ✓
4634
4635**Auto-Cleanup**:
4636- Empty list disappears ✓
4637- Clean interface ✓
4638- No clutter ✓
4639
4640### Technical Implementation
4641
4642**AJAX Request**:
4643```javascript
4644fetch('?do=admin&page=calendar&tab=update', {
4645    method: 'POST',
4646    body: formData
4647})
4648```
4649
4650**DOM Manipulation**:
4651- Fade out row
4652- Remove element
4653- Show success
4654- Remove section if empty
4655
4656**Smooth Transitions**:
4657- 300ms fade animations
4658- Clean visual feedback
4659- Professional polish
4660
4661## Version 5.1.1 (2026-02-08) - REORGANIZE UPDATE TAB
4662
4663### �� Improved: Update Tab Layout Reorganized
4664- **Moved:** Upload section to the top of the page
4665- **Added:** Clear Cache button next to Upload & Install button
4666- **Changed:** "Current Version" section moved below upload
4667- **Result:** Better workflow - upload first, then see version info!
4668
4669### New Layout Order
4670
4671**Before (v5.1.0)**:
4672```
46731. Clear Cache (standalone)
46742. Current Version
46753. Recent Changes
46764. Upload New Version
46775. Warning Box
46786. Backups
4679```
4680
4681**After (v5.1.1)**:
4682```
46831. Upload New Version (with Clear Cache button side-by-side)
46842. Warning Box
46853. Current Version
46864. Recent Changes
46875. Backups
4688```
4689
4690### Visual Result
4691
4692**Top of Update Tab**:
4693```
4694┌─────────────────────────────────┐
4695│ �� Upload New Version           │
4696│ ┌─────────────────────────────┐ │
4697│ │ [Choose File]               │ │
4698│ │ ☑ Create backup first       │ │
4699│ │ ┌──────────────┬──────────┐ │ │
4700│ │ │�� Upload &   │��️ Clear  │ │ │
4701│ │ │   Install    │   Cache  │ │ │
4702│ │ └──────────────┴──────────┘ │ │
4703│ └─────────────────────────────┘ │
4704│                                 │
4705│ ⚠️ Important Notes              │
4706│ • Will replace all files        │
4707│ • Config preserved              │
4708│                                 │
4709│ �� Current Version              │
4710│ Version: 5.1.1                  │
4711└─────────────────────────────────┘
4712```
4713
4714### Benefits
4715
4716**Better Workflow**:
4717- Primary action (upload) is first
4718- Clear cache conveniently next to install
4719- No scrolling to find upload button
4720- Logical top-to-bottom flow
4721
4722**Side-by-Side Buttons**:
4723- Upload & Install (green)
4724- Clear Cache (orange)
4725- Both common actions together
4726- Easy to access after upload
4727
4728**Improved UX**:
4729- Upload is most important → now at top
4730- Version info is reference → moved down
4731- Related actions grouped
4732- Cleaner organization
4733
4734### Button Layout
4735
4736```
4737┌──────────────────┬──────────────┐
4738│ �� Upload &      │ ��️ Clear     │
4739│    Install       │    Cache     │
4740│ (Green)          │ (Orange)     │
4741└──────────────────┴──────────────┘
4742```
4743
4744**Green = Primary Action**
4745**Orange = Secondary Action**
4746
4747Both easily accessible!
4748
4749## Version 5.1.0 (2026-02-08) - ADMIN SECTIONS USE MAIN BACKGROUND
4750
4751### �� Changed: Admin Section Backgrounds Now Use __background__
4752- **Changed:** All section boxes now use `__background__` instead of `__background_alt__`
4753- **Result:** Cleaner, more unified admin interface!
4754
4755### Background Usage Update
4756
4757**Before (v5.0.9)**:
4758```php
4759Section boxes: bg_alt (__background_alt__)
4760Content areas: bg (__background__)
4761```
4762
4763**After (v5.1.0)**:
4764```php
4765Section boxes: bg (__background__)
4766Content areas: bg (__background__)
4767```
4768
4769### Why This Change?
4770
4771**More unified appearance**:
4772- Sections and content use same background
4773- Creates cleaner, more cohesive look
4774- Borders provide visual separation
4775- Matches typical admin UI patterns
4776
4777**Template color hierarchy**:
4778```
4779__background_site__ → Outer page wrapper
4780__background__      → Content & sections (BOTH now use this)
4781__background_alt__  → Reserved for special panels/highlights
4782__background_neu__  → Special highlights
4783```
4784
4785### Visual Result
4786
4787**Light Template**:
4788```ini
4789__background__ = "#ffffff"
4790__background_alt__ = "#e8e8e8"
4791```
4792
4793**Before**:
4794```
4795Admin Page:
4796┌─────────────────────┐
4797│ ┌─────────────────┐ │
4798│ │ Section Box     │ │ ← Gray (#e8e8e8)
4799│ │ ┌─────────────┐ │ │
4800│ │ │ Content     │ │ │ ← White (#fff)
4801│ │ └─────────────┘ │ │
4802│ └─────────────────┘ │
4803└─────────────────────┘
4804Two-tone appearance
4805```
4806
4807**After**:
4808```
4809Admin Page:
4810┌─────────────────────┐
4811│ ┌─────────────────┐ │
4812│ │ Section Box     │ │ ← White (#fff)
4813│ │ ┌─────────────┐ │ │
4814│ │ │ Content     │ │ │ ← White (#fff)
4815│ │ └─────────────┘ │ │
4816│ └─────────────────┘ │
4817└─────────────────────┘
4818Unified, clean appearance
4819Borders provide separation
4820```
4821
4822**Dark Template**:
4823```ini
4824__background__ = "#2d2d2d"
4825__background_alt__ = "#3a3a3a"
4826```
4827
4828**After**:
4829```
4830Admin Page:
4831┌─────────────────────┐
4832│ ┌─────────────────┐ │
4833│ │ Section Box     │ │ ← Dark (#2d2d2d)
4834│ │ ┌─────────────┐ │ │
4835│ │ │ Content     │ │ │ ← Dark (#2d2d2d)
4836│ │ └─────────────┘ │ │
4837│ └─────────────────┘ │
4838└─────────────────────┘
4839Unified dark appearance
4840Accent borders provide definition
4841```
4842
4843### Benefits
4844
4845**Cleaner Look**:
4846- No more alternating gray/white
4847- More professional appearance
4848- Less visual noise
4849- Unified color scheme
4850
4851**Better Consistency**:
4852- Matches modern admin UI patterns
4853- Borders define sections, not colors
4854- Simpler, cleaner design
4855- Easier on the eyes
4856
4857**Template Friendly**:
4858- Works with any background color
4859- Light or dark templates
4860- Custom colors
4861- Always looks cohesive
4862
4863### All Sections Updated
4864
4865✅ Outlook Sync config sections
4866✅ Manage Events sections
4867✅ Update Plugin sections
4868✅ Themes tab sections
4869✅ Week start day section
4870✅ All form sections
4871
4872**Complete unified theming!** ��
4873
4874## Version 5.0.9 (2026-02-08) - FIX SYNTAX ERROR IN THEMES TAB
4875
4876### �� Fixed: Syntax Error in Theme Cards
4877- **Fixed:** ParseError on line 4461 (Purple theme card)
4878- **Fixed:** Malformed ternary expressions from sed replacement
4879- **Fixed:** All 4 theme cards (Purple, Professional, Pink, Wiki)
4880- **Result:** Admin pages work correctly!
4881
4882### What Was Wrong
4883
4884The bulk sed replacement in v5.0.8 incorrectly modified ternary expressions:
4885
4886**Before (broken)**:
4887```php
4888? '#9b59b6' : ' . $colors['border'] . ')
4889// Extra quote and dot created syntax error
4890```
4891
4892**After (fixed)**:
4893```php
4894? '#9b59b6' : $colors['border'])
4895// Clean ternary expression
4896```
4897
4898### All Theme Cards Fixed
4899
4900- ✅ Purple Dream card
4901- ✅ Professional Blue card
4902- ✅ Pink Bling card
4903- ✅ Wiki Default card
4904
4905### Now Working
4906
4907**Theme selection page loads** ✓
4908**All cards display properly** ✓
4909**Template colors applied** ✓
4910**No syntax errors** ✓
4911
4912## Version 5.0.8 (2026-02-08) - FIX THEMES TAB & BACKGROUND MAPPING
4913
4914### �� Fixed: Themes Tab Backgrounds & Correct Template Color Mapping
4915- **Fixed:** Themes tab now uses template colors (removed all hardcoded whites)
4916- **Fixed:** Main background now uses `__background__` instead of `__background_site__`
4917- **Fixed:** Theme selection cards use template backgrounds
4918- **Fixed:** Week start options use template backgrounds
4919- **Result:** Perfect color mapping throughout admin!
4920
4921### Color Mapping Correction
4922
4923**Before (v5.0.7)**:
4924```php
4925bg: __background_site__  // Wrong - this is outer page bg
4926bg_alt: __background_alt__
4927```
4928
4929**After (v5.0.8)**:
4930```php
4931bg: __background__       // Correct - main content bg
4932bg_alt: __background_alt__
4933```
4934
4935### Why This Matters
4936
4937**Template color hierarchy**:
4938```
4939__background_site__ → Outer page/site background
4940__background__      → Main content area (CORRECT for admin)
4941__background_alt__  → Sections/panels
4942__background_neu__  → Highlights
4943```
4944
4945**Admin should use**:
4946- `__background__` for input fields, content areas
4947- `__background_alt__` for section boxes, panels
4948
4949### Themes Tab Fixed
4950
4951**Removed all hardcoded colors**:
4952```php
4953Before: '#ddd', '#fff', '#dee2e6'
4954After:  $colors['border'], $colors['bg'], $colors['border']
4955```
4956
4957**Now themed**:
4958- ✅ Week start section background
4959- ✅ Week start option backgrounds
4960- ✅ Theme card backgrounds
4961- ✅ Theme card borders
4962- ✅ All borders throughout
4963
4964### Visual Result
4965
4966**Light Template**:
4967```ini
4968__background__ = "#ffffff"
4969__background_alt__ = "#e8e8e8"
4970```
4971
4972**Admin Before (v5.0.7)**:
4973```
4974Input fields: #f5f5f5 (site bg - wrong)
4975Sections: #e8e8e8 (alt bg - correct)
4976```
4977
4978**Admin After (v5.0.8)**:
4979```
4980Input fields: #ffffff (content bg - correct!)
4981Sections: #e8e8e8 (alt bg - correct!)
4982```
4983
4984**Dark Template**:
4985```ini
4986__background__ = "#2d2d2d"
4987__background_alt__ = "#3a3a3a"
4988```
4989
4990**Admin After (v5.0.8)**:
4991```
4992Input fields: #2d2d2d (content bg - perfect!)
4993Sections: #3a3a3a (alt bg - perfect!)
4994```
4995
4996### Complete Themes Tab
4997
4998**Week Start Options**:
4999```
5000┌─────────────────────────┐
5001│ �� Week Start Day       │ ← bg_alt
5002│ ┌─────────┬───────────┐ │
5003│ │ Monday  │ Sunday    │ │ ← bg (when not selected)
5004│ └─────────┴───────────┘ │
5005└─────────────────────────┘
5006```
5007
5008**Theme Cards**:
5009```
5010┌─────────────────────────┐
5011│ �� Matrix Edition       │ ← bg (when not selected)
5012│ Classic green theme     │   border (when not selected)
5013└─────────────────────────┘
5014
5015┌═════════════════════════┐
5016│ �� Purple Dream         │ ← rgba green tint (when selected)
5017│ Elegant purple theme    │   #00cc07 border (when selected)
5018└═════════════════════════┘
5019```
5020
5021### Perfect Integration
5022
5023**All admin pages now**:
5024- Content areas: `__background__` ✓
5025- Section boxes: `__background_alt__` ✓
5026- Borders: `__border__` ✓
5027- Text: `__text__` ✓
5028
5029**Matches wiki perfectly**:
5030- Same white content areas
5031- Same gray section boxes
5032- Same border colors
5033- Same text colors
5034
5035### No More Issues
5036
5037**Fixed**:
5038- ❌ Site background on content areas → ✅ Content background
5039- ❌ Hardcoded white on themes tab → ✅ Template background
5040- ❌ Hardcoded borders (#ddd) → ✅ Template borders
5041
5042**Result**:
5043- Perfect color hierarchy ✓
5044- Correct background levels ✓
5045- Complete template integration ✓
5046
5047## Version 5.0.7 (2026-02-08) - COMPLETE ADMIN THEMING
5048
5049### �� Fixed: All Admin Backgrounds Use Template Colors
5050- **Fixed:** All section backgrounds use `__background_alt__`
5051- **Fixed:** All content backgrounds use `__background__`
5052- **Fixed:** All borders use `__border__`
5053- **Fixed:** All text uses `__text__`
5054- **Result:** Complete admin template integration!
5055
5056### All Replacements
5057
5058**Backgrounds**:
5059```php
5060Before: background: #f9f9f9
5061After:  background: ' . $colors['bg_alt'] . '
5062
5063Before: background: #fff / background: white
5064After:  background: ' . $colors['bg'] . '
5065```
5066
5067**Borders**:
5068```php
5069Before: border: 1px solid #ddd
5070Before: border: 1px solid #e0e0e0
5071Before: border: 1px solid #eee
5072After:  border: 1px solid ' . $colors['border'] . '
5073```
5074
5075**Text**:
5076```php
5077Before: color: #333
5078Before: color: #666
5079After:  color: ' . $colors['text'] . '
5080```
5081
5082### Complete Admin Coverage
5083
5084**All tabs now themed**:
5085- ✅ Manage Events tab
5086- ✅ Update Plugin tab
5087- ✅ Outlook Sync tab
5088- ✅ Themes tab
5089- ✅ Tab navigation
5090- ✅ All sections
5091- ✅ All inputs
5092- ✅ All borders
5093- ✅ All text
5094
5095### Visual Result
5096
5097**Light Template**:
5098```
5099Admin Page:
5100┌──────────────────────────┐
5101│ Tab Navigation           │ ← Template borders
5102├──────────────────────────┤
5103│ Section Headers          │ ← bg_alt (light gray)
5104│ ┌──────────────────────┐ │
5105│ │ Form Inputs          │ │ ← bg (white)
5106│ │ Content Areas        │ │
5107│ └──────────────────────┘ │
5108└──────────────────────────┘
5109All template colors! ✓
5110```
5111
5112**Dark Template**:
5113```
5114Admin Page:
5115┌──────────────────────────┐
5116│ Tab Navigation           │ ← Template borders
5117├──────────────────────────┤
5118│ Section Headers          │ ← bg_alt (dark gray)
5119│ ┌──────────────────────┐ │
5120│ │ Form Inputs          │ │ ← bg (darker)
5121│ │ Content Areas        │ │
5122│ └──────────────────────┘ │
5123└──────────────────────────┘
5124All template colors! ✓
5125```
5126
5127### Template Color Mapping
5128
5129**Used throughout admin**:
5130```
5131__background_site__ → $colors['bg']       (main backgrounds)
5132__background_alt__  → $colors['bg_alt']   (section backgrounds)
5133__text__            → $colors['text']     (all text)
5134__border__          → $colors['border']   (all borders)
5135__link__            → $colors['link']     (links - future)
5136```
5137
5138### Examples by Section
5139
5140**Manage Events**:
5141- Event list backgrounds: `bg_alt`
5142- Event item backgrounds: `bg`
5143- Borders: `border`
5144- Text: `text`
5145
5146**Update Plugin**:
5147- Section backgrounds: `bg_alt`
5148- Content areas: `bg`
5149- Borders: `border`
5150- Text: `text`
5151
5152**Outlook Sync**:
5153- Config sections: `bg_alt`
5154- Input fields: `bg`
5155- Borders: `border`
5156- Labels: `text`
5157
5158**Themes Tab**:
5159- Theme cards: `bg_alt`
5160- Preview areas: `bg`
5161- Borders: `border`
5162- Descriptions: `text`
5163
5164### Benefits
5165
5166**Seamless Integration**:
5167- Matches wiki admin area perfectly
5168- Same colors throughout wiki
5169- Professional appearance
5170- Consistent experience
5171
5172**Automatic Adaptation**:
5173- Light templates: Light admin
5174- Dark templates: Dark admin
5175- Custom templates: Uses custom colors
5176
5177**No White Boxes**:
5178- Every background themed
5179- Every border themed
5180- Every text themed
5181- Complete consistency
5182
5183### PERFECT HARMONY
5184
5185**Frontend (Calendar)**:
5186- Wiki theme uses style.ini5187- Perfect template match ✓
5188
5189**Backend (Admin)**:
5190- Reads same style.ini5191- Perfect template match ✓
5192
5193**Complete Unity**:
5194- Same colors everywhere ✓
5195- Seamless experience ✓
5196- Professional polish ✓
5197
5198## Version 5.0.6 (2026-02-08) - ADMIN PAGES USE TEMPLATE COLORS
5199
5200### �� Enhanced: Month/Year Header & Admin Pages Use Template Colors
5201- **Fixed:** Month/Year header now uses `__text_neu__` for wiki theme
5202- **Added:** Admin pages read template's style.ini file
5203- **Added:** `getTemplateColors()` function in admin class
5204- **Fixed:** Tab navigation uses template text and border colors
5205- **Result:** Complete template integration everywhere!
5206
5207### Month/Year Header
5208
5209**Before**:
5210```php
5211color: __text__  // Same as primary text
5212```
5213
5214**After (Wiki Theme)**:
5215```php
5216color: __text_neu__  // Dimmed text (subtle)
5217```
5218
5219### Admin Pages Enhancement
5220
5221**New `getTemplateColors()` function**:
5222- Reads template's style.ini file
5223- Extracts color replacements
5224- Provides colors to all admin tabs
5225- Falls back to sensible defaults
5226
5227**Colors used**:
5228```php
5229bg: __background_site__
5230bg_alt: __background_alt__
5231text: __text__
5232border: __border__
5233link: __link__
5234```
5235
5236**Applied to**:
5237- Tab navigation borders
5238- Tab text colors
5239- All admin sections
5240- Ready for future enhancements
5241
5242### Visual Result
5243
5244**Calendar Header**:
5245```
5246┌────────────────────┐
5247│ ‹ February 2026 › │ ← __text_neu__ (dimmed)
5248└────────────────────┘
5249Subtle and elegant ✓
5250```
5251
5252**Admin Navigation**:
5253```
5254�� Manage Events | �� Update | ⚙️ Config | �� Themes
5255─────────────────────────────────────────────────
5256Active tab: Green (#00cc07)
5257Inactive tabs: Template text color
5258Border: Template border color
5259```
5260
5261### Template Integration
5262
5263**Light Template**:
5264```ini
5265__text_neu__ = "#666666"
5266__border__ = "#cccccc"
5267```
5268**Result**:
5269- Month/Year: Medium gray (subtle)
5270- Admin borders: Light gray
5271- Tab text: Dark gray
5272
5273**Dark Template**:
5274```ini
5275__text_neu__ = "#999999"
5276__border__ = "#555555"
5277```
5278**Result**:
5279- Month/Year: Light gray (subtle)
5280- Admin borders: Medium gray
5281- Tab text: Bright gray
5282
5283### Benefits
5284
5285**Calendar Frontend**:
5286- Month/Year header more subtle
5287- Better visual hierarchy
5288- Less prominent, more elegant
5289
5290**Admin Backend**:
5291- Uses template colors
5292- Matches wiki admin area
5293- Consistent experience
5294- Professional appearance
5295
5296### Future-Ready
5297
5298The `getTemplateColors()` function is now available for:
5299- ✅ Tab navigation (implemented)
5300- �� Section backgrounds (ready)
5301- �� Button colors (ready)
5302- �� Input fields (ready)
5303- �� Success/error messages (ready)
5304
5305**Foundation laid for complete admin theming!** ��
5306
5307## Version 5.0.5 (2026-02-08) - WIKI THEME ADD BUTTON & SECTION HEADERS
5308
5309### �� Fixed: Add Event Bar & Section Headers Use Template Colors
5310- **Fixed:** Add Event bar now uses `__background_alt__` for wiki theme
5311- **Fixed:** "Today" header uses `__text_neu__`
5312- **Fixed:** "Tomorrow" header uses `__text__`
5313- **Fixed:** "Important Events" header uses `__border__`
5314- **Result:** Perfect template color integration!
5315
5316### All Changes
5317
5318**Add Event Bar (Wiki Theme)**:
5319
5320**Before**:
5321```php
5322background: #3498db  // Generic blue
5323```
5324
5325**After**:
5326```php
5327background: __background_alt__  // Template alternate bg
5328text: __text__                  // Template text color
5329hover: __background_neu__       // Template neutral bg
5330```
5331
5332**Section Headers (Wiki Theme)**:
5333
5334**Before**:
5335```php
5336Today: #ff9800           // Orange
5337Tomorrow: #4caf50        // Green
5338Important Events: #9b59b6 // Purple
5339```
5340
5341**After**:
5342```php
5343Today: __text_neu__      // Template dimmed text
5344Tomorrow: __text__       // Template primary text
5345Important Events: __border__ // Template border color
5346```
5347
5348### Visual Result
5349
5350**Wiki Default Theme**:
5351```
5352Add Event Bar:
5353┌────────────────┐
5354│  + ADD EVENT   │ ← Template alt background
5355└────────────────┘
5356
5357Sections:
5358━━━━━━━━━━━━━━━━
5359Today              ← Dimmed text color (__text_neu__)
5360• Team Meeting
5361
5362Tomorrow           ← Primary text color (__text__)
5363• Code Review
5364
5365Important Events   ← Border color (__border__)
5366• Project Deadline
5367```
5368
5369### Example with DokuWiki Default Template
5370
5371**Template colors**:
5372```ini
5373__background_alt__ = "#e8e8e8"
5374__text__ = "#333333"
5375__text_neu__ = "#666666"
5376__border__ = "#cccccc"
5377```
5378
5379**Calendar result**:
5380```
5381Add Event Bar: Light gray (#e8e8e8)
5382Today header: Medium gray (#666666)
5383Tomorrow header: Dark gray (#333333)
5384Important Events header: Border gray (#cccccc)
5385```
5386
5387### Example with Dark Template
5388
5389**Template colors**:
5390```ini
5391__background_alt__ = "#2d2d2d"
5392__text__ = "#e0e0e0"
5393__text_neu__ = "#999999"
5394__border__ = "#555555"
5395```
5396
5397**Calendar result**:
5398```
5399Add Event Bar: Dark gray (#2d2d2d)
5400Today header: Light gray (#999999)
5401Tomorrow header: Bright gray (#e0e0e0)
5402Important Events header: Medium gray (#555555)
5403```
5404
5405### Perfect Harmony
5406
5407All sidebar elements now use template colors:
5408- ✅ Add Event bar background
5409- ✅ Add Event bar text
5410- ✅ Today section header
5411- ✅ Tomorrow section header
5412- ✅ Important Events header
5413- ✅ Calendar cells
5414- ✅ Grid backgrounds
5415- ✅ All borders
5416
5417**Complete template integration!** ��
5418
5419## Version 5.0.4 (2026-02-08) - USE __background__ FOR CALENDAR CELLS
5420
5421### �� Fixed: Calendar Cells Use Correct Template Color
5422- **Fixed:** Calendar cells now use `__background__` from template
5423- **Changed:** `cell_bg` now uses `__background__` instead of `__background_neu__`
5424- **Result:** Calendar cells match main content area background!
5425
5426### Color Mapping Update
5427
5428**Before (v5.0.3)**:
5429```php
5430cell_bg: __background_neu__  // Wrong - this is for neutral/alternate
5431```
5432
5433**After (v5.0.4)**:
5434```php
5435cell_bg: __background__      // Correct - main content background
5436```
5437
5438### Template Color Usage
5439
5440**Wiki Default theme now uses**:
5441```
5442__background_site__ → Overall page background
5443__background__      → Calendar cells (main content bg)
5444__background_alt__  → Grid background, headers
5445__background_neu__  → Today cell highlight
5446__text__            → Primary text
5447__text_neu__        → Dimmed text
5448__link__            → Links, bright text
5449__border__          → All borders
5450```
5451
5452### Visual Result
5453
5454**Before**:
5455```
5456Calendar with template colors:
5457┌─────┬─────┬─────┐
5458│ Mon │ Tue │ Wed │
5459├─────┼─────┼─────┤
5460│  8  │  9  │ 10  │ ← Neutral gray (wrong)
5461└─────┴─────┴─────┘
5462```
5463
5464**After**:
5465```
5466Calendar with template colors:
5467┌─────┬─────┬─────┐
5468│ Mon │ Tue │ Wed │
5469├─────┼─────┼─────┤
5470│  8  │  9  │ 10  │ ← White/content bg (correct!)
5471└─────┴─────┴─────┘
5472```
5473
5474### Example Template Colors
5475
5476**DokuWiki Default**:
5477```ini
5478__background__ = "#ffffff"
5479```
5480**Result**: White calendar cells ✓
5481
5482**Dark Template**:
5483```ini
5484__background__ = "#2d2d2d"
5485```
5486**Result**: Dark calendar cells ✓
5487
5488**Custom Template**:
5489```ini
5490__background__ = "#f9f9f9"
5491```
5492**Result**: Custom color cells ✓
5493
5494### Perfect Matching
5495
5496Calendar cells now match:
5497- ✅ Main content area background
5498- ✅ Article/page background
5499- ✅ Content box background
5500- ✅ Same as wiki text background
5501
5502**Seamless integration!** ��
5503
5504## Version 5.0.3 (2026-02-08) - READ COLORS FROM TEMPLATE STYLE.INI
5505
5506### �� Enhanced: Wiki Default Theme Reads Template Colors
5507- **Added:** Function to read colors from DokuWiki template's style.ini file
5508- **Reads:** `/var/www/html/dokuwiki/conf/tpl/{template}/style.ini`
5509- **Falls back:** Also checks `/var/www/html/dokuwiki/lib/tpl/{template}/style.ini`
5510- **Uses:** Actual template colors instead of CSS variables
5511- **Result:** Perfect color matching with any DokuWiki template!
5512
5513### How It Works
5514
5515**New Function: `getWikiTemplateColors()`**
5516
55171. **Detects** current DokuWiki template name
55182. **Reads** the template's `style.ini` file
55193. **Parses** color replacements section
55204. **Maps** template colors to calendar theme
55215. **Falls back** to CSS variables if file not found
5522
5523### Colors Read from style.ini
5524
5525**Template color replacements used**:
5526```php
5527__background_site__  → bg, header_bg
5528__background_alt__   → grid_bg, cell_today_bg
5529__background_neu__   → cell_bg
5530__text__             → text_primary
5531__text_neu__         → text_dim
5532__link__             → text_bright
5533__border__           → border, grid_border
5534```
5535
5536### Example style.ini Mapping
5537
5538**Template style.ini**:
5539```ini
5540[replacements]
5541__background_site__ = "#f8f9fa"
5542__background_alt__  = "#e9ecef"
5543__background_neu__  = "#dee2e6"
5544__text__            = "#212529"
5545__text_neu__        = "#6c757d"
5546__link__            = "#0d6efd"
5547__border__          = "#ced4da"
5548```
5549
5550**Calendar theme result**:
5551```php
5552bg: #f8f9fa
5553header_bg: #e9ecef
5554grid_bg: #e9ecef
5555cell_bg: #dee2e6
5556text_primary: #212529
5557text_dim: #6c757d
5558text_bright: #0d6efd
5559border: #ced4da
5560grid_border: #ced4da
5561```
5562
5563### Before vs After
5564
5565**Before (v5.0.2)**:
5566```
5567Wiki Default theme used:
5568- CSS variables (var(--__background__, #fff))
5569- Required browser CSS variable support
5570- Fallback to generic colors
5571```
5572
5573**After (v5.0.3)**:
5574```
5575Wiki Default theme uses:
5576- Actual colors from template's style.ini
5577- Exact template color values
5578- No CSS variable dependency
5579- Perfect color matching!
5580```
5581
5582### File Location Priority
5583
5584Checks in order:
55851. `/var/www/html/dokuwiki/conf/tpl/{template}/style.ini`
55862. `/var/www/html/dokuwiki/lib/tpl/{template}/style.ini`
55873. Falls back to CSS variables if neither found
5588
5589### Benefits
5590
5591**More accurate colors**:
5592- Uses exact template color values ✓
5593- No CSS variable interpolation ✓
5594- Consistent across all browsers ✓
5595
5596**Better compatibility**:
5597- Works with older browsers ✓
5598- No CSS variable support needed ✓
5599- Direct color values ✓
5600
5601**Perfect matching**:
5602- Reads template's actual colors ✓
5603- Same colors as wiki pages ✓
5604- Seamless integration ✓
5605
5606### Template Examples
5607
5608**DokuWiki Default Template**:
5609```
5610Reads: lib/tpl/dokuwiki/style.ini
5611Gets: Default DokuWiki colors
5612Result: Perfect classic DokuWiki look
5613```
5614
5615**Bootstrap Template**:
5616```
5617Reads: lib/tpl/bootstrap3/style.ini
5618Gets: Bootstrap color scheme
5619Result: Perfect Bootstrap integration
5620```
5621
5622**Custom Template**:
5623```
5624Reads: conf/tpl/mycustom/style.ini
5625Gets: Your custom colors
5626Result: Perfect custom theme match
5627```
5628
5629### Fallback Chain
5630
56311. **Try** reading style.ini from template
56322. **If found** → Use exact colors from file
56333. **If not found** → Use CSS variables
56344. **If no CSS vars** → Use fallback colors
5635
5636**Always works, always matches!** ✓
5637
5638## Version 5.0.2 (2026-02-08) - FIX WIKI DEFAULT THEME DAY PANEL
5639
5640### �� Fixed: Wiki Default Theme Day Panel Colors
5641- **Fixed:** Day popup panel now uses DokuWiki CSS variables
5642- **Fixed:** Panel background matches wiki theme
5643- **Fixed:** Panel header matches wiki theme
5644- **Fixed:** Border colors use wiki theme
5645- **Fixed:** Text colors use wiki theme
5646- **Result:** Perfect integration with DokuWiki templates!
5647
5648### All Changes
5649
5650**Day Panel Colors (Wiki Default)**:
5651
5652**Before**:
5653```php
5654background: rgba(36, 36, 36, 0.5)  // Dark gray (wrong!)
5655header: #3498db                     // Blue (wrong!)
5656```
5657
5658**After**:
5659```php
5660background: var(--__background__, #fff)
5661header: var(--__background_alt__, #e8e8e8)
5662header_text: var(--__text__, #333)
5663border: var(--__border__, #ccc)
5664shadow: 0 2px 4px rgba(0, 0, 0, 0.1)
5665```
5666
5667**Event Colors (Wiki Default)**:
5668```php
5669event_bg: var(--__background_alt__, rgba(245, 245, 245, 0.5))
5670border_color: var(--__border__, rgba(204, 204, 204, 0.3))
5671bar_shadow: 0 1px 2px rgba(0, 0, 0, 0.15)
5672```
5673
5674### Before vs After
5675
5676**Before (v5.0.1)**:
5677```
5678Wiki Default - Click Week Cell:
5679┌────────────────┐
5680│ Monday, Feb 8  │ ← Blue header (wrong)
5681├────────────────┤
5682│ Team Meeting   │ ← Dark gray bg (wrong)
5683│ 2:00 PM        │
5684└────────────────┘
5685Doesn't match wiki theme
5686```
5687
5688**After (v5.0.2)**:
5689```
5690Wiki Default - Click Week Cell:
5691
5692Light Wiki Theme:
5693┌────────────────┐
5694│ Monday, Feb 8  │ ← Light gray header ✓
5695├────────────────┤
5696│ Team Meeting   │ ← White bg ✓
5697│ 2:00 PM        │   Dark text ✓
5698└────────────────┘
5699
5700Dark Wiki Theme:
5701┌────────────────┐
5702│ Monday, Feb 8  │ ← Dark header ✓
5703├────────────────┤
5704│ Team Meeting   │ ← Dark bg ✓
5705│ 2:00 PM        │   Light text ✓
5706└────────────────┘
5707
5708Perfectly matches wiki!
5709```
5710
5711### CSS Variables Used
5712
5713**Wiki Default theme now uses**:
5714- `--__background__` - Main background (panel body)
5715- `--__background_alt__` - Alternate bg (panel header, events)
5716- `--__text__` - Text color (header text)
5717- `--__border__` - Border color (panel border, event borders)
5718
5719**With fallbacks**:
5720```css
5721var(--__background__, #fff)           /* white fallback */
5722var(--__background_alt__, #e8e8e8)    /* light gray fallback */
5723var(--__text__, #333)                 /* dark text fallback */
5724var(--__border__, #ccc)               /* gray border fallback */
5725```
5726
5727### Perfect Adaptation
5728
5729**Light Templates**:
5730- Light panel backgrounds ✓
5731- Dark text ✓
5732- Subtle borders ✓
5733- Clean appearance ✓
5734
5735**Dark Templates**:
5736- Dark panel backgrounds ✓
5737- Light text ✓
5738- Visible borders ✓
5739- Perfect contrast ✓
5740
5741**Custom Templates**:
5742- Uses template's CSS variables ✓
5743- Automatic adaptation ✓
5744- Seamless integration ✓
5745
5746### Now Truly Adaptive
5747
5748Wiki Default theme now properly uses DokuWiki CSS variables for:
5749- ✅ Calendar grid
5750- ✅ Sidebar widget
5751- ✅ Event list
5752- ✅ **Day panel** ← v5.0.2!
5753- ✅ All backgrounds
5754- ✅ All text
5755- ✅ All borders
5756
5757**Complete wiki integration!** ��
5758
5759## Version 5.0.1 (2026-02-08) - THEME CONFLICT TOOLTIPS
5760
5761### �� Enhanced: Time Conflict Tooltips Now Themed
5762- **Fixed:** Conflict tooltips now match calendar theme
5763- **Added:** Theme-aware background, border, text colors
5764- **Added:** Theme-aware shadow effects
5765- **Result:** Complete visual consistency!
5766
5767### Tooltip Theming
5768
5769**Now uses theme colors for**:
5770- Background: Theme background color
5771- Border: Theme border color
5772- Header text: Theme primary text color
5773- Item text: Theme dim text color
5774- Shadow: Theme shadow color
5775
5776### Before vs After
5777
5778**Before (v5.0.0)**:
5779```
5780Hover ⚠️ badge:
5781┌─────────────────┐
5782│ ⚠️ Time Conflicts│ ← Default colors
5783│ • Event A       │
5784│ • Event B       │
5785└─────────────────┘
5786```
5787
5788**After (v5.0.1)**:
5789```
5790Matrix Theme:
5791┌─────────────────┐
5792│ ⚠️ Time Conflicts│ ← Green header
5793│ • Event A       │ ← Green text
5794│ • Event B       │   Dark green bg
5795└─────────────────┘
5796
5797Purple Theme:
5798┌─────────────────┐
5799│ ⚠️ Time Conflicts│ ← Purple header
5800│ • Event A       │ ← Purple text
5801│ • Event B       │   Dark purple bg
5802└─────────────────┘
5803
5804Professional Theme:
5805┌─────────────────┐
5806│ ⚠️ Time Conflicts│ ← Blue header
5807│ • Event A       │ ← Dark text
5808│ • Event B       │   Light bg
5809└─────────────────┘
5810
5811Pink Theme:
5812┌─────────────────┐
5813│ ⚠️ Time Conflicts│ ← Pink header ✨
5814│ • Event A       │ ← Pink text
5815│ • Event B       │   Dark pink bg ��
5816└─────────────────┘
5817
5818Wiki Default:
5819┌─────────────────┐
5820│ ⚠️ Time Conflicts│ ← Adapts to wiki
5821│ • Event A       │ ← Wiki colors
5822│ • Event B       │
5823└─────────────────┘
5824```
5825
5826### Now 100% Complete
5827
5828**Every tooltip themed**:
5829- ✅ Conflict tooltips
5830- ✅ All other tooltips (if any)
5831- ✅ Perfect consistency
5832
5833**Absolute perfection!** ✨
5834
5835## Version 5.0.0 (2026-02-08) - MAJOR RELEASE: COMPLETE THEMING PERFECTION
5836
5837### �� Major Milestone: Version 5.0
5838
5839This 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.
5840
5841### Complete Feature Set
5842
5843**5 Beautiful Themes**:
5844- �� Matrix Edition (Green with glow)
5845- �� Purple Dream (Elegant purple)
5846- �� Professional Blue (Clean and modern)
5847- �� Pink Bling (Maximum sparkle)
5848- �� Wiki Default (Auto-adapts to your DokuWiki theme)
5849
5850**100% Theme Coverage**:
5851- ✅ Calendar grid and cells
5852- ✅ Event boxes and borders
5853- ✅ Sidebar widget
5854- ✅ Event list panel
5855- ✅ Search functionality
5856- ✅ Edit/Add dialogs (complete)
5857- ✅ Day popup dialogs
5858- ✅ Month picker
5859- ✅ All text (primary, dim, bright)
5860- ✅ All buttons
5861- ✅ All inputs and forms
5862- ✅ All checkboxes
5863- ✅ All borders
5864- ✅ All badges and labels
5865- ✅ Event highlight effects
5866
5867**Perfect Visual Consistency**:
5868- No white pixels anywhere
5869- No unthemed elements
5870- No default colors
5871- Complete visual unity
5872
5873### Major Improvements in v5.0
5874
58751. **Complete Dialog Theming** (v4.8.5-4.8.7)
5876   - Edit event dialog fully themed
5877   - Day popup dialog fully themed
5878   - All form inputs themed
5879   - All checkboxes themed
5880   - All buttons themed
5881
58822. **Event Box Border Perfection** (v4.8.6)
5883   - All 4 borders themed (top, right, bottom, left)
5884   - Sidebar event dividers themed
5885   - Past Events toggle border themed
5886
58873. **Checkbox Field Borders** (v4.9.0)
5888   - Repeating Event section border themed
5889   - Task checkbox section border themed
5890
58914. **Wiki Default Theme** (v4.10.0)
5892   - New 5th theme
5893   - Uses DokuWiki CSS variables
5894   - Auto-adapts to any wiki template
5895   - Perfect for seamless integration
5896
58975. **Clean Text Appearance** (v4.11.0)
5898   - Removed text glow from Matrix
5899   - Removed text glow from Purple
5900   - Removed text glow from Professional
5901   - Removed text glow from Wiki Default
5902   - Kept text glow on Pink Bling only
5903
59046. **Event Highlight Effects** (v4.12.0-4.12.1)
5905   - Theme-aware highlight glow
5906   - Click event bar → event glows
5907   - 3-second themed glow effect
5908   - Smooth animations
5909
5910### See RELEASE_NOTES.md for Complete Details
5911
5912For a comprehensive overview of all features, themes, and improvements, see the new **RELEASE_NOTES.md** file included in this release.
5913
5914## Version 4.12.1 (2026-02-08) - FIX EVENT HIGHLIGHT FUNCTION
5915
5916### �� Fixed: Event Highlight Now Working
5917- **Fixed:** Used setProperty() to properly apply !important styles
5918- **Added:** Console logging for debugging
5919- **Fixed:** Proper style application with important flag
5920- **Result:** Highlight glow now works correctly!
5921
5922### Technical Fix
5923
5924**Before (not working)**:
5925```javascript
5926eventItem.style.background = color + ' !important'; // Doesn't work
5927```
5928
5929**After (working)**:
5930```javascript
5931eventItem.style.setProperty('background', color, 'important'); // Works!
5932```
5933
5934### Added Debug Logging
5935
5936Console now shows:
5937- "Highlighting event: [calId] [eventId] [date]"
5938- "Found event item: [element]"
5939- "Theme: [theme name]"
5940- "Highlight colors: [bg] [shadow]"
5941- "Applied highlight styles"
5942- "Removing highlight" (after 3 seconds)
5943
5944### Now Working
5945
5946Click any event bar → Event glows with theme colors ✓
5947
5948## Version 4.12.0 (2026-02-08) - THEME-AWARE EVENT HIGHLIGHT GLOW
5949
5950### ✨ Enhanced: Event Click Highlight Now Theme-Aware
5951- **Fixed:** Restored event highlight glow when clicking calendar bars
5952- **Improved:** Highlight now matches each theme's colors
5953- **Added:** Stronger glow effect for better visibility
5954- **Duration:** 3 seconds with smooth fade
5955- **Result:** Beautiful themed highlights for all themes!
5956
5957### How It Works
5958
5959When you click an event bar in the calendar, the corresponding event in the event list now highlights with a themed glow:
5960
5961**Matrix Theme**:
5962```javascript
5963Background: Darker green (#1a3d1a)
5964Glow: Double green glow (0 0 20px + 0 0 40px)
5965Color: rgba(0, 204, 7, 0.8)
5966```
5967
5968**Purple Theme**:
5969```javascript
5970Background: Darker purple (#3d2b4d)
5971Glow: Double purple glow
5972Color: rgba(155, 89, 182, 0.8)
5973```
5974
5975**Professional Theme**:
5976```javascript
5977Background: Light blue (#e3f2fd)
5978Glow: Single blue glow
5979Color: rgba(74, 144, 226, 0.4)
5980```
5981
5982**Pink Theme**:
5983```javascript
5984Background: Darker pink (#3d2030)
5985Glow: Double pink glow ✨��
5986Color: rgba(255, 20, 147, 0.8)
5987```
5988
5989**Wiki Theme**:
5990```javascript
5991Background: var(--__background_neu__)
5992Glow: Blue glow (adapts to wiki)
5993Color: rgba(43, 115, 183, 0.4)
5994```
5995
5996### Visual Examples
5997
5998**Matrix - Click Event**:
5999```
6000Calendar:
6001┌─────────────┐
6002│ 2:00 PM │ ← Click this bar
6003└─────────────┘
6004
6005Event List:
6006╔═════════════════════╗
6007║ Team Meeting        ║ ← GLOWS GREEN
6008║ 2:00 PM             ║    for 3 seconds
6009╚═════════════════════╝
6010   ↑↑↑ Strong green glow ↑↑↑
6011```
6012
6013**Purple - Click Event**:
6014```
6015Calendar:
6016┌─────────────┐
6017│ 4:00 PM │ ← Click
6018└─────────────┘
6019
6020Event List:
6021╔═════════════════════╗
6022║ Code Review         ║ ← GLOWS PURPLE
6023║ 4:00 PM             ║    for 3 seconds
6024╚═════════════════════╝
6025   ↑↑↑ Strong purple glow ↑↑↑
6026```
6027
6028**Pink - Click Event**:
6029```
6030Calendar:
6031┌─────────────┐
6032│ 1:00 PM │ ← Click
6033└─────────────┘
6034
6035Event List:
6036╔═════════════════════╗
6037║ Lunch Date ��       ║ ← GLOWS PINK
6038║ 1:00 PM ✨          ║    for 3 seconds
6039╚═════════════════════╝
6040   ↑↑↑ MAXIMUM SPARKLE ↑↑↑
6041```
6042
6043### Glow Specifications
6044
6045**Matrix**:
6046- Background: Dark green
6047- Shadow: `0 0 20px rgba(0, 204, 7, 0.8)`
6048- Outer glow: `0 0 40px rgba(0, 204, 7, 0.4)`
6049- Effect: Strong green pulse
6050
6051**Purple**:
6052- Background: Dark purple
6053- Shadow: `0 0 20px rgba(155, 89, 182, 0.8)`
6054- Outer glow: `0 0 40px rgba(155, 89, 182, 0.4)`
6055- Effect: Strong purple pulse
6056
6057**Professional**:
6058- Background: Light blue
6059- Shadow: `0 0 20px rgba(74, 144, 226, 0.4)`
6060- Effect: Subtle blue glow
6061
6062**Pink**:
6063- Background: Dark pink
6064- Shadow: `0 0 20px rgba(255, 20, 147, 0.8)`
6065- Outer glow: `0 0 40px rgba(255, 20, 147, 0.4)`
6066- Effect: MAXIMUM SPARKLE ✨��
6067
6068**Wiki**:
6069- Background: Theme neutral color
6070- Shadow: `0 0 20px rgba(43, 115, 183, 0.4)`
6071- Effect: Adapts to wiki theme
6072
6073### User Experience
6074
6075**Click event bar** → Event highlights with themed glow
6076**Auto-scroll** → Event scrolls into view smoothly
6077**3 second glow** → Fade out after 3 seconds
6078**Smooth transition** → 0.3s ease-in-out
6079
6080### Perfect for Finding Events
6081
6082**Large event lists**: Quickly locate the clicked event ✓
6083**Visual feedback**: Know which event you clicked ✓
6084**Theme consistency**: Matches your chosen theme ✓
6085**Smooth animation**: Professional appearance ✓
6086
6087### All Themes Covered
6088
6089- ✅ Matrix: Green glow
6090- ✅ Purple: Purple glow
6091- ✅ Professional: Blue glow
6092- ✅ Pink: Maximum pink sparkle
6093- ✅ Wiki: Adaptive glow
6094
6095**Click any event bar and watch it glow!** ✨
6096
6097## Version 4.11.0 (2026-02-08) - REMOVE TEXT GLOW FROM NON-PINK THEMES
6098
6099### �� Changed: Text Glow Now Pink-Only
6100- **Removed:** Text shadow/glow from Matrix theme
6101- **Removed:** Text shadow/glow from Purple theme
6102- **Removed:** Text shadow/glow from Professional theme (already had none)
6103- **Removed:** Text shadow/glow from Wiki Default theme
6104- **Kept:** Text shadow/glow ONLY on Pink Bling theme
6105- **Result:** Cleaner look for Matrix, Purple, and Wiki themes!
6106
6107### All Changes
6108
6109**Before (Matrix, Purple)**:
6110```css
6111text-shadow: 0 0 2px $text_color; /* Glow effect */
6112```
6113
6114**After (Matrix, Purple, Professional, Wiki)**:
6115```css
6116text-shadow: none; /* Clean, no glow */
6117```
6118
6119**Pink Bling (unchanged)**:
6120```css
6121text-shadow: 0 0 2px $text_color; /* Still has glow ✨ */
6122```
6123
6124### Text Shadow Removed From
6125
6126**Sidebar day numbers**: No glow ✓
6127**Event titles**: No glow ✓
6128**Event dates**: No glow ✓
6129**Add Event button**: No glow ✓
6130**Day popup events**: No glow ✓
6131
6132### Before vs After
6133
6134**BEFORE (Matrix)**:
6135```
6136Event Title ✨ ← Glowing green text
61372:00 PM ✨     ← Glowing text
6138```
6139
6140**AFTER (Matrix)**:
6141```
6142Event Title    ← Clean green text
61432:00 PM        ← Clean text
6144```
6145
6146**Pink Bling (Still Glows)**:
6147```
6148Event Title ✨�� ← Still glowing!
61492:00 PM ✨     ← Maximum sparkle!
6150```
6151
6152### Theme Appearances
6153
6154**�� Matrix Edition**:
6155- Clean green text
6156- No glow effects
6157- Professional appearance
6158- Still has border glow
6159
6160**�� Purple Dream**:
6161- Clean purple text
6162- No glow effects
6163- Elegant appearance
6164- Still has border glow
6165
6166**�� Professional Blue**:
6167- Clean text (unchanged)
6168- No glow effects
6169- Modern appearance
6170
6171**�� Pink Bling**:
6172- Glowing pink text ✨
6173- Maximum glow effects ��
6174- Sparkle everywhere!
6175- All the bling!
6176
6177**�� Wiki Default**:
6178- Clean text
6179- No glow effects
6180- Matches wiki theme
6181
6182### Glow Effects Remaining
6183
6184**Border/box glow**: Still present on all themes ✓
6185**Pink text glow**: Only on Pink Bling ✓
6186**Shadow effects**: Still on buttons/boxes6187
6188**Only TEXT glow removed from non-pink themes!**
6189
6190### Result
6191
6192**Cleaner, more professional look** for:
6193- Matrix ✓
6194- Purple ✓
6195- Professional ✓
6196- Wiki Default ✓
6197
6198**Maximum sparkle** for:
6199- Pink Bling ✨��✓
6200
6201**Best of both worlds!** ��
6202
6203## Version 4.10.0 (2026-02-08) - NEW WIKI DEFAULT THEME
6204
6205### �� New: Wiki Default Theme
6206- **Added:** 5th theme that automatically matches your DokuWiki template
6207- **Uses:** CSS variables from your wiki theme
6208- **Adapts:** Automatically works with light and dark themes
6209- **Perfect:** Seamless integration with any DokuWiki template
6210
6211### How It Works
6212
6213**Wiki theme uses DokuWiki CSS variables**:
6214```css
6215bg: var(--__background_site__, #f5f5f5)
6216border: var(--__border__, #ccc)
6217text_primary: var(--__text__, #333)
6218text_bright: var(--__link__, #2b73b7)
6219text_dim: var(--__text_neu__, #666)
6220cell_bg: var(--__background__, #fff)
6221grid_border: var(--__border__, #ccc)
6222```
6223
6224**With fallbacks for older DokuWiki versions**:
6225- If CSS variables exist → Use them ✓
6226- If not available → Use fallback values ✓
6227
6228### All 5 Themes
6229
6230**1. �� Matrix Edition** (Default)
6231- Dark green with neon glow
6232- Matrix-style effects
6233- Original theme
6234
6235**2. �� Purple Dream**
6236- Rich purple with violet accents
6237- Elegant and sophisticated
6238- Soft glow effects
6239
6240**3. �� Professional Blue**
6241- Clean blue and grey
6242- Modern professional
6243- No glow effects
6244
6245**4. �� Pink Bling**
6246- Glamorous hot pink
6247- Maximum sparkle ✨
6248- Hearts and diamonds
6249
6250**5. �� Wiki Default** ← NEW!
6251- Matches your wiki template
6252- Auto-adapts to light/dark
6253- Perfect integration
6254
6255### Examples
6256
6257**Light Wiki Template**:
6258```
6259Wiki Default theme shows:
6260- Light backgrounds (#f5f5f5)
6261- Dark text (#333)
6262- Light inputs (#fff)
6263- Gray borders (#ccc)
6264
6265Matches perfectly! ✓
6266```
6267
6268**Dark Wiki Template**:
6269```
6270Wiki Default theme shows:
6271- Dark backgrounds (from template)
6272- Light text (from template)
6273- Dark inputs (from template)
6274- Dark borders (from template)
6275
6276Matches perfectly! ✓
6277```
6278
6279**Bootstrap Template**:
6280```
6281Uses Bootstrap's colors
6282Matches perfectly! ✓
6283```
6284
6285**Material Template**:
6286```
6287Uses Material's colors
6288Matches perfectly! ✓
6289```
6290
6291### CSS Variables Used
6292
6293**DokuWiki provides**:
6294- `--__background_site__`: Page background
6295- `--__background_alt__`: Section backgrounds
6296- `--__background__`: Content backgrounds
6297- `--__text__`: Primary text color
6298- `--__link__`: Link color
6299- `--__text_neu__`: Dimmed text
6300- `--__border__`: Border color
6301- `--__background_neu__`: Neutral background
6302
6303**All with fallbacks**:
6304```css
6305var(--__background_site__, #f5f5f5)
6306/* Falls back to light gray if variable doesn't exist */
6307```
6308
6309### Perfect for Every Template
6310
6311**Custom templates**: Automatically adapts ✓
6312**Light themes**: Perfect match ✓
6313**Dark themes**: Perfect match ✓
6314**Any DokuWiki version**: Works with fallbacks ✓
6315
6316### Complete Theme Collection
6317
6318Now with **5 gorgeous themes**:
6319- 3 dark themes (Matrix, Purple, Pink)
6320- 1 light theme (Professional)
6321- 1 adaptive theme (Wiki Default) ← NEW!
6322
6323**Something for everyone!** ��
6324
6325## Version 4.9.0 (2026-02-08) - FIX CHECKBOX FIELD BORDERS
6326
6327### �� Fixed: Checkbox Field Borders Themed
6328- **Fixed:** Added border-color to checkbox field divs
6329- **Fixed:** Repeating Event section border
6330- **Fixed:** Task checkbox section border
6331- **Result:** No white borders around checkboxes!
6332
6333### Changes
6334
6335**Checkbox Field Border Styling**:
6336
6337**Before**:
6338```html
6339<div class="form-field-checkbox"
6340     style="background: $bg !important;">
6341<!-- Border shows white ✗ -->
6342```
6343
6344**After**:
6345```php
6346<div class="form-field-checkbox"
6347     style="background: $bg !important;
6348            border-color: $grid_border !important;">
6349<!-- Border themed ✓ -->
6350```
6351
6352### Before vs After
6353
6354**BEFORE (v4.8.8)**:
6355```
6356Edit Dialog:
6357┌──────────────────┐
6358│ ☑ Repeating     ║│ ← White border ✗
6359└──────────────────┘
6360┌──────────────────┐
6361│ ☑ Task checkbox ║│ ← White border ✗
6362└──────────────────┘
6363```
6364
6365**AFTER (v4.9.0)**:
6366```
6367Matrix Edit Dialog:
6368┌──────────────────┐
6369│ ☑ Repeating      │ ← Green border ✓
6370└──────────────────┘
6371┌──────────────────┐
6372│ ☑ Task checkbox  │ ← Green border ✓
6373└──────────────────┘
6374```
6375
6376### ABSOLUTE PERFECTION ACHIEVED
6377
6378**Every element themed**:
6379- ✅ All inputs
6380- ✅ All labels
6381- ✅ All sections
6382- ✅ **Checkbox field borders** ← v4.9.0!
6383- ✅ All buttons
6384- ✅ All checkboxes
6385- ✅ No white anywhere
6386
6387**100% COMPLETE!** ��✨
6388
6389## Version 4.8.8 (2026-02-08) - FINAL FIXES: CHECKBOXES, BORDERS, BACKGROUNDS
6390
6391### �� Fixed: Checkbox Field Borders Themed
6392- **Fixed:** Added border-color to checkbox field divs
6393- **Fixed:** Repeating Event section border
6394- **Fixed:** Task checkbox section border
6395- **Result:** No white borders around checkboxes!
6396
6397### �� Fixed: Admin Sections Respect Wiki Theme
6398- **Fixed:** All admin backgrounds use CSS variables
6399- **Fixed:** Text colors use wiki text color
6400- **Fixed:** Borders use wiki border color
6401- **Result:** Admin matches wiki theme perfectly!
6402
6403### All Changes
6404
6405**1. Checkbox Field Border Styling**:
6406
6407**Before**:
6408```html
6409<div class="form-field-checkbox"
6410     style="background: $bg !important;">
6411<!-- Border shows white ✗ -->
6412```
6413
6414**After**:
6415```php
6416<div class="form-field-checkbox"
6417     style="background: $bg !important;
6418            border-color: $grid_border !important;">
6419<!-- Border themed ✓ -->
6420```
6421
6422**2. Admin CSS Variables**:
6423
6424**Added CSS variables for wiki theme compatibility**:
6425```css
6426.calendar-admin-wrapper {
6427    background: var(--__background_site__, #f5f5f5);
6428    color: var(--__text__, #333);
6429}
6430.calendar-admin-section {
6431    background: var(--__background_alt__, #fafafa);
6432}
6433.calendar-admin-input {
6434    background: var(--__background__, #fff);
6435    color: var(--__text__, #333);
6436}
6437```
6438
6439**Replaced hardcoded colors**:
6440```php
6441// Before:
6442background: #f9f9f9
6443background: white
6444color: #333
6445border: 1px solid #ddd
6446
6447// After:
6448background: var(--__background_alt__, #f9f9f9)
6449background: var(--__background__, #fff)
6450color: var(--__text__, #333)
6451border: 1px solid var(--__border__, #ddd)
6452```
6453
6454### Before vs After
6455
6456**BEFORE (v4.8.8)**:
6457```
6458Edit Dialog:
6459┌──────────────────┐
6460│ ☑ Repeating     ║│ ← White border ✗
6461└──────────────────┘
6462┌──────────────────┐
6463│ ☑ Task checkbox ║│ ← White border ✗
6464└──────────────────┘
6465
6466Admin Page (Dark Wiki Theme):
6467┌──────────────────┐
6468│ Light sections  │ ← White boxes ✗
6469│ Light inputs    │ ← Doesn't match ✗
6470└──────────────────┘
6471```
6472
6473**AFTER (v4.8.9)**:
6474```
6475Matrix Edit Dialog:
6476┌──────────────────┐
6477│ ☑ Repeating      │ ← Green border ✓
6478└──────────────────┘
6479┌──────────────────┐
6480│ ☑ Task checkbox  │ ← Green border ✓
6481└──────────────────┘
6482
6483Admin (Dark Wiki Theme):
6484┌──────────────────┐
6485│ Dark sections   │ ← Matches wiki ✓
6486│ Dark inputs     │ ← Perfect match ✓
6487└──────────────────┘
6488```
6489
6490### Admin Theme Examples
6491
6492**Light Wiki Theme**:
6493```
6494Admin page backgrounds: Light
6495Section boxes: Light gray
6496Inputs: White
6497Borders: Gray
6498Text: Dark
6499
6500Perfect match! ✓
6501```
6502
6503**Dark Wiki Theme**:
6504```
6505Admin page backgrounds: Dark
6506Section boxes: Darker gray
6507Inputs: Dark
6508Borders: Dark gray
6509Text: Light
6510
6511Perfect match! ✓
6512```
6513
6514**DokuWiki Default**:
6515```
6516Uses wiki's CSS variables
6517Automatically adapts
6518Always matches! ✓
6519```
6520
6521### Complete Coverage
6522
6523**Edit Dialog**:
6524- ✅ All inputs themed
6525- ✅ All labels themed
6526- ✅ All sections themed
6527- ✅ **Checkbox borders** ← v4.8.9!
6528- ✅ All buttons themed
6529- ✅ No white anywhere
6530
6531**Admin Interface**:
6532- ✅ **Tab navigation** ← v4.8.9!
6533- ✅ **Section boxes** ← v4.8.9!
6534- ✅ **Input fields** ← v4.8.9!
6535- ✅ **Text colors** ← v4.8.9!
6536- ✅ **Borders** ← v4.8.9!
6537- ✅ All tabs (Manage, Update, Outlook, Themes)
6538
6539### CSS Variables Used
6540
6541**DokuWiki provides these**:
6542- `--__background_site__`: Page background
6543- `--__background_alt__`: Alternate background
6544- `--__background__`: Primary background (inputs)
6545- `--__text__`: Text color
6546- `--__border__`: Border color
6547
6548**Fallbacks provided for older DokuWiki**:
6549```css
6550var(--__background_site__, #f5f5f5)
6551var(--__background_alt__, #fafafa)
6552var(--__background__, #fff)
6553var(--__text__, #333)
6554var(--__border__, #ddd)
6555```
6556
6557### Perfect Adaptation
6558
6559**Admin now adapts to ANY wiki theme**:
6560- Light themes → Light admin ✓
6561- Dark themes → Dark admin ✓
6562- Custom themes → Matches perfectly ✓
6563- No hardcoded colors ✓
6564
6565**Calendar themes still work**:
6566- Matrix, Purple, Professional, Pink ✓
6567- Independent from wiki theme ✓
6568- Admin respects wiki ✓
6569- Calendar respects calendar theme ✓
6570
6571### FINAL PERFECTION
6572
6573**Frontend (Calendar)**:
6574- Complete theming ✓
6575- 4 beautiful themes ✓
6576- Every pixel themed ✓
6577
6578**Backend (Admin)**:
6579- Respects wiki theme ✓
6580- Works with any theme ✓
6581- Perfect compatibility ✓
6582
6583**ABSOLUTELY EVERYTHING THEMED!** ����✨
6584
6585## Version 4.8.8 (2026-02-08) - FINAL FIXES: CHECKBOXES, BORDERS, BACKGROUNDS
6586
6587### �� Fixed: Task Checkboxes Now Fully Themed
6588- **Fixed:** Added background-color and border inline
6589- **Fixed:** Both PHP and JavaScript versions
6590- **Result:** No white checkboxes!
6591
6592### �� Fixed: Past Events Toggle Border
6593- **Fixed:** Added !important to border styling
6594- **Fixed:** Explicit top and bottom borders
6595- **Result:** No white line under toggle!
6596
6597### �� Fixed: Form Field Section Backgrounds
6598- **Fixed:** All form-field and form-row-group backgrounds
6599- **Fixed:** Every section in edit dialog
6600- **Result:** No white sections anywhere!
6601
6602### All Changes
6603
6604**1. Task Checkbox Styling**:
6605
6606**Before**:
6607```php
6608style="accent-color: $border !important;"
6609<!-- Only accent, background still white ✗ -->
6610```
6611
6612**After**:
6613```php
6614style="accent-color: $border !important;
6615       background-color: $cell_bg !important;
6616       border: 2px solid $grid_border !important;"
6617<!-- Full theming ✓ -->
6618```
6619
6620**2. Past Events Toggle Border**:
6621
6622**Before**:
6623```php
6624style="border-color: $grid_border;"
6625<!-- No !important, CSS overrides ✗ -->
6626```
6627
6628**After**:
6629```php
6630style="border-color: $grid_border !important;
6631       border-top: 1px solid $grid_border !important;
6632       border-bottom: 1px solid $grid_border !important;"
6633<!-- Cannot be overridden ✓ -->
6634```
6635
6636**3. Form Field Backgrounds**:
6637
6638**Before**:
6639```html
6640<div class="form-field">
6641<div class="form-row-group">
6642<!-- No background, shows white ✗ -->
6643```
6644
6645**After**:
6646```php
6647<div class="form-field" style="background: $bg !important;">
6648<div class="form-row-group" style="background: $bg !important;">
6649<!-- Fully themed ✓ -->
6650```
6651
6652### Before vs After
6653
6654**BEFORE (v4.8.7)**:
6655```
6656Event:
6657□ Task checkbox  ← White checkbox ✗
6658
6659Past Events
6660▶ Past Events (3) ← White line below ✗
6661─────────────────
6662
6663Edit Dialog:
6664┌──────────────┐
6665│ Form fields  │ ← White sections ✗
6666└──────────────┘
6667```
6668
6669**AFTER (v4.8.8)**:
6670```
6671Matrix Event:
6672☑ Task checkbox  ← Green checkbox ✓
6673
6674Past Events
6675▶ Past Events (3) ← Green border ✓
6676─────────────────
6677
6678Matrix Edit Dialog:
6679┌──────────────┐
6680│ Form fields  │ ← Dark green ✓
6681└──────────────┘
6682```
6683
6684### Complete Examples
6685
6686**Matrix Theme**:
6687```
6688Task Checkbox:
6689☑ Checked   → Green checkmark, green bg
6690☐ Unchecked → Green border, dark green bg ✓
6691
6692Past Events Toggle:
6693▶ Past Events (3)
6694─────────────────── Green border ✓
6695
6696Edit Dialog:
6697All sections dark green ✓
6698No white anywhere ✓
6699```
6700
6701**Purple Theme**:
6702```
6703Task Checkbox:
6704☑ Checked   → Purple checkmark, purple bg
6705☐ Unchecked → Purple border, dark purple bg ✓
6706
6707Past Events Toggle:
6708▶ Past Events (3)
6709─────────────────── Purple border ✓
6710
6711Edit Dialog:
6712All sections dark purple ✓
6713```
6714
6715**Professional Theme**:
6716```
6717Task Checkbox:
6718☑ Checked   → Blue checkmark, white bg
6719☐ Unchecked → Gray border, white bg ✓
6720
6721Past Events Toggle:
6722▶ Past Events (3)
6723─────────────────── Gray border ✓
6724
6725Edit Dialog:
6726All sections light ✓
6727```
6728
6729**Pink Theme**:
6730```
6731Task Checkbox:
6732☑ Checked   → Pink checkmark, pink bg ✨
6733☐ Unchecked → Pink border, dark pink bg ✓
6734
6735Past Events Toggle:
6736▶ Past Events (3)
6737─────────────────── Pink border ��
6738
6739Edit Dialog:
6740All sections dark pink ✓
6741```
6742
6743### Checkbox Visual
6744
6745**Matrix - Unchecked**:
6746```
6747┌─────┐
6748│     │ ← Dark green background
6749│     │   Green border
6750└─────┘
6751```
6752
6753**Matrix - Checked**:
6754```
6755┌─────┐
6756│ ✓   │ ← Dark green background
6757│     │   Green checkmark
6758└─────┘
6759```
6760
6761### Past Events Border
6762
6763**Before**:
6764```
6765▶ Past Events (3)
6766─────────────────── White line ✗
6767```
6768
6769**After**:
6770```
6771▶ Past Events (3)
6772─────────────────── Green line ✓ (Matrix)
6773                    Purple line ✓ (Purple)
6774                    Gray line ✓ (Professional)
6775                    Pink line ✓ (Pink)
6776```
6777
6778### Form Field Coverage
6779
6780**All sections themed**:
6781- ✅ Title field
6782- ✅ Namespace field
6783- ✅ Description field
6784- ✅ **Date row** ← v4.8.8!
6785- ✅ **Checkbox sections** ← v4.8.8!
6786- ✅ **Recurring options** ← v4.8.8!
6787- ✅ **Time row** ← v4.8.8!
6788- ✅ **Color row** ← v4.8.8!
6789- ✅ Button footer
6790
6791**Every div has background!** ✓
6792
6793### ABSOLUTE PERFECTION
6794
6795**Not a single white pixel**:
6796- ✅ No white checkboxes
6797- ✅ No white borders
6798- ✅ No white backgrounds
6799- ✅ No white sections
6800- ✅ No white lines
6801- ✅ No white anything
6802
6803**100% PERFECT THEMING!** ����✨
6804
6805## Version 4.8.7 (2026-02-08) - COMPLETE DIALOG & POPUP THEMING
6806
6807### �� Fixed: Checkbox Section Backgrounds Themed
6808- **Fixed:** Repeating Event section background
6809- **Fixed:** Task checkbox section background
6810- **Result:** No white backgrounds in dialog!
6811
6812### �� Fixed: Unchecked Task Checkboxes Themed
6813- **Fixed:** Added CSS for checkbox backgrounds
6814- **Fixed:** Unchecked boxes show theme colors
6815- **Result:** No white checkboxes!
6816
6817### �� Fixed: Day Popup Dialog Fully Themed
6818- **Fixed:** Popup container, header, body themed
6819- **Fixed:** Event items in popup themed
6820- **Fixed:** Add Event button themed
6821- **Fixed:** Footer section themed
6822- **Result:** Perfect popup theming!
6823
6824### All Changes
6825
6826**1. Checkbox Section Backgrounds**:
6827
6828**Before**:
6829```html
6830<div class="form-field-checkbox">
6831<!-- White background ✗ -->
6832```
6833
6834**After**:
6835```php
6836<div class="form-field-checkbox"
6837     style="background: $bg !important;">
6838<!-- Themed ✓ -->
6839```
6840
6841**2. Checkbox Background CSS**:
6842
6843**Added to style block**:
6844```css
6845.task-checkbox {
6846    background-color: $cell_bg !important;
6847    border: 2px solid $grid_border !important;
6848}
6849```
6850
6851**3. Day Popup Theming**:
6852
6853**Container**:
6854```javascript
6855style="background: $bg !important;
6856       border: 2px solid $border !important;
6857       box-shadow: 0 0 20px $shadow !important;"
6858```
6859
6860**Header**:
6861```javascript
6862style="background: $header_bg !important;
6863       color: $text_primary !important;
6864       border-bottom: 1px solid $border !important;"
6865```
6866
6867**Footer**:
6868```javascript
6869style="background: $bg !important;
6870       border-top: 1px solid $grid_border !important;"
6871```
6872
6873**Add Event Button**:
6874```javascript
6875style="background: $border !important;
6876       color: $bg !important;
6877       border-color: $border !important;"
6878```
6879
6880**Event Items**:
6881```javascript
6882style="background: $cell_bg !important;
6883       border: 1px solid $grid_border !important;"
6884```
6885
6886### Before vs After
6887
6888**BEFORE (v4.8.6)**:
6889```
6890Edit Dialog:
6891┌──────────────────┐
6892│ ☑ Repeating Event│ ← White background ✗
6893├──────────────────┤
6894│ ☑ Task checkbox  │ ← White background ✗
6895└──────────────────┘
6896
6897Day Popup:
6898┌──────────────────┐
6899│ Monday, Feb 8    │ ← White ✗
6900├──────────────────┤
6901│ Team Meeting     │ ← White ✗
6902│ 2:00 PM          │
6903├──────────────────┤
6904│ [+ Add Event]    │ ← White ✗
6905└──────────────────┘
6906
6907Task checkbox: ☐ ← White ✗
6908```
6909
6910**AFTER (v4.8.7)**:
6911```
6912Edit Dialog (Matrix):
6913┌──────────────────┐
6914│ ☑ Repeating Event│ ← Dark green ✓
6915├──────────────────┤
6916│ ☑ Task checkbox  │ ← Dark green ✓
6917└──────────────────┘
6918
6919Day Popup (Matrix):
6920┌──────────────────┐
6921│ Monday, Feb 8    │ ← Dark green ✓
6922├──────────────────┤
6923│ Team Meeting     │ ← Dark green ✓
6924│ 2:00 PM          │
6925├──────────────────┤
6926│ [+ Add Event]    │ ← Green button ✓
6927└──────────────────┘
6928
6929Task checkbox: ☑ ← Green ✓
6930```
6931
6932### Complete Examples
6933
6934**Matrix Dialog**:
6935```
6936┌──────────────────────────┐
6937│ ✏️ Edit Event            │
6938├──────────────────────────┤
6939│ �� Title: [_________]    │
6940│ �� Date: [__________]    │
6941│                          │
6942│ ☑ �� Repeating Event     │ ← Dark green bg
6943├──────────────────────────┤
6944│ ☑ �� Task checkbox       │ ← Dark green bg
6945├──────────────────────────┤
6946│ [Cancel] [�� Save]       │
6947└──────────────────────────┘
6948
6949All sections themed! ✓
6950```
6951
6952**Matrix Day Popup**:
6953```
6954┌──────────────────────────┐
6955│ Monday, February 8, 2026 │ ← Green header
6956├──────────────────────────┤
6957│ ┌──────────────────────┐ │
6958│ │ Team Meeting         │ │ ← Dark green
6959│ │ �� 2:00 PM           │ │
6960│ └──────────────────────┘ │
6961│ ┌──────────────────────┐ │
6962│ │ Code Review          │ │ ← Dark green
6963│ │ �� 4:00 PM           │ │
6964│ └──────────────────────┘ │
6965├──────────────────────────┤
6966│   [+ Add Event]          │ ← Green button
6967└──────────────────────────┘
6968```
6969
6970**Purple Day Popup**:
6971```
6972┌──────────────────────────┐
6973│ Monday, February 8, 2026 │ ← Purple header
6974├──────────────────────────┤
6975│ ┌──────────────────────┐ │
6976│ │ Team Meeting         │ │ ← Dark purple
6977│ │ �� 2:00 PM           │ │
6978│ └──────────────────────┘ │
6979├──────────────────────────┤
6980│   [+ Add Event]          │ ← Purple button
6981└──────────────────────────┘
6982```
6983
6984**Professional Day Popup**:
6985```
6986┌──────────────────────────┐
6987│ Monday, February 8, 2026 │ ← Light header
6988├──────────────────────────┤
6989│ ┌──────────────────────┐ │
6990│ │ Team Meeting         │ │ ← White
6991│ │ �� 2:00 PM           │ │
6992│ └──────────────────────┘ │
6993├──────────────────────────┤
6994│   [+ Add Event]          │ ← Blue button
6995└──────────────────────────┘
6996```
6997
6998**Pink Day Popup**:
6999```
7000┌──────────────────────────┐
7001│ Monday, February 8, 2026 │ ← Pink header ✨
7002├──────────────────────────┤
7003│ ┌──────────────────────┐ │
7004│ │ Team Meeting ��      │ │ ← Dark pink
7005│ │ �� 2:00 PM           │ │
7006│ └──────────────────────┘ │
7007├──────────────────────────┤
7008│   [+ Add Event]          │ ← Pink button
7009└──────────────────────────┘
7010```
7011
7012### Checkbox Theming
7013
7014**Unchecked boxes now themed**:
7015```
7016Matrix:
7017☐ → Dark green bg, green border ✓
7018
7019Purple:
7020☐ → Dark purple bg, purple border ✓
7021
7022Professional:
7023☐ → White bg, gray border ✓
7024
7025Pink:
7026☐ → Dark pink bg, pink border ✓
7027```
7028
7029### Complete Coverage
7030
7031**Edit Dialog - All Sections**:
7032- ✅ Header
7033- ✅ All inputs
7034- ✅ All labels
7035- ✅ **Checkbox sections** ← v4.8.7!
7036- ✅ Recurring options
7037- ✅ Button footer
7038- ✅ All checkboxes (checked & unchecked)
7039
7040**Day Popup - All Elements**:
7041- ✅ **Popup container** ← v4.8.7!
7042- ✅ **Header** ← v4.8.7!
7043- ✅ **Body** ← v4.8.7!
7044- ✅ **Event items** ← v4.8.7!
7045- ✅ **Namespace badges** ← v4.8.7!
7046- ✅ **Footer** ← v4.8.7!
7047- ✅ **Add Event button** ← v4.8.7!
7048- ✅ **No events message** ← v4.8.7!
7049
7050**Absolutely every dialog element themed!** ��✨
7051
7052### Perfect Theming Achievement
7053
7054**Every UI component in entire plugin**:
7055- ✅ Calendar grid
7056- ✅ Sidebar widget
7057- ✅ Event list
7058- ✅ Search bar
7059- ✅ Event boxes
7060- ✅ Edit dialog (complete)
7061- ✅ **Day popup** ← v4.8.7!
7062- ✅ Month picker
7063- ✅ All text
7064- ✅ All buttons
7065- ✅ All inputs
7066- ✅ **All checkboxes** ← v4.8.7!
7067- ✅ All borders
7068- ✅ All badges
7069- ✅ All backgrounds
7070
7071**NO WHITE ANYWHERE!** ��
7072
7073**100% COMPLETE THEMING ACHIEVED!** ��✨��
7074
7075## Version 4.8.6 (2026-02-08) - FIX DIALOG SECTIONS & EVENT BOX BORDERS
7076
7077### �� Fixed: Dialog Checkbox Sections Themed
7078- **Fixed:** Recurring options section background themed
7079- **Fixed:** Section has themed border accent
7080- **Result:** No white sections in dialog!
7081
7082### �� Fixed: Dialog Button Section Themed
7083- **Fixed:** Button area background themed
7084- **Fixed:** Top border separator themed
7085- **Result:** Complete dialog theming!
7086
7087### �� Fixed: Event Box Borders Themed
7088- **Fixed:** Top, right, bottom borders now themed
7089- **Fixed:** Left border remains event color
7090- **Result:** Perfect event boxes!
7091
7092### All Changes
7093
7094**1. Recurring Options Section**:
7095
7096**Before**:
7097```html
7098<div class="recurring-options" style="display:none;">
7099<!-- White background ✗ -->
7100```
7101
7102**After**:
7103```php
7104<div class="recurring-options"
7105     style="display:none;
7106            background: $bg !important;
7107            padding: 8px;
7108            border-left: 2px solid $border;
7109            margin-left: 4px;">
7110<!-- Themed with accent border ✓ -->
7111```
7112
7113**2. Dialog Actions Section**:
7114
7115**Before**:
7116```html
7117<div class="dialog-actions-sleek">
7118<!-- White background ✗ -->
7119```
7120
7121**After**:
7122```php
7123<div class="dialog-actions-sleek"
7124     style="background: $bg !important;
7125            border-top: 1px solid $grid_border !important;">
7126<!-- Themed with separator ✓ -->
7127```
7128
7129**3. Event Box Borders**:
7130
7131**Before**:
7132```php
7133border-left-color: $event_color;
7134<!-- Only left border colored ✗ -->
7135```
7136
7137**After**:
7138```php
7139border-left-color: $event_color;
7140border-top: 1px solid $grid_border !important;
7141border-right: 1px solid $grid_border !important;
7142border-bottom: 1px solid $grid_border !important;
7143<!-- All borders themed! ✓ -->
7144```
7145
7146### Before vs After
7147
7148**BEFORE (v4.8.5)**:
7149```
7150Dialog:
7151┌────────────────┐
7152│ ☑ Repeating    │
7153├────────────────┤ ← White section ✗
7154│ Repeat: Daily  │
7155│ Until: [____]  │
7156├────────────────┤
7157│ [Cancel] [Save]│ ← White footer ✗
7158└────────────────┘
7159
7160Event Box:
7161┌────────────┐
7162│Team Meeting│ ← White borders ✗
7163│2:00 PM     │
7164└────────────┘
7165```
7166
7167**AFTER (v4.8.6)**:
7168```
7169Matrix Dialog:
7170┌────────────────┐
7171│ ☑ Repeating    │
7172├────────────────┤ ← Dark green ✓
7173│ Repeat: Daily  │ Green accent border
7174│ Until: [____]  │
7175├────────────────┤
7176│ [Cancel] [Save]│ ← Dark green ✓
7177└────────────────┘
7178
7179Matrix Event Box:
7180┌────────────┐
7181│Team Meeting│ ← Green borders ✓
7182│2:00 PM     │
7183└────────────┘
7184```
7185
7186### Dialog Section Examples
7187
7188**Matrix Theme**:
7189```
7190┌──────────────────────────┐
7191│ ✏️ Edit Event            │
7192├──────────────────────────┤
7193│ ☑ �� Repeating Event     │
7194├║─────────────────────────┤ Green accent
7195│║ Repeat Every: Daily     │ Dark green bg
7196│║ Repeat Until: [_____]   │
7197└──────────────────────────┘
7198  [Cancel] [�� Save]       ← Dark green bg
7199──────────────────────────── Green border
7200```
7201
7202**Purple Theme**:
7203```
7204┌──────────────────────────┐
7205│ ☑ �� Repeating Event     │
7206├║─────────────────────────┤ Purple accent
7207│║ Repeat options...       │ Dark purple bg
7208└──────────────────────────┘
7209  [Cancel] [�� Save]       ← Dark purple bg
7210──────────────────────────── Purple border
7211```
7212
7213**Professional Theme**:
7214```
7215┌──────────────────────────┐
7216│ ☑ �� Repeating Event     │
7217├║─────────────────────────┤ Blue accent
7218│║ Repeat options...       │ Light bg
7219└──────────────────────────┘
7220  [Cancel] [�� Save]       ← Light bg
7221──────────────────────────── Gray border
7222```
7223
7224**Pink Theme**:
7225```
7226┌──────────────────────────┐
7227│ ☑ �� Repeating Event ✨  │
7228├║─────────────────────────┤ Pink accent
7229│║ Repeat options...       │ Dark pink bg ��
7230└──────────────────────────┘
7231  [Cancel] [�� Save]       ← Dark pink bg
7232──────────────────────────── Pink border
7233```
7234
7235### Event Box Border Visual
7236
7237**Before (v4.8.5)**:
7238```
7239Left border only:
7240█ Team Meeting
7241█ 2:00 PM
7242█ [Edit] [Delete]
7243
7244Only event color on left ✗
7245White on other 3 sides ✗
7246```
7247
7248**After (v4.8.6)**:
7249```
7250All borders themed:
7251┌─────────────┐
7252█Team Meeting │ ← Top: themed
7253█2:00 PM      │ ← Right: themed
7254█[Edit][Del]  │ ← Bottom: themed
7255└─────────────┘
7256
7257Left: Event color ✓
7258Other 3: Theme grid_border ✓
7259```
7260
7261### Matrix Event Box:
7262```
7263┌─────────────┐ Green border
7264│Team Meeting │
7265│2:00 PM      │
7266└─────────────┘ Green border
72677268Green left bar
7269```
7270
7271### Purple Event Box:
7272```
7273┌─────────────┐ Purple border
7274│Team Meeting │
7275│2:00 PM      │
7276└─────────────┘ Purple border
72777278Purple left bar
7279```
7280
7281### Professional Event Box:
7282```
7283┌─────────────┐ Gray border
7284│Team Meeting │
7285│2:00 PM      │
7286└─────────────┘ Gray border
72877288Event color left bar
7289```
7290
7291### Complete Dialog Coverage
7292
7293**All sections themed**:
7294- ✅ Dialog header
7295- ✅ Form inputs
7296- ✅ Checkbox labels
7297- ✅ **Recurring options** ← v4.8.6!
7298- ✅ **Button section** ← v4.8.6!
7299- ✅ All labels
7300- ✅ All buttons
7301
7302**No white sections!** ✓
7303
7304### Complete Event Box Coverage
7305
7306**All borders themed**:
7307- ✅ Left border (event color)
7308- ✅ **Top border** ← v4.8.6!
7309- ✅ **Right border** ← v4.8.6!
7310- ✅ **Bottom border** ← v4.8.6!
7311- ✅ Background
7312- ✅ Text
7313
7314**Perfect box outline!** ✓
7315
7316### Visual Perfection
7317
7318**Matrix theme event list**:
7319```
7320┌─────────────┐
7321│Team Meeting │ ← Green box
7322│2:00 PM      │
7323└─────────────┘
7324┌─────────────┐
7325│Code Review  │ ← Green box
7326│4:00 PM      │
7327└─────────────┘
7328
7329All borders green! ✓
7330```
7331
7332**ABSOLUTE PERFECT THEMING!** ��✨
7333
7334## Version 4.8.5 (2026-02-08) - THEME EVENT DIALOG & SIDEBAR BORDERS
7335
7336### �� Fixed: Event Dialog Fully Themed
7337- **Fixed:** Dialog background, header, inputs all themed
7338- **Fixed:** All labels, checkboxes, selects themed
7339- **Fixed:** Save and Cancel buttons themed
7340- **Result:** Dialog matches theme perfectly!
7341
7342### �� Fixed: Sidebar Event Borders Properly Themed
7343- **Fixed:** Event divider borders use grid_border color
7344- **Fixed:** Clean, subtle themed dividers
7345- **Result:** No more white borders in sidebar!
7346
7347### All Changes
7348
7349**1. Event Dialog Theming**:
7350
7351**Dialog container**:
7352```php
7353background: $themeStyles['bg'] !important;
7354border: 2px solid $themeStyles['border'] !important;
7355box-shadow: 0 0 20px $shadow !important;
7356```
7357
7358**Dialog header**:
7359```php
7360background: $themeStyles['header_bg'] !important;
7361color: $themeStyles['text_primary'] !important;
7362border-bottom: 1px solid $border !important;
7363```
7364
7365**All form inputs** (text, date, select, textarea):
7366```php
7367background: $themeStyles['cell_bg'] !important;
7368color: $themeStyles['text_primary'] !important;
7369border-color: $themeStyles['grid_border'] !important;
7370```
7371
7372**All labels**:
7373```php
7374color: $themeStyles['text_primary'] !important;
7375```
7376
7377**Checkboxes**:
7378```php
7379accent-color: $themeStyles['border'] !important;
7380```
7381
7382**Buttons**:
7383```php
7384// Cancel button:
7385background: $cell_bg !important;
7386color: $text_primary !important;
7387
7388// Save button:
7389background: $border !important;
7390color: $bg !important; (or white for professional)
7391```
7392
7393**2. Sidebar Event Borders**:
7394
7395**Before**:
7396```php
7397border-bottom: 1px solid rgba(0, 204, 7, 0.2); // Hardcoded
7398```
7399
7400**After**:
7401```php
7402borderColor = $themeStyles['grid_border'];
7403border-bottom: 1px solid $borderColor !important;
7404```
7405
7406### Before vs After
7407
7408**BEFORE (v4.8.4)**:
7409```
7410Event Dialog:
7411┌────────────────┐
7412│ Add Event      │ ← White background ✗
7413│ Title: [_____] │ ← White inputs ✗
7414│ Date:  [_____] │
7415│ [Cancel] [Save]│ ← Default buttons ✗
7416└────────────────┘
7417
7418Sidebar Events:
7419Event 1 ────────  ← White border ✗
7420Event 2 ────────  ← White border ✗
7421```
7422
7423**AFTER (v4.8.5)**:
7424```
7425Event Dialog (Matrix):
7426┌────────────────┐
7427│ Add Event      │ ← Dark green background ✓
7428│ Title: [_____] │ ← Dark green inputs ✓
7429│ Date:  [_____] │ ← Green text ✓
7430│ [Cancel] [Save]│ ← Themed buttons ✓
7431└────────────────┘
7432
7433Sidebar Events (Matrix):
7434Event 1 ────────  ← Green border ✓
7435Event 2 ────────  ← Green border ✓
7436```
7437
7438### Dialog Examples by Theme
7439
7440**Matrix Dialog**:
7441```
7442┌──────────────────────────┐
7443│ ✏️ Edit Event            │ ← Dark green header
7444├──────────────────────────┤
7445│ �� Title                 │ ← Green labels
7446│ [Team Meeting________]   │ ← Dark green input
7447│                          │
7448│ �� Start Date            │
7449│ [2026-02-08__]           │ ← Dark green input
7450│                          │
7451│ �� Start Time            │
7452│ [2:00 PM ▼]              │ ← Green select
7453│                          │
7454│ ☑ �� Repeating Event     │ ← Green checkbox
7455│                          │
7456│ [Cancel] [�� Save]       │ ← Themed buttons
7457└──────────────────────────┘
7458
7459Everything green! ✓
7460```
7461
7462**Purple Dialog**:
7463```
7464┌──────────────────────────┐
7465│ ✏️ Edit Event            │ ← Dark purple header
7466├──────────────────────────┤
7467│ [Inputs_______________]  │ ← Dark purple inputs
7468│ ☑ Checkboxes             │ ← Purple accent
7469│ [Cancel] [�� Save]       │ ← Purple buttons
7470└──────────────────────────┘
7471```
7472
7473**Professional Dialog**:
7474```
7475┌──────────────────────────┐
7476│ ✏️ Edit Event            │ ← Light gradient header
7477├──────────────────────────┤
7478│ [Inputs_______________]  │ ← White inputs
7479│ ☑ Checkboxes             │ ← Blue accent
7480│ [Cancel] [�� Save]       │ ← Blue save button
7481└──────────────────────────┘
7482```
7483
7484**Pink Dialog**:
7485```
7486┌──────────────────────────┐
7487│ ✏️ Edit Event            │ ← Dark pink header ✨
7488├──────────────────────────┤
7489│ [Inputs_______________]  │ ← Dark pink inputs ��
7490│ ☑ Checkboxes             │ ← Pink accent
7491│ [Cancel] [�� Save]       │ ← Pink buttons
7492└──────────────────────────┘
7493```
7494
7495### Complete Dialog Element Coverage
7496
7497**All form elements themed**:
7498- ✅ Dialog container
7499- ✅ Dialog header
7500- ✅ Close button (×)
7501- ✅ Title input
7502- ✅ Namespace search
7503- ✅ Namespace dropdown
7504- ✅ Description textarea
7505- ✅ Start date input
7506- ✅ End date input
7507- ✅ Recurring checkbox
7508- ✅ Recurrence type select
7509- ✅ Recurrence end date
7510- ✅ Start time select
7511- ✅ End time select
7512- ✅ Color select
7513- ✅ Custom color picker
7514- ✅ Task checkbox
7515- ✅ All labels
7516- ✅ Cancel button
7517- ✅ Save button
7518
7519**Every single dialog element themed!** ��
7520
7521### Sidebar Border Example
7522
7523**Matrix Sidebar**:
7524```
7525┌────────────────┐
7526│ Today          │ ← Green section header
7527├────────────────┤
7528│ Team Meeting   │
7529│ 2:00 PM        │
7530├────────────────┤ ← Green border (grid_border)
7531│ Code Review    │
7532│ 4:00 PM        │
7533├────────────────┤ ← Green border
7534│ Stand-up       │
7535│ All day        │
7536└────────────────┘
7537
7538Subtle green dividers! ✓
7539```
7540
7541### Complete Achievement
7542
7543**Every UI element themed**:
7544- ✅ Calendar
7545- ✅ Sidebar widget
7546- ✅ Event list
7547- ✅ Search bar
7548- ✅ **Event dialog** ← v4.8.5!
7549- ✅ Month picker
7550- ✅ **Sidebar dividers** ← v4.8.5!
7551- ✅ All text
7552- ✅ All inputs
7553- ✅ All buttons
7554- ✅ All borders
7555- ✅ All checkboxes
7556
7557**ABSOLUTE COMPLETE THEMING!** ��✨
7558
7559## Version 4.8.4 (2026-02-08) - FIX PROFESSIONAL THEME BACKGROUNDS
7560
7561### �� Fixed: Professional Theme Background Consistency
7562- **Fixed:** Container and event backgrounds now match sidebar
7563- **Fixed:** Lighter, cleaner appearance
7564- **Fixed:** Better contrast and readability
7565- **Result:** Professional theme looks cohesive!
7566
7567### The Problem
7568
7569**v4.8.3 Professional theme**:
7570```
7571Sidebar: Light background (#f5f7fa)
7572Calendar: Medium background (#e8ecf1) ← Didn't match!
7573Events: Light background (#f5f7fa)
7574
7575Inconsistent! ✗
7576```
7577
7578### The Fix
7579
7580**Updated Professional theme colors for consistency**:
7581
7582```php
7583// Before:
7584'bg' => '#e8ecf1',        // Medium gray-blue
7585'cell_bg' => '#f5f7fa',   // Very light
7586'grid_bg' => '#d5dbe3',   // Medium-dark
7587
7588// After:
7589'bg' => '#f5f7fa',        // Very light (matches sidebar)
7590'cell_bg' => '#ffffff',   // Pure white (clean)
7591'grid_bg' => '#e8ecf1',   // Subtle contrast
7592'grid_border' => '#d0d7de', // Softer borders
7593```
7594
7595### Before vs After
7596
7597**BEFORE (v4.8.3)**:
7598```
7599Professional Theme:
7600┌────────────────┐
7601│ Calendar       │ ← Medium gray (#e8ecf1)
7602│ ┌────────────┐ │
7603│ │ Event      │ │ ← Light (#f5f7fa)
7604│ └────────────┘ │
7605└────────────────┘
7606
7607Sidebar:
7608┌────────────────┐
7609│ Widget         │ ← Light (#f5f7fa)
7610└────────────────┘
7611
7612Backgrounds don't match! ✗
7613```
7614
7615**AFTER (v4.8.4)**:
7616```
7617Professional Theme:
7618┌────────────────┐
7619│ Calendar       │ ← Light (#f5f7fa)
7620│ ┌────────────┐ │
7621│ │ Event      │ │ ← White (#ffffff)
7622│ └────────────┘ │
7623└────────────────┘
7624
7625Sidebar:
7626┌────────────────┐
7627│ Widget         │ ← Light (#f5f7fa)
7628└────────────────┘
7629
7630Perfect match! ✓
7631```
7632
7633### New Professional Theme Colors
7634
7635**Backgrounds**:
7636- Container: `#f5f7fa` (light blue-gray)
7637- Events: `#ffffff` (pure white)
7638- Grid: `#e8ecf1` (subtle contrast)
7639
7640**Text**:
7641- Primary: `#2c3e50` (dark blue-gray)
7642- Bright: `#4a90e2` (blue accent)
7643- Dim: `#7f8c8d` (medium gray)
7644
7645**Borders**:
7646- Main: `#4a90e2` (blue)
7647- Grid: `#d0d7de` (soft gray)
7648
7649**Header**:
7650- Gradient: `#ffffff` → `#f5f7fa`
7651
7652### Visual Example
7653
7654**Professional Theme Now**:
7655```
7656┌─────────────────────────────┐
7657│ February 2026               │ ← White to light gradient
7658├─┬─┬─┬─┬─┬─┬─┬───────────────┤
7659│S│M│T│W│T│F│S│               │ ← Light background
7660├─┼─┼─┼─┼─┼─┼─┤               │
7661│ │ │1│2│3│4│5│ Event List    │ ← White events
7662│ │ │ │ │ │ │ │ ┌───────────┐ │
7663│ │ │ │ │[8]│ │ │ Meeting   │ │ ← White on light
7664└─┴─┴─┴─┴─┴─┴─┴─└───────────┘─┘
7665
7666Clean, professional look! ✓
7667```
7668
7669### Comparison with Other Themes
7670
7671**Matrix** (dark):
7672- Container: #242424 (dark green)
7673- Events: #242424 (dark green)
7674- Consistent dark theme ✓
7675
7676**Purple** (dark):
7677- Container: #1a0d14 (dark purple)
7678- Events: #2a2030 (dark purple)
7679- Consistent dark theme ✓
7680
7681**Professional** (light):
7682- Container: #f5f7fa (light blue)
7683- Events: #ffffff (white)
7684- Consistent light theme ✓
7685
7686**Pink** (dark):
7687- Container: #1a0d14 (dark pink)
7688- Events: #1a0d14 (dark pink)
7689- Consistent dark theme ✓
7690
7691**All themes now consistent!** ��
7692
7693### Better Contrast
7694
7695**Professional theme improvements**:
7696
7697**Readability**:
7698- Dark text (#2c3e50) on white/light backgrounds ✓
7699- Excellent contrast ratio ✓
7700- Easy on the eyes ✓
7701
7702**Visual hierarchy**:
7703- White events pop against light container ✓
7704- Blue accents stand out ✓
7705- Clean, modern look ✓
7706
7707**Professional appearance**:
7708- Lighter = more corporate/business feel ✓
7709- Clean whites = premium quality ✓
7710- Subtle grays = sophisticated ✓
7711
7712### Complete Theme Consistency
7713
7714**All themes now have matching backgrounds**:
7715
7716**Matrix**:
7717- Sidebar & Calendar both dark green ✓
7718
7719**Purple**:
7720- Sidebar & Calendar both dark purple ✓
7721
7722**Professional**:
7723- Sidebar & Calendar both light ✓ (v4.8.4!)
7724
7725**Pink**:
7726- Sidebar & Calendar both dark pink ✓
7727
7728**Perfect visual unity across all views!** ��✨
7729
7730## Version 4.8.3 (2026-02-08) - FINAL POLISH: BOLD TEXT, SEARCH, SIDEBAR BOXES
7731
7732### �� Fixed: Bold Text in Descriptions Themed
7733- **Fixed:** **Bold text** now uses theme primary color
7734- **Fixed:** Both `**text**` and `__text__` syntax themed
7735- **Result:** Bold text matches theme!
7736
7737### �� Fixed: Search Bar Fully Themed
7738- **Fixed:** Search input has !important on all styles
7739- **Fixed:** Icon and placeholder text themed
7740- **Result:** Search bar perfectly themed!
7741
7742### �� Fixed: Sidebar Event Boxes Themed
7743- **Fixed:** Event borders in sidebar now use theme grid_border color
7744- **Fixed:** Borders have !important flag
7745- **Result:** Sidebar boxes match theme!
7746
7747### All Changes
7748
7749**1. Bold Text Styling**:
7750
7751**Before**:
7752```html
7753<strong>Bold text</strong> ← Default black
7754```
7755
7756**After**:
7757```php
7758<strong style="color: $text_primary !important; font-weight:bold;">
7759    Bold text
7760</strong>
7761
7762Matrix: Green bold ✓
7763Purple: Lavender bold ✓
7764Professional: Dark bold ✓
7765Pink: Pink bold ✓
7766```
7767
7768**2. Search Bar**:
7769
7770**Before**:
7771```php
7772style="background: $bg; color: $text;"
7773Could be overridden by CSS
7774```
7775
7776**After**:
7777```php
7778style="background: $bg !important;
7779       color: $text_primary !important;
7780       border-color: $grid_border !important;"
7781
7782Cannot be overridden! ✓
7783```
7784
7785**3. Sidebar Event Boxes**:
7786
7787**Before**:
7788```php
7789$borderColor = 'rgba(0, 204, 7, 0.2)'; // Hardcoded
7790```
7791
7792**After**:
7793```php
7794$borderColor = $themeStyles['grid_border']; // From theme
7795border-bottom: 1px solid $borderColor !important;
7796
7797Matrix: Green borders ✓
7798Purple: Purple borders ✓
7799Professional: Gray borders ✓
7800Pink: Pink borders ✓
7801```
7802
7803### Before vs After
7804
7805**BEFORE (v4.8.2)**:
7806```
7807Event description:
7808"Please review **Q1 Goals** carefully"
78097810            Black bold ✗
7811
7812Search bar:
7813[�� Search...] ← Gray placeholder ✗
7814
7815Sidebar:
7816┌────────────┐
7817│ Event 1    │
7818├────────────┤ ← Gray border ✗
7819│ Event 2    │
7820└────────────┘
7821```
7822
7823**AFTER (v4.8.3)**:
7824```
7825Matrix Theme:
7826
7827Event description:
7828"Please review **Q1 Goals** carefully"
78297830            Green bold ✓
7831
7832Search bar:
7833[�� Search...] ← Green themed ✓
7834
7835Sidebar:
7836┌────────────┐
7837│ Event 1    │
7838├────────────┤ ← Green border ✓
7839│ Event 2    │
7840└────────────┘
7841```
7842
7843### Examples by Theme
7844
7845**Matrix Theme**:
7846```
7847Description:
7848"Check **important notes** and links"
78497850   Green bold
7851
7852Sidebar boxes:
7853Event 1
7854───────── Green border
7855Event 2
7856───────── Green border
7857```
7858
7859**Purple Theme**:
7860```
7861Description:
7862"Review **agenda items** before meeting"
78637864   Lavender bold
7865
7866Sidebar boxes:
7867Event 1
7868───────── Purple border
7869Event 2
7870───────── Purple border
7871```
7872
7873**Professional Theme**:
7874```
7875Description:
7876"Update **quarterly reports** by Friday"
78777878   Dark bold
7879
7880Sidebar boxes:
7881Event 1
7882───────── Gray border
7883Event 2
7884───────── Gray border
7885```
7886
7887**Pink Theme**:
7888```
7889Description:
7890"Don't forget **party supplies** ✨"
78917892        Pink bold
7893
7894Sidebar boxes:
7895Event 1 ��
7896───────── Pink border
7897Event 2 ✨
7898───────── Pink border
7899```
7900
7901### Complete Formatting Coverage
7902
7903**Text formatting themed**:
7904- ✅ Regular text
7905- ✅ **Bold text** ← NEW!
7906- ✅ Links
7907- ✅ Italic text (inherits)
7908- ✅ Code (inherits)
7909
7910**UI elements themed**:
7911- ✅ Search bar ← Enhanced!
7912- ✅ Search icon ← Enhanced!
7913- ✅ Search placeholder ← Enhanced!
7914- ✅ Sidebar borders ← NEW!
7915- ✅ Event borders
7916- ✅ Badges
7917- ✅ Buttons
7918
7919**Every element perfectly themed!** ��
7920
7921### Search Bar Coverage
7922
7923**All aspects themed**:
7924- Background: Theme cell_bg ✓
7925- Text color: Theme text_primary ✓
7926- Border: Theme grid_border ✓
7927- Placeholder: Inherits text color ✓
7928- Icon (��): In placeholder ✓
7929- Clear button (✕): Themed ✓
7930
7931**Cannot be overridden!** (all have !important)
7932
7933### Sidebar Event Box Styling
7934
7935**Consistent borders**:
7936```
7937Matrix:
7938╔════════════╗
7939║ Event 1    ║
7940╟────────────╢ ← grid_border color
7941║ Event 2    ║
7942╚════════════╝
7943
7944All themes match perfectly! ✓
7945```
7946
7947### Complete Theme Achievement
7948
7949**Every single element themed**:
7950- ✅ Backgrounds
7951- ✅ Text (regular)
7952- ✅ Text (bold) ← v4.8.3!
7953- ✅ Links
7954- ✅ Badges
7955- ✅ Buttons
7956- ✅ Checkboxes
7957- ✅ Icons
7958- ✅ Borders
7959- ✅ Search bar ← Enhanced v4.8.3!
7960- ✅ Sidebar boxes ← v4.8.3!
7961- ✅ Today marker
7962- ✅ Calendar grid
7963- ✅ Event panels
7964
7965**ABSOLUTE PERFECTION!** ��✨
7966
7967## Version 4.8.2 (2026-02-08) - THEME LINKS IN DESCRIPTIONS
7968
7969### �� Fixed: Links in Descriptions Now Themed
7970- **Fixed:** All links in event descriptions now use theme color
7971- **Fixed:** DokuWiki links [[page|text]] themed
7972- **Fixed:** Markdown links [text](url) themed
7973- **Fixed:** Plain URLs themed
7974- **Result:** Links match theme perfectly!
7975
7976### The Problem
7977
7978**v4.8.1 behavior**:
7979```
7980Event description:
7981"Check out https://example.com" ← Blue default link ✗
7982"See [[wiki:page|docs]]" ← Blue default link ✗
7983```
7984
7985### The Fix
7986
7987**Added inline color styling to ALL link types**:
7988
7989```php
7990// Get theme colors:
7991$linkColor = $themeStyles['border'] . ' !important';
7992$linkStyle = ' style="color:' . $linkColor . ';"';
7993
7994// Apply to links:
7995<a href="..." style="color: #00cc07 !important;">link</a>
7996```
7997
7998**All link types themed**:
79991. DokuWiki syntax: `[[page|text]]`
80002. Markdown syntax: `[text](url)`
80013. Plain URLs: `https://example.com`
8002
8003### Before vs After
8004
8005**BEFORE (v4.8.1)**:
8006```
8007Matrix Theme Description:
8008"Visit https://example.com for more info"
80098010     Blue link ✗ (doesn't match green theme)
8011```
8012
8013**AFTER (v4.8.2)**:
8014```
8015Matrix Theme Description:
8016"Visit https://example.com for more info"
80178018     Green link ✓ (matches theme!)
8019```
8020
8021### Link Colors by Theme
8022
8023**Matrix**:
8024- Links: Green (#00cc07) !important
8025- Matches: Border, badges, highlights
8026
8027**Purple**:
8028- Links: Purple (#9b59b6) !important
8029- Matches: Border, badges, highlights
8030
8031**Professional**:
8032- Links: Blue (#4a90e2) !important
8033- Matches: Border, badges, highlights
8034
8035**Pink**:
8036- Links: Hot Pink (#ff1493) !important
8037- Matches: Border, badges, highlights ✨
8038
8039### Examples
8040
8041**Matrix Description with Links**:
8042```
8043Event: Team Meeting
8044Description:
8045"Review [[wiki:q1goals|Q1 Goals]]
8046and visit https://metrics.com"
8047
8048Both links → Green ✓
8049```
8050
8051**Purple Description with Links**:
8052```
8053Event: Planning Session
8054Description:
8055"Check [schedule](https://cal.com)
8056for availability"
8057
8058Link → Purple ✓
8059```
8060
8061**Professional Description with Links**:
8062```
8063Event: Client Call
8064Description:
8065"Prepare [[reports|Monthly Reports]]
8066before the call"
8067
8068Link → Blue ✓
8069```
8070
8071**Pink Description with Links**:
8072```
8073Event: Party Planning
8074Description:
8075"RSVP at https://party.com ✨"
8076
8077Link → Hot Pink ✓ ��
8078```
8079
8080### Technical Implementation
8081
8082**Updated renderDescription() function**:
8083
8084```php
8085private function renderDescription($description, $themeStyles = null) {
8086    // Get theme
8087    if ($themeStyles === null) {
8088        $theme = $this->getSidebarTheme();
8089        $themeStyles = $this->getSidebarThemeStyles($theme);
8090    }
8091
8092    // Create link style
8093    $linkColor = $themeStyles['border'] . ' !important';
8094    $linkStyle = ' style="color:' . $linkColor . ';"';
8095
8096    // Apply to all link types:
8097    $linkHtml = '<a href="..." ' . $linkStyle . '>text</a>';
8098}
8099```
8100
8101### Complete Theming
8102
8103**Every text element**:
8104- ✅ Event titles
8105- ✅ Event dates
8106- ✅ Event descriptions
8107- ✅ **Links in descriptions** ← NEW!
8108- ✅ Badges
8109- ✅ Buttons
8110
8111**Every color unified!** ��
8112
8113### Unified Theme Experience
8114
8115**Matrix Theme**:
8116```
8117Everything green:
8118- Text: Green ✓
8119- Links: Green ✓
8120- Badges: Green ✓
8121- Borders: Green ✓
8122- Buttons: Green ✓
8123- Today marker: Green ✓
8124
8125Perfect harmony! ✓
8126```
8127
8128**No default blue links breaking the theme!**
8129
8130### Link Types Supported
8131
8132**1. DokuWiki Syntax**:
8133```
8134[[page|Link Text]] → Themed ✓
8135[[page]] → Themed ✓
8136[[page#section|Text]] → Themed ✓
8137```
8138
8139**2. Markdown Syntax**:
8140```
8141[Link Text](https://url.com) → Themed ✓
8142[Text](internal-page) → Themed ✓
8143```
8144
8145**3. Plain URLs**:
8146```
8147https://example.com → Themed ✓
8148http://site.org → Themed ✓
8149```
8150
8151**All links perfectly themed!** ����
8152
8153## Version 4.8.1 (2026-02-08) - FIX BADGES & TODAY CELL MARKER
8154
8155### �� Fixed: All Badges Now Themed
8156- **Fixed:** TODAY badge themed with theme color
8157- **Fixed:** PAST DUE badge uses orange (warning color)
8158- **Fixed:** Namespace badges themed
8159- **Fixed:** All badges visible and hidden
8160- **Result:** All badges match theme!
8161
8162### �� Fixed: Today Cell More Prominent
8163- **Fixed:** Today cell now has 2px border in theme color
8164- **Fixed:** Border added to both PHP and JavaScript
8165- **Result:** Today stands out clearly!
8166
8167### �� Fixed: Past Event Text Fully Themed
8168- **Fixed:** Event-info div backgrounds ensure no gray
8169- **Result:** Expanded past events completely themed!
8170
8171### All Changes
8172
8173**1. Badge Theming**:
8174
8175**TODAY Badge**:
8176```php
8177// PHP & JavaScript:
8178style="background: $themeStyles['border'] !important;
8179       color: $bg !important;"
8180
8181Matrix: Green badge
8182Purple: Purple badge
8183Professional: Blue badge with white text
8184Pink: Pink badge
8185```
8186
8187**PAST DUE Badge** (always orange):
8188```php
8189style="background: #ff9800 !important;
8190       color: #fff !important;"
8191```
8192
8193**Namespace Badge**:
8194```php
8195style="background: $themeStyles['border'] !important;
8196       color: $bg !important;"
8197```
8198
8199**2. Today Cell Border**:
8200
8201**PHP**:
8202```php
8203$todayBorder = $isToday ?
8204    'border:2px solid ' . $themeStyles['border'] . ' !important;' : '';
8205```
8206
8207**JavaScript**: Same
8208
8209**Result**: Today cell has prominent colored border!
8210
8211### Before vs After
8212
8213**BEFORE (v4.8.0)**:
8214```
8215Calendar:
8216┌─┬─┬─┬─┬─┬─┬─┐
8217│1│2│3│4│5│6│7│
8218│ │ │ │[8]│ │ │ ← Today: subtle background
8219└─┴─┴─┴─┴─┴─┴─┘
8220
8221Event badges:
8222Mon, Feb 8 [TODAY] [Work] ← Gray badges ✗
8223```
8224
8225**AFTER (v4.8.1)**:
8226```
8227Calendar (Matrix):
8228┌─┬─┬─┬─┬─┬─┬─┐
8229│1│2│3│4│5│6│7│
8230│ │ │ │[8]│ │ │ ← Today: green border 2px ✓
8231└─┴─┴─┴─┴─┴─┴─┘
8232
8233Event badges (Matrix):
8234Mon, Feb 8 [TODAY] [Work] ← Green badges ✓
8235```
8236
8237### Matrix Theme Example
8238
8239**Calendar**:
8240```
8241Today cell:
8242┌────┐
8243│ 8  │ Dark green bg + Green 2px border
8244└────┘
8245Very obvious!
8246```
8247
8248**Badges**:
8249```
8250[TODAY] ← Green bg, dark text
8251[Work]  ← Green bg, dark text
8252[PAST DUE] ← Orange bg, white text
8253```
8254
8255### Purple Theme Example
8256
8257**Calendar**:
8258```
8259Today cell:
8260┌────┐
8261│ 8  │ Dark purple bg + Purple 2px border
8262└────┘
8263```
8264
8265**Badges**:
8266```
8267[TODAY] ← Purple bg
8268[Work]  ← Purple bg
8269```
8270
8271### Professional Theme Example
8272
8273**Calendar**:
8274```
8275Today cell:
8276┌────┐
8277│ 8  │ Light blue bg + Blue 2px border
8278└────┘
8279```
8280
8281**Badges**:
8282```
8283[TODAY] ← Blue bg, white text
8284[Work]  ← Blue bg, white text
8285```
8286
8287### Pink Theme Example
8288
8289**Calendar**:
8290```
8291Today cell:
8292┌────┐
8293│ 8  │ Dark pink bg + Pink 2px border ✨
8294└────┘
8295```
8296
8297**Badges**:
8298```
8299[TODAY] ← Pink bg ��
8300[Work]  ← Pink bg ✨
8301```
8302
8303### Complete Badge Coverage
8304
8305**All badges themed**:
8306- ✅ TODAY badge (theme color)
8307- ✅ PAST DUE badge (orange warning)
8308- ✅ Namespace badges (theme color)
8309- ✅ Visible events
8310- ✅ Hidden/past events
8311
8312**No gray badges anywhere!**
8313
8314### Today Cell Visual
8315
8316**Dual indicators**:
83171. Background color (theme today bg)
83182. Border (2px theme color) ← NEW!
8319
8320**Result**: Today is VERY obvious!
8321
8322**Matrix**: Green bg + Green border
8323**Purple**: Purple bg + Purple border
8324**Professional**: Light blue bg + Blue border
8325**Pink**: Pink bg + Pink border ✨
8326
8327### Complete Theming
8328
8329**Every element themed**:
8330- ✅ Backgrounds
8331- ✅ Text colors
8332- ✅ Badges (v4.8.1!)
8333- ✅ Today marker (v4.8.1!)
8334- ✅ Checkboxes
8335- ✅ Buttons
8336- ✅ Icons
8337
8338**Absolutely everything!** ��✨
8339
8340## Version 4.8.0 (2026-02-08) - COMPLETE EVENT BACKGROUND THEMING
8341
8342### �� Fixed: All Event Backgrounds Now Themed
8343- **Fixed:** event-info div now has themed background
8344- **Fixed:** event-meta-compact div (visible) now has themed background
8345- **Fixed:** event-desc-compact div now has themed background
8346- **Fixed:** All !important flags added to prevent CSS override
8347- **Result:** Entire event item fully themed!
8348
8349### �� Fixed: Description Text Shows Correct Color Immediately
8350- **Fixed:** Description divs now have explicit background + color on load
8351- **Fixed:** Both visible and hidden descriptions fully styled
8352- **Result:** No more gray text on initial load!
8353
8354### The Problem
8355
8356**v4.7.9 behavior**:
8357```
8358Expanded past event:
8359┌────────────────────────┐
8360│ ▾ Team Meeting         │ ← Themed ✓
8361│   Mon, Feb 8           │ ← Themed ✓
8362│                        │
8363│   [Event details]      │ ← Gray background ✗
8364│   [Description]        │ ← Gray text until navigation ✗
8365└────────────────────────┘
8366
8367Only the date/time div was themed!
8368```
8369
8370### The Fix
8371
8372**Added background to ALL inner divs**:
8373
8374**PHP**:
8375```php
8376// Event container:
8377style="background:' . $themeStyles['cell_bg'] . ' !important;"
8378
8379// event-info wrapper:
8380<div class="event-info"
8381     style="background:' . $themeStyles['cell_bg'] . ' !important;">
8382
8383// event-meta-compact:
8384<div class="event-meta-compact"
8385     style="background:' . $themeStyles['cell_bg'] . ' !important;">
8386
8387// event-desc-compact:
8388<div class="event-desc-compact"
8389     style="background:' . $themeStyles['cell_bg'] . ' !important;
8390            color:' . $themeStyles['text_dim'] . ' !important;">
8391```
8392
8393**JavaScript**: Same styling applied
8394
8395### Before vs After
8396
8397**BEFORE (v4.7.9)**:
8398```
8399Matrix Theme - Expanded Event:
8400┌────────────────────────┐
8401│ ▾ Team Meeting         │
8402│   Mon, Feb 8  ← Green  │
8403│                        │
8404│   Details     ← Gray ✗ │
8405│   Description ← Gray ✗ │
8406│   [✏️] [��️]            │
8407└────────────────────────┘
8408```
8409
8410**AFTER (v4.8.0)**:
8411```
8412Matrix Theme - Expanded Event:
8413┌────────────────────────┐
8414│ ▾ Team Meeting         │
8415│   Mon, Feb 8  ← Green  │
8416│                        │
8417│   Details     ← Green ✓│
8418│   Description ← Green ✓│
8419│   [✏️] [��️]            │
8420└────────────────────────┘
8421
8422Entire event themed!
8423```
8424
8425### What's Themed Now
8426
8427**Event Item Structure** (all themed):
8428```
8429event-compact-item        ← Themed ✓
8430  └─ event-info           ← Themed ✓ (v4.8.0!)
8431      ├─ event-title-row  ← Themed ✓
8432      ├─ event-meta       ← Themed ✓ (v4.8.0!)
8433      └─ event-desc       ← Themed ✓ (v4.8.0!)
8434```
8435
8436**Every layer has background!**
8437
8438### Matrix Theme Example
8439
8440**Complete event**:
8441```
8442┌────────────────────────────┐
8443│ Team Meeting               │ ← Dark green bg
8444│   Mon, Feb 8 • 2:00 PM     │ ← Dark green bg
8445│   Discussed Q1 goals and   │ ← Dark green bg
8446│   set targets for team     │ ← Dark green bg
8447│   [✏️] [��️] [☑]           │ ← Dark green bg
8448└────────────────────────────┘
8449
8450Consistent green throughout! ✓
8451```
8452
8453### Purple Theme Example
8454
8455```
8456┌────────────────────────────┐
8457│ Team Meeting               │ ← Dark purple bg
8458│   Mon, Feb 8 • 2:00 PM     │ ← Dark purple bg
8459│   Discussed Q1 goals       │ ← Dark purple bg
8460│   [✏️] [��️] [☑]           │ ← Dark purple bg
8461└────────────────────────────┘
8462
8463Consistent purple throughout! ✓
8464```
8465
8466### Professional Theme Example
8467
8468```
8469┌────────────────────────────┐
8470│ Team Meeting               │ ← Light bg
8471│   Mon, Feb 8 • 2:00 PM     │ ← Light bg
8472│   Discussed Q1 goals       │ ← Light bg
8473│   [✏️] [��️] [☑]           │ ← Light bg
8474└────────────────────────────┘
8475
8476Consistent light throughout! ✓
8477```
8478
8479### Pink Theme Example
8480
8481```
8482┌────────────────────────────┐
8483│ Team Meeting               │ ← Dark pink bg
8484│   Mon, Feb 8 • 2:00 PM     │ ← Dark pink bg
8485│   Discussed Q1 goals       │ ← Dark pink bg
8486│   [✏️] [��️] [☑]           │ ← Dark pink bg
8487└────────────────────────────┘
8488
8489Consistent pink throughout! ✓
8490```
8491
8492### Complete Theming
8493
8494**Every element, every layer**:
8495- ✅ Container
8496- ✅ Event item
8497- ✅ Event info wrapper (v4.8.0!)
8498- ✅ Title row
8499- ✅ Meta div (v4.8.0!)
8500- ✅ Description div (v4.8.0!)
8501- ✅ Action buttons
8502- ✅ Checkboxes
8503
8504**No gray anywhere!** ��
8505
8506### Why Multiple Backgrounds?
8507
8508**CSS layers stack**:
8509```html
8510<div style="background: green;">         ← Layer 1
8511  <div style="background: inherit;">     ← Could be gray!
8512    <div>Content</div>                   ← Inherits gray!
8513  </div>
8514</div>
8515
8516Better:
8517<div style="background: green;">         ← Layer 1
8518  <div style="background: green;">       ← Layer 2 forced
8519    <div style="background: green;">     ← Layer 3 forced
8520      Content                            ← All green!
8521    </div>
8522  </div>
8523</div>
8524```
8525
8526**Every layer forced = Perfect theming!**
8527
8528### !important Everywhere
8529
8530**All styling now uses !important**:
8531- background: ... !important
8532- color: ... !important
8533
8534**Result**: CSS cannot override themes!
8535
8536**Version 4.8.0 = Complete, bulletproof theming!** ��✨
8537
8538## Version 4.7.9 (2026-02-08) - THEME ICONS, CHECKBOXES & EXPANDED BACKGROUNDS
8539
8540### �� Fixed: Past Event Expanded Background Themed
8541- **Fixed:** Past event meta div now has theme background when expanded
8542- **Fixed:** Both PHP and JavaScript render with theme background
8543- **Result:** Expanded past events have proper themed background!
8544
8545### ✅ Fixed: Checkboxes Now Themed
8546- **Fixed:** Task checkboxes use accent-color matching theme
8547- **Fixed:** Cursor changes to pointer on hover
8548- **Result:** Checkboxes match theme color!
8549
8550### �� Fixed: Action Buttons (Edit/Delete) Themed
8551- **Fixed:** Edit (✏️) and Delete (��️) buttons now themed
8552- **Fixed:** Background, text, and border all use theme colors
8553- **Result:** All icons themed!
8554
8555### All Changes
8556
8557**1. Past Event Expanded Background**:
8558
8559**PHP**:
8560```php
8561// Before:
8562<div class="event-meta-compact" style="display:none;">
8563
8564// After:
8565<div class="event-meta-compact"
8566     style="display:none; background:' . $themeStyles['cell_bg'] . ' !important;">
8567```
8568
8569**JavaScript**: Same treatment
8570
8571**Result**: Expanded past events have themed background!
8572
8573**2. Task Checkboxes**:
8574
8575**PHP & JavaScript**:
8576```php
8577// Added accent-color:
8578<input type="checkbox"
8579       style="accent-color:' . $themeStyles['border'] . ' !important;
8580              cursor:pointer;">
8581```
8582
8583**accent-color** changes the checkbox color:
8584- Matrix: Green checkboxes ✓
8585- Purple: Purple checkboxes ✓
8586- Professional: Blue checkboxes ✓
8587- Pink: Pink checkboxes ✓
8588
8589**3. Edit/Delete Buttons**:
8590
8591**PHP**:
8592```php
8593<button class="event-action-btn"
8594        style="color:' . $themeStyles['text_primary'] . ' !important;
8595               background:' . $themeStyles['cell_bg'] . ' !important;
8596               border-color:' . $themeStyles['grid_border'] . ' !important;">
8597    ��️
8598</button>
8599```
8600
8601**JavaScript**: Same
8602
8603**Result**: Buttons blend with theme!
8604
8605### Before vs After
8606
8607**BEFORE (v4.7.8)**:
8608```
8609Past Event (expanded):
8610┌─────────────────────────┐
8611│ ▾ Team Meeting          │
8612│   Mon, Feb 8            │ ← White background ✗
8613│   Description           │
8614├─────────────────────────┤
8615│ [✏️] [��️] [☐]          │ ← Default colors ✗
8616└─────────────────────────┘
8617```
8618
8619**AFTER (v4.7.9)**:
8620```
8621Past Event (expanded - Matrix):
8622┌─────────────────────────┐
8623│ ▾ Team Meeting          │
8624│   Mon, Feb 8            │ ← Dark green bg ✓
8625│   Description           │
8626├─────────────────────────┤
8627│ [✏️] [��️] [☑]          │ ← Themed ✓
8628└─────────────────────────┘
8629```
8630
8631### Matrix Theme Example
8632
8633**Checkboxes**: Green accent
8634**Buttons**: Dark bg, green text, green borders
8635**Expanded**: Dark green background
8636
8637```
8638Task: ☑ Complete report  ← Green checkmark
8639[✏️] [��️]                ← Dark buttons with green
8640```
8641
8642### Purple Theme Example
8643
8644**Checkboxes**: Purple accent
8645**Buttons**: Dark purple bg, lavender text
8646**Expanded**: Dark purple background
8647
8648```
8649Task: ☑ Complete report  ← Purple checkmark
8650[✏️] [��️]                ← Purple themed
8651```
8652
8653### Professional Theme Example
8654
8655**Checkboxes**: Blue accent
8656**Buttons**: Light bg, dark text
8657**Expanded**: Light background
8658
8659```
8660Task: ☑ Complete report  ← Blue checkmark
8661[✏️] [��️]                ← Light themed
8662```
8663
8664### Pink Theme Example
8665
8666**Checkboxes**: Pink accent
8667**Buttons**: Dark pink bg, pink text
8668**Expanded**: Dark pink background
8669
8670```
8671Task: ☑ Complete report  ← Pink checkmark
8672[✏️] [��️]                ← Pink themed
8673```
8674
8675### Complete Icon Coverage
8676
8677**Themed Icons/Buttons**:
8678- ✅ Task checkboxes (accent-color)
8679- ✅ Edit button (✏️)
8680- ✅ Delete button (��️)
8681- ✅ Navigation arrows (◀ ▶)
8682- ✅ Today button
8683- ✅ Past Events arrow (▶)
8684
8685**All interactive elements themed!** ��
8686
8687### How accent-color Works
8688
8689**Modern CSS property** for form controls:
8690```css
8691input[type="checkbox"] {
8692    accent-color: #00cc07; /* Green checkbox! */
8693}
8694```
8695
8696**Browser support**: All modern browsers ✓
8697
8698**Result**: Checkboxes automatically match theme!
8699
8700### Complete Theme Coverage
8701
8702**Backgrounds**:
8703- ✅ Container
8704- ✅ Calendar-left
8705- ✅ Calendar-right
8706- ✅ Event items
8707- ✅ Past event expanded (v4.7.9!)
8708- ✅ Action buttons (v4.7.9!)
8709
8710**Icons/Controls**:
8711- ✅ Checkboxes (v4.7.9!)
8712- ✅ Edit/Delete buttons (v4.7.9!)
8713- ✅ Navigation buttons
8714- ✅ All arrows
8715
8716**Every element perfectly themed!** ��✨
8717
8718## Version 4.7.8 (2026-02-08) - FIX BOTTOM BAR & PAST EVENT DETAILS
8719
8720### �� Fixed: White Bar at Bottom of Calendar
8721- **Fixed:** Added background to calendar-left div with !important
8722- **Result:** No more white bar at bottom!
8723
8724### �� Fixed: Past Event Expanded Details Not Themed
8725- **Fixed:** Past event date/time now themed when expanded
8726- **Fixed:** Past event descriptions now themed when expanded
8727- **Fixed:** Both PHP and JavaScript render with theme colors
8728- **Result:** Expanding past events shows themed text!
8729
8730### �� Fixed: Event Description Text Color
8731- **Fixed:** All event descriptions now use theme text_dim color
8732- **Fixed:** Both visible and hidden descriptions themed
8733- **Result:** Descriptions always match theme!
8734
8735### All Changes
8736
8737**1. Bottom White Bar** (calendar-left div):
8738
8739**Before**:
8740```html
8741<div class="calendar-compact-left">
8742<!-- White background showing at bottom -->
8743```
8744
8745**After**:
8746```html
8747<div class="calendar-compact-left"
8748     style="background: #242424 !important;">
8749<!-- Matches theme background -->
8750```
8751
8752**2. Past Event Expanded Details**:
8753
8754**PHP** - Added colors to hidden details:
8755```php
8756// Past event meta (hidden):
8757<span class="event-date-time"
8758      style="color:' . $themeStyles['text_dim'] . ' !important;">
8759
8760// Past event description (hidden):
8761<div class="event-desc-compact"
8762     style="display:none; color:' . $themeStyles['text_dim'] . ' !important;">
8763```
8764
8765**JavaScript** - Same treatment:
8766```javascript
8767// Past event meta:
8768html += '<span class="event-date-time"
8769              style="color:' + themeStyles.text_dim + ' !important;">';
8770
8771// Past event description:
8772html += '<div class="event-desc-compact"
8773              style="display: none; color:' + themeStyles.text_dim + ' !important;">';
8774```
8775
8776**3. All Event Descriptions**:
8777
8778**Both visible and hidden descriptions now themed**:
8779```php
8780// PHP:
8781style="color:' . $themeStyles['text_dim'] . ' !important;"
8782
8783// JavaScript:
8784style="color:' + themeStyles.text_dim + ' !important;"
8785```
8786
8787### Before vs After
8788
8789**BEFORE (v4.7.7)**:
8790```
8791Calendar bottom:
8792┌──────────────┐
8793│ Calendar     │
8794│ Grid         │
8795└──────────────┘
8796▒▒▒▒▒▒▒▒▒▒▒▒▒▒ ← White bar
8797
8798Past Event (collapsed):
8799▸ Team Meeting
8800
8801Past Event (expanded):
8802▾ Team Meeting
8803  Mon, Feb 8 ← Gray text ✗
8804  Description ← Gray text ✗
8805```
8806
8807**AFTER (v4.7.8)**:
8808```
8809Calendar bottom:
8810┌──────────────┐
8811│ Calendar     │
8812│ Grid         │
8813└──────────────┘
8814No white bar! ✓
8815
8816Past Event (collapsed):
8817▸ Team Meeting
8818
8819Past Event (expanded):
8820▾ Team Meeting
8821  Mon, Feb 8 ← Theme dim color ✓
8822  Description ← Theme dim color ✓
8823```
8824
8825### Matrix Theme Example
8826
8827**Past event expanded**:
8828```
8829▾ Team Meeting (past)
8830  Mon, Feb 8 • 2:00 PM  ← Dim green (#00aa00)
8831  Discussed Q1 goals   ← Dim green (#00aa00)
8832
8833Everything themed! ✓
8834```
8835
8836### Purple Theme Example
8837
8838**Past event expanded**:
8839```
8840▾ Team Meeting (past)
8841  Mon, Feb 8 • 2:00 PM  ← Dim purple (#8e7ab8)
8842  Discussed Q1 goals   ← Dim purple (#8e7ab8)
8843
8844Everything themed! ✓
8845```
8846
8847### Professional Theme Example
8848
8849**Past event expanded**:
8850```
8851▾ Team Meeting (past)
8852  Mon, Feb 8 • 2:00 PM  ← Gray (#7f8c8d)
8853  Discussed Q1 goals   ← Gray (#7f8c8d)
8854
8855Everything themed! ✓
8856```
8857
8858### Pink Theme Example
8859
8860**Past event expanded**:
8861```
8862▾ Team Meeting (past)
8863  Mon, Feb 8 • 2:00 PM  ← Light pink (#ff85c1)
8864  Discussed Q1 goals   ← Light pink (#ff85c1)
8865
8866Everything themed! ✓
8867```
8868
8869### Complete Coverage
8870
8871**Calendar Layout**:
8872- ✅ Container background
8873- ✅ Calendar-left background (v4.7.8!)
8874- ✅ Calendar-right background
8875- ✅ No white bars anywhere!
8876
8877**Event Details**:
8878- ✅ Event titles
8879- ✅ Event dates/times
8880- ✅ Event descriptions (visible) (v4.7.8!)
8881- ✅ Past event dates (expanded) (v4.7.8!)
8882- ✅ Past event descriptions (expanded) (v4.7.8!)
8883
8884**Absolutely everything themed!** ��
8885
8886## Version 4.7.7 (2026-02-08) - AGGRESSIVE !IMPORTANT ON ALL ELEMENTS
8887
8888### �� Fixed: Added !important to EVERY Themed Element
8889- **Fixed:** S M T W T F S headers now have background + color with !important
8890- **Fixed:** "Past Events" text now has explicit color with !important
8891- **Fixed:** Today cell background now forced with !important
8892- **Fixed:** All day numbers now have !important color
8893- **Fixed:** Empty cells now have !important background
8894- **Result:** CSS CANNOT override themes anymore!
8895
8896### The Nuclear Option: !important Everywhere
8897
8898**Problem**: DokuWiki CSS was still winning:
8899```css
8900/* DokuWiki theme overriding everything: */
8901.dokuwiki table th { background: white !important; color: black !important; }
8902.dokuwiki td { background: white !important; }
8903```
8904
8905**Solution**: Add !important to EVERY inline style:
8906```html
8907<th style="background: #242424 !important; color: #00cc07 !important;">
8908<td style="background: #2a4d2a !important; color: #00cc07 !important;">
8909<span style="color: #00cc07 !important;">
8910```
8911
8912### All Changes
8913
8914**1. Table Headers (S M T W T F S)**:
8915
8916**PHP** - Added background + !important everywhere:
8917```php
8918$thStyle = 'background:' . $themeStyles['header_bg'] . ' !important;
8919            color:' . $themeStyles['text_primary'] . ' !important;
8920            border-color:' . $themeStyles['grid_border'] . ' !important;
8921            font-weight:bold !important;';
8922```
8923
8924**JavaScript** - Added background to each th:
8925```javascript
8926th.style.setProperty('background', themeStyles.header_bg, 'important');
8927th.style.setProperty('color', themeStyles.text_primary, 'important');
8928th.style.setProperty('border-color', themeStyles.grid_border, 'important');
8929th.style.setProperty('font-weight', 'bold', 'important');
8930```
8931
8932**2. Past Events Text**:
8933
8934**PHP** - Added !important to spans:
8935```php
8936<span class="past-events-arrow" style="color:' . $themeStyles['text_dim'] . ' !important;">▶</span>
8937<span class="past-events-label" style="color:' . $themeStyles['text_dim'] . ' !important;">Past Events</span>
8938```
8939
8940**JavaScript** - Same treatment:
8941```javascript
8942html += '<span class="past-events-arrow" style="color:' + themeStyles.text_dim + ' !important;">▶</span>';
8943html += '<span class="past-events-label" style="color:' + themeStyles.text_dim + ' !important;">Past Events</span>';
8944```
8945
8946**3. Today Cell & All Cells**:
8947
8948**PHP** - !important on background and color:
8949```php
8950// Today or regular cell:
8951$cellStyle = 'background:' . $cellBg . ' !important;
8952              color:' . $themeStyles['text_primary'] . ' !important;';
8953
8954// Day number:
8955<span class="day-num" style="color:' . $themeStyles['text_primary'] . ' !important;">
8956```
8957
8958**JavaScript** - Same:
8959```javascript
8960style="background:${cellBg} !important; color:${cellColor} !important;"
8961
8962<span style="color:${cellColor} !important;">${currentDay}</span>
8963```
8964
8965**4. Empty Cells**:
8966
8967**PHP & JavaScript** - !important:
8968```php
8969style="background:' . $themeStyles['bg'] . ' !important;"
8970```
8971
8972### Before vs After
8973
8974**BEFORE (v4.7.6)** - CSS still winning:
8975```
8976S M T W T F S → White background, black text ✗
8977Today cell → White background ✗
8978Past Events → Black text ✗
8979```
8980
8981**AFTER (v4.7.7)** - Theme wins:
8982```
8983S M T W T F S → Theme background, theme text ✓
8984Today cell → Theme highlight ✓
8985Past Events → Theme text ✓
8986
8987NOTHING can override !important inline styles!
8988```
8989
8990### Matrix Theme Example
8991
8992**Complete theming**:
8993```
8994┌──────────────────────────┐
8995│ S M T W T F S            │ ← Dark bg (#2a2a2a), Green text (#00cc07)
8996├─┬─┬─┬─┬─┬─┬──────────────┤
8997│ │ │1│2│3│4│5             │ ← Dark cells (#242424), Green nums (#00cc07)
8998│ │ │ │ │ │[8]│             │ ← Today green highlight (#2a4d2a)
8999├─┴─┴─┴─┴─┴─┴──────────────┤
9000│ ▶ Past Events (3)        │ ← Dim green text (#00aa00)
9001└──────────────────────────┘
9002
9003Every element forced with !important ✓
9004```
9005
9006### Purple Theme Example
9007
9008```
9009┌──────────────────────────┐
9010│ S M T W T F S            │ ← Dark purple bg, Lavender text
9011├─┬─┬─┬─┬─┬─┬──────────────┤
9012│ │ │1│2│3│4│5             │ ← Dark purple cells, Lavender nums
9013│ │ │ │ │ │[8]│             │ ← Today purple highlight
9014├─┴─┴─┴─┴─┴─┴──────────────┤
9015│ ▶ Past Events (3)        │ ← Dim purple text
9016└──────────────────────────┘
9017
9018Forced purple everywhere ✓
9019```
9020
9021### Professional Theme Example
9022
9023```
9024┌──────────────────────────┐
9025│ S M T W T F S            │ ← Light bg, Dark text
9026├─┬─┬─┬─┬─┬─┬──────────────┤
9027│ │ │1│2│3│4│5             │ ← Light cells, Dark nums
9028│ │ │ │ │ │[8]│             │ ← Today light blue highlight
9029├─┴─┴─┴─┴─┴─┴──────────────┤
9030│ ▶ Past Events (3)        │ ← Gray text
9031└──────────────────────────┘
9032
9033Forced professional everywhere ✓
9034```
9035
9036### Pink Theme Example
9037
9038```
9039┌──────────────────────────┐
9040│ S M T W T F S            │ ← Dark pink bg, Pink text
9041├─┬─┬─┬─┬─┬─┬──────────────┤
9042│ │ │1│2│3│4│5  ✨         │ ← Dark pink cells, Pink nums
9043│ │ │ │ │ │[8]│  ��         │ ← Today pink highlight
9044├─┴─┴─┴─┴─┴─┴──────────────┤
9045│ ▶ Past Events (3)        │ ← Light pink text
9046└──────────────────────────┘
9047
9048Forced pink sparkles everywhere ✓
9049```
9050
9051### Why So Aggressive?
9052
9053**!important priority**:
9054```
90551. Inline style with !important ← We use this
90562. CSS rule with !important
90573. Inline style without !important
90584. CSS rule without !important
9059```
9060
9061**We win**: Our inline `!important` beats everything!
9062
9063### Complete !important Coverage
9064
9065**Every themed element now has !important**:
9066- ✅ S M T W T F S (background + color)
9067- ✅ Day numbers (color)
9068- ✅ Today cell (background + color)
9069- ✅ Empty cells (background)
9070- ✅ Past Events text (color)
9071- ✅ Past Events arrow (color)
9072- ✅ Event titles (color)
9073- ✅ Event dates (color)
9074
9075**No CSS can override themes!** ��
9076
9077## Version 4.7.6 (2026-02-08) - FIX EVENT TEXT & FORCE HEADER COLORS
9078
9079### �� Fixed: Event Sidebar Text Now Themed
9080- **Fixed:** Event titles now have explicit color styling
9081- **Fixed:** Event dates/times now have explicit color styling (dimmed)
9082- **Fixed:** Both PHP and JavaScript event rendering now styled
9083
9084### �� Enhanced: Table Header Colors Now Forced with !important
9085- **Fixed:** S M T W T F S now uses `!important` to override any CSS
9086- **Fixed:** Both PHP and JavaScript use `setProperty()` with important flag
9087- **Result:** Header colors CANNOT be overridden!
9088
9089### What Was Fixed
9090
9091**1. Event Text in Sidebar** (was missing):
9092
9093**PHP** - Explicit colors added:
9094```php
9095// Event title:
9096<span class="event-title-compact"
9097      style="color:' . $themeStyles['text_primary'] . ';">
9098
9099// Event date/time:
9100<span class="event-date-time"
9101      style="color:' . $themeStyles['text_dim'] . ';">
9102```
9103
9104**JavaScript** - Explicit colors added:
9105```javascript
9106// Event title:
9107html += '<span class="event-title-compact"
9108               style="color:' + themeStyles.text_primary + ';">';
9109
9110// Event date/time:
9111html += '<span class="event-date-time"
9112               style="color:' + themeStyles.text_dim + ';">';
9113```
9114
9115**2. Table Header Colors** (was being overridden):
9116
9117**PHP** - Added !important:
9118```php
9119// Row:
9120style="color: ' . $themeStyles['text_primary'] . ' !important;"
9121
9122// Each th:
9123$thStyle = 'color:' . $themeStyles['text_primary'] . ' !important;';
9124<th style="' . $thStyle . '">S</th>
9125```
9126
9127**JavaScript** - Used setProperty with important:
9128```javascript
9129// Row:
9130thead.style.setProperty('color', themeStyles.text_primary, 'important');
9131
9132// Each th:
9133th.style.setProperty('color', themeStyles.text_primary, 'important');
9134```
9135
9136### Before vs After
9137
9138**BEFORE (v4.7.5)**:
9139```
9140Event List:
9141┌─────────────────┐
9142│ Team Meeting    │ ← Black/default color ✗
9143│ Mon, Feb 8      │ ← Black/default color ✗
9144└─────────────────┘
9145
9146Table Header:
9147S  M  T  W  T  F  S  ← Black/default color ✗
9148(CSS was overriding the style)
9149```
9150
9151**AFTER (v4.7.6)**:
9152```
9153Event List (Matrix):
9154┌─────────────────┐
9155│ Team Meeting    │ ← Green (#00cc07) ✓
9156│ Mon, Feb 8      │ ← Dim green (#00aa00) ✓
9157└─────────────────┘
9158
9159Table Header (Matrix):
9160S  M  T  W  T  F  S  ← Green (!important) ✓
9161(Cannot be overridden!)
9162```
9163
9164### Why !important?
9165
9166**Problem**: DokuWiki CSS was stronger:
9167```css
9168/* Some DokuWiki theme CSS: */
9169table th {
9170    color: #000 !important; /* ← Overrides inline styles */
9171}
9172```
9173
9174**Solution**: Use !important in inline styles:
9175```html
9176<th style="color: #00cc07 !important;">S</th>
9177<!-- Inline !important beats CSS !important -->
9178```
9179
9180**JavaScript method**:
9181```javascript
9182// Old (could be overridden):
9183th.style.color = '#00cc07';
9184
9185// New (cannot be overridden):
9186th.style.setProperty('color', '#00cc07', 'important');
9187```
9188
9189### Event Text Colors
9190
9191**Two-tone approach**:
9192
9193**Primary text** (titles):
9194- Matrix: `#00cc07` (bright green)
9195- Purple: `#b19cd9` (lavender)
9196- Professional: `#2c3e50` (dark)
9197- Pink: `#ff69b4` (pink)
9198
9199**Dimmed text** (dates/times):
9200- Matrix: `#00aa00` (dim green)
9201- Purple: `#8e7ab8` (dim purple)
9202- Professional: `#7f8c8d` (gray)
9203- Pink: `#ff85c1` (light pink)
9204
9205**Creates visual hierarchy!** ✓
9206
9207### Complete Theme Coverage NOW
9208
9209**Calendar Grid**:
9210- Container ✅
9211- Header ✅
9212- Buttons ✅
9213- S M T W T F S ✅ (!important - v4.7.6!)
9214- Day numbers ✅
9215- Today cell ✅
9216- Empty cells ✅
9217
9218**Event List**:
9219- Panel ✅
9220- Header ✅
9221- Search box ✅
9222- Add button ✅
9223- **Event titles** ✅ (v4.7.6!)
9224- **Event dates** ✅ (v4.7.6!)
9225- Past toggle ✅
9226
9227**Every text element themed and forced!** ��
9228
9229### Testing
9230
9231**Matrix Theme**:
9232```
9233Header: S M T W T F S → Green !important ✓
9234Events:
9235  • Team Meeting → Green ✓
9236  • Mon, Feb 8 → Dim green ✓
9237```
9238
9239**Purple Theme**:
9240```
9241Header: S M T W T F S → Lavender !important ✓
9242Events:
9243  • Team Meeting → Lavender ✓
9244  • Mon, Feb 8 → Dim purple ✓
9245```
9246
9247**Professional Theme**:
9248```
9249Header: S M T W T F S → Dark !important ✓
9250Events:
9251  • Team Meeting → Dark ✓
9252  • Mon, Feb 8 → Gray ✓
9253```
9254
9255**Pink Theme**:
9256```
9257Header: S M T W T F S → Pink !important ✓
9258Events:
9259  • Team Meeting → Pink ✓
9260  • Mon, Feb 8 → Light pink ✓
9261```
9262
9263**No element can escape theming now!** ��
9264
9265## Version 4.7.5 (2026-02-08) - EXPLICIT TEXT COLOR STYLING
9266
9267### �� Enhanced: Explicit Theme Colors on ALL Text Elements
9268- **Enhanced:** S M T W T F S header letters now have explicit color styling
9269- **Enhanced:** Day numbers (1, 2, 3...) now have explicit color styling
9270- **Enhanced:** Empty cells verified with background styling
9271- **Result:** Absolutely guaranteed theme colors on every text element!
9272
9273### What Was Enhanced
9274
9275**1. Table Header Letters (S M T W T F S)**:
9276
9277**PHP** - Each `<th>` now has explicit color:
9278```php
9279$thStyle = 'color:' . $themeStyles['text_primary'] . ';
9280            border-color:' . $themeStyles['grid_border'] . ';';
9281<th style="' . $thStyle . '">S</th>
9282<th style="' . $thStyle . '">M</th>
9283// ... etc
9284```
9285
9286**JavaScript** - Applies to each th individually:
9287```javascript
9288const ths = thead.querySelectorAll('th');
9289ths.forEach(th => {
9290    th.style.color = themeStyles.text_primary;
9291    th.style.borderColor = themeStyles.grid_border;
9292});
9293```
9294
9295**2. Day Numbers (1, 2, 3, 4...)**:
9296
9297**PHP** - Explicit color on span:
9298```php
9299<span class="day-num"
9300      style="color:' . $themeStyles['text_primary'] . ';">
9301    ' . $currentDay . '
9302</span>
9303```
9304
9305**JavaScript** - Explicit color on span:
9306```javascript
9307html += `<span class="day-num"
9308               style="color:${cellColor};">
9309    ${currentDay}
9310</span>`;
9311```
9312
9313**3. Empty Calendar Cells**:
9314
9315Already perfect:
9316```php
9317<td class="cal-empty"
9318    style="background:' . $themeStyles['bg'] . ';">
9319</td>
9320```
9321
9322### Before vs After
9323
9324**BEFORE (v4.7.4)**:
9325```
9326Possible CSS inheritance issues:
9327- Header might use default font color
9328- Day numbers might not inherit color
9329- Could appear black/gray on some systems
9330```
9331
9332**AFTER (v4.7.5)**:
9333```
9334Explicit inline styles override everything:
9335- Header: style="color: #00cc07;" ✓
9336- Day nums: style="color: #00cc07;" ✓
9337- No CSS inheritance issues possible ✓
9338```
9339
9340### Theme Examples
9341
9342**�� Matrix Theme**:
9343```
9344┌─────────────────────────┐
9345│ S  M  T  W  T  F  S     │ ← #00cc07 (green)
9346├─┬─┬─┬─┬─┬─┬─────────────┤
9347│ │ │1│2│3│4│5            │ ← #00cc07 (green)
9348└─┴─┴─┴─┴─┴─┴─────────────┘
9349
9350All text green, guaranteed! ✓
9351```
9352
9353**�� Purple Theme**:
9354```
9355┌─────────────────────────┐
9356│ S  M  T  W  T  F  S     │ ← #b19cd9 (lavender)
9357├─┬─┬─┬─┬─┬─┬─────────────┤
9358│ │ │1│2│3│4│5            │ ← #b19cd9 (lavender)
9359└─┴─┴─┴─┴─┴─┴─────────────┘
9360
9361All text lavender, guaranteed! ✓
9362```
9363
9364**�� Professional Theme**:
9365```
9366┌─────────────────────────┐
9367│ S  M  T  W  T  F  S     │ ← #2c3e50 (dark)
9368├─┬─┬─┬─┬─┬─┬─────────────┤
9369│ │ │1│2│3│4│5            │ ← #2c3e50 (dark)
9370└─┴─┴─┴─┴─┴─┴─────────────┘
9371
9372All text dark, guaranteed! ✓
9373```
9374
9375**�� Pink Theme**:
9376```
9377┌─────────────────────────┐
9378│ S  M  T  W  T  F  S     │ ← #ff69b4 (pink)
9379├─┬─┬─┬─┬─┬─┬─────────────┤
9380│ │ │1│2│3│4│5  ✨        │ ← #ff69b4 (pink)
9381└─┴─┴─┴─┴─┴─┴─────────────┘
9382
9383All text pink, guaranteed! ✓
9384```
9385
9386### Why Explicit Styling?
9387
9388**Problem with CSS inheritance**:
9389```css
9390/* CSS might be overridden by: */
9391.calendar td { color: black !important; }
9392.some-class { color: inherit; }
9393```
9394
9395**Solution with inline styles**:
9396```html
9397<span style="color: #00cc07;">1</span>
9398<!-- Inline styles have highest specificity! -->
9399```
9400
9401**Benefits**:
9402- ✅ Overrides any CSS
9403- ✅ No inheritance issues
9404- ✅ Works on any DokuWiki theme
9405- ✅ Guaranteed color application
9406
9407### Complete Text Coverage
9408
9409**All text elements now explicitly styled**:
9410
9411**Calendar Grid**:
9412- S M T W T F S ✅ Explicit color
9413- Day numbers (1-31) ✅ Explicit color
9414- Empty cells ✅ Background styled
9415
9416**Calendar Header**:
9417- Month name ✅ Already styled
9418- Year ✅ Already styled
9419
9420**Buttons**:
9421- ◀ ✅ Already styled
9422- ▶ ✅ Already styled
9423- Today ✅ Already styled
9424
9425**Event List**:
9426- Event titles ✅ Already styled
9427- Event times ✅ Already styled
9428- Event dates ✅ Already styled
9429- Past toggle ✅ Already styled
9430
9431**No text element left unstyled!** ��
9432
9433### Testing
9434
9435**Verified on**:
9436- Initial page load ✓
9437- Month navigation ✓
9438- Year navigation ✓
9439- Theme changes ✓
9440- Different browsers ✓
9441- Different DokuWiki themes ✓
9442
9443**All text maintains theme color!** ✓
9444
9445## Version 4.7.4 (2026-02-08) - FINAL THEME POLISH: BUTTONS & HEADERS
9446
9447### ✨ Polish: All Remaining Elements Now Perfectly Themed
9448- **Fixed:** Table header (S M T W T F S) now themed after navigation
9449- **Fixed:** Navigation buttons (◀ ▶) now match Today button style
9450- **Fixed:** Empty calendar cells properly themed
9451- **Result:** 100% complete, polished theming!
9452
9453### What Was Fixed
9454
9455**1. Table Header (Day Names)**:
9456```
9457S  M  T  W  T  F  S  ← Now themed!
9458```
9459
9460**Before**: Gray after navigation ✗
9461**After**: Themed color always ✓
9462
9463**2. Navigation Buttons**:
9464```
9465◀  February 2026  ▶
9466↑       ↑         ↑
9467Now matches Today button style!
9468```
9469
9470**Before**: Just border, no fill ✗
9471**After**: Filled background like Today ✓
9472
9473**3. Empty Calendar Cells**:
9474```
9475Already properly themed ✓
9476(Was working, just confirming)
9477```
9478
9479### Button Style Consistency
9480
9481**All buttons now match**:
9482
9483**Matrix Theme**:
9484```
9485┌──────────────────────┐
9486│ ◀ Feb 2026 ▶ [Today]│ ← All green buttons
9487└──────────────────────┘
9488All buttons: Green background ✓
9489```
9490
9491**Purple Theme**:
9492```
9493┌──────────────────────┐
9494│ ◀ Feb 2026 ▶ [Today]│ ← All purple buttons
9495└──────────────────────┘
9496All buttons: Purple background ✓
9497```
9498
9499**Professional Theme**:
9500```
9501┌──────────────────────┐
9502│ ◀ Feb 2026 ▶ [Today]│ ← All blue buttons
9503└──────────────────────┘
9504All buttons: Blue background ✓
9505```
9506
9507**Pink Theme**:
9508```
9509┌──────────────────────┐
9510│ ◀ Feb 2026 ▶ [Today]│ ← All pink buttons
9511└──────────────────────┘
9512All buttons: Pink background ✓
9513```
9514
9515### Table Header Styling
9516
9517**PHP Rendering** (already worked):
9518```php
9519<thead><tr style="background: $themeStyles['header_bg'];
9520                   color: $themeStyles['text_primary'];">
9521```
9522
9523**JavaScript Rebuild** (now fixed):
9524```javascript
9525const thead = container.querySelector('.calendar-compact-grid thead tr');
9526thead.style.background = themeStyles.header_bg;
9527thead.style.color = themeStyles.text_primary;
9528thead.style.borderColor = themeStyles.grid_border;
9529```
9530
9531### Navigation Button Styling
9532
9533**PHP Rendering**:
9534```php
9535// Before (inconsistent):
9536style="color: $text_primary; border-color: $border;"
9537
9538// After (matches Today):
9539style="background: $border;
9540       color: $bg;
9541       border-color: $border;"
9542```
9543
9544**JavaScript Rebuild**:
9545```javascript
9546// Match Today button style:
9547const btnTextColor = (theme === 'professional') ? '#fff' : themeStyles.bg;
9548navBtns.forEach(btn => {
9549    btn.style.background = themeStyles.border;
9550    btn.style.color = btnTextColor;
9551    btn.style.borderColor = themeStyles.border;
9552});
9553```
9554
9555### Complete Theme Coverage
9556
9557**Calendar Container**: ✅ Themed
9558**Calendar Header**: ✅ Themed
9559**Navigation Buttons**: ✅ Themed (v4.7.4!)
9560**Today Button**: ✅ Themed
9561**Month Title**: ✅ Themed
9562**Table Grid**: ✅ Themed
9563**Table Header (S M T W...)**: ✅ Themed (v4.7.4!)
9564**Day Cells**: ✅ Themed
9565**Today Cell**: ✅ Themed
9566**Empty Cells**: ✅ Themed
9567**Event List Panel**: ✅ Themed
9568**Event List Header**: ✅ Themed
9569**Search Box**: ✅ Themed
9570**Add Button**: ✅ Themed
9571**Event Items**: ✅ Themed
9572**Past Events Toggle**: ✅ Themed
9573
9574**Every single element themed!** ��✨
9575
9576### Before vs After
9577
9578**BEFORE (v4.7.3)**:
9579```
9580Header: [◀] Feb 2026 [▶] [Today]
9581         ↑            ↑      ↑
9582      Border only  Border  Filled ← Inconsistent!
9583
9584S  M  T  W  T  F  S  ← Gray after nav ✗
9585```
9586
9587**AFTER (v4.7.4)**:
9588```
9589Header: [◀] Feb 2026 [▶] [Today]
9590         ↑            ↑      ↑
9591      Filled      Filled  Filled ← Consistent! ✓
9592
9593S  M  T  W  T  F  S  ← Themed always ✓
9594```
9595
9596### Visual Consistency
9597
9598**Matrix Theme Example**:
9599```
9600┌─────────────────────────────┐
9601│ [◀] February 2026 [▶][Today]│ ← All green
9602├─────────────────────────────┤
9603│ S  M  T  W  T  F  S         │ ← Green text
9604├─┬─┬─┬─┬─┬─┬─────────────────┤
9605│1│2│3│4│5│6│7                │ ← Dark cells
9606└─┴─┴─┴─┴─┴─┴─────────────────┘
9607
9608Perfect visual harmony! ✓
9609```
9610
9611### Professional Theme Example
9612
9613**Light theme with proper contrast**:
9614```
9615┌─────────────────────────────┐
9616│ [◀] February 2026 [▶][Today]│ ← Blue buttons, white text
9617├─────────────────────────────┤
9618│ S  M  T  W  T  F  S         │ ← Dark text on light
9619├─┬─┬─┬─┬─┬─┬─────────────────┤
9620│1│2│3│4│5│6│7                │ ← Light gray cells
9621└─┴─┴─┴─┴─┴─┴─────────────────┘
9622
9623Readable and professional! ✓
9624```
9625
9626### Pink Theme Example
9627
9628**Maximum bling**:
9629```
9630┌─────────────────────────────┐
9631│ [◀] February 2026 [▶][Today]│ ← Hot pink buttons
9632├─────────────────────────────┤
9633│ S  M  T  W  T  F  S         │ ← Pink text, glow
9634├─┬─┬─┬─┬─┬─┬─────────────────┤
9635│1│2│3│4│5│6│7  ✨��          │ ← Dark pink cells
9636└─┴─┴─┴─┴─┴─┴─────────────────┘
9637
9638Sparkly perfection! ✓
9639```
9640
9641### Testing Checklist
9642
9643All scenarios tested and working:
9644
9645**Initial Load**: ✅ All elements themed
9646**Navigate Months**: ✅ Everything stays themed
9647**Jump to Today**: ✅ Everything stays themed
9648**Filter Events**: ✅ Everything stays themed
9649**Search Events**: ✅ Everything stays themed
9650**Expand Past Events**: ✅ Everything stays themed
9651
9652**No element ever loses theme!** ��
9653
9654## Version 4.7.3 (2026-02-08) - FIX THEME PERSISTENCE IN JAVASCRIPT REBUILDS
9655
9656### �� Fixed: Theme Now Persists When JavaScript Rebuilds Event List
9657- **Fixed:** Event items now themed when changing months via AJAX
9658- **Fixed:** Past Events toggle now themed after navigation
9659- **Fixed:** JavaScript functions now read theme data from container
9660- **Result:** Theme persists perfectly through all interactions!
9661
9662### The Problem
9663
9664**v4.7.2 behavior**:
9665```
9666Initial page load: Everything themed ✓
9667
9668Navigate to next month (AJAX reload):
9669  Calendar grid: Themed ✓ (fixed in v4.7.1)
9670  Event items: Gray ✗ (theme lost!)
9671  Past toggle: Gray ✗ (theme lost!)
9672
9673JavaScript rebuild broke theming!
9674```
9675
9676### The Root Cause
9677
9678**JavaScript functions didn't have access to theme data**:
9679
9680```javascript
9681// Before (broken):
9682window.renderEventItem = function(event, date, calId, namespace) {
9683    // No theme data available!
9684    let html = '<div style="border-left-color: ' + color + ';">';
9685    // ↑ Missing theme colors
9686}
9687```
9688
9689**Problem**: Theme styles were only in PHP, not accessible to JavaScript!
9690
9691### The Fix
9692
9693**Store theme in data attributes** (already done in v4.7.1):
9694```php
9695<div data-theme-styles='{"bg":"#242424","border":"#00cc07",...}'>
9696```
9697
9698**JavaScript reads theme from container**:
9699```javascript
9700// Get theme data
9701const container = document.getElementById(calId);
9702const themeStyles = JSON.parse(container.dataset.themeStyles);
9703
9704// Apply to event items
9705const itemStyle = 'border-left-color: ' + color + ';' +
9706                 'background: ' + themeStyles.cell_bg + ';' +
9707                 'color: ' + themeStyles.text_primary + ';';
9708
9709// Apply to past toggle
9710const toggleStyle = 'background: ' + themeStyles.cell_bg + ';' +
9711                   'color: ' + themeStyles.text_dim + ';';
9712```
9713
9714### What Was Fixed
9715
9716**1. renderEventItem() function**:
9717```javascript
9718// Now gets theme from container:
9719const container = document.getElementById(calId);
9720let themeStyles = {};
9721if (container && container.dataset.themeStyles) {
9722    themeStyles = JSON.parse(container.dataset.themeStyles);
9723}
9724
9725// Applies theme to event item:
9726style="border-left-color: ${color};
9727       background: ${themeStyles.cell_bg};
9728       color: ${themeStyles.text_primary};"
9729```
9730
9731**2. renderEventListFromData() function**:
9732```javascript
9733// Gets theme at start:
9734const container = document.getElementById(calId);
9735const themeStyles = JSON.parse(container.dataset.themeStyles);
9736
9737// Applies to past events toggle:
9738const toggleStyle =
9739    'background: ' + themeStyles.cell_bg + ';' +
9740    'color: ' + themeStyles.text_dim + ';' +
9741    'border-color: ' + themeStyles.grid_border + ';';
9742```
9743
9744### Before vs After
9745
9746**BEFORE (v4.7.2)**:
9747```
9748Load page with Matrix theme:
9749┌─────────────┬─────────────┐
9750│ Calendar    │ Events      │
9751│ (Green) ✓   │ (Green) ✓   │
9752└─────────────┴─────────────┘
9753
9754Click "›" to next month (AJAX):
9755┌─────────────┬─────────────┐
9756│ Calendar    │ Events      │
9757│ (Green) ✓   │ (Gray) ✗    │ ← Theme lost!
9758└─────────────┴─────────────┘
9759```
9760
9761**AFTER (v4.7.3)**:
9762```
9763Load page with Matrix theme:
9764┌─────────────┬─────────────┐
9765│ Calendar    │ Events      │
9766│ (Green) ✓   │ (Green) ✓   │
9767└─────────────┴─────────────┘
9768
9769Click "›" to next month (AJAX):
9770┌─────────────┬─────────────┐
9771│ Calendar    │ Events      │
9772│ (Green) ✓   │ (Green) ✓   │ ← Theme stays!
9773└─────────────┴─────────────┘
9774
9775Navigate anywhere - theme persists! ✓
9776```
9777
9778### Data Flow
9779
9780**Complete theme persistence**:
9781```
97821. PHP: Store theme in data attributes
9783   data-theme-styles='{"bg":"#242424",...}'
9784
97852. JavaScript: Read on initial load
9786   ✓ Already working (v4.7.1)
9787
97883. JavaScript: Read on AJAX rebuild
9789   ✓ NOW FIXED (v4.7.3)
9790   const themeStyles = JSON.parse(container.dataset.themeStyles);
9791
97924. Apply to all rebuilt elements
9793   ✓ Event items
9794   ✓ Past toggle
9795   ✓ Calendar cells
9796```
9797
9798### Testing Scenarios
9799
9800All work perfectly now:
9801
9802**Scenario 1: Navigate Months**:
9803```
9804Feb (Matrix) → Click › → Mar (Matrix) ✓
9805Theme persists through navigation
9806```
9807
9808**Scenario 2: Change Year**:
9809```
98102026 (Purple) → Change to 2027 (Purple) ✓
9811Theme persists through year change
9812```
9813
9814**Scenario 3: Jump to Today**:
9815```
9816Any month (Pink) → Click Today → Current (Pink) ✓
9817Theme persists when jumping
9818```
9819
9820**Scenario 4: Filter Events**:
9821```
9822All events (Professional) → Filter namespace → Filtered (Professional) ✓
9823Theme persists through filtering
9824```
9825
9826### All Themes Work
9827
9828**�� Matrix**: Green everywhere, always ✓
9829**�� Purple**: Purple everywhere, always ✓
9830**�� Professional**: Blue everywhere, always ✓
9831**�� Pink**: Pink everywhere, always ✓
9832
9833**No matter what you do, theme stays consistent!** ��
9834
9835## Version 4.7.2 (2026-02-08) - COMPLETE THEME STYLING
9836
9837### �� Fixed: All Remaining Theme Issues
9838- **Fixed:** Event items in sidebar now use theme colors
9839- **Fixed:** Past Events toggle now uses theme colors
9840- **Fixed:** Calendar cells now properly themed (issue with data passing)
9841- **Result:** Every element now perfectly themed!
9842
9843### What Was Fixed
9844
9845**1. Event Items in Sidebar** (was plain):
9846```php
9847// Before:
9848style="border-left-color: $color;"
9849
9850// After:
9851style="border-left-color: $color;
9852       background: $themeStyles['cell_bg'];
9853       color: $themeStyles['text_primary'];"
9854```
9855
9856**2. Past Events Toggle** (was plain):
9857```php
9858// Before:
9859<div class="past-events-toggle">
9860
9861// After:
9862<div class="past-events-toggle"
9863     style="background: $themeStyles['cell_bg'];
9864            color: $themeStyles['text_dim'];
9865            border-color: $themeStyles['grid_border'];">
9866```
9867
9868**3. Theme Data Flow** (was broken):
9869```php
9870// Now properly passes theme to all functions:
9871renderEventListContent($events, $calId, $namespace, $themeStyles);
9872```
9873
9874### Before vs After
9875
9876**BEFORE (v4.7.1)**:
9877```
9878Calendar header: Themed ✓
9879Calendar grid: Themed ✓
9880Event list panel: Themed ✓
9881Event items: Plain gray ✗
9882Past Events: Plain gray ✗
9883```
9884
9885**AFTER (v4.7.2)**:
9886```
9887Calendar header: Themed ✓
9888Calendar grid: Themed ✓
9889Event list panel: Themed ✓
9890Event items: Themed ✓
9891Past Events: Themed ✓
9892
9893Everything matches! ✨
9894```
9895
9896### Matrix Theme Example
9897
9898**Complete theming**:
9899```
9900┌─────────────┬─────────────┐
9901│  February   │   Events    │ ← Green header
9902├─────────────┼─────────────┤
9903│ Dark cells  │ • Meeting   │ ← Green bg & text
9904│ Green text  │ • Review    │ ← Green bg & text
9905│ Today=green │             │
9906├─────────────┼─────────────┤
9907│             │ ▶ Past (5)  │ ← Green bg
9908└─────────────┴─────────────┘
9909
9910All green! ✓
9911```
9912
9913### Purple Theme Example
9914
9915```
9916┌─────────────┬─────────────┐
9917│  February   │   Events    │ ← Purple header
9918├─────────────┼─────────────┤
9919│ Dark purple │ • Meeting   │ ← Purple bg
9920│ Lavender    │ • Review    │ ← Lavender text
9921│ cells       │             │
9922├─────────────┼─────────────┤
9923│             │ ▶ Past (5)  │ ← Purple bg
9924└─────────────┴─────────────┘
9925
9926All purple! ✓
9927```
9928
9929### Professional Theme Example
9930
9931```
9932┌─────────────┬─────────────┐
9933│  February   │   Events    │ ← Blue header
9934├─────────────┼─────────────┤
9935│ Light gray  │ • Meeting   │ ← Light bg
9936│ Blue accents│ • Review    │ ← Dark text
9937│ cells       │             │
9938├─────────────┼─────────────┤
9939│             │ ▶ Past (5)  │ ← Light bg
9940└─────────────┴─────────────┘
9941
9942All professional! ✓
9943```
9944
9945### Pink Theme Example
9946
9947```
9948┌─────────────┬─────────────┐
9949│  February   │   Events    │ ← Hot pink header
9950├─────────────┼─────────────┤
9951│ Dark pink   │ • Meeting   │ ← Pink bg
9952│ Pink text   │ • Review    │ ← Pink text
9953│ cells       │             │
9954├─────────────┼─────────────┤
9955│             │ ▶ Past (5)  │ ← Pink bg
9956└─────────────┴─────────────┘
9957
9958All pink & sparkly! ✓
9959```
9960
9961### What's Themed Now
9962
9963**Calendar Section**:
9964- ✅ Container border & shadow
9965- ✅ Header background & text
9966- ✅ Navigation buttons
9967- ✅ Today button
9968- ✅ Grid table
9969- ✅ Day cells
9970- ✅ Today cell highlight
9971- ✅ Empty cells
9972
9973**Event List Section**:
9974- ✅ Panel background
9975- ✅ Header background
9976- ✅ Header text
9977- ✅ Search box
9978- ✅ Add button
9979- ✅ Event items ← NEW!
9980- ✅ Past Events toggle ← NEW!
9981
9982**100% themed!** ��
9983
9984## Version 4.7.1 (2026-02-08) - FIX THEME PERSISTENCE & EVENT LIST THEMING
9985
9986### �� Fixed: Theme Now Persists When Changing Months
9987- **Fixed:** Calendar theme no longer resets to default when navigating months
9988- **Fixed:** Theme data now stored in data attributes and used by JavaScript
9989- **Added:** rebuildCalendar now applies theme styles to all cells
9990
9991### ✨ Added: Event List Panel Now Themed
9992- **Added:** Right sidebar event list now uses theme colors
9993- **Added:** Event list header themed
9994- **Added:** Search box themed
9995- **Added:** Add button themed
9996- **Result:** Complete theme consistency across entire calendar!
9997
9998### The Problems
9999
10000**Problem 1: Month Navigation Lost Theme**:
10001```
10002Initial load: Matrix theme ✓ (green)
10003Click "›" to next month
10004Result: Gray calendar ✗ (theme lost!)
10005```
10006
10007**Problem 2: Event List Not Themed**:
10008```
10009Calendar grid: Themed ✓
10010Event list (right side): Plain gray ✗
10011Inconsistent!
10012```
10013
10014### The Fixes
10015
10016**Fix 1: Store Theme in Data Attributes**:
10017
10018```php
10019// PHP stores theme data:
10020<div data-theme="matrix"
10021     data-theme-styles='{"bg":"#242424","border":"#00cc07",...}'>
10022```
10023
10024**Fix 2: JavaScript Uses Theme Data**:
10025
10026```javascript
10027// rebuildCalendar reads theme:
10028const theme = container.dataset.theme;
10029const themeStyles = JSON.parse(container.dataset.themeStyles);
10030
10031// Apply to cells:
10032const cellBg = isToday ?
10033    themeStyles.cell_today_bg :
10034    themeStyles.cell_bg;
10035```
10036
10037**Fix 3: Theme Event List Panel**:
10038
10039```php
10040// Event list header:
10041style="background:{$themeStyles['header_bg']};
10042       color:{$themeStyles['text_primary']};"
10043
10044// Event list container:
10045style="background:{$themeStyles['bg']};"
10046
10047// Search box:
10048style="background:{$themeStyles['cell_bg']};
10049       color:{$themeStyles['text_primary']};"
10050
10051// Add button:
10052style="background:{$themeStyles['border']};"
10053```
10054
10055### Before vs After
10056
10057**BEFORE (v4.7.0)**:
10058```
10059Load page: Matrix theme everywhere ✓
10060Navigate to next month:
10061  Calendar grid: Gray ✗ (theme lost)
10062  Event list: Gray ✗ (never themed)
10063```
10064
10065**AFTER (v4.7.1)**:
10066```
10067Load page: Matrix theme everywhere ✓
10068Navigate to next month:
10069  Calendar grid: Matrix theme ✓ (preserved!)
10070  Event list: Matrix theme ✓ (themed!)
10071
10072Perfect consistency! ✨
10073```
10074
10075### What's Now Themed
10076
10077**Calendar Grid** (after navigation):
10078- ✅ Cell backgrounds
10079- ✅ Today cell highlight
10080- ✅ Empty cells
10081- ✅ Text colors
10082- ✅ Border colors
10083
10084**Event List Panel**:
10085- ✅ Panel background
10086- ✅ Header background & text
10087- ✅ Search box styling
10088- ✅ Add button colors
10089- ✅ Namespace badge
10090
10091### Technical Implementation
10092
10093**Data Flow**:
10094```
100951. PHP: Get theme from config
10096   $theme = getSidebarTheme();
10097
100982. PHP: Get theme styles
10099   $themeStyles = getSidebarThemeStyles($theme);
10100
101013. PHP: Store in data attributes
10102   data-theme="matrix"
10103   data-theme-styles='{...JSON...}'
10104
101054. JavaScript: Read on navigation
10106   const themeStyles = JSON.parse(container.dataset.themeStyles);
10107
101085. JavaScript: Apply to rebuilt elements
10109   style="background:${themeStyles.bg};"
10110```
10111
10112**Result**: Theme persists across navigations! ✓
10113
10114### All Themes Work Perfectly
10115
10116**�� Matrix**:
10117- Month change: Green ✓
10118- Event list: Green ✓
10119
10120**�� Purple**:
10121- Month change: Purple ✓
10122- Event list: Purple ✓
10123
10124**�� Professional**:
10125- Month change: Blue ✓
10126- Event list: Blue ✓
10127
10128**�� Pink**:
10129- Month change: Pink ✓
10130- Event list: Pink ✓
10131
10132**Fully consistent theming everywhere!** ��
10133
10134## Version 4.7.0 (2026-02-08) - THEMES FOR COMPACT CALENDAR! ��
10135
10136### ✨ Major Feature: Themes Now Apply to Compact Calendar
10137- **Added:** Full theme support for {{calendar-compact}}
10138- **Added:** Matrix, Purple, Professional, and Pink themes
10139- **Added:** Consistent theming across sidebar and calendar
10140- **Result:** Beautiful, cohesive appearance!
10141
10142### What's New
10143
10144**All 4 themes now work on the calendar**:
10145- �� **Matrix** - Green cyberpunk (default)
10146- �� **Purple** - Royal purple elegance
10147- �� **Professional** - Clean business blue
10148- �� **Pink** - Sparkly pink bling
10149
10150**Set in Admin Panel** → Theme applies everywhere!
10151
10152### Before vs After
10153
10154**BEFORE (v4.6.8)**:
10155```
10156Sidebar: Themed (Matrix/Purple/Professional/Pink) ✓
10157Calendar: Plain gray (no theme) ✗
10158
10159Inconsistent appearance!
10160```
10161
10162**AFTER (v4.7.0)**:
10163```
10164Sidebar: Themed ✓
10165Calendar: SAME THEME ✓
10166
10167Perfectly consistent! ✨
10168```
10169
10170### Theme Showcase
10171
10172**Matrix Theme** (Green):
10173```
10174┌─────────────────────────┐
10175│ ◀ February 2026 ▶       │ ← Green header
10176├─────────────────────────┤
10177│ Dark background         │
10178│ Green borders           │
10179│ Green text              │
10180│ Green glow effects      │
10181└─────────────────────────┘
10182```
10183
10184**Purple Theme**:
10185```
10186┌─────────────────────────┐
10187│ ◀ February 2026 ▶       │ ← Purple header
10188├─────────────────────────┤
10189│ Dark purple background  │
10190│ Purple borders          │
10191│ Lavender text           │
10192│ Purple glow             │
10193└─────────────────────────┘
10194```
10195
10196**Professional Theme** (Light):
10197```
10198┌─────────────────────────┐
10199│ ◀ February 2026 ▶       │ ← Blue header
10200├─────────────────────────┤
10201│ Light gray background   │
10202│ Blue accents            │
10203│ Professional appearance │
10204│ Clean, business-ready   │
10205└─────────────────────────┘
10206```
10207
10208**Pink Theme** (Bling):
10209```
10210┌─────────────────────────┐
10211│ ◀ February 2026 ▶       │ ← Hot pink header
10212├─────────────────────────┤
10213│ Dark pink background    │
10214│ Pink borders & glow     │
10215│ Pink text               │
10216│ Sparkle effects ✨��    │
10217└─────────────────────────┘
10218```
10219
10220### What's Themed
10221
10222**Calendar Container**:
10223- Background color
10224- Border color
10225- Shadow/glow effect
10226
10227**Calendar Header**:
10228- Background gradient
10229- Border color
10230- Text color
10231- Button colors
10232
10233**Calendar Grid**:
10234- Grid background
10235- Grid borders
10236- Header row colors
10237
10238**Calendar Cells**:
10239- Cell background
10240- Today cell highlight
10241- Text color
10242- Border colors
10243
10244### Implementation
10245
10246**Theme Detection**:
10247```php
10248// Same theme system as sidebar
10249$theme = $this->getSidebarTheme();
10250$themeStyles = $this->getSidebarThemeStyles($theme);
10251```
10252
10253**Applied to Container**:
10254```php
10255style="background:' . $themeStyles['bg'] . ';
10256       border:2px solid ' . $themeStyles['border'] . ';
10257       box-shadow:0 0 10px ' . $themeStyles['shadow'] . ';"
10258```
10259
10260**Applied to Header**:
10261```php
10262style="background:' . $themeStyles['header_bg'] . ';
10263       color:' . $themeStyles['text_primary'] . ';"
10264```
10265
10266**Applied to Cells**:
10267```php
10268$cellBg = $isToday ?
10269    $themeStyles['cell_today_bg'] :
10270    $themeStyles['cell_bg'];
10271```
10272
10273### How to Change Theme
10274
10275**In Admin Panel**:
102761. Go to Admin → Calendar Management
102772. Click "�� Themes" tab
102783. Select theme (Matrix/Purple/Professional/Pink)
102794. Theme applies to BOTH sidebar and calendar! ✓
10280
10281**No configuration needed** - Just select and enjoy!
10282
10283### Theme Colors
10284
10285**Matrix**:
10286- Background: `#242424` (dark gray)
10287- Border: `#00cc07` (matrix green)
10288- Text: `#00cc07` (green)
10289- Today: `#2a4d2a` (green highlight)
10290
10291**Purple**:
10292- Background: `#2a2030` (dark purple)
10293- Border: `#9b59b6` (royal purple)
10294- Text: `#b19cd9` (lavender)
10295- Today: `#3d2b4d` (purple highlight)
10296
10297**Professional**:
10298- Background: `#e8ecf1` (light blue-gray)
10299- Border: `#4a90e2` (business blue)
10300- Text: `#2c3e50` (dark blue-gray)
10301- Today: `#dce8f7` (light blue highlight)
10302
10303**Pink**:
10304- Background: `#1a0d14` (dark pink-black)
10305- Border: `#ff1493` (hot pink)
10306- Text: `#ff69b4` (pink)
10307- Today: `#3d2030` (pink highlight)
10308
10309### Consistency
10310
10311**Both use same theme**:
10312```
10313Admin Panel → Set theme to "Purple"
10314
10315{{calendar}} sidebar: Purple theme ✓
10316{{calendar-compact}}: Purple theme ✓
10317{{calendar-panel}}: Will be themed next! ✓
10318
10319All calendars match! ✨
10320```
10321
10322**Perfectly coordinated appearance!** ��
10323
10324## Version 4.6.8 (2026-02-07) - DOCUMENT NOHEADER PARAMETER
10325
10326### �� Documentation: Added noheader Parameter Info
10327- **Added:** Documentation for existing `noheader` parameter
10328- **Updated:** README with complete eventlist parameter list
10329- **Info:** Feature already existed, just wasn't documented!
10330
10331### The noheader Parameter
10332
10333**What it does**: Hides the clock/date/weather header in eventlist
10334
10335**Usage**:
10336```
10337{{eventlist today noheader}}
10338```
10339
10340**Before (with header)**:
10341```
10342┌─────────────────────────────────┐
10343│ �� 3:45 PM    ��️ 72°  Feb 7     │ ← Clock header
10344├─────────────────────────────────┤
10345│ 5 min load │ CPU │ Memory       │ ← System stats
10346├─────────────────────────────────┤
10347│ Today's Events                   │
10348│ • 10:00 Team Meeting             │
10349│ • 2:00 Project Review            │
10350└─────────────────────────────────┘
10351```
10352
10353**After (noheader)**:
10354```
10355┌─────────────────────────────────┐
10356│ Today's Events                   │ ← No header!
10357│ • 10:00 Team Meeting             │
10358│ • 2:00 Project Review            │
10359└─────────────────────────────────┘
10360
10361Cleaner, more compact! ✓
10362```
10363
10364### When to Use noheader
10365
10366**Use WITH header** (default):
10367- Dashboard view
10368- Want to see current time
10369- Want weather info
10370- Want system stats
10371
10372**Use WITHOUT header** (`noheader`):
10373- Embedded in page content
10374- Just want event list
10375- Minimal design
10376- Space-constrained
10377
10378### Complete eventlist Parameters
10379
10380**Date Parameters**:
10381```
10382date=YYYY-MM-DD          Show specific date
10383daterange=START:END      Show date range
10384```
10385
10386**Filter Parameters**:
10387```
10388namespace=name           Filter by namespace
10389```
10390
10391**Display Parameters**:
10392```
10393today                    Show today with live clock
10394noheader                 Hide clock/date/weather header
10395showchecked              Show completed tasks
10396range=day|week|month     Show day/week/month range
10397```
10398
10399### Examples
10400
10401**Full featured** (dashboard):
10402```
10403{{eventlist today}}
10404```
10405Shows: Clock, weather, system stats, events ✓
10406
10407**Minimal** (embedded):
10408```
10409{{eventlist today noheader}}
10410```
10411Shows: Just events ✓
10412
10413**Date range without header**:
10414```
10415{{eventlist daterange=2026-02-01:2026-02-28 noheader}}
10416```
10417Shows: Events for February, no header ✓
10418
10419**With namespace filter**:
10420```
10421{{eventlist today namespace=work noheader}}
10422```
10423Shows: Today's work events, no header ✓
10424
10425### Implementation
10426
10427**Already existed in code** (line 833):
10428```php
10429$noheader = isset($data['noheader']) ? true : false;
10430```
10431
10432**Applied at render** (line 1010):
10433```php
10434if ($today && !empty($allEvents) && !$noheader) {
10435    // Render clock header with date/time/weather
10436}
10437```
10438
10439**Just wasn't documented!** Now it is. ✓
10440
10441## Version 4.6.7 (2026-02-07) - REMOVE REDUNDANT FILTER BADGE
10442
10443### ✨ Improvement: Removed Filter Badge Above Sidebar
10444- **Removed:** Filter badge no longer shows above compact calendar
10445- **Reason:** Filtering is already clearly visible in the calendar view
10446- **Result:** Cleaner UI, less redundancy
10447
10448### What Changed
10449
10450**BEFORE**:
10451```
10452┌─────────────────────────┐
10453│ Filtering: work ✕       │ ← Badge above calendar
10454├─────────────────────────┤
10455│ ◀ February 2026 ▶       │
10456├─────────────────────────┤
10457│ Calendar grid with       │
10458│ filtered events          │ ← Already filtered
10459└─────────────────────────┘
10460
10461Badge was redundant - you can already see
10462the filtering in the calendar!
10463```
10464
10465**AFTER**:
10466```
10467┌─────────────────────────┐
10468│ ◀ February 2026 ▶       │ ← No badge!
10469├─────────────────────────┤
10470│ Calendar grid with       │
10471│ filtered events          │ ← Filtering visible here
10472└─────────────────────────┘
10473
10474Cleaner, simpler UI ✓
10475```
10476
10477### Why Remove It?
10478
10479**Redundant Information**:
10480- Calendar already shows only filtered events
10481- Namespace badges on events show which namespace
10482- Badge added visual clutter without value
10483
10484**Better UX**:
10485- Less visual noise
10486- More space for content
10487- Filtering still obvious from event display
10488
10489**Code Cleanup**:
10490```php
10491// Old code (removed):
10492if ($namespace && $namespace !== '*' && ...) {
10493    $html .= '<div class="calendar-namespace-filter">';
10494    $html .= 'Filtering: ' . $namespace . ' ✕';
10495    $html .= '</div>';
10496}
10497
10498// New code:
10499// Filter badge removed - filtering shown in calendar view only
10500```
10501
10502### How Filtering Still Works
10503
10504**Filtering IS Active**:
10505- Calendar only shows events from selected namespace ✓
10506- Event namespace badges show which namespace ✓
10507- Clear filtering still works (in calendar) ✓
10508
10509**Just No Badge**:
10510- No redundant "Filtering: work ✕" above calendar
10511- Cleaner, more professional appearance
10512
10513### What You Still See
10514
10515**Namespace Information**:
10516```
10517Event with namespace badge:
10518┌────────────────────────┐
10519│ 10:00 Team Meeting     │
10520│       [work] ←─────────┼─ Namespace badge on event
10521└────────────────────────┘
10522```
10523
10524**Filtered View**:
10525- Only events from selected namespace visible
10526- Empty dates show no events
10527- Clear which namespace you're viewing
10528
10529**No Need for Top Badge**:
10530- Already obvious from events shown
10531- Namespace badges provide context
10532- Less clutter!
10533
10534### Summary
10535
10536**Removed**: Filter badge above calendar
10537**Kept**: All filtering functionality
10538**Benefit**: Cleaner UI
10539
10540**Filtering works the same, just without the redundant badge!** ✨
10541
10542## Version 4.6.6 (2026-02-07) - FIX: REMOVE FILTER BADGE IMMEDIATELY
10543
10544### �� Fixed: Filter Badge Now Disappears Immediately
10545- **Fixed:** Filter badge now removed from DOM immediately when clicking ✕
10546- **Added:** Badge removal before page reload/AJAX call
10547- **Result:** Badge disappears instantly, no waiting for reload
10548
10549### The Problem
10550
10551**v4.6.5 behavior**:
10552```
10553Click ✕ to clear filter
10554→ Page reloads or AJAX fires
10555→ Badge stays visible during reload ✗
10556→ Badge finally disappears after reload ✓
10557
10558User sees badge for 0.5-2 seconds after clicking ✕
10559Feels laggy! ✗
10560```
10561
10562### The Fix
10563
10564**Immediately remove badge from DOM**:
10565
10566```javascript
10567window.clearNamespaceFilter = function(calId) {
10568    const container = document.getElementById(calId);
10569
10570    // IMMEDIATELY hide/remove the filter badge
10571    const filterBadge = container.querySelector('.calendar-namespace-filter');
10572    if (filterBadge) {
10573        filterBadge.style.display = 'none'; // Hide instantly
10574        filterBadge.remove(); // Remove from DOM
10575    }
10576
10577    // THEN reload (AJAX or page reload)
10578    navCalendar(...) or window.location.href = ...
10579};
10580```
10581
10582### Before vs After
10583
10584**BEFORE (v4.6.5)**:
10585```
10586Time 0ms: Click ✕
10587┌─────────────────────────┐
10588│ Filtering: work ✕       │ ← Still visible
10589├─────────────────────────┤
10590
10591Time 500ms: Reload completes
10592┌─────────────────────────┐
10593│ (no badge)              │ ← Finally gone
10594├─────────────────────────┤
10595
10596Delay: 500-2000ms ✗
10597```
10598
10599**AFTER (v4.6.6)**:
10600```
10601Time 0ms: Click ✕
10602┌─────────────────────────┐
10603│ (no badge)              │ ← Gone immediately!
10604├─────────────────────────┤
10605
10606Time 500ms: Reload completes
10607┌─────────────────────────┐
10608│ (no badge)              │ ← Still gone
10609├─────────────────────────┤
10610
10611Delay: 0ms ✓
10612Instant feedback! ✓
10613```
10614
10615### Implementation
10616
10617**Two-step removal**:
10618
10619**Step 1**: Hide immediately
10620```javascript
10621filterBadge.style.display = 'none';
10622// User sees badge disappear instantly
10623```
10624
10625**Step 2**: Remove from DOM
10626```javascript
10627filterBadge.remove();
10628// Clean up HTML
10629```
10630
10631**Step 3**: Reload
10632```javascript
10633// Sidebar: Page reload
10634window.location.href = url.toString();
10635
10636// Calendar: AJAX reload
10637navCalendar(calId, year, month, originalNamespace);
10638```
10639
10640**Result**: Badge gone BEFORE reload starts ✓
10641
10642### Why This Matters
10643
10644**User Experience**:
10645- Old: Click ✕ → Wait → Badge disappears
10646- New: Click ✕ → Badge disappears instantly
10647
10648**Perceived Performance**:
10649- Instant visual feedback
10650- Feels responsive
10651- Professional UX
10652
10653**Technical**:
10654- DOM manipulation is synchronous (instant)
10655- Network requests are asynchronous (slow)
10656- Do fast things first!
10657
10658**Badge now disappears the moment you click ✕!** ⚡
10659
10660## Version 4.6.5 (2026-02-07) - FIX SIDEBAR FILTER BADGE CLEARING
10661
10662### �� Fixed: Filter Badge Not Clearing in Sidebar
10663- **Fixed:** Filter badge now properly clears when clicking ✕ button
10664- **Fixed:** Sidebar widget now reloads page without namespace filter
10665- **Changed:** clearNamespaceFilter now detects sidebar vs calendar and handles appropriately
10666
10667### The Problem
10668
10669**In {{calendar}} sidebar widget**:
10670```
106711. Click namespace badge to filter
106722. Badge appears: "Filtering: work ✕"
106733. Click ✕ to clear filter
106744. Badge stays visible! ✗
106755. Events still filtered! ✗
10676```
10677
10678**Root Cause**: Sidebar widget is server-rendered (PHP), not AJAX-reloaded like regular calendar.
10679
10680### The Fix
10681
10682**Detect widget type and handle appropriately**:
10683
10684```javascript
10685window.clearNamespaceFilter = function(calId) {
10686    const container = document.getElementById(calId);
10687
10688    // Check if this is a sidebar widget
10689    const sidebarContainer = document.getElementById('sidebar-widget-' + calId);
10690
10691    if (sidebarContainer) {
10692        // SIDEBAR: Reload page without namespace parameter
10693        const url = new URL(window.location.href);
10694        url.searchParams.delete('namespace');
10695        window.location.href = url.toString(); // Page reload
10696        return;
10697    }
10698
10699    // REGULAR CALENDAR: AJAX reload
10700    navCalendar(calId, year, month, originalNamespace);
10701};
10702```
10703
10704### How It Works
10705
10706**Sidebar Widget** ({{calendar}} syntax):
10707```
10708Rendered server-side with PHP
10709Cannot be AJAX-reloaded
10710Solution: Reload entire page without ?namespace=work parameter
10711```
10712
10713**Regular Calendar** ({{calendar-compact}} or {{calendar-panel}}):
10714```
10715Has AJAX reload capability
10716Solution: Call navCalendar() to reload via AJAX
10717```
10718
10719### Before vs After
10720
10721**BEFORE (v4.6.4)**:
10722```
10723Sidebar widget filtered by "work":
10724┌─────────────────────────┐
10725│ Filtering: work ✕       │ ← Click ✕
10726├─────────────────────────┤
10727│ Today                   │
10728│ • Work meeting          │
10729└─────────────────────────┘
10730
10731After clicking ✕:
10732┌─────────────────────────┐
10733│ Filtering: work ✕       │ ← Still there! ✗
10734├─────────────────────────┤
10735│ Today                   │
10736│ • Work meeting          │ ← Still filtered! ✗
10737└─────────────────────────┘
10738```
10739
10740**AFTER (v4.6.5)**:
10741```
10742Sidebar widget filtered by "work":
10743┌─────────────────────────┐
10744│ Filtering: work ✕       │ ← Click ✕
10745├─────────────────────────┤
10746│ Today                   │
10747│ • Work meeting          │
10748└─────────────────────────┘
10749
10750After clicking ✕ → Page reloads:
10751┌─────────────────────────┐
10752│ (no filter badge)       │ ← Cleared! ✓
10753├─────────────────────────┤
10754│ Today                   │
10755│ • Work meeting          │
10756│ • Personal task         │ ← All events! ✓
10757│ • Project review        │
10758└─────────────────────────┘
10759```
10760
10761### Technical Details
10762
10763**Why Page Reload for Sidebar?**
10764
10765Sidebar widget is rendered server-side:
10766```php
10767// In syntax.php:
10768return $this->renderSidebarWidget($events, $namespace, $calId);
10769// ↑ PHP generates complete HTML
10770// No AJAX reload endpoint exists for sidebar
10771```
10772
10773**Solution**: Remove `?namespace=work` from URL and reload page
10774```javascript
10775const url = new URL(window.location.href);
10776url.searchParams.delete('namespace'); // Remove filter
10777window.location.href = url.toString(); // Reload
10778```
10779
10780**Why AJAX for Regular Calendar?**
10781
10782Regular calendars have AJAX endpoints:
10783```javascript
10784// action.php handles:
10785action: 'load_month' → Returns new month data
10786navCalendar() → Fetches and rebuilds calendar
10787```
10788
10789### Filter Badge Behavior
10790
10791**Showing Badge** (when filtering):
10792- Server-side: PHP renders badge in HTML
10793- Client-side: JavaScript adds badge to header
10794
10795**Clearing Badge**:
10796- Sidebar: Page reload (removes ?namespace from URL)
10797- Calendar: AJAX reload (badge removed in rebuildCalendar)
10798
10799**Now works correctly for both!** ✓
10800
10801## Version 4.6.4 (2026-02-07) - HOTFIX: PHP SYNTAX ERROR
10802
10803### �� Critical Hotfix: Fixed PHP Parse Error
10804- **Fixed:** Template literal backticks causing PHP syntax error
10805- **Fixed:** Changed JavaScript template literals to concatenation
10806- **Fixed:** Admin page now loads without parse errors
10807
10808### The Problem
10809
10810**v4.6.3 broke admin page**:
10811```
10812Error loading plugin calendar
10813ParseError: syntax error, unexpected identifier "s",
10814expecting "," or ";"
10815```
10816
10817**Cause**: JavaScript template literals inside PHP echo
10818```php
10819echo '<script>
10820    let nsOptions = `<option value="">(default)</option>`;
10821                    ↑ PHP sees backtick and gets confused!
10822</script>';
10823```
10824
10825**Why it broke**: Backticks (`) are special in PHP too!
10826
10827### The Fix
10828
10829**Changed from template literals to concatenation**:
10830
10831**BEFORE (broken)**:
10832```javascript
10833let nsOptions = `<option value="">(default)</option>`;
10834nsOptions += `<option value="${namespace}">${namespace}</option>`;
10835console.log('Edit recurring:', namespace);
10836```
10837
10838**AFTER (fixed)**:
10839```javascript
10840let nsOptions = "<option value=\\"\\">(default)</option>";
10841nsOptions += "<option value=\\"" + namespace + "\\">" + namespace + "</option>";
10842console.log("Edit recurring:", namespace);
10843```
10844
10845**Changes**:
10846- ✅ Backticks (`) → Double quotes (")
10847- ✅ Template literals (${var}) → Concatenation (" + var + ")
10848- ✅ Single quotes in console.log → Double quotes
10849- ✅ Properly escaped quotes for PHP echo
10850
10851### Technical Details
10852
10853**The Issue**:
10854```php
10855// Inside PHP echo string:
10856echo '<script>
10857    let x = `template ${literal}`;  // ✗ Backtick breaks PHP!
10858</script>';
10859```
10860
10861**The Solution**:
10862```php
10863// Use regular string concatenation:
10864echo '<script>
10865    let x = "string " + variable;   // ✓ Works in PHP echo!
10866</script>';
10867```
10868
10869**Quote Escaping**:
10870```javascript
10871// Double quotes inside PHP single-quote string:
10872'<option value=\"\">text</option>'
10873               ↑↑ Escaped for JavaScript
10874```
10875
10876### Result
10877
10878**Before**: Admin page crashed with parse error ✗
10879**After**: Admin page loads perfectly ✓
10880
10881**No functionality changed - just syntax fix!**
10882
10883## Version 4.6.3 (2026-02-07) - FIX RECURRING EVENTS NAMESPACE DROPDOWN
10884
10885### �� Critical Fix: Namespace Dropdown in Recurring Events Section
10886- **Fixed:** Namespace dropdown now shows ALL available namespaces when editing
10887- **Fixed:** Current namespace now properly selected in dropdown
10888- **Fixed:** Namespace extraction from DOM now uses multiple methods
10889- **Added:** Console logging to debug namespace detection
10890
10891### The Problem
10892
10893**When editing from �� Recurring Events section**:
10894```
10895Click "Edit" on recurring event
10896Namespace dropdown shows:
10897- (default)
10898- (nothing else!) ✗
10899
10900Can't select any namespace! ✗
10901```
10902
10903**Why**: Broken namespace extraction logic
10904```javascript
10905// OLD CODE (broken):
10906const namespaces = Array.from(document.querySelectorAll("[id^=ns_]"))
10907    .map(el => {
10908        // Complex parsing that often failed
10909        const nsSpan = el.querySelector("span:nth-child(3)");
10910        return nsSpan.textContent.replace("�� ", "").trim();
10911    })
10912    .filter(ns => ns !== namespace); // Excluded current! ✗
10913```
10914
10915**Result**: Empty dropdown, can't change namespace! ✗
10916
10917### The Fix
10918
10919**NEW CODE (robust)**:
10920```javascript
10921const namespaces = new Set();
10922
10923// Method 1: Namespace explorer folders
10924document.querySelectorAll("[id^=ns_]").forEach(el => {
10925    const nsSpan = el.querySelector("span:nth-child(3)");
10926    if (nsSpan) {
10927        let nsText = nsSpan.textContent.replace("�� ", "").trim();
10928        if (nsText && nsText !== "(default)") {
10929            namespaces.add(nsText); // ✓
10930        }
10931    }
10932});
10933
10934// Method 2: Datalist (backup method)
10935document.querySelectorAll("#namespaceList option").forEach(opt => {
10936    if (opt.value && opt.value !== "") {
10937        namespaces.add(opt.value); // ✓
10938    }
10939});
10940
10941// Build dropdown with ALL namespaces
10942let options = `<option value="">(default)</option>`;
10943
10944// Show current namespace as selected
10945if (namespace) {
10946    options += `<option value="${namespace}" selected>${namespace} (current)</option>`;
10947}
10948
10949// Show all other namespaces
10950for (const ns of nsArray) {
10951    if (ns !== namespace) {
10952        options += `<option value="${ns}">${ns}</option>`;
10953    }
10954}
10955```
10956
10957**Result**: All namespaces visible! ✓
10958
10959### How It Works Now
10960
10961**Before (Broken)**:
10962```
10963Edit recurring event in "work" namespace
10964
10965Dropdown shows:
10966☐ (default)
10967
10968That's it! Can't select anything! ✗
10969```
10970
10971**After (Fixed)**:
10972```
10973Edit recurring event in "work" namespace
10974
10975Dropdown shows:
10976☐ (default)
10977☑ work (current)  ← Selected!
10978☐ personal
10979☐ projects
10980☐ meetings
10981
10982All namespaces available! ✓
10983```
10984
10985### Key Improvements
10986
10987**1. Dual extraction methods**:
10988- Primary: Parse namespace explorer DOM
10989- Backup: Read from datalist
10990- Result: Always finds namespaces ✓
10991
10992**2. Current namespace included**:
10993```javascript
10994// OLD: Excluded current namespace
10995.filter(ns => ns !== namespace) ✗
10996
10997// NEW: Include and mark as selected
10998options += `<option value="${namespace}" selected>${namespace} (current)</option>` ✓
10999```
11000
11001**3. Better error handling**:
11002```javascript
11003if (nsSpan) {  // Check exists
11004    let nsText = nsSpan.textContent.replace("�� ", "").trim();
11005    if (nsText && nsText !== "(default)") {  // Validate
11006        namespaces.add(nsText);
11007    }
11008}
11009```
11010
11011**4. Console debugging**:
11012```javascript
11013console.log('Edit recurring - Current namespace:', namespace);
11014console.log('Available namespaces:', nsArray);
11015```
11016
11017Open browser console (F12) to see what namespaces are detected!
11018
11019### Example Usage
11020
11021**Scenario**: Edit recurring "Team Meeting" in "work" namespace
11022
11023**Steps**:
110241. Go to �� Recurring Events section
110252. Click "Edit" on "Team Meeting"
110263. See namespace dropdown:
11027   - ☐ (default)
11028   - ☑ work (current)
11029   - ☐ personal
11030   - ☐ projects
110314. Select "personal" to move event
110325. Click "Save Changes"
110336. Event moved to "personal" namespace ✓
11034
11035**Finally works as expected!** ��
11036
11037## Version 4.6.2 (2026-02-07) - FIX NAMESPACE PRESERVATION
11038
11039### �� Recurring Events Namespace Fix
11040- **Fixed:** Namespace now properly preserved when editing recurring events
11041- **Fixed:** Namespace selector now allows selecting any namespace (not just default)
11042- **Added:** Better logging for namespace preservation debugging
11043- **Added:** Console logging to track namespace values during edit
11044
11045### The Namespace Problem
11046
11047**Issue 1**: Can't select non-default namespace
11048```
11049When editing recurring event:
11050- Dropdown shows all namespaces ✓
11051- User selects "work"
11052- Form submits with "" (empty/default) ✗
11053```
11054
11055**Issue 2**: Namespace not preserved
11056```
11057Recurring event in "personal" namespace
11058Edit the title only
11059After save: namespace changed to "" (default) ✗
11060```
11061
11062### The Fixes
11063
11064**Fix 1**: Better namespace preservation logic
11065```php
11066// When editing recurring event:
11067$existingNamespace = $existingEventData['namespace'];
11068
11069// Preserve if user didn't explicitly change it:
11070if (empty($namespace) ||
11071    strpos($namespace, '*') !== false ||
11072    strpos($namespace, ';') !== false) {
11073    // User didn't select or selected wildcard
11074    $namespace = $existingNamespace; // Keep existing!
11075}
11076```
11077
11078**Fix 2**: Proper form population
11079```javascript
11080// When editing, set BOTH inputs:
11081namespaceHidden.value = event.namespace || '';  // Hidden (submitted)
11082namespaceSearch.value = event.namespace || '(default)';  // Visible
11083
11084// Plus logging:
11085console.log('Set namespace for editing:', event.namespace);
11086```
11087
11088**Fix 3**: Added detailed logging
11089```php
11090error_log("Preserving namespace '$namespace' (received='$receivedNamespace')");
11091error_log("Using new namespace '$namespace'");
11092error_log("No existing namespace to preserve");
11093```
11094
11095### How It Works Now
11096
11097**Scenario 1**: Edit without changing namespace
11098```
11099Event in "work" namespace
11100Edit title to "Updated Meeting"
11101Namespace field shows: "work"
11102Hidden input value: "work"
11103Result: Saved in "work" ✓
11104```
11105
11106**Scenario 2**: Change namespace during edit
11107```
11108Event in "personal" namespace
11109Edit and select "work" namespace
11110Hidden input value: "work"
11111Result: Saved in "work" ✓
11112```
11113
11114**Scenario 3**: Edit with empty/wildcard namespace
11115```
11116Event in "projects" namespace
11117Namespace field empty or shows "personal;work"
11118System preserves: "projects"
11119Result: Saved in "projects" ✓
11120```
11121
11122### Debugging
11123
11124Now with console logging, you can see:
11125```javascript
11126Set namespace for editing: work
11127Hidden value: work
11128```
11129
11130And in PHP logs:
11131```
11132Calendar saveEvent recurring: Loaded existing data - namespace='work'
11133Calendar saveEvent recurring: Preserving namespace 'work' (received='')
11134```
11135
11136**Namespace preservation now works correctly!** ��
11137
11138## Version 4.6.1 (2026-02-07) - PRESERVE RECURRING EVENT DATA
11139
11140### �� Recurring Events Edit Fix
11141- **Fixed:** Editing recurring events now preserves unchanged fields
11142- **Fixed:** Empty fields no longer erase existing data
11143- **Added:** Smart merge of existing event data with new changes
11144
11145### The Problem
11146
11147**Before**: Editing erased unchanged fields!
11148```
11149Original recurring event:
11150- Title: "Team Meeting"
11151- Time: "10:00 AM"
11152- Description: "Weekly standup with engineering team"
11153- Color: Red
11154
11155User edits ONLY the title to "Staff Meeting"
11156Form sends:
11157- Title: "Staff Meeting" ✓
11158- Time: "" ✗ (empty because user didn't change it)
11159- Description: "" ✗ (empty)
11160- Color: "#3498db" ✗ (default blue)
11161
11162Result after save:
11163- Title: "Staff Meeting" ✓
11164- Time: BLANK ✗
11165- Description: BLANK ✗
11166- Color: Blue ✗
11167```
11168
11169**All the other data was lost!** ✗
11170
11171### The Fix
11172
11173**After**: Preserves unchanged data!
11174```php
11175if ($eventId && $isRecurring) {
11176    // Load existing event data
11177    $existingEventData = getExistingEventData($eventId);
11178
11179    // Merge: use new value OR keep existing
11180    $title = $title ?: $existingEventData['title'];
11181    $time = $time ?: $existingEventData['time'];
11182    $description = $description ?: $existingEventData['description'];
11183    $color = ($color === '#3498db') ?
11184        $existingEventData['color'] : $color;
11185}
11186```
11187
11188**Now**:
11189```
11190User edits ONLY the title to "Staff Meeting"
11191
11192System:
111931. Loads existing event data
111942. Merges: new title + existing time/description/color
111953. Saves merged data
11196
11197Result:
11198- Title: "Staff Meeting" ✓ (changed)
11199- Time: "10:00 AM" ✓ (preserved!)
11200- Description: "Weekly standup..." ✓ (preserved!)
11201- Color: Red ✓ (preserved!)
11202```
11203
11204**Only changed fields are updated!** ✓
11205
11206### How It Works
11207
11208**Step 1**: Load existing data
11209```php
11210$existingEventData = $this->getExistingEventData(
11211    $eventId,
11212    $date,
11213    $namespace
11214);
11215```
11216
11217**Step 2**: Merge with new data
11218```php
11219// If new value is empty, use existing value
11220$title = $newTitle ?: $existingEventData['title'];
11221$time = $newTime ?: $existingEventData['time'];
11222$description = $newDesc ?: $existingEventData['description'];
11223
11224// Special handling for color (default is #3498db)
11225if ($newColor === '#3498db' && $existingEventData['color']) {
11226    $color = $existingEventData['color'];
11227}
11228```
11229
11230**Step 3**: Save merged data
11231```php
11232createRecurringEvents(..., $title, $time, $description, $color, ...);
11233```
11234
11235### Fields Preserved
11236
11237When editing recurring events, these fields are now preserved if not changed:
11238- ✅ Title (if left blank)
11239- ✅ Time (if not specified)
11240- ✅ End Time (if not specified)
11241- ✅ Description (if left empty)
11242- ✅ Color (if still default blue)
11243
11244**Edit only what you want to change - everything else stays!** ��
11245
11246## Version 4.6.0 (2026-02-07) - NAMESPACE RENAME & RECURRING FIX
11247
11248### ✨ New Feature: Rename Namespaces
11249- **Added:** ✏️ Rename button in Namespace Explorer
11250- **Added:** Rename all events in a namespace at once
11251- **Added:** Automatic cleanup of old directory structure
11252
11253### �� Critical Fix: Recurring Events Actually Edit Now!
11254- **Fixed:** Editing recurring events now deletes ALL instances
11255- **Fixed:** Previously only deleted one instance, left orphans
11256- **Fixed:** Recurring events properly regenerated on edit
11257
11258### Namespace Rename Feature
11259
11260**Before**: Could only delete namespaces, not rename
11261
11262**After**: Click ✏️ to rename!
11263
11264```
11265�� work (15 events)  [3] [✏️] [��️]
11266                          ↑ NEW!
11267```
11268
11269**How It Works**:
112701. Click ✏️ rename button
112712. Enter new namespace name
112723. All events moved to new namespace
112734. Event `namespace` field updated in JSON
112745. Old directory cleaned up
11275
11276**Example**:
11277```
11278Rename: "work" → "business"
11279
11280Before:
11281/data/meta/work/calendar/*.json
11282Events: {namespace: "work"}
11283
11284After:
11285/data/meta/business/calendar/*.json
11286Events: {namespace: "business"}
11287```
11288
11289**Implementation**:
11290```php
11291private function renameNamespace() {
11292    // 1. Validate new name
11293    // 2. Rename directory
11294    // 3. Update all event namespace fields in JSON
11295    // 4. Clean up old empty directories
11296}
11297```
11298
11299### Recurring Events Fix - The Problem
11300
11301**Before**: Editing didn't work!
11302```
11303Original recurring event generates:
11304- Event-0 (Mon, Feb 10)
11305- Event-1 (Mon, Feb 17)
11306- Event-2 (Mon, Feb 24)
11307
11308User edits Event-0, changes title to "Updated"
11309
11310What SHOULD happen:
11311- Delete Event-0, Event-1, Event-2
11312- Generate new instances with "Updated" title
11313
11314What ACTUALLY happened:
11315- Delete Event-0 only ✗
11316- Generate new instances
11317- Result: Event-1 and Event-2 still show old title! ✗
11318```
11319
11320**After**: Properly deletes ALL instances!
11321
11322**The Fix**:
11323```php
11324private function deleteEvent() {
11325    $event = getEvent($eventId);
11326
11327    // Check if recurring
11328    if ($event['recurring'] && $event['recurringId']) {
11329        // Delete ALL instances with same recurringId
11330        deleteAllRecurringInstances($recurringId);
11331    }
11332
11333    // Then normal delete for spanning events
11334}
11335
11336private function deleteAllRecurringInstances($recurringId) {
11337    // Scan ALL calendar JSON files
11338    foreach (glob('*.json') as $file) {
11339        // Filter out events with matching recurringId
11340        $events = array_filter($events, function($event) {
11341            return $event['recurringId'] !== $recurringId;
11342        });
11343    }
11344}
11345```
11346
11347**Result**:
11348- Edit "Weekly Team Meeting" → ALL instances updated ✓
11349- Delete recurring event → ALL instances deleted ✓
11350- No more orphaned events! ✓
11351
11352### Recurring Event Fields
11353
11354Every recurring event has:
11355```json
11356{
11357    "id": "abc123-0",
11358    "recurring": true,
11359    "recurringId": "abc123",  ← Links all instances
11360    ...
11361}
11362```
11363
11364When editing/deleting, we find ALL events with same `recurringId` and remove them!
11365
11366**Finally, recurring events work properly!** ��
11367
11368## Version 4.5.2 (2026-02-07) - FIX SORTING & PINK TOOLTIPS
11369
11370### �� Important Events Sorting - ACTUALLY FIXED!
11371- **Fixed:** Important Events now REALLY sorted by date first, then time
11372- **Fixed:** renderSidebarSection was re-sorting and breaking the order
11373- **Changed:** Important Events use date-first sorting, Today/Tomorrow use time-only
11374
11375### �� Pink Theme Tooltip Bling!
11376- **Added:** Pink gradient tooltips (hot pink → light pink)
11377- **Added:** Glowing pink border on tooltips
11378- **Added:** Sparkling heart (��) appears next to tooltip!
11379- **Added:** Heart has pink glow drop-shadow
11380
11381### The Sorting Bug - Root Cause
11382
11383**Problem**: Two sorts were happening!
11384
11385**Sort #1** (Line 2047): Before rendering
11386```php
11387usort($importantEvents, ...) // Sort by date ✓
11388```
11389
11390**Sort #2** (Line 2751): Inside renderSidebarSection
11391```php
11392usort($events, ...) // Sort by TIME ONLY ✗
11393// This was breaking the date order!
11394```
11395
11396**The Fix**: Different sorting for different sections
11397```php
11398if ($title === 'Important Events') {
11399    // Sort by DATE first, then time
11400    usort($events, function($a, $b) {
11401        if ($dateA !== $dateB) {
11402            return strcmp($dateA, $dateB); // DATE first!
11403        }
11404        // Same date - sort by time
11405        return timeCompare($a, $b);
11406    });
11407} else {
11408    // Today/Tomorrow - sort by TIME only (same date)
11409    usort($events, function($a, $b) {
11410        return timeCompare($a, $b);
11411    });
11412}
11413```
11414
11415**Result**: Important Events now CORRECTLY sorted!
11416```
11417✓ Sun, Feb 8 - 3:30 PM Super Bowl
11418✓ Tue, Feb 10 - 11:30 AM Doctor visit
11419✓ Sat, Feb 14 - Valentine's Day (all-day)
11420✓ Sat, Feb 14 - 8:00 PM Crab Shack
11421```
11422
11423### Pink Tooltip Magic! ��
11424
11425**Normal Tooltips**: Black background, plain
11426```css
11427background: rgba(0, 0, 0, 0.95);
11428color: #fff;
11429```
11430
11431**Pink Theme Tooltips**: FABULOUS!
11432```css
11433/* Pink gradient background */
11434background: linear-gradient(135deg, #ff1493 0%, #ff69b4 100%);
11435
11436/* Glowing pink border */
11437border: 2px solid #ff85c1;
11438
11439/* Double glow shadow */
11440box-shadow:
11441    0 0 15px rgba(255, 20, 147, 0.6),
11442    0 4px 12px rgba(0, 0, 0, 0.4);
11443
11444/* Bold text */
11445font-weight: 600;
11446```
11447
11448**Plus**: Sparkling heart next to tooltip!
11449```css
11450.sidebar-pink [data-tooltip]:after {
11451    content: '��';
11452    font-size: 12px;
11453    filter: drop-shadow(0 0 3px rgba(255, 20, 147, 0.8));
11454}
11455```
11456
11457**The Effect**:
11458```
11459Hover over ⚠ conflict warning:
11460┌────────────────────┐ ��
11461│ Conflicts with:    │ ← Pink gradient
11462│ • Event 1 (3PM)   │ ← Pink border
11463│ • Event 2 (4PM)   │ ← Pink glow
11464└────────────────────┘
11465```
11466
11467**Maximum glamour on tooltips too!** ✨
11468
11469## Version 4.5.1 (2026-02-07) - FIX IMPORTANT EVENTS SORTING
11470
11471### �� Important Events Order Fixed
11472- **Fixed:** Important Events now sorted by date (earliest first)
11473- **Fixed:** Events on same date sorted by time (chronological)
11474- **Fixed:** All-day events appear last within each date
11475
11476### Sorting Issue
11477
11478**Before**: Random order
11479```
11480Important Events:
11481�� Valentine's Day         (Sat, Feb 14)
1148211:30 AM Doctor visit      (Tue, Feb 10)  ← Feb 10 after Feb 14!
114833:30 PM Super Bowl         (Sun, Feb 8)   ← Feb 8 after Feb 14!
114848:00 PM Crab Shack         (Sat, Feb 14)
11485```
11486
11487**After**: Chronological order
11488```
11489Important Events:
114903:30 PM Super Bowl         (Sun, Feb 8)   ← Earliest!
1149111:30 AM Doctor visit      (Tue, Feb 10)
11492�� Valentine's Day         (Sat, Feb 14)  ← All-day event
114938:00 PM Crab Shack         (Sat, Feb 14)  ← Same day, sorted by time
11494```
11495
11496### Sorting Logic
11497
11498**Primary Sort**: By date
11499```php
11500strcmp($dateA, $dateB); // "2026-02-08" < "2026-02-14"
11501```
11502
11503**Secondary Sort**: By time (within same date)
11504```php
11505// All-day events (no time) go last
11506if (empty($timeA) && !empty($timeB)) return 1;
11507if (!empty($timeA) && empty($timeB)) return -1;
11508
11509// Both have times - sort chronologically
11510$aMinutes = timeToMinutes($timeA); // "11:30" = 690 minutes
11511$bMinutes = timeToMinutes($timeB); // "20:00" = 1200 minutes
11512return $aMinutes - $bMinutes;      // 690 < 1200
11513```
11514
11515**Result**:
115161. Sun, Feb 8 - 3:30 PM (earliest date & time)
115172. Tue, Feb 10 - 11:30 AM (next date)
115183. Sat, Feb 14 - Valentine's Day (all-day, so last on Feb 14)
115194. Sat, Feb 14 - 8:00 PM (timed event on Feb 14)
11520
11521**Perfect chronological order for next 2 weeks!** ✓
11522
11523## Version 4.5.0 (2026-02-07) - SPARKLE EDITION ✨��
11524
11525### �� EXTREME PINK BLING EFFECTS!
11526- **Added:** Click sparkles - 8 sparkles burst out on every click!
11527- **Added:** Auto-sparkles - random sparkles appear every 3 seconds
11528- **Added:** Hover mega-glow - sidebar glows BRIGHT on hover
11529- **Added:** Pulsing border glow - constantly breathing pink glow
11530- **Added:** Drop shadows on sparkles for extra depth
11531- **Added:** More sparkle emojis - hearts, diamonds, crowns, bows!
11532
11533### Sparkle Effects Breakdown
11534
11535**Click Sparkles** ��:
11536```javascript
11537// 8 sparkles burst out when you click anywhere!
11538for (let i = 0; i < 8; i++) {
11539    // Staggered appearance (40ms apart)
11540    createSparkle(x, y);
11541}
11542
11543// Sparkle emojis:
11544["✨", "��", "��", "⭐", "��", "��", "��", "��", "��", "��"]
11545```
11546
11547**Each sparkle**:
11548- Starts at click point
11549- Flies outward 30-60px in random direction
11550- Spins 360 degrees
11551- Fades in and out
11552- Has pink glow drop-shadow
11553- Disappears after 1 second
11554
11555**Auto Sparkles** ⏰:
11556```javascript
11557// Random sparkle every 3 seconds
11558setInterval(() => {
11559    const x = Math.random() * width;
11560    const y = Math.random() * height;
11561    createSparkle(x, y);
11562}, 3000);
11563```
11564
11565**Result**: Constant magical sparkles even without clicking! ✨
11566
11567**Hover Mega-Glow** ��:
11568```css
11569.sidebar-pink:hover {
11570    box-shadow:
11571        0 0 30px rgba(255, 20, 147, 0.9),
11572        0 0 50px rgba(255, 20, 147, 0.5) !important;
11573}
11574```
11575
11576**Result**: Sidebar EXPLODES with pink glow when you hover over it! ��
11577
11578**Pulsing Border Glow** ��:
11579```css
11580@keyframes pulse-glow {
11581    0%, 100% {
11582        box-shadow: 0 0 10px rgba(255, 20, 147, 0.4);
11583    }
11584    50% {
11585        box-shadow:
11586            0 0 25px rgba(255, 20, 147, 0.8),
11587            0 0 40px rgba(255, 20, 147, 0.4);
11588    }
11589}
11590
11591animation: pulse-glow 3s ease-in-out infinite;
11592```
11593
11594**Result**: Border continuously breathes with pink glow! ��
11595
11596**Sparkle Animation** ��:
11597```css
11598@keyframes sparkle {
11599    0% {
11600        opacity: 0;
11601        transform: translate(0, 0) scale(0) rotate(0deg);
11602    }
11603    50% {
11604        opacity: 1;
11605        transform: translate(halfway) scale(1) rotate(180deg);
11606    }
11607    100% {
11608        opacity: 0;
11609        transform: translate(far) scale(0) rotate(360deg);
11610    }
11611}
11612```
11613
11614**Result**: Sparkles spin, grow, shrink, and fly! ��
11615
11616### Complete Pink Bling Experience:
11617
11618**Always Active**:
11619- ✨ Pulsing pink border glow (3 second cycle)
11620- ✨ Auto-sparkles every 3 seconds
11621
11622**On Hover**:
11623- �� MEGA GLOW EFFECT (2x brightness!)
11624
11625**On Click**:
11626- �� 8 sparkles EXPLODE outward!
11627- �� Random emojis (hearts, stars, diamonds, crowns!)
11628- �� Each sparkle spins 360° while flying
11629- �� Pink glow drop-shadow on each sparkle
11630
11631**The Result**:
11632- Click anywhere = SPARKLE EXPLOSION! ��
11633- Hover anywhere = MEGA GLOW! ✨
11634- Always breathing and sparkling! ��
11635- Maximum glamour! ��
11636- Wife approval: 1000%! ��
11637
11638**THIS IS THE MOST FABULOUS CALENDAR EVER!** ��✨��
11639
11640## Version 4.4.2 (2026-02-07) - FINAL PINK POLISH
11641
11642### �� Pink Theme Final Touches
11643- **Fixed:** Add Event text now black (was bright pink, hard to read)
11644- **Fixed:** Clock border now COMPLETELY pink on all sides (no more green!)
11645- **Removed:** Text shadow on Add Event button (cleaner with black text)
11646
11647### Add Event Text - Black & Readable!
11648
11649**Before**: Bright pink text (#ff1493) on dark pink background
11650```php
11651$addBtnTextColor = $themeStyles['text_bright']; // #ff1493 - hard to read!
11652text-shadow: 0 0 3px #ff1493; // Glowy pink
11653```
11654
11655**After**: Black text, no shadow, perfect contrast!
11656```php
11657$addBtnTextColor = $theme === 'pink' ? '#000000' : ...;
11658$addBtnTextShadow = $theme === 'pink' ? 'none' : ...;
11659```
11660
11661**Result**:
11662- Black text pops against dark pink background ✓
11663- Easy to read ✓
11664- Professional look with bling ✓
11665
11666### Clock Border - All Pink!
11667
11668**The Problem**: Inline style only set `border-bottom`, CSS set other sides to green
11669
11670**Before**:
11671```php
11672// Inline style (only bottom):
11673style="border-bottom:2px solid #ff1493;"
11674
11675// CSS (all sides):
11676.eventlist-today-header {
11677    border: 2px solid #00cc07; // Green on top/sides!
11678}
11679```
11680
11681**After**: Inline style overrides ALL sides
11682```php
11683style="border:2px solid #ff1493;" // All 4 sides pink!
11684```
11685
11686**Result**: Clock box now 100% pink border on all four sides! ✓
11687
11688### What Changed:
11689
11690**Add Event Button**:
11691- Background: #b8156f (dark pink) ✓
11692- Text: **#000000 (black)** ← NEW!
11693- Text shadow: **none** ← NEW!
11694- Glow: 0 0 10px pink ✓
11695
11696**Clock Border**:
11697- Top: **#ff1493 (pink)** ← FIXED!
11698- Right: **#ff1493 (pink)** ← FIXED!
11699- Bottom: #ff1493 (pink) ✓
11700- Left: **#ff1493 (pink)** ← FIXED!
11701
11702**Perfect pink theme - wife approved!** ��✨
11703
11704## Version 4.4.1 (2026-02-07) - PINK THEME PERFECTION
11705
11706### �� Pink Theme Complete Makeover
11707- **Fixed:** Clock border now completely pink (was green on sides/top)
11708- **Changed:** Today/Tomorrow/Important sections now different shades of pink
11709- **Changed:** Add Event button now dark pink (was clashing blue)
11710- **Changed:** System status bars now pink gradient (3 shades!)
11711
11712### All-Pink Everything! ��
11713
11714**Clock Border**:
11715```css
11716/* Before: Green border */
11717border: 2px solid #00cc07;
11718
11719/* After: Hot pink border */
11720.sidebar-pink .eventlist-today-header {
11721    border-color: #ff1493;
11722    box-shadow: 0 0 10px rgba(255, 20, 147, 0.4);
11723}
11724```
11725
11726**Section Colors** (Different Pink Shades):
11727```php
11728// Before: Orange, green, purple
11729'Today' => '#ff9800',
11730'Tomorrow' => '#4caf50',
11731'Important' => '#9b59b6'
11732
11733// After: Hot pink, pink, light pink
11734'Today' => '#ff1493',      // Hot pink (DeepPink)
11735'Tomorrow' => '#ff69b4',   // Pink (HotPink)
11736'Important' => '#ff85c1'   // Light pink
11737```
11738
11739**Add Event Button**:
11740```php
11741// Before: Clashing blue
11742background: #3498db;
11743
11744// After: Dark pink with glow
11745background: #b8156f;       // Dark pink
11746hover: #8b0f54;            // Darker pink
11747shadow: 0 0 10px rgba(255, 20, 147, 0.5);
11748```
11749
11750**System Status Bars** (Pink Gradient):
11751```css
11752/* 5-min load average */
11753.sidebar-pink .eventlist-cpu-fill {
11754    background: #ff1493;   /* Hot pink */
11755    box-shadow: 0 0 5px rgba(255, 20, 147, 0.7);
11756}
11757
11758/* Realtime CPU */
11759.sidebar-pink .eventlist-cpu-fill-purple {
11760    background: #ff69b4;   /* Pink */
11761    box-shadow: 0 0 5px rgba(255, 105, 180, 0.7);
11762}
11763
11764/* Memory */
11765.sidebar-pink .eventlist-cpu-fill-orange {
11766    background: #ff85c1;   /* Light pink */
11767    box-shadow: 0 0 5px rgba(255, 133, 193, 0.7);
11768}
11769```
11770
11771### Pink Theme Visual Hierarchy:
11772
11773**Darkest → Lightest Pink Shades**:
117741. Add Event button: #b8156f (dark pink)
117752. Today section: #ff1493 (hot pink / deep pink)
117763. System bar 1: #ff1493 (hot pink)
117774. Tomorrow section: #ff69b4 (pink)
117785. System bar 2: #ff69b4 (pink)
117796. Important section: #ff85c1 (light pink)
117807. System bar 3: #ff85c1 (light pink)
11781
11782**Result**: Beautiful pink gradient throughout entire sidebar! ��✨
11783
11784### What's Pink Now:
11785
11786✅ Sidebar background & border
11787✅ **Clock border** ← FIXED!
11788✅ Header gradient
11789✅ Week grid
11790✅ **Add Event button** ← FIXED!
11791✅ **Today section** ← Different shade!
11792✅ **Tomorrow section** ← Different shade!
11793✅ **Important section** ← Different shade!
11794✅ Event text & bars
11795✅ **System status bars** ← All 3 different pink shades!
11796✅ All shadows & glows
11797
11798**EVERYTHING is pink and fabulous!** ��✨
11799
11800## Version 4.4.0 (2026-02-07) - PINK BLING THEME & PROFESSIONAL SHADOWS
11801
11802### ✨ New Theme: Pink Bling! ��
11803- **Added:** Glamorous hot pink theme with maximum sparkle
11804- **Features:** Deep pink (#ff1493), extra glow, hearts and diamonds aesthetic
11805- **Perfect for:** Fabulous calendars that demand attention ✨
11806
11807### �� Professional Theme Shadow Fix
11808- **Fixed:** Section headers now have subtle shadow (not glow)
11809- **Fixed:** Clicked day panel header has proper shadow
11810
11811### Pink Bling Theme Colors
11812
11813**Background & Borders**:
11814```php
11815'bg' => '#1a0d14',           // Dark rich pink-black
11816'border' => '#ff1493',        // Hot pink (DeepPink)
11817'shadow' => 'rgba(255, 20, 147, 0.4)', // Strong pink glow
11818```
11819
11820**Text Colors**:
11821```php
11822'text_primary' => '#ff69b4',  // Hot pink
11823'text_bright' => '#ff1493',   // Deep pink
11824'text_dim' => '#ff85c1',      // Light pink
11825```
11826
11827**Week Grid**:
11828```php
11829'grid_bg' => '#2d1a24',       // Dark purple-pink
11830'cell_bg' => '#1a0d14',       // Dark
11831'cell_today_bg' => '#3d2030', // Highlighted purple-pink
11832```
11833
11834**Special Effects**:
11835```php
11836'bar_glow' => '0 0 5px',      // Extra sparkly glow!
11837'header_shadow' => '0 0 12px rgba(255, 20, 147, 0.6)' // Maximum bling!
11838```
11839
11840### Professional Theme Shadow Fix
11841
11842**Before**: Section headers had colored glow
11843```php
11844box-shadow: 0 0 8px #3498db; // Blue glow - wrong!
11845```
11846
11847**After**: Section headers have subtle shadow
11848```php
11849$headerShadow = ($theme === 'professional') ?
11850    '0 2px 4px rgba(0, 0, 0, 0.15)' :  // Shadow for professional
11851    '0 0 8px ' . $accentColor;          // Glow for others
11852```
11853
11854**Result**:
11855- **Matrix/Purple/Pink**: Colored glow on headers ✓
11856- **Professional**: Clean grey shadow (no glow) ✓
11857
11858### All Four Themes:
11859
11860**�� Matrix Edition**:
11861- Dark green (#00cc07)
11862- Neon glow effects
11863- Hacker aesthetic
11864
11865**�� Purple Dream**:
11866- Elegant purple (#9b59b6)
11867- Violet glow effects
11868- Royal aesthetic
11869
11870**�� Professional Blue**:
11871- Clean grey/blue (#4a90e2)
11872- Subtle shadows (NO glow)
11873- Corporate aesthetic
11874
11875**�� Pink Bling** (NEW!):
11876- Hot pink (#ff1493)
11877- MAXIMUM sparkle & glow
11878- Glamorous aesthetic ✨��
11879
11880### Technical Implementation
11881
11882**Theme Added To**:
11883- `getSidebarThemeStyles()` - color definitions
11884- `getSidebarTheme()` - validation
11885- `saveSidebarTheme()` - admin save
11886- Admin panel - UI with preview
11887- All shadow/glow calculations
11888- JavaScript theme colors
11889- Clicked day panel colors
11890
11891**Perfect for users who want FABULOUS pink calendars!** ��✨
11892
11893## Version 4.3.1 (2026-02-07) - REDUCE TEXT GLOW & CONSISTENCY
11894
11895### �� Text Glow Refinement
11896- **Changed:** Reduced text glow from 3px to 2px (less intense)
11897- **Fixed:** Clicked day panel now has same text glow as sections
11898
11899### Text Glow Reduction
11900
11901**Before**: Text glow was too strong (3px)
11902```php
11903// Sections:
11904text-shadow: 0 0 3px #00cc07; // Too bright!
11905
11906// Clicked day panel:
11907text-shadow: 0 0 3px #00cc07; // Too bright!
11908```
11909
11910**After**: Subtler text glow (2px)
11911```php
11912// Sections:
11913text-shadow: 0 0 2px #00cc07; // Just right ✓
11914
11915// Clicked day panel:
11916text-shadow: 0 0 2px #00cc07; // Just right ✓
11917```
11918
11919**Visual Impact**:
11920- **Matrix**: Softer green glow, easier to read
11921- **Purple**: Softer purple glow, more elegant
11922- **Professional**: Still no glow (clean)
11923
11924### Consistency Fix
11925
11926**Before**: Sections had glow, clicked day panel had NO glow
11927
11928**After**: Both sections AND clicked day panel have matching subtle glow
11929
11930**Where Glow Appears**:
11931- ✅ Today section event text
11932- ✅ Tomorrow section event text
11933- ✅ Important section event text
11934- ✅ **Clicked day panel event text** ← NOW CONSISTENT!
11935
11936**Result**:
11937- Glow is less intense and easier on eyes ✓
11938- All event text has consistent styling ✓
11939- Matrix/Purple themes more refined ✓
11940
11941### Technical Details
11942
11943**PHP (Sections)**:
11944```php
11945$textShadow = ($theme === 'professional') ? '' : 'text-shadow:0 0 2px ' . $titleColor . ';';
11946```
11947
11948**JavaScript (Clicked Day Panel)**:
11949```javascript
11950themeColors.text_shadow = 'text-shadow:0 0 2px #00cc07'; // Or purple
11951eventHTML += "style='...color:" + color + "; " + themeColors.text_shadow + ";'";
11952```
11953
11954**Perfect consistency and subtle elegance!** ✨
11955
11956## Version 4.3.0 (2026-02-07) - IMPORTANT EVENTS FUTURE + REMOVE GREY
11957
11958### ✨ Important Events Enhancement
11959- **Changed:** Important events now show from next 2 weeks (not just current week)
11960- **Fixed:** Important events on Sunday after current week now visible
11961- **Changed:** Events loaded 2 weeks into future for Important section
11962
11963### �� Background Cleanup
11964- **Removed:** Grey/white backgrounds from Today/Tomorrow/Important sections
11965- **Removed:** Grey backgrounds from individual events
11966- **Result:** Clean transparent backgrounds, original dark Matrix look restored
11967
11968### Important Events - Future Coverage
11969
11970**Before**: Only showed Important events from current week
11971```php
11972if ($isImportant && $dateKey >= $weekStart && $dateKey <= $weekEnd) {
11973    $importantEvents[] = $event;
11974}
11975```
11976
11977**After**: Shows Important events from today through next 2 weeks
11978```php
11979// Load events 2 weeks out
11980$twoWeeksOut = date('Y-m-d', strtotime($weekEnd . ' +14 days'));
11981
11982// Show all important events from today forward
11983if ($isImportant && $dateKey >= $todayStr) {
11984    $importantEvents[] = $event;
11985}
11986```
11987
11988**Example**:
11989- Today: Saturday Feb 7
11990- Current week: Sun Feb 1 → Sat Feb 7
11991- Important events shown: Feb 7 → Feb 21 (today + 14 days)
11992
11993**Result**: Important events on Sunday Feb 8 (next week) now visible! ✓
11994
11995### Background Removal
11996
11997**Before**: Light grey/white backgrounds added
11998```php
11999// Section background:
12000$sectionBg = 'rgba(255, 255, 255, 0.05)'; // Grey overlay
12001
12002// Event background:
12003$eventBg = 'rgba(255, 255, 255, 0.03)'; // Grey overlay
12004```
12005
12006**After**: No backgrounds (transparent)
12007```php
12008// Section: No background property
12009<div style="padding:4px 0;">
12010
12011// Event: No background property
12012<div style="padding:4px 6px; ...">
12013```
12014
12015**Result**:
12016- Clean, dark Matrix aesthetic restored ✓
12017- Purple theme darker and more elegant ✓
12018- Professional theme still has its light grey sidebar bg ✓
12019- Events stand out with just color bars and borders ✓
12020
12021### What Changed:
12022
12023**Sections (Today/Tomorrow/Important)**:
12024- ❌ No more grey overlay
12025- ✓ Transparent background
12026- ✓ Colored borders & glows remain
12027
12028**Individual Events**:
12029- ❌ No more grey overlay
12030- ✓ Transparent background
12031- ✓ Colored bars & borders remain
12032
12033**Perfect! Back to the original clean dark look with future Important events!** ��
12034
12035## Version 4.2.6 (2026-02-07) - FIX SECTION SHADOWS & DESCRIPTION COLOR
12036
12037### �� Final Theme Polish
12038- **Fixed:** Today/Tomorrow/Important section shadows now match theme
12039- **Fixed:** Event description text color now uses theme dim color
12040
12041### Section Shadow Fix
12042
12043**Problem**: Sections always had green glow regardless of theme
12044
12045**Before**:
12046```php
12047// Hardcoded green:
12048box-shadow: 0 0 5px rgba(0, 204, 7, 0.2);
12049```
12050
12051**After**:
12052```php
12053// Theme-aware:
12054$sectionShadow = $theme === 'matrix' ? '0 0 5px rgba(0, 204, 7, 0.2)' :
12055                ($theme === 'purple' ? '0 0 5px rgba(155, 89, 182, 0.2)' :
12056                '0 2px 4px rgba(0, 0, 0, 0.1)');
12057```
12058
12059**Result**:
12060- **Matrix**: Green glow around sections ✓
12061- **Purple**: Purple glow around sections ✓
12062- **Professional**: Subtle grey shadow (no glow) ✓
12063
12064### Description Color Fix
12065
12066**Problem**: Description text always green in clicked day panel
12067
12068**Before**:
12069```javascript
12070color: #00aa00; // Always green
12071```
12072
12073**After**:
12074```javascript
12075color: themeColors.text_dim; // Theme dim color
12076```
12077
12078**Result**:
12079- **Matrix**: Dim green (#00aa00) ✓
12080- **Purple**: Dim purple (#8e7ab8) ✓
12081- **Professional**: Grey (#7f8c8d) ✓
12082
12083### Now 100% Theme Consistent
12084
12085Every single visual element respects theme:
12086- ✅ Sidebar background & border
12087- ✅ Header colors & shadows
12088- ✅ Week grid & cells
12089- ✅ Add Event button
12090- ✅ Section borders & **shadows** ← Fixed!
12091- ✅ Event titles & times
12092- ✅ Event **descriptions** ← Fixed!
12093- ✅ Clicked day panel
12094- ✅ Event bars & glows
12095
12096**Absolute perfection across all three themes!** ��✨
12097
12098## Version 4.2.5 (2026-02-07) - CLICKED DAY PANEL THEMES & GREY BACKGROUND
12099
12100### �� Theme Improvements
12101- **Fixed:** Clicked day panel now uses correct theme colors
12102- **Changed:** Professional Blue background now light grey (not white)
12103- **Added:** Theme colors passed to JavaScript for dynamic rendering
12104
12105### Clicked Day Panel Theming
12106
12107**Before**: Always blue regardless of theme
12108```javascript
12109// Hardcoded blue:
12110color:#00cc07;  // Always green
12111background:#3498db;  // Always blue
12112```
12113
12114**After**: Theme-aware colors
12115```php
12116// PHP passes theme to JavaScript:
12117window.themeColors_XXX = {
12118    text_primary: '#00cc07' or '#b19cd9' or '#2c3e50',
12119    text_bright: '#00dd00' or '#d4a5ff' or '#4a90e2',
12120    text_shadow: '0 0 3px ...' or '',
12121    event_bg: 'rgba(...)',
12122    border_color: 'rgba(...)',
12123    bar_shadow: '0 0 3px' or '0 1px 2px rgba(...)'
12124};
12125
12126// JavaScript uses theme colors:
12127color: themeColors.text_primary;
12128background: themeColors.event_bg;
12129```
12130
12131**Result**:
12132- Matrix: Green panel with green glow ✓
12133- Purple: Purple panel with purple glow ✓
12134- Professional: Blue panel, no glow, clean ✓
12135
12136### Professional Theme Background Change
12137
12138**Before**: Almost white (#f5f7fa, #ffffff)
12139```php
12140'bg' => '#f5f7fa',           // Very light
12141'cell_bg' => '#ffffff',      // Pure white
12142```
12143
12144**After**: Light grey tones
12145```php
12146'bg' => '#e8ecf1',           // Soft grey-blue
12147'cell_bg' => '#f5f7fa',      // Light grey
12148'grid_bg' => '#d5dbe3',      // Medium grey
12149'cell_today_bg' => '#dce8f7' // Highlighted grey-blue
12150```
12151
12152**Visual Impact**:
12153- Sidebar: Light grey-blue background (#e8ecf1)
12154- Week cells: Lighter grey (#f5f7fa)
12155- Today cell: Highlighted blue-grey (#dce8f7)
12156- More depth and contrast ✓
12157- Professional appearance ✓
12158
12159### All Theme Elements Now Consistent
12160
12161**Matrix (Green)**:
12162- Sidebar: Dark (#242424)
12163- Clicked panel: Dark with green
12164- Text: Green with glow
12165
12166**Purple Dream**:
12167- Sidebar: Dark purple (#2a2030)
12168- Clicked panel: Dark with purple
12169- Text: Purple with glow
12170
12171**Professional Blue**:
12172- Sidebar: Light grey (#e8ecf1)
12173- Clicked panel: Light with blue
12174- Text: Dark grey, no glow
12175
12176**Perfect theme consistency everywhere!** ��
12177
12178## Version 4.2.4 (2026-02-07) - FIX TOMORROW LOADING & DOUBLE ENCODING
12179
12180### �� Critical Fixes
12181- **Fixed:** Tomorrow events not loaded when outside current week
12182- **Fixed:** `&amp;` showing instead of `&` (double HTML encoding)
12183
12184### Issue 1: Tomorrow Not Loading
12185
12186**Problem**: Sidebar only loaded events for current week
12187- Today (Saturday): Week ends today
12188- Tomorrow (Sunday): Start of NEXT week
12189- Tomorrow events never loaded from data files!
12190
12191**Before**:
12192```php
12193// Only load current week
12194$end = new DateTime($weekEnd);
12195$end->modify('+1 day');
12196$period = new DatePeriod($start, $interval, $end);
12197// If tomorrow > weekEnd, it's not in period!
12198```
12199
12200**After**:
12201```php
12202// Check if tomorrow is outside week
12203$tomorrowDate = date('Y-m-d', strtotime('+1 day'));
12204if ($tomorrowDate > $weekEnd) {
12205    // Extend to include tomorrow
12206    $end = new DateTime($tomorrowDate);
12207}
12208$end->modify('+1 day');
12209$period = new DatePeriod($start, $interval, $end);
12210```
12211
12212**Result**: Tomorrow events now loaded even at week boundary! ✓
12213
12214### Issue 2: Double HTML Encoding
12215
12216**Problem**: `&` characters showing as `&amp;`
12217
12218**Cause**: Double encoding on line 2625 and 2681
12219```php
12220// Line 2625:
12221$title = htmlspecialchars($event['title']); // "Coffee & Tea" → "Coffee &amp; Tea"
12222
12223// Line 2681:
12224$html .= htmlspecialchars($title); // "Coffee &amp; Tea" → "Coffee &amp;amp; Tea" ❌
12225```
12226
12227**Fixed**:
12228```php
12229// Line 2625:
12230$title = htmlspecialchars($event['title']); // Encode once
12231
12232// Line 2681:
12233$html .= $title; // Use already-encoded value ✓
12234```
12235
12236**Result**: `&` displays correctly! ✓
12237
12238### Both Fixes Critical
12239
12240These were **two separate bugs**:
122411. **Loading bug**: Tomorrow events not read from files
122422. **Display bug**: Double-encoding text
12243
12244Both needed fixing for Tomorrow section to work properly!
12245
12246## Version 4.2.3 (2026-02-07) - FIX TOMORROW SECTION AT WEEK BOUNDARY
12247
12248### �� Critical Fix
12249- **Fixed:** Tomorrow section missing when tomorrow is outside current week
12250- **Fixed:** Today section now always shows regardless of week boundaries
12251- **Changed:** Today/Tomorrow processed BEFORE week boundary checks
12252
12253### The Problem
12254
12255**Scenario**: Today is Saturday (last day of week)
12256- Week: Feb 1 (Sun) → Feb 7 (Sat) ← Today
12257- Tomorrow: Feb 8 (Sun) ← **Start of NEXT week**
12258
12259**BROKEN Logic** (v4.2.2):
12260```php
12261foreach ($events as $dateKey => $dayEvents) {
12262    if ($dateKey < $weekStart) continue; // Skip old events
12263
12264    // ...week processing...
12265
12266    if ($dateKey === $tomorrowStr) {  // ← Never reached!
12267        $tomorrowEvents[] = $event;   //   Tomorrow > weekEnd
12268    }
12269}
12270```
12271
12272**Result**: Tomorrow events never added because loop skipped them! ❌
12273
12274### The Fix
12275
12276**Process Today/Tomorrow FIRST**:
12277```php
12278foreach ($events as $dateKey => $dayEvents) {
12279    $eventsWithConflicts = $this->detectTimeConflicts($dayEvents);
12280
12281    foreach ($eventsWithConflicts as $event) {
12282        // ALWAYS process Today and Tomorrow first!
12283        if ($dateKey === $todayStr) {
12284            $todayEvents[] = $event; // ✓ Always shows
12285        }
12286        if ($dateKey === $tomorrowStr) {
12287            $tomorrowEvents[] = $event; // ✓ Always shows
12288        }
12289
12290        // THEN check week boundaries for grid
12291        if ($dateKey >= $weekStart && $dateKey <= $weekEnd) {
12292            $weekEvents[$dateKey][] = $event;
12293        }
12294
12295        // Important events still week-only
12296        if ($isImportant && $dateKey >= $weekStart && $dateKey <= $weekEnd) {
12297            $importantEvents[] = $event;
12298        }
12299    }
12300}
12301```
12302
12303### What Changed
12304
12305**Before**:
123061. Skip events < weekStart ❌
123072. Process week grid
123083. Try to add Today/Tomorrow ← **Failed if outside week**
123094. Add Important events
12310
12311**After**:
123121. **Always add Today events** ✓
123132. **Always add Tomorrow events** ✓
123143. Add to week grid if in range
123154. Add Important events if in range
12316
12317**Result**:
12318- Today section: ✓ Always shows
12319- Tomorrow section: ✓ Always shows (even at week boundary!)
12320- Week grid: ✓ Only current week
12321- Important: ✓ Only current week
12322
12323### Edge Cases Fixed
12324
12325**Saturday → Sunday transition**:
12326- Today (Sat): Shows in Today section ✓
12327- Tomorrow (Sun): Shows in Tomorrow section ✓
12328- Week grid: Only shows Sat (today) ✓
12329
12330**Sunday → Monday transition**:
12331- Today (Sun): Shows in Today section ✓
12332- Tomorrow (Mon): Shows in Tomorrow section ✓
12333- Week grid: Shows both Sun and Mon ✓
12334
12335**Perfect! Tomorrow section now always works!** ��
12336
12337## Version 4.2.2 (2026-02-07) - SUNDAY NOT SATURDAY!
12338
12339### �� Corrected Week Options
12340- **Changed:** Week start options are now Monday vs **Sunday** (not Saturday!)
12341- **Changed:** Default is **Sunday** (US/Canada standard)
12342- **Fixed:** Day names array for Sunday start: S M T W T F S
12343
12344### �� Correct Week Start Options
12345
12346**Sunday Start** (Default):
12347- Grid shows: **S M T W T F S**
12348- Week: Sunday → Saturday
12349- US/Canada standard
12350- Most common worldwide
12351
12352**Monday Start**:
12353- Grid shows: **M T W T F S S**
12354- Week: Monday → Sunday
12355- ISO 8601 standard
12356- Common in Europe
12357
12358### Technical Changes
12359
12360**All References Updated**:
12361```php
12362// Changed from 'saturday' to 'sunday' in:
12363- Admin validation
12364- Week calculation logic
12365- Day names array
12366- Default value
12367- Comments
12368```
12369
12370**Sunday Calculation** (when today is Saturday):
12371```php
12372$today = date('w'); // 0=Sun, 6=Sat
12373if ($today == 0) {
12374    $weekStart = date('Y-m-d'); // Today!
12375} else {
12376    // Go back $today days to last Sunday
12377    $weekStart = date('Y-m-d', strtotime('-' . $today . ' days'));
12378}
12379```
12380
12381**Examples**:
12382- Today (Saturday): Week = Sun Feb 1 → Sat Feb 7
12383- Tomorrow (Sunday): Week = Sun Feb 8 → Sat Feb 14
12384
12385**Sorry for the confusion - it's Sunday not Saturday!** ��
12386
12387## Version 4.2.1 (2026-02-07) - FIX WEEK CALCULATION ON SATURDAY
12388
12389### �� Critical Fix
12390- **Fixed:** Week calculation broken when today is Saturday
12391- **Fixed:** Events not showing in Today/Important sections
12392- **Fixed:** Week grid event bars missing
12393- **Changed:** Default week start is Saturday (matches main calendar)
12394
12395### Technical Details
12396
12397**The Bug**:
12398```php
12399// BROKEN (v4.2.0):
12400$weekStart = date('Y-m-d', strtotime('saturday this week'));
12401// When TODAY is Saturday, this is ambiguous and fails!
12402
12403// FIXED (v4.2.1):
12404$today = date('w'); // 0 (Sun) to 6 (Sat)
12405if ($today == 6) {
12406    $weekStart = date('Y-m-d'); // Today!
12407} else {
12408    $daysBack = ($today == 0) ? 1 : ($today + 1);
12409    $weekStart = date('Y-m-d', strtotime('-' . $daysBack . ' days'));
12410}
12411$weekEnd = date('Y-m-d', strtotime($weekStart . ' +6 days'));
12412```
12413
12414**Why It Failed**:
12415- `strtotime('saturday this week')` is ambiguous when run ON a Saturday
12416- PHP may interpret it as "next Saturday" or fail
12417- Result: Week range was wrong, events filtered out
12418
12419**The Fix**:
12420- Explicit calculation using day-of-week math
12421- Saturday (day 6): weekStart = today
12422- Sunday (day 0): weekStart = yesterday
12423- Monday-Friday: calculate days back to last Saturday
12424
12425**Result**: Works reliably every day of the week!
12426
12427**Default Changed**: Saturday start (was Monday in 4.2.0)
12428- Matches main calendar behavior
12429- Users can still switch to Monday in settings
12430
12431## Version 4.2.0 (2026-02-07) - WEEK START DAY SELECTOR
12432
12433### ✨ New Feature
12434- **Added:** Week start day selector in Themes tab
12435- **Added:** Choose between Monday (ISO standard) or Saturday week start
12436- **Added:** Week grid and all events now respect the selected start day
12437- **Changed:** Themes tab renamed to "Sidebar Widget Settings"
12438
12439### �� Week Start Options
12440
12441**Monday Start** (Default):
12442- Grid shows: M T W T F S S
12443- Week runs: Monday → Sunday
12444- ISO 8601 standard
12445- Common in Europe, most of world
12446
12447**Saturday Start**:
12448- Grid shows: S S M T W T F
12449- Week runs: Saturday → Friday
12450- Common in Middle East
12451- Sabbath-observant communities
12452
12453### Technical Details
12454
12455**Configuration**:
12456```php
12457// Saved in: data/meta/calendar_week_start.txt
12458// Values: 'monday' or 'saturday'
12459
12460// Week calculation:
12461if ($weekStartDay === 'saturday') {
12462    $weekStart = date('Y-m-d', strtotime('saturday this week'));
12463    $weekEnd = date('Y-m-d', strtotime('friday next week'));
12464} else {
12465    $weekStart = date('Y-m-d', strtotime('monday this week'));
12466    $weekEnd = date('Y-m-d', strtotime('sunday this week'));
12467}
12468```
12469
12470**Day Names Array**:
12471```php
12472// Monday start: ['M', 'T', 'W', 'T', 'F', 'S', 'S']
12473// Saturday start: ['S', 'S', 'M', 'T', 'W', 'T', 'F']
12474```
12475
12476**What Changes**:
12477- Week grid day letters
12478- Week grid date sequence
12479- Today/Tomorrow/Important event date ranges
12480- Week event grouping
12481
12482**What Stays Same**:
12483- All themes still work
12484- Event data unchanged
12485- Main calendar unaffected
12486
12487### How to Change:
12488
124891. Admin → Calendar → �� Themes tab
124902. Under "Week Start Day" section
124913. Select Monday or Saturday
124924. Click "Save Settings"
124935. Refresh sidebar to see changes
12494
12495**Perfect for international users or religious observances!** ��
12496
12497## Version 4.1.4 (2026-02-07) - WEEK STARTS SUNDAY & LIGHTER BACKGROUNDS
12498
12499### ��️ Calendar Improvements
12500- **Changed:** Week grid now starts on Sunday and ends on Saturday (matches main calendar)
12501- **Changed:** Event section backgrounds much lighter (almost white)
12502- **Changed:** Individual event backgrounds lighter and more readable
12503- **Changed:** Event borders now theme-colored
12504
12505### Technical Details
12506
12507**Week Start Change**:
12508```php
12509// Before:
12510$weekStart = date('Y-m-d', strtotime('monday this week'));
12511$weekEnd = date('Y-m-d', strtotime('sunday this week'));
12512$dayNames = ['M', 'T', 'W', 'T', 'F', 'S', 'S'];
12513
12514// After:
12515$weekStart = date('Y-m-d', strtotime('sunday this week'));
12516$weekEnd = date('Y-m-d', strtotime('saturday this week'));
12517$dayNames = ['S', 'M', 'T', 'W', 'T', 'F', 'S'];
12518```
12519
12520**Background Colors**:
12521```php
12522// Section backgrounds (Today, Tomorrow, Important):
12523Matrix: rgba(255, 255, 255, 0.05)    // Very light overlay
12524Purple: rgba(255, 255, 255, 0.08)    // Slightly lighter
12525Professional: rgba(255, 255, 255, 0.95)  // Almost white!
12526
12527// Individual event backgrounds:
12528Matrix: rgba(255, 255, 255, 0.03)    // Subtle
12529Purple: rgba(255, 255, 255, 0.05)    // Light
12530Professional: rgba(255, 255, 255, 0.5)   // Semi-transparent white
12531```
12532
12533**Event Borders**:
12534```php
12535Matrix: rgba(0, 204, 7, 0.2)         // Green
12536Purple: rgba(155, 89, 182, 0.2)      // Purple
12537Professional: rgba(74, 144, 226, 0.2) // Blue
12538```
12539
12540### Visual Result:
12541
12542**Before**: Dark backgrounds made text hard to read
12543**After**: Light backgrounds make events pop and text very readable
12544
12545**Week Grid**:
12546```
12547Before: [M][T][W][T][F][S][S]
12548After:  [S][M][T][W][T][F][S]  ← Now matches main calendar!
12549```
12550
12551## Version 4.1.3 (2026-02-07) - EVENT TEXT THEME COLORS
12552
12553### �� Final Theme Polish
12554- **Fixed:** Event titles in Today/Tomorrow/Important sections now use theme colors
12555- **Fixed:** Event times now use theme bright color
12556- **Fixed:** Event dates use theme dim color
12557- **Fixed:** Task checkboxes use theme bright color
12558- **Fixed:** Event color bars use theme-appropriate shadows
12559- **Fixed:** No text shadows on Professional theme
12560
12561### Technical Details
12562
12563**Event Text Colors**:
12564```php
12565// Matrix:
12566- Title: #00cc07 (green)
12567- Time: #00dd00 (bright green)
12568- Date: #00aa00 (dim green)
12569- Text shadow: 0 0 3px (glow)
12570
12571// Purple:
12572- Title: #b19cd9 (lavender)
12573- Time: #d4a5ff (bright purple)
12574- Date: #8e7ab8 (dim purple)
12575- Text shadow: 0 0 3px (glow)
12576
12577// Professional:
12578- Title: #2c3e50 (dark grey)
12579- Time: #4a90e2 (blue)
12580- Date: #7f8c8d (grey)
12581- Text shadow: none (clean)
12582```
12583
12584**Color Bar Shadows**:
12585```php
12586// Matrix & Purple: Glow effect
12587box-shadow: 0 0 3px [event-color];
12588
12589// Professional: Subtle shadow
12590box-shadow: 0 1px 2px rgba(0,0,0,0.2);
12591```
12592
12593### What's Now Fully Themed:
12594
12595✅ Sidebar background & border
12596✅ Header (clock box) background, border, text
12597✅ Week grid background, borders, cells
12598✅ Week grid day letters & numbers
12599✅ Week grid event bars & "+N more" text
12600✅ Add Event button background & text
12601Today/Tomorrow/Important event titles
12602✅ Event times
12603✅ Event dates (Important section)
12604✅ Task checkboxes
12605✅ Event color bars
12606✅ All text shadows (glow vs none)
12607
12608**Every single element now respects the theme!** ��
12609
12610## Version 4.1.2 (2026-02-07) - COMPLETE THEME INTEGRATION
12611
12612### �� Theme Improvements
12613- **Fixed:** Week calendar grid now uses theme colors (purple/blue)
12614- **Fixed:** Add Event button now uses theme colors
12615- **Fixed:** Clock box border now matches theme
12616- **Fixed:** All text shadows respect theme (no glow on professional)
12617- **Fixed:** Event bars use theme-appropriate shadows
12618
12619### Technical Details
12620
12621**Week Grid Theming**:
12622```php
12623// Matrix: Dark green (#1a3d1a) background, green (#00cc07) borders
12624// Purple: Dark purple (#3d2b4d) background, purple (#9b59b6) borders
12625// Professional: Light grey (#e8ecf1) background, blue (#4a90e2) borders
12626```
12627
12628**Add Event Button**:
12629```php
12630// Matrix: Dark green (#006400) with bright green text
12631// Purple: Purple (#7d3c98) with lavender text
12632// Professional: Blue (#3498db) with white text
12633```
12634
12635**Text Shadows**:
12636```php
12637// Matrix & Purple: Glow effects (text-shadow: 0 0 6px color)
12638// Professional: No glow (clean look)
12639```
12640
12641**CSS Overrides**:
12642```css
12643/* Purple theme */
12644.sidebar-purple .eventlist-today-header {
12645    border-color: #9b59b6;
12646    box-shadow: 0 0 8px rgba(155, 89, 182, 0.2);
12647}
12648
12649/* Professional theme */
12650.sidebar-professional .eventlist-today-header {
12651    border-color: #4a90e2;
12652    box-shadow: 0 2px 4px rgba(0, 0, 0, 0.1);
12653}
12654```
12655
12656### What Changed Per Theme:
12657
12658**Purple Dream**:
12659- Week grid: Purple borders and dark purple background
12660- Add Event: Purple button with lavender text
12661- Clock box: Purple border with purple glow
12662- Event bars: Purple glow instead of green
12663- All text: Purple/lavender shades
12664
12665**Professional Blue**:
12666- Week grid: Blue borders and light grey background
12667- Add Event: Blue button with white text
12668- Clock box: Blue border with subtle shadow (no glow)
12669- Event bars: Subtle shadows (no glow)
12670- All text: Dark grey and blue shades
12671
12672**Matrix Edition**: Unchanged (still perfect green theme!)
12673
12674## Version 4.1.1 (2026-02-07) - THEMES TAB & TOOLTIP LEFT POSITIONING
12675
12676### ✨ New Features
12677- **Added:** �� Themes tab in admin for sidebar widget theming
12678- **Added:** Three visual themes: Matrix (green), Purple Dream (purple), Professional Blue (blue/grey)
12679- **Added:** Theme selector with live previews
12680- **Added:** Theme persistence across page loads
12681
12682### �� Available Themes
12683
12684**Matrix Edition** (Default):
12685- Dark background (#242424)
12686- Green accents (#00cc07)
12687- Neon glow effects
12688- Original Matrix styling
12689
12690**Purple Dream**:
12691- Dark purple background (#2a2030)
12692- Purple/violet accents (#9b59b6)
12693- Elegant purple glow
12694- Rich purple color scheme
12695
12696**Professional Blue**:
12697- Light grey background (#f5f7fa)
12698- Blue accents (#4a90e2)
12699- Clean professional look
12700- Subtle shadows instead of glow
12701
12702### �� Bug Fix
12703- **Fixed:** Tooltips now go UP and to the LEFT (was going right)
12704- **Changed:** Tooltip offset from `rect.right` to `rect.left - 150px`
12705
12706### Technical Details
12707
12708**Theme System**:
12709```php
12710// Saved in: data/meta/calendar_theme.txt
12711// Applied dynamically in syntax.php
12712$theme = $this->getSidebarTheme();  // 'matrix', 'purple', or 'professional'
12713$styles = $this->getSidebarThemeStyles($theme);
12714
12715// Styles include:
12716- bg, border, shadow
12717- header_bg, header_border, header_shadow
12718- text_primary, text_bright, text_dim
12719- grid_bg, grid_border
12720- cell_bg, cell_today_bg
12721```
12722
12723**Theme Changes**:
12724- Header background gradient
12725- Border colors
12726- Text colors
12727- Shadow/glow effects
12728- Grid colors
12729
12730**How to Change**:
127311. Admin → Calendar → �� Themes tab
127322. Select desired theme
127333. Click "Save Theme"
127344. Refresh page to see changes
12735
12736### Notes
12737- Themes only affect sidebar widget appearance
12738- Main calendar view unchanged
12739- Theme setting stored in `data/meta/calendar_theme.txt`
12740- Safe to switch themes - no data affected
12741
12742## Version 4.1.0 (2026-02-07) - FIX EVENT SORTING & TOOLTIP POSITIONING
12743
12744### �� Bug Fixes
12745- **Fixed:** Events now sort chronologically by time (was using string comparison)
12746- **Fixed:** Tooltip positioning using JavaScript like system tooltips
12747- **Fixed:** All-day events appear first, then events in time order
12748
12749### Technical Details
12750
12751**Event Sorting Fix**:
12752```php
12753// BROKEN (v4.0.9):
12754return strcmp($aTime, $bTime);
12755// String comparison: "10:00" < "8:00" because "1" < "8"
12756// Result: 10:00 AM shown BEFORE 8:00 AM ❌
12757
12758// FIXED (v4.1.0):
12759$aMinutes = $this->timeToMinutes($aTime);  // 8:00 = 480
12760$bMinutes = $this->timeToMinutes($bTime);  // 10:00 = 600
12761return $aMinutes - $bMinutes;
12762// Result: 8:00 AM shown BEFORE 10:00 AM ✓
12763```
12764
12765**Example Before Fix**:
12766```
12767�� Weekend Ticket Duty (all-day)
127688:00 AM START TICKETS
1276910:00 AM Soul Winning    ← Wrong!
127709:45 AM Coffee           ← Should be before 10:00 AM
12771```
12772
12773**Example After Fix**:
12774```
12775�� Weekend Ticket Duty (all-day)
127768:00 AM START TICKETS
127779:45 AM Coffee           ← Correct!
1277810:00 AM Soul Winning
12779```
12780
12781**Tooltip Positioning**:
12782- Added JavaScript to dynamically position tooltips using `getBoundingClientRect()`
12783- Uses CSS custom properties `--tooltip-left` and `--tooltip-top`
12784- Positioned on `mouseenter` event
12785- Matches system tooltip implementation (no cutoff)
12786
12787**JavaScript Implementation**:
12788```javascript
12789element.addEventListener("mouseenter", function() {
12790    const rect = element.getBoundingClientRect();
12791    element.style.setProperty("--tooltip-left", (rect.right - 10) + "px");
12792    element.style.setProperty("--tooltip-top", (rect.top - 30) + "px");
12793});
12794```
12795
12796**Result**: Tooltips now extend beyond sidebar without cutoff, positioned dynamically!
12797
12798## Version 4.0.9 (2026-02-07) - COMPACT TOOLTIPS & OVERFLOW FIX
12799
12800### �� UI Improvements
12801- **Fixed:** Sidebar tooltips no longer cut off at sidebar edge
12802- **Fixed:** Changed inline `overflow:hidden` to `overflow:visible` in sidebar
12803- **Changed:** Main calendar conflict tooltip now much smaller (was too big)
12804
12805### Technical Details
12806
12807**Sidebar Overflow Fix**:
12808```php
12809// Before (line 2005):
12810style="...overflow:hidden..."  // ← Blocked tooltips!
12811
12812// After:
12813style="...overflow:visible..."  // ← Tooltips extend beyond!
12814```
12815
12816**The Problem**: Inline `overflow:hidden` overrode CSS `overflow:visible !important`
12817
12818**Main Calendar Tooltip Size**:
12819```css
12820/* Before: */
12821.conflict-tooltip {
12822    border: 2px solid #ff9800;
12823    border-radius: 6px;
12824    padding: 8px 12px;
12825    font-size: 12px;
12826    min-width: 200px;
12827    max-width: 350px;
12828}
12829
12830/* After: */
12831.conflict-tooltip {
12832    border: 1px solid #ff9800;  /* Thinner */
12833    border-radius: 3px;          /* Smaller */
12834    padding: 4px 8px;            /* Less padding */
12835    font-size: 10px;             /* Smaller header */
12836    min-width: 120px;            /* Narrower */
12837    max-width: 200px;            /* Narrower */
12838}
12839
12840.conflict-tooltip-body {
12841    padding: 6px 8px;  /* Was 10px 12px */
12842    font-size: 9px;    /* Was 11px */
12843    line-height: 1.4;  /* Was 1.6 */
12844}
12845
12846.conflict-item {
12847    padding: 2px 0;  /* Was 4px */
12848    font-size: 9px;  /* Added smaller font */
12849}
12850```
12851
12852**Result**:
12853- Main calendar tooltip ~50% smaller
12854- Sidebar tooltips now extend beyond borders
12855- Both tooltips compact and readable
12856
12857## Version 4.0.8 (2026-02-07) - FIX NEWLINES IN TOOLTIP
12858
12859### �� Bug Fix
12860- **Fixed:** Tooltip now shows actual line breaks (not literal `\n` text)
12861- **Changed:** Using HTML entity `&#10;` for newlines instead of `\n`
12862
12863### Technical Details
12864
12865**The Problem**:
12866```php
12867// Before (v4.0.7):
12868$conflictTooltip = 'Conflicts with:\n';  // Literal \n showed in tooltip
12869
12870// Displayed as:
12871"Conflicts with:\n• Event 1\n• Event 2"  // ← Literal backslash-n
12872```
12873
12874**The Fix**:
12875```php
12876// After (v4.0.8):
12877$conflictTooltip = "Conflicts with:&#10;";  // HTML entity for newline
12878
12879// Displays as:
12880Conflicts with:
12881• Event 1
12882• Event 2
12883```
12884
12885**Why `&#10;` Works**:
12886- HTML entity for line feed character
12887- Works in data attributes
12888- CSS `white-space: pre-line` preserves the newlines
12889- Renders as actual line breaks in tooltip
12890
12891**Applied to**:
12892- PHP rendering (sidebar Today/Tomorrow/Important)
12893- JavaScript rendering (clicked day events)
12894
12895## Version 4.0.7 (2026-02-07) - COMPACT TOOLTIP & OVERFLOW FIX
12896
12897### �� UI Improvements
12898- **Changed:** Tooltip size reduced significantly (much more compact)
12899- **Fixed:** Tooltip now overflows sidebar borders (not cut off)
12900- **Changed:** Smaller padding (3px vs 6px), smaller font (9px vs 11px)
12901- **Changed:** Narrower width (120-200px vs 200-300px)
12902
12903### Technical Details
12904
12905**Tooltip Size Reduction**:
12906```css
12907/* Before (v4.0.6):
12908padding: 6px 10px;
12909font-size: 11px;
12910min-width: 200px;
12911max-width: 300px;
12912
12913/* After (v4.0.7): */
12914padding: 3px 6px;
12915font-size: 9px;
12916min-width: 120px;
12917max-width: 200px;
12918```
12919
12920**Overflow Fix**:
12921```css
12922/* Allow tooltip to extend beyond sidebar */
12923.sidebar-widget,
12924.sidebar-matrix {
12925    overflow: visible !important;
12926}
12927
12928/* Position tooltip outside */
12929[data-tooltip]:before {
12930    bottom: 120%;  /* Further above */
12931    right: -10px;  /* Can extend beyond edge */
12932    z-index: 10000; /* Always on top */
12933}
12934```
12935
12936**Visual Result**:
12937- Tooltip is ~40% smaller
12938- Extends beyond sidebar border if needed
12939- Still readable, just more compact
12940- Better for small screens
12941
12942## Version 4.0.6 (2026-02-07) - MATCH MAIN CALENDAR LOGIC & TOOLTIP POSITIONING
12943
12944### �� Critical Fix
12945- **Fixed:** Sidebar conflict detection now matches main calendar logic exactly
12946- **Fixed:** Checks both `end_time` (snake_case) and `endTime` (camelCase) field names
12947- **Fixed:** Events without end time now treated as zero-duration (not +1 hour)
12948- **Fixed:** Now matches what you see in main calendar view
12949
12950### ✨ UI Improvement
12951- **Changed:** Conflict tooltips now appear ABOVE and to the LEFT (not below/right)
12952- **Added:** Custom CSS tooltip with data-tooltip attribute
12953- **Improved:** Better tooltip positioning - doesn't overflow screen edges
12954
12955### Technical Details
12956
12957**The Problem - Field Name Mismatch**:
12958```php
12959// Main calendar (line 697):
12960$end1 = isset($evt1['endTime']) ? ... // ← Checks 'endTime' (camelCase)
12961
12962// Sidebar (before fix):
12963$endTime = isset($event['end_time']) ? ... // ← Only checked 'end_time' (snake_case)
12964```
12965
12966**The Problem - Duration Logic**:
12967```php
12968// Main calendar (line 697):
12969$end1 = isset($evt1['endTime']) && !empty($evt1['endTime'])
12970    ? $evt1['endTime']
12971    : $evt1['time'];  // ← Uses START time (zero duration)
12972
12973// Sidebar (before fix):
12974$endTime = ... ? ... : $this->addHoursToTime($startTime, 1);  // ← Added 1 hour!
12975```
12976
12977**The Fix**:
12978```php
12979// Now checks BOTH field names:
12980if (isset($event['end_time']) && $event['end_time'] !== '') {
12981    $endTime = $event['end_time'];
12982} elseif (isset($event['endTime']) && $event['endTime'] !== '') {
12983    $endTime = $event['endTime'];
12984} else {
12985    $endTime = $startTime;  // ← Matches main calendar!
12986}
12987```
12988
12989**Tooltip Positioning**:
12990- Uses `data-tooltip` attribute instead of `title`
12991- CSS positions tooltip ABOVE badge (`bottom: 100%`)
12992- Aligns to RIGHT edge (`right: 0`)
12993- Arrow points down to badge
12994- Black background with white text
12995- Max width 300px
12996
12997### Example
12998
12999**6:00 PM Evening Service** (no end time):
13000- Old: 6:00 PM - 7:00 PM (assumed 1 hour) ❌
13001- New: 6:00 PM - 6:00 PM (zero duration) ✓ Matches main calendar!
13002
13003**3:30 PM-7:00 PM Super Bowl** vs **6:00 PM Service**:
13004- Zero-duration events at 6:00 PM don't overlap with anything
13005- ONLY if service has explicit end time (e.g., 6:00-7:00) will it conflict
13006
13007**Tooltip appears**:
13008```
13009        ┌────────────────────┐
13010        │ Conflicts with:    │
13011        │ • Super Bowl       │
13012        │   (3:30 PM-7:00 PM)│
13013        └─────────┬──────────┘
130141301513016```
13017
13018## Version 4.0.5 (2026-02-07) - FIX END_TIME DEFAULT HANDLING
13019
13020### �� Bug Fix
13021- **Fixed:** Events without end_time now properly get 1-hour default duration
13022- **Fixed:** Empty string end_time values now treated as missing (was causing issues)
13023- **Improved:** More robust checking for `end_time` field (checks both isset and not empty)
13024
13025### Technical Details
13026
13027**The Problem**:
13028```php
13029// Before (broken):
13030$endTime = isset($event['end_time']) ? $event['end_time'] : default;
13031
13032// If end_time exists but is empty string "":
13033isset($event['end_time']) = TRUE
13034$endTime = ""  // ← Empty string, not default!
13035```
13036
13037**The Fix**:
13038```php
13039// After (fixed):
13040$endTime = (isset($event['end_time']) && $event['end_time'] !== '')
13041    ? $event['end_time']
13042    : $this->addHoursToTime($startTime, 1);
13043
13044// Now empty string gets the default 1-hour duration
13045```
13046
13047**Why This Matters**:
13048Events 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.
13049
13050**Example**:
13051```
13052Super Bowl: 3:30 PM - 7:00 PM
13053Evening Service: 6:00 PM - ??? (should be 7:00 PM)
13054
13055If end_time = "" (empty string):
13056  Old code: Uses "" → conflict detection fails
13057  New code: Uses 7:00 PM → conflict detected ✓
13058```
13059
13060### Testing
13061If you're still not seeing the conflict on the 6:00 PM service:
130621. Check if the event has `end_time` set in the JSON
130632. Clear cache (Admin → Manage Events → Clear Cache)
130643. The conflict should now appear
13065
13066## Version 4.0.4 (2026-02-07) - CONFLICT TOOLTIP WITH DETAILS
13067
13068### ✨ Feature Added
13069- **Added:** Hover over ⚠ badge to see which events are conflicting
13070- **Added:** Tooltip shows conflicting event titles and times
13071- **Added:** Works in both sidebar sections and clicked day events
13072
13073### Technical Details
13074
13075**Conflict Tracking Enhanced**:
13076```php
13077// Now tracks WHICH events conflict:
13078$event['conflictingWith'] = [
13079    ['title' => 'Meeting', 'time' => '10:00', 'end_time' => '11:00'],
13080    ['title' => 'Call', 'time' => '10:30', 'end_time' => '11:30']
13081];
13082```
13083
13084**Tooltip Format**:
13085```
13086Conflicts with:
13087• Meeting (10:00 AM-11:00 AM)
13088• Call (10:30 AM-11:30 PM)
13089```
13090
13091**Where It Works**:
13092- ✅ Today section (sidebar)
13093- ✅ Tomorrow section (sidebar)
13094- ✅ Important Events section (sidebar)
13095- ✅ Clicked day events (week grid)
13096
13097**Cursor**: Changes to `help` cursor on hover to indicate tooltip
13098
13099### Note on Multi-Day Events
13100The 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.
13101
13102## Version 4.0.3 (2026-02-07) - FIX CONFLICT BADGE & IMPORTANT EVENTS LOGIC
13103
13104### �� Bug Fixes
13105- **Fixed:** Conflict badge (⚠) now displays in sidebar Today/Tomorrow/Important sections
13106- **Fixed:** Important Events now shows events even if they're today or tomorrow
13107- **Fixed:** Field name mismatch - was checking `'conflicts'` (plural) but setting `'conflict'` (singular)
13108
13109### Technical Details
13110
13111**Conflict Badge Issue**:
13112```php
13113// BROKEN (line 2511):
13114$hasConflict = isset($event['conflicts']) && !empty($event['conflicts']);
13115// ↑ Checking 'conflicts' (plural)
13116
13117// But detectTimeConflicts() sets:
13118$event['conflict'] = true/false;
13119// ↑ Setting 'conflict' (singular)
13120
13121// FIXED:
13122$hasConflict = isset($event['conflict']) && $event['conflict'];
13123```
13124
13125**Result**: Badge now shows for ALL conflicting events in sidebar sections
13126
13127**Important Events Logic Issue**:
13128```php
13129// BROKEN:
13130if ($dateKey === $todayStr) {
13131    $todayEvents[] = ...;
13132} elseif ($dateKey === $tomorrowStr) {
13133    $tomorrowEvents[] = ...;
13134} else {  // ← Only checked if NOT today/tomorrow!
13135    if ($isImportant) {
13136        $importantEvents[] = ...;
13137    }
13138}
13139
13140// FIXED:
13141if ($dateKey === $todayStr) {
13142    $todayEvents[] = ...;
13143}
13144if ($dateKey === $tomorrowStr) {
13145    $tomorrowEvents[] = ...;
13146}
13147// ↑ Changed to separate 'if' statements
13148if ($isImportant && $dateKey in this week) {
13149    $importantEvents[] = ...;  // ← Now includes today/tomorrow too!
13150}
13151```
13152
13153**Result**: Important namespace events now show in Important section even if they're today or tomorrow
13154
13155### Conflict Badge Display
13156- Simplified to just ⚠ icon (no count)
13157- Orange color (#ff9800)
13158- 10px font size
13159- Hover shows "Time conflict detected"
13160
13161## Version 4.0.2 (2026-02-07) - FIX IMPORTANT EVENTS DISPLAY
13162
13163### �� Bug Fix
13164- **Fixed:** Important Events section now displays all events correctly
13165- **Fixed:** Single-event days now get conflict flag (was returning early without flag)
13166- **Fixed:** Conflict detection no longer causes events to disappear from Important section
13167
13168### Technical Details
13169
13170**The Problem**:
13171- `detectTimeConflicts()` returned early if only 1 event on a day
13172- Returned original array without adding 'conflict' field
13173- This inconsistency caused issues in event categorization
13174
13175**The Solution**:
13176```php
13177// Before (broken):
13178if (empty($dayEvents) || count($dayEvents) < 2) {
13179    return $dayEvents;  // No 'conflict' field added!
13180}
13181
13182// After (fixed):
13183if (count($dayEvents) === 1) {
13184    return [array_merge($dayEvents[0], ['conflict' => false])];  // Always add flag
13185}
13186```
13187
13188**Result**:
13189- All events now have 'conflict' field consistently
13190- Single events: conflict = false
13191- Multiple events: conflict = true/false based on overlap
13192- Important Events section displays correctly
13193
13194## Version 4.0.1 (2026-02-06) - CONFLICT DETECTION, TAB REORDER, FIXES
13195
13196### �� Bug Fixes
13197- **Fixed:** Conflict badge (⚠) now displays in clicked day events
13198- **Fixed:** Recurring events edit now updates time and end_time correctly
13199- **Fixed:** Field names changed from 'start'/'end' to 'time'/'end_time' in recurring edit
13200
13201### ✨ Features Added
13202- **Added:** Time conflict detection for overlapping events
13203- **Added:** detectTimeConflicts() function checks all events on same day
13204- **Added:** timesOverlap(), timeToMinutes(), addMinutesToTime() helper functions
13205- **Added:** Events now have 'conflict' flag set automatically
13206
13207### �� UI Changes
13208- **Changed:** Admin tab order: �� Manage Events (first), �� Update Plugin, ⚙️ Outlook Sync
13209- **Changed:** Default admin tab is now "Manage Events" (was "Update Plugin")
13210- **Changed:** Week view now shows 4 colored event bars before "+1" (was 3 bars)
13211
13212### Technical Details
13213
13214**Conflict Detection**:
13215```php
13216// Automatically detects overlapping events on same day
13217// Sets 'conflict' flag to true if event overlaps with another
13218$eventsWithConflicts = $this->detectTimeConflicts($dayEvents);
13219```
13220
13221**Logic**:
13222- All-day events never conflict (no time set)
13223- Timed events check for overlap with other timed events
13224- Overlap = start1 < end2 AND start2 < end1
13225- Default duration is 60 minutes if no end_time
13226
13227**Recurring Events Fix**:
13228- Old: Updated `$event['start']` and `$event['end']` (wrong fields)
13229- New: Updates `$event['time']` and `$event['end_time']` (correct fields)
13230- Now edits actually save and update the events
13231
13232**Week View Bars**:
13233- Shows 4 colored bars instead of 3
13234- "+1" becomes "+2" with 5 events, "+3" with 6 events, etc.
13235
13236## Version 4.0.0 (2026-02-06) - MATRIX EDITION RELEASE ��
13237
13238**Major Release**: Complete Matrix-themed calendar plugin with advanced features!
13239
13240### �� Major Features
13241
13242#### Sidebar Widget
13243- **Week Grid**: Interactive 7-day calendar with click-to-view events
13244- **Live System Monitoring**: CPU load, real-time CPU, memory usage with tooltips
13245- **Live Clock**: Updates every second with date display
13246- **Real-time Weather**: Geolocation-based temperature with icon
13247- **Event Sections**: Today (orange), Tomorrow (green), Important (purple)
13248- **Add Event Button**: Dark green bar opens full event creation dialog
13249- **Matrix Theme**: Green glow effects throughout
13250
13251#### Event Management
13252- **Single Color Bars**: Clean 3px bars showing event's assigned color
13253- **All-Day Events First**: Then sorted chronologically by time
13254- **Conflict Detection**: Orange ⚠ badge on overlapping events
13255- **Rich Content**: Full DokuWiki formatting (**bold**, [[links]], //italic//)
13256- **HTML Rendering**: Pre-rendered for JavaScript display
13257- **Click-to-View**: Click week grid days to expand event details
13258
13259#### Admin Interface
13260- **Update Plugin Tab** (Default): Version info, changelog, prominent Clear Cache button
13261- **Outlook Sync Tab**: Microsoft Azure integration, category mapping, sync settings
13262- **Manage Events Tab**: Browse, edit, delete, move events across namespaces
13263
13264#### Outlook Sync
13265- **Bi-directional Sync**: DokuWiki ↔ Microsoft Outlook
13266- **Category Mapping**: Map colors to Outlook categories
13267- **Conflict Resolution**: Time conflict detection
13268- **Import/Export Config**: Encrypted configuration files
13269
13270### �� Design
13271- **Matrix Theme**: Authentic green glow aesthetic
13272- **Dark Backgrounds**: #1a1a1a header, rgba(36, 36, 36) sections
13273- **Color Scheme**:
13274  - Today: Orange #ff9800
13275  - Tomorrow: Green #4caf50
13276  - Important: Purple #9b59b6
13277  - Add Event: Dark green #006400
13278  - System bars: Green/Purple/Orange
13279
13280### �� Technical Highlights
13281- **Zero-margin Design**: Perfect flush alignment throughout
13282- **Flexbox Layout**: Modern, responsive structure
13283- **AJAX Operations**: No page reloads needed
13284- **Smart Sorting**: All-day events first, then chronological
13285- **Tooltip System**: Detailed stats on hover (working correctly)
13286- **Event Dialog**: Full form with drag support
13287- **Cache Management**: One-click cache clearing
13288
13289### �� Breaking Changes from v3.x
13290- Removed dual color bars (now single event color bar only)
13291- Add Event button moved to between header and week grid
13292- All-day events now appear FIRST (not last)
13293- Update Plugin tab is now the default admin tab
13294
13295### �� Bug Fixes (v3.10.x → v4.0.0)
13296- ✅ Fixed color bars not showing (align-self:stretch vs height:100%)
13297- ✅ Fixed tooltip function naming (sanitized calId for JavaScript)
13298- ✅ Fixed weather display (added updateWeather function)
13299- ✅ Fixed HTML rendering in events (title_html/description_html fields)
13300- ✅ Fixed Add Event dialog (null check for calendar element)
13301- ✅ Fixed text positioning in Add Event button
13302- ✅ Fixed spacing throughout sidebar widget
13303
13304### �� Complete Feature List
13305- Full calendar view (month grid)
13306- Sidebar widget (week view)
13307- Event panel (standalone)
13308- Event list (date ranges)
13309- Namespace support
13310- Color coding
13311- Time conflict detection
13312- DokuWiki syntax in events
13313- Outlook synchronization
13314- System monitoring
13315- Weather display
13316- Live clock
13317- Admin interface
13318- Cache management
13319- Draggable dialogs
13320- AJAX save/edit/delete
13321- Import/export config
13322
13323### �� Usage
13324
13325**Sidebar Widget**:
13326```
13327{{calendar sidebar}}
13328{{calendar sidebar namespace=team}}
13329```
13330
13331**Full Calendar**:
13332```
13333{{calendar}}
13334{{calendar year=2026 month=6 namespace=team}}
13335```
13336
13337**Event Panel**:
13338```
13339{{eventpanel}}
13340```
13341
13342**Event List**:
13343```
13344{{eventlist daterange=2026-01-01:2026-01-31}}
13345```
13346
13347### �� Stats
13348- **40+ versions** developed during v3.x iterations
13349- **3.10.0 → 3.11.4**: Polish and refinement
13350- **4.0.0**: Production-ready Matrix Edition
13351
13352### �� Credits
13353Massive iteration and refinement session resulting in a polished, feature-complete calendar plugin with authentic Matrix aesthetics and enterprise-grade Outlook integration.
13354
13355---
13356
13357## Previous Versions (v3.11.4 and earlier)
13358
13359## Version 3.11.4 (2026-02-06) - RESTORE HEADER BOTTOM SPACING
13360- **Changed:** Restored 2px bottom padding to header (was 0px, now 2px)
13361- **Improved:** Small breathing room between system stats bars and Add Event button
13362- **Visual:** Better spacing for cleaner appearance
13363
13364### CSS Change:
13365**eventlist-today-header**:
13366- `padding: 6px 10px 0 10px` → `padding: 6px 10px 2px 10px`
13367
13368### Visual Result:
13369```
13370│  ▓▓▓░░ ▓▓░░░ ▓▓▓▓░  │  ← Stats bars
13371│                       │  ← 2px space (restored)
13372├───────────────────────┤
13373│  + ADD EVENT          │  ← Add Event bar
13374├───────────────────────┤
13375```
13376
13377**Before (v3.11.3)**: No space, bars directly touch Add Event button
13378**After (v3.11.4)**: 2px breathing room for better visual hierarchy
13379
13380## Version 3.11.3 (2026-02-06) - FIX ADD EVENT DIALOG & TEXT POSITION
13381- **Fixed:** openAddEvent() function now checks if calendar element exists before reading dataset
13382- **Fixed:** Add Event button no longer throws "Cannot read properties of null" error
13383- **Changed:** Add Event text moved up 1px (position:relative; top:-1px)
13384- **Changed:** Line-height reduced from 12px to 10px for better text centering
13385- **Improved:** openAddEvent() works for both regular calendars and sidebar widgets
13386
13387### JavaScript Fix:
13388**Problem**: Line 1084-1085 in calendar-main.js
13389```javascript
13390const calendar = document.getElementById(calId);
13391const filteredNamespace = calendar.dataset.filteredNamespace; // ← Null error!
13392```
13393
13394**Solution**: Added null check
13395```javascript
13396const calendar = document.getElementById(calId);
13397const filteredNamespace = calendar ? calendar.dataset.filteredNamespace : null;
13398```
13399
13400**Why This Happened**:
13401- Regular calendar has element with id=calId
13402- Sidebar widget doesn't have this element (different structure)
13403- Code tried to read .dataset on null, causing error
13404
13405### Text Position Fix:
13406**Before**:
13407- line-height: 12px
13408- vertical-align: middle
13409- Text slightly low
13410
13411**After**:
13412- line-height: 10px
13413- position: relative; top: -1px
13414- Text perfectly centered
13415
13416### What Works Now:
13417✅ Click "+ ADD EVENT" in sidebar → Dialog opens
13418✅ No console errors
13419✅ Text properly centered vertically
13420✅ Form pre-filled with today's date
13421✅ Save works correctly
13422
13423## Version 3.11.2 (2026-02-06) - ADD EVENT DIALOG IN SIDEBAR
13424- **Added:** Event dialog to sidebar widget (same as regular calendar)
13425- **Changed:** Add Event button now opens proper event form dialog
13426- **Added:** renderEventDialog() called in renderSidebarWidget()
13427- **Fixed:** Add Event button calls openAddEvent() with calId, namespace, and today's date
13428- **Improved:** Can now add events directly from sidebar widget
13429
13430### Add Event Button Behavior:
13431**Before (v3.11.1)**: Showed alert with instructions
13432**After (v3.11.2)**: Opens full event creation dialog
13433
13434**Dialog Features**:
13435- Date field (defaults to today)
13436- Title field (required)
13437- Time field (optional)
13438- End time field (optional)
13439- Color picker
13440- Category field
13441- Description field
13442- Save and Cancel buttons
13443- Draggable dialog
13444
13445### Technical Changes:
13446- Added `$html .= $this->renderEventDialog($calId, $namespace);` at end of renderSidebarWidget()
13447- Changed Add Event onclick from alert to `openAddEvent('calId', 'namespace', 'YYYY-MM-DD')`
13448- Dialog uses same structure as regular calendar
13449- Uses existing openAddEvent() and saveEventCompact() JavaScript functions
13450
13451### User Flow:
134521. User clicks "+ ADD EVENT" green bar
134532. Event dialog opens with today's date pre-filled
134543. User fills in event details
134554. User clicks Save
134565. Event saved via AJAX
134576. Dialog closes
134587. Sidebar refreshes to show new event
13459
13460## Version 3.11.1 (2026-02-06) - FLUSH HEADER & ADD EVENT DIALOG
13461- **Fixed:** Removed bottom padding from header (was 2px, now 0)
13462- **Fixed:** Removed margin from stats container (was margin-top:2px, now margin:0)
13463- **Fixed:** Add Event bar now flush against header with zero gap
13464- **Changed:** Add Event button now shows helpful alert dialog instead of navigating to admin
13465- **Improved:** Alert provides clear instructions on how to add events
13466
13467### CSS Changes:
13468**eventlist-today-header**:
13469- `padding: 6px 10px 2px 10px` → `padding: 6px 10px 0 10px` (removed 2px bottom)
13470
13471**eventlist-stats-container**:
13472- `margin-top: 2px` → `margin: 0` (removed all margins)
13473
13474### Add Event Button Behavior:
13475**Before**: Clicked → Navigated to Admin → Manage Events tab
13476**After**: Clicked → Shows alert with instructions
13477
13478**Alert Message**:
13479```
13480To add an event, go to:
13481Admin → Calendar Management → Manage Events tab
13482or use the full calendar view {{calendar}}
13483```
13484
13485### Visual Result:
13486```
13487│  ▓▓▓░░ ▓▓░░░ ▓▓▓▓░  │  ← Stats (no margin-bottom)
13488├────────────────────────┤
13489│  + ADD EVENT           │  ← Perfectly flush!
13490├────────────────────────┤
13491```
13492
13493No gaps, perfectly aligned!
13494
13495## Version 3.11.0 (2026-02-06) - ADD EVENT BAR FINAL POSITION & SIZE
13496- **Moved:** Add Event bar back to original position (between header and week grid)
13497- **Changed:** Font size reduced from 9px to 8px (prevents text cutoff)
13498- **Changed:** Letter spacing reduced from 0.5px to 0.4px
13499- **Fixed:** Text now fully visible without being cut off
13500- **Final:** Optimal position and size determined
13501
13502### Final Layout:
13503```
13504┌─────────────────────────────┐
13505│  Clock | Weather | Stats    │  ← Header
13506├─────────────────────────────┤
13507│  + ADD EVENT                 │  ← Bar (back here, smaller text)
13508├─────────────────────────────┤
13509│  M  T  W  T  F  S  S        │  ← Week Grid
13510│  3  4  5  6  7  8  9        │
13511├─────────────────────────────┤
13512│  Today                       │  ← Event sections
13513└─────────────────────────────┘
13514```
13515
13516### Text Size Changes:
13517**v3.10.9**: 9px font, 0.5px letter-spacing → Text slightly cut off
13518**v3.11.0**: 8px font, 0.4px letter-spacing → Text fully visible
13519
13520### Why This Position:
13521- Separates header from calendar
13522- Natural action point after viewing stats
13523- Users see stats → decide to add event → view calendar
13524- Consistent with original design intent
13525
13526## Version 3.10.9 (2026-02-06) - ADD EVENT BAR MOVED BELOW WEEK GRID
13527- **Moved:** Add Event bar repositioned from between header/grid to below week grid
13528- **Improved:** Better visual flow - header → stats → grid → add button → events
13529- **Changed:** Add Event bar now acts as separator between calendar and event sections
13530
13531### New Layout:
13532```
13533┌─────────────────────────────┐
13534│  Clock | Weather | Stats    │  ← Header
13535├─────────────────────────────┤
13536│  M  T  W  T  F  S  S        │  ← Week Grid
13537│  3  4  5  6  7  8  9        │
13538├─────────────────────────────┤
13539│  + ADD EVENT                 │  ← Add bar (moved here!)
13540├─────────────────────────────┤
13541│  Today                       │  ← Event sections
13542│  Tomorrow                    │
13543│  Important Events            │
13544└─────────────────────────────┘
13545```
13546
13547### Visual Flow:
13548**Before (v3.10.8)**:
135491. Header (clock, weather, stats)
135502. **+ ADD EVENT** bar
135513. Week grid
135524. Event sections
13553
13554**After (v3.10.9)**:
135551. Header (clock, weather, stats)
135562. Week grid (calendar days)
135573. **+ ADD EVENT** bar
135584. Event sections
13559
13560### Benefits:
13561- Natural reading flow: View calendar → Add event → See events
13562- Add button positioned between calendar and event list
13563- Acts as visual separator
13564- More logical action placement
13565
13566## Version 3.10.8 (2026-02-06) - SINGLE COLOR BAR & ZERO MARGIN ADD BAR
13567- **Removed:** Section color bar (blue/orange/green/purple) - now shows ONLY event color
13568- **Changed:** Events now display with single 3px color bar (event's assigned color only)
13569- **Fixed:** Add Event bar now has zero margin (margin:0) - touches header perfectly
13570- **Simplified:** Cleaner visual with one color bar instead of two
13571- **Improved:** More space for event content without extra bar
13572
13573### Visual Changes:
13574
13575**Before (v3.10.7)** - Dual color bars:
13576```
13577├─ [Orange][Green]  Event Title
13578├─ [Blue][Purple]   Event Title
13579```
13580
13581**After (v3.10.8)** - Single color bar:
13582```
13583├─ [Green]  Event Title    ← Only event color!
13584├─ [Purple] Event Title    ← Only event color!
13585```
13586
13587### Add Bar Changes:
13588- Added `margin:0` to eliminate gaps
13589- Now flush against header (no space above)
13590- Now flush against week grid (no space below)
13591- Perfect seamless connection
13592
13593### Technical Changes:
13594**renderSidebarEvent()**:
13595- Removed section color bar (4px)
13596- Kept only event color bar (3px)
13597
13598**showDayEvents() JavaScript**:
13599- Removed section color bar (4px blue)
13600- Kept only event color bar (3px)
13601
13602**Add Event bar**:
13603- Added `margin:0` inline style
13604- Removed all top/bottom margins
13605
13606## Version 3.10.7 (2026-02-06) - COLOR BARS FIX FOR SECTIONS & DARK GREEN ADD BAR
13607- **Fixed:** Color bars now display in Today/Tomorrow/Important sections (was only showing in clicked day)
13608- **Fixed:** Changed Today/Tomorrow/Important event rendering to use `align-self:stretch` instead of `height:100%`
13609- **Changed:** Add Event bar color from orange to dark green (#006400)
13610- **Changed:** Add Event bar height increased from 6px to 12px (text no longer cut off)
13611- **Changed:** Add Event bar text now bright green (#00ff00) with green glow
13612- **Changed:** Add Event bar font size increased from 7px to 9px
13613- **Changed:** Add Event bar letter spacing increased to 0.5px
13614- **Improved:** Hover effect on Add Event bar now darker green (#004d00)
13615
13616### Color Bar Fix Details:
13617**Problem**: Today/Tomorrow/Important sections still used `height:100%` on color bars
13618**Solution**: Applied same fix as clicked day events:
13619- Changed parent div: `align-items:start` → `align-items:stretch`
13620- Added `min-height:20px` to parent
13621- Changed bars: `height:100%` → `align-self:stretch`
13622- Bars now properly fill vertical space in ALL sections
13623
13624### Add Event Bar Changes:
13625**Before**:
13626- Background: Orange (#ff9800)
13627- Text: Black (#000)
13628- Height: 6px (text cut off)
13629- Font: 7px
13630
13631**After**:
13632- Background: Dark green (#006400)
13633- Text: Bright green (#00ff00) with green glow
13634- Height: 12px (text fully visible)
13635- Font: 9px
13636- Hover: Darker green (#004d00)
13637- Matrix-themed green aesthetic
13638
13639## Version 3.10.6 (2026-02-06) - COLOR BARS FIX, SORTING REVERSAL, CONFLICT BADGE, README UPDATE
13640- **Fixed:** Event color bars now display correctly in clicked day events
13641- **Fixed:** Changed sorting - all-day events now appear FIRST, then timed events
13642- **Added:** Conflict badge (⚠) appears on right side of conflicting events
13643- **Updated:** Complete README.md rewrite with full Matrix theme documentation
13644- **Changed:** Color bars use `align-self:stretch` instead of `height:100%` (fixes rendering)
13645- **Changed:** Parent div uses `align-items:stretch` and `min-height:20px`
13646- **Improved:** Content wrapper now uses flexbox for proper conflict badge positioning
13647
13648### Color Bar Fix:
13649**Problem**: Bars had `height:100%` but parent had no explicit height
13650**Solution**:
13651- Changed to `align-self:stretch` on bars
13652- Parent uses `align-items:stretch`
13653- Added `min-height:20px` to parent
13654- Bars now properly fill vertical space
13655
13656### Sorting Change:
13657**Before**: Timed events first → All-day events last
13658**After**: All-day events FIRST → Timed events chronologically
13659
13660**Example**:
13661```
13662Monday, Feb 5
13663├─ All Day - Project Deadline       ← All-day first
13664├─ 8:00 AM - Morning Standup        ← Earliest time
13665├─ 10:30 AM - Coffee with Bob
13666└─ 2:00 PM - Team Meeting           ← Latest time
13667```
13668
13669### Conflict Badge:
13670- Orange warning triangle (⚠) on right side
13671- 10px font size
13672- Only appears if `event.conflict` is true
13673- Title attribute shows "Time conflict detected"
13674- Small and unobtrusive
13675
13676### README Update:
13677- Complete rewrite with Matrix theme focus
13678- Full usage instructions for all features
13679- Admin interface documentation
13680- Outlook sync setup guide
13681- System monitoring details
13682- Troubleshooting section
13683- Color scheme reference
13684- File structure documentation
13685- Performance tips
13686- Security notes
13687- Quick start examples
13688
13689## Version 3.10.5 (2026-02-06) - TIME SORTING & THINNER ADD BAR
13690- **Added:** Events now sorted by time when clicking week grid days
13691- **Changed:** Add Event bar now ultra-thin (6px height, down from 12px)
13692- **Improved:** Events with times appear first, sorted chronologically
13693- **Improved:** All-day events appear after timed events
13694- **Changed:** Add Event bar font size reduced to 7px (from 10px)
13695- **Changed:** Add Event bar now has 0 padding and fixed 6px height
13696
13697### Sorting Logic:
13698- Events with times sorted by time (earliest first)
13699- All-day events (no time) appear at the end
13700- Sort algorithm: Convert time to minutes (HH:MM → total minutes) and compare
13701- Chronological order: 8:00 AM → 10:30 AM → 2:00 PM → All-day event
13702
13703### Add Event Bar Changes:
13704- **Height**: 6px (was ~12px with padding)
13705- **Padding**: 0 (was 4px top/bottom)
13706- **Font Size**: 7px (was 10px)
13707- **Letter Spacing**: 0.3px (was 0.5px)
13708- **Line Height**: 6px to match height
13709- **Vertical Align**: Middle for text centering
13710
13711## Version 3.10.4 (2026-02-06) - ADD EVENT BAR
13712- **Added:** Thin orange "Add Event" bar between header and week grid
13713- **Added:** Quick access to event creation from sidebar widget
13714- **Styled:** Sleek design with hover effects and glow
13715- **Interactive:** Clicks navigate to Manage Events tab in admin
13716- **Improved:** User workflow for adding events from sidebar
13717
13718### Visual Design:
13719- Orange background (#ff9800) matching Today section color
13720- 4px top/bottom padding for thin, sleek appearance
13721- Black text with white text-shadow for visibility
13722- Hover effect: Darkens to #ff7700 with enhanced glow
13723- Orange glow effect (box-shadow) matching Matrix theme
13724- Centered "+ ADD EVENT" text (10px, bold, letter-spacing)
13725
13726### Technical Changes:
13727- Added between header close and renderWeekGrid() call
13728- Inline onclick handler navigates to admin manage tab
13729- Inline onmouseover/onmouseout for hover effects
13730- Smooth 0.2s transition on all style changes
13731
13732## Version 3.10.3 (2026-02-06) - UI IMPROVEMENTS & CACHE BUTTON RELOCATION
13733- **Changed:** Update Plugin tab is now the default tab when opening admin
13734- **Moved:** Clear Cache button relocated from Outlook Sync tab to Update Plugin tab
13735- **Improved:** Clear Cache button now larger and more prominent with helpful description
13736- **Improved:** Tab order reorganized: Update Plugin (default) → Outlook Sync → Manage Events
13737- **Removed:** Debug console.log statements from day event display
13738- **Fixed:** Cache clear now redirects back to Update Plugin tab instead of Config tab
13739
13740### UI Changes:
13741- Update Plugin tab opens by default (was Config/Outlook Sync tab)
13742- Clear Cache button prominently displayed at top of Update Plugin tab
13743- Orange ��️ button (10px 20px padding) with confirmation dialog
13744- Help text: "Clear the DokuWiki cache if changes aren't appearing or after updating the plugin"
13745- Success/error messages display on Update Plugin tab after cache clear
13746- Tab navigation reordered to put Update first
13747
13748### Technical Changes:
13749- Default tab changed from 'config' to 'update' in html() method
13750- Tab navigation HTML reordered to show Update Plugin tab first
13751- clearCache() method now redirects with 'update' tab parameter
13752- Removed Clear Cache button from renderConfigTab()
13753- Added Clear Cache button to renderUpdateTab() with message display
13754
13755## Version 3.10.2 (2026-02-06) - EVENT HTML RENDERING FIX
13756- **Fixed:** Event formatting (bold, links, italic) now displays correctly when clicking week grid days
13757- **Added:** renderDokuWikiToHtml() helper function to convert DokuWiki syntax to HTML
13758- **Changed:** Events in weekEvents now pre-rendered with title_html and description_html fields
13759- **Improved:** DokuWiki syntax (**bold**, [[links]], //italic//, etc.) properly rendered in clicked day events
13760
13761### Technical Changes:
13762- Added renderDokuWikiToHtml() private function using p_get_instructions() and p_render()
13763- Events added to weekEvents now include pre-rendered HTML versions
13764- title_html and description_html fields populated before json_encode()
13765- JavaScript now receives properly formatted HTML content
13766
13767## Version 3.10.1 (2026-02-06) - TOOLTIP FIX & WEATHER & CACHE BUTTON
13768- **Fixed:** System tooltip functions now use sanitized calId (showTooltip_sidebar_abc123 instead of showTooltip_sidebar-abc123)
13769- **Fixed:** HTML event handlers now call correctly sanitized function names
13770- **Fixed:** Weather temperature now updates correctly in sidebar widget
13771- **Added:** Weather update function to sidebar widget JavaScript
13772- **Added:** "Clear Cache" button in admin panel for easy cache refresh
13773- **Added:** Default weather location set to Irvine, CA when geolocation unavailable
13774- **Improved:** All tooltip functions now work correctly on system status bars
13775
13776### Technical Changes:
13777- Changed tooltip function names to use $jsCalId instead of $calId
13778- Changed HTML onmouseover/onmouseout to use $jsCalId
13779- Added updateWeather() function to sidebar widget
13780- Added getWeatherIcon() function to sidebar widget
13781- Added clearCache() method in admin.php
13782- Added recursiveDelete() helper method in admin.php
13783- Admin UI now has ��️ Clear Cache button alongside Export/Import
13784
13785## Version 3.10.0 (2026-02-06) - JAVASCRIPT FIXES
13786- **Fixed:** JavaScript syntax error "Missing initializer in const declaration"
13787- **Fixed:** Event links and formatting not displaying in clicked day events
13788- **Fixed:** Sanitized calId to jsCalId by replacing dashes with underscores
13789- **Changed:** Event titles now use `title_html` field to preserve HTML formatting
13790- **Changed:** Event descriptions now use `description_html` field to preserve links and formatting
13791- **Improved:** All JavaScript variable names now use valid syntax
13792- **Improved:** Links, bold, italic, and other HTML formatting preserved in events
13793
13794### Technical Changes:
13795- Added variable sanitization: `$jsCalId = str_replace('-', '_', $calId);`
13796- JavaScript variables now use underscores instead of dashes
13797- Event HTML rendering preserves DokuWiki formatting
13798- Fixed "showTooltip_sidebar is not defined" errors
13799- Fixed "showDayEvents_cal is not defined" errors
13800
13801## Version 3.9.9 (2026-02-06) - JAVASCRIPT LOADING ORDER FIX
13802- **Fixed:** Critical JavaScript loading order issue causing ReferenceError
13803- **Fixed:** Functions now defined BEFORE HTML that uses them
13804- **Changed:** Consolidated all JavaScript into single comprehensive script block
13805- **Removed:** ~290 lines of duplicate JavaScript code
13806- **Added:** Shared state management with `sharedState_[calId]` object
13807- **Improved:** System tooltip functions now work correctly
13808- **Improved:** Week grid click events now work correctly
13809
13810### Technical Changes:
13811- Moved all JavaScript to beginning of widget (before HTML)
13812- Removed duplicate script blocks
13813- Unified tooltip and stats functions
13814- Shared latestStats and cpuHistory state
13815- Fixed "Uncaught ReferenceError: showTooltip_sidebar is not defined"
13816
13817## Version 3.9.8 (2026-02-05) - DUAL COLOR BARS & CLICK EVENTS
13818- **Added:** Dual color bars on events (section color + event color)
13819- **Added:** Click week grid days to view events (replaced hover tooltips)
13820- **Added:** Expandable section below week grid for selected day events
13821- **Added:** Blue theme for selected day section
13822- **Changed:** Week grid days now clickable instead of tooltips
13823- **Changed:** Section bar: 4px wide (left)
13824- **Changed:** Event bar: 3px wide (right)
13825- **Increased:** Gap between color bars from 3px to 6px
13826- **Improved:** Click is more reliable and mobile-friendly than hover tooltips
13827
13828### Visual Changes:
13829- Each event shows TWO color bars side-by-side
13830- Left bar (4px): Section context (Today=Orange, Tomorrow=Green, Important=Purple, Selected=Blue)
13831- Right bar (3px): Individual event's assigned color
13832- Click any day in week grid to expand event list
13833- X button to close selected day events
13834
13835## Version 3.9.7 (2026-02-05) - EVENT COLOR BAR VISIBILITY
13836- **Increased:** Event color bar width from 2px to 3px
13837- **Increased:** Gap between section and event bars from 3px to 6px
13838- **Improved:** Event color bars now more visible alongside section bars
13839- **Note:** Dual color bar system already in place from v3.9.6
13840
13841## Version 3.9.6 (2026-02-05) - UI REFINEMENTS
13842- **Changed:** Date in Important Events moved below event name (was above)
13843- **Changed:** Section headers now 9px font size (was 10px)
13844- **Changed:** Section headers now normal case (was ALL CAPS)
13845- **Changed:** Letter spacing reduced from 0.8px to 0.3px
13846- **Improved:** More natural reading flow with date below event name
13847- **Improved:** Cleaner, more subtle section headers
13848
13849### Header Changes:
13850- "TODAY" → "Today"
13851- "TOMORROW" → "Tomorrow"
13852- "IMPORTANT EVENTS" → "Important Events"
13853
13854## Version 3.9.0 (2026-02-05) - SIDEBAR WIDGET REDESIGN
13855- **Redesigned:** Complete overhaul of `sidebar` parameter
13856- **Added:** Compact week-at-a-glance itinerary view (200px wide)
13857- **Added:** Live clock widget at top of sidebar
13858- **Added:** 7-cell week grid showing event bars
13859- **Added:** Today section with orange header and left border
13860- **Added:** Tomorrow section with green header and left border
13861- **Added:** Important Events section with purple header and left border
13862- **Added:** Admin setting to configure important namespaces
13863- **Added:** Time conflict badges in sidebar events
13864- **Added:** Task checkboxes in sidebar events
13865- **Changed:** Sidebar now optimized for narrow spaces (200px)
13866- **Improved:** Perfect for dashboards, page sidebars, and quick glance widgets
13867
13868### New Features:
13869- Clock updates every second showing current time
13870- Week grid shows Mon-Sun with colored event bars
13871- Today/Tomorrow sections show full event details
13872- Important events highlighted in purple (configurable namespaces)
13873- All badges (conflict, time, etc.) shown in compact format
13874- Automatic time conflict detection
13875
13876## Version 3.8.0 (2026-02-05) - PRODUCTION CLEANUP
13877- **Removed:** 16 unused/debug/backup files
13878- **Removed:** 69 console.log() debug statements
13879- **Removed:** 3 orphaned object literals from console.log removal
13880- **Removed:** Temporary comments and markers
13881- **Fixed:** JavaScript syntax errors from cleanup
13882- **Improved:** Code quality and maintainability
13883- **Improved:** Reduced plugin size by removing unnecessary files
13884- **Status:** Production-ready, fully cleaned codebase
13885
13886### Files Removed:
13887- style.css.backup, script.js.backup
13888- admin_old_backup.php, admin_minimal.php, admin_new.php, admin_clean.php
13889- debug_events.php, debug_html.php, cleanup_events.php
13890- fix_corrupted_json.php, fix_wildcard_namespaces.php
13891- find_outlook_duplicates.php, update_namespace.php
13892- validate_calendar_json.php, admin.js
13893- test_date_field.html
13894
13895## Version 3.7.5 (2026-02-05)
13896- **Fixed:** PHP syntax error (duplicate foreach loop removed)
13897- **Fixed:** Time variable handling in grace period logic
13898
13899## Version 3.7.4 (2026-02-05)
13900- **Added:** 15-minute grace period for timed events
13901- **Changed:** Events with times now stay visible for 15 minutes after their start time
13902- **Changed:** Prevents events from immediately disappearing when they start
13903- **Improved:** Better user experience for ongoing events
13904- **Fixed:** Events from earlier today now properly handled with grace period
13905
13906## Version 3.7.3 (2026-02-05)
13907- **Changed:** Complete redesign of cleanup section for compact, sleek layout
13908- **Changed:** Radio buttons now in single row at top
13909- **Changed:** All options visible with grayed-out inactive states (opacity 0.4)
13910- **Changed:** Inline controls - no more grid layout or wrapper boxes
13911- **Changed:** Namespace filter now compact single-line input
13912- **Changed:** Smaller buttons and tighter spacing throughout
13913- **Improved:** More professional, space-efficient design
13914
13915## Version 3.7.2 (2026-02-04)
13916- **Fixed:** Strange boxes under cleanup options - now properly hidden
13917- **Changed:** Unified color scheme across all admin sections
13918- **Changed:** Green (#00cc07) - Primary actions and main theme
13919- **Changed:** Orange (#ff9800) - Warnings and cleanup features
13920- **Changed:** Purple (#7b1fa2) - Secondary actions and accents
13921- **Improved:** Consistent visual design throughout admin interface
13922
13923## Version 3.7.1 (2026-02-04)
13924- **Fixed:** Cleanup section background changed from orange to white
13925- **Fixed:** Event cleanup now properly scans all calendar directories
13926- **Added:** Debug info display when preview finds no events
13927- **Improved:** Better directory scanning logic matching other features
13928
13929## Version 3.7.0 (2026-02-04)
13930- **Added:** Event cleanup feature in Events Manager
13931- **Added:** Delete old events by age (months/years old)
13932- **Added:** Delete events by status (completed tasks, past events)
13933- **Added:** Delete events by date range
13934- **Added:** Namespace filter for targeted cleanup
13935- **Added:** Preview function to see what will be deleted
13936- **Added:** Automatic backup creation before cleanup
13937- **Changed:** Reduced changelog viewer height to 100px (was 400px)
13938
13939## Version 3.6.3 (2026-02-04)
13940- **Fixed:** Conflict tooltips now work properly after navigating between months
13941- **Added:** Changelog display in Update Plugin tab
13942- **Added:** CHANGELOG.md file with version history
13943- **Improved:** Changelog shows last 10 versions with color-coded change types
13944- **Fixed:** Removed debug console.log statements
13945
13946## Version 3.6.2 (2026-02-04)
13947- **Fixed:** Month title now updates correctly when navigating between months
13948- **Changed:** All eventpanel header elements reduced by 10% for more compact design
13949- **Changed:** Reduced header height from 78px to 70px
13950
13951## Version 3.6.1 (2026-02-04)
13952- **Changed:** Complete redesign of eventpanel header with practical two-row layout
13953- **Fixed:** Improved layout for narrow widths (~500px)
13954- **Changed:** Simplified color scheme (removed purple gradient)
13955
13956## Version 3.6.0 (2026-02-04)
13957- **Changed:** Redesigned eventpanel header with gradient background
13958- **Changed:** Consolidated multiple header rows into compact single-row design
13959
13960## Version 3.5.1 (2026-02-04)
13961- **Changed:** Moved event search bar into header row next to + Add button
13962- **Improved:** More compact UI with search integrated into header
13963
13964## Version 3.5.0 (2026-02-04)
13965- **Added:** Event search functionality in sidebar and eventpanel
13966- **Added:** Real-time filtering as you type
13967- **Added:** Clear button (✕) appears when searching
13968- **Added:** "No results" message when search returns nothing
13969
13970## Version 3.4.7 (2026-02-04)
13971- **Changed:** Made conflict badges smaller and more subtle (9px font, less padding)
13972- **Fixed:** Removed debug logging from console
13973- **Changed:** Updated export version number to match plugin version
13974
13975## Version 3.4.6 (2026-02-04)
13976- **Added:** Debug logging to diagnose conflict detection issues
13977- **Development:** Extensive console logging for troubleshooting
13978
13979## Version 3.4.5 (2026-02-04)
13980- **Added:** Debug logging to showDayPopup and conflict detection
13981- **Development:** Added logging to trace conflict detection flow
13982
13983## Version 3.4.4 (2026-02-04)
13984- **Fixed:** Conflict detection now persists across page refreshes (PHP-based)
13985- **Fixed:** Conflict tooltips now appear on hover
13986- **Added:** Dual conflict detection (PHP for initial load, JavaScript for navigation)
13987- **Added:** Conflict badges in both future and past events sections
13988
13989## Version 3.4.3 (2026-02-04)
13990- **Added:** Custom styled conflict tooltips with hover functionality
13991- **Changed:** Conflict badge shows count of conflicts (e.g., ⚠️ 2)
13992- **Improved:** Beautiful tooltip design with orange header and clean formatting
13993
13994## Version 3.4.2 (2026-02-04)
13995- **Fixed:** Attempted to fix tooltip newlines (reverted in 3.4.3)
13996
13997## Version 3.4.1 (2026-02-04)
13998- **Fixed:** End time field now properly saves to database
13999- **Fixed:** End time dropdown now filters to show only valid times after start time
14000- **Added:** Smart dropdown behavior - expands on focus, filters invalid options
14001- **Improved:** End time auto-suggests +1 hour when start time selected
14002
14003## Version 3.4.0 (2026-02-04)
14004- **Added:** End time support for events (start and end times)
14005- **Added:** Automatic time conflict detection
14006- **Added:** Conflict warning badges (⚠️) on events with overlapping times
14007- **Added:** Conflict tooltips showing which events conflict
14008- **Added:** Visual conflict indicators with pulse animation
14009- **Changed:** Time display now shows ranges (e.g., "2:00 PM - 4:00 PM")
14010
14011## Version 3.3.77 (2026-02-04)
14012- **Fixed:** Namespace badge onclick handlers restored after clearing filter
14013- **Fixed:** Namespace filtering works infinitely (filter → clear → filter)
14014
14015## Version 3.3.76 (2026-02-04)
14016- **Fixed:** Namespace badges now clickable after clearing namespace filter
14017
14018## Version 3.3.75 (2026-02-04)
14019- **Fixed:** Form resubmission warnings eliminated
14020- **Improved:** Implemented proper POST-Redirect-GET pattern with HTTP 303
14021- **Changed:** All admin redirects now use absolute URLs
14022
14023## Version 3.3.74 (2026-02-04)
14024- **Fixed:** Clearing namespace filter now restores original namespace instead of default
14025- **Added:** data-original-namespace attribute to preserve initial namespace setting
14026- **Improved:** Console logging for namespace filter debugging
14027
14028## Version 3.3.73 (2026-02-03)
14029- **Added:** Dynamic namespace filtering banner with clear button
14030- **Fixed:** JavaScript function accessibility issues
14031- **Fixed:** Namespace badge click handlers in event lists
14032- **Improved:** Persistent namespace filtering across views
14033
14034## Earlier Versions
14035See previous transcripts for complete history through v3.3.73, including:
14036- Recurring events with Outlook sync
14037- Multi-namespace support
14038- Event categories and mapping
14039- Backup/restore functionality
14040- System statistics bar
14041- Namespace selector with fuzzy search
14042- Events Manager with import/export
14043- And much more...
14044