xref: /plugin/calendar/CHANGELOG.md (revision 64a96c92bf9360ad952cb128c345957868582853)
1# Calendar Plugin Changelog
2
3## Version 7.0.9 (2026-03-01) - DEFAULT SEARCH SCOPE SETTING
4
5### New Feature: Default Search Scope
6Added admin setting (Themes tab) to configure whether the event search bar defaults to searching the current month or the entire calendar.
7
8**Options:**
9- **This Month** (default) — Search only events in the currently displayed month (�� icon)
10- **All Dates** — Search across all events in the entire calendar (�� icon)
11
12Users can still toggle the search scope at any time using the search mode button next to the search bar. This setting controls only the initial default state.
13
14### Localization
15- Added localized strings for English, German, and Czech
16
17### Files Modified
18- `admin.php` — Added search scope setting UI in Themes tab, save/load methods
19- `syntax.php` — Added `getSearchDefault()` method; inline and panel search bars now initialize from admin setting
20- `lang/en/lang.php` — Added search default scope strings
21- `lang/de/lang.php` — Added German translations
22- `lang/cs/lang.php` — Added Czech translations
23- `plugin.info.txt` — Version bump to 7.0.9
24
25### Configuration
26Setting is stored in `data/meta/calendar_search_default.txt` (values: `month` or `all`)
27
28---
29
30## Version 7.0.8 (2026-02-15) - TIMEZONE FIX
31
32### Bug Fix: Date Shift in Non-UTC Timezones
33Fixed critical bug where events appeared shifted by one day in timezones ahead of UTC (e.g., Europe/Prague UTC+1).
34
35**Root Cause:**
36JavaScript's `toISOString()` converts dates to UTC, so local midnight (00:00) in Prague becomes 23:00 UTC of the *previous day*. When split to get YYYY-MM-DD, this returns the wrong date.
37
38**Fix:**
39Added `formatLocalDate(date)` helper function that formats dates using local time methods (`getFullYear()`, `getMonth()`, `getDate()`) instead of UTC conversion.
40
41**Affected Areas (now fixed):**
42- Multi-day event spanning (line 385)
43- Today string calculation in event list (line 566)
44- Past event detection in event items (line 1022)
45
46### Files Modified
47- `calendar-main.js` - Added `formatLocalDate()` helper, replaced 3 `toISOString().split('T')[0]` calls
48
49---
50
51## Version 7.0.7 (2026-02-15) - GOOGLE CALENDAR SYNC
52
53### Google Calendar Integration
54- Two-way sync with Google Calendar via OAuth 2.0
55- Import events from Google Calendar to DokuWiki
56- Export events from DokuWiki to Google Calendar
57- Support for all-day and timed events
58- Multi-day event handling
59- Color mapping between Google and DokuWiki
60- Duplicate detection prevents re-importing same events
61- Select which Google calendar to sync with
62- Admin panel UI for configuration and sync controls
63
64### Setup Requirements
65- Google Cloud Console project
66- Google Calendar API enabled
67- OAuth 2.0 Web Application credentials
68- Redirect URI configuration
69
70### New Files
71- `classes/GoogleCalendarSync.php` - OAuth and Calendar API integration
72
73### Files Modified
74- `action.php` - Added Google sync action handlers
75- `admin.php` - Added Google sync admin tab
76
77---
78
79## Version 7.0.6 (2026-02-15) - ACCESSIBILITY IMPROVEMENTS
80
81### Screen Reader Support
82- Added ARIA live region for dynamic announcements
83- Announces "Event created", "Event updated", "Event deleted" on actions
84- Announces "Task marked complete/incomplete" on toggle
85- Screen readers receive feedback without visual alerts
86
87### Debug Mode
88- Added `CALENDAR_DEBUG` flag for JavaScript console logging
89- `calendarLog()` and `calendarError()` helper functions
90- Debug output disabled by default
91
92### Code Quality
93- Consistent error handling patterns
94- Better separation of concerns
95
96### Files Modified
97- `calendar-main.js` - ARIA live region, debug helpers, announcements
98
99---
100
101## Version 7.0.5 (2026-02-15) - AUDIT LOGGING & ACCESSIBILITY
102
103### Audit Logging
104- New `AuditLogger.php` class for compliance logging
105- Logs all event modifications: create, update, delete, move, task toggle
106- JSON-formatted log files with timestamps, user info, and IP addresses
107- Automatic log rotation (5MB max, 10 files retained)
108- Log entries include: namespace, date, event ID, title, and change details
109
110### Keyboard Navigation (Accessibility)
111- Arrow keys navigate between calendar days
112- Enter/Space activates focused day (opens popup)
113- Arrow Up/Down navigates between events in popups
114- Enter on event opens edit dialog
115- Delete/Backspace on event triggers delete
116- Escape closes all dialogs, popups, and dropdowns
117- Added `tabindex` and `role` attributes for screen readers
118- Added `aria-label` descriptions for calendar days and events
119
120### CSS Focus States
121- Visible focus indicators on calendar days
122- Focus styles on event items in popups
123- Focus styles on custom date/time pickers
124- Uses `focus-visible` for keyboard-only focus rings
125
126### Files Added
127- `classes/AuditLogger.php` - Compliance audit logging
128
129### Files Modified
130- `action.php` - Integrated audit logging for all event operations
131- `calendar-main.js` - Extended keyboard navigation
132- `syntax.php` - Added accessibility attributes to calendar cells
133- `style.css` - Added focus state styles
134
135---
136
137## Version 7.0.4 (2026-02-15) - CODE CLEANUP
138
139### Code Cleanup
140- Removed unused `calendarDebounce()` and `calendarThrottle()` utility functions
141- Removed duplicate `updateEndTimeOptions()` function definition
142- Removed unused `_calendarSelectOpen` tracking variable
143- Removed orphaned `.input-date` and `.time-select` CSS (no longer using native inputs)
144- Consolidated legacy function calls
145
146### Improvements
147- End date picker now opens to start date's month when no end date is selected
148- End time picker now scrolls to first available time after start time
149
150### Files Modified
151- `calendar-main.js` - Removed ~40 lines of dead code
152- `style.css` - Removed ~25 lines of unused CSS
153
154---
155
156## Version 7.0.3 (2026-02-15) - CUSTOM DATE & TIME PICKERS
157
158### Complete Replacement of Native Browser Controls
159Both date inputs and time selects have been replaced with custom, lightweight pickers to eliminate all browser-related performance issues.
160
161#### Custom Date Picker
162- **Mini calendar grid** - Clean monthly view with day selection
163- **Month navigation** - Previous/next buttons for quick browsing
164- **Visual indicators** - Today highlighted, selected date marked
165- **End date validation** - Cannot select end date before start date
166- **Clear button** - Easy removal of optional end date
167
168#### Custom Time Picker (from v7.0.2)
169- **Period groupings** - Morning, Afternoon, Evening, Night
170- **Lazy loading** - Options built only when dropdown opens
171- **Smart filtering** - End times after start time only
172
173#### Code Cleanup
174- Removed old `setupSelectTracking()` function (was causing conflicts)
175- Removed redundant event listener code
176- Unified dropdown close handling for all picker types
177- No native `<input type="date">` or `<select>` elements in event dialog
178
179### Files Modified
180- `syntax.php` - New date picker HTML structure
181- `calendar-main.js` - Custom date picker JavaScript, cleanup
182- `style.css` - Date picker calendar grid styles
183
184---
185
186## Version 7.0.2 (2026-02-15) - CUSTOM TIME PICKER
187
188### Major Fix: Replaced Native Selects with Custom Time Pickers
189The native `<select>` element with 97 time options was causing browser freezes when opening. This version replaces them with lightweight custom dropdown pickers.
190
191#### New Custom Time Picker Features
192- **Instant opening** - No browser rendering delay
193- **Lazy-loaded options** - Dropdown HTML built only when clicked
194- **Period grouping** - Morning, Afternoon, Evening, Night sections
195- **Smart filtering** - End time options automatically hide times before start time
196- **Visual feedback** - Selected time highlighted, disabled times grayed out
197
198#### Technical Changes
199- Replaced `<select>` elements with `<button>` + `<div>` dropdown
200- Hidden `<input>` stores actual value for form submission
201- Time data pre-computed once, reused for all pickers
202- Event delegation for option clicks
203- Automatic cleanup when clicking outside
204
205#### Removed
206- Native `<select>` time pickers (caused 2600ms+ freezes)
207- `onchange` handlers from date inputs (handled in JS now)
208- Old `setupSelectTracking()` function
209
210### Files Modified
211- `syntax.php` - New time picker HTML structure
212- `calendar-main.js` - Custom time picker JavaScript
213- `style.css` - Time picker dropdown styles
214
215---
216
217## Version 7.0.1 (2026-02-15) - SELECTOR FLICKER FIX
218
219### Bug Fixes
220- **Fixed selector flicker on subsequent clicks** - Time/date selectors no longer flash or lag after first use
221  - New `setupSelectTracking()` prevents DOM updates while selector is open
222  - Tracks mousedown/focus/blur/change events on all form inputs
223  - Uses `requestAnimationFrame` for smooth visual updates
224  - Added state caching to skip redundant DOM manipulation
225
226### CSS Improvements
227- Changed `transition: all` to specific properties on `.input-sleek` elements
228- Added `transition: none` for select options
229- Prevents browser reflow issues during dropdown rendering
230
231---
232
233## Version 7.0.0 (2026-02-15) - STABILITY & PERFORMANCE RELEASE
234
235### Major Improvements
236
237#### File Locking & Atomic Writes (Critical Stability Fix)
238- **New `CalendarFileHandler` class** with atomic file operations
239- Prevents data corruption from concurrent event saves
240- Uses temp file + atomic rename strategy for safe writes
241- Implements `flock()` for proper file locking during reads/writes
242- Graceful handling of lock acquisition failures with retries
243
244#### Caching Layer (Performance Improvement)
245- **New `CalendarEventCache` class** for event data caching
246- 5-minute TTL reduces unnecessary JSON file reads
247- In-memory caching for current request
248- Automatic cache invalidation on event modifications
249- Cache cleanup for expired entries
250
251#### Rate Limiting (Security Enhancement)
252- **New `CalendarRateLimiter` class** for AJAX endpoint protection
253- 60 requests/minute for read actions
254- 30 requests/minute for write actions (more restrictive)
255- Per-user tracking (falls back to IP for anonymous)
256- Rate limit headers in responses (X-RateLimit-Limit, X-RateLimit-Remaining)
257- Automatic cleanup of old rate limit data
258
259#### Code Refactoring
260- **New `CalendarEventManager` class** consolidating CRUD operations
261- New `classes/` directory for organized code structure
262- Reduced code duplication across files
263- Improved separation of concerns
264- Better maintainability for future development
265
266#### JavaScript Performance Fixes (Dialog Responsiveness)
267- **Fixed slow time selector** - End time dropdown now opens instantly
268  - Replaced `Array.from().forEach()` with direct `options` loop (97 options)
269  - Single-pass algorithm instead of multiple iterations
270  - Uses `hidden` property instead of `style.display` manipulation
271- **Fixed event listener accumulation** - Dialog inputs no longer slow down over time
272  - Added `data-initialized` flag to prevent re-binding listeners
273  - Namespace search only initializes once per calendar
274- **Fixed selector flicker on subsequent clicks**
275  - New `setupSelectTracking()` function prevents DOM updates while selector is open
276  - Tracks mousedown/focus/blur/change events on time and date inputs
277  - Uses `requestAnimationFrame` instead of `setTimeout` for visual updates
278  - Added state caching to skip redundant DOM updates
279- **Fixed CSS transition interference**
280  - Changed `transition: all` to specific properties on form inputs
281  - Added explicit `transition: none` for select options
282  - Prevents browser reflow issues during dropdown rendering
283
284### Branding Changes
285- Removed "Matrix Edition" from plugin name and all references
286- Plugin is now simply "Calendar Plugin"
287- Matrix theme remains available (now called just "Matrix")
288
289### Technical Details
290- All JSON file operations now use atomic writes
291- Event saves protected against race conditions
292- Cache automatically invalidated on namespace/month changes
293- Rate limiter uses probabilistic cleanup (1 in 100 requests)
294
295### Files Added
296- `classes/FileHandler.php` - Atomic file operations with locking
297- `classes/EventCache.php` - Caching layer with TTL
298- `classes/RateLimiter.php` - AJAX rate limiting
299- `classes/EventManager.php` - Consolidated event CRUD operations
300
301### Upgrade Notes
302- No database migration required
303- Cache directory created automatically (`data/cache/calendar/`)
304- Rate limit data stored in `data/cache/calendar/ratelimit/`
305- Existing events and settings preserved
306
307---
308
309## Version 6.14.2 (2026-02-15) - SYSTEM LOAD TOGGLE
310
311### Added System Load Bars Toggle
312- New toggle in **Admin > Calendar > Themes** tab
313- Choose to show or hide CPU/Memory load indicator bars
314- Setting applies to both event panel and sidebar widget
315- Stored in `data/meta/calendar_show_system_load.txt`
316- JavaScript polling is also disabled when hidden (saves resources)
317
318## Version 6.14.1 (2026-02-14) - SECURITY FIX
319
320### Security Improvements
321- **Authentication required** - Write actions (save, delete, toggle) now require user to be logged in
322- **Improved CSRF token handling** - New `getSecurityToken()` helper function checks multiple sources:
323  - `JSINFO.sectok` (standard)
324  - `window.JSINFO.sectok`
325  - Hidden form field `input[name="sectok"]`
326  - Meta tag `meta[name="sectok"]`
327- Anonymous users can no longer add/edit/delete events
328- Better error messages for authentication and token failures
329
330### Bug Fixes
331- Fixed "Invalid security token" error on clean DokuWiki installations
332- Added debug logging for security token failures
333
334## Version 6.14.0 (2026-02-14) - STABLE RELEASE
335
336### Code Cleanup & Localization
337- Added localization for all static calendar strings (EN/DE)
338- New lang keys: `previous_month`, `next_month`, `print_calendar`, `no_events_scheduled`, `calendar_label`, `details`
339- Code review and cleanup completed
340- Updated README.md and plugin documentation
341
342### Static Calendar Features (v6.13.x consolidated)
343- Read-only presentation mode: `{{calendar static}}`
344- Custom titles: `title="My Events"`
345- Month locking: `month=2` disables navigation
346- Print button with clean itinerary output
347- All themes supported: matrix, pink, purple, professional, wiki, dark, light
348- `noprint` option to hide print functionality
349- Formatted descriptions in tooltips and itinerary
350
351### Other Improvements in 6.13.x
352- Admin menu icon (SVG)
353- Config import fix for `return array()` syntax
354- Mobile touch button fixes
355- Important events in day popup with star icons
356- Time picker grouped by period
357- Multi-day event time validation
358
359## Version 6.13.13 (2026-02-14) - PRINT BUTTON CENTERING
360
361### Fixed Print Button Icon Alignment
362- Added `display: flex`, `align-items: center`, `justify-content: center`
363- Added `padding: 0` and `line-height: 1`
364- Icon now properly centered in circle
365
366## Version 6.13.12 (2026-02-14) - SIMPLE TOOLTIP
367
368### Simplified Hover Tooltip
369- Removed custom JS tooltip (was causing triple popups)
370- Uses native browser `title` attribute only
371- Plain text with formatting converted: `**bold**` → `*bold*`, `//italic//` → `_italic_`
372- Links shown as: `text (url)`
373- Added �� emoji before time for visual clarity
374- Itinerary still shows full HTML formatting
375
376## Version 6.13.11 (2026-02-14) - FORMATTED DESCRIPTIONS
377
378### Rich Text Formatting in Static Calendar
379- **Hover tooltips** now show formatted text (bold, italic, links, line breaks)
380- **Itinerary descriptions** display with full formatting
381- Uses existing `renderDescription()` function for consistency
382- Supports: `**bold**`, `//italic//`, `[[links]]`, `[markdown](links)`, line breaks
383
384### Technical Details
385- Added `data-tooltip` attribute with rich HTML content
386- New JavaScript tooltip handler with smart positioning
387- CSS styles for `.static-tooltip` and itinerary formatting
388- Tooltips stay within viewport bounds
389
390## Version 6.13.10 (2026-02-14) - PRINT MARGINS FIX v3
391
392### Fixed Print Margins - Inline Styles Approach
393- Removed reliance on `@page` CSS (browser support inconsistent)
394- Uses inline style `padding: 50px 60px` directly on wrapper div
395- Simplified CSS for better browser compatibility
396- Smaller table font (12px) for better fit
397- Set `max-width: 800px` on content wrapper
398
399## Version 6.13.9 (2026-02-14) - PRINT MARGINS FIX v2
400
401### Fixed Print Margins
402- Added `.print-wrapper` div with 0.5in padding/margin
403- Uses both `@page` margin AND wrapper margins for compatibility
404- Set `@page { margin: 1in 0.75in }` (top/bottom 1in, sides 0.75in)
405- Wrapper has `max-width: 7.5in` to fit standard letter size
406- Smaller fonts (0.85em) to fit more content
407- Added 250ms delay before print to ensure styles load
408
409## Version 6.13.8 (2026-02-14) - PRINT MARGINS FIX
410
411### Improved Print Layout
412- Added `@page { margin: 0.75in }` for proper print margins
413- Increased body padding to 40px for screen preview
414- Smaller font sizes to fit better on page
415- Description column limited width with word-wrap
416- Table header repeats on each page (`display: table-header-group`)
417- Rows avoid page breaks in middle (`page-break-inside: avoid`)
418- Print color adjust enabled for backgrounds
419
420## Version 6.13.7 (2026-02-14) - ALL THEMES FOR STATIC CALENDAR
421
422### Added All Theme Options
423Now all themes work with static calendar:
424
425| Theme | Description |
426|-------|-------------|
427| `matrix` | Green on dark (default Matrix style) |
428| `pink` | Pink/magenta on dark |
429| `purple` | Purple/violet on dark |
430| `professional` | Blue on white (business style) |
431| `wiki` | Neutral gray (matches DokuWiki) |
432| `dark` | Blue on dark gray |
433| `light` | Clean white/gray |
434
435### Examples
436```
437{{calendar theme=matrix static}}
438{{calendar theme=purple static}}
439{{calendar theme=professional static}}
440{{calendar theme=wiki static}}
441```
442
443## Version 6.13.6 (2026-02-14) - QUOTED PARAMETER FIX
444
445### Fixed Quoted Parameter Parsing
446- Titles with spaces now work: `title="Feb 26 Expense Log"`
447- Uses regex to properly parse: `key="value with spaces"`
448- Supports both double and single quotes
449- Example: `{{calendar title="My Custom Title" static}}`
450
451## Version 6.13.5 (2026-02-14) - STATIC CALENDAR OPTIONS
452
453### New Static Calendar Options
454
455| Option | Description | Example |
456|--------|-------------|---------|
457| `title=X` | Custom title instead of month name | `title="Club Meetings"` |
458| `noprint` | Hide print button and print view | `{{calendar static noprint}}` |
459| `theme=X` | Apply specific theme (matrix, pink, dark, light) | `theme=matrix` |
460
461### Fixed Month/Year Lock
462- When you specify `month=X` or `year=X`, navigation is now disabled
463- `{{calendar month=2 static}}` shows only February with no nav arrows
464- `{{calendar year=2025 month=12 static}}` locks to December 2025
465
466### Examples
467```
468{{calendar static}}                              // Navigable, current month
469{{calendar month=2 static}}                      // Locked to February
470{{calendar title="Team Events" static}}          // Custom title
471{{calendar theme=matrix static}}                 // Matrix theme
472{{calendar namespace=club static noprint}}       // No print button
473{{calendar month=3 title="March Meetings" theme=pink static}}
474```
475
476## Version 6.13.4 (2026-02-14) - DEDICATED PRINT BUTTON
477
478### Added Print Button to Static Calendar
479- New ��️ print button in the calendar header
480- Opens a clean popup window with ONLY the itinerary content
481- Automatically triggers print dialog
482- Window closes after printing
483- No DokuWiki headers/footers/sidebars - just the calendar
484
485### How It Works
486- Extracts the print view HTML
487- Creates a new window with minimal styling
488- Calls `window.print()` automatically
489- Clean single-page output
490
491## Version 6.13.3 (2026-02-14) - PRINT BLANK PAGES FIX
492
493### Fixed Blank Pages When Printing
494- Aggressively hide ALL screen view elements and children in print
495- Reset height/width to 0 with !important on grid, cells, events
496- Ensure print view elements have proper display table properties
497- Force all hidden elements to position:absolute off-screen
498
499## Version 6.13.2 (2026-02-14) - STATIC CALENDAR RESPONSIVE FIX
500
501### Improved Static Calendar Layout
502- Changed from `max-width: 900px` to `width: 100%` for full container fit
503- Added `table-layout: fixed` for consistent column widths
504- Added `overflow-x: auto` for horizontal scroll on very small screens
505- Reduced header padding and font sizes for better fit
506- Improved responsive breakpoints for mobile (768px and 480px)
507- Hide time on very small screens to save space
508- Better touch targets for navigation buttons
509
510## Version 6.13.1 (2026-02-14) - STATIC CALENDAR FIX
511
512### Bug Fix
513- Added missing `getImportantNamespaces()` helper method
514- Fixed `loadEventsForMonth` → use existing `loadEvents` method
515- Added multi-namespace/wildcard support to static calendar
516
517## Version 6.13.0 (2026-02-14) - STATIC CALENDAR MODE
518
519### New Static/Presentation Mode
520Read-only calendar view for public display and printing.
521
522**Usage:**
523```
524{{calendar static}}
525{{calendar namespace=meetings static}}
526```
527
528**Screen View Features:**
529- Clean calendar grid without edit/delete buttons
530- Month navigation (prev/next arrows)
531- Hover tooltips showing full event details (title, time, description)
532- Important events highlighted with ⭐ and golden background
533- Today's date highlighted
534- Responsive design for mobile
535
536**Print View Features:**
537- Automatically switches to itinerary format when printing
538- Table layout: Date | Time | Event | Details
539- Important events marked with ⭐
540- Dates grouped (date only shown once per day)
541- Page break handling for long lists
542- Clean black & white friendly output
543
544**Files Changed:**
545- `syntax.php`: Added `renderStaticCalendar()` method
546- `action.php`: Added `getStaticCalendar()` AJAX handler
547- `calendar-main.js`: Added `navStaticCalendar()` function
548- `style.css`: Added static calendar styles + print media queries
549
550## Version 6.12.7 (2026-02-14) - ADMIN MENU ICON
551
552### Added Admin Menu Icon
553- New monochrome SVG calendar icon for DokuWiki admin menu
554- Icon shows calendar with binding rings, header, and date dots
555- Matches DokuWiki's admin interface style
556- Added `getMenuIcon()` method to admin.php
557- Icon file: `images/icon.svg`
558
559## Version 6.12.6 (2026-02-14) - CONFIG IMPORT FIX
560
561### Fixed Config Import Validation
562- Now accepts both `return [` and `return array(` syntax
563- Regex updated from `/return\s*\[/` to `/return\s*(\[|array\s*\()/`
564- Older PHP config files using `return array(...)` now import correctly
565
566## Version 6.12.5 (2026-02-14) - MOBILE BUTTON FIX
567
568### Fixed Delete/Edit Buttons on Mobile
569- Added `type="button"` attribute to prevent form submission issues
570- Added `touchend` event delegation for reliable mobile touch handling
571- Increased button touch targets (32px default, 40px on mobile)
572- Added `touch-action: manipulation` to prevent touch delays
573- Added `-webkit-tap-highlight-color` for visual feedback
574
575### Technical Details
576- Mobile browsers sometimes don't fire `onclick` reliably
577- New `touchend` handler calls `btn.click()` explicitly
578- Larger touch targets meet accessibility guidelines (44px recommended)
579
580## Version 6.12.4 (2026-02-14) - STAR INLINE FIX
581
582### Fixed Star Position in Day Popup
583- Star icon now displays inline with event title (left side)
584- Changed `.popup-event-title` from `flex: 1 1 100%` to `flex: 1 1 auto`
585- Star and title stay on same line instead of star being above
586
587## Version 6.12.3 (2026-02-14) - DAY POPUP IMPORTANT EVENTS
588
589### Important Event Highlighting in Day Popup
590- Events from important namespaces now show ⭐ star icon
591- Golden gradient background highlight for important events
592- Golden border glow effect matching other views
593- Consistent styling across calendar grid, sidebar, and day popup
594
595### Technical Details
596- Added `importantNamespaces` check to `showDayPopup()` function
597- Added `.popup-event-important` and `.popup-event-star` CSS classes
598- Reads important namespaces from `container.dataset.importantNamespaces`
599
600## Version 6.12.2 (2026-02-14) - MULTI-DAY EVENT TIME FIX
601
602### Multi-Day Event End Time
603- End time now allows all times when end date differs from start date
604- Example: Event from 9:00 PM on Feb 28 to 5:00 AM on Feb 29 now works correctly
605- Same-day events still enforce end time > start time
606- Changing end date now triggers time validation update
607
608### Technical Details
609- `updateEndTimeOptions()` checks if `endDate !== startDate`
610- If multi-day, all time options are enabled
611- Added `onchange` handler to both start date and end date fields
612
613## Version 6.12.1 (2026-02-14) - TIME PICKER & EDIT DIALOG FIX
614
615### Improved Time Picker
616- Grouped time options by period (Morning, Afternoon, Evening, Night)
617- Much easier to navigate - no more scrolling through 96 options
618- End time options before start time are now hidden/disabled
619- Invalid end times automatically corrected when start time changes
620
621### Fixed Edit Event Dialog Draggability
622- Edit dialog is now properly draggable (was broken due to async AJAX)
623- Moved `makeDialogDraggable()` call inside the AJAX success callback
624- Removed redundant wrapper patch that didn't work with async code
625
626### Technical Details
627- Time picker uses `<optgroup>` for visual grouping
628- End time validation hides invalid options (not just disables)
629- Both Add and Edit dialogs now call `makeDialogDraggable()` directly
630
631## Version 6.12.0 (2026-02-14) - EVENT EDITOR DIALOG IMPROVEMENTS
632
633### Fixed Event Editor Dialog Draggability
634- Fixed duplicate event listener accumulation that caused performance degradation
635- Each time dialog opened, new drag listeners were added without removing old ones
636- Now properly cleans up old listeners before adding new ones
637- Added `cursor: grabbing` feedback while dragging
638- Dialog position resets when reopened (no more stuck positions)
639- Excluded close button from triggering drag
640
641### Optimized Time Selection Performance
642- Simplified `updateEndTimeOptions()` to be much faster
643- Removed expensive loop through 96 options checking style.display
644- Now just validates current selection and sets new value if invalid
645- Should eliminate freezing/lag when selecting start time
646
647### Technical Details
648- Added `_dragCleanup` function stored on handle element
649- Cleanup called before re-initialization
650- Removed unnecessary `setTranslate` helper function
651
652## Version 6.11.4 (2026-02-13) - JAVASCRIPT LOCALIZATION
653
654### JavaScript Frontend Localization
655- Added `getCalendarLang()` helper function
656- Added `getJsLangStrings()` PHP method
657- Embedded JSON language data in all render functions
658- Localized month names (full + short)
659- Localized dialog titles, confirmations, badges, empty states
660
661## Version 6.11.3 (2026-02-13) - SIDEBAR WIDGET LOCALIZATION
662
663### Sidebar Widget
664- Fixed `\n` in single-quoted strings → double-quoted for proper newlines
665- Localized "Runs every X minutes" cron descriptions
666- Event dialog labels, placeholders, options
667- Day names, ordinal positions, color names
668- Today/Tomorrow/Important section headers
669
670## Version 6.11.2 (2026-02-13) - ADMIN BACKEND LOCALIZATION
671
672### Admin Backend
673- Localized ~220 hardcoded strings in admin.php
674- AJAX JSON responses, redirect messages, error messages
675- Pattern names (Daily, Weekly, Monthly, etc.)
676
677## Version 6.11.1 (2026-02-13) - CONFIG IMPORT BUG FIX
678
679### Bug Fix
680- Fixed regex to accept both `return [` and `return array(` syntax
681- File: `admin.php` lines 5947, 6001
682
683## Version 6.10.6 (2026-02-13) - MANAGE RECURRING DIALOG LOCALIZATION
684
685### Localized Manage Recurring Series Dialog
686Complete translation of the "Manage" button dialog for recurring events:
687
688**Section Headers:**
689- "Manage Recurring Series" → "Wiederkehrende Serie verwalten"
690- "Extend Series" → "Serie erweitern"
691- "Trim Past Events" → "Vergangene Termine kürzen"
692- "Change Pattern" → "Muster ändern"
693- "Change Start Date" → "Startdatum ändern"
694- "Pause Series" / "Resume Series" → "Serie pausieren" / "Serie fortsetzen"
695
696**Labels & Buttons:**
697- All field labels (Add occurrences, Days apart, Remove before, New interval, etc.)
698- Action buttons (Extend, Trim, Change, Shift, Pause, Resume, Close)
699- Interval dropdown options (Daily, Weekly, Bi-weekly, Monthly, Quarterly, Yearly)
700- Help text and notes
701
702**Confirmation Dialogs:**
703- Trim confirmation with date
704- Respace confirmation
705- Shift confirmation
706
707### Added 60+ Language Strings for Dialogs
708Complete vocabulary for recurring event management in both English and German.
709
710### Note on Browser Validation Messages
711"Please fill out this field" is a browser-native message controlled by the browser's language setting, not our plugin.
712
713## Version 6.10.5 (2026-02-13) - DIALOG LOCALIZATION
714
715### Localized All JavaScript Dialogs
716
717**New Namespace Dialog:**
718- Prompt text with examples now in German
719- Invalid namespace error message
720
721**Rename Namespace Dialog:**
722- Prompt text with current name
723
724**Delete Confirmations:**
725- Delete selected events confirmation
726- Delete namespace confirmation
727- Delete recurring series confirmation
728
729**Trim Recurring Events:**
730- "Counting..." / "Zähle..."
731- "Trimming..." / "Kürze..."
732- "No past recurring events found" message
733- "Found X past recurring events" confirmation
734- Button text resets
735
736### Added 15+ New Dialog Strings
737Both English and German translations for all interactive prompts and confirmations.
738
739## Version 6.10.4 (2026-02-13) - COMPLETE MANAGE TAB LOCALIZATION
740
741### Fixed Remaining English Strings
742
743**Namespace Explorer Control Bar:**
744- "➡️ Move" → "➡️ Verschieben"
745- "➕ New Namespace" → "➕ Neuer Namensraum"
746- "�� Cleanup" → "�� Bereinigen"
747- "0 selected" → "0 ausgewählt"
748- "%d selected" → "%d ausgewählt"
749
750**Recurring Events Button Tooltips:**
751- "Edit title, time, namespace, pattern" → "Titel, Zeit, Namensraum, Muster bearbeiten"
752- "Extend, trim, pause, change dates" → "Erweitern, kürzen, pausieren, Daten ändern"
753- "Delete all occurrences" → "Alle Vorkommen löschen"
754
755**JavaScript Confirmation Messages:**
756- "No events selected" → "Keine Termine ausgewählt"
757- Delete confirmation with count
758- Delete namespace confirmation
759- "Scanning..." → "Scanne..."
760- "Cleaning..." → "Bereinige..."
761- "No empty namespaces found" message
762- "Found X item(s) to clean up" → "X Element(e) zum Bereinigen gefunden"
763- "Proceed with cleanup?" → "Mit Bereinigung fortfahren?"
764
765### Technical
766- Added adminLang JavaScript object with all translatable strings
767- All dynamic JavaScript messages now use language system
768
769## Version 6.10.3 (2026-02-13) - RECURRING EVENTS & DROP TARGET LOCALIZATION
770
771### Additional Localization for Manage Events Tab
772
773**Recurring Events Table:**
774- Search placeholder: "Wiederkehrende Termine suchen..."
775- Table headers: Titel, Namensraum, Muster, Zeitraum, Anzahl, Quelle, Aktionen
776- Source labels: Markiert / Erkannt (was Flagged / Detected)
777- Action buttons: Bearb. / Verwalten / Lö. (was Edit / Manage / Del)
778- Pattern badges: Täglich, Wöchentlich, Monatlich, Jährlich, Benutzerdefiniert
779- Footer: "Gesamt: X Serien" (was "Total: X series")
780- No results message
781
782**Namespace Explorer Drop Zones:**
783- Header: "�� Zielbereich" (was "Drop Target")
784- Drop hint: "Hier ablegen" (was "Drop here")
785- Default namespace label consistent
786
787### Added 25+ New Language Strings
788- Recurring table columns and labels
789- Pattern translations
790- Action button labels
791- Drop zone labels
792
793## Version 6.10.2 (2026-02-13) - MANAGE EVENTS TAB LOCALIZATION
794
795### Localized: Manage Events Tab (Complete)
796All text in the Manage Events admin tab now uses the language system:
797
798**Events Manager Section:**
799- Page title, section header, description
800- Statistics labels (Total Events, Namespaces, JSON Files, Recurring)
801- "Last scanned" timestamp label
802- Button labels (Re-scan Events, Export All Events, Import Events)
803- "View Breakdown by Namespace" expandable section
804- Table headers (Namespace, Events, Files)
805
806**Important Namespaces Section:**
807- Section header and description
808- Visual Effects descriptions (Calendar Grid, Event Sidebar, Sidebar Widget, Day Popup)
809- Save button and hint text
810
811**Cleanup Old Events Section:**
812- Section header and description
813- Radio button labels (By Age, By Status, By Date Range)
814- Age options (Delete events older than, months, years)
815- Status options (Completed tasks, Past events)
816- Date range labels (From, To)
817- Namespace filter label and placeholder
818- Preview and Delete button labels
819- JavaScript confirmation messages
820- Loading/error states
821
822**Recurring Events Section:**
823- Section header
824- Button labels (Trim All Past, Rescan)
825
826**Namespace Explorer Section:**
827- Section header and description
828- Search placeholder
829- Control bar buttons (All, None, Delete, Move to)
830- Datalist placeholder
831
832### Added 60+ New Language Strings
833Both English and German language files expanded with comprehensive admin terminology.
834
835## Version 6.10.1 (2026-02-13) - LANGUAGE SYSTEM FIX
836
837### Bug Fix: Language Files Not Working
838- Fixed `getMenuText()` to use `$this->getLang('menu')` instead of hardcoded string
839- Admin menu now correctly shows "Kalenderverwaltung" in German
840- Admin tabs now use language system:
841  - "Manage Events" → "Termine verwalten"
842  - "Update Plugin" → "Plugin aktualisieren"
843  - "Outlook Sync" → "Outlook-Sync"
844  - "Themes" → "Designs"
845
846### Added More Language Strings
847- Admin tab labels
848- Admin section headers (Event Browser, Important Namespaces, etc.)
849- Sync settings labels
850- Common button labels (Run Now, Download, Upload, Delete, etc.)
851
852## Version 6.10.0 (2026-02-13) - GERMAN LANGUAGE SUPPORT
853
854### New Feature: German Language Translation
855- Added complete German (de) language file
856- Expanded English language file with comprehensive translatable strings
857- Both files include 100+ translation strings covering:
858  - General terms (calendar, events, dates)
859  - Event fields (title, description, time, etc.)
860  - Actions (add, edit, delete, save, cancel)
861  - Task-related terms
862  - Recurring event options
863  - Days of week and months
864  - User messages and confirmations
865  - Search functionality
866  - Sync status messages
867  - Admin section labels
868  - Sidebar widget labels
869  - Time conflict warnings
870
871### Note
872The language strings are now available for future implementation throughout the plugin UI. Currently the admin menu uses the language system; other strings can be integrated as needed.
873
874## Version 6.9.9 (2026-02-13) - CRITICAL SEARCH FIX
875
876### Bug Fix: Month Search Not Working
877- **Root cause:** Function name collision - there were two `fuzzyMatch` functions
878  - `window.fuzzyMatch` (for namespace search autocomplete) returns a score number or `null`
879  - Local `fuzzyMatch` (for event search) returns `true`/`false`
880- When filtering events, the wrong function was being called, returning `null` for all events
881- **Fix:** Renamed event search functions to `eventSearchNormalize` and `eventSearchMatch`
882- Month search now works correctly on first load and after navigation
883
884### Also in this version
885- Fixed jumpToDate to properly hide search clear button after navigation
886- Removed debug logging from production code
887
888## Version 6.9.8 (2026-02-12) - SEARCH & UI FIXES
889
890### Bug Fixes
891
892**All-Dates Search Navigation Fixed**
893- Clicking a search result now properly navigates to that event's month
894- Opens the day popup showing the event details
895- Was calling non-existent `loadMonth()` - now uses correct `navCalendar()`
896- Clears search results and restores normal event list view
897
898**"No Events" Message Fixed**
899- No longer shows "No events match your search" when in all-dates mode
900- All-dates mode has its own results display; the month-mode message was incorrectly appearing
901
902**Add Button Layout Fixed**
903- Search bar no longer pushes the "+ Add" button off the right edge
904- Search container has constrained max-width (160px) and proper flex settings
905- Header has overflow:hidden to prevent layout issues
906
907**Important Event Stars Fixed**
908- Stars now appear on initial page load (PHP rendering added)
909- Stars positioned outside the bar using CSS ::before pseudo-element
910- Added overflow:visible to event-indicators and event-bar containers
911- Bar remains full width; star sits in the left margin area
912
913### Technical
914- Star uses `event-bar-has-star` class for first-day-only display
915- jumpToDate() properly cleans up search state before navigation
916
917## Version 6.9.7 (2026-02-12) - IMPORTANT NAMESPACE IMPROVEMENTS
918
919### Bug Fix
920- **AJAX refresh now preserves important namespace highlighting**
921  - Important namespaces list now passed to JavaScript via data attribute
922  - Highlighting persists when navigating between months
923  - Works in both main calendar sidebar and standalone event panels
924
925### New Feature: Calendar Grid Star Icons
926- **Important events now show ⭐ on their color bars** in the calendar grid
927  - Small star appears on the first day of important events
928  - Tooltip prefixed with ⭐ for important events
929  - Visual distinction without cluttering the compact grid view
930
931### Admin Section Update
932- **Improved Important Namespaces description** in Admin → Calendar → Manage Events
933  - Now explains all visual effects:
934    - Calendar Grid: ⭐ star on event bars
935    - Event Sidebar: ⭐ star + highlighted background + accent border
936    - Sidebar Widget: Dedicated "Important Events" section
937    - Day Popup: Events shown with full details
938  - Better example placeholder text
939
940### Technical
941- Fixed PHP syntax error in fuzzy search (curly quotes replaced with escape sequences)
942- Important namespaces loaded once and stored in container dataset for JavaScript access
943
944## Version 6.9.6 (2026-02-12) - FUZZY SEARCH & SIDEBAR HIGHLIGHTING
945
946### Fuzzy Search
947- **Improved search matching:** Search is now more forgiving of punctuation differences
948  - "fathers day" matches "Father's Day"
949  - "new years" matches "New Year's Eve"
950  - Smart quotes, apostrophes, dashes, and common punctuation are ignored
951- **Multi-word search:** All words must be present but in any order
952  - "birthday john" matches "John's Birthday Party"
953- Works in both "this month" and "all dates" search modes
954
955### Important Namespace Highlighting (Calendar Sidebar)
956- Events from important namespaces now highlighted in the main calendar's event list sidebar
957- Same visual treatment as the itinerary sidebar widget:
958  - Subtle theme-colored background tint
959  - Right border accent bar
960  - ⭐ star icon before event title
961- Theme-specific colors:
962  - Matrix: green tint
963  - Purple: purple tint
964  - Pink: pink tint
965  - Professional: blue tint
966  - Wiki: light blue tint
967- Configure important namespaces in Admin → Calendar → Sync Settings
968
969## Version 6.9.5 (2026-02-12) - SEARCH MODE TOGGLE
970
971### New Feature: Search Scope Toggle
972- **Search mode button** (��/��) added next to search input in both calendar views
973- **Default mode** (��): Search only the current month's events (fast, local filtering)
974- **All dates mode** (��): Search across ALL calendar data via AJAX
975  - Click the �� button to toggle to �� (green highlight when active)
976  - Requires at least 2 characters to search
977  - Shows results with date, time, and namespace
978  - Click any result to jump to that date and open the day popup
979  - Limited to 50 results for performance
980- Search placeholder text updates to indicate current mode
981- Compact button design takes minimal space
982
983### UI Details
984- Button sits flush with search input (no gap)
985- Green highlight when "all dates" mode is active
986- Results show full date (e.g., "Mon, Feb 12, 2026")
987- Namespace badge shown for multi-namespace setups
988
989## Version 6.9.4 (2026-02-12) - POPUP IMPROVEMENTS & IMPORTANT HIGHLIGHTING
990
991### Features
992- **Draggable Day Popup:** Calendar day popup window is now draggable by its header
993  - Click and drag the header to move the popup
994  - Header shows move cursor on hover
995  - Clicking the close button (×) still closes normally
996
997- **Important Namespace Highlighting in Sidebar:**
998  - Events from "important" namespaces (defined in Admin → Sync Settings) now have subtle highlighting
999  - Theme-aware background tint (green for Matrix, purple for Purple, pink for Pink, blue for Professional/Wiki)
1000  - Right border accent bar for visual distinction
1001  - ⭐ star icon appears before event title
1002  - Works in Today, Tomorrow, and Important Events sections
1003
1004### Bug Fix
1005- **Fixed event display in day popup:** Long titles no longer cut off the edit/delete buttons
1006  - Event title now wraps to multiple lines instead of truncating
1007  - Actions buttons always visible
1008  - Time, date range, and namespace badges wrap properly
1009  - Improved flex layout for better responsiveness
1010
1011## Version 6.9.3 (2026-02-12) - ADMIN EDIT DIALOG CONSISTENCY
1012
1013### UI Improvement
1014- **Edit Recurring Event dialog** in Admin section now matches the main event editor exactly:
1015  - Same dark theme styling (#1e1e1e background, #2c3e50 header)
1016  - Same header layout with close button (×) in top-right corner
1017  - Same input styling (dark inputs with green accent borders)
1018  - Same footer with Cancel/Save buttons layout
1019  - Same recurrence options box styling
1020  - Consistent spacing, fonts, and colors throughout
1021
1022## Version 6.9.2 (2026-02-12) - MOBILE DIALOG FIX
1023
1024### Bug Fix
1025- **Fixed:** Description textarea now extends full width on mobile/phone view
1026  - Reduced form padding from 12px to 8px on screens ≤480px
1027  - Added explicit `width: 100%` and `box-sizing: border-box` to textarea
1028  - Ensured all form inputs/selects use full available width on mobile
1029
1030## Version 6.9.1 (2026-02-11) - ADMIN RECURRING EVENTS INTEGRATION
1031
1032### Admin Panel Updates
1033- **Enhanced Recurring Events Table:**
1034  - Pattern column now shows color-coded badges (daily=blue, weekly=green, monthly=orange, yearly=pink)
1035  - "First" column renamed to "Range" showing full date span (e.g., "Feb 1, 2026 → Dec 15, 2026")
1036  - Patterns now read from stored metadata when available, with smart fallback to detection
1037
1038- **Edit Recurring Series Dialog:**
1039  - Full recurrence pattern editing (not just simple intervals)
1040  - "Repeat every [N] [period]" with dropdown for Daily/Weekly/Monthly/Yearly
1041  - Weekly: Day-of-week checkboxes (Sun-Sat) with current days pre-selected
1042  - Monthly: Radio choice between "Day of month" or "Weekday pattern"
1043  - Ordinal weekday selector (First/Second/Third/Fourth/Fifth/Last + day dropdown)
1044  - Pre-populates all fields from stored recurrence metadata
1045  - Properly reschedules future events using new pattern
1046
1047- **Manage Series Dialog:**
1048  - Updated summary to show date range
1049  - Extend/trim/change pattern functions work with new patterns
1050
1051### Technical Updates
1052- `findRecurringEvents()` captures all recurrence metadata from events
1053- `formatRecurrencePattern()` generates human-readable pattern descriptions
1054- `detectRecurrencePattern()` enhanced to detect more interval variations
1055- `editRecurringSeries()` PHP handler processes new recurrence parameters
1056- `generateRecurrenceDates()` creates dates matching complex patterns
1057- Recurrence metadata preserved and updated across all event occurrences
1058
1059## Version 6.9.0 (2026-02-11) - ADVANCED RECURRING EVENTS
1060
1061### New Features
1062- **Enhanced Recurring Event Options:**
1063  - **Interval support:** Repeat every N days/weeks/months/years (e.g., every 3 months)
1064  - **Weekly day selection:** Choose specific days of the week (e.g., Mon, Wed, Fri)
1065  - **Monthly options:**
1066    - Day of month: Repeat on specific day (e.g., 15th of each month)
1067    - Ordinal weekday: Repeat on pattern (e.g., 2nd Wednesday, Last Friday)
1068  - **Examples now possible:**
1069    - Every 2 weeks on Monday and Thursday
1070    - Every 3 months on the 15th
1071    - Every other month on the 2nd Wednesday
1072    - Every year on the same date
1073    - Last Friday of every month
1074
1075### UI Changes
1076- Redesigned recurring options section with bordered container
1077- "Repeat every [N] [period]" input with interval number field
1078- Day-of-week checkboxes for weekly recurrence
1079- Radio buttons for monthly: "Day of month" vs "Weekday pattern"
1080- Ordinal dropdown (First/Second/Third/Fourth/Fifth/Last)
1081- Day dropdown (Sunday through Saturday)
1082- Helper text for end date field
1083
1084### Technical Details
1085- New parameters: recurrenceInterval, weekDays, monthlyType, monthDay, ordinalWeek, ordinalDay
1086- Recurrence pattern stored in event data for reference
1087- Maximum 365 occurrences (up from 100) to support daily events for a year
1088- Smart date iteration for complex patterns
1089
1090## Version 6.8.1 (2026-02-11) - ITINERARY DEFAULT STATE SETTING
1091
1092### New Feature
1093- **Added:** Option to set itinerary default state (expanded or collapsed)
1094  - New setting in Admin → Calendar → �� Sidebar Widget Settings
1095  - "�� Itinerary Section" with two options:
1096    - **Expanded** (default) - Show itinerary sections by default
1097    - **Collapsed** - Hide itinerary sections by default (click bar to expand)
1098  - Setting persists across page loads
1099  - Arrow indicator and content state reflect the saved preference on page load
1100
1101## Version 6.8.0 (2026-02-11) - COLLAPSIBLE ITINERARY
1102
1103### New Feature
1104- **Added:** Collapsible Itinerary bar in sidebar week view
1105  - New "ITINERARY" bar below the week calendar (styled like +ADD EVENT bar)
1106  - Click to collapse/expand the Today, Tomorrow, and Important Events sections
1107  - Arrow indicator shows expanded (▼) or collapsed (►) state
1108  - Smooth animation when collapsing/expanding
1109  - Clicking a day in the week grid shows that day's events ABOVE the Itinerary bar
1110  - Selected day events remain visible whether itinerary is expanded or collapsed
1111  - Shows "No upcoming events" message when there are no itinerary items
1112
1113### UI Layout (top to bottom)
11141. Header with clock/system stats
11152. +ADD EVENT bar
11163. Week grid (7 days)
11174. Selected day's events (appears when clicking a day)
11185. ITINERARY bar (click to collapse/expand)
11196. Today section (collapsible)
11207. Tomorrow section (collapsible)
11218. Important Events section (collapsible)
1122
1123## Version 6.7.9 (2026-02-11) - FIX EVENTS MANAGER STATISTICS
1124
1125### Bug Fixes
1126- **Fixed:** �� Events Manager showing inflated count (1195 instead of ~605)
1127  - The `scanDirectoryForStats()` function was counting ALL entries in JSON files
1128  - Now properly filters to only count date keys (`YYYY-MM-DD` format)
1129  - Now validates events have `id` and `title` before counting
1130  - Click "�� Rescan" to update the statistics with correct count
1131
1132## Version 6.7.8 (2026-02-11) - FILTER INVALID EVENTS
1133
1134### Bug Fixes
1135- **Fixed:** Event Manager showing "(untitled)" and "mapping" entries
1136  - Root cause: Calendar JSON files contain metadata keys (like "mapping") that were being parsed as events
1137  - Added date format validation (`YYYY-MM-DD`) to skip non-date keys
1138  - Added validation to require `id` and `title` fields for events
1139  - Applied fix to all event-reading functions:
1140    - `getEventsByNamespace()` - main event listing
1141    - `scanNamespaceRecursive()` - namespace scanning
1142    - `searchEvents()` - event search
1143    - `findEventsByTitle()` - title lookup
1144    - `deleteRecurringSeries()` - recurring deletion
1145    - `renameRecurringSeries()` - recurring rename
1146    - Recurring events scanner
1147    - Recurring cleanup function
1148
1149### Technical Details
1150- Date keys must match pattern `/^\d{4}-\d{2}-\d{2}$/`
1151- Events must have non-empty `id` and `title` fields
1152- All other entries in JSON files are now skipped
1153
1154## Version 6.7.7 (2026-02-11) - FIX PHP PATH & CLEAR LOG
1155
1156### Bug Fixes
1157- **Fixed:** "sh: 1: '/usr/bin/php': not found" error - removed escapeshellarg() which was adding quotes around the PHP path
1158- **Fixed:** "Could not clear log file" - added better error messages showing exact issue
1159- **Improved:** findPhpBinary() now uses is_executable() and `which php` for detection
1160- **Improved:** clearLogFile() now shows specific error (file not found, not writable, etc.)
1161
1162## Version 6.7.6 (2026-02-11) - FIX SYNC CONTROLS & LOGGING
1163
1164### Bug Fixes
1165- **Fixed:** Double log entries - sync script logs internally, removed redundant stdout capture
1166- **Fixed:** Manual sync not appearing in log - removed `--verbose` flag since script logs directly
1167- **Fixed:** Better error messages when sync fails
1168
1169### Improvements
1170- **Improved:** Sync now runs without `--verbose` flag - script logs to file internally
1171- **Improved:** Crontab warning if `>>` redirect is detected (causes duplicate entries)
1172- **Improved:** Log viewer now shows full path to log file
1173- **Improved:** Better pre-flight checks (directory creation, file permissions)
1174- **Improved:** PHP binary path is now properly escaped
1175
1176### Crontab Update Required
1177If your crontab has `>> sync.log 2>&1`, remove it to prevent duplicate log entries:
1178
1179**Before (causes duplicates):**
1180```
1181*/2 * * * * cd /var/www/html/dokuwiki/lib/plugins/calendar && php sync_outlook.php >> /var/www/html/dokuwiki/data/meta/calendar/sync.log 2>&1
1182```
1183
1184**After (correct):**
1185```
1186*/2 * * * * cd /var/www/html/dokuwiki/lib/plugins/calendar && php sync_outlook.php
1187```
1188
1189The script automatically logs to `data/meta/calendar/sync.log`.
1190
1191## Version 6.7.5 (2026-02-11) - FIX SYNC LOG OUTPUT
1192
1193### Bug Fixes
1194- **Fixed:** Sync log not showing output when running sync from admin panel
1195  - Added `--verbose` flag to sync command so output is captured
1196  - Sync output is now captured and written to the log file
1197  - Log directory is created if it doesn't exist
1198  - Better error handling if log directory isn't writable
1199  - Command being executed is logged for debugging
1200
1201### Changes
1202- Sync now runs in verbose mode when triggered from admin panel
1203- All sync output (stdout/stderr) is written to the log file
1204- Pre-flight check ensures log directory exists and is writable
1205
1206## Version 6.7.4 (2026-02-11) - FIX MANUAL SYNC EXECUTION
1207
1208### Bug Fix
1209- **Fixed:** "Could not open input file: sync_outlook.php" when running manual sync
1210  - The `$pluginDir` variable was missing from `runSync()` function
1211  - Added `$pluginDir = DOKU_PLUGIN . 'calendar'` before building the command
1212  - Sync now properly changes to the plugin directory before executing
1213
1214## Version 6.7.3 (2026-02-11) - FIX ADDITIONAL COUNT TYPE ERRORS
1215
1216### Bug Fix
1217- **Fixed:** Additional TypeError "count(): Argument #1 ($value) must be of type Countable|array, int given"
1218  - Fixed in `scanDirectoryForStats()` (line 5453)
1219  - Fixed in namespace delete function (line 4137)
1220  - Fixed in export function (line 5516)
1221  - Fixed in import function (line 5636)
1222  - All locations now check `is_array()` before calling `count()`
1223
1224## Version 6.7.2 (2026-02-11) - FIX EVENT MANAGER TYPE ERROR
1225
1226### Bug Fix
1227- **Fixed:** TypeError "count(): Argument #1 ($value) must be of type Countable|array, int given"
1228  - Added array type checks when iterating over calendar event data
1229  - Protects against corrupted JSON data where event lists may not be arrays
1230  - Added safeguards in `getEventsByNamespace()` and `scanNamespaceRecursive()`
1231
1232## Version 6.7.1 (2026-02-11) - BULK DELETE FOR BACKUPS
1233
1234### Changed
1235- **Improved:** Backup management now uses bulk selection and delete
1236  - Added checkboxes next to each backup file
1237  - Added "Select All" checkbox in the action bar
1238  - Added "��️ Delete Selected" button (appears when backups are selected)
1239  - Removed individual delete buttons from each row
1240  - Shows count of selected backups
1241  - Backups are deleted sequentially with visual feedback
1242
1243### UI
1244- Clean action bar at top of backup table with selection controls
1245- Selected count updates in real-time
1246- Rows fade out smoothly when deleted
1247
1248## Version 6.7.0 (2026-02-11) - IMPROVED RESTORE FUNCTION
1249
1250### Changed
1251- **Improved:** Restore function now uses DokuWiki's Extension Manager API
1252  - Uses `helper_plugin_extension_extension` for proper installation
1253  - Handles permissions correctly through DokuWiki's standard plugin installation process
1254  - Falls back to manual instructions if Extension Manager is not available
1255
1256### How It Works
1257When you click "�� Restore" on a backup:
12581. The plugin loads DokuWiki's extension helper
12592. Calls `installFromLocal()` with the backup ZIP file
12603. DokuWiki's Extension Manager handles file extraction and installation
12614. This ensures proper permissions and follows DokuWiki standards
1262
1263### Fallback
1264If the Extension Manager helper is not available, you'll be prompted to:
1265- Download the backup ZIP
1266- Go to Admin → Extension Manager → Install
1267- Upload the ZIP file manually
1268
1269## Version 6.6.9 (2026-02-11) - REMOVE RESTORE FUNCTION
1270
1271### Removed
1272- **Removed:** "Restore" button from backup management
1273- **Removed:** `restoreBackup()` PHP method
1274- **Removed:** `restoreBackup()` JavaScript function
1275
1276### Added
1277- **Added:** Informational note in backup section explaining how to restore:
1278  - Download the backup ZIP file
1279  - Go to Admin → Extension Manager → Install
1280  - Upload the ZIP file there
1281  - DokuWiki's extension manager handles installation safely with proper permissions
1282
1283### Reason
1284The restore function required write access to the plugin directory, which web servers typically don't have (and shouldn't have) for security reasons. Using DokuWiki's built-in Extension Manager is the safer and more reliable approach.
1285
1286## Version 6.6.8 (2026-02-11) - FIX THEME KEYS & FILE PERMISSIONS
1287
1288### Bug Fixes
1289- **Fixed:** "Undefined array key" warnings for wiki theme (pastdue_color, pastdue_bg, tomorrow_bg, etc.)
1290  - Added missing theme keys to `getWikiTemplateColors()` return array
1291
1292- **Fixed:** "Permission denied" errors for sync.log and sync_state.json
1293  - Moved sync files from plugin directory to `data/meta/calendar/` (writable location)
1294  - Updated sync_outlook.php, admin.php to use new paths
1295  - sync_config.php remains in plugin directory (must be manually configured)
1296
1297- **Fixed:** `findEventNamespace` now returns the actual DIRECTORY where event file lives
1298  - This ensures deletion works correctly when stored namespace differs from file location
1299
1300### Note on lang.php Permission Error
1301If you see a permission error for lang/en/lang.php, this occurs when trying to restore/update the plugin via admin panel and the web server doesn't have write access to the plugin directory. This is normal security - update via command line or FTP instead.
1302
1303## Version 6.6.7 (2026-02-11) - FIX NAMESPACE CHANGE BUG (PART 2)
1304
1305### Bug Fix
1306- **Fixed:** Events in the DEFAULT namespace (no namespace) could not be moved to other namespaces
1307  - Root cause: The comparison `$oldNamespace !== ''` was always FALSE for default namespace events
1308  - Changed to `$oldNamespace !== null` to properly distinguish between "event not found" (null) and "event in default namespace" ('')
1309  - This allows moving events FROM the default namespace TO any other namespace
1310  - Also fixed null coalescing for recurring events: `$oldNamespace ?? $namespace` instead of `$oldNamespace ?: $namespace`
1311
1312## Version 6.6.6 (2026-02-11) - FIX NAMESPACE CHANGE & DELETE BUGS
1313
1314### Bug Fixes
1315- **Fixed:** Changing an event's namespace now properly moves the event instead of creating a duplicate
1316  - Root cause: `findEventNamespace()` was searching in the NEW namespace instead of ALL namespaces
1317  - Now uses wildcard search `'*'` to find the existing event regardless of its current namespace
1318
1319- **Fixed:** Deleting an event no longer causes the calendar to filter by the deleted event's namespace
1320  - Root cause: After deletion, `reloadCalendarData()` was called with the deleted event's namespace
1321  - Now retrieves the calendar's original namespace from `container.dataset.namespace`
1322  - Also fixed in `saveEventCompact()` and `toggleTaskComplete()` for consistency
1323
1324## Version 6.6.5 (2026-02-11) - ADD AUTOCOMPLETE ATTRIBUTES
1325
1326### Improved
1327- Added `autocomplete="new-password"` to client secret input field
1328- Added `autocomplete="email"` to user email input field
1329- Added `autocomplete="off"` to client ID input field
1330- Follows browser best practices for form inputs
1331
1332## Version 6.6.4 (2026-02-11) - FIX GEOLOCATION VIOLATION
1333
1334### Bug Fix
1335- **Fixed:** Browser violation "Only request geolocation information in response to a user gesture"
1336- Weather widget now uses Sacramento as the default location on page load
1337- Geolocation is only requested when user **clicks** on the weather icon
1338- Click the weather icon to get your local weather (browser will prompt for permission)
1339- Weather icon shows tooltip "Click for local weather" and has pointer cursor
1340
1341## Version 6.6.3 (2026-02-11) - FIX MUTATIONOBSERVER ERROR
1342
1343### Bug Fix
1344- **Fixed:** `Failed to execute 'observe' on 'MutationObserver': parameter 1 is not of type 'Node'` error
1345- Root cause: MutationObserver tried to observe `document.body` before DOM was ready
1346- Added `setupMutationObserver()` function that waits for DOMContentLoaded before attaching observer
1347
1348## Version 6.6.2 (2026-02-11) - FIX CONFLICT TOOLTIP JAVASCRIPT LOADING
1349
1350### Bug Fix
1351- **Critical:** Fixed `showConflictTooltip is not defined` and `hideConflictTooltip is not defined` errors
1352- Root cause: `addAssets()` in action.php was loading empty `script.js` instead of `calendar-main.js`
1353- Changed `addAssets()` to load `calendar-main.js` directly
1354- Updated `script.js` to dynamically load `calendar-main.js` as a fallback mechanism
1355
1356## Version 6.6.1 (2026-02-11) - SECURITY FIXES
1357
1358### Security
1359- **Critical:** Removed `eval()` remote code execution vulnerability in config import
1360- **Critical:** Added admin authentication requirement to `get_system_stats.php` endpoint
1361- **High:** Added CSRF token verification to all write operations (save, delete, toggle)
1362- **High:** Fixed path traversal vulnerabilities in namespace delete/rename functions
1363- **High:** Added admin privilege verification to AJAX admin routes
1364
1365### Improved
1366- **Input Validation:** Date format (YYYY-MM-DD), time format (HH:MM), color format (#RRGGBB)
1367- **Input Validation:** Year range (1970-2100), month range (1-12), namespace format
1368- **Input Validation:** Recurrence type whitelist, title/description length limits
1369- **Debug Logging:** All debug logging now conditional on `CALENDAR_DEBUG` constant (off by default)
1370- **JSON Handling:** Added `safeJsonRead()` helper with proper error handling
1371- **Timezone:** Sync script now uses configured timezone instead of hardcoded value
1372
1373### Code Quality
1374- Documented intentional switch fallthrough in `get_system_stats.php`
1375- Standardized error response format
1376
1377## Version 6.6.0 (2026-02-11) - BACKUP & UI IMPROVEMENTS
1378
1379### Fixed
1380- **Backup:** Fixed recursive directory backup to properly include all subdirectories (including `lang/`)
1381- **Backup:** Now uses `SELF_FIRST` iterator to process directories before their contents
1382- **Backup:** Empty directories are now explicitly added with `addEmptyDir()` to preserve structure
1383
1384### UI Change
1385- **Namespace Explorer:** Cleanup status message now appears prominently at top of section
1386- Previously status message was at bottom, easy to miss after cleanup operations
1387
1388## Version 6.5.5 (2026-02-11) - FIX AJAX ROUTING & MOVE CLEANUP BUTTON
1389
1390### Bug Fix
1391- All admin AJAX actions (cleanup, rescan, extend, trim, pause, resume, change start/pattern) were returning "Unknown action"
1392- Root cause: AJAX calls go through `action.php`'s switch statement, not `admin.php`'s `handle()` method
1393- Added routing in `action.php`: new cases forward to `admin.php` via `routeToAdmin()` helper
1394- Added public `handleAjaxAction()` method in `admin.php` as the entry point from `action.php`
1395
1396### UI Change
1397- Moved "�� Cleanup" button from standalone section to inline next to "➕ New Namespace" in the control bar
1398- Status messages still appear below the namespace explorer
1399
1400## Version 6.5.4 (2026-02-11) - FIX PHP PARSE ERROR IN CLEANUP JS
1401
1402### Bug Fix
1403- Root cause: `style='color:...'` single quotes inside PHP `echo '...'` block terminated the PHP string prematurely
1404- PHP saw `color:#e74c3c` as unexpected PHP code instead of part of the JS string
1405- Fixed all 5 occurrences in cleanupEmptyNamespaces JS: escaped single quotes as `\'`
1406- Added `adminColors` JS object (text, bg, border) injected from PHP `$colors` at render time
1407- Cleanup detail text uses `adminColors.text` to respect DokuWiki template theme colors
1408
1409## Version 6.5.3 (2026-02-11) - FIX CLEANUP NAMESPACES PARSE ERROR
1410
1411### Bug Fix
1412- Fixed PHP parse error on line 1089 caused by `$colors['text']` PHP variable inside JS string concatenation
1413- The cleanup results detail list now uses hardcoded `#666` for text color instead of attempting PHP interpolation within JS runtime code
1414
1415## Version 6.5.2 (2026-02-11) - CLEANUP EMPTY NAMESPACES
1416
1417### New Feature
1418- "�� Cleanup Empty Namespaces" button added at bottom of Namespace Explorer section
1419- Dry-run scan first: shows exactly what will be removed with bullet-point details in confirm dialog
1420- Removes empty calendar folders (0 JSON files or all-empty JSON files) from any namespace
1421- Removes parent namespace directories if they become empty after calendar folder removal
1422- Root calendar directory is never removed
1423- AJAX-powered with inline status showing results after cleanup
1424- Page auto-reloads after 2 seconds to refresh the namespace explorer view
1425- Recursively scans all nested namespace directories via `findAllCalendarDirsRecursive()`
1426
1427## Version 6.5.1 (2026-02-11) - TRIM ALL PAST: SHOW COUNT BEFORE DELETE
1428
1429### Improved
1430- "Trim All Past" button now does a dry-run count before showing the confirmation dialog
1431- Confirmation shows exact count: "Found 47 past recurring events to remove"
1432- If zero found, shows "No past recurring events found to remove" instead of confirm
1433- PHP handler supports `dry_run` parameter that counts without deleting
1434
1435## Version 6.5.0 (2026-02-11) - BULK TRIM ALL PAST RECURRING EVENTS
1436
1437### Bulk Action
1438- Red "✂️ Trim All Past" button added next to the Rescan button in the Recurring Events section header
1439- Removes ALL past occurrences (before today) from EVERY recurring series in one click
1440- Only removes events with `recurring` or `recurringId` flags — non-recurring events are untouched
1441- Confirmation dialog required before execution
1442- AJAX-powered with inline status showing count removed, then auto-rescans the table
1443- Searches all calendar directories recursively
1444
1445## Version 6.4.9 (2026-02-11) - FIX RECURRING EDIT/DELETE: SEARCH ALL DIRECTORIES
1446
1447### Bug Fix
1448- Edit and Delete recurring series now search ALL calendar directories instead of building a path from the namespace field
1449- Root cause: event's `namespace` field (stored in JSON) can differ from the filesystem directory where the file lives
1450- Both handlers now use `findCalendarDirs()` to collect every calendar directory recursively
1451- Events matched by title AND namespace field (case-insensitive) for precise targeting
1452- Edit handler rewritten: rename/time/namespace updates in Pass 1, interval respace in Pass 2
1453- New `findCalendarDirs()` helper method for recursive directory discovery
1454
1455## Version 6.4.8 (2026-02-11) - FIX PHP PARSE ERROR IN MANAGE DIALOG
1456
1457### Bug Fix
1458- Rewrote `manageRecurringSeries()` JS function using string concatenation instead of template literals
1459- JS template literals (`${...}`) inside PHP echo blocks caused PHP to parse them as variable interpolation
1460- All inline onclick handlers now use `\x27` for single quotes to avoid escaping conflicts
1461
1462## Version 6.4.7 (2026-02-11) - RECURRING EVENTS: FULL MANAGEMENT CONTROLS
1463
1464### New "Manage" Button per Series
1465- Orange "Manage" button opens a comprehensive management dialog for each recurring series
1466
1467### Extend Series
1468- Add N new occurrences after the last event in the series
1469- Configurable interval: Daily, Weekly, Bi-weekly, Monthly, Quarterly, Yearly
1470- New events copy title, time, color, namespace, and recurring flag from the last event
1471
1472### Trim Past Events
1473- Remove all occurrences before a selected cutoff date
1474- Confirmation required before deletion
1475- Cleans up empty date keys and files automatically
1476
1477### Change Pattern
1478- Respace future occurrences with a new interval
1479- Past events are untouched; only future events are removed and re-created
1480- First future event becomes the anchor date
1481
1482### Change Start Date
1483- Shift ALL occurrences by the difference between old and new start date
1484- Events are removed from old positions and re-created at new positions
1485- Preserves spacing between all events
1486
1487### Pause/Resume
1488- Pause: adds ⏸ prefix and paused flag to all future occurrences
1489- Resume: removes ⏸ prefix and paused flag from all occurrences
1490- Button toggles based on whether series is currently paused
1491
1492### Infrastructure
1493- New shared `recurringAction()` JS helper for all AJAX management operations
1494- New `getRecurringSeriesEvents()` PHP helper for finding all events in a series
1495- Status messages shown inline in the management dialog
1496- Close button triggers automatic rescan to refresh the table
1497
1498## Version 6.4.6 (2026-02-11) - RECURRING EVENTS: RESCAN BUTTON & IMPROVED LOGIC
1499
1500### Rescan Button
1501- Green "�� Rescan" button added to the Recurring Events section header
1502- AJAX-powered: rescans all calendar data and refreshes the table without page reload
1503- Shows count of found series briefly after scan completes
1504
1505### Improved Detection Logic
1506- Events with `recurring: true` flag are now detected first (grouped by `recurringId`)
1507- Pattern-detected events (3+ same-title occurrences) are found separately and deduplicated
1508- New "Source" column shows ��️ Flagged (has recurring flag) vs �� Detected (pattern match)
1509- Median interval used for pattern detection instead of just first two dates (more robust)
1510- New patterns recognized: Quarterly, Semi-annual, and "Every ~N days" for custom intervals
1511- Empty/invalid titles and malformed date arrays are now skipped safely
1512- Dates are deduplicated before counting (prevents inflated counts from multi-day events)
1513- Nested namespace directories now scanned recursively
1514- Results sorted alphabetically by title
1515
1516## Version 6.4.5 (2026-02-11) - ADMIN VERSION HISTORY OVERHAUL
1517
1518### Version History Viewer
1519- All purple (#7b1fa2) accent colors replaced with green (#00cc07) to match admin theme
1520- Changelog parser now handles `###` subsection headers (rendered as green bold labels)
1521- Plain `- ` bullet items now parsed and categorized under their subsection
1522- Previously only `- **Type:** description` format was recognized
1523
1524### Current Release Button
1525- Green "Current Release" button added between nav arrows
1526- Jumps directly to the card matching the running version from plugin.info.txt
1527- Running version card shows green "RUNNING" badge and thicker green border
1528
1529## Version 6.4.4 (2026-02-11) - WIKI THEME: PAST EVENTS TOGGLE BACKGROUND
1530
1531### Fix
1532- Wiki theme past events pulldown (retracted state) now uses `__background_neu__` (`--cell-today-bg`)
1533- Previously used `--cell-bg` which appeared unthemed/white
1534
1535## Version 6.4.3 (2026-02-11) - WIKI THEME: DAY HEADERS BACKGROUND
1536
1537### Fix
1538- Wiki theme SMTWTFS day headers now use `__background_neu__` (`--cell-today-bg`) instead of `--background-header`
1539
1540## Version 6.4.2 (2026-02-11) - WIKI THEME: DAY HEADERS (INITIAL)
1541
1542### Wiki Theme Day Headers
1543- Added explicit CSS override for `.calendar-theme-wiki .calendar-day-headers`
1544- Day header text uses `--text-primary` (template's `__text__` color)
1545
1546## Version 6.4.1 (2026-02-11) - WIKI THEME: EVENT HIGHLIGHT
1547
1548### Fix
1549- Wiki theme event highlight (when clicking calendar bar) now uses `themeStyles.header_bg` (`__background_alt__`) instead of hardcoded blue (#dce9f5)
1550- Subtle shadow instead of blue glow
1551
1552## Version 6.4.0 (2026-02-11) - DARK READER: SECTION BAR COLOR MATCHING
1553
1554### Fix
1555- Wiki theme section left bar now uses a `<div>` with `background` instead of `border-left`
1556- Dark Reader maps the same color differently for border vs background properties, causing visual mismatch
1557- Both the bar and header now use `background`, so Dark Reader maps them identically
1558- Flex layout wrapper added for wiki theme sections
1559- Wiki fallback colors updated: `border` key now uses `#ccc` (matching `__border__`) instead of `#2b73b7`
1560
1561## Version 6.3.9 (2026-02-10) - WIKI THEME: SECTION BAR FIX (ATTEMPT)
1562
1563### Fix
1564- Simplified wiki section container — removed `wiki-section-container` class
1565- Added `background` from `$themeStyles['bg']` to section container
1566
1567## Version 6.3.8 (2026-02-10) - WIKI THEME: BUTTON & SECTION HEADER COLORS
1568
1569### Wiki Theme Buttons
1570- Nav buttons (< >), Today button, and panel buttons now use `__link__` color background with white text
1571- CSS overrides for `.calendar-theme-wiki .cal-nav-btn`, `.cal-today-btn`, panel buttons
1572
1573### Wiki Theme Section Headers
1574- Today: `__link__` background (accent/link color)
1575- Tomorrow: `__background_alt__` background (alternate background)
1576- Important: `__border__` background (border color)
1577- Each section now has a distinct color from the template palette
1578
1579## Version 6.3.7 (2026-02-10) - WIKI THEME CHECKBOX FIX
1580
1581### Fix
1582- Wiki theme checkbox override changed from `border-color` to full `border: 2px solid` shorthand
1583- Properly overrides the base rule which uses `border` shorthand
1584- Hover state also uses full shorthand
1585
1586## Version 6.3.6 (2026-02-10) - WIKI THEME CHECKBOX BORDER COLOR
1587
1588### Fix
1589- Wiki theme unchecked checkboxes now use `--border-main` (template's `__border__` color) for border
1590- Checked state fills with border color
1591- Hover state uses border color
1592- Applied to calendar, sidebar, and eventlist containers
1593
1594## Version 6.3.5 (2026-02-10) - WIKI THEME: ALLOW DARK READER ON HEADERS
1595
1596### Fix
1597- Wiki theme section headers (Today/Tomorrow/Important) no longer use `!important` or `-webkit-text-fill-color`
1598- Dark Reader can now freely adjust background, text color, and borders on wiki theme headers
1599- Clicked-day panel header and section border-left also unlocked for wiki theme
1600- All other themes (matrix/purple/pink/professional) retain full Dark Reader protection
1601
1602## Version 6.3.4 (2026-02-10) - WIKI THEME: BORDER COLOR FOR HEADERS & BADGES
1603
1604### Wiki Theme Color Remapping
1605- `border` (accent color) now maps to template's `__border__` instead of `__link__`
1606- This affects: section headers (Today/Tomorrow/Important), badges (TODAY, namespace), sidebar widget border, clicked-day panel, `--border-main` CSS variable
1607- `text_bright` still maps to `__link__` for link text and accent text
1608- Section headers all use the same `__border__` color for consistent appearance
1609- Updated COLOR_SCHEME mapping documentation
1610
1611## Version 6.3.3 (2026-02-10) - WIKI THEME SECTION HEADER TEXT COLOR
1612
1613### Fix
1614- Wiki theme Today/Tomorrow/Important section header text now uses `$themeStyles['text_primary']` (mapped from template's `__text__` color) instead of hardcoded white
1615- Clicked-day panel header text also uses template text color for wiki theme
1616- Professional theme remains white text on blue headers
1617
1618## Version 6.3.2 (2026-02-10) - FIX THEME NOT UPDATING ON SIDEBAR EVENTLIST
1619
1620### Bug Fix
1621- Added `$renderer->nocache()` to the render function
1622- DokuWiki was caching the rendered sidebar HTML, so theme changes made in admin were never reflected until the page was manually edited
1623- Now all calendar/eventlist/eventpanel outputs are rendered fresh on each page load, picking up the current theme from `calendar_theme.txt`
1624
1625## Version 6.3.1 (2026-02-10) - EVENTLIST THEMING
1626
1627### {{eventlist}} Theme Support
1628- Eventlist containers now receive theme class (`eventlist-theme-matrix`, etc.) and full CSS variable injection
1629- Dark themes get themed border + glow, light themes get subtle border
1630- Container background set from `$themeStyles['bg']` with `!important`
1631
1632### Eventlist CSS Theme Rules (all 3 dark themes)
1633- Title, header, time, date, body, links, strong, code, namespace badge, empty state
1634- Today header, clock, date — all with `color` + `-webkit-text-fill-color` `!important`
1635- Item borders, section backgrounds, code block backgrounds
1636- Full Dark Reader protection via same inline+CSS approach as calendar/sidebar
1637
1638## Version 6.3.0 (2026-02-10) - DARK READER COMPATIBILITY & COMPLETE THEMING
1639
1640### Dark Reader Browser Extension Compatibility
1641All dark themes (Matrix, Purple, Pink) now render correctly when the Dark Reader browser extension is active. The approach uses targeted inline `!important` styles and `-webkit-text-fill-color` overrides — no page-wide locks, no blanket CSS resets, no filter manipulation.
1642
1643**Protected elements:**
1644- Section headers (Today/Tomorrow/Important) — background, text color, text-fill-color
1645- Clicked-day panel header — background, text color, close button
1646- All badges (TODAY, PAST DUE, namespace, panel namespace, eventlist-simple) — background, text, text-fill-color
1647- Event titles, meta, descriptions — color with !important via CSS
1648- Day numbers, nav buttons, calendar day headers — color with !important via CSS
1649- System status bars — inline background !important on tracks and fills
1650- System tooltips — background, border-color, text color all set via setProperty with !important
1651- Section left border bars — border-left with !important
1652- Event color indicator bars — border-left-color with !important
1653- Sidebar section event text (Purple and Pink themes)
1654
1655### Complete CSS Variable Audit (41 conversions in v6.1.1)
1656- All remaining hardcoded colors in style.css converted to CSS variable references
1657- Calendar borders, text colors, backgrounds, input focus shadows, accent borders
1658- Only legitimate hardcodes remain (keyframe animations, theme-specific override blocks)
1659
1660### Semantic Color System
1661- New CSS variables: `--pastdue-color`, `--pastdue-bg`, `--pastdue-bg-strong`, `--pastdue-bg-light`
1662- New CSS variables: `--tomorrow-bg`, `--tomorrow-bg-strong`, `--tomorrow-bg-light`
1663- Injected into all 3 CSS var blocks (full calendar, event panel, sidebar widget)
1664- Today/Tomorrow/Important section colors now theme-derived instead of hardcoded
1665
1666### Section Headers Fully Themed
1667- Today/Tomorrow/Important headers use theme accent colors instead of fixed green/orange/purple
1668- Matrix: bright/standard/dim green, Purple: bright/standard/dim purple, Pink: hot/medium/light pink
1669- Professional: blue shades, Wiki: template-derived colors
1670- Dark theme headers use dark background color for text contrast
1671
1672### Pink Theme Enhancements
1673- **Heart today indicator** — day number displayed inside a ♥ with hot pink glow, centered via inline-flex, `pink-heart-beat` animation with realistic double-beat pulse
1674- **Firework button hover** — `pink-firework-burst` keyframe animation with multi-point radiating box-shadows, scale/brightness effects on hover, instant flash on click
1675- **Checkbox glow** — hot pink border with ambient glow, hover intensifies, checked fills with glow
1676
1677### All Theme Checkbox Theming
1678- Matrix: bright green border + green glow, Purple: purple border + purple glow
1679- Pink: hot pink border + pink glow (with enhanced ambient effect)
1680- Hover scales 1.1x with intensified glow on all themes
1681- Checked state fills with theme accent color + outer glow
1682
1683### System Tooltips Themed
1684- Both tooltip functions use theme-derived colors from `$themeStyles`
1685- Green tooltip: `text_bright`, Purple: `border`, Orange: `text_primary`
1686- Background from `$themeStyles['bg']`, divider borders use theme accent colors
1687- All properties set with `style.setProperty(prop, value, "important")`
1688
1689### Namespace Filter Badge Cleanup
1690- Removed inline namespace badge from event side panel header
1691- Filter indicator bar ("Filtering: namespace ✕") retained and working
1692- AJAX-based namespace filtering fully functional via onclick handlers
1693
1694## Version 6.1.0 (2026-02-10) - TODAY INDICATOR, BUTTON HOVER & CHECKBOXES
1695
1696### Today Indicator
1697- **Added:** Today's day number now shows as a filled circle with theme accent color background and contrasting text (like Google Calendar's today indicator)
1698- **Added:** Today cell has `--cell-today-bg` background AND a visible inset border glow on hover using `--border-main`
1699- **Added:** `.day-num` now uses `--text-primary` for color instead of relying on browser default
1700
1701### Button Hover/Click Theming
1702- **Fixed:** All buttons now use `filter: brightness(1.3)` on hover for a visible glow effect across all themes
1703- **Fixed:** All buttons use `filter: brightness(0.85)` on click/active for a press-down darkening effect
1704- **Fixed:** Cal nav buttons (‹/›), Today button, +Add Event button, panel nav/today/add buttons, dialog Save/Cancel buttons, month picker Go/Cancel buttons, popup + Add Event button — ALL now have visible themed hover/click feedback with shadow
1705- **Removed:** Generic `opacity: 0.9` hover which was barely visible on dark themes
1706
1707### Checkboxes Themed
1708- **Added:** Custom checkbox styling for `.task-checkbox` — uses `appearance: none` with themed border (`--border-main`), hover glow, and filled accent background when checked with ✓ mark
1709- **Added:** `accent-color: var(--text-bright)` on all dialog checkboxes (task, recurring) for consistent theme coloring
1710
1711### Form Input Text
1712- **Fixed:** `.input-sleek` now has `color: var(--text-primary)` — form text is visible on dark themes
1713- **Added:** `::placeholder` styling for inputs/textareas using `--text-dim`
1714
1715## Version 6.0.9 (2026-02-09) - FORM TEXT, CELL HOVER & GLOW TUNING
1716
1717### Form Input Text Fix
1718- **Fixed:** Form input text (`input-sleek`, `textarea-sleek`, `select`) had no `color` property — browser defaulted to black, invisible on dark themes. Now uses `var(--text-primary)`.
1719- **Added:** Themed placeholder text (`::placeholder`) for inputs/textareas
1720
1721### Button & Cell Hover Theming
1722- **Added:** Calendar day cells (`.cal-day`) now have a themed hover effect — background shifts to `--cell-today-bg` with an inset border glow using `--border-main`
1723- **Improved:** Nav buttons (`◄`/`►`) and Today button hover now show a themed glow + scale effect instead of just opacity change
1724- **Added:** Active (click) state for nav/today buttons with scale-down feedback
1725- **Improved:** Month picker hover now also shows a subtle theme shadow
1726
1727### Glow Reduced to 1px for Matrix/Purple
1728- Matrix and purple text glow reduced from 2px to 1px across: event titles, descriptions, meta, links, sidebar day numbers, sidebar event titles, sidebar dates
1729- Matrix clock pulse animation reduced from 6px/10px+15px to 2px/4px+6px
1730- Weather text glow reduced to 1px, clock to 2px
1731- Pink remains at 2px (barely noticeable)
1732
1733## Version 6.0.8 (2026-02-09) - LINKS, GLOW CONSISTENCY & PINK TONE-DOWN
1734
1735### Links Themed
1736- **Added:** `.cal-link` CSS class — all links rendered via `renderDescription()` now pick up theme accent color via `--text-bright`
1737- **Fixed:** Sidebar widget links (`a.cal-link`) inherit theme colors
1738- **Fixed:** Event list widget description links (`eventlist-widget-desc a`) use CSS vars
1739- **Fixed:** Simple event list body links/strong/code all themed
1740
1741### Text Glow Consistency
1742- **Added:** Subtle `text-shadow: 0 0 2px` glow on event titles, meta, and descriptions for all three dark themes (matrix, purple, pink) in the main calendar and event panel
1743- **Added:** Subtle link glow on dark themes
1744- **Added:** Matrix and purple now get the same barely-visible text glow that pink had on sidebar week grid day numbers and event titles
1745
1746### Pink Glow Toned Down
1747- **Reduced:** Sidebar today header box-shadow from `0 0 10px 0.4` to `0 0 6px 0.25`
1748- **Reduced:** Day number sparkle animation from 3px/6px+10px to 2px/3px
1749- **Reduced:** Today cell shimmer from 3px+5px / 8px+12px to 2px+3px / 4px+6px
1750- **Reduced:** Event bar glow pulse from 2px/4px+6px to 1px/2px+3px
1751- **Reduced:** Today hover glow from 10px+15px to 5px+8px
1752- **Reduced:** Event item glow from 2px/5px to 1px/3px
1753- **Reduced:** Calendar container glow from 8px to 5px
1754
1755### Other
1756- **Themed:** Sidebar weather, date, and clock text colors and glow via CSS vars
1757
1758## Version 6.0.7 (2026-02-09) - BADGES, BUTTONS & CONFLICT THEMING
1759
1760- **Fixed:** Namespace badges (`.namespace-badge`, `.event-namespace-badge`, `.panel-ns-badge`, standalone header badge) — all now use theme accent colors instead of hardcoded green/blue
1761- **Fixed:** TODAY badge uses `--border-main` for background instead of hardcoded purple
1762- **Fixed:** Conflict alert badge (`⚠️`) uses `--border-main` background and `--text-bright` border — matches theme accent
1763- **Fixed:** Conflict tooltip header background now set inline from theme vars (tooltip is appended to body, can't inherit CSS vars)
1764- **Fixed:** Conflict tooltip body items use themed text and border colors
1765- **Fixed:** Month picker Go/Cancel buttons themed (`--text-bright` for save, `--cell-bg` for cancel)
1766- **Fixed:** Calendar header month/year hover uses `--cell-today-bg` background
1767- **Fixed:** Inline search input border uses `--border-color`
1768- **Fixed:** Event list header border uses `--border-color`
1769
1770## Version 6.0.6 (2026-02-09) - COMPLETE TEXT THEMING
1771
1772- **Fixed:** Calendar header month/year title had hardcoded dark color — now uses `--text-primary`
1773- **Fixed:** Month/year picker hover used hardcoded gray background and green text — now uses `--cell-today-bg` and `--text-bright`
1774- **Fixed:** Event list items (titles, meta, descriptions, links, code blocks, bold text) — all now theme-aware via CSS vars
1775- **Fixed:** Completed/past event states used hardcoded grays — now use `--cell-bg`, `--text-dim`, `--cell-today-bg`
1776- **Fixed:** Scrollbar track/thumb colors now use theme vars
1777- **Fixed:** Namespace filter indicator (background, label, badge, close button) — all themed
1778- **Fixed:** Panel standalone month picker hover and namespace badge — themed
1779- **Fixed:** Calendar header border-bottom — now uses `--border-color`
1780
1781## Version 6.0.5 (2026-02-09) - THEMED BORDERS & EVENT PANEL
1782
1783- **Added:** Theme-colored border and glow for calendar container on matrix, purple, and pink themes — matches the sidebar widget's `2px solid` + `box-shadow` glow style. Professional and wiki themes unchanged (keep subtle 1px gray border).
1784- **Added:** Theme-colored border and glow for event panel (`{{eventpanel}}`) on dark themes using `[data-theme]` attribute selectors
1785- **Themed:** Event panel header (nav buttons, month title, today button, search input, add button) — all now use CSS vars
1786- **Themed:** Panel standalone header background and border
1787
1788## Version 6.0.4 (2026-02-09) - FULL DIALOG THEMING
1789
1790- **Fixed:** Day cell click popup (day-popup) used hardcoded white/gray colors — now fully theme-aware using CSS variables
1791- **Fixed:** Event add/edit dialog (dialog-content-sleek) had hardcoded white background and blue header — now uses theme colors
1792- **Fixed:** Month picker dialog had hardcoded white background and dark text — now themed
1793- **Fixed:** Popup event items, titles, times, descriptions, footer, add-event button, close button — all now use CSS vars with sensible fallbacks
1794- **Fixed:** Form elements (field labels, inputs, checkboxes, recurring options, color pickers) — all reference theme CSS vars
1795- **How it works:** `propagateThemeVars()` copies CSS variables from the calendar container to dialogs/popups (which are `position:fixed` or appended to `document.body`). All CSS selectors now reference these variables with fallbacks for graceful degradation.
1796
1797## Version 6.0.3 (2026-02-09) - MOVE IMPORTANT NAMESPACES TO MANAGE TAB
1798
1799- **Moved:** Important Namespaces section from Outlook Sync tab to Manage Events tab (between Events Manager and Cleanup sections)
1800- **Changed:** Section header color from purple (#9b59b6) to green (#00cc07) to match other Manage tab sections
1801- **Added:** Dedicated Save button and `save_important_namespaces` action handler — setting is now independent of Outlook config save
1802- **Fixed:** Saving Outlook config no longer overwrites important namespaces with the default value
1803
1804## Version 6.0.2 (2026-02-09) - FIREFOX DAY HEADER FIX
1805
1806- **Fixed:** In Firefox, the SMTWTFS day-of-week header row was rendering at the same height as calendar day cells (58px instead of 22px). Firefox ignores `max-height` on `<th>` table cells per CSS spec. Replaced `<thead><tr><th>` with a CSS grid `<div>` outside the table, making header height fully independent of table cell sizing. Works consistently across Chrome, Firefox, Safari, and Edge.
1807
1808## Version 6.0.1 (2026-02-09) - THEME PARAMETER FIX
1809
1810- **Fixed:** `theme=wiki` (and all `theme=` parameters) had no effect — all three render functions (`renderCompactCalendar`, `renderEventPanelOnly`, `renderSidebarWidget`) were ignoring the syntax parameter and always reading the admin global default via `getSidebarTheme()`
1811- **Fixed:** `renderEventDialog` also ignored theme context — now receives theme from its caller
1812- **How it works now:** `{{calendar theme=wiki}}`, `{{eventlist sidebar theme=purple}}`, `{{eventpanel theme=professional}}` all correctly apply the specified theme. The admin-configured default is used as fallback only when no `theme=` parameter is present.
1813
1814
1815## Version 6.0.0 (2026-02-09) - CODE AUDIT & v6 RELEASE
1816
1817- **Audited:** All PHP files (syntax.php, action.php, admin.php, sync_outlook.php) — balanced braces confirmed
1818- **Audited:** calendar-main.js (2,840 lines) — Node syntax check passed, 44 global functions verified
1819- **Audited:** style.css (3,218 lines) — balanced braces confirmed
1820- **Audited:** All admin manage tab action handlers verified functional (13 actions)
1821- **New:** Fresh README.md for GitHub with complete documentation
1822- **Includes all v5.5.x fixes:**
1823  - Delta sync for Outlook (hash-based change tracking, O(changes) not O(total))
1824  - Wiki theme sidebar section headers: distinct colors, no glow, themed day-click panel
1825  - Conflict badges on past events after AJAX navigation
1826  - Admin panel: green cleanup header, fixed broken CSS, endTime field name, cache clearing for all mutations, empty file cleanup, dead code removal
1827
1828## Version 5.5.9 (2026-02-09) - ADMIN MANAGE TAB CLEANUP
1829
1830- **Fixed:** Cleanup Old Events section header now green (#00cc07) to match all other section headers
1831- **Fixed:** Recurring stat card had broken CSS from `$colors['bg'] . '3e0'` concatenation — now uses proper `#fff3e0`
1832- **Fixed:** Same broken CSS pattern in Outlook Sync tab log warning
1833- **Fixed:** `editRecurringSeries` wrote `end_time` instead of correct `endTime` field name
1834- **Fixed:** `editRecurringSeries` used uninitialized `$firstEventDate` variable — now properly declared
1835- **Fixed:** `moveEvents` and `moveSingleEvent` could crash if event date key didn't exist in JSON — added `isset()` check
1836- **Fixed:** `moveSingleEvent` now cleans up empty date keys and deletes empty files after moving
1837- **Fixed:** `deleteRecurringSeries` now cleans up empty date keys and deletes empty JSON files
1838- **Fixed:** Export version was hardcoded as '3.4.6' — now reads dynamically from plugin.info.txt
1839- **Added:** `clearStatsCache()` helper method — all 11 mutation functions now properly clear the event stats cache
1840- **Removed:** Dead `move_events` action handler (all forms use `move_selected_events`)
1841- **Removed:** `console.log` debug statements from `sortRecurringTable` and `editRecurringSeries`
1842- **Removed:** Stale "NEW!" comment from Events Manager section
1843
1844## Version 5.5.8 (2026-02-09) - DELTA SYNC & WIKI THEME SIDEBAR POLISH
1845
1846- **Added:** Outlook sync now uses hash-based delta tracking — only new, modified, or deleted events hit the API
1847- **Added:** computeEventHash() hashes all sync-relevant fields (title, description, time, date, color, namespace, task status)
1848- **Added:** Sync state v2 format stores {outlookId, hash} per event; auto-migrates from v1 on first run
1849- **Added:** Delta analysis summary shows new/modified/unchanged/deleted counts before syncing
1850- **Changed:** Unchanged events are completely skipped (zero API calls) — O(changes) instead of O(total)
1851- **Changed:** Removed per-run duplicate scan (was re-querying every event); use --clean-duplicates when needed
1852- **Changed:** Wiki theme sidebar section headers now use distinct colors: orange (Today), green (Tomorrow), purple (Important)
1853- **Fixed:** Wiki theme sidebar section headers no longer have colored glow — clean shadow instead
1854- **Fixed:** Wiki theme week grid day-click panel header now uses accent color with white text
1855- **Fixed:** Removed invalid var(--__...__) CSS syntax from inline styles (only works in CSS files, not HTML attributes)
1856
1857## Version 5.5.7 (2026-02-09) - WIKI THEME SIDEBAR POLISH
1858
1859- **Fixed:** Sidebar Today/Tomorrow/Important headers now use three distinct colors (orange/green/purple) instead of similar greys
1860- **Fixed:** Sidebar section headers no longer glow on wiki theme (clean shadow like professional)
1861- **Fixed:** Week grid day-click panel header now uses theme accent color with white text instead of grey background
1862- **Fixed:** Removed invalid var(--__...__) CSS variable syntax from inline styles (DokuWiki replacements only work in CSS files)
1863- **Changed:** Wiki theme section header text now white for readability on colored backgrounds
1864- **Changed:** Week grid JS theme colors now use actual $themeStyles values
1865
1866## Version 5.5.6 (2026-02-09) - FIX CONFLICT BADGES ON PAST EVENTS AFTER AJAX
1867
1868- **Fixed:** Conflict badges now render on past events in JS rebuild path (were only in the future events branch)
1869
1870## Version 5.5.5 (2026-02-09) - FIX SIDEBAR CONFLICT TOOLTIP POSITIONING
1871
1872- **Fixed:** Sidebar widget conflict tooltips now display next to the badge instead of upper-left corner
1873- **Fixed:** Week grid conflict tooltips also fixed (same issue)
1874- **Changed:** All conflict badges now use unified showConflictTooltip() system with base64-encoded data
1875- **Removed:** data-tooltip CSS pseudo-element approach for conflict badges (replaced with JS tooltip)
1876
1877## Version 5.5.4 (2026-02-09) - FIX PAST EVENT EXPAND ON FIRST LOAD
1878
1879- **Fixed:** Past events now expand on click from initial page load (PHP-rendered items were missing onclick="togglePastEventExpand(this)" handler that the JS-rebuilt version had)
1880
1881## Version 5.5.3 (2026-02-09) - FIX CONFLICT TOOLTIP THEME COLORS
1882
1883- **Fixed:** Conflict tooltip now finds calendar container even when badge is inside day popup (appended to body)
1884- **Fixed:** Empty CSS variable values no longer produce invisible text — fallback defaults applied when var returns empty string
1885
1886## Version 5.5.2 (2026-02-09) - FIX CONFLICT TOOLTIP JSON PARSING
1887
1888- **Fixed:** Conflict tooltip data now base64-encoded to eliminate JSON parse errors from attribute quote escaping
1889- **Fixed:** Removed double htmlspecialchars encoding on conflict titles in PHP (was escaping titles then re-escaping the JSON)
1890- **Changed:** Both PHP and JS conflict badge rendering now use base64 for data-conflicts attribute
1891- **Changed:** showConflictTooltip decodes base64 first, falls back to plain JSON for compatibility
1892
1893## Version 5.5.1 (2026-02-09) - AJAX ROBUSTNESS & DIALOG THEMING
1894
1895- **Fixed:** Conflict tooltip badges now work after AJAX month navigation via event delegation
1896- **Fixed:** All document-level event listeners guarded against duplicate attachment from multiple script loads
1897- **Fixed:** showConflictTooltip closest() selector now matches actual container IDs (cal_, panel_, sidebar-widget-)
1898- **Fixed:** Description textarea in add/edit dialog now 2 lines tall instead of 1
1899- **Added:** Event delegation for conflict badge mouseenter/mouseleave (capture phase) survives DOM rebuilds
1900- **Added:** ESC key now also closes day popups and conflict tooltips
1901- **Changed:** Namespace click filter handler wrapped in guard to prevent duplicate binding
1902
1903## Version 5.5.0 (2026-02-09) - CSS VARIABLE REFACTOR & THEME CONSISTENCY
1904
1905- **Refactored:** All theming now driven by 15 CSS custom properties injected per calendar instance
1906- **Refactored:** Removed ~85 inline styles from syntax.php and ~41 from calendar-main.js
1907- **Refactored:** style.css is now the single source of truth for all visual styling
1908- **Fixed:** Day popup (click cell) now fully themed — CSS vars propagated from container
1909- **Fixed:** Add/Edit event dialog now themed in all contexts (main calendar, eventlist panel, sidebar widget)
1910- **Fixed:** Popup footer and "+ Add Event" button were using inline themeStyles — now use CSS vars
1911- **Added:** CSS variable injection for {{eventlist panel}} containers
1912- **Added:** CSS variable injection for {{eventlist sidebar}} widget containers
1913- **Added:** propagateThemeVars() helper ensures dialogs/popups always get theme regardless of DOM position
1914- **Added:** Wiki template mapping reads __link__ as accent color from style.ini
1915- **Added:** Detailed CSS variable reference table in style.css header comment
1916- **Added:** Detailed style.ini → CSS variable mapping documentation in syntax.php
1917- **Changed:** Conflict tooltip reads CSS vars via getComputedStyle instead of data-themeStyles
1918- **Changed:** Admin changelog now uses paginated timeline viewer instead of tiny scrolling div
1919- **Removed:** Dark Reader MutationObserver compatibility (CSS vars natively compatible)
1920- **Removed:** $isWikiTheme branching from PHP render path
1921
1922## Version 5.3.6 (2026-02-09) - HEARTS + CSS BACKGROUND FIX! ��
1923
1924### �� Added: Hearts in Explosions!
1925- **Added:** 8-12 pink hearts in each click explosion
1926- **Added:** Random sizes (12-28px) and directions
1927- **Result:** Extra love in every click! ��
1928
1929### �� Fixed: Background CSS Property for Dark Mode Readers
1930- **Fixed:** Added `background: transparent` to CSS (was completely removed)
1931- **Fixed:** Now CSS readers can detect and modify background property
1932- **Why:** Inline styles override transparent, but CSS readers can now see the property
1933- **Result:** Dark mode plugins can now change calendar backgrounds!
1934
1935### The CSS Problem
1936
1937**Why backgrounds weren't changing with dark mode readers**:
1938
1939**Before (v5.3.5)**:
1940```css
1941.calendar-compact-grid tbody td {
1942    /* background removed - set via inline style */
1943    border: 1px solid...
1944}
1945```
1946
1947**Problem**: CSS property doesn't exist!
1948- Dark mode readers look for `background` property in CSS
1949- Can't override what doesn't exist
1950- Inline styles work, but readers can't modify them
1951
1952**After (v5.3.6)**:
1953```css
1954.calendar-compact-grid tbody td {
1955    background: transparent;  /* Now exists! */
1956    border: 1px solid...
1957}
1958```
1959
1960**Solution**:
1961- Property exists in CSS
1962- Dark mode readers can override it
1963- Inline styles still override transparent
1964- Everyone wins!
1965
1966### What's Fixed
1967
1968**Elements now have background property**:
1969- `.calendar-compact-grid tbody td` ✓
1970- `.calendar-compact-grid tbody td:hover` ✓
1971- `.event-compact-item` ✓
1972- `.event-compact-item:hover` ✓
1973
1974**How it works**:
19751. CSS sets `background: transparent` (default)
19762. Inline styles set actual color (overrides transparent)
19773. Dark mode readers can override CSS property
19784. Works for everyone!
1979
1980### Hearts in Explosion
1981
1982**Click anywhere → Hearts explode!**
1983
1984**Heart details**:
1985- Count: 8-12 per explosion (random)
1986- Size: 12-28px (random variety)
1987- Emoji: �� (pink heart)
1988- Direction: Random 360°
1989- Speed: 60-140px travel
1990- Duration: 0.8-1.2s
1991- z-index: 9999999 (always visible)
1992
1993**Combined with**:
1994- 25 glowing particles
1995- 40 pixel sparkles
1996- Bright flash
1997- **Total: 73-77 elements!**
1998
1999### Visual Result
2000
2001**Click explosion**:
2002```
2003    �� ✦ • ✦ ��
2004  �� •         • ��
2005✦  •     ��!     •  ✦
2006  �� •         • ��
2007    �� ✦ • ✦ ��
2008
2009Hearts + Particles + Pixels!
2010```
2011
2012**Dark mode now works**:
2013```css
2014/* Dark mode reader can now do this: */
2015.calendar-compact-grid tbody td {
2016    background: #000 !important;  /* Works! */
2017}
2018```
2019
2020### Why Transparent Works
2021
2022**CSS Cascade**:
20231. CSS: `background: transparent` (lowest priority)
20242. Inline style: `background: #f5f5f5` (overrides CSS)
20253. Dark mode CSS: `background: #000 !important` (overrides inline)
2026
2027**Perfect solution!** ✓
2028
2029## Version 5.3.5 (2026-02-09) - PARTICLES ABOVE DIALOGS! ��
2030
2031### �� Fixed: Particles Now Appear Above All Dialogs!
2032- **Fixed:** Increased z-index to 9999999 for all particles
2033- **Fixed:** Particles now visible above event dialogs, month picker, etc.
2034- **Result:** Cursor effects and explosions always visible!
2035
2036### The Z-Index Problem
2037
2038**Before (v5.3.4)**:
2039- Particles: z-index 9999
2040- Dialogs: z-index 10000-999999
2041- **Particles hidden behind dialogs!**
2042
2043**After (v5.3.5)**:
2044- Particles: z-index 9999999
2045- Trail: z-index 9999998
2046- Pixels: z-index 9999997
2047- **Particles ALWAYS on top!**
2048
2049### What's Fixed
2050
2051✅ **Main particles** (explosion orbs)
2052✅ **Cursor trail** (glowing dots)
2053✅ **Pixel sparkles** (tiny bright stars)
2054✅ **Flash effect** (click burst)
2055
2056**All now appear above**:
2057- Event dialog popups
2058- Month picker
2059- Day popups
2060- Any modal overlays
2061
2062### Visual Result
2063
2064**Moving cursor over dialog**:
2065```
2066┌─────────────────────┐
2067│  Event Dialog       │
2068│  ✦ • ✦             │  ← Sparkles visible!
2069│    →  ✦             │  ← Cursor trail visible!
2070│  • ✦ •              │
2071└─────────────────────┘
2072```
2073
2074**Clicking on dialog**:
2075```
2076┌─────────────────────┐
2077│  ✦ • ✦ • ✦         │
2078│ •     ��!     •    │  ← Explosion visible!
2079│  ✦ • ✦ • ✦         │
2080└─────────────────────┘
2081```
2082
2083**Perfect visibility everywhere!** ✨
2084
2085## Version 5.3.4 (2026-02-09) - THEMED MONTH PICKER + DIALOG CURSOR FIX
2086
2087### �� Fixed: Month Picker Now Themed!
2088- **Fixed:** Jump to Month dialog now uses theme colors
2089- **Fixed:** Dialog background, borders, text all themed
2090- **Fixed:** Select dropdowns use theme colors
2091- **Fixed:** Buttons use theme accent colors
2092- **Result:** Month picker matches calendar theme!
2093
2094### �� Fixed: Cursor Effects Work in Dialogs!
2095- **Fixed:** Cursor trail now works when hovering over dialogs
2096- **Fixed:** Click explosions work when clicking inside dialogs
2097- **Technical:** Changed to capture phase event listeners
2098- **Result:** Effects work EVERYWHERE now!
2099
2100### Month Picker Theming
2101
2102**Before (v5.3.3)**:
2103- White background (hardcoded)
2104- Black text (hardcoded)
2105- No theme integration
2106- Looked out of place
2107
2108**After (v5.3.4)**:
2109- Dialog background: `theme.bg`
2110- Dialog border: `theme.border`
2111- Text color: `theme.text_primary`
2112- Dropdowns: `theme.cell_bg` + `theme.text_primary`
2113- Cancel button: `theme.cell_bg`
2114- Go button: `theme.border` (accent color)
2115
2116**Fully integrated!** ✅
2117
2118---
2119
2120### Theme Examples
2121
2122**Matrix Theme**:
2123```
2124┌─────────────────────────┐
2125│ Jump to Month           │ ← Dark bg, green border
2126│ [February ▼] [2026 ▼]  │ ← Dark dropdowns
2127│ [Cancel] [Go]           │ ← Green "Go" button
2128└─────────────────────────┘
2129```
2130
2131**Pink Theme**:
2132```
2133┌─────────────────────────┐
2134│ Jump to Month           │ ← Dark bg, pink border
2135│ [February ▼] [2026 ▼]  │ ← Dark dropdowns
2136│ [Cancel] [Go]           │ ← Pink "Go" button
2137└─────────────────────────┘
2138With sparkle effects! ✨
2139```
2140
2141**Professional Theme**:
2142```
2143┌─────────────────────────┐
2144│ Jump to Month           │ ← Clean bg, blue border
2145│ [February ▼] [2026 ▼]  │ ← Clean dropdowns
2146│ [Cancel] [Go]           │ ← Blue "Go" button
2147└─────────────────────────┘
2148```
2149
2150---
2151
2152### Dialog Cursor Fix
2153
2154**The Problem**:
2155Dialogs use `event.stopPropagation()` to prevent clicks from closing them. This blocked cursor effects!
2156
2157**The Solution**:
2158Use **capture phase** event listeners:
2159```javascript
2160// Before (bubbling phase)
2161document.addEventListener('click', handler)
2162
2163// After (capture phase)
2164document.addEventListener('click', handler, true)
21652166                                   Capture phase!
2167```
2168
2169**Capture phase runs BEFORE stopPropagation!**
2170
2171---
2172
2173### Now Works Everywhere
2174
2175✅ **Calendar area**
2176✅ **Event dialogs**
2177✅ **Month picker dialog**
2178✅ **Day popup dialogs**
2179✅ **Anywhere on screen**
2180
2181**No more blocked effects!** ��
2182
2183---
2184
2185### Technical Details
2186
2187**Event phases**:
2188```
21891. Capture phase   ← We listen here now!
21902. Target phase
21913. Bubbling phase  ← stopPropagation blocks this
2192```
2193
2194**By using capture phase**:
2195- Events caught before stopPropagation
2196- Works in all dialogs
2197- No conflicts with dialog logic
2198
2199---
2200
2201### All Dialogs Checked
2202
2203✅ **Month picker** - Now themed!
2204✅ **Event dialog** - Already themed
2205✅ **Day popup** - Already themed
2206
2207**Everything consistent!** ��
2208
2209---
2210
2211## Version 5.3.3 (2026-02-09) - TINY NEON PIXEL SPARKLES! ✨
2212
2213### ✨ Added: Bright Neon Pixel Sparkles Everywhere!
2214- **Added:** Tiny 1-2px bright pixel sparkles alongside cursor trail
2215- **Added:** 40 pixel sparkles in click explosions
2216- **Changed:** Cursor effects now work on ENTIRE SCREEN (not just calendar)
2217- **Result:** Maximum sparkle effect! ��
2218
2219### Tiny Pixel Sparkles
2220
2221**3-6 tiny bright pixels appear with each cursor movement!**
2222
2223**Characteristics**:
2224- Size: 1-2px (single pixel appearance!)
2225- Colors: Bright neon whites and pinks
2226  - Pure white (#fff) - 40% chance
2227  - Hot pink (#ff1493)
2228  - Pink (#ff69b4)
2229  - Light pink (#ffb6c1)
2230  - Soft pink (#ff85c1)
2231- Glow: Triple-layer shadow (intense!)
2232- Spawn: Random 30px radius around cursor
2233- Animations:
2234  - 50% twinkle in place
2235  - 50% float upward
2236
2237**Creates a cloud of sparkles around your cursor!**
2238
2239---
2240
2241### Click Explosion Enhanced
2242
2243**Now with 40 EXTRA pixel sparkles!**
2244
2245**Click anywhere → BIG BOOM**:
2246- 25 main glowing particles (6-10px)
2247- **40 tiny pixel sparkles (1-2px)** ← NEW!
2248- Bright white flash
2249- Total: 65+ visual elements!
2250
2251**Pixel sparkles in explosion**:
2252- Shoot outward in all directions
2253- Random distances (30-110px)
2254- Multiple bright colors
2255- Some twinkle, some explode
2256- Creates stellar effect!
2257
2258---
2259
2260### Entire Screen Coverage
2261
2262**Effects now work EVERYWHERE!**
2263
2264**Before (v5.3.2)**:
2265- Only inside calendar viewport
2266- Limited to calendar area
2267
2268**After (v5.3.3)**:
2269- Works on entire screen! ✓
2270- Cursor trail follows everywhere
2271- Click explosions anywhere
2272- Used `position: fixed` + `clientX/Y`
2273
2274**Move anywhere on the page for sparkles!**
2275
2276---
2277
2278### Visual Effect
2279
2280**Cursor movement**:
2281```
2282    • ✦ •       ← Tiny pixels
2283  •   ✦   •     ← Glowing trail
2284✦  •  →  •  ✦   ← Cursor
2285  •   ✦   •     ← Mixed sizes
2286    • ✦ •       ← Sparkle cloud
2287```
2288
2289**Click explosion**:
2290```
2291    ✦ • ✦ • ✦
2292  ✦ •         • ✦
2293✦  •    ��!    •  ✦
2294  ✦ •         • ✦
2295    ✦ • ✦ • ✦
2296
229765+ particles total!
2298```
2299
2300---
2301
2302### Sparkle Details
2303
2304**Trail Pixels** (3-6 per movement):
2305- Size: 1-2px
2306- Spawn rate: Every 40ms
2307- Spread: 30px radius
2308- Duration: 0.6-0.8s
2309- 50% twinkle, 50% float
2310
2311**Explosion Pixels** (40 total):
2312- Size: 1-3px
2313- Spread: 30-110px radius
2314- Duration: 0.4-0.8s
2315- All directions
2316- Intense glow
2317
2318**Main Particles** (25 total):
2319- Size: 4-10px
2320- Spread: 50-150px
2321- Full color palette
2322- Original firework effect
2323
2324---
2325
2326### Color Distribution
2327
2328**Pixel sparkles favor white**:
2329- 40% pure white (#fff) - brightest!
2330- 60% pink shades - variety
2331
2332**Creates brilliant sparkle effect!**
2333
2334---
2335
2336### Performance
2337
2338**Still optimized**:
2339- Trail: 30ms throttle
2340- Pixels: 40ms throttle
2341- Auto-cleanup
2342- Hardware accelerated
2343- Smooth 60fps
2344
2345**Lots of sparkles, zero lag!**
2346
2347---
2348
2349### Full-Screen Magic
2350
2351**Pink theme calendar detected**:
2352```javascript
2353if (pink calendar exists) {
2354    Enable effects for ENTIRE SCREEN
2355    Not just calendar area
2356}
2357```
2358
2359**Works everywhere on page!** ✨
2360
2361---
2362
2363## Version 5.3.2 (2026-02-09) - PINK FIREWORKS! ����
2364
2365### �� Changed: Glowing Pink Particles Instead of Emoji Sparkles!
2366- **Removed:** Emoji sparkle images (✨)
2367- **Added:** Glowing pink particle trail following cursor
2368- **Added:** FIREWORKS explosion on click!
2369- **Result:** Beautiful glowing effects, not emoji!
2370
2371### Glowing Cursor Trail
2372
2373**Pink glowing dots follow your cursor!**
2374- Small glowing pink orbs (8px)
2375- Radial gradient glow effect
2376- Multiple box-shadows for depth
2377- Fade out smoothly (0.5s)
2378- Throttled to 30ms for smoothness
2379
2380```
2381    •  •
2382  •  →  •   ← Your cursor
2383    •  •
2384```
2385
2386**Not emoji - actual glowing particles!**
2387
2388---
2389
2390### Click Fireworks! ��
2391
2392**Click anywhere on the calendar → BOOM!**
2393
2394**20 pink particles explode outward!**
2395- Radial burst pattern (360° coverage)
2396- Random speeds (50-150px travel)
2397- 4 shades of pink:
2398  - Hot pink (#ff1493)
2399  - Pink (#ff69b4)
2400  - Light pink (#ff85c1)
2401  - Very light pink (#ffc0cb)
2402- Random sizes (4-10px)
2403- Individual glowing halos
2404- Smooth explosion animation
2405
2406**Plus a bright flash at click point!**
2407- 30px radius glow
2408- Intense pink flash
2409- Fades quickly (0.3s)
2410
2411---
2412
2413### Visual Effect
2414
2415**Cursor movement**:
2416```
24172418      •  •  •
2419   •     →     •  ← Glowing trail
2420      •  •  •
24212422```
2423
2424**Click explosion**:
2425```
2426         •  •  •
2427      •           •
2428   •      BOOM!      •  ← 20 particles
2429      •           •
2430         •  •  •
2431```
2432
2433**All particles glow with pink halos!**
2434
2435---
2436
2437### Particle Details
2438
2439**Trail Particles**:
2440- Size: 8x8px
2441- Color: Pink radial gradient
2442- Shadow: 10px + 20px glow layers
2443- Duration: 0.5s fade
2444- Rate: 30ms throttle
2445
2446**Explosion Particles**:
2447- Size: 4-10px (random)
2448- Colors: 4 pink shades (random)
2449- Shadow: 10px + 20px glow (matches color)
2450- Duration: 0.6-1.0s (random)
2451- Pattern: Perfect circle burst
2452
2453**Flash Effect**:
2454- Size: 30x30px
2455- Color: Bright hot pink
2456- Shadow: 30px + 50px mega-glow
2457- Duration: 0.3s instant fade
2458
2459---
2460
2461### Performance
2462
2463**Optimized for smoothness**:
2464- Trail throttled to 30ms
2465- Auto-cleanup after animations
2466- CSS hardware acceleration
2467- No memory leaks
2468- Smooth 60fps
2469
2470**Won't slow you down!**
2471
2472---
2473
2474### Comparison
2475
2476**Before (v5.3.1)**:
2477- ✨ Emoji sparkle images
2478- Static unicode characters
2479- Limited visual impact
2480
2481**After (v5.3.2)**:
2482- �� Glowing pink particles
2483- Radial gradients + shadows
2484- Beautiful firework explosions
2485- Much more impressive!
2486
2487---
2488
2489### Only Pink Theme
2490
2491**These effects only appear**:
2492- On `.calendar-theme-pink` elements
2493- Other themes unaffected
2494- Pure pink magic! ��
2495
2496---
2497
2498## Version 5.3.1 (2026-02-09) - MYSPACE SPARKLE CURSOR! ✨✨✨
2499
2500### ✨ Added: MySpace-Style Sparkle Trail!
2501- **Added:** Sparkle cursor trail that follows your mouse (pink theme only!)
2502- **Toned down:** Reduced glow effects for better taste
2503- **Added:** Sparkles appear on cell hover
2504- **Added:** Sparkles on event hover (left and right sides!)
2505- **Added:** Sparkles on today's cell corners
2506- **Added:** Sparkles on navigation buttons
2507- **Added:** Sparkles in calendar header
2508- **Result:** Pure nostalgic MySpace magic! ✨
2509
2510### MySpace Sparkle Cursor Trail
2511
2512**The classic effect from 2006!**
2513- Sparkles follow your cursor as you move
2514- Random sizes (12-22px)
2515- Random slight offsets for natural feel
2516- Float up and fade out animation
2517- Throttled to 50ms (smooth, not laggy)
2518- Only on pink theme calendars
2519
2520```
25212522  ✨    ✨
2523✨   →   ✨  (cursor trail)
2524  ✨    ✨
25252526```
2527
2528**Pure nostalgia!**
2529
2530---
2531
2532### Sparkles Everywhere
2533
2534**Calendar cells**:
2535- Hover over any day → ✨ floats up
2536- Smooth 1.5s animation
2537- Centered sparkle
2538
2539**Event items**:
2540- Hover → ✨ on left side
2541- Hover → ✨ on right side
2542- Staggered animations (0.4s delay)
2543- Continuous twinkling
2544
2545**Today's cell**:
2546- ✨ in top-right corner (continuous)
2547- ✨ in bottom-left corner (offset timing)
2548- Always sparkling!
2549
2550**Navigation buttons**:
2551- Hover on < or > → ✨ appears top-right
2552- One-time float animation
2553
2554**Calendar header**:
2555- ✨ on left side (continuous)
2556- ✨ on right side (offset 1s)
2557- Always twinkling
2558
2559---
2560
2561### Toned Down Glows
2562
2563**Before (v5.3.0)**: TOO MUCH GLOW!
2564- 50px shadows
2565- 4-layer effects
2566- Overwhelming
2567
2568**After (v5.3.1)**: Just right!
2569- 8-15px max shadows (subtle)
2570- 2-layer effects
2571- Professional with personality
2572
2573**Glow reductions**:
2574- Today shimmer: 35px → 12px
2575- Today hover: 50px → 15px
2576- Event glow: 18px → 6px
2577- Badge pulse: 25px → 8px
2578- Container glow: 20px → 8px
2579
2580**Much more tasteful!**
2581
2582---
2583
2584### Sparkle Animations
2585
2586**sparkle-twinkle** (0.8s):
2587```
2588Opacity: 0 → 1 → 1 → 0
2589Scale: 0 → 1 → 1 → 0
2590Rotation: 0° → 180° → 360°
2591```
2592
2593**sparkle-float** (1.5s):
2594```
2595Moves up: 0px → -50px
2596Opacity: 0 → 1 → 1 → 0
2597Scale: 0 → 1 → 0.8 → 0
2598```
2599
2600**Pure MySpace magic!** ✨
2601
2602---
2603
2604### Where Sparkles Appear
2605
2606✅ **Cursor trail** (continuous while moving)
2607✅ **Calendar cells** (on hover)
2608✅ **Event items** (on hover, left + right)
2609✅ **Today's cell** (continuous, corners)
2610✅ **Navigation buttons** (on hover)
2611✅ **Calendar header** (continuous, sides)
2612
2613**Sparkles EVERYWHERE!** ✨✨✨
2614
2615---
2616
2617### Performance
2618
2619**Cursor trail**:
2620- Throttled to 50ms
2621- Auto-cleanup after 1s
2622- No memory leaks
2623- Smooth 60fps
2624
2625**CSS animations**:
2626- Hardware accelerated
2627- No JavaScript overhead (except cursor)
2628- Efficient transforms
2629
2630**Won't slow down your browser!**
2631
2632---
2633
2634### Pure Nostalgia
2635
2636**Remember MySpace profiles?**
2637- Glitter graphics ✨
2638- Sparkle cursors ✨
2639- Auto-play music �� (ok, we didn't add that)
2640- Animated GIF backgrounds
2641- Comic Sans everywhere
2642
2643**We brought back the sparkles!** ✨
2644
2645---
2646
2647### Theme Comparison
2648
2649**Other themes**: Professional and clean
2650**Pink theme**: ✨ SPARKLES EVERYWHERE ✨
2651
2652**Only pink theme gets the magic!**
2653
2654---
2655
2656## Version 5.3.0 (2026-02-09) - PINK BLING THEME EFFECTS! ✨��
2657
2658### �� Added: Pink Theme Gets BLING!
2659- **Added:** Shimmering animation for today's cell
2660- **Added:** Sparkling text effect on today's date
2661- **Added:** Glowing pulse for event bars
2662- **Added:** Gradient shimmer on headers
2663- **Added:** Extra glow on hover effects
2664- **Added:** Pulsing urgent badge for past due items
2665- **Result:** Pink theme is now FABULOUS! ✨
2666
2667### Shimmer Effects
2668
2669**Today's Cell**:
2670- Continuous shimmer animation (2 second loop)
2671- Multi-layer glow effect
2672- Pink and hot pink overlapping shadows
2673- Pulses from subtle to intense
2674- Extra sparkle on hover
2675
2676**Today's Date Number**:
2677- Sparkle animation (1.5 second loop)
2678- Text shadow glow effect
2679- Slight scale pulse (100% → 105%)
2680- Pink to hot pink shadow transition
2681
2682### Glow Effects
2683
2684**Event Bars**:
2685- Continuous glow pulse (2 second loop)
2686- Uses event's own color
2687- Adds pink accent glow layer
2688- Creates depth and dimension
2689
2690**Event Items**:
2691- Subtle base glow
2692- Enhanced glow on hover
2693- Slight slide animation on hover
2694- Professional yet playful
2695
2696### Gradient Shimmer
2697
2698**Headers**:
2699- Animated gradient background
2700- 3-color pink gradient flow
2701- Smooth 3-second animation
2702- Creates movement and life
2703- Applies to calendar header and event list header
2704
2705### Badge Effects
2706
2707**TODAY Badge**:
2708- Sparkle animation
2709- Synchronized with today's date
2710- Extra prominence
2711
2712**PAST DUE Badge**:
2713- Urgent pulsing effect (1 second loop)
2714- Orange glow intensifies
2715- Draws attention to urgent items
2716- Faster pulse for urgency
2717
2718### Container Bling
2719
2720**Main Container**:
2721- Multi-layer pink glow
2722- Soft outer shadow
2723- Creates floating effect
2724- Subtle but elegant
2725
2726### Animation Details
2727
2728**pink-shimmer** (2s loop):
2729```
2730Start: Subtle 5px glow
2731Peak:  Intense 35px multi-layer glow
2732End:   Back to subtle
2733```
2734
2735**pink-sparkle** (1.5s loop):
2736```
2737Start: Base glow + scale 1.0
2738Peak:  Intense glow + scale 1.05
2739End:   Back to base
2740```
2741
2742**pink-glow-pulse** (2s loop):
2743```
2744Start: Small glow (3px, 6px)
2745Peak:  Large glow (6px, 12px, 18px)
2746End:   Back to small
2747```
2748
2749**pink-gradient-shimmer** (3s loop):
2750```
2751Gradient flows across element
2752Creates wave effect
2753Smooth continuous motion
2754```
2755
2756**pink-pulse-urgent** (1s loop - faster!):
2757```
2758Start: Orange glow 5px
2759Peak:  Orange glow 25px (intense)
2760End:   Back to 5px
2761```
2762
2763### Visual Experience
2764
2765**Today's Cell**:
2766```
2767┌──┬──┬──┬──┬──┬──┬──┐
2768│  │  │ ✨ │  │  │  │  │  ← Shimmers constantly
2769│  │  │[9]│  │  │  │  │  ← Sparkles
2770│  │  │ ✨ │  │  │  │  │  ← Glows and pulses
2771└──┴──┴──┴──┴──┴──┴──┘
2772```
2773
2774**Event Bars**:
2775```
2776━━━━━━━  ← Glows and pulses
2777━━━━━━━  ← Each bar animated
2778━━━━━━━  ← Creates rhythm
2779```
2780
2781**Headers**:
2782```
2783╔═════════════════════╗
2784║ ~~~~~~~~~~ ║  ← Gradient flows
2785║   February 2026     ║  ← Shimmer effect
2786╚═════════════════════╝
2787```
2788
2789### Theme Comparison
2790
2791**Before (v5.2.8)**:
2792- Pink colors
2793- Static elements
2794- Standard shadows
2795
2796**After (v5.3.0)**:
2797- Pink colors ✓
2798- Animated shimmer ✨
2799- Sparkling effects ��
2800- Glowing pulses ✨
2801- Moving gradients ��
2802- BLING! ��
2803
2804### Performance
2805
2806**All animations**:
2807- Hardware accelerated (transform, opacity)
2808- Smooth 60fps
2809- CSS animations (no JavaScript)
2810- Minimal CPU usage
2811- Disabled in reduced-motion preference
2812
2813### Only for Pink Theme
2814
2815**Effects only apply when**:
2816```css
2817.calendar-theme-pink
2818```
2819
2820**Other themes unaffected**:
2821- Matrix stays Matrix
2822- Professional stays Professional
2823- Purple stays Purple
2824- Wiki stays clean
2825
2826**Pink gets all the bling!** ✨��
2827
2828### Use Cases
2829
2830**Perfect for**:
2831- Celebrating occasions
2832- Fun team calendars
2833- Personal style expression
2834- Standing out
2835- Making calendar time fabulous
2836
2837**Not just pink, but BLING pink!** ��✨
2838
2839## Version 5.2.8 (2026-02-09) - TODAY BOX USES THEME COLORS
2840
2841### �� Fixed: Today's Date Box Now Uses Theme Colors
2842- **Fixed:** Today's day number box now uses theme border color
2843- **Fixed:** Text color adapts to theme (white for dark themes, bg color for light)
2844- **Result:** Today box matches the theme perfectly!
2845
2846### The Issue
2847
2848Today's date had a hardcoded green box:
2849
2850**In style.css**:
2851```css
2852.cal-today .day-num {
2853    background: #008800;  /* Hardcoded green! */
2854    color: white;
2855}
2856```
2857
2858**Didn't adapt to themes at all!**
2859
2860### The Fix
2861
2862**Now uses theme colors**:
2863```php
2864// Today's day number
2865if ($isToday) {
2866    background: $themeStyles['border'],  // Theme's accent color!
2867    color: (professional theme) ? white : bg color
2868}
2869```
2870
2871### Theme Examples
2872
2873**Matrix Theme**:
2874- Box background: `#00cc07` (matrix green)
2875- Text color: `#242424` (dark background)
2876
2877**Purple Theme**:
2878- Box background: `#9b59b6` (purple)
2879- Text color: `#2a2030` (dark background)
2880
2881**Professional Theme**:
2882- Box background: `#4a90e2` (blue)
2883- Text color: `#ffffff` (white text)
2884
2885**Pink Theme**:
2886- Box background: `#ff1493` (hot pink)
2887- Text color: `#1a0d14` (dark background)
2888
2889**Wiki Theme**:
2890- Box background: Template's `__border__` color
2891- Text color: Template's `__background_site__` color
2892
2893### Visual Result
2894
2895**Matrix Theme**:
2896```
2897┌──┬──┬──┬──┬──┬──┬──┐
2898│ 1│ 2│ 3│[4]│ 5│ 6│ 7│
2899└──┴──┴──┴──┴──┴──┴──┘
29002901    Green box (#00cc07)
2902```
2903
2904**Professional Theme**:
2905```
2906┌──┬──┬──┬──┬──┬──┬──┐
2907│ 1│ 2│ 3│[4]│ 5│ 6│ 7│
2908└──┴──┴──┴──┴──┴──┴──┘
29092910    Blue box (#4a90e2)
2911```
2912
2913**Wiki Theme**:
2914```
2915┌──┬──┬──┬──┬──┬──┬──┐
2916│ 1│ 2│ 3│[4]│ 5│ 6│ 7│
2917└──┴──┴──┴──┴──┴──┴──┘
29182919    Template border color
2920```
2921
2922### Implementation
2923
2924**Inline styles added**:
2925- Background uses `$themeStyles['border']` (theme accent)
2926- Text color uses `$themeStyles['bg']` for contrast
2927- Special case: Professional theme uses white text
2928- All with `!important` to override CSS
2929
2930**CSS cleaned up**:
2931- Removed hardcoded `#008800` background
2932- Removed hardcoded `white` color
2933- Kept structural styles (border-radius, font-weight)
2934
2935### Benefits
2936
2937**Theme Consistency**:
2938- Today box matches theme accent color
2939- Proper contrast with background
2940- Professional appearance
2941
2942**Automatic Adaptation**:
2943- Works with all themes
2944- Works with custom wiki template colors
2945- No manual adjustment needed
2946
2947**Visual Harmony**:
2948- Border color used throughout theme
2949- Today box reinforces theme identity
2950- Consistent design language
2951
2952## Version 5.2.7 (2026-02-09) - FIX GRID BACKGROUND MISMATCH
2953
2954### �� Fixed: Table Grid Background Now Matches Cells
2955- **Found:** `grid_bg` was using `__background_alt__` (different from cells!)
2956- **Fixed:** Changed `grid_bg` to use `__background_site__` (same as cells)
2957- **Result:** Table background no longer shows through cells!
2958
2959### The Layer Problem
2960
2961The table itself had a DIFFERENT background color than its cells!
2962
2963**Before (v5.2.6)**:
2964```php
2965'grid_bg' => __background_alt__,     // Table background (#e8e8e8)
2966'cell_bg' => __background_site__,    // Cell background (#f5f5f5)
2967```
2968
2969**The table background was showing THROUGH the cells!**
2970
2971### Why This Happened
2972
2973**Visual layers**:
2974```
2975Table Element
2976├─ background: __background_alt__ (#e8e8e8)  ← Different!
2977└─ Cells
2978    └─ background: __background_site__ (#f5f5f5)  ← Different!
2979
2980The table background shows through any gaps!
2981```
2982
2983### The Fix
2984
2985**After (v5.2.7)**:
2986```php
2987'grid_bg' => __background_site__,    // Table background (#f5f5f5) ✓
2988'cell_bg' => __background_site__,    // Cell background (#f5f5f5) ✓
2989```
2990
2991**NOW THEY MATCH!**
2992
2993### Where grid_bg Is Used
2994
2995The table element itself:
2996```html
2997<table style="background: __background_alt__">  ← Was showing through!
2998    <tbody>
2999        <tr>
3000            <td style="background: __background_site__">1</td>
3001        </tr>
3002    </tbody>
3003</table>
3004```
3005
3006Even with cell inline styles, the TABLE background shows through!
3007
3008### All Background Sources Now Unified
3009
3010**Everything now uses __background_site__**:
3011- `bg` → __background_site__ ✓
3012- `header_bg` → __background_site__ ✓
3013- `grid_bg` → __background_site__ ✓ (JUST FIXED!)
3014- `cell_bg` → __background_site__ ✓
3015
3016**Perfect consistency!** ��
3017
3018### Why It Was Different
3019
3020**Originally the grid was meant to show borders**:
3021- `grid_bg` was `__background_alt__` (slightly different)
3022- Created visual separation between cells
3023- But with transparent/thin cells, it showed through!
3024
3025**Now unified for consistency!**
3026
3027### Visual Result
3028
3029**Before (layers visible)**:
3030```
3031┌─────────────────┐
3032│ Grid (#e8e8e8)  │ ← Showing through!
3033│  ┌──┬──┬──┐     │
3034│  │  │  │  │     │ ← Cells (#f5f5f5)
3035│  └──┴──┴──┘     │
3036└─────────────────┘
3037```
3038
3039**After (unified)**:
3040```
3041┌─────────────────┐
3042│ Grid (#f5f5f5)  │ ← Same color!
3043│  ┌──┬──┬──┐     │
3044│  │  │  │  │     │ ← Cells (#f5f5f5)
3045│  └──┴──┴──┘     │
3046└─────────────────┘
3047Perfect match!
3048```
3049
3050### Complete Background Mapping
3051
3052**All using __background_site__ now**:
3053- Main container background
3054- Left panel background
3055- Right panel background
3056- Eventlist background
3057- Calendar grid background ← JUST FIXED
3058- Calendar cell backgrounds
3059- Event item backgrounds
3060- Clock header background
3061- Search input background
3062- Past events toggle
3063
3064**EVERYTHING UNIFIED!** ��
3065
3066## Version 5.2.6 (2026-02-09) - REMOVE CONTAINER BACKGROUNDS
3067
3068### �� Fixed: Removed Container Backgrounds Showing Through
3069- **Found:** `.calendar-compact-container` had `background: #ffffff;`
3070- **Found:** `.calendar-compact-left` had `background: #fafafa;`
3071- **Found:** `.calendar-compact-right` had `background: #ffffff;`
3072- **Found:** `.event-search-input-inline` had `background: white;`
3073- **Found:** `.past-events-toggle` had `background: #f5f5f5;`
3074- **Result:** Container backgrounds no longer show through cells!
3075
3076### The Container Problem
3077
3078The parent containers had hardcoded backgrounds that were showing through!
3079
3080**Container backgrounds (lines 4-91)**:
3081```css
3082.calendar-compact-container {
3083    background: #ffffff;  /* ← Main container! */
3084}
3085
3086.calendar-compact-left {
3087    background: #fafafa;  /* ← Left panel (calendar side)! */
3088}
3089
3090.calendar-compact-right {
3091    background: #ffffff;  /* ← Right panel (events side)! */
3092}
3093```
3094
3095**These were showing through the cells and events!**
3096
3097### Why Containers Matter
3098
3099Even though cells have inline styles, if the CONTAINER behind them has a different background, it can show through:
3100
3101```
3102Container (#fafafa)           ← Showing through!
3103   └─ Table Cell (#f5f5f5)    ← Transparent areas
3104      └─ Content
3105```
3106
3107### All Backgrounds Removed
3108
3109**v5.2.6 removes**:
3110- `.calendar-compact-container` background
3111- `.calendar-compact-left` background
3112- `.calendar-compact-right` background
3113- `.event-search-input-inline` background
3114- `.past-events-toggle` background & hover
3115
3116**v5.2.5 removed**:
3117- `.calendar-compact-grid tbody td` background
3118- `.calendar-compact-grid thead th` background
3119
3120**v5.2.4 removed**:
3121- `.cal-empty`, `.cal-today`, `.cal-has-events` backgrounds
3122
3123**v5.2.3 removed**:
3124- `.event-compact-item` background
3125
3126**ALL container and element backgrounds eliminated!** ��
3127
3128### What Should Work Now
3129
3130**Calendar cells**: No container background showing through ✓
3131**Event items**: No container background showing through ✓
3132**Search bar**: Uses template color ✓
3133**Past events toggle**: Uses template color ✓
3134
3135### Complete List of Fixes
3136
3137**Containers**:
3138- Main container ✓
3139- Left panel ✓
3140- Right panel ✓
3141
3142**Elements**:
3143- Table cells ✓
3144- Event items ✓
3145- Search input ✓
3146- Past events toggle ✓
3147
3148**EVERYTHING removed!** ��
3149
3150### Critical: Clear Caches
3151
3152**Must clear caches or won't work**:
31531. Hard refresh: Ctrl+Shift+R (5 times!)
31542. Clear DokuWiki cache
31553. Close browser completely
31564. Reopen and test
3157
3158**CSS caching is EXTREMELY persistent!**
3159
3160## Version 5.2.5 (2026-02-09) - REMOVE TABLE CELL CSS BACKGROUNDS
3161
3162### �� Fixed: Removed Hardcoded Backgrounds from Table Cells
3163- **Found:** `.calendar-compact-grid tbody td` had `background: #ffffff;`!
3164- **Found:** `.calendar-compact-grid tbody td:hover` had `background: #f0f7ff;`!
3165- **Found:** `.calendar-compact-grid thead th` had `background: #f8f8f8;`!
3166- **Fixed:** Removed ALL hardcoded backgrounds from table CSS
3167- **Result:** Calendar table cells finally use template colors!
3168
3169### The REAL Culprits
3170
3171The generic table CSS was overriding everything!
3172
3173**In style.css (lines 307-356)**:
3174```css
3175.calendar-compact-grid thead th {
3176    background: #f8f8f8;  /* ← Header cells hardcoded! */
3177}
3178
3179.calendar-compact-grid tbody td {
3180    background: #ffffff;  /* ← ALL table cells hardcoded! */
3181}
3182
3183.calendar-compact-grid tbody td:hover {
3184    background: #f0f7ff;  /* ← Hover state hardcoded! */
3185}
3186```
3187
3188**These apply to ALL `<td>` and `<th>` elements in the calendar table!**
3189
3190### Why This Was the Last One
3191
3192**CSS Specificity Order**:
31931. `.calendar-compact-grid tbody td` (generic - applies to ALL cells)
31942. `.cal-empty`, `.cal-today`, `.cal-has-events` (specific - applies to some cells)
31953. Inline styles (should win but didn't)
3196
3197**We removed the specific ones (v5.2.4), but the generic one was still there!**
3198
3199### What We've Removed
3200
3201**v5.2.3**:
3202- `.event-compact-item` background
3203- `.event-compact-item:hover` background
3204
3205**v5.2.4**:
3206- `.cal-empty` background & hover
3207- `.cal-today` background & hover
3208- `.cal-has-events` background & hover
3209
3210**v5.2.5 (FINAL)**:
3211- `.calendar-compact-grid tbody td` background ✓
3212- `.calendar-compact-grid tbody td:hover` background ✓
3213- `.calendar-compact-grid thead th` background ✓
3214
3215**All CSS background overrides ELIMINATED!** ��
3216
3217### Why It Took 5 Versions
3218
3219**CSS had layers of hardcoded backgrounds**:
3220
3221```
3222Layer 1: Table cells (.calendar-compact-grid tbody td)
3223         ↓ Overrode inline styles
3224Layer 2: Cell states (.cal-today, .cal-empty, etc.)
3225         ↓ Overrode table cells
3226Layer 3: Event items (.event-compact-item)
3227         ↓ Overrode inline styles
3228
3229ALL had to be removed!
3230```
3231
3232**We kept finding more specific CSS, but the base table CSS was there all along!**
3233
3234### Visual Result
3235
3236**NOW everything matches**:
3237```
3238Calendar Table:
3239┌──┬──┬──┬──┬──┬──┬──┐
3240│ S│ M│ T│ W│ T│ F│ S│ ← Headers: __background_site__
3241├──┼──┼──┼──┼──┼──┼──┤
3242│ 1│ 2│ 3│ 4│ 5│ 6│ 7│ ← Cells: __background_site__
3243├──┼──┼──┼──┼──┼──┼──┤
3244│ 8│ 9│10│11│12│13│14│ ← All: __background_site__
3245└──┴──┴──┴──┴──┴──┴──┘
3246
3247Sidebar Events:
3248┌────────────────────────┐
3249│ �� Event               │ ← __background_site__
3250│ �� Event               │ ← __background_site__
3251└────────────────────────┘
3252
3253FINALLY ALL MATCHING! ✓
3254```
3255
3256### Complete List of Removed CSS
3257
3258**ALL hardcoded backgrounds removed**:
3259- `.event-compact-item` background
3260- `.event-compact-item:hover` background
3261- `.cal-empty` background & hover
3262- `.cal-today` background & hover
3263- `.cal-has-events` background & hover
3264- `.calendar-compact-grid tbody td` background ← NEW
3265- `.calendar-compact-grid tbody td:hover` background ← NEW
3266- `.calendar-compact-grid thead th` background ← NEW
3267
3268**Every single CSS background override is GONE!** ��
3269
3270### Testing Steps
3271
3272**After installing v5.2.5**:
3273
32741. **Clear browser cache**: Ctrl+Shift+R (3 times!)
32752. **Clear DokuWiki cache**: Click the button
32763. **Close browser completely**: Restart it
32774. **Visit page**: Should finally see matching backgrounds
3278
3279**CSS is EXTREMELY sticky - may need to clear multiple times!**
3280
3281### This Should Be It
3282
3283**No more CSS overrides exist** (we've checked the entire file):
3284- Table cells ✓ Fixed
3285- Cell states ✓ Fixed
3286- Event items ✓ Fixed
3287- Headers ✓ Fixed
3288- Hover states ✓ Fixed
3289
3290**All backgrounds now come from inline styles using template colors!**
3291
3292## Version 5.2.4 (2026-02-09) - REMOVE CALENDAR CELL CSS BACKGROUNDS
3293
3294### �� Fixed: Removed Hardcoded Backgrounds from Calendar Cells
3295- **Found:** Calendar cell CSS had hardcoded backgrounds with `!important`!
3296- **Fixed:** Removed backgrounds from `.cal-today`, `.cal-empty`, `.cal-has-events` CSS
3297- **Result:** Calendar cells now use template colors!
3298
3299### The Second Culprit
3300
3301MORE hardcoded backgrounds in the CSS file!
3302
3303**In style.css (lines 359-382)**:
3304```css
3305.cal-empty {
3306    background: #fafafa !important;  /* ← Overriding inline styles! */
3307}
3308
3309.cal-today {
3310    background: #e8f5e9 !important;  /* ← Overriding today cell! */
3311}
3312
3313.cal-today:hover {
3314    background: #c8e6c9 !important;  /* ← Overriding hover! */
3315}
3316
3317.cal-has-events {
3318    background: #fffbf0;  /* ← Overriding event cells! */
3319}
3320
3321.cal-has-events:hover {
3322    background: #fff4d9;  /* ← Overriding hover! */
3323}
3324```
3325
3326**These were ALL overriding the inline styles!**
3327
3328### The Fix
3329
3330**Removed all hardcoded backgrounds**:
3331```css
3332.cal-empty {
3333    /* background removed - inline style handles this */
3334    cursor: default !important;
3335}
3336
3337.cal-today {
3338    /* background removed - inline style handles this */
3339}
3340
3341.cal-has-events {
3342    /* background removed - inline style handles this */
3343}
3344
3345/* Hover states also removed */
3346```
3347
3348### What Was Overridden
3349
3350**v5.2.3 fixed**:
3351- Event items in sidebar ✓
3352
3353**v5.2.4 fixes**:
3354- Calendar day cells ✓
3355- Today cell ✓
3356- Empty cells ✓
3357- Cells with events ✓
3358- All hover states ✓
3359
3360### Why This Kept Happening
3361
3362**CSS had hardcoded backgrounds everywhere**:
33631. Event items: `#ffffff` (fixed in v5.2.3)
33642. Calendar cells: Multiple colors (fixed in v5.2.4)
33653. **All with `!important` flags!**
3366
3367**The inline styles couldn't override them!**
3368
3369### Visual Result
3370
3371**Now ALL backgrounds match**:
3372```
3373Calendar Grid:
3374┌──┬──┬──┬──┬──┬──┬──┐
3375│  │  │  │  │  │  │  │ ← All use __background_site__
3376├──┼──┼──┼──┼──┼──┼──┤
3377│  │██│  │  │  │  │  │ ← Today uses __background_neu__
3378├──┼──┼──┼──┼──┼──┼──┤
3379│  │  │  │  │  │  │  │ ← All match template
3380└──┴──┴──┴──┴──┴──┴──┘
3381
3382Sidebar Events:
3383┌────────────────────────┐
3384│ �� Event               │ ← Uses __background_site__
3385│ �� Event               │ ← Uses __background_site__
3386└────────────────────────┘
3387
3388Perfect consistency!
3389```
3390
3391### CSS Removed
3392
3393**Calendar cells**:
3394- `.cal-empty` background
3395- `.cal-empty:hover` background
3396- `.cal-today` background
3397- `.cal-today:hover` background
3398- `.cal-has-events` background
3399- `.cal-has-events:hover` background
3400
3401**All gone!** ✓
3402
3403### Important: Clear Caches Again!
3404
3405After installing v5.2.4:
3406
34071. **Hard refresh browser**: Ctrl+Shift+R (twice!)
34082. **Clear DokuWiki cache**: Admin → Clear Cache
34093. **May need to restart browser**: To clear CSS cache
3410
3411**Old CSS is VERY sticky!**
3412
3413### Why It Took So Long
3414
3415**Multiple CSS overrides**:
3416- Event items (v5.2.3) ✓ Fixed
3417- Calendar cells (v5.2.4) ✓ Fixed
3418- Each with different classes
3419- Each with `!important`
3420- Hidden throughout CSS file
3421
3422**Found them all now!** ��
3423
3424## Version 5.2.3 (2026-02-09) - REMOVE HARDCODED CSS BACKGROUNDS
3425
3426### �� Fixed: Removed Hardcoded Backgrounds from CSS
3427- **Found:** CSS file had hardcoded `background: #ffffff;` overriding inline styles!
3428- **Fixed:** Removed hardcoded backgrounds from `.event-compact-item` CSS
3429- **Result:** Event backgrounds now properly use template colors!
3430
3431### The Root Cause
3432
3433The CSS file was overriding the inline styles with hardcoded white backgrounds!
3434
3435**In style.css (lines 599-616)**:
3436```css
3437.event-compact-item {
3438    background: #ffffff;  /* ← This was overriding inline styles! */
3439}
3440
3441.event-compact-item:hover {
3442    background: #f8f9fa;  /* ← And this on hover! */
3443}
3444```
3445
3446**Even though inline styles had `!important`**, the CSS was still being applied because it comes after in the cascade!
3447
3448### The Fix
3449
3450**Removed hardcoded backgrounds from CSS**:
3451```css
3452.event-compact-item {
3453    /* background removed - set via inline style with template colors */
3454    display: flex;
3455    /* ... other styles ... */
3456}
3457
3458.event-compact-item:hover {
3459    box-shadow: 0 1px 3px rgba(0,0,0,0.08);
3460    /* background removed - inline style handles this */
3461}
3462```
3463
3464### Why This Was So Difficult to Find
3465
3466**CSS Specificity & Cascade**:
34671. Inline styles with `!important` should win
34682. But CSS that comes after can still apply
34693. The hardcoded `background: #ffffff` was silently overriding
34704. All the PHP code was correct - it was the CSS!
3471
3472**What We Were Doing**:
3473- ✓ Reading template colors correctly
3474- ✓ Setting `cell_bg` to `__background_site__` correctly
3475- ✓ Applying inline styles with `!important` correctly
3476- ✗ CSS file was overriding everything!
3477
3478### What Was Affected
3479
3480**Event items in**:
3481- Main calendar sidebar
3482- Standalone event list
3483- Sidebar widget
3484- All event displays
3485
3486**All had white backgrounds hardcoded in CSS!**
3487
3488### Now Working
3489
3490**Events use template colors**:
3491```html
3492<div class="event-compact-item"
3493     style="background: #f5f5f5 !important; ...">
3494    ← Now this inline style actually works!
3495</div>
3496```
3497
3498**No CSS override** ✓
3499
3500### Testing
3501
3502To verify this works:
35031. Clear browser cache (important!)
35042. Clear DokuWiki cache
35053. Reload page
35064. Events should now match eventlist background
3507
3508**Browser caching can make old CSS persist!**
3509
3510### Visual Result
3511
3512**All backgrounds now matching**:
3513```
3514┌────────────────────────────┐
3515│ Eventlist (#f5f5f5)        │ ← Template color
3516├────────────────────────────┤
3517│ �� Event (#f5f5f5)         │ ← Template color (was #ffffff)
3518├────────────────────────────┤
3519│ �� Event (#f5f5f5)         │ ← Template color (was #ffffff)
3520└────────────────────────────┘
3521
3522Perfect match!
3523```
3524
3525### Why Everything Else Worked
3526
3527**Clock area, calendar cells, etc.** didn't have hardcoded CSS backgrounds:
3528- They only had inline styles ✓
3529- Inline styles worked correctly ✓
3530- Only event items had the CSS override ✗
3531
3532### Important Notes
3533
3534**Clear caches**:
3535- Browser cache (Ctrl+Shift+R or Cmd+Shift+R)
3536- DokuWiki cache (Admin → Clear Cache)
3537- Old CSS may be cached!
3538
3539**This was the culprit all along!**
3540
3541## Version 5.2.2 (2026-02-09) - FIX CLOCK AREA BACKGROUND
3542
3543### �� Fixed: Clock Area Now Matches Event Cells
3544- **Fixed:** `header_bg` now uses `__background_site__` (was `__background_alt__`)
3545- **Result:** Clock/Today header matches event cell backgrounds!
3546
3547### The Issue
3548
3549The clock area (Today header) was using a different background:
3550
3551**Before (v5.2.1)**:
3552```php
3553'header_bg' => __background_alt__,   // Different color (gray #e8e8e8)
3554'cell_bg' => __background_site__,    // Event cells (#f5f5f5)
3555```
3556
3557**After (v5.2.2)**:
3558```php
3559'header_bg' => __background_site__,  // Same as cells (#f5f5f5) ✓
3560'cell_bg' => __background_site__,    // Event cells (#f5f5f5) ✓
3561```
3562
3563### What's the Clock Area?
3564
3565The clock/Today header in the sidebar:
3566```
3567┌────────────────────────────┐
3568│ 3:45:23 PM                 │ ← Clock area (header_bg)
3569│ ��️ --° | Sun, Feb 9, 2026 │
3570└────────────────────────────┘
3571```
3572
3573### All Backgrounds Now Unified
3574
3575**Everything now uses __background_site__**:
3576- Eventlist background ✓
3577- Calendar cells ✓
3578- Event items ✓
3579- Clock/Today header ✓
3580- Sidebar widget ✓
3581- All backgrounds match! ✓
3582
3583### Visual Result
3584
3585**Complete consistency**:
3586```
3587┌────────────────────────────┐
3588│ 3:45:23 PM                 │ ← Same background
3589│ ��️ --° | Sun, Feb 9, 2026 │
3590├────────────────────────────┤
3591│ �� Meeting at 2pm          │ ← Same background
3592│ Description...             │
3593├────────────────────────────┤
3594│ �� Another event           │ ← Same background
3595│ More details...            │
3596└────────────────────────────┘
3597
3598All using __background_site__ (#f5f5f5)
3599```
3600
3601**Perfect visual harmony!** ��
3602
3603## Version 5.2.1 (2026-02-09) - FIX: MATCH EVENTLIST BACKGROUND
3604
3605### �� Fixed: Calendar Cells Now Match Eventlist Background
3606- **Fixed:** Changed `cell_bg` to use `__background_site__` (not `__background__`)
3607- **Result:** Calendar cells now match the eventlist background perfectly!
3608
3609### The Real Issue
3610
3611The eventlist was showing the CORRECT background color all along!
3612
3613**Eventlist was using**:
3614- `bg` → `__background_site__` ✓ (This was correct!)
3615
3616**Calendar cells were using**:
3617- `cell_bg` → `__background__` ✗ (This was wrong!)
3618
3619**They didn't match!**
3620
3621### The Correct Fix
3622
3623**Now everything uses __background_site__**:
3624```php
3625'bg' => __background_site__,        // Eventlist (was already correct)
3626'cell_bg' => __background_site__,   // Cells (now fixed to match)
3627```
3628
3629### Why __background_site__?
3630
3631The eventlist sidebar and calendar are meant to match the **page/site background**, not the inner content area background:
3632
3633```
3634Page Layout:
3635┌────────────────────────────────────┐
3636│ __background_site__ (page bg)     │ ← This is where calendar lives
3637│                                    │
3638│  ┌──────────────────────────────┐ │
3639│  │ __background__ (content bg)  │ │ ← Wiki article content
3640│  │                              │ │
3641│  └──────────────────────────────┘ │
3642│                                    │
3643└────────────────────────────────────┘
3644```
3645
3646**Calendar should match the page background, not the content background!**
3647
3648### Template Example
3649
3650Typical DokuWiki template:
3651```ini
3652__background_site__ = "#f5f5f5"  (Light gray - page background)
3653__background__ = "#ffffff"        (White - content area)
3654```
3655
3656**Before (v5.2.0)**:
3657- Eventlist: `#f5f5f5` (light gray) ✓ Correct
3658- Calendar cells: `#ffffff` (white) ✗ Wrong - didn't match
3659
3660**After (v5.2.1)**:
3661- Eventlist: `#f5f5f5` (light gray) ✓ Correct
3662- Calendar cells: `#f5f5f5` (light gray) ✓ Correct - MATCHED!
3663
3664### All Backgrounds Now Unified
3665
3666**Everything now uses __background_site__**:
3667- Eventlist sidebar background ✓
3668- Main calendar background ✓
3669- Calendar day cells ✓
3670- Sidebar widget ✓
3671- Event items ✓
3672- Input fields ✓
3673- Buttons ✓
3674
3675**All perfectly matched to the page background!**
3676
3677### Why Version 5.2.0 Was Wrong
3678
3679I incorrectly assumed `__background__` was the right color because it's often white. But the eventlist was already correct using `__background_site__` to match the page, not the content area.
3680
3681**The eventlist knew what it was doing all along!** The cells just needed to catch up.
3682
3683## Version 5.2.0 (2026-02-09) - UNIFIED WIKI THEME BACKGROUNDS
3684**Note**: This version went the wrong direction. See v5.2.1 for the correct fix.
3685
3686### �� Fixed: All Backgrounds Now Use __background__
3687- **Fixed:** `bg` now uses `__background__` instead of `__background_site__`
3688- **Fixed:** Eventlist, calendar cells, and sidebar all match now
3689- **Result:** Completely unified background throughout!
3690
3691### The Issue
3692
3693Different parts of the calendar were using different background sources:
3694
3695**Before (v5.1.9)**:
3696```php
3697'bg' => __background_site__        // Eventlist background (outer page)
3698'cell_bg' => __background__        // Cell backgrounds (content area)
3699```
3700
3701**These are different colors!**
3702- `__background_site__` = Outer page wrapper (often gray)
3703- `__background__` = Main content area (often white)
3704
3705### The Fix
3706
3707**After (v5.2.0)**:
3708```php
3709'bg' => __background__             // Eventlist background ✓
3710'cell_bg' => __background__        // Cell backgrounds ✓
3711```
3712
3713**Both use the same source!**
3714
3715### What Uses 'bg'
3716
3717The `bg` color is used for:
3718- Eventlist sidebar background
3719- Main calendar container
3720- Sidebar widget background
3721- Form backgrounds
3722- Event dialogs
3723
3724### What Uses 'cell_bg'
3725
3726The `cell_bg` color is used for:
3727- Calendar day cells
3728- Event item backgrounds
3729- Input field backgrounds
3730- Button backgrounds
3731
3732### Why This Matters
3733
3734**Template color hierarchy**:
3735```
3736__background_site__ → Outer page/body (e.g., #f5f5f5 light gray)
3737__background__      → Main content area (e.g., #ffffff white)
3738__background_alt__  → Sections/headers
3739__background_neu__  → Highlights
3740```
3741
3742**We want all calendar backgrounds to match the main content area!**
3743
3744### Visual Comparison
3745
3746**Before (v5.1.9)**: Mismatched backgrounds
3747```
3748┌────────────────────────────────┐
3749│ Eventlist (gray #f5f5f5)      │ ← __background_site__
3750└────────────────────────────────┘
3751
3752┌────────────────────────────────┐
3753│ Calendar                       │
3754│ ┌──┬──┬──┬──┬──┬──┬──┐       │
3755│ │  │  │  │  │  │  │  │       │ ← __background__ (white #fff)
3756│ └──┴──┴──┴──┴──┴──┴──┘       │
3757└────────────────────────────────┘
3758Different colors - looks inconsistent
3759```
3760
3761**After (v5.2.0)**: Unified backgrounds
3762```
3763┌────────────────────────────────┐
3764│ Eventlist (white #fff)         │ ← __background__
3765└────────────────────────────────┘
3766
3767┌────────────────────────────────┐
3768│ Calendar                       │
3769│ ┌──┬──┬──┬──┬──┬──┬──┐       │
3770│ │  │  │  │  │  │  │  │       │ ← __background__ (white #fff)
3771│ └──┴──┴──┴──┴──┴──┴──┘       │
3772└────────────────────────────────┘
3773Same color - perfectly consistent!
3774```
3775
3776### Template Examples
3777
3778**Light Template**:
3779```ini
3780__background_site__ = "#f5f5f5"  (light gray)
3781__background__ = "#ffffff"       (white)
3782```
3783
3784**Before**: Eventlist gray, cells white
3785**After**: Eventlist white, cells white ✓
3786
3787**Dark Template**:
3788```ini
3789__background_site__ = "#1a1a1a"  (very dark)
3790__background__ = "#2d2d2d"       (dark)
3791```
3792
3793**Before**: Eventlist very dark, cells dark
3794**After**: Eventlist dark, cells dark ✓
3795
3796### Benefits
3797
3798**Visual Consistency**:
3799- All backgrounds match
3800- Clean, unified appearance
3801- Professional look
3802
3803**Correct Template Integration**:
3804- Uses content area color (not page wrapper)
3805- Matches wiki content area
3806- Proper color hierarchy
3807
3808**Works Everywhere**:
3809- Light templates ✓
3810- Dark templates ✓
3811- Custom templates ✓
3812
3813### All Backgrounds Unified
3814
3815**Now using __background__**:
3816- Eventlist background ✓
3817- Calendar cells ✓
3818- Sidebar widget ✓
3819- Event items ✓
3820- Input fields ✓
3821- Buttons ✓
3822- Dialogs ✓
3823
3824**Perfect harmony throughout!** ��
3825
3826## Version 5.1.9 (2026-02-09) - FIX WIKI THEME EVENT BACKGROUNDS
3827
3828### �� Fixed: Wiki Theme Event Backgrounds Not Showing
3829- **Fixed:** Wiki theme fallback used CSS variables in inline styles (doesn't work!)
3830- **Fixed:** Replaced CSS variables with actual hex colors
3831- **Result:** Event backgrounds now show correctly with template colors!
3832
3833### The Problem
3834
3835CSS variables like `var(--__background__, #fff)` don't work in inline `style=""` attributes!
3836
3837**Before (broken)**:
3838```php
3839'cell_bg' => 'var(--__background__, #fff)',  // Doesn't work in inline styles!
3840```
3841
3842**After (fixed)**:
3843```php
3844'cell_bg' => '#fff',  // Actual hex color works!
3845```
3846
3847### What Was Affected
3848
3849**When style.ini read successfully**:
3850- ✅ Worked fine (uses actual hex colors from file)
3851
3852**When style.ini fallback used**:
3853- ❌ Events had no background
3854- ❌ CSS variables don't work in inline styles
3855- ❌ Looked broken
3856
3857### The Fix
3858
3859**Wiki theme fallback now uses real colors**:
3860```php
3861'wiki' => [
3862    'bg' => '#f5f5f5',           // Real hex (was: var(--__background_site__))
3863    'border' => '#ccc',           // Real hex (was: var(--__border__))
3864    'cell_bg' => '#fff',          // Real hex (was: var(--__background__))
3865    'cell_today_bg' => '#eee',    // Real hex (was: var(--__background_neu__))
3866    'text_primary' => '#333',     // Real hex (was: var(--__text__))
3867    'text_bright' => '#2b73b7',   // Real hex (was: var(--__link__))
3868    'text_dim' => '#666',         // Real hex (was: var(--__text_neu__))
3869    'grid_bg' => '#e8e8e8',       // Real hex (was: var(--__background_alt__))
3870    // ... all colors now use real hex values
3871]
3872```
3873
3874### Why CSS Variables Don't Work
3875
3876**CSS variables work**:
3877```css
3878.some-class {
3879    background: var(--__background__, #fff);  /* ✓ Works in CSS */
3880}
3881```
3882
3883**CSS variables DON'T work**:
3884```html
3885<div style="background: var(--__background__, #fff)">  <!-- ✗ Doesn't work -->
3886```
3887
3888### How It Works Now
3889
3890**Priority system**:
38911. **Try reading style.ini** → Use actual template hex colors ✓
38922. **If file not found** → Use fallback hex colors ✓
38933. **Never use CSS variables in inline styles** ✓
3894
3895**Both paths now work correctly!**
3896
3897### Visual Result
3898
3899**Events now have proper backgrounds**:
3900```
3901┌──────────────────────────┐
3902│ �� Meeting at 2pm        │ ← White background (#fff)
3903│ Description here...      │
3904│ [✏️ Edit] [��️ Delete]   │
3905└──────────────────────────┘
3906
3907Not:
3908┌──────────────────────────┐
3909│ �� Meeting at 2pm        │ ← No background (broken)
3910│ Description here...      │
3911└──────────────────────────┘
3912```
3913
3914### Affected Areas
3915
3916**All event displays**:
3917- Main calendar events ✓
3918- Sidebar widget events ✓
3919- Event list items ✓
3920- Event backgrounds ✓
3921- Button backgrounds ✓
3922- Input field backgrounds ✓
3923
3924**Everything uses real colors now!**
3925
3926## Version 5.1.8 (2026-02-09) - IMPROVED UPDATE TAB LAYOUT
3927
3928### �� Reorganized: Better Update Tab Layout
3929- **Moved:** Current Version section to the top
3930- **Combined:** Upload and Important Notes side-by-side
3931- **Improved:** Space-efficient two-column layout
3932- **Result:** More information visible at once!
3933
3934### New Layout Order
3935
3936**Version 5.1.8**:
3937```
39381. Current Version (at top - see what you have)
39392. Upload + Important Notes (side-by-side)
39403. Recent Changes (changelog)
39414. Backups
3942```
3943
3944### Side-by-Side Design
3945
3946**Upload form (left 60%) + Important Notes (right 40%)**:
3947```
3948┌──────────────────────────────────────────┐
3949│ �� Current Version                       │
3950│ Version: 5.1.8                           │
3951│ ✅ Permissions: OK                       │
3952└──────────────────────────────────────────┘
3953
3954┌─────────────────────┬────────────────────┐
3955│ �� Upload New       │ ⚠️ Important Notes │
3956│ [Choose File]       │ • Replaces files   │
3957│ ☑ Backup first      │ • Config preserved │
3958│ [Upload] [Clear]    │ • Events safe      │
3959└─────────────────────┴────────────────────┘
3960```
3961
3962### Benefits
3963
3964**Current Version First**:
3965- See what you have immediately
3966- Check permissions at a glance
3967- Know if ready to update
3968
3969**Side-by-Side Layout**:
3970- Upload form and warnings together
3971- Read notes while choosing file
3972- More efficient use of space
3973- Less scrolling needed
3974
3975**Better Information Flow**:
39761. See current version ✓
39772. Upload new version with notes visible ✓
39783. Review recent changes ✓
39794. Manage backups ✓
3980
3981### Visual Comparison
3982
3983**Before (v5.1.7)**:
3984```
3985Important Notes (full width)
39863987Upload Form (full width)
39883989Current Version
39903991Recent Changes
39923993Backups
3994```
3995
3996**After (v5.1.8)**:
3997```
3998Current Version (full width)
39994000Upload (60%) | Notes (40%)
40014002Recent Changes
40034004Backups
4005```
4006
4007**More compact, better organized!**
4008
4009### Responsive Design
4010
4011**Wide screens**:
4012- Upload and notes side-by-side
4013- Full 1200px width utilized
4014- Efficient space usage
4015
4016**Narrow screens**:
4017- Sections stack gracefully
4018- Flex layout adapts
4019- Still fully functional
4020
4021### Layout Details
4022
4023**Current Version Section**:
4024- Full width (1200px max)
4025- Shows version, author, description
4026- Permission status with icons
4027- Helpful fix commands if needed
4028
4029**Upload/Notes Section**:
4030- Flexbox layout with gap
4031- Upload: `flex:1` (grows)
4032- Notes: `flex:0 0 350px` (fixed 350px)
4033- Both have proper min-width
4034
4035**Recent Changes Section**:
4036- Full width (1200px max)
4037- Compact scrollable view
4038- Color-coded change types
4039- Last 10 versions shown
4040
4041**Backups Section**:
4042- Full width (1200px max)
4043- Manual backup button
4044- Scrollable file list
4045- All actions accessible
4046
4047### Improved Max Widths
4048
4049All sections now use `max-width:1200px` (previously 900px):
4050- Better use of wide screens
4051- Still responsive on narrow screens
4052- Consistent throughout tab
4053
4054## Version 5.1.7 (2026-02-09) - FIX SYNTAX ERROR
4055
4056### �� Fixed: Extra Closing Brace
4057- **Fixed:** ParseError on line 1936 (extra closing brace)
4058- **Result:** Manual backup feature now works correctly!
4059
4060### What Was Wrong
4061
4062Extra `}` after the backup section:
4063
4064**Before (broken)**:
4065```php
4066echo '</div>';
4067}  // ← Extra closing brace!
4068
4069echo '<script>
4070```
4071
4072**After (fixed)**:
4073```php
4074echo '</div>';
4075
4076echo '<script>
4077```
4078
4079**Manual backup feature now fully functional!** ✅
4080
4081## Version 5.1.6 (2026-02-09) - MANUAL BACKUP ON DEMAND
4082
4083### �� Added: Create Backup Manually Anytime
4084- **Added:** "Create Backup Now" button in Backups section
4085- **Added:** Manual backup action handler with full verification
4086- **Added:** Backups section always visible (even with no backups)
4087- **Added:** Success message showing file size and file count
4088- **Result:** Create backups anytime without needing to upload!
4089
4090### Manual Backup Button
4091
4092**New Layout**:
4093```
4094┌─────────────────────────────────────┐
4095│ �� Backups        [�� Create Backup Now] │
4096├─────────────────────────────────────┤
4097│ Backup File                Size     │
4098calendar.backup.v5.1.6...  243 KB   │
4099│ [�� Download] [✏️ Rename] [��️ Delete] │
4100└─────────────────────────────────────┘
4101```
4102
4103**Always visible - even with no backups**:
4104```
4105┌─────────────────────────────────────┐
4106│ �� Backups        [�� Create Backup Now] │
4107├─────────────────────────────────────┤
4108│ No backups yet. Click "Create       │
4109│ Backup Now" to create your first    │
4110│ backup.                              │
4111└─────────────────────────────────────┘
4112```
4113
4114### How It Works
4115
4116**Click the button**:
41171. Confirm: "Create a backup of the current plugin version?"
41182. System creates backup ZIP
41193. Verifies: File count (30+ files)
41204. Verifies: File size (200KB+)
41215. Shows success: "✓ Manual backup created: filename.zip (243 KB, 31 files)"
4122
4123**Backup naming**:
4124```
4125calendar.backup.v5.1.6.manual.2026-02-09_12-30-45.zip
4126                       ^^^^^^
4127                     "manual" tag identifies manual backups
4128```
4129
4130### Use Cases
4131
4132**Before updates**:
4133- Create safety backup before uploading new version
4134- Have multiple restore points
4135- Test new features with fallback
4136
4137**Regular backups**:
4138- Weekly/monthly backup schedule
4139- Before making configuration changes
4140- After important customizations
4141
4142**Development**:
4143- Backup before code experiments
4144- Save working states
4145- Quick rollback points
4146
4147### Full Verification
4148
4149**Same checks as automatic backups**:
4150- ✅ File count check (minimum 10, expected 30+)
4151- ✅ File size check (minimum 1KB, expected 200KB+)
4152- ✅ Existence check (file actually created)
4153- ✅ Automatic cleanup on failure
4154
4155**Success message includes**:
4156- Backup filename
4157- File size (human-readable)
4158- Number of files backed up
4159
4160### Example Messages
4161
4162**Success**:
4163```
4164✓ Manual backup created successfully:
4165  calendar.backup.v5.1.6.manual.2026-02-09_12-30-45.zip
4166  (243 KB, 31 files)
4167```
4168
4169**Failure Examples**:
4170```
4171❌ Plugin directory is not readable.
4172   Please check permissions.
4173
4174❌ Backup incomplete: Only 5 files were added (expected 30+).
4175   Backup failed.
4176
4177❌ Backup file is too small (342 bytes).
4178   Only 3 files were added. Backup failed.
4179```
4180
4181### Benefits
4182
4183**On-Demand Safety**:
4184- Create backups anytime
4185- No need to upload new version
4186- Quick and easy
4187
4188**Peace of Mind**:
4189- Backup before risky changes
4190- Multiple restore points
4191- Safe experimentation
4192
4193**Professional Workflow**:
4194- Regular backup schedule
4195- Version snapshots
4196- Disaster recovery
4197
4198### Backup Section Improvements
4199
4200**Always Visible**:
4201- Section shows even with 0 backups
4202- Button always accessible
4203- Clear call-to-action
4204
4205**Better Header**:
4206- Title and button on same row
4207- Clean, professional layout
4208- Space-efficient design
4209
4210### Technical Details
4211
4212**New Action**: `create_manual_backup`
4213
4214**New Function**: `createManualBackup()`
4215- Gets current version
4216- Creates timestamped filename with "manual" tag
4217- Uses same verification as auto-backups
4218- Shows detailed success/error messages
4219
4220**File Naming Convention**:
4221```
4222Automatic (on upload):
4223calendar.backup.v5.1.6.2026-02-09_12-30-45.zip
4224
4225Manual (button click):
4226calendar.backup.v5.1.6.manual.2026-02-09_12-30-45.zip
4227                       ^^^^^^^
4228                    Easy to identify!
4229```
4230
4231### Permissions Required
4232
4233- **Read access**: Plugin directory
4234- **Write access**: Parent plugins directory
4235
4236**Same as automatic backups** - no additional permissions needed!
4237
4238## Version 5.1.5 (2026-02-09) - ENHANCED BACKUP VERIFICATION
4239
4240### �� Enhanced: Backup Creation with Robust Verification
4241- **Added:** File count validation (must have 10+ files)
4242- **Added:** File size validation (must be 1KB+ minimum)
4243- **Added:** Return value from addDirectoryToZip (counts files added)
4244- **Added:** Detailed error messages showing file count
4245- **Added:** Automatic deletion of invalid/incomplete backups
4246- **Enhanced:** Exception handling with proper error propagation
4247- **Result:** Backups are now guaranteed to be complete or fail clearly!
4248
4249### What Changed
4250
4251**Before (v5.1.4)**:
4252```php
4253$this->addDirectoryToZip($zip, $pluginDir, 'calendar/');
4254$zip->close();
4255// No verification - could create empty or partial backup
4256```
4257
4258**After (v5.1.5)**:
4259```php
4260$fileCount = $this->addDirectoryToZip($zip, $pluginDir, 'calendar/');
4261$zip->close();
4262
4263// Verify backup exists
4264if (!file_exists($backupPath)) {
4265    redirect('Backup file was not created');
4266}
4267
4268// Verify backup has content
4269$backupSize = filesize($backupPath);
4270if ($backupSize < 1000) {
4271    unlink($backupPath);
4272    redirect('Backup too small: ' . $backupSize . ' bytes');
4273}
4274
4275// Verify file count
4276if ($fileCount < 10) {
4277    unlink($backupPath);
4278    redirect('Only ' . $fileCount . ' files added (expected 30+)');
4279}
4280```
4281
4282### Backup Validation Checks
4283
4284**Three-Layer Verification**:
4285
42861. **File Count Check**:
4287   - Minimum: 10 files required
4288   - Expected: 30+ files
4289   - Action: Delete backup if too few files
4290
42912. **Size Check**:
4292   - Minimum: 1KB (1000 bytes)
4293   - Expected: 200-250KB
4294   - Action: Delete backup if too small
4295
42963. **Existence Check**:
4297   - Verify file was actually created
4298   - Check ZIP archive is valid
4299   - Action: Error if file missing
4300
4301### Enhanced Error Reporting
4302
4303**Detailed Error Messages**:
4304```
4305❌ "Backup file was not created"
4306❌ "Backup too small (342 bytes). Only 3 files added."
4307❌ "Only 5 files added (expected 30+). Backup aborted."
4308❌ "Too many errors adding files: Failed to add X, Y, Z..."
4309❌ "Directory does not exist: /path/to/dir"
4310❌ "Directory is not readable: /path/to/dir"
4311```
4312
4313**Now you know exactly what went wrong!**
4314
4315### Improved addDirectoryToZip Function
4316
4317**Returns File Count**:
4318```php
4319private function addDirectoryToZip($zip, $dir, $zipPath = '') {
4320    $fileCount = 0;
4321    $errors = [];
4322
4323    // Validation
4324    if (!is_dir($dir)) throw new Exception("Directory does not exist");
4325    if (!is_readable($dir)) throw new Exception("Not readable");
4326
4327    // Add files
4328    foreach ($files as $file) {
4329        if ($zip->addFile($filePath, $relativePath)) {
4330            $fileCount++;
4331        } else {
4332            $errors[] = "Failed to add: " . $filename;
4333        }
4334    }
4335
4336    // Check error threshold
4337    if (count($errors) > 5) {
4338        throw new Exception("Too many errors");
4339    }
4340
4341    return $fileCount;  // Returns count for verification!
4342}
4343```
4344
4345### Safety Features
4346
4347**Invalid Backup Cleanup**:
4348- Failed backups are automatically deleted
4349- No partial/corrupt backups left behind
4350- Clean error state
4351
4352**Error Threshold**:
4353- Allow up to 5 minor file errors (logs warnings)
4354- More than 5 errors = complete failure
4355- Prevents partially corrupt backups
4356
4357**Directory Validation**:
4358- Check directory exists before processing
4359- Check directory is readable
4360- Fail fast with clear errors
4361
4362### Benefits
4363
4364**Guaranteed Complete Backups**:
4365- ✅ All files included or backup fails
4366- ✅ No silent failures
4367- ✅ Clear error messages
4368- ✅ Automatic cleanup
4369
4370**Better Debugging**:
4371- Know exactly how many files were added
4372- See specific errors for missing files
4373- Understand why backup failed
4374
4375**User Confidence**:
4376- Backup succeeds = complete backup
4377- Backup fails = clear error message
4378- No ambiguity
4379
4380### Example Scenarios
4381
4382**Scenario 1: Permission Issue**
4383```
4384User uploads new version
4385System starts backup
4386Error: "Directory is not readable: /lib/plugins/calendar/"
4387Backup fails before creating file
4388User sees clear error message
4389```
4390
4391**Scenario 2: Partial Backup**
4392```
4393User uploads new version
4394System creates backup
4395Only 5 files added (disk issue?)
4396Size: 450 bytes
4397Verification fails
4398Incomplete backup deleted
4399Error: "Only 5 files added (expected 30+)"
4400```
4401
4402**Scenario 3: Success**
4403```
4404User uploads new version
4405System creates backup
440631 files added
4407Size: 240KB
4408All verifications pass ✅
4409Update proceeds
4410```
4411
4412### Testing Recommendations
4413
4414After installing v5.1.5:
44151. Upload a new version with backup enabled
44162. Check for success message
44173. Verify backup file exists in /lib/plugins/
44184. Check backup file size (should be ~240KB)
44195. If backup fails, read error message carefully
4420
4421**Your backups are now bulletproof!** ��
4422
4423## Version 5.1.4 (2026-02-09) - BACKUP SYSTEM VERIFIED
4424
4425### ✅ Verified: Backup System Working Correctly
4426- **Verified:** addDirectoryToZip function includes all files recursively
4427- **Verified:** Backups contain all 31+ files from calendar directory
4428- **Verified:** File sizes are appropriate (233-240KB compressed, ~1MB uncompressed)
4429- **Info:** Backup sizes grow slightly with each version (more code = more features!)
4430- **Result:** Backup system is working perfectly!
4431
4432### Backup System Details
4433
4434**What Gets Backed Up**:
4435- All PHP files (syntax.php, admin.php, action.php, etc.)
4436- All JavaScript files (calendar-main.js, script.js)
4437- All documentation (CHANGELOG.md, README.md, all guides)
4438- All configuration (sync_config.php)
4439- All language files
4440- All assets and resources
4441- **Everything in the calendar/ directory!**
4442
4443**Backup Size Analysis**:
4444```
4445Version 5.0.4: 233KB (normal)
4446Version 5.0.5: 234KB (normal)
4447Version 5.0.6: 235KB (normal)
4448Version 5.0.7: 236KB (normal)
4449Version 5.0.8: 237KB (normal)
4450Version 5.0.9: 237KB (normal)
4451Version 5.1.0: 238KB (normal)
4452Version 5.1.1: 238KB (normal)
4453Version 5.1.2: 240KB (normal - added AJAX features)
4454Version 5.1.3: 240KB (normal)
4455```
4456
4457**Why Sizes Grow**:
4458- More features = more code
4459- Longer CHANGELOG
4460- Additional documentation
4461- New functionality
4462- **This is expected and normal!**
4463
4464**Compression Ratio**:
4465```
4466Uncompressed: ~1.0 MB (source files)
4467Compressed:   ~240 KB (ZIP archive)
4468Ratio:        ~24% (excellent compression!)
4469```
4470
4471### Backup File Contents
4472
4473**31 Files Included**:
4474```
4475admin.php              (216KB - main admin interface)
4476syntax.php             (173KB - calendar rendering)
4477calendar-main.js       (102KB - JavaScript functionality)
4478CHANGELOG.md           (268KB - complete version history)
4479style.css              (57KB - all styling)
4480action.php             (38KB - DokuWiki actions)
4481sync_outlook.php       (32KB - Outlook integration)
4482+ 24 other files (docs, configs, helpers)
4483```
4484
4485**All files successfully included!** ✅
4486
4487### How Backups Work
4488
4489**Creation Process**:
44901. User uploads new plugin version
44912. Checkbox "Create backup first" (checked by default)
44923. System creates backup: `calendar.backup.v5.1.3.2026-02-09_06-00-00.zip`
44934. Backup saved to: `/lib/plugins/` directory
44945. Then proceeds with update
4495
4496**Backup Function**:
4497```php
4498private function addDirectoryToZip($zip, $dir, $zipPath = '') {
4499    $files = new RecursiveIteratorIterator(
4500        new RecursiveDirectoryIterator($dir),
4501        RecursiveIteratorIterator::LEAVES_ONLY
4502    );
4503    foreach ($files as $file) {
4504        if (!$file->isDir()) {
4505            $zip->addFile($filePath, $relativePath);
4506        }
4507    }
4508}
4509```
4510
4511**Recursive = Gets Everything!** ✅
4512
4513### Verification Results
4514
4515**Test Results**:
4516- ✅ All 31 files present in zip
4517- ✅ All subdirectories included (lang/en/)
4518- ✅ File sizes match originals
4519- ✅ Compression works properly
4520- ✅ No files missing
4521- ✅ Backup can be restored
4522
4523**File Count**:
4524```
4525Source directory: 31 files
4526Backup ZIP:       34 items (31 files + 3 directories)
4527Status:           COMPLETE ✅
4528```
4529
4530### Backup Best Practices
4531
4532**Always enabled by default** ✅
4533**Stored in accessible location** ✅
4534**Timestamped filenames** ✅
4535**Complete directory backup** ✅
4536**Easy to restore** ✅
4537
4538### Conclusion
4539
4540The backup system is working perfectly. The file sizes are appropriate and expected:
4541- Compressed size: ~240KB (good compression)
4542- Uncompressed size: ~1MB (all source files)
4543- All files included: YES ✅
4544- Growing size over versions: Normal (more features!)
4545
4546**Your backups are complete and reliable!** ��
4547
4548## Version 5.1.3 (2026-02-08) - FIX JAVASCRIPT SYNTAX ERROR
4549
4550### �� Fixed: JavaScript Syntax Error in AJAX Function
4551- **Fixed:** ParseError on line 1947 (deleteBackup function)
4552- **Fixed:** Escaped all single quotes in JavaScript strings
4553- **Result:** AJAX backup deletion now works correctly!
4554
4555### What Was Wrong
4556
4557JavaScript inside PHP echo needs escaped quotes:
4558
4559**Before (broken)**:
4560```javascript
4561formData.append('action', 'delete_backup');  // PHP interprets quotes
4562```
4563
4564**After (fixed)**:
4565```javascript
4566formData.append(\'action\', \'delete_backup\');  // Escaped for PHP
4567```
4568
4569### All Quotes Escaped
4570
4571Fixed in deleteBackup function:
4572- ✅ FormData.append() calls
4573- ✅ fetch() URL
4574- ✅ querySelector() calls
4575- ✅ createElement() call
4576- ✅ All string literals
4577- ✅ Error messages
4578
4579**JavaScript now works!** ✓
4580
4581## Version 5.1.2 (2026-02-08) - AJAX BACKUP DELETION & LAYOUT IMPROVEMENT
4582
4583### �� Improved: Update Tab Further Refined
4584- **Moved:** Important Notes to very top (above upload)
4585- **Enhanced:** Delete backup now uses AJAX (no page refresh!)
4586- **Added:** Smooth fade-out animation when deleting backups
4587- **Added:** Success message after deletion
4588- **Auto-remove:** Backup section disappears if last backup deleted
4589- **Result:** Smoother, more polished experience!
4590
4591### New Layout Order
4592
4593**Final Order (v5.1.2)**:
4594```
45951. ⚠️ Important Notes (warnings at top)
45962. �� Upload New Version (with Clear Cache button)
45973. �� Current Version (info)
45984. �� Recent Changes (changelog)
45995. �� Available Backups (if any)
4600```
4601
4602### AJAX Backup Deletion
4603
4604**Before (v5.1.1)**:
4605- Click Delete → Page refreshes → Scroll back down
4606- Lose position on page
4607- Page reload is jarring
4608
4609**After (v5.1.2)**:
4610- Click Delete → Confirm
4611- Row fades out smoothly
4612- Row disappears
4613- Success message shows at top
4614- Success message fades after 3 seconds
4615- If last backup: entire section fades away
4616- **No page refresh!** ✓
4617
4618### Visual Flow
4619
4620**Delete Animation**:
4621```
46221. Click ��️ Delete
46232. Confirm dialog
46243. Row fades out (0.3s)
46254. Row removed
46265. Success message appears
46276. Message fades after 3s
4628```
4629
4630**If Last Backup**:
4631```
46321. Delete last backup
46332. Row fades out
46343. Entire "Available Backups" section fades
46354. Section removed
46365. Clean interface ✓
4637```
4638
4639### Success Message
4640
4641After deleting:
4642```
4643┌──────────────────────────────┐
4644│ ✓ Backup deleted: filename   │ ← Appears at top
4645└──────────────────────────────┘
4646   Fades after 3 seconds
4647```
4648
4649### Benefits
4650
4651**Important Notes First**:
4652- Warnings before actions ✓
4653- Read before uploading ✓
4654- Clear expectations ✓
4655
4656**AJAX Deletion**:
4657- No page refresh ✓
4658- Smooth animations ✓
4659- Stay in context ✓
4660- Professional feel ✓
4661
4662**Auto-Cleanup**:
4663- Empty list disappears ✓
4664- Clean interface ✓
4665- No clutter ✓
4666
4667### Technical Implementation
4668
4669**AJAX Request**:
4670```javascript
4671fetch('?do=admin&page=calendar&tab=update', {
4672    method: 'POST',
4673    body: formData
4674})
4675```
4676
4677**DOM Manipulation**:
4678- Fade out row
4679- Remove element
4680- Show success
4681- Remove section if empty
4682
4683**Smooth Transitions**:
4684- 300ms fade animations
4685- Clean visual feedback
4686- Professional polish
4687
4688## Version 5.1.1 (2026-02-08) - REORGANIZE UPDATE TAB
4689
4690### �� Improved: Update Tab Layout Reorganized
4691- **Moved:** Upload section to the top of the page
4692- **Added:** Clear Cache button next to Upload & Install button
4693- **Changed:** "Current Version" section moved below upload
4694- **Result:** Better workflow - upload first, then see version info!
4695
4696### New Layout Order
4697
4698**Before (v5.1.0)**:
4699```
47001. Clear Cache (standalone)
47012. Current Version
47023. Recent Changes
47034. Upload New Version
47045. Warning Box
47056. Backups
4706```
4707
4708**After (v5.1.1)**:
4709```
47101. Upload New Version (with Clear Cache button side-by-side)
47112. Warning Box
47123. Current Version
47134. Recent Changes
47145. Backups
4715```
4716
4717### Visual Result
4718
4719**Top of Update Tab**:
4720```
4721┌─────────────────────────────────┐
4722│ �� Upload New Version           │
4723│ ┌─────────────────────────────┐ │
4724│ │ [Choose File]               │ │
4725│ │ ☑ Create backup first       │ │
4726│ │ ┌──────────────┬──────────┐ │ │
4727│ │ │�� Upload &   │��️ Clear  │ │ │
4728│ │ │   Install    │   Cache  │ │ │
4729│ │ └──────────────┴──────────┘ │ │
4730│ └─────────────────────────────┘ │
4731│                                 │
4732│ ⚠️ Important Notes              │
4733│ • Will replace all files        │
4734│ • Config preserved              │
4735│                                 │
4736│ �� Current Version              │
4737│ Version: 5.1.1                  │
4738└─────────────────────────────────┘
4739```
4740
4741### Benefits
4742
4743**Better Workflow**:
4744- Primary action (upload) is first
4745- Clear cache conveniently next to install
4746- No scrolling to find upload button
4747- Logical top-to-bottom flow
4748
4749**Side-by-Side Buttons**:
4750- Upload & Install (green)
4751- Clear Cache (orange)
4752- Both common actions together
4753- Easy to access after upload
4754
4755**Improved UX**:
4756- Upload is most important → now at top
4757- Version info is reference → moved down
4758- Related actions grouped
4759- Cleaner organization
4760
4761### Button Layout
4762
4763```
4764┌──────────────────┬──────────────┐
4765│ �� Upload &      │ ��️ Clear     │
4766│    Install       │    Cache     │
4767│ (Green)          │ (Orange)     │
4768└──────────────────┴──────────────┘
4769```
4770
4771**Green = Primary Action**
4772**Orange = Secondary Action**
4773
4774Both easily accessible!
4775
4776## Version 5.1.0 (2026-02-08) - ADMIN SECTIONS USE MAIN BACKGROUND
4777
4778### �� Changed: Admin Section Backgrounds Now Use __background__
4779- **Changed:** All section boxes now use `__background__` instead of `__background_alt__`
4780- **Result:** Cleaner, more unified admin interface!
4781
4782### Background Usage Update
4783
4784**Before (v5.0.9)**:
4785```php
4786Section boxes: bg_alt (__background_alt__)
4787Content areas: bg (__background__)
4788```
4789
4790**After (v5.1.0)**:
4791```php
4792Section boxes: bg (__background__)
4793Content areas: bg (__background__)
4794```
4795
4796### Why This Change?
4797
4798**More unified appearance**:
4799- Sections and content use same background
4800- Creates cleaner, more cohesive look
4801- Borders provide visual separation
4802- Matches typical admin UI patterns
4803
4804**Template color hierarchy**:
4805```
4806__background_site__ → Outer page wrapper
4807__background__      → Content & sections (BOTH now use this)
4808__background_alt__  → Reserved for special panels/highlights
4809__background_neu__  → Special highlights
4810```
4811
4812### Visual Result
4813
4814**Light Template**:
4815```ini
4816__background__ = "#ffffff"
4817__background_alt__ = "#e8e8e8"
4818```
4819
4820**Before**:
4821```
4822Admin Page:
4823┌─────────────────────┐
4824│ ┌─────────────────┐ │
4825│ │ Section Box     │ │ ← Gray (#e8e8e8)
4826│ │ ┌─────────────┐ │ │
4827│ │ │ Content     │ │ │ ← White (#fff)
4828│ │ └─────────────┘ │ │
4829│ └─────────────────┘ │
4830└─────────────────────┘
4831Two-tone appearance
4832```
4833
4834**After**:
4835```
4836Admin Page:
4837┌─────────────────────┐
4838│ ┌─────────────────┐ │
4839│ │ Section Box     │ │ ← White (#fff)
4840│ │ ┌─────────────┐ │ │
4841│ │ │ Content     │ │ │ ← White (#fff)
4842│ │ └─────────────┘ │ │
4843│ └─────────────────┘ │
4844└─────────────────────┘
4845Unified, clean appearance
4846Borders provide separation
4847```
4848
4849**Dark Template**:
4850```ini
4851__background__ = "#2d2d2d"
4852__background_alt__ = "#3a3a3a"
4853```
4854
4855**After**:
4856```
4857Admin Page:
4858┌─────────────────────┐
4859│ ┌─────────────────┐ │
4860│ │ Section Box     │ │ ← Dark (#2d2d2d)
4861│ │ ┌─────────────┐ │ │
4862│ │ │ Content     │ │ │ ← Dark (#2d2d2d)
4863│ │ └─────────────┘ │ │
4864│ └─────────────────┘ │
4865└─────────────────────┘
4866Unified dark appearance
4867Accent borders provide definition
4868```
4869
4870### Benefits
4871
4872**Cleaner Look**:
4873- No more alternating gray/white
4874- More professional appearance
4875- Less visual noise
4876- Unified color scheme
4877
4878**Better Consistency**:
4879- Matches modern admin UI patterns
4880- Borders define sections, not colors
4881- Simpler, cleaner design
4882- Easier on the eyes
4883
4884**Template Friendly**:
4885- Works with any background color
4886- Light or dark templates
4887- Custom colors
4888- Always looks cohesive
4889
4890### All Sections Updated
4891
4892✅ Outlook Sync config sections
4893✅ Manage Events sections
4894✅ Update Plugin sections
4895✅ Themes tab sections
4896✅ Week start day section
4897✅ All form sections
4898
4899**Complete unified theming!** ��
4900
4901## Version 5.0.9 (2026-02-08) - FIX SYNTAX ERROR IN THEMES TAB
4902
4903### �� Fixed: Syntax Error in Theme Cards
4904- **Fixed:** ParseError on line 4461 (Purple theme card)
4905- **Fixed:** Malformed ternary expressions from sed replacement
4906- **Fixed:** All 4 theme cards (Purple, Professional, Pink, Wiki)
4907- **Result:** Admin pages work correctly!
4908
4909### What Was Wrong
4910
4911The bulk sed replacement in v5.0.8 incorrectly modified ternary expressions:
4912
4913**Before (broken)**:
4914```php
4915? '#9b59b6' : ' . $colors['border'] . ')
4916// Extra quote and dot created syntax error
4917```
4918
4919**After (fixed)**:
4920```php
4921? '#9b59b6' : $colors['border'])
4922// Clean ternary expression
4923```
4924
4925### All Theme Cards Fixed
4926
4927- ✅ Purple Dream card
4928- ✅ Professional Blue card
4929- ✅ Pink Bling card
4930- ✅ Wiki Default card
4931
4932### Now Working
4933
4934**Theme selection page loads** ✓
4935**All cards display properly** ✓
4936**Template colors applied** ✓
4937**No syntax errors** ✓
4938
4939## Version 5.0.8 (2026-02-08) - FIX THEMES TAB & BACKGROUND MAPPING
4940
4941### �� Fixed: Themes Tab Backgrounds & Correct Template Color Mapping
4942- **Fixed:** Themes tab now uses template colors (removed all hardcoded whites)
4943- **Fixed:** Main background now uses `__background__` instead of `__background_site__`
4944- **Fixed:** Theme selection cards use template backgrounds
4945- **Fixed:** Week start options use template backgrounds
4946- **Result:** Perfect color mapping throughout admin!
4947
4948### Color Mapping Correction
4949
4950**Before (v5.0.7)**:
4951```php
4952bg: __background_site__  // Wrong - this is outer page bg
4953bg_alt: __background_alt__
4954```
4955
4956**After (v5.0.8)**:
4957```php
4958bg: __background__       // Correct - main content bg
4959bg_alt: __background_alt__
4960```
4961
4962### Why This Matters
4963
4964**Template color hierarchy**:
4965```
4966__background_site__ → Outer page/site background
4967__background__      → Main content area (CORRECT for admin)
4968__background_alt__  → Sections/panels
4969__background_neu__  → Highlights
4970```
4971
4972**Admin should use**:
4973- `__background__` for input fields, content areas
4974- `__background_alt__` for section boxes, panels
4975
4976### Themes Tab Fixed
4977
4978**Removed all hardcoded colors**:
4979```php
4980Before: '#ddd', '#fff', '#dee2e6'
4981After:  $colors['border'], $colors['bg'], $colors['border']
4982```
4983
4984**Now themed**:
4985- ✅ Week start section background
4986- ✅ Week start option backgrounds
4987- ✅ Theme card backgrounds
4988- ✅ Theme card borders
4989- ✅ All borders throughout
4990
4991### Visual Result
4992
4993**Light Template**:
4994```ini
4995__background__ = "#ffffff"
4996__background_alt__ = "#e8e8e8"
4997```
4998
4999**Admin Before (v5.0.7)**:
5000```
5001Input fields: #f5f5f5 (site bg - wrong)
5002Sections: #e8e8e8 (alt bg - correct)
5003```
5004
5005**Admin After (v5.0.8)**:
5006```
5007Input fields: #ffffff (content bg - correct!)
5008Sections: #e8e8e8 (alt bg - correct!)
5009```
5010
5011**Dark Template**:
5012```ini
5013__background__ = "#2d2d2d"
5014__background_alt__ = "#3a3a3a"
5015```
5016
5017**Admin After (v5.0.8)**:
5018```
5019Input fields: #2d2d2d (content bg - perfect!)
5020Sections: #3a3a3a (alt bg - perfect!)
5021```
5022
5023### Complete Themes Tab
5024
5025**Week Start Options**:
5026```
5027┌─────────────────────────┐
5028│ �� Week Start Day       │ ← bg_alt
5029│ ┌─────────┬───────────┐ │
5030│ │ Monday  │ Sunday    │ │ ← bg (when not selected)
5031│ └─────────┴───────────┘ │
5032└─────────────────────────┘
5033```
5034
5035**Theme Cards**:
5036```
5037┌─────────────────────────┐
5038│ �� Matrix Edition       │ ← bg (when not selected)
5039│ Classic green theme     │   border (when not selected)
5040└─────────────────────────┘
5041
5042┌═════════════════════════┐
5043│ �� Purple Dream         │ ← rgba green tint (when selected)
5044│ Elegant purple theme    │   #00cc07 border (when selected)
5045└═════════════════════════┘
5046```
5047
5048### Perfect Integration
5049
5050**All admin pages now**:
5051- Content areas: `__background__` ✓
5052- Section boxes: `__background_alt__` ✓
5053- Borders: `__border__` ✓
5054- Text: `__text__` ✓
5055
5056**Matches wiki perfectly**:
5057- Same white content areas
5058- Same gray section boxes
5059- Same border colors
5060- Same text colors
5061
5062### No More Issues
5063
5064**Fixed**:
5065- ❌ Site background on content areas → ✅ Content background
5066- ❌ Hardcoded white on themes tab → ✅ Template background
5067- ❌ Hardcoded borders (#ddd) → ✅ Template borders
5068
5069**Result**:
5070- Perfect color hierarchy ✓
5071- Correct background levels ✓
5072- Complete template integration ✓
5073
5074## Version 5.0.7 (2026-02-08) - COMPLETE ADMIN THEMING
5075
5076### �� Fixed: All Admin Backgrounds Use Template Colors
5077- **Fixed:** All section backgrounds use `__background_alt__`
5078- **Fixed:** All content backgrounds use `__background__`
5079- **Fixed:** All borders use `__border__`
5080- **Fixed:** All text uses `__text__`
5081- **Result:** Complete admin template integration!
5082
5083### All Replacements
5084
5085**Backgrounds**:
5086```php
5087Before: background: #f9f9f9
5088After:  background: ' . $colors['bg_alt'] . '
5089
5090Before: background: #fff / background: white
5091After:  background: ' . $colors['bg'] . '
5092```
5093
5094**Borders**:
5095```php
5096Before: border: 1px solid #ddd
5097Before: border: 1px solid #e0e0e0
5098Before: border: 1px solid #eee
5099After:  border: 1px solid ' . $colors['border'] . '
5100```
5101
5102**Text**:
5103```php
5104Before: color: #333
5105Before: color: #666
5106After:  color: ' . $colors['text'] . '
5107```
5108
5109### Complete Admin Coverage
5110
5111**All tabs now themed**:
5112- ✅ Manage Events tab
5113- ✅ Update Plugin tab
5114- ✅ Outlook Sync tab
5115- ✅ Themes tab
5116- ✅ Tab navigation
5117- ✅ All sections
5118- ✅ All inputs
5119- ✅ All borders
5120- ✅ All text
5121
5122### Visual Result
5123
5124**Light Template**:
5125```
5126Admin Page:
5127┌──────────────────────────┐
5128│ Tab Navigation           │ ← Template borders
5129├──────────────────────────┤
5130│ Section Headers          │ ← bg_alt (light gray)
5131│ ┌──────────────────────┐ │
5132│ │ Form Inputs          │ │ ← bg (white)
5133│ │ Content Areas        │ │
5134│ └──────────────────────┘ │
5135└──────────────────────────┘
5136All template colors! ✓
5137```
5138
5139**Dark Template**:
5140```
5141Admin Page:
5142┌──────────────────────────┐
5143│ Tab Navigation           │ ← Template borders
5144├──────────────────────────┤
5145│ Section Headers          │ ← bg_alt (dark gray)
5146│ ┌──────────────────────┐ │
5147│ │ Form Inputs          │ │ ← bg (darker)
5148│ │ Content Areas        │ │
5149│ └──────────────────────┘ │
5150└──────────────────────────┘
5151All template colors! ✓
5152```
5153
5154### Template Color Mapping
5155
5156**Used throughout admin**:
5157```
5158__background_site__ → $colors['bg']       (main backgrounds)
5159__background_alt__  → $colors['bg_alt']   (section backgrounds)
5160__text__            → $colors['text']     (all text)
5161__border__          → $colors['border']   (all borders)
5162__link__            → $colors['link']     (links - future)
5163```
5164
5165### Examples by Section
5166
5167**Manage Events**:
5168- Event list backgrounds: `bg_alt`
5169- Event item backgrounds: `bg`
5170- Borders: `border`
5171- Text: `text`
5172
5173**Update Plugin**:
5174- Section backgrounds: `bg_alt`
5175- Content areas: `bg`
5176- Borders: `border`
5177- Text: `text`
5178
5179**Outlook Sync**:
5180- Config sections: `bg_alt`
5181- Input fields: `bg`
5182- Borders: `border`
5183- Labels: `text`
5184
5185**Themes Tab**:
5186- Theme cards: `bg_alt`
5187- Preview areas: `bg`
5188- Borders: `border`
5189- Descriptions: `text`
5190
5191### Benefits
5192
5193**Seamless Integration**:
5194- Matches wiki admin area perfectly
5195- Same colors throughout wiki
5196- Professional appearance
5197- Consistent experience
5198
5199**Automatic Adaptation**:
5200- Light templates: Light admin
5201- Dark templates: Dark admin
5202- Custom templates: Uses custom colors
5203
5204**No White Boxes**:
5205- Every background themed
5206- Every border themed
5207- Every text themed
5208- Complete consistency
5209
5210### PERFECT HARMONY
5211
5212**Frontend (Calendar)**:
5213- Wiki theme uses style.ini5214- Perfect template match ✓
5215
5216**Backend (Admin)**:
5217- Reads same style.ini5218- Perfect template match ✓
5219
5220**Complete Unity**:
5221- Same colors everywhere ✓
5222- Seamless experience ✓
5223- Professional polish ✓
5224
5225## Version 5.0.6 (2026-02-08) - ADMIN PAGES USE TEMPLATE COLORS
5226
5227### �� Enhanced: Month/Year Header & Admin Pages Use Template Colors
5228- **Fixed:** Month/Year header now uses `__text_neu__` for wiki theme
5229- **Added:** Admin pages read template's style.ini file
5230- **Added:** `getTemplateColors()` function in admin class
5231- **Fixed:** Tab navigation uses template text and border colors
5232- **Result:** Complete template integration everywhere!
5233
5234### Month/Year Header
5235
5236**Before**:
5237```php
5238color: __text__  // Same as primary text
5239```
5240
5241**After (Wiki Theme)**:
5242```php
5243color: __text_neu__  // Dimmed text (subtle)
5244```
5245
5246### Admin Pages Enhancement
5247
5248**New `getTemplateColors()` function**:
5249- Reads template's style.ini file
5250- Extracts color replacements
5251- Provides colors to all admin tabs
5252- Falls back to sensible defaults
5253
5254**Colors used**:
5255```php
5256bg: __background_site__
5257bg_alt: __background_alt__
5258text: __text__
5259border: __border__
5260link: __link__
5261```
5262
5263**Applied to**:
5264- Tab navigation borders
5265- Tab text colors
5266- All admin sections
5267- Ready for future enhancements
5268
5269### Visual Result
5270
5271**Calendar Header**:
5272```
5273┌────────────────────┐
5274│ ‹ February 2026 › │ ← __text_neu__ (dimmed)
5275└────────────────────┘
5276Subtle and elegant ✓
5277```
5278
5279**Admin Navigation**:
5280```
5281�� Manage Events | �� Update | ⚙️ Config | �� Themes
5282─────────────────────────────────────────────────
5283Active tab: Green (#00cc07)
5284Inactive tabs: Template text color
5285Border: Template border color
5286```
5287
5288### Template Integration
5289
5290**Light Template**:
5291```ini
5292__text_neu__ = "#666666"
5293__border__ = "#cccccc"
5294```
5295**Result**:
5296- Month/Year: Medium gray (subtle)
5297- Admin borders: Light gray
5298- Tab text: Dark gray
5299
5300**Dark Template**:
5301```ini
5302__text_neu__ = "#999999"
5303__border__ = "#555555"
5304```
5305**Result**:
5306- Month/Year: Light gray (subtle)
5307- Admin borders: Medium gray
5308- Tab text: Bright gray
5309
5310### Benefits
5311
5312**Calendar Frontend**:
5313- Month/Year header more subtle
5314- Better visual hierarchy
5315- Less prominent, more elegant
5316
5317**Admin Backend**:
5318- Uses template colors
5319- Matches wiki admin area
5320- Consistent experience
5321- Professional appearance
5322
5323### Future-Ready
5324
5325The `getTemplateColors()` function is now available for:
5326- ✅ Tab navigation (implemented)
5327- �� Section backgrounds (ready)
5328- �� Button colors (ready)
5329- �� Input fields (ready)
5330- �� Success/error messages (ready)
5331
5332**Foundation laid for complete admin theming!** ��
5333
5334## Version 5.0.5 (2026-02-08) - WIKI THEME ADD BUTTON & SECTION HEADERS
5335
5336### �� Fixed: Add Event Bar & Section Headers Use Template Colors
5337- **Fixed:** Add Event bar now uses `__background_alt__` for wiki theme
5338- **Fixed:** "Today" header uses `__text_neu__`
5339- **Fixed:** "Tomorrow" header uses `__text__`
5340- **Fixed:** "Important Events" header uses `__border__`
5341- **Result:** Perfect template color integration!
5342
5343### All Changes
5344
5345**Add Event Bar (Wiki Theme)**:
5346
5347**Before**:
5348```php
5349background: #3498db  // Generic blue
5350```
5351
5352**After**:
5353```php
5354background: __background_alt__  // Template alternate bg
5355text: __text__                  // Template text color
5356hover: __background_neu__       // Template neutral bg
5357```
5358
5359**Section Headers (Wiki Theme)**:
5360
5361**Before**:
5362```php
5363Today: #ff9800           // Orange
5364Tomorrow: #4caf50        // Green
5365Important Events: #9b59b6 // Purple
5366```
5367
5368**After**:
5369```php
5370Today: __text_neu__      // Template dimmed text
5371Tomorrow: __text__       // Template primary text
5372Important Events: __border__ // Template border color
5373```
5374
5375### Visual Result
5376
5377**Wiki Default Theme**:
5378```
5379Add Event Bar:
5380┌────────────────┐
5381│  + ADD EVENT   │ ← Template alt background
5382└────────────────┘
5383
5384Sections:
5385━━━━━━━━━━━━━━━━
5386Today              ← Dimmed text color (__text_neu__)
5387• Team Meeting
5388
5389Tomorrow           ← Primary text color (__text__)
5390• Code Review
5391
5392Important Events   ← Border color (__border__)
5393• Project Deadline
5394```
5395
5396### Example with DokuWiki Default Template
5397
5398**Template colors**:
5399```ini
5400__background_alt__ = "#e8e8e8"
5401__text__ = "#333333"
5402__text_neu__ = "#666666"
5403__border__ = "#cccccc"
5404```
5405
5406**Calendar result**:
5407```
5408Add Event Bar: Light gray (#e8e8e8)
5409Today header: Medium gray (#666666)
5410Tomorrow header: Dark gray (#333333)
5411Important Events header: Border gray (#cccccc)
5412```
5413
5414### Example with Dark Template
5415
5416**Template colors**:
5417```ini
5418__background_alt__ = "#2d2d2d"
5419__text__ = "#e0e0e0"
5420__text_neu__ = "#999999"
5421__border__ = "#555555"
5422```
5423
5424**Calendar result**:
5425```
5426Add Event Bar: Dark gray (#2d2d2d)
5427Today header: Light gray (#999999)
5428Tomorrow header: Bright gray (#e0e0e0)
5429Important Events header: Medium gray (#555555)
5430```
5431
5432### Perfect Harmony
5433
5434All sidebar elements now use template colors:
5435- ✅ Add Event bar background
5436- ✅ Add Event bar text
5437- ✅ Today section header
5438- ✅ Tomorrow section header
5439- ✅ Important Events header
5440- ✅ Calendar cells
5441- ✅ Grid backgrounds
5442- ✅ All borders
5443
5444**Complete template integration!** ��
5445
5446## Version 5.0.4 (2026-02-08) - USE __background__ FOR CALENDAR CELLS
5447
5448### �� Fixed: Calendar Cells Use Correct Template Color
5449- **Fixed:** Calendar cells now use `__background__` from template
5450- **Changed:** `cell_bg` now uses `__background__` instead of `__background_neu__`
5451- **Result:** Calendar cells match main content area background!
5452
5453### Color Mapping Update
5454
5455**Before (v5.0.3)**:
5456```php
5457cell_bg: __background_neu__  // Wrong - this is for neutral/alternate
5458```
5459
5460**After (v5.0.4)**:
5461```php
5462cell_bg: __background__      // Correct - main content background
5463```
5464
5465### Template Color Usage
5466
5467**Wiki Default theme now uses**:
5468```
5469__background_site__ → Overall page background
5470__background__      → Calendar cells (main content bg)
5471__background_alt__  → Grid background, headers
5472__background_neu__  → Today cell highlight
5473__text__            → Primary text
5474__text_neu__        → Dimmed text
5475__link__            → Links, bright text
5476__border__          → All borders
5477```
5478
5479### Visual Result
5480
5481**Before**:
5482```
5483Calendar with template colors:
5484┌─────┬─────┬─────┐
5485│ Mon │ Tue │ Wed │
5486├─────┼─────┼─────┤
5487│  8  │  9  │ 10  │ ← Neutral gray (wrong)
5488└─────┴─────┴─────┘
5489```
5490
5491**After**:
5492```
5493Calendar with template colors:
5494┌─────┬─────┬─────┐
5495│ Mon │ Tue │ Wed │
5496├─────┼─────┼─────┤
5497│  8  │  9  │ 10  │ ← White/content bg (correct!)
5498└─────┴─────┴─────┘
5499```
5500
5501### Example Template Colors
5502
5503**DokuWiki Default**:
5504```ini
5505__background__ = "#ffffff"
5506```
5507**Result**: White calendar cells ✓
5508
5509**Dark Template**:
5510```ini
5511__background__ = "#2d2d2d"
5512```
5513**Result**: Dark calendar cells ✓
5514
5515**Custom Template**:
5516```ini
5517__background__ = "#f9f9f9"
5518```
5519**Result**: Custom color cells ✓
5520
5521### Perfect Matching
5522
5523Calendar cells now match:
5524- ✅ Main content area background
5525- ✅ Article/page background
5526- ✅ Content box background
5527- ✅ Same as wiki text background
5528
5529**Seamless integration!** ��
5530
5531## Version 5.0.3 (2026-02-08) - READ COLORS FROM TEMPLATE STYLE.INI
5532
5533### �� Enhanced: Wiki Default Theme Reads Template Colors
5534- **Added:** Function to read colors from DokuWiki template's style.ini file
5535- **Reads:** `/var/www/html/dokuwiki/conf/tpl/{template}/style.ini`
5536- **Falls back:** Also checks `/var/www/html/dokuwiki/lib/tpl/{template}/style.ini`
5537- **Uses:** Actual template colors instead of CSS variables
5538- **Result:** Perfect color matching with any DokuWiki template!
5539
5540### How It Works
5541
5542**New Function: `getWikiTemplateColors()`**
5543
55441. **Detects** current DokuWiki template name
55452. **Reads** the template's `style.ini` file
55463. **Parses** color replacements section
55474. **Maps** template colors to calendar theme
55485. **Falls back** to CSS variables if file not found
5549
5550### Colors Read from style.ini
5551
5552**Template color replacements used**:
5553```php
5554__background_site__  → bg, header_bg
5555__background_alt__   → grid_bg, cell_today_bg
5556__background_neu__   → cell_bg
5557__text__             → text_primary
5558__text_neu__         → text_dim
5559__link__             → text_bright
5560__border__           → border, grid_border
5561```
5562
5563### Example style.ini Mapping
5564
5565**Template style.ini**:
5566```ini
5567[replacements]
5568__background_site__ = "#f8f9fa"
5569__background_alt__  = "#e9ecef"
5570__background_neu__  = "#dee2e6"
5571__text__            = "#212529"
5572__text_neu__        = "#6c757d"
5573__link__            = "#0d6efd"
5574__border__          = "#ced4da"
5575```
5576
5577**Calendar theme result**:
5578```php
5579bg: #f8f9fa
5580header_bg: #e9ecef
5581grid_bg: #e9ecef
5582cell_bg: #dee2e6
5583text_primary: #212529
5584text_dim: #6c757d
5585text_bright: #0d6efd
5586border: #ced4da
5587grid_border: #ced4da
5588```
5589
5590### Before vs After
5591
5592**Before (v5.0.2)**:
5593```
5594Wiki Default theme used:
5595- CSS variables (var(--__background__, #fff))
5596- Required browser CSS variable support
5597- Fallback to generic colors
5598```
5599
5600**After (v5.0.3)**:
5601```
5602Wiki Default theme uses:
5603- Actual colors from template's style.ini
5604- Exact template color values
5605- No CSS variable dependency
5606- Perfect color matching!
5607```
5608
5609### File Location Priority
5610
5611Checks in order:
56121. `/var/www/html/dokuwiki/conf/tpl/{template}/style.ini`
56132. `/var/www/html/dokuwiki/lib/tpl/{template}/style.ini`
56143. Falls back to CSS variables if neither found
5615
5616### Benefits
5617
5618**More accurate colors**:
5619- Uses exact template color values ✓
5620- No CSS variable interpolation ✓
5621- Consistent across all browsers ✓
5622
5623**Better compatibility**:
5624- Works with older browsers ✓
5625- No CSS variable support needed ✓
5626- Direct color values ✓
5627
5628**Perfect matching**:
5629- Reads template's actual colors ✓
5630- Same colors as wiki pages ✓
5631- Seamless integration ✓
5632
5633### Template Examples
5634
5635**DokuWiki Default Template**:
5636```
5637Reads: lib/tpl/dokuwiki/style.ini
5638Gets: Default DokuWiki colors
5639Result: Perfect classic DokuWiki look
5640```
5641
5642**Bootstrap Template**:
5643```
5644Reads: lib/tpl/bootstrap3/style.ini
5645Gets: Bootstrap color scheme
5646Result: Perfect Bootstrap integration
5647```
5648
5649**Custom Template**:
5650```
5651Reads: conf/tpl/mycustom/style.ini
5652Gets: Your custom colors
5653Result: Perfect custom theme match
5654```
5655
5656### Fallback Chain
5657
56581. **Try** reading style.ini from template
56592. **If found** → Use exact colors from file
56603. **If not found** → Use CSS variables
56614. **If no CSS vars** → Use fallback colors
5662
5663**Always works, always matches!** ✓
5664
5665## Version 5.0.2 (2026-02-08) - FIX WIKI DEFAULT THEME DAY PANEL
5666
5667### �� Fixed: Wiki Default Theme Day Panel Colors
5668- **Fixed:** Day popup panel now uses DokuWiki CSS variables
5669- **Fixed:** Panel background matches wiki theme
5670- **Fixed:** Panel header matches wiki theme
5671- **Fixed:** Border colors use wiki theme
5672- **Fixed:** Text colors use wiki theme
5673- **Result:** Perfect integration with DokuWiki templates!
5674
5675### All Changes
5676
5677**Day Panel Colors (Wiki Default)**:
5678
5679**Before**:
5680```php
5681background: rgba(36, 36, 36, 0.5)  // Dark gray (wrong!)
5682header: #3498db                     // Blue (wrong!)
5683```
5684
5685**After**:
5686```php
5687background: var(--__background__, #fff)
5688header: var(--__background_alt__, #e8e8e8)
5689header_text: var(--__text__, #333)
5690border: var(--__border__, #ccc)
5691shadow: 0 2px 4px rgba(0, 0, 0, 0.1)
5692```
5693
5694**Event Colors (Wiki Default)**:
5695```php
5696event_bg: var(--__background_alt__, rgba(245, 245, 245, 0.5))
5697border_color: var(--__border__, rgba(204, 204, 204, 0.3))
5698bar_shadow: 0 1px 2px rgba(0, 0, 0, 0.15)
5699```
5700
5701### Before vs After
5702
5703**Before (v5.0.1)**:
5704```
5705Wiki Default - Click Week Cell:
5706┌────────────────┐
5707│ Monday, Feb 8  │ ← Blue header (wrong)
5708├────────────────┤
5709│ Team Meeting   │ ← Dark gray bg (wrong)
5710│ 2:00 PM        │
5711└────────────────┘
5712Doesn't match wiki theme
5713```
5714
5715**After (v5.0.2)**:
5716```
5717Wiki Default - Click Week Cell:
5718
5719Light Wiki Theme:
5720┌────────────────┐
5721│ Monday, Feb 8  │ ← Light gray header ✓
5722├────────────────┤
5723│ Team Meeting   │ ← White bg ✓
5724│ 2:00 PM        │   Dark text ✓
5725└────────────────┘
5726
5727Dark Wiki Theme:
5728┌────────────────┐
5729│ Monday, Feb 8  │ ← Dark header ✓
5730├────────────────┤
5731│ Team Meeting   │ ← Dark bg ✓
5732│ 2:00 PM        │   Light text ✓
5733└────────────────┘
5734
5735Perfectly matches wiki!
5736```
5737
5738### CSS Variables Used
5739
5740**Wiki Default theme now uses**:
5741- `--__background__` - Main background (panel body)
5742- `--__background_alt__` - Alternate bg (panel header, events)
5743- `--__text__` - Text color (header text)
5744- `--__border__` - Border color (panel border, event borders)
5745
5746**With fallbacks**:
5747```css
5748var(--__background__, #fff)           /* white fallback */
5749var(--__background_alt__, #e8e8e8)    /* light gray fallback */
5750var(--__text__, #333)                 /* dark text fallback */
5751var(--__border__, #ccc)               /* gray border fallback */
5752```
5753
5754### Perfect Adaptation
5755
5756**Light Templates**:
5757- Light panel backgrounds ✓
5758- Dark text ✓
5759- Subtle borders ✓
5760- Clean appearance ✓
5761
5762**Dark Templates**:
5763- Dark panel backgrounds ✓
5764- Light text ✓
5765- Visible borders ✓
5766- Perfect contrast ✓
5767
5768**Custom Templates**:
5769- Uses template's CSS variables ✓
5770- Automatic adaptation ✓
5771- Seamless integration ✓
5772
5773### Now Truly Adaptive
5774
5775Wiki Default theme now properly uses DokuWiki CSS variables for:
5776- ✅ Calendar grid
5777- ✅ Sidebar widget
5778- ✅ Event list
5779- ✅ **Day panel** ← v5.0.2!
5780- ✅ All backgrounds
5781- ✅ All text
5782- ✅ All borders
5783
5784**Complete wiki integration!** ��
5785
5786## Version 5.0.1 (2026-02-08) - THEME CONFLICT TOOLTIPS
5787
5788### �� Enhanced: Time Conflict Tooltips Now Themed
5789- **Fixed:** Conflict tooltips now match calendar theme
5790- **Added:** Theme-aware background, border, text colors
5791- **Added:** Theme-aware shadow effects
5792- **Result:** Complete visual consistency!
5793
5794### Tooltip Theming
5795
5796**Now uses theme colors for**:
5797- Background: Theme background color
5798- Border: Theme border color
5799- Header text: Theme primary text color
5800- Item text: Theme dim text color
5801- Shadow: Theme shadow color
5802
5803### Before vs After
5804
5805**Before (v5.0.0)**:
5806```
5807Hover ⚠️ badge:
5808┌─────────────────┐
5809│ ⚠️ Time Conflicts│ ← Default colors
5810│ • Event A       │
5811│ • Event B       │
5812└─────────────────┘
5813```
5814
5815**After (v5.0.1)**:
5816```
5817Matrix Theme:
5818┌─────────────────┐
5819│ ⚠️ Time Conflicts│ ← Green header
5820│ • Event A       │ ← Green text
5821│ • Event B       │   Dark green bg
5822└─────────────────┘
5823
5824Purple Theme:
5825┌─────────────────┐
5826│ ⚠️ Time Conflicts│ ← Purple header
5827│ • Event A       │ ← Purple text
5828│ • Event B       │   Dark purple bg
5829└─────────────────┘
5830
5831Professional Theme:
5832┌─────────────────┐
5833│ ⚠️ Time Conflicts│ ← Blue header
5834│ • Event A       │ ← Dark text
5835│ • Event B       │   Light bg
5836└─────────────────┘
5837
5838Pink Theme:
5839┌─────────────────┐
5840│ ⚠️ Time Conflicts│ ← Pink header ✨
5841│ • Event A       │ ← Pink text
5842│ • Event B       │   Dark pink bg ��
5843└─────────────────┘
5844
5845Wiki Default:
5846┌─────────────────┐
5847│ ⚠️ Time Conflicts│ ← Adapts to wiki
5848│ • Event A       │ ← Wiki colors
5849│ • Event B       │
5850└─────────────────┘
5851```
5852
5853### Now 100% Complete
5854
5855**Every tooltip themed**:
5856- ✅ Conflict tooltips
5857- ✅ All other tooltips (if any)
5858- ✅ Perfect consistency
5859
5860**Absolute perfection!** ✨
5861
5862## Version 5.0.0 (2026-02-08) - MAJOR RELEASE: COMPLETE THEMING PERFECTION
5863
5864### �� Major Milestone: Version 5.0
5865
5866This is a major release representing the completion of comprehensive theming across the entire calendar plugin. Every visual element has been carefully themed for consistency and beauty.
5867
5868### Complete Feature Set
5869
5870**5 Beautiful Themes**:
5871- �� Matrix Edition (Green with glow)
5872- �� Purple Dream (Elegant purple)
5873- �� Professional Blue (Clean and modern)
5874- �� Pink Bling (Maximum sparkle)
5875- �� Wiki Default (Auto-adapts to your DokuWiki theme)
5876
5877**100% Theme Coverage**:
5878- ✅ Calendar grid and cells
5879- ✅ Event boxes and borders
5880- ✅ Sidebar widget
5881- ✅ Event list panel
5882- ✅ Search functionality
5883- ✅ Edit/Add dialogs (complete)
5884- ✅ Day popup dialogs
5885- ✅ Month picker
5886- ✅ All text (primary, dim, bright)
5887- ✅ All buttons
5888- ✅ All inputs and forms
5889- ✅ All checkboxes
5890- ✅ All borders
5891- ✅ All badges and labels
5892- ✅ Event highlight effects
5893
5894**Perfect Visual Consistency**:
5895- No white pixels anywhere
5896- No unthemed elements
5897- No default colors
5898- Complete visual unity
5899
5900### Major Improvements in v5.0
5901
59021. **Complete Dialog Theming** (v4.8.5-4.8.7)
5903   - Edit event dialog fully themed
5904   - Day popup dialog fully themed
5905   - All form inputs themed
5906   - All checkboxes themed
5907   - All buttons themed
5908
59092. **Event Box Border Perfection** (v4.8.6)
5910   - All 4 borders themed (top, right, bottom, left)
5911   - Sidebar event dividers themed
5912   - Past Events toggle border themed
5913
59143. **Checkbox Field Borders** (v4.9.0)
5915   - Repeating Event section border themed
5916   - Task checkbox section border themed
5917
59184. **Wiki Default Theme** (v4.10.0)
5919   - New 5th theme
5920   - Uses DokuWiki CSS variables
5921   - Auto-adapts to any wiki template
5922   - Perfect for seamless integration
5923
59245. **Clean Text Appearance** (v4.11.0)
5925   - Removed text glow from Matrix
5926   - Removed text glow from Purple
5927   - Removed text glow from Professional
5928   - Removed text glow from Wiki Default
5929   - Kept text glow on Pink Bling only
5930
59316. **Event Highlight Effects** (v4.12.0-4.12.1)
5932   - Theme-aware highlight glow
5933   - Click event bar → event glows
5934   - 3-second themed glow effect
5935   - Smooth animations
5936
5937### See RELEASE_NOTES.md for Complete Details
5938
5939For a comprehensive overview of all features, themes, and improvements, see the new **RELEASE_NOTES.md** file included in this release.
5940
5941## Version 4.12.1 (2026-02-08) - FIX EVENT HIGHLIGHT FUNCTION
5942
5943### �� Fixed: Event Highlight Now Working
5944- **Fixed:** Used setProperty() to properly apply !important styles
5945- **Added:** Console logging for debugging
5946- **Fixed:** Proper style application with important flag
5947- **Result:** Highlight glow now works correctly!
5948
5949### Technical Fix
5950
5951**Before (not working)**:
5952```javascript
5953eventItem.style.background = color + ' !important'; // Doesn't work
5954```
5955
5956**After (working)**:
5957```javascript
5958eventItem.style.setProperty('background', color, 'important'); // Works!
5959```
5960
5961### Added Debug Logging
5962
5963Console now shows:
5964- "Highlighting event: [calId] [eventId] [date]"
5965- "Found event item: [element]"
5966- "Theme: [theme name]"
5967- "Highlight colors: [bg] [shadow]"
5968- "Applied highlight styles"
5969- "Removing highlight" (after 3 seconds)
5970
5971### Now Working
5972
5973Click any event bar → Event glows with theme colors ✓
5974
5975## Version 4.12.0 (2026-02-08) - THEME-AWARE EVENT HIGHLIGHT GLOW
5976
5977### ✨ Enhanced: Event Click Highlight Now Theme-Aware
5978- **Fixed:** Restored event highlight glow when clicking calendar bars
5979- **Improved:** Highlight now matches each theme's colors
5980- **Added:** Stronger glow effect for better visibility
5981- **Duration:** 3 seconds with smooth fade
5982- **Result:** Beautiful themed highlights for all themes!
5983
5984### How It Works
5985
5986When you click an event bar in the calendar, the corresponding event in the event list now highlights with a themed glow:
5987
5988**Matrix Theme**:
5989```javascript
5990Background: Darker green (#1a3d1a)
5991Glow: Double green glow (0 0 20px + 0 0 40px)
5992Color: rgba(0, 204, 7, 0.8)
5993```
5994
5995**Purple Theme**:
5996```javascript
5997Background: Darker purple (#3d2b4d)
5998Glow: Double purple glow
5999Color: rgba(155, 89, 182, 0.8)
6000```
6001
6002**Professional Theme**:
6003```javascript
6004Background: Light blue (#e3f2fd)
6005Glow: Single blue glow
6006Color: rgba(74, 144, 226, 0.4)
6007```
6008
6009**Pink Theme**:
6010```javascript
6011Background: Darker pink (#3d2030)
6012Glow: Double pink glow ✨��
6013Color: rgba(255, 20, 147, 0.8)
6014```
6015
6016**Wiki Theme**:
6017```javascript
6018Background: var(--__background_neu__)
6019Glow: Blue glow (adapts to wiki)
6020Color: rgba(43, 115, 183, 0.4)
6021```
6022
6023### Visual Examples
6024
6025**Matrix - Click Event**:
6026```
6027Calendar:
6028┌─────────────┐
6029│ 2:00 PM │ ← Click this bar
6030└─────────────┘
6031
6032Event List:
6033╔═════════════════════╗
6034║ Team Meeting        ║ ← GLOWS GREEN
6035║ 2:00 PM             ║    for 3 seconds
6036╚═════════════════════╝
6037   ↑↑↑ Strong green glow ↑↑↑
6038```
6039
6040**Purple - Click Event**:
6041```
6042Calendar:
6043┌─────────────┐
6044│ 4:00 PM │ ← Click
6045└─────────────┘
6046
6047Event List:
6048╔═════════════════════╗
6049║ Code Review         ║ ← GLOWS PURPLE
6050║ 4:00 PM             ║    for 3 seconds
6051╚═════════════════════╝
6052   ↑↑↑ Strong purple glow ↑↑↑
6053```
6054
6055**Pink - Click Event**:
6056```
6057Calendar:
6058┌─────────────┐
6059│ 1:00 PM │ ← Click
6060└─────────────┘
6061
6062Event List:
6063╔═════════════════════╗
6064║ Lunch Date ��       ║ ← GLOWS PINK
6065║ 1:00 PM ✨          ║    for 3 seconds
6066╚═════════════════════╝
6067   ↑↑↑ MAXIMUM SPARKLE ↑↑↑
6068```
6069
6070### Glow Specifications
6071
6072**Matrix**:
6073- Background: Dark green
6074- Shadow: `0 0 20px rgba(0, 204, 7, 0.8)`
6075- Outer glow: `0 0 40px rgba(0, 204, 7, 0.4)`
6076- Effect: Strong green pulse
6077
6078**Purple**:
6079- Background: Dark purple
6080- Shadow: `0 0 20px rgba(155, 89, 182, 0.8)`
6081- Outer glow: `0 0 40px rgba(155, 89, 182, 0.4)`
6082- Effect: Strong purple pulse
6083
6084**Professional**:
6085- Background: Light blue
6086- Shadow: `0 0 20px rgba(74, 144, 226, 0.4)`
6087- Effect: Subtle blue glow
6088
6089**Pink**:
6090- Background: Dark pink
6091- Shadow: `0 0 20px rgba(255, 20, 147, 0.8)`
6092- Outer glow: `0 0 40px rgba(255, 20, 147, 0.4)`
6093- Effect: MAXIMUM SPARKLE ✨��
6094
6095**Wiki**:
6096- Background: Theme neutral color
6097- Shadow: `0 0 20px rgba(43, 115, 183, 0.4)`
6098- Effect: Adapts to wiki theme
6099
6100### User Experience
6101
6102**Click event bar** → Event highlights with themed glow
6103**Auto-scroll** → Event scrolls into view smoothly
6104**3 second glow** → Fade out after 3 seconds
6105**Smooth transition** → 0.3s ease-in-out
6106
6107### Perfect for Finding Events
6108
6109**Large event lists**: Quickly locate the clicked event ✓
6110**Visual feedback**: Know which event you clicked ✓
6111**Theme consistency**: Matches your chosen theme ✓
6112**Smooth animation**: Professional appearance ✓
6113
6114### All Themes Covered
6115
6116- ✅ Matrix: Green glow
6117- ✅ Purple: Purple glow
6118- ✅ Professional: Blue glow
6119- ✅ Pink: Maximum pink sparkle
6120- ✅ Wiki: Adaptive glow
6121
6122**Click any event bar and watch it glow!** ✨
6123
6124## Version 4.11.0 (2026-02-08) - REMOVE TEXT GLOW FROM NON-PINK THEMES
6125
6126### �� Changed: Text Glow Now Pink-Only
6127- **Removed:** Text shadow/glow from Matrix theme
6128- **Removed:** Text shadow/glow from Purple theme
6129- **Removed:** Text shadow/glow from Professional theme (already had none)
6130- **Removed:** Text shadow/glow from Wiki Default theme
6131- **Kept:** Text shadow/glow ONLY on Pink Bling theme
6132- **Result:** Cleaner look for Matrix, Purple, and Wiki themes!
6133
6134### All Changes
6135
6136**Before (Matrix, Purple)**:
6137```css
6138text-shadow: 0 0 2px $text_color; /* Glow effect */
6139```
6140
6141**After (Matrix, Purple, Professional, Wiki)**:
6142```css
6143text-shadow: none; /* Clean, no glow */
6144```
6145
6146**Pink Bling (unchanged)**:
6147```css
6148text-shadow: 0 0 2px $text_color; /* Still has glow ✨ */
6149```
6150
6151### Text Shadow Removed From
6152
6153**Sidebar day numbers**: No glow ✓
6154**Event titles**: No glow ✓
6155**Event dates**: No glow ✓
6156**Add Event button**: No glow ✓
6157**Day popup events**: No glow ✓
6158
6159### Before vs After
6160
6161**BEFORE (Matrix)**:
6162```
6163Event Title ✨ ← Glowing green text
61642:00 PM ✨     ← Glowing text
6165```
6166
6167**AFTER (Matrix)**:
6168```
6169Event Title    ← Clean green text
61702:00 PM        ← Clean text
6171```
6172
6173**Pink Bling (Still Glows)**:
6174```
6175Event Title ✨�� ← Still glowing!
61762:00 PM ✨     ← Maximum sparkle!
6177```
6178
6179### Theme Appearances
6180
6181**�� Matrix Edition**:
6182- Clean green text
6183- No glow effects
6184- Professional appearance
6185- Still has border glow
6186
6187**�� Purple Dream**:
6188- Clean purple text
6189- No glow effects
6190- Elegant appearance
6191- Still has border glow
6192
6193**�� Professional Blue**:
6194- Clean text (unchanged)
6195- No glow effects
6196- Modern appearance
6197
6198**�� Pink Bling**:
6199- Glowing pink text ✨
6200- Maximum glow effects ��
6201- Sparkle everywhere!
6202- All the bling!
6203
6204**�� Wiki Default**:
6205- Clean text
6206- No glow effects
6207- Matches wiki theme
6208
6209### Glow Effects Remaining
6210
6211**Border/box glow**: Still present on all themes ✓
6212**Pink text glow**: Only on Pink Bling ✓
6213**Shadow effects**: Still on buttons/boxes6214
6215**Only TEXT glow removed from non-pink themes!**
6216
6217### Result
6218
6219**Cleaner, more professional look** for:
6220- Matrix ✓
6221- Purple ✓
6222- Professional ✓
6223- Wiki Default ✓
6224
6225**Maximum sparkle** for:
6226- Pink Bling ✨��✓
6227
6228**Best of both worlds!** ��
6229
6230## Version 4.10.0 (2026-02-08) - NEW WIKI DEFAULT THEME
6231
6232### �� New: Wiki Default Theme
6233- **Added:** 5th theme that automatically matches your DokuWiki template
6234- **Uses:** CSS variables from your wiki theme
6235- **Adapts:** Automatically works with light and dark themes
6236- **Perfect:** Seamless integration with any DokuWiki template
6237
6238### How It Works
6239
6240**Wiki theme uses DokuWiki CSS variables**:
6241```css
6242bg: var(--__background_site__, #f5f5f5)
6243border: var(--__border__, #ccc)
6244text_primary: var(--__text__, #333)
6245text_bright: var(--__link__, #2b73b7)
6246text_dim: var(--__text_neu__, #666)
6247cell_bg: var(--__background__, #fff)
6248grid_border: var(--__border__, #ccc)
6249```
6250
6251**With fallbacks for older DokuWiki versions**:
6252- If CSS variables exist → Use them ✓
6253- If not available → Use fallback values ✓
6254
6255### All 5 Themes
6256
6257**1. �� Matrix Edition** (Default)
6258- Dark green with neon glow
6259- Matrix-style effects
6260- Original theme
6261
6262**2. �� Purple Dream**
6263- Rich purple with violet accents
6264- Elegant and sophisticated
6265- Soft glow effects
6266
6267**3. �� Professional Blue**
6268- Clean blue and grey
6269- Modern professional
6270- No glow effects
6271
6272**4. �� Pink Bling**
6273- Glamorous hot pink
6274- Maximum sparkle ✨
6275- Hearts and diamonds
6276
6277**5. �� Wiki Default** ← NEW!
6278- Matches your wiki template
6279- Auto-adapts to light/dark
6280- Perfect integration
6281
6282### Examples
6283
6284**Light Wiki Template**:
6285```
6286Wiki Default theme shows:
6287- Light backgrounds (#f5f5f5)
6288- Dark text (#333)
6289- Light inputs (#fff)
6290- Gray borders (#ccc)
6291
6292Matches perfectly! ✓
6293```
6294
6295**Dark Wiki Template**:
6296```
6297Wiki Default theme shows:
6298- Dark backgrounds (from template)
6299- Light text (from template)
6300- Dark inputs (from template)
6301- Dark borders (from template)
6302
6303Matches perfectly! ✓
6304```
6305
6306**Bootstrap Template**:
6307```
6308Uses Bootstrap's colors
6309Matches perfectly! ✓
6310```
6311
6312**Material Template**:
6313```
6314Uses Material's colors
6315Matches perfectly! ✓
6316```
6317
6318### CSS Variables Used
6319
6320**DokuWiki provides**:
6321- `--__background_site__`: Page background
6322- `--__background_alt__`: Section backgrounds
6323- `--__background__`: Content backgrounds
6324- `--__text__`: Primary text color
6325- `--__link__`: Link color
6326- `--__text_neu__`: Dimmed text
6327- `--__border__`: Border color
6328- `--__background_neu__`: Neutral background
6329
6330**All with fallbacks**:
6331```css
6332var(--__background_site__, #f5f5f5)
6333/* Falls back to light gray if variable doesn't exist */
6334```
6335
6336### Perfect for Every Template
6337
6338**Custom templates**: Automatically adapts ✓
6339**Light themes**: Perfect match ✓
6340**Dark themes**: Perfect match ✓
6341**Any DokuWiki version**: Works with fallbacks ✓
6342
6343### Complete Theme Collection
6344
6345Now with **5 gorgeous themes**:
6346- 3 dark themes (Matrix, Purple, Pink)
6347- 1 light theme (Professional)
6348- 1 adaptive theme (Wiki Default) ← NEW!
6349
6350**Something for everyone!** ��
6351
6352## Version 4.9.0 (2026-02-08) - FIX CHECKBOX FIELD BORDERS
6353
6354### �� Fixed: Checkbox Field Borders Themed
6355- **Fixed:** Added border-color to checkbox field divs
6356- **Fixed:** Repeating Event section border
6357- **Fixed:** Task checkbox section border
6358- **Result:** No white borders around checkboxes!
6359
6360### Changes
6361
6362**Checkbox Field Border Styling**:
6363
6364**Before**:
6365```html
6366<div class="form-field-checkbox"
6367     style="background: $bg !important;">
6368<!-- Border shows white ✗ -->
6369```
6370
6371**After**:
6372```php
6373<div class="form-field-checkbox"
6374     style="background: $bg !important;
6375            border-color: $grid_border !important;">
6376<!-- Border themed ✓ -->
6377```
6378
6379### Before vs After
6380
6381**BEFORE (v4.8.8)**:
6382```
6383Edit Dialog:
6384┌──────────────────┐
6385│ ☑ Repeating     ║│ ← White border ✗
6386└──────────────────┘
6387┌──────────────────┐
6388│ ☑ Task checkbox ║│ ← White border ✗
6389└──────────────────┘
6390```
6391
6392**AFTER (v4.9.0)**:
6393```
6394Matrix Edit Dialog:
6395┌──────────────────┐
6396│ ☑ Repeating      │ ← Green border ✓
6397└──────────────────┘
6398┌──────────────────┐
6399│ ☑ Task checkbox  │ ← Green border ✓
6400└──────────────────┘
6401```
6402
6403### ABSOLUTE PERFECTION ACHIEVED
6404
6405**Every element themed**:
6406- ✅ All inputs
6407- ✅ All labels
6408- ✅ All sections
6409- ✅ **Checkbox field borders** ← v4.9.0!
6410- ✅ All buttons
6411- ✅ All checkboxes
6412- ✅ No white anywhere
6413
6414**100% COMPLETE!** ��✨
6415
6416## Version 4.8.8 (2026-02-08) - FINAL FIXES: CHECKBOXES, BORDERS, BACKGROUNDS
6417
6418### �� Fixed: Checkbox Field Borders Themed
6419- **Fixed:** Added border-color to checkbox field divs
6420- **Fixed:** Repeating Event section border
6421- **Fixed:** Task checkbox section border
6422- **Result:** No white borders around checkboxes!
6423
6424### �� Fixed: Admin Sections Respect Wiki Theme
6425- **Fixed:** All admin backgrounds use CSS variables
6426- **Fixed:** Text colors use wiki text color
6427- **Fixed:** Borders use wiki border color
6428- **Result:** Admin matches wiki theme perfectly!
6429
6430### All Changes
6431
6432**1. Checkbox Field Border Styling**:
6433
6434**Before**:
6435```html
6436<div class="form-field-checkbox"
6437     style="background: $bg !important;">
6438<!-- Border shows white ✗ -->
6439```
6440
6441**After**:
6442```php
6443<div class="form-field-checkbox"
6444     style="background: $bg !important;
6445            border-color: $grid_border !important;">
6446<!-- Border themed ✓ -->
6447```
6448
6449**2. Admin CSS Variables**:
6450
6451**Added CSS variables for wiki theme compatibility**:
6452```css
6453.calendar-admin-wrapper {
6454    background: var(--__background_site__, #f5f5f5);
6455    color: var(--__text__, #333);
6456}
6457.calendar-admin-section {
6458    background: var(--__background_alt__, #fafafa);
6459}
6460.calendar-admin-input {
6461    background: var(--__background__, #fff);
6462    color: var(--__text__, #333);
6463}
6464```
6465
6466**Replaced hardcoded colors**:
6467```php
6468// Before:
6469background: #f9f9f9
6470background: white
6471color: #333
6472border: 1px solid #ddd
6473
6474// After:
6475background: var(--__background_alt__, #f9f9f9)
6476background: var(--__background__, #fff)
6477color: var(--__text__, #333)
6478border: 1px solid var(--__border__, #ddd)
6479```
6480
6481### Before vs After
6482
6483**BEFORE (v4.8.8)**:
6484```
6485Edit Dialog:
6486┌──────────────────┐
6487│ ☑ Repeating     ║│ ← White border ✗
6488└──────────────────┘
6489┌──────────────────┐
6490│ ☑ Task checkbox ║│ ← White border ✗
6491└──────────────────┘
6492
6493Admin Page (Dark Wiki Theme):
6494┌──────────────────┐
6495│ Light sections  │ ← White boxes ✗
6496│ Light inputs    │ ← Doesn't match ✗
6497└──────────────────┘
6498```
6499
6500**AFTER (v4.8.9)**:
6501```
6502Matrix Edit Dialog:
6503┌──────────────────┐
6504│ ☑ Repeating      │ ← Green border ✓
6505└──────────────────┘
6506┌──────────────────┐
6507│ ☑ Task checkbox  │ ← Green border ✓
6508└──────────────────┘
6509
6510Admin (Dark Wiki Theme):
6511┌──────────────────┐
6512│ Dark sections   │ ← Matches wiki ✓
6513│ Dark inputs     │ ← Perfect match ✓
6514└──────────────────┘
6515```
6516
6517### Admin Theme Examples
6518
6519**Light Wiki Theme**:
6520```
6521Admin page backgrounds: Light
6522Section boxes: Light gray
6523Inputs: White
6524Borders: Gray
6525Text: Dark
6526
6527Perfect match! ✓
6528```
6529
6530**Dark Wiki Theme**:
6531```
6532Admin page backgrounds: Dark
6533Section boxes: Darker gray
6534Inputs: Dark
6535Borders: Dark gray
6536Text: Light
6537
6538Perfect match! ✓
6539```
6540
6541**DokuWiki Default**:
6542```
6543Uses wiki's CSS variables
6544Automatically adapts
6545Always matches! ✓
6546```
6547
6548### Complete Coverage
6549
6550**Edit Dialog**:
6551- ✅ All inputs themed
6552- ✅ All labels themed
6553- ✅ All sections themed
6554- ✅ **Checkbox borders** ← v4.8.9!
6555- ✅ All buttons themed
6556- ✅ No white anywhere
6557
6558**Admin Interface**:
6559- ✅ **Tab navigation** ← v4.8.9!
6560- ✅ **Section boxes** ← v4.8.9!
6561- ✅ **Input fields** ← v4.8.9!
6562- ✅ **Text colors** ← v4.8.9!
6563- ✅ **Borders** ← v4.8.9!
6564- ✅ All tabs (Manage, Update, Outlook, Themes)
6565
6566### CSS Variables Used
6567
6568**DokuWiki provides these**:
6569- `--__background_site__`: Page background
6570- `--__background_alt__`: Alternate background
6571- `--__background__`: Primary background (inputs)
6572- `--__text__`: Text color
6573- `--__border__`: Border color
6574
6575**Fallbacks provided for older DokuWiki**:
6576```css
6577var(--__background_site__, #f5f5f5)
6578var(--__background_alt__, #fafafa)
6579var(--__background__, #fff)
6580var(--__text__, #333)
6581var(--__border__, #ddd)
6582```
6583
6584### Perfect Adaptation
6585
6586**Admin now adapts to ANY wiki theme**:
6587- Light themes → Light admin ✓
6588- Dark themes → Dark admin ✓
6589- Custom themes → Matches perfectly ✓
6590- No hardcoded colors ✓
6591
6592**Calendar themes still work**:
6593- Matrix, Purple, Professional, Pink ✓
6594- Independent from wiki theme ✓
6595- Admin respects wiki ✓
6596- Calendar respects calendar theme ✓
6597
6598### FINAL PERFECTION
6599
6600**Frontend (Calendar)**:
6601- Complete theming ✓
6602- 4 beautiful themes ✓
6603- Every pixel themed ✓
6604
6605**Backend (Admin)**:
6606- Respects wiki theme ✓
6607- Works with any theme ✓
6608- Perfect compatibility ✓
6609
6610**ABSOLUTELY EVERYTHING THEMED!** ����✨
6611
6612## Version 4.8.8 (2026-02-08) - FINAL FIXES: CHECKBOXES, BORDERS, BACKGROUNDS
6613
6614### �� Fixed: Task Checkboxes Now Fully Themed
6615- **Fixed:** Added background-color and border inline
6616- **Fixed:** Both PHP and JavaScript versions
6617- **Result:** No white checkboxes!
6618
6619### �� Fixed: Past Events Toggle Border
6620- **Fixed:** Added !important to border styling
6621- **Fixed:** Explicit top and bottom borders
6622- **Result:** No white line under toggle!
6623
6624### �� Fixed: Form Field Section Backgrounds
6625- **Fixed:** All form-field and form-row-group backgrounds
6626- **Fixed:** Every section in edit dialog
6627- **Result:** No white sections anywhere!
6628
6629### All Changes
6630
6631**1. Task Checkbox Styling**:
6632
6633**Before**:
6634```php
6635style="accent-color: $border !important;"
6636<!-- Only accent, background still white ✗ -->
6637```
6638
6639**After**:
6640```php
6641style="accent-color: $border !important;
6642       background-color: $cell_bg !important;
6643       border: 2px solid $grid_border !important;"
6644<!-- Full theming ✓ -->
6645```
6646
6647**2. Past Events Toggle Border**:
6648
6649**Before**:
6650```php
6651style="border-color: $grid_border;"
6652<!-- No !important, CSS overrides ✗ -->
6653```
6654
6655**After**:
6656```php
6657style="border-color: $grid_border !important;
6658       border-top: 1px solid $grid_border !important;
6659       border-bottom: 1px solid $grid_border !important;"
6660<!-- Cannot be overridden ✓ -->
6661```
6662
6663**3. Form Field Backgrounds**:
6664
6665**Before**:
6666```html
6667<div class="form-field">
6668<div class="form-row-group">
6669<!-- No background, shows white ✗ -->
6670```
6671
6672**After**:
6673```php
6674<div class="form-field" style="background: $bg !important;">
6675<div class="form-row-group" style="background: $bg !important;">
6676<!-- Fully themed ✓ -->
6677```
6678
6679### Before vs After
6680
6681**BEFORE (v4.8.7)**:
6682```
6683Event:
6684□ Task checkbox  ← White checkbox ✗
6685
6686Past Events
6687▶ Past Events (3) ← White line below ✗
6688─────────────────
6689
6690Edit Dialog:
6691┌──────────────┐
6692│ Form fields  │ ← White sections ✗
6693└──────────────┘
6694```
6695
6696**AFTER (v4.8.8)**:
6697```
6698Matrix Event:
6699☑ Task checkbox  ← Green checkbox ✓
6700
6701Past Events
6702▶ Past Events (3) ← Green border ✓
6703─────────────────
6704
6705Matrix Edit Dialog:
6706┌──────────────┐
6707│ Form fields  │ ← Dark green ✓
6708└──────────────┘
6709```
6710
6711### Complete Examples
6712
6713**Matrix Theme**:
6714```
6715Task Checkbox:
6716☑ Checked   → Green checkmark, green bg
6717☐ Unchecked → Green border, dark green bg ✓
6718
6719Past Events Toggle:
6720▶ Past Events (3)
6721─────────────────── Green border ✓
6722
6723Edit Dialog:
6724All sections dark green ✓
6725No white anywhere ✓
6726```
6727
6728**Purple Theme**:
6729```
6730Task Checkbox:
6731☑ Checked   → Purple checkmark, purple bg
6732☐ Unchecked → Purple border, dark purple bg ✓
6733
6734Past Events Toggle:
6735▶ Past Events (3)
6736─────────────────── Purple border ✓
6737
6738Edit Dialog:
6739All sections dark purple ✓
6740```
6741
6742**Professional Theme**:
6743```
6744Task Checkbox:
6745☑ Checked   → Blue checkmark, white bg
6746☐ Unchecked → Gray border, white bg ✓
6747
6748Past Events Toggle:
6749▶ Past Events (3)
6750─────────────────── Gray border ✓
6751
6752Edit Dialog:
6753All sections light ✓
6754```
6755
6756**Pink Theme**:
6757```
6758Task Checkbox:
6759☑ Checked   → Pink checkmark, pink bg ✨
6760☐ Unchecked → Pink border, dark pink bg ✓
6761
6762Past Events Toggle:
6763▶ Past Events (3)
6764─────────────────── Pink border ��
6765
6766Edit Dialog:
6767All sections dark pink ✓
6768```
6769
6770### Checkbox Visual
6771
6772**Matrix - Unchecked**:
6773```
6774┌─────┐
6775│     │ ← Dark green background
6776│     │   Green border
6777└─────┘
6778```
6779
6780**Matrix - Checked**:
6781```
6782┌─────┐
6783│ ✓   │ ← Dark green background
6784│     │   Green checkmark
6785└─────┘
6786```
6787
6788### Past Events Border
6789
6790**Before**:
6791```
6792▶ Past Events (3)
6793─────────────────── White line ✗
6794```
6795
6796**After**:
6797```
6798▶ Past Events (3)
6799─────────────────── Green line ✓ (Matrix)
6800                    Purple line ✓ (Purple)
6801                    Gray line ✓ (Professional)
6802                    Pink line ✓ (Pink)
6803```
6804
6805### Form Field Coverage
6806
6807**All sections themed**:
6808- ✅ Title field
6809- ✅ Namespace field
6810- ✅ Description field
6811- ✅ **Date row** ← v4.8.8!
6812- ✅ **Checkbox sections** ← v4.8.8!
6813- ✅ **Recurring options** ← v4.8.8!
6814- ✅ **Time row** ← v4.8.8!
6815- ✅ **Color row** ← v4.8.8!
6816- ✅ Button footer
6817
6818**Every div has background!** ✓
6819
6820### ABSOLUTE PERFECTION
6821
6822**Not a single white pixel**:
6823- ✅ No white checkboxes
6824- ✅ No white borders
6825- ✅ No white backgrounds
6826- ✅ No white sections
6827- ✅ No white lines
6828- ✅ No white anything
6829
6830**100% PERFECT THEMING!** ����✨
6831
6832## Version 4.8.7 (2026-02-08) - COMPLETE DIALOG & POPUP THEMING
6833
6834### �� Fixed: Checkbox Section Backgrounds Themed
6835- **Fixed:** Repeating Event section background
6836- **Fixed:** Task checkbox section background
6837- **Result:** No white backgrounds in dialog!
6838
6839### �� Fixed: Unchecked Task Checkboxes Themed
6840- **Fixed:** Added CSS for checkbox backgrounds
6841- **Fixed:** Unchecked boxes show theme colors
6842- **Result:** No white checkboxes!
6843
6844### �� Fixed: Day Popup Dialog Fully Themed
6845- **Fixed:** Popup container, header, body themed
6846- **Fixed:** Event items in popup themed
6847- **Fixed:** Add Event button themed
6848- **Fixed:** Footer section themed
6849- **Result:** Perfect popup theming!
6850
6851### All Changes
6852
6853**1. Checkbox Section Backgrounds**:
6854
6855**Before**:
6856```html
6857<div class="form-field-checkbox">
6858<!-- White background ✗ -->
6859```
6860
6861**After**:
6862```php
6863<div class="form-field-checkbox"
6864     style="background: $bg !important;">
6865<!-- Themed ✓ -->
6866```
6867
6868**2. Checkbox Background CSS**:
6869
6870**Added to style block**:
6871```css
6872.task-checkbox {
6873    background-color: $cell_bg !important;
6874    border: 2px solid $grid_border !important;
6875}
6876```
6877
6878**3. Day Popup Theming**:
6879
6880**Container**:
6881```javascript
6882style="background: $bg !important;
6883       border: 2px solid $border !important;
6884       box-shadow: 0 0 20px $shadow !important;"
6885```
6886
6887**Header**:
6888```javascript
6889style="background: $header_bg !important;
6890       color: $text_primary !important;
6891       border-bottom: 1px solid $border !important;"
6892```
6893
6894**Footer**:
6895```javascript
6896style="background: $bg !important;
6897       border-top: 1px solid $grid_border !important;"
6898```
6899
6900**Add Event Button**:
6901```javascript
6902style="background: $border !important;
6903       color: $bg !important;
6904       border-color: $border !important;"
6905```
6906
6907**Event Items**:
6908```javascript
6909style="background: $cell_bg !important;
6910       border: 1px solid $grid_border !important;"
6911```
6912
6913### Before vs After
6914
6915**BEFORE (v4.8.6)**:
6916```
6917Edit Dialog:
6918┌──────────────────┐
6919│ ☑ Repeating Event│ ← White background ✗
6920├──────────────────┤
6921│ ☑ Task checkbox  │ ← White background ✗
6922└──────────────────┘
6923
6924Day Popup:
6925┌──────────────────┐
6926│ Monday, Feb 8    │ ← White ✗
6927├──────────────────┤
6928│ Team Meeting     │ ← White ✗
6929│ 2:00 PM          │
6930├──────────────────┤
6931│ [+ Add Event]    │ ← White ✗
6932└──────────────────┘
6933
6934Task checkbox: ☐ ← White ✗
6935```
6936
6937**AFTER (v4.8.7)**:
6938```
6939Edit Dialog (Matrix):
6940┌──────────────────┐
6941│ ☑ Repeating Event│ ← Dark green ✓
6942├──────────────────┤
6943│ ☑ Task checkbox  │ ← Dark green ✓
6944└──────────────────┘
6945
6946Day Popup (Matrix):
6947┌──────────────────┐
6948│ Monday, Feb 8    │ ← Dark green ✓
6949├──────────────────┤
6950│ Team Meeting     │ ← Dark green ✓
6951│ 2:00 PM          │
6952├──────────────────┤
6953│ [+ Add Event]    │ ← Green button ✓
6954└──────────────────┘
6955
6956Task checkbox: ☑ ← Green ✓
6957```
6958
6959### Complete Examples
6960
6961**Matrix Dialog**:
6962```
6963┌──────────────────────────┐
6964│ ✏️ Edit Event            │
6965├──────────────────────────┤
6966│ �� Title: [_________]    │
6967│ �� Date: [__________]    │
6968│                          │
6969│ ☑ �� Repeating Event     │ ← Dark green bg
6970├──────────────────────────┤
6971│ ☑ �� Task checkbox       │ ← Dark green bg
6972├──────────────────────────┤
6973│ [Cancel] [�� Save]       │
6974└──────────────────────────┘
6975
6976All sections themed! ✓
6977```
6978
6979**Matrix Day Popup**:
6980```
6981┌──────────────────────────┐
6982│ Monday, February 8, 2026 │ ← Green header
6983├──────────────────────────┤
6984│ ┌──────────────────────┐ │
6985│ │ Team Meeting         │ │ ← Dark green
6986│ │ �� 2:00 PM           │ │
6987│ └──────────────────────┘ │
6988│ ┌──────────────────────┐ │
6989│ │ Code Review          │ │ ← Dark green
6990│ │ �� 4:00 PM           │ │
6991│ └──────────────────────┘ │
6992├──────────────────────────┤
6993│   [+ Add Event]          │ ← Green button
6994└──────────────────────────┘
6995```
6996
6997**Purple Day Popup**:
6998```
6999┌──────────────────────────┐
7000│ Monday, February 8, 2026 │ ← Purple header
7001├──────────────────────────┤
7002│ ┌──────────────────────┐ │
7003│ │ Team Meeting         │ │ ← Dark purple
7004│ │ �� 2:00 PM           │ │
7005│ └──────────────────────┘ │
7006├──────────────────────────┤
7007│   [+ Add Event]          │ ← Purple button
7008└──────────────────────────┘
7009```
7010
7011**Professional Day Popup**:
7012```
7013┌──────────────────────────┐
7014│ Monday, February 8, 2026 │ ← Light header
7015├──────────────────────────┤
7016│ ┌──────────────────────┐ │
7017│ │ Team Meeting         │ │ ← White
7018│ │ �� 2:00 PM           │ │
7019│ └──────────────────────┘ │
7020├──────────────────────────┤
7021│   [+ Add Event]          │ ← Blue button
7022└──────────────────────────┘
7023```
7024
7025**Pink Day Popup**:
7026```
7027┌──────────────────────────┐
7028│ Monday, February 8, 2026 │ ← Pink header ✨
7029├──────────────────────────┤
7030│ ┌──────────────────────┐ │
7031│ │ Team Meeting ��      │ │ ← Dark pink
7032│ │ �� 2:00 PM           │ │
7033│ └──────────────────────┘ │
7034├──────────────────────────┤
7035│   [+ Add Event]          │ ← Pink button
7036└──────────────────────────┘
7037```
7038
7039### Checkbox Theming
7040
7041**Unchecked boxes now themed**:
7042```
7043Matrix:
7044☐ → Dark green bg, green border ✓
7045
7046Purple:
7047☐ → Dark purple bg, purple border ✓
7048
7049Professional:
7050☐ → White bg, gray border ✓
7051
7052Pink:
7053☐ → Dark pink bg, pink border ✓
7054```
7055
7056### Complete Coverage
7057
7058**Edit Dialog - All Sections**:
7059- ✅ Header
7060- ✅ All inputs
7061- ✅ All labels
7062- ✅ **Checkbox sections** ← v4.8.7!
7063- ✅ Recurring options
7064- ✅ Button footer
7065- ✅ All checkboxes (checked & unchecked)
7066
7067**Day Popup - All Elements**:
7068- ✅ **Popup container** ← v4.8.7!
7069- ✅ **Header** ← v4.8.7!
7070- ✅ **Body** ← v4.8.7!
7071- ✅ **Event items** ← v4.8.7!
7072- ✅ **Namespace badges** ← v4.8.7!
7073- ✅ **Footer** ← v4.8.7!
7074- ✅ **Add Event button** ← v4.8.7!
7075- ✅ **No events message** ← v4.8.7!
7076
7077**Absolutely every dialog element themed!** ��✨
7078
7079### Perfect Theming Achievement
7080
7081**Every UI component in entire plugin**:
7082- ✅ Calendar grid
7083- ✅ Sidebar widget
7084- ✅ Event list
7085- ✅ Search bar
7086- ✅ Event boxes
7087- ✅ Edit dialog (complete)
7088- ✅ **Day popup** ← v4.8.7!
7089- ✅ Month picker
7090- ✅ All text
7091- ✅ All buttons
7092- ✅ All inputs
7093- ✅ **All checkboxes** ← v4.8.7!
7094- ✅ All borders
7095- ✅ All badges
7096- ✅ All backgrounds
7097
7098**NO WHITE ANYWHERE!** ��
7099
7100**100% COMPLETE THEMING ACHIEVED!** ��✨��
7101
7102## Version 4.8.6 (2026-02-08) - FIX DIALOG SECTIONS & EVENT BOX BORDERS
7103
7104### �� Fixed: Dialog Checkbox Sections Themed
7105- **Fixed:** Recurring options section background themed
7106- **Fixed:** Section has themed border accent
7107- **Result:** No white sections in dialog!
7108
7109### �� Fixed: Dialog Button Section Themed
7110- **Fixed:** Button area background themed
7111- **Fixed:** Top border separator themed
7112- **Result:** Complete dialog theming!
7113
7114### �� Fixed: Event Box Borders Themed
7115- **Fixed:** Top, right, bottom borders now themed
7116- **Fixed:** Left border remains event color
7117- **Result:** Perfect event boxes!
7118
7119### All Changes
7120
7121**1. Recurring Options Section**:
7122
7123**Before**:
7124```html
7125<div class="recurring-options" style="display:none;">
7126<!-- White background ✗ -->
7127```
7128
7129**After**:
7130```php
7131<div class="recurring-options"
7132     style="display:none;
7133            background: $bg !important;
7134            padding: 8px;
7135            border-left: 2px solid $border;
7136            margin-left: 4px;">
7137<!-- Themed with accent border ✓ -->
7138```
7139
7140**2. Dialog Actions Section**:
7141
7142**Before**:
7143```html
7144<div class="dialog-actions-sleek">
7145<!-- White background ✗ -->
7146```
7147
7148**After**:
7149```php
7150<div class="dialog-actions-sleek"
7151     style="background: $bg !important;
7152            border-top: 1px solid $grid_border !important;">
7153<!-- Themed with separator ✓ -->
7154```
7155
7156**3. Event Box Borders**:
7157
7158**Before**:
7159```php
7160border-left-color: $event_color;
7161<!-- Only left border colored ✗ -->
7162```
7163
7164**After**:
7165```php
7166border-left-color: $event_color;
7167border-top: 1px solid $grid_border !important;
7168border-right: 1px solid $grid_border !important;
7169border-bottom: 1px solid $grid_border !important;
7170<!-- All borders themed! ✓ -->
7171```
7172
7173### Before vs After
7174
7175**BEFORE (v4.8.5)**:
7176```
7177Dialog:
7178┌────────────────┐
7179│ ☑ Repeating    │
7180├────────────────┤ ← White section ✗
7181│ Repeat: Daily  │
7182│ Until: [____]  │
7183├────────────────┤
7184│ [Cancel] [Save]│ ← White footer ✗
7185└────────────────┘
7186
7187Event Box:
7188┌────────────┐
7189│Team Meeting│ ← White borders ✗
7190│2:00 PM     │
7191└────────────┘
7192```
7193
7194**AFTER (v4.8.6)**:
7195```
7196Matrix Dialog:
7197┌────────────────┐
7198│ ☑ Repeating    │
7199├────────────────┤ ← Dark green ✓
7200│ Repeat: Daily  │ Green accent border
7201│ Until: [____]  │
7202├────────────────┤
7203│ [Cancel] [Save]│ ← Dark green ✓
7204└────────────────┘
7205
7206Matrix Event Box:
7207┌────────────┐
7208│Team Meeting│ ← Green borders ✓
7209│2:00 PM     │
7210└────────────┘
7211```
7212
7213### Dialog Section Examples
7214
7215**Matrix Theme**:
7216```
7217┌──────────────────────────┐
7218│ ✏️ Edit Event            │
7219├──────────────────────────┤
7220│ ☑ �� Repeating Event     │
7221├║─────────────────────────┤ Green accent
7222│║ Repeat Every: Daily     │ Dark green bg
7223│║ Repeat Until: [_____]   │
7224└──────────────────────────┘
7225  [Cancel] [�� Save]       ← Dark green bg
7226──────────────────────────── Green border
7227```
7228
7229**Purple Theme**:
7230```
7231┌──────────────────────────┐
7232│ ☑ �� Repeating Event     │
7233├║─────────────────────────┤ Purple accent
7234│║ Repeat options...       │ Dark purple bg
7235└──────────────────────────┘
7236  [Cancel] [�� Save]       ← Dark purple bg
7237──────────────────────────── Purple border
7238```
7239
7240**Professional Theme**:
7241```
7242┌──────────────────────────┐
7243│ ☑ �� Repeating Event     │
7244├║─────────────────────────┤ Blue accent
7245│║ Repeat options...       │ Light bg
7246└──────────────────────────┘
7247  [Cancel] [�� Save]       ← Light bg
7248──────────────────────────── Gray border
7249```
7250
7251**Pink Theme**:
7252```
7253┌──────────────────────────┐
7254│ ☑ �� Repeating Event ✨  │
7255├║─────────────────────────┤ Pink accent
7256│║ Repeat options...       │ Dark pink bg ��
7257└──────────────────────────┘
7258  [Cancel] [�� Save]       ← Dark pink bg
7259──────────────────────────── Pink border
7260```
7261
7262### Event Box Border Visual
7263
7264**Before (v4.8.5)**:
7265```
7266Left border only:
7267█ Team Meeting
7268█ 2:00 PM
7269█ [Edit] [Delete]
7270
7271Only event color on left ✗
7272White on other 3 sides ✗
7273```
7274
7275**After (v4.8.6)**:
7276```
7277All borders themed:
7278┌─────────────┐
7279█Team Meeting │ ← Top: themed
7280█2:00 PM      │ ← Right: themed
7281█[Edit][Del]  │ ← Bottom: themed
7282└─────────────┘
7283
7284Left: Event color ✓
7285Other 3: Theme grid_border ✓
7286```
7287
7288### Matrix Event Box:
7289```
7290┌─────────────┐ Green border
7291│Team Meeting │
7292│2:00 PM      │
7293└─────────────┘ Green border
72947295Green left bar
7296```
7297
7298### Purple Event Box:
7299```
7300┌─────────────┐ Purple border
7301│Team Meeting │
7302│2:00 PM      │
7303└─────────────┘ Purple border
73047305Purple left bar
7306```
7307
7308### Professional Event Box:
7309```
7310┌─────────────┐ Gray border
7311│Team Meeting │
7312│2:00 PM      │
7313└─────────────┘ Gray border
73147315Event color left bar
7316```
7317
7318### Complete Dialog Coverage
7319
7320**All sections themed**:
7321- ✅ Dialog header
7322- ✅ Form inputs
7323- ✅ Checkbox labels
7324- ✅ **Recurring options** ← v4.8.6!
7325- ✅ **Button section** ← v4.8.6!
7326- ✅ All labels
7327- ✅ All buttons
7328
7329**No white sections!** ✓
7330
7331### Complete Event Box Coverage
7332
7333**All borders themed**:
7334- ✅ Left border (event color)
7335- ✅ **Top border** ← v4.8.6!
7336- ✅ **Right border** ← v4.8.6!
7337- ✅ **Bottom border** ← v4.8.6!
7338- ✅ Background
7339- ✅ Text
7340
7341**Perfect box outline!** ✓
7342
7343### Visual Perfection
7344
7345**Matrix theme event list**:
7346```
7347┌─────────────┐
7348│Team Meeting │ ← Green box
7349│2:00 PM      │
7350└─────────────┘
7351┌─────────────┐
7352│Code Review  │ ← Green box
7353│4:00 PM      │
7354└─────────────┘
7355
7356All borders green! ✓
7357```
7358
7359**ABSOLUTE PERFECT THEMING!** ��✨
7360
7361## Version 4.8.5 (2026-02-08) - THEME EVENT DIALOG & SIDEBAR BORDERS
7362
7363### �� Fixed: Event Dialog Fully Themed
7364- **Fixed:** Dialog background, header, inputs all themed
7365- **Fixed:** All labels, checkboxes, selects themed
7366- **Fixed:** Save and Cancel buttons themed
7367- **Result:** Dialog matches theme perfectly!
7368
7369### �� Fixed: Sidebar Event Borders Properly Themed
7370- **Fixed:** Event divider borders use grid_border color
7371- **Fixed:** Clean, subtle themed dividers
7372- **Result:** No more white borders in sidebar!
7373
7374### All Changes
7375
7376**1. Event Dialog Theming**:
7377
7378**Dialog container**:
7379```php
7380background: $themeStyles['bg'] !important;
7381border: 2px solid $themeStyles['border'] !important;
7382box-shadow: 0 0 20px $shadow !important;
7383```
7384
7385**Dialog header**:
7386```php
7387background: $themeStyles['header_bg'] !important;
7388color: $themeStyles['text_primary'] !important;
7389border-bottom: 1px solid $border !important;
7390```
7391
7392**All form inputs** (text, date, select, textarea):
7393```php
7394background: $themeStyles['cell_bg'] !important;
7395color: $themeStyles['text_primary'] !important;
7396border-color: $themeStyles['grid_border'] !important;
7397```
7398
7399**All labels**:
7400```php
7401color: $themeStyles['text_primary'] !important;
7402```
7403
7404**Checkboxes**:
7405```php
7406accent-color: $themeStyles['border'] !important;
7407```
7408
7409**Buttons**:
7410```php
7411// Cancel button:
7412background: $cell_bg !important;
7413color: $text_primary !important;
7414
7415// Save button:
7416background: $border !important;
7417color: $bg !important; (or white for professional)
7418```
7419
7420**2. Sidebar Event Borders**:
7421
7422**Before**:
7423```php
7424border-bottom: 1px solid rgba(0, 204, 7, 0.2); // Hardcoded
7425```
7426
7427**After**:
7428```php
7429borderColor = $themeStyles['grid_border'];
7430border-bottom: 1px solid $borderColor !important;
7431```
7432
7433### Before vs After
7434
7435**BEFORE (v4.8.4)**:
7436```
7437Event Dialog:
7438┌────────────────┐
7439│ Add Event      │ ← White background ✗
7440│ Title: [_____] │ ← White inputs ✗
7441│ Date:  [_____] │
7442│ [Cancel] [Save]│ ← Default buttons ✗
7443└────────────────┘
7444
7445Sidebar Events:
7446Event 1 ────────  ← White border ✗
7447Event 2 ────────  ← White border ✗
7448```
7449
7450**AFTER (v4.8.5)**:
7451```
7452Event Dialog (Matrix):
7453┌────────────────┐
7454│ Add Event      │ ← Dark green background ✓
7455│ Title: [_____] │ ← Dark green inputs ✓
7456│ Date:  [_____] │ ← Green text ✓
7457│ [Cancel] [Save]│ ← Themed buttons ✓
7458└────────────────┘
7459
7460Sidebar Events (Matrix):
7461Event 1 ────────  ← Green border ✓
7462Event 2 ────────  ← Green border ✓
7463```
7464
7465### Dialog Examples by Theme
7466
7467**Matrix Dialog**:
7468```
7469┌──────────────────────────┐
7470│ ✏️ Edit Event            │ ← Dark green header
7471├──────────────────────────┤
7472│ �� Title                 │ ← Green labels
7473│ [Team Meeting________]   │ ← Dark green input
7474│                          │
7475│ �� Start Date            │
7476│ [2026-02-08__]           │ ← Dark green input
7477│                          │
7478│ �� Start Time            │
7479│ [2:00 PM ▼]              │ ← Green select
7480│                          │
7481│ ☑ �� Repeating Event     │ ← Green checkbox
7482│                          │
7483│ [Cancel] [�� Save]       │ ← Themed buttons
7484└──────────────────────────┘
7485
7486Everything green! ✓
7487```
7488
7489**Purple Dialog**:
7490```
7491┌──────────────────────────┐
7492│ ✏️ Edit Event            │ ← Dark purple header
7493├──────────────────────────┤
7494│ [Inputs_______________]  │ ← Dark purple inputs
7495│ ☑ Checkboxes             │ ← Purple accent
7496│ [Cancel] [�� Save]       │ ← Purple buttons
7497└──────────────────────────┘
7498```
7499
7500**Professional Dialog**:
7501```
7502┌──────────────────────────┐
7503│ ✏️ Edit Event            │ ← Light gradient header
7504├──────────────────────────┤
7505│ [Inputs_______________]  │ ← White inputs
7506│ ☑ Checkboxes             │ ← Blue accent
7507│ [Cancel] [�� Save]       │ ← Blue save button
7508└──────────────────────────┘
7509```
7510
7511**Pink Dialog**:
7512```
7513┌──────────────────────────┐
7514│ ✏️ Edit Event            │ ← Dark pink header ✨
7515├──────────────────────────┤
7516│ [Inputs_______________]  │ ← Dark pink inputs ��
7517│ ☑ Checkboxes             │ ← Pink accent
7518│ [Cancel] [�� Save]       │ ← Pink buttons
7519└──────────────────────────┘
7520```
7521
7522### Complete Dialog Element Coverage
7523
7524**All form elements themed**:
7525- ✅ Dialog container
7526- ✅ Dialog header
7527- ✅ Close button (×)
7528- ✅ Title input
7529- ✅ Namespace search
7530- ✅ Namespace dropdown
7531- ✅ Description textarea
7532- ✅ Start date input
7533- ✅ End date input
7534- ✅ Recurring checkbox
7535- ✅ Recurrence type select
7536- ✅ Recurrence end date
7537- ✅ Start time select
7538- ✅ End time select
7539- ✅ Color select
7540- ✅ Custom color picker
7541- ✅ Task checkbox
7542- ✅ All labels
7543- ✅ Cancel button
7544- ✅ Save button
7545
7546**Every single dialog element themed!** ��
7547
7548### Sidebar Border Example
7549
7550**Matrix Sidebar**:
7551```
7552┌────────────────┐
7553│ Today          │ ← Green section header
7554├────────────────┤
7555│ Team Meeting   │
7556│ 2:00 PM        │
7557├────────────────┤ ← Green border (grid_border)
7558│ Code Review    │
7559│ 4:00 PM        │
7560├────────────────┤ ← Green border
7561│ Stand-up       │
7562│ All day        │
7563└────────────────┘
7564
7565Subtle green dividers! ✓
7566```
7567
7568### Complete Achievement
7569
7570**Every UI element themed**:
7571- ✅ Calendar
7572- ✅ Sidebar widget
7573- ✅ Event list
7574- ✅ Search bar
7575- ✅ **Event dialog** ← v4.8.5!
7576- ✅ Month picker
7577- ✅ **Sidebar dividers** ← v4.8.5!
7578- ✅ All text
7579- ✅ All inputs
7580- ✅ All buttons
7581- ✅ All borders
7582- ✅ All checkboxes
7583
7584**ABSOLUTE COMPLETE THEMING!** ��✨
7585
7586## Version 4.8.4 (2026-02-08) - FIX PROFESSIONAL THEME BACKGROUNDS
7587
7588### �� Fixed: Professional Theme Background Consistency
7589- **Fixed:** Container and event backgrounds now match sidebar
7590- **Fixed:** Lighter, cleaner appearance
7591- **Fixed:** Better contrast and readability
7592- **Result:** Professional theme looks cohesive!
7593
7594### The Problem
7595
7596**v4.8.3 Professional theme**:
7597```
7598Sidebar: Light background (#f5f7fa)
7599Calendar: Medium background (#e8ecf1) ← Didn't match!
7600Events: Light background (#f5f7fa)
7601
7602Inconsistent! ✗
7603```
7604
7605### The Fix
7606
7607**Updated Professional theme colors for consistency**:
7608
7609```php
7610// Before:
7611'bg' => '#e8ecf1',        // Medium gray-blue
7612'cell_bg' => '#f5f7fa',   // Very light
7613'grid_bg' => '#d5dbe3',   // Medium-dark
7614
7615// After:
7616'bg' => '#f5f7fa',        // Very light (matches sidebar)
7617'cell_bg' => '#ffffff',   // Pure white (clean)
7618'grid_bg' => '#e8ecf1',   // Subtle contrast
7619'grid_border' => '#d0d7de', // Softer borders
7620```
7621
7622### Before vs After
7623
7624**BEFORE (v4.8.3)**:
7625```
7626Professional Theme:
7627┌────────────────┐
7628│ Calendar       │ ← Medium gray (#e8ecf1)
7629│ ┌────────────┐ │
7630│ │ Event      │ │ ← Light (#f5f7fa)
7631│ └────────────┘ │
7632└────────────────┘
7633
7634Sidebar:
7635┌────────────────┐
7636│ Widget         │ ← Light (#f5f7fa)
7637└────────────────┘
7638
7639Backgrounds don't match! ✗
7640```
7641
7642**AFTER (v4.8.4)**:
7643```
7644Professional Theme:
7645┌────────────────┐
7646│ Calendar       │ ← Light (#f5f7fa)
7647│ ┌────────────┐ │
7648│ │ Event      │ │ ← White (#ffffff)
7649│ └────────────┘ │
7650└────────────────┘
7651
7652Sidebar:
7653┌────────────────┐
7654│ Widget         │ ← Light (#f5f7fa)
7655└────────────────┘
7656
7657Perfect match! ✓
7658```
7659
7660### New Professional Theme Colors
7661
7662**Backgrounds**:
7663- Container: `#f5f7fa` (light blue-gray)
7664- Events: `#ffffff` (pure white)
7665- Grid: `#e8ecf1` (subtle contrast)
7666
7667**Text**:
7668- Primary: `#2c3e50` (dark blue-gray)
7669- Bright: `#4a90e2` (blue accent)
7670- Dim: `#7f8c8d` (medium gray)
7671
7672**Borders**:
7673- Main: `#4a90e2` (blue)
7674- Grid: `#d0d7de` (soft gray)
7675
7676**Header**:
7677- Gradient: `#ffffff` → `#f5f7fa`
7678
7679### Visual Example
7680
7681**Professional Theme Now**:
7682```
7683┌─────────────────────────────┐
7684│ February 2026               │ ← White to light gradient
7685├─┬─┬─┬─┬─┬─┬─┬───────────────┤
7686│S│M│T│W│T│F│S│               │ ← Light background
7687├─┼─┼─┼─┼─┼─┼─┤               │
7688│ │ │1│2│3│4│5│ Event List    │ ← White events
7689│ │ │ │ │ │ │ │ ┌───────────┐ │
7690│ │ │ │ │[8]│ │ │ Meeting   │ │ ← White on light
7691└─┴─┴─┴─┴─┴─┴─┴─└───────────┘─┘
7692
7693Clean, professional look! ✓
7694```
7695
7696### Comparison with Other Themes
7697
7698**Matrix** (dark):
7699- Container: #242424 (dark green)
7700- Events: #242424 (dark green)
7701- Consistent dark theme ✓
7702
7703**Purple** (dark):
7704- Container: #1a0d14 (dark purple)
7705- Events: #2a2030 (dark purple)
7706- Consistent dark theme ✓
7707
7708**Professional** (light):
7709- Container: #f5f7fa (light blue)
7710- Events: #ffffff (white)
7711- Consistent light theme ✓
7712
7713**Pink** (dark):
7714- Container: #1a0d14 (dark pink)
7715- Events: #1a0d14 (dark pink)
7716- Consistent dark theme ✓
7717
7718**All themes now consistent!** ��
7719
7720### Better Contrast
7721
7722**Professional theme improvements**:
7723
7724**Readability**:
7725- Dark text (#2c3e50) on white/light backgrounds ✓
7726- Excellent contrast ratio ✓
7727- Easy on the eyes ✓
7728
7729**Visual hierarchy**:
7730- White events pop against light container ✓
7731- Blue accents stand out ✓
7732- Clean, modern look ✓
7733
7734**Professional appearance**:
7735- Lighter = more corporate/business feel ✓
7736- Clean whites = premium quality ✓
7737- Subtle grays = sophisticated ✓
7738
7739### Complete Theme Consistency
7740
7741**All themes now have matching backgrounds**:
7742
7743**Matrix**:
7744- Sidebar & Calendar both dark green ✓
7745
7746**Purple**:
7747- Sidebar & Calendar both dark purple ✓
7748
7749**Professional**:
7750- Sidebar & Calendar both light ✓ (v4.8.4!)
7751
7752**Pink**:
7753- Sidebar & Calendar both dark pink ✓
7754
7755**Perfect visual unity across all views!** ��✨
7756
7757## Version 4.8.3 (2026-02-08) - FINAL POLISH: BOLD TEXT, SEARCH, SIDEBAR BOXES
7758
7759### �� Fixed: Bold Text in Descriptions Themed
7760- **Fixed:** **Bold text** now uses theme primary color
7761- **Fixed:** Both `**text**` and `__text__` syntax themed
7762- **Result:** Bold text matches theme!
7763
7764### �� Fixed: Search Bar Fully Themed
7765- **Fixed:** Search input has !important on all styles
7766- **Fixed:** Icon and placeholder text themed
7767- **Result:** Search bar perfectly themed!
7768
7769### �� Fixed: Sidebar Event Boxes Themed
7770- **Fixed:** Event borders in sidebar now use theme grid_border color
7771- **Fixed:** Borders have !important flag
7772- **Result:** Sidebar boxes match theme!
7773
7774### All Changes
7775
7776**1. Bold Text Styling**:
7777
7778**Before**:
7779```html
7780<strong>Bold text</strong> ← Default black
7781```
7782
7783**After**:
7784```php
7785<strong style="color: $text_primary !important; font-weight:bold;">
7786    Bold text
7787</strong>
7788
7789Matrix: Green bold ✓
7790Purple: Lavender bold ✓
7791Professional: Dark bold ✓
7792Pink: Pink bold ✓
7793```
7794
7795**2. Search Bar**:
7796
7797**Before**:
7798```php
7799style="background: $bg; color: $text;"
7800Could be overridden by CSS
7801```
7802
7803**After**:
7804```php
7805style="background: $bg !important;
7806       color: $text_primary !important;
7807       border-color: $grid_border !important;"
7808
7809Cannot be overridden! ✓
7810```
7811
7812**3. Sidebar Event Boxes**:
7813
7814**Before**:
7815```php
7816$borderColor = 'rgba(0, 204, 7, 0.2)'; // Hardcoded
7817```
7818
7819**After**:
7820```php
7821$borderColor = $themeStyles['grid_border']; // From theme
7822border-bottom: 1px solid $borderColor !important;
7823
7824Matrix: Green borders ✓
7825Purple: Purple borders ✓
7826Professional: Gray borders ✓
7827Pink: Pink borders ✓
7828```
7829
7830### Before vs After
7831
7832**BEFORE (v4.8.2)**:
7833```
7834Event description:
7835"Please review **Q1 Goals** carefully"
78367837            Black bold ✗
7838
7839Search bar:
7840[�� Search...] ← Gray placeholder ✗
7841
7842Sidebar:
7843┌────────────┐
7844│ Event 1    │
7845├────────────┤ ← Gray border ✗
7846│ Event 2    │
7847└────────────┘
7848```
7849
7850**AFTER (v4.8.3)**:
7851```
7852Matrix Theme:
7853
7854Event description:
7855"Please review **Q1 Goals** carefully"
78567857            Green bold ✓
7858
7859Search bar:
7860[�� Search...] ← Green themed ✓
7861
7862Sidebar:
7863┌────────────┐
7864│ Event 1    │
7865├────────────┤ ← Green border ✓
7866│ Event 2    │
7867└────────────┘
7868```
7869
7870### Examples by Theme
7871
7872**Matrix Theme**:
7873```
7874Description:
7875"Check **important notes** and links"
78767877   Green bold
7878
7879Sidebar boxes:
7880Event 1
7881───────── Green border
7882Event 2
7883───────── Green border
7884```
7885
7886**Purple Theme**:
7887```
7888Description:
7889"Review **agenda items** before meeting"
78907891   Lavender bold
7892
7893Sidebar boxes:
7894Event 1
7895───────── Purple border
7896Event 2
7897───────── Purple border
7898```
7899
7900**Professional Theme**:
7901```
7902Description:
7903"Update **quarterly reports** by Friday"
79047905   Dark bold
7906
7907Sidebar boxes:
7908Event 1
7909───────── Gray border
7910Event 2
7911───────── Gray border
7912```
7913
7914**Pink Theme**:
7915```
7916Description:
7917"Don't forget **party supplies** ✨"
79187919        Pink bold
7920
7921Sidebar boxes:
7922Event 1 ��
7923───────── Pink border
7924Event 2 ✨
7925───────── Pink border
7926```
7927
7928### Complete Formatting Coverage
7929
7930**Text formatting themed**:
7931- ✅ Regular text
7932- ✅ **Bold text** ← NEW!
7933- ✅ Links
7934- ✅ Italic text (inherits)
7935- ✅ Code (inherits)
7936
7937**UI elements themed**:
7938- ✅ Search bar ← Enhanced!
7939- ✅ Search icon ← Enhanced!
7940- ✅ Search placeholder ← Enhanced!
7941- ✅ Sidebar borders ← NEW!
7942- ✅ Event borders
7943- ✅ Badges
7944- ✅ Buttons
7945
7946**Every element perfectly themed!** ��
7947
7948### Search Bar Coverage
7949
7950**All aspects themed**:
7951- Background: Theme cell_bg ✓
7952- Text color: Theme text_primary ✓
7953- Border: Theme grid_border ✓
7954- Placeholder: Inherits text color ✓
7955- Icon (��): In placeholder ✓
7956- Clear button (✕): Themed ✓
7957
7958**Cannot be overridden!** (all have !important)
7959
7960### Sidebar Event Box Styling
7961
7962**Consistent borders**:
7963```
7964Matrix:
7965╔════════════╗
7966║ Event 1    ║
7967╟────────────╢ ← grid_border color
7968║ Event 2    ║
7969╚════════════╝
7970
7971All themes match perfectly! ✓
7972```
7973
7974### Complete Theme Achievement
7975
7976**Every single element themed**:
7977- ✅ Backgrounds
7978- ✅ Text (regular)
7979- ✅ Text (bold) ← v4.8.3!
7980- ✅ Links
7981- ✅ Badges
7982- ✅ Buttons
7983- ✅ Checkboxes
7984- ✅ Icons
7985- ✅ Borders
7986- ✅ Search bar ← Enhanced v4.8.3!
7987- ✅ Sidebar boxes ← v4.8.3!
7988- ✅ Today marker
7989- ✅ Calendar grid
7990- ✅ Event panels
7991
7992**ABSOLUTE PERFECTION!** ��✨
7993
7994## Version 4.8.2 (2026-02-08) - THEME LINKS IN DESCRIPTIONS
7995
7996### �� Fixed: Links in Descriptions Now Themed
7997- **Fixed:** All links in event descriptions now use theme color
7998- **Fixed:** DokuWiki links [[page|text]] themed
7999- **Fixed:** Markdown links [text](url) themed
8000- **Fixed:** Plain URLs themed
8001- **Result:** Links match theme perfectly!
8002
8003### The Problem
8004
8005**v4.8.1 behavior**:
8006```
8007Event description:
8008"Check out https://example.com" ← Blue default link ✗
8009"See [[wiki:page|docs]]" ← Blue default link ✗
8010```
8011
8012### The Fix
8013
8014**Added inline color styling to ALL link types**:
8015
8016```php
8017// Get theme colors:
8018$linkColor = $themeStyles['border'] . ' !important';
8019$linkStyle = ' style="color:' . $linkColor . ';"';
8020
8021// Apply to links:
8022<a href="..." style="color: #00cc07 !important;">link</a>
8023```
8024
8025**All link types themed**:
80261. DokuWiki syntax: `[[page|text]]`
80272. Markdown syntax: `[text](url)`
80283. Plain URLs: `https://example.com`
8029
8030### Before vs After
8031
8032**BEFORE (v4.8.1)**:
8033```
8034Matrix Theme Description:
8035"Visit https://example.com for more info"
80368037     Blue link ✗ (doesn't match green theme)
8038```
8039
8040**AFTER (v4.8.2)**:
8041```
8042Matrix Theme Description:
8043"Visit https://example.com for more info"
80448045     Green link ✓ (matches theme!)
8046```
8047
8048### Link Colors by Theme
8049
8050**Matrix**:
8051- Links: Green (#00cc07) !important
8052- Matches: Border, badges, highlights
8053
8054**Purple**:
8055- Links: Purple (#9b59b6) !important
8056- Matches: Border, badges, highlights
8057
8058**Professional**:
8059- Links: Blue (#4a90e2) !important
8060- Matches: Border, badges, highlights
8061
8062**Pink**:
8063- Links: Hot Pink (#ff1493) !important
8064- Matches: Border, badges, highlights ✨
8065
8066### Examples
8067
8068**Matrix Description with Links**:
8069```
8070Event: Team Meeting
8071Description:
8072"Review [[wiki:q1goals|Q1 Goals]]
8073and visit https://metrics.com"
8074
8075Both links → Green ✓
8076```
8077
8078**Purple Description with Links**:
8079```
8080Event: Planning Session
8081Description:
8082"Check [schedule](https://cal.com)
8083for availability"
8084
8085Link → Purple ✓
8086```
8087
8088**Professional Description with Links**:
8089```
8090Event: Client Call
8091Description:
8092"Prepare [[reports|Monthly Reports]]
8093before the call"
8094
8095Link → Blue ✓
8096```
8097
8098**Pink Description with Links**:
8099```
8100Event: Party Planning
8101Description:
8102"RSVP at https://party.com ✨"
8103
8104Link → Hot Pink ✓ ��
8105```
8106
8107### Technical Implementation
8108
8109**Updated renderDescription() function**:
8110
8111```php
8112private function renderDescription($description, $themeStyles = null) {
8113    // Get theme
8114    if ($themeStyles === null) {
8115        $theme = $this->getSidebarTheme();
8116        $themeStyles = $this->getSidebarThemeStyles($theme);
8117    }
8118
8119    // Create link style
8120    $linkColor = $themeStyles['border'] . ' !important';
8121    $linkStyle = ' style="color:' . $linkColor . ';"';
8122
8123    // Apply to all link types:
8124    $linkHtml = '<a href="..." ' . $linkStyle . '>text</a>';
8125}
8126```
8127
8128### Complete Theming
8129
8130**Every text element**:
8131- ✅ Event titles
8132- ✅ Event dates
8133- ✅ Event descriptions
8134- ✅ **Links in descriptions** ← NEW!
8135- ✅ Badges
8136- ✅ Buttons
8137
8138**Every color unified!** ��
8139
8140### Unified Theme Experience
8141
8142**Matrix Theme**:
8143```
8144Everything green:
8145- Text: Green ✓
8146- Links: Green ✓
8147- Badges: Green ✓
8148- Borders: Green ✓
8149- Buttons: Green ✓
8150- Today marker: Green ✓
8151
8152Perfect harmony! ✓
8153```
8154
8155**No default blue links breaking the theme!**
8156
8157### Link Types Supported
8158
8159**1. DokuWiki Syntax**:
8160```
8161[[page|Link Text]] → Themed ✓
8162[[page]] → Themed ✓
8163[[page#section|Text]] → Themed ✓
8164```
8165
8166**2. Markdown Syntax**:
8167```
8168[Link Text](https://url.com) → Themed ✓
8169[Text](internal-page) → Themed ✓
8170```
8171
8172**3. Plain URLs**:
8173```
8174https://example.com → Themed ✓
8175http://site.org → Themed ✓
8176```
8177
8178**All links perfectly themed!** ����
8179
8180## Version 4.8.1 (2026-02-08) - FIX BADGES & TODAY CELL MARKER
8181
8182### �� Fixed: All Badges Now Themed
8183- **Fixed:** TODAY badge themed with theme color
8184- **Fixed:** PAST DUE badge uses orange (warning color)
8185- **Fixed:** Namespace badges themed
8186- **Fixed:** All badges visible and hidden
8187- **Result:** All badges match theme!
8188
8189### �� Fixed: Today Cell More Prominent
8190- **Fixed:** Today cell now has 2px border in theme color
8191- **Fixed:** Border added to both PHP and JavaScript
8192- **Result:** Today stands out clearly!
8193
8194### �� Fixed: Past Event Text Fully Themed
8195- **Fixed:** Event-info div backgrounds ensure no gray
8196- **Result:** Expanded past events completely themed!
8197
8198### All Changes
8199
8200**1. Badge Theming**:
8201
8202**TODAY Badge**:
8203```php
8204// PHP & JavaScript:
8205style="background: $themeStyles['border'] !important;
8206       color: $bg !important;"
8207
8208Matrix: Green badge
8209Purple: Purple badge
8210Professional: Blue badge with white text
8211Pink: Pink badge
8212```
8213
8214**PAST DUE Badge** (always orange):
8215```php
8216style="background: #ff9800 !important;
8217       color: #fff !important;"
8218```
8219
8220**Namespace Badge**:
8221```php
8222style="background: $themeStyles['border'] !important;
8223       color: $bg !important;"
8224```
8225
8226**2. Today Cell Border**:
8227
8228**PHP**:
8229```php
8230$todayBorder = $isToday ?
8231    'border:2px solid ' . $themeStyles['border'] . ' !important;' : '';
8232```
8233
8234**JavaScript**: Same
8235
8236**Result**: Today cell has prominent colored border!
8237
8238### Before vs After
8239
8240**BEFORE (v4.8.0)**:
8241```
8242Calendar:
8243┌─┬─┬─┬─┬─┬─┬─┐
8244│1│2│3│4│5│6│7│
8245│ │ │ │[8]│ │ │ ← Today: subtle background
8246└─┴─┴─┴─┴─┴─┴─┘
8247
8248Event badges:
8249Mon, Feb 8 [TODAY] [Work] ← Gray badges ✗
8250```
8251
8252**AFTER (v4.8.1)**:
8253```
8254Calendar (Matrix):
8255┌─┬─┬─┬─┬─┬─┬─┐
8256│1│2│3│4│5│6│7│
8257│ │ │ │[8]│ │ │ ← Today: green border 2px ✓
8258└─┴─┴─┴─┴─┴─┴─┘
8259
8260Event badges (Matrix):
8261Mon, Feb 8 [TODAY] [Work] ← Green badges ✓
8262```
8263
8264### Matrix Theme Example
8265
8266**Calendar**:
8267```
8268Today cell:
8269┌────┐
8270│ 8  │ Dark green bg + Green 2px border
8271└────┘
8272Very obvious!
8273```
8274
8275**Badges**:
8276```
8277[TODAY] ← Green bg, dark text
8278[Work]  ← Green bg, dark text
8279[PAST DUE] ← Orange bg, white text
8280```
8281
8282### Purple Theme Example
8283
8284**Calendar**:
8285```
8286Today cell:
8287┌────┐
8288│ 8  │ Dark purple bg + Purple 2px border
8289└────┘
8290```
8291
8292**Badges**:
8293```
8294[TODAY] ← Purple bg
8295[Work]  ← Purple bg
8296```
8297
8298### Professional Theme Example
8299
8300**Calendar**:
8301```
8302Today cell:
8303┌────┐
8304│ 8  │ Light blue bg + Blue 2px border
8305└────┘
8306```
8307
8308**Badges**:
8309```
8310[TODAY] ← Blue bg, white text
8311[Work]  ← Blue bg, white text
8312```
8313
8314### Pink Theme Example
8315
8316**Calendar**:
8317```
8318Today cell:
8319┌────┐
8320│ 8  │ Dark pink bg + Pink 2px border ✨
8321└────┘
8322```
8323
8324**Badges**:
8325```
8326[TODAY] ← Pink bg ��
8327[Work]  ← Pink bg ✨
8328```
8329
8330### Complete Badge Coverage
8331
8332**All badges themed**:
8333- ✅ TODAY badge (theme color)
8334- ✅ PAST DUE badge (orange warning)
8335- ✅ Namespace badges (theme color)
8336- ✅ Visible events
8337- ✅ Hidden/past events
8338
8339**No gray badges anywhere!**
8340
8341### Today Cell Visual
8342
8343**Dual indicators**:
83441. Background color (theme today bg)
83452. Border (2px theme color) ← NEW!
8346
8347**Result**: Today is VERY obvious!
8348
8349**Matrix**: Green bg + Green border
8350**Purple**: Purple bg + Purple border
8351**Professional**: Light blue bg + Blue border
8352**Pink**: Pink bg + Pink border ✨
8353
8354### Complete Theming
8355
8356**Every element themed**:
8357- ✅ Backgrounds
8358- ✅ Text colors
8359- ✅ Badges (v4.8.1!)
8360- ✅ Today marker (v4.8.1!)
8361- ✅ Checkboxes
8362- ✅ Buttons
8363- ✅ Icons
8364
8365**Absolutely everything!** ��✨
8366
8367## Version 4.8.0 (2026-02-08) - COMPLETE EVENT BACKGROUND THEMING
8368
8369### �� Fixed: All Event Backgrounds Now Themed
8370- **Fixed:** event-info div now has themed background
8371- **Fixed:** event-meta-compact div (visible) now has themed background
8372- **Fixed:** event-desc-compact div now has themed background
8373- **Fixed:** All !important flags added to prevent CSS override
8374- **Result:** Entire event item fully themed!
8375
8376### �� Fixed: Description Text Shows Correct Color Immediately
8377- **Fixed:** Description divs now have explicit background + color on load
8378- **Fixed:** Both visible and hidden descriptions fully styled
8379- **Result:** No more gray text on initial load!
8380
8381### The Problem
8382
8383**v4.7.9 behavior**:
8384```
8385Expanded past event:
8386┌────────────────────────┐
8387│ ▾ Team Meeting         │ ← Themed ✓
8388│   Mon, Feb 8           │ ← Themed ✓
8389│                        │
8390│   [Event details]      │ ← Gray background ✗
8391│   [Description]        │ ← Gray text until navigation ✗
8392└────────────────────────┘
8393
8394Only the date/time div was themed!
8395```
8396
8397### The Fix
8398
8399**Added background to ALL inner divs**:
8400
8401**PHP**:
8402```php
8403// Event container:
8404style="background:' . $themeStyles['cell_bg'] . ' !important;"
8405
8406// event-info wrapper:
8407<div class="event-info"
8408     style="background:' . $themeStyles['cell_bg'] . ' !important;">
8409
8410// event-meta-compact:
8411<div class="event-meta-compact"
8412     style="background:' . $themeStyles['cell_bg'] . ' !important;">
8413
8414// event-desc-compact:
8415<div class="event-desc-compact"
8416     style="background:' . $themeStyles['cell_bg'] . ' !important;
8417            color:' . $themeStyles['text_dim'] . ' !important;">
8418```
8419
8420**JavaScript**: Same styling applied
8421
8422### Before vs After
8423
8424**BEFORE (v4.7.9)**:
8425```
8426Matrix Theme - Expanded Event:
8427┌────────────────────────┐
8428│ ▾ Team Meeting         │
8429│   Mon, Feb 8  ← Green  │
8430│                        │
8431│   Details     ← Gray ✗ │
8432│   Description ← Gray ✗ │
8433│   [✏️] [��️]            │
8434└────────────────────────┘
8435```
8436
8437**AFTER (v4.8.0)**:
8438```
8439Matrix Theme - Expanded Event:
8440┌────────────────────────┐
8441│ ▾ Team Meeting         │
8442│   Mon, Feb 8  ← Green  │
8443│                        │
8444│   Details     ← Green ✓│
8445│   Description ← Green ✓│
8446│   [✏️] [��️]            │
8447└────────────────────────┘
8448
8449Entire event themed!
8450```
8451
8452### What's Themed Now
8453
8454**Event Item Structure** (all themed):
8455```
8456event-compact-item        ← Themed ✓
8457  └─ event-info           ← Themed ✓ (v4.8.0!)
8458      ├─ event-title-row  ← Themed ✓
8459      ├─ event-meta       ← Themed ✓ (v4.8.0!)
8460      └─ event-desc       ← Themed ✓ (v4.8.0!)
8461```
8462
8463**Every layer has background!**
8464
8465### Matrix Theme Example
8466
8467**Complete event**:
8468```
8469┌────────────────────────────┐
8470│ Team Meeting               │ ← Dark green bg
8471│   Mon, Feb 8 • 2:00 PM     │ ← Dark green bg
8472│   Discussed Q1 goals and   │ ← Dark green bg
8473│   set targets for team     │ ← Dark green bg
8474│   [✏️] [��️] [☑]           │ ← Dark green bg
8475└────────────────────────────┘
8476
8477Consistent green throughout! ✓
8478```
8479
8480### Purple Theme Example
8481
8482```
8483┌────────────────────────────┐
8484│ Team Meeting               │ ← Dark purple bg
8485│   Mon, Feb 8 • 2:00 PM     │ ← Dark purple bg
8486│   Discussed Q1 goals       │ ← Dark purple bg
8487│   [✏️] [��️] [☑]           │ ← Dark purple bg
8488└────────────────────────────┘
8489
8490Consistent purple throughout! ✓
8491```
8492
8493### Professional Theme Example
8494
8495```
8496┌────────────────────────────┐
8497│ Team Meeting               │ ← Light bg
8498│   Mon, Feb 8 • 2:00 PM     │ ← Light bg
8499│   Discussed Q1 goals       │ ← Light bg
8500│   [✏️] [��️] [☑]           │ ← Light bg
8501└────────────────────────────┘
8502
8503Consistent light throughout! ✓
8504```
8505
8506### Pink Theme Example
8507
8508```
8509┌────────────────────────────┐
8510│ Team Meeting               │ ← Dark pink bg
8511│   Mon, Feb 8 • 2:00 PM     │ ← Dark pink bg
8512│   Discussed Q1 goals       │ ← Dark pink bg
8513│   [✏️] [��️] [☑]           │ ← Dark pink bg
8514└────────────────────────────┘
8515
8516Consistent pink throughout! ✓
8517```
8518
8519### Complete Theming
8520
8521**Every element, every layer**:
8522- ✅ Container
8523- ✅ Event item
8524- ✅ Event info wrapper (v4.8.0!)
8525- ✅ Title row
8526- ✅ Meta div (v4.8.0!)
8527- ✅ Description div (v4.8.0!)
8528- ✅ Action buttons
8529- ✅ Checkboxes
8530
8531**No gray anywhere!** ��
8532
8533### Why Multiple Backgrounds?
8534
8535**CSS layers stack**:
8536```html
8537<div style="background: green;">         ← Layer 1
8538  <div style="background: inherit;">     ← Could be gray!
8539    <div>Content</div>                   ← Inherits gray!
8540  </div>
8541</div>
8542
8543Better:
8544<div style="background: green;">         ← Layer 1
8545  <div style="background: green;">       ← Layer 2 forced
8546    <div style="background: green;">     ← Layer 3 forced
8547      Content                            ← All green!
8548    </div>
8549  </div>
8550</div>
8551```
8552
8553**Every layer forced = Perfect theming!**
8554
8555### !important Everywhere
8556
8557**All styling now uses !important**:
8558- background: ... !important
8559- color: ... !important
8560
8561**Result**: CSS cannot override themes!
8562
8563**Version 4.8.0 = Complete, bulletproof theming!** ��✨
8564
8565## Version 4.7.9 (2026-02-08) - THEME ICONS, CHECKBOXES & EXPANDED BACKGROUNDS
8566
8567### �� Fixed: Past Event Expanded Background Themed
8568- **Fixed:** Past event meta div now has theme background when expanded
8569- **Fixed:** Both PHP and JavaScript render with theme background
8570- **Result:** Expanded past events have proper themed background!
8571
8572### ✅ Fixed: Checkboxes Now Themed
8573- **Fixed:** Task checkboxes use accent-color matching theme
8574- **Fixed:** Cursor changes to pointer on hover
8575- **Result:** Checkboxes match theme color!
8576
8577### �� Fixed: Action Buttons (Edit/Delete) Themed
8578- **Fixed:** Edit (✏️) and Delete (��️) buttons now themed
8579- **Fixed:** Background, text, and border all use theme colors
8580- **Result:** All icons themed!
8581
8582### All Changes
8583
8584**1. Past Event Expanded Background**:
8585
8586**PHP**:
8587```php
8588// Before:
8589<div class="event-meta-compact" style="display:none;">
8590
8591// After:
8592<div class="event-meta-compact"
8593     style="display:none; background:' . $themeStyles['cell_bg'] . ' !important;">
8594```
8595
8596**JavaScript**: Same treatment
8597
8598**Result**: Expanded past events have themed background!
8599
8600**2. Task Checkboxes**:
8601
8602**PHP & JavaScript**:
8603```php
8604// Added accent-color:
8605<input type="checkbox"
8606       style="accent-color:' . $themeStyles['border'] . ' !important;
8607              cursor:pointer;">
8608```
8609
8610**accent-color** changes the checkbox color:
8611- Matrix: Green checkboxes ✓
8612- Purple: Purple checkboxes ✓
8613- Professional: Blue checkboxes ✓
8614- Pink: Pink checkboxes ✓
8615
8616**3. Edit/Delete Buttons**:
8617
8618**PHP**:
8619```php
8620<button class="event-action-btn"
8621        style="color:' . $themeStyles['text_primary'] . ' !important;
8622               background:' . $themeStyles['cell_bg'] . ' !important;
8623               border-color:' . $themeStyles['grid_border'] . ' !important;">
8624    ��️
8625</button>
8626```
8627
8628**JavaScript**: Same
8629
8630**Result**: Buttons blend with theme!
8631
8632### Before vs After
8633
8634**BEFORE (v4.7.8)**:
8635```
8636Past Event (expanded):
8637┌─────────────────────────┐
8638│ ▾ Team Meeting          │
8639│   Mon, Feb 8            │ ← White background ✗
8640│   Description           │
8641├─────────────────────────┤
8642│ [✏️] [��️] [☐]          │ ← Default colors ✗
8643└─────────────────────────┘
8644```
8645
8646**AFTER (v4.7.9)**:
8647```
8648Past Event (expanded - Matrix):
8649┌─────────────────────────┐
8650│ ▾ Team Meeting          │
8651│   Mon, Feb 8            │ ← Dark green bg ✓
8652│   Description           │
8653├─────────────────────────┤
8654│ [✏️] [��️] [☑]          │ ← Themed ✓
8655└─────────────────────────┘
8656```
8657
8658### Matrix Theme Example
8659
8660**Checkboxes**: Green accent
8661**Buttons**: Dark bg, green text, green borders
8662**Expanded**: Dark green background
8663
8664```
8665Task: ☑ Complete report  ← Green checkmark
8666[✏️] [��️]                ← Dark buttons with green
8667```
8668
8669### Purple Theme Example
8670
8671**Checkboxes**: Purple accent
8672**Buttons**: Dark purple bg, lavender text
8673**Expanded**: Dark purple background
8674
8675```
8676Task: ☑ Complete report  ← Purple checkmark
8677[✏️] [��️]                ← Purple themed
8678```
8679
8680### Professional Theme Example
8681
8682**Checkboxes**: Blue accent
8683**Buttons**: Light bg, dark text
8684**Expanded**: Light background
8685
8686```
8687Task: ☑ Complete report  ← Blue checkmark
8688[✏️] [��️]                ← Light themed
8689```
8690
8691### Pink Theme Example
8692
8693**Checkboxes**: Pink accent
8694**Buttons**: Dark pink bg, pink text
8695**Expanded**: Dark pink background
8696
8697```
8698Task: ☑ Complete report  ← Pink checkmark
8699[✏️] [��️]                ← Pink themed
8700```
8701
8702### Complete Icon Coverage
8703
8704**Themed Icons/Buttons**:
8705- ✅ Task checkboxes (accent-color)
8706- ✅ Edit button (✏️)
8707- ✅ Delete button (��️)
8708- ✅ Navigation arrows (◀ ▶)
8709- ✅ Today button
8710- ✅ Past Events arrow (▶)
8711
8712**All interactive elements themed!** ��
8713
8714### How accent-color Works
8715
8716**Modern CSS property** for form controls:
8717```css
8718input[type="checkbox"] {
8719    accent-color: #00cc07; /* Green checkbox! */
8720}
8721```
8722
8723**Browser support**: All modern browsers ✓
8724
8725**Result**: Checkboxes automatically match theme!
8726
8727### Complete Theme Coverage
8728
8729**Backgrounds**:
8730- ✅ Container
8731- ✅ Calendar-left
8732- ✅ Calendar-right
8733- ✅ Event items
8734- ✅ Past event expanded (v4.7.9!)
8735- ✅ Action buttons (v4.7.9!)
8736
8737**Icons/Controls**:
8738- ✅ Checkboxes (v4.7.9!)
8739- ✅ Edit/Delete buttons (v4.7.9!)
8740- ✅ Navigation buttons
8741- ✅ All arrows
8742
8743**Every element perfectly themed!** ��✨
8744
8745## Version 4.7.8 (2026-02-08) - FIX BOTTOM BAR & PAST EVENT DETAILS
8746
8747### �� Fixed: White Bar at Bottom of Calendar
8748- **Fixed:** Added background to calendar-left div with !important
8749- **Result:** No more white bar at bottom!
8750
8751### �� Fixed: Past Event Expanded Details Not Themed
8752- **Fixed:** Past event date/time now themed when expanded
8753- **Fixed:** Past event descriptions now themed when expanded
8754- **Fixed:** Both PHP and JavaScript render with theme colors
8755- **Result:** Expanding past events shows themed text!
8756
8757### �� Fixed: Event Description Text Color
8758- **Fixed:** All event descriptions now use theme text_dim color
8759- **Fixed:** Both visible and hidden descriptions themed
8760- **Result:** Descriptions always match theme!
8761
8762### All Changes
8763
8764**1. Bottom White Bar** (calendar-left div):
8765
8766**Before**:
8767```html
8768<div class="calendar-compact-left">
8769<!-- White background showing at bottom -->
8770```
8771
8772**After**:
8773```html
8774<div class="calendar-compact-left"
8775     style="background: #242424 !important;">
8776<!-- Matches theme background -->
8777```
8778
8779**2. Past Event Expanded Details**:
8780
8781**PHP** - Added colors to hidden details:
8782```php
8783// Past event meta (hidden):
8784<span class="event-date-time"
8785      style="color:' . $themeStyles['text_dim'] . ' !important;">
8786
8787// Past event description (hidden):
8788<div class="event-desc-compact"
8789     style="display:none; color:' . $themeStyles['text_dim'] . ' !important;">
8790```
8791
8792**JavaScript** - Same treatment:
8793```javascript
8794// Past event meta:
8795html += '<span class="event-date-time"
8796              style="color:' + themeStyles.text_dim + ' !important;">';
8797
8798// Past event description:
8799html += '<div class="event-desc-compact"
8800              style="display: none; color:' + themeStyles.text_dim + ' !important;">';
8801```
8802
8803**3. All Event Descriptions**:
8804
8805**Both visible and hidden descriptions now themed**:
8806```php
8807// PHP:
8808style="color:' . $themeStyles['text_dim'] . ' !important;"
8809
8810// JavaScript:
8811style="color:' + themeStyles.text_dim + ' !important;"
8812```
8813
8814### Before vs After
8815
8816**BEFORE (v4.7.7)**:
8817```
8818Calendar bottom:
8819┌──────────────┐
8820│ Calendar     │
8821│ Grid         │
8822└──────────────┘
8823▒▒▒▒▒▒▒▒▒▒▒▒▒▒ ← White bar
8824
8825Past Event (collapsed):
8826▸ Team Meeting
8827
8828Past Event (expanded):
8829▾ Team Meeting
8830  Mon, Feb 8 ← Gray text ✗
8831  Description ← Gray text ✗
8832```
8833
8834**AFTER (v4.7.8)**:
8835```
8836Calendar bottom:
8837┌──────────────┐
8838│ Calendar     │
8839│ Grid         │
8840└──────────────┘
8841No white bar! ✓
8842
8843Past Event (collapsed):
8844▸ Team Meeting
8845
8846Past Event (expanded):
8847▾ Team Meeting
8848  Mon, Feb 8 ← Theme dim color ✓
8849  Description ← Theme dim color ✓
8850```
8851
8852### Matrix Theme Example
8853
8854**Past event expanded**:
8855```
8856▾ Team Meeting (past)
8857  Mon, Feb 8 • 2:00 PM  ← Dim green (#00aa00)
8858  Discussed Q1 goals   ← Dim green (#00aa00)
8859
8860Everything themed! ✓
8861```
8862
8863### Purple Theme Example
8864
8865**Past event expanded**:
8866```
8867▾ Team Meeting (past)
8868  Mon, Feb 8 • 2:00 PM  ← Dim purple (#8e7ab8)
8869  Discussed Q1 goals   ← Dim purple (#8e7ab8)
8870
8871Everything themed! ✓
8872```
8873
8874### Professional Theme Example
8875
8876**Past event expanded**:
8877```
8878▾ Team Meeting (past)
8879  Mon, Feb 8 • 2:00 PM  ← Gray (#7f8c8d)
8880  Discussed Q1 goals   ← Gray (#7f8c8d)
8881
8882Everything themed! ✓
8883```
8884
8885### Pink Theme Example
8886
8887**Past event expanded**:
8888```
8889▾ Team Meeting (past)
8890  Mon, Feb 8 • 2:00 PM  ← Light pink (#ff85c1)
8891  Discussed Q1 goals   ← Light pink (#ff85c1)
8892
8893Everything themed! ✓
8894```
8895
8896### Complete Coverage
8897
8898**Calendar Layout**:
8899- ✅ Container background
8900- ✅ Calendar-left background (v4.7.8!)
8901- ✅ Calendar-right background
8902- ✅ No white bars anywhere!
8903
8904**Event Details**:
8905- ✅ Event titles
8906- ✅ Event dates/times
8907- ✅ Event descriptions (visible) (v4.7.8!)
8908- ✅ Past event dates (expanded) (v4.7.8!)
8909- ✅ Past event descriptions (expanded) (v4.7.8!)
8910
8911**Absolutely everything themed!** ��
8912
8913## Version 4.7.7 (2026-02-08) - AGGRESSIVE !IMPORTANT ON ALL ELEMENTS
8914
8915### �� Fixed: Added !important to EVERY Themed Element
8916- **Fixed:** S M T W T F S headers now have background + color with !important
8917- **Fixed:** "Past Events" text now has explicit color with !important
8918- **Fixed:** Today cell background now forced with !important
8919- **Fixed:** All day numbers now have !important color
8920- **Fixed:** Empty cells now have !important background
8921- **Result:** CSS CANNOT override themes anymore!
8922
8923### The Nuclear Option: !important Everywhere
8924
8925**Problem**: DokuWiki CSS was still winning:
8926```css
8927/* DokuWiki theme overriding everything: */
8928.dokuwiki table th { background: white !important; color: black !important; }
8929.dokuwiki td { background: white !important; }
8930```
8931
8932**Solution**: Add !important to EVERY inline style:
8933```html
8934<th style="background: #242424 !important; color: #00cc07 !important;">
8935<td style="background: #2a4d2a !important; color: #00cc07 !important;">
8936<span style="color: #00cc07 !important;">
8937```
8938
8939### All Changes
8940
8941**1. Table Headers (S M T W T F S)**:
8942
8943**PHP** - Added background + !important everywhere:
8944```php
8945$thStyle = 'background:' . $themeStyles['header_bg'] . ' !important;
8946            color:' . $themeStyles['text_primary'] . ' !important;
8947            border-color:' . $themeStyles['grid_border'] . ' !important;
8948            font-weight:bold !important;';
8949```
8950
8951**JavaScript** - Added background to each th:
8952```javascript
8953th.style.setProperty('background', themeStyles.header_bg, 'important');
8954th.style.setProperty('color', themeStyles.text_primary, 'important');
8955th.style.setProperty('border-color', themeStyles.grid_border, 'important');
8956th.style.setProperty('font-weight', 'bold', 'important');
8957```
8958
8959**2. Past Events Text**:
8960
8961**PHP** - Added !important to spans:
8962```php
8963<span class="past-events-arrow" style="color:' . $themeStyles['text_dim'] . ' !important;">▶</span>
8964<span class="past-events-label" style="color:' . $themeStyles['text_dim'] . ' !important;">Past Events</span>
8965```
8966
8967**JavaScript** - Same treatment:
8968```javascript
8969html += '<span class="past-events-arrow" style="color:' + themeStyles.text_dim + ' !important;">▶</span>';
8970html += '<span class="past-events-label" style="color:' + themeStyles.text_dim + ' !important;">Past Events</span>';
8971```
8972
8973**3. Today Cell & All Cells**:
8974
8975**PHP** - !important on background and color:
8976```php
8977// Today or regular cell:
8978$cellStyle = 'background:' . $cellBg . ' !important;
8979              color:' . $themeStyles['text_primary'] . ' !important;';
8980
8981// Day number:
8982<span class="day-num" style="color:' . $themeStyles['text_primary'] . ' !important;">
8983```
8984
8985**JavaScript** - Same:
8986```javascript
8987style="background:${cellBg} !important; color:${cellColor} !important;"
8988
8989<span style="color:${cellColor} !important;">${currentDay}</span>
8990```
8991
8992**4. Empty Cells**:
8993
8994**PHP & JavaScript** - !important:
8995```php
8996style="background:' . $themeStyles['bg'] . ' !important;"
8997```
8998
8999### Before vs After
9000
9001**BEFORE (v4.7.6)** - CSS still winning:
9002```
9003S M T W T F S → White background, black text ✗
9004Today cell → White background ✗
9005Past Events → Black text ✗
9006```
9007
9008**AFTER (v4.7.7)** - Theme wins:
9009```
9010S M T W T F S → Theme background, theme text ✓
9011Today cell → Theme highlight ✓
9012Past Events → Theme text ✓
9013
9014NOTHING can override !important inline styles!
9015```
9016
9017### Matrix Theme Example
9018
9019**Complete theming**:
9020```
9021┌──────────────────────────┐
9022│ S M T W T F S            │ ← Dark bg (#2a2a2a), Green text (#00cc07)
9023├─┬─┬─┬─┬─┬─┬──────────────┤
9024│ │ │1│2│3│4│5             │ ← Dark cells (#242424), Green nums (#00cc07)
9025│ │ │ │ │ │[8]│             │ ← Today green highlight (#2a4d2a)
9026├─┴─┴─┴─┴─┴─┴──────────────┤
9027│ ▶ Past Events (3)        │ ← Dim green text (#00aa00)
9028└──────────────────────────┘
9029
9030Every element forced with !important ✓
9031```
9032
9033### Purple Theme Example
9034
9035```
9036┌──────────────────────────┐
9037│ S M T W T F S            │ ← Dark purple bg, Lavender text
9038├─┬─┬─┬─┬─┬─┬──────────────┤
9039│ │ │1│2│3│4│5             │ ← Dark purple cells, Lavender nums
9040│ │ │ │ │ │[8]│             │ ← Today purple highlight
9041├─┴─┴─┴─┴─┴─┴──────────────┤
9042│ ▶ Past Events (3)        │ ← Dim purple text
9043└──────────────────────────┘
9044
9045Forced purple everywhere ✓
9046```
9047
9048### Professional Theme Example
9049
9050```
9051┌──────────────────────────┐
9052│ S M T W T F S            │ ← Light bg, Dark text
9053├─┬─┬─┬─┬─┬─┬──────────────┤
9054│ │ │1│2│3│4│5             │ ← Light cells, Dark nums
9055│ │ │ │ │ │[8]│             │ ← Today light blue highlight
9056├─┴─┴─┴─┴─┴─┴──────────────┤
9057│ ▶ Past Events (3)        │ ← Gray text
9058└──────────────────────────┘
9059
9060Forced professional everywhere ✓
9061```
9062
9063### Pink Theme Example
9064
9065```
9066┌──────────────────────────┐
9067│ S M T W T F S            │ ← Dark pink bg, Pink text
9068├─┬─┬─┬─┬─┬─┬──────────────┤
9069│ │ │1│2│3│4│5  ✨         │ ← Dark pink cells, Pink nums
9070│ │ │ │ │ │[8]│  ��         │ ← Today pink highlight
9071├─┴─┴─┴─┴─┴─┴──────────────┤
9072│ ▶ Past Events (3)        │ ← Light pink text
9073└──────────────────────────┘
9074
9075Forced pink sparkles everywhere ✓
9076```
9077
9078### Why So Aggressive?
9079
9080**!important priority**:
9081```
90821. Inline style with !important ← We use this
90832. CSS rule with !important
90843. Inline style without !important
90854. CSS rule without !important
9086```
9087
9088**We win**: Our inline `!important` beats everything!
9089
9090### Complete !important Coverage
9091
9092**Every themed element now has !important**:
9093- ✅ S M T W T F S (background + color)
9094- ✅ Day numbers (color)
9095- ✅ Today cell (background + color)
9096- ✅ Empty cells (background)
9097- ✅ Past Events text (color)
9098- ✅ Past Events arrow (color)
9099- ✅ Event titles (color)
9100- ✅ Event dates (color)
9101
9102**No CSS can override themes!** ��
9103
9104## Version 4.7.6 (2026-02-08) - FIX EVENT TEXT & FORCE HEADER COLORS
9105
9106### �� Fixed: Event Sidebar Text Now Themed
9107- **Fixed:** Event titles now have explicit color styling
9108- **Fixed:** Event dates/times now have explicit color styling (dimmed)
9109- **Fixed:** Both PHP and JavaScript event rendering now styled
9110
9111### �� Enhanced: Table Header Colors Now Forced with !important
9112- **Fixed:** S M T W T F S now uses `!important` to override any CSS
9113- **Fixed:** Both PHP and JavaScript use `setProperty()` with important flag
9114- **Result:** Header colors CANNOT be overridden!
9115
9116### What Was Fixed
9117
9118**1. Event Text in Sidebar** (was missing):
9119
9120**PHP** - Explicit colors added:
9121```php
9122// Event title:
9123<span class="event-title-compact"
9124      style="color:' . $themeStyles['text_primary'] . ';">
9125
9126// Event date/time:
9127<span class="event-date-time"
9128      style="color:' . $themeStyles['text_dim'] . ';">
9129```
9130
9131**JavaScript** - Explicit colors added:
9132```javascript
9133// Event title:
9134html += '<span class="event-title-compact"
9135               style="color:' + themeStyles.text_primary + ';">';
9136
9137// Event date/time:
9138html += '<span class="event-date-time"
9139               style="color:' + themeStyles.text_dim + ';">';
9140```
9141
9142**2. Table Header Colors** (was being overridden):
9143
9144**PHP** - Added !important:
9145```php
9146// Row:
9147style="color: ' . $themeStyles['text_primary'] . ' !important;"
9148
9149// Each th:
9150$thStyle = 'color:' . $themeStyles['text_primary'] . ' !important;';
9151<th style="' . $thStyle . '">S</th>
9152```
9153
9154**JavaScript** - Used setProperty with important:
9155```javascript
9156// Row:
9157thead.style.setProperty('color', themeStyles.text_primary, 'important');
9158
9159// Each th:
9160th.style.setProperty('color', themeStyles.text_primary, 'important');
9161```
9162
9163### Before vs After
9164
9165**BEFORE (v4.7.5)**:
9166```
9167Event List:
9168┌─────────────────┐
9169│ Team Meeting    │ ← Black/default color ✗
9170│ Mon, Feb 8      │ ← Black/default color ✗
9171└─────────────────┘
9172
9173Table Header:
9174S  M  T  W  T  F  S  ← Black/default color ✗
9175(CSS was overriding the style)
9176```
9177
9178**AFTER (v4.7.6)**:
9179```
9180Event List (Matrix):
9181┌─────────────────┐
9182│ Team Meeting    │ ← Green (#00cc07) ✓
9183│ Mon, Feb 8      │ ← Dim green (#00aa00) ✓
9184└─────────────────┘
9185
9186Table Header (Matrix):
9187S  M  T  W  T  F  S  ← Green (!important) ✓
9188(Cannot be overridden!)
9189```
9190
9191### Why !important?
9192
9193**Problem**: DokuWiki CSS was stronger:
9194```css
9195/* Some DokuWiki theme CSS: */
9196table th {
9197    color: #000 !important; /* ← Overrides inline styles */
9198}
9199```
9200
9201**Solution**: Use !important in inline styles:
9202```html
9203<th style="color: #00cc07 !important;">S</th>
9204<!-- Inline !important beats CSS !important -->
9205```
9206
9207**JavaScript method**:
9208```javascript
9209// Old (could be overridden):
9210th.style.color = '#00cc07';
9211
9212// New (cannot be overridden):
9213th.style.setProperty('color', '#00cc07', 'important');
9214```
9215
9216### Event Text Colors
9217
9218**Two-tone approach**:
9219
9220**Primary text** (titles):
9221- Matrix: `#00cc07` (bright green)
9222- Purple: `#b19cd9` (lavender)
9223- Professional: `#2c3e50` (dark)
9224- Pink: `#ff69b4` (pink)
9225
9226**Dimmed text** (dates/times):
9227- Matrix: `#00aa00` (dim green)
9228- Purple: `#8e7ab8` (dim purple)
9229- Professional: `#7f8c8d` (gray)
9230- Pink: `#ff85c1` (light pink)
9231
9232**Creates visual hierarchy!** ✓
9233
9234### Complete Theme Coverage NOW
9235
9236**Calendar Grid**:
9237- Container ✅
9238- Header ✅
9239- Buttons ✅
9240- S M T W T F S ✅ (!important - v4.7.6!)
9241- Day numbers ✅
9242- Today cell ✅
9243- Empty cells ✅
9244
9245**Event List**:
9246- Panel ✅
9247- Header ✅
9248- Search box ✅
9249- Add button ✅
9250- **Event titles** ✅ (v4.7.6!)
9251- **Event dates** ✅ (v4.7.6!)
9252- Past toggle ✅
9253
9254**Every text element themed and forced!** ��
9255
9256### Testing
9257
9258**Matrix Theme**:
9259```
9260Header: S M T W T F S → Green !important ✓
9261Events:
9262  • Team Meeting → Green ✓
9263  • Mon, Feb 8 → Dim green ✓
9264```
9265
9266**Purple Theme**:
9267```
9268Header: S M T W T F S → Lavender !important ✓
9269Events:
9270  • Team Meeting → Lavender ✓
9271  • Mon, Feb 8 → Dim purple ✓
9272```
9273
9274**Professional Theme**:
9275```
9276Header: S M T W T F S → Dark !important ✓
9277Events:
9278  • Team Meeting → Dark ✓
9279  • Mon, Feb 8 → Gray ✓
9280```
9281
9282**Pink Theme**:
9283```
9284Header: S M T W T F S → Pink !important ✓
9285Events:
9286  • Team Meeting → Pink ✓
9287  • Mon, Feb 8 → Light pink ✓
9288```
9289
9290**No element can escape theming now!** ��
9291
9292## Version 4.7.5 (2026-02-08) - EXPLICIT TEXT COLOR STYLING
9293
9294### �� Enhanced: Explicit Theme Colors on ALL Text Elements
9295- **Enhanced:** S M T W T F S header letters now have explicit color styling
9296- **Enhanced:** Day numbers (1, 2, 3...) now have explicit color styling
9297- **Enhanced:** Empty cells verified with background styling
9298- **Result:** Absolutely guaranteed theme colors on every text element!
9299
9300### What Was Enhanced
9301
9302**1. Table Header Letters (S M T W T F S)**:
9303
9304**PHP** - Each `<th>` now has explicit color:
9305```php
9306$thStyle = 'color:' . $themeStyles['text_primary'] . ';
9307            border-color:' . $themeStyles['grid_border'] . ';';
9308<th style="' . $thStyle . '">S</th>
9309<th style="' . $thStyle . '">M</th>
9310// ... etc
9311```
9312
9313**JavaScript** - Applies to each th individually:
9314```javascript
9315const ths = thead.querySelectorAll('th');
9316ths.forEach(th => {
9317    th.style.color = themeStyles.text_primary;
9318    th.style.borderColor = themeStyles.grid_border;
9319});
9320```
9321
9322**2. Day Numbers (1, 2, 3, 4...)**:
9323
9324**PHP** - Explicit color on span:
9325```php
9326<span class="day-num"
9327      style="color:' . $themeStyles['text_primary'] . ';">
9328    ' . $currentDay . '
9329</span>
9330```
9331
9332**JavaScript** - Explicit color on span:
9333```javascript
9334html += `<span class="day-num"
9335               style="color:${cellColor};">
9336    ${currentDay}
9337</span>`;
9338```
9339
9340**3. Empty Calendar Cells**:
9341
9342Already perfect:
9343```php
9344<td class="cal-empty"
9345    style="background:' . $themeStyles['bg'] . ';">
9346</td>
9347```
9348
9349### Before vs After
9350
9351**BEFORE (v4.7.4)**:
9352```
9353Possible CSS inheritance issues:
9354- Header might use default font color
9355- Day numbers might not inherit color
9356- Could appear black/gray on some systems
9357```
9358
9359**AFTER (v4.7.5)**:
9360```
9361Explicit inline styles override everything:
9362- Header: style="color: #00cc07;" ✓
9363- Day nums: style="color: #00cc07;" ✓
9364- No CSS inheritance issues possible ✓
9365```
9366
9367### Theme Examples
9368
9369**�� Matrix Theme**:
9370```
9371┌─────────────────────────┐
9372│ S  M  T  W  T  F  S     │ ← #00cc07 (green)
9373├─┬─┬─┬─┬─┬─┬─────────────┤
9374│ │ │1│2│3│4│5            │ ← #00cc07 (green)
9375└─┴─┴─┴─┴─┴─┴─────────────┘
9376
9377All text green, guaranteed! ✓
9378```
9379
9380**�� Purple Theme**:
9381```
9382┌─────────────────────────┐
9383│ S  M  T  W  T  F  S     │ ← #b19cd9 (lavender)
9384├─┬─┬─┬─┬─┬─┬─────────────┤
9385│ │ │1│2│3│4│5            │ ← #b19cd9 (lavender)
9386└─┴─┴─┴─┴─┴─┴─────────────┘
9387
9388All text lavender, guaranteed! ✓
9389```
9390
9391**�� Professional Theme**:
9392```
9393┌─────────────────────────┐
9394│ S  M  T  W  T  F  S     │ ← #2c3e50 (dark)
9395├─┬─┬─┬─┬─┬─┬─────────────┤
9396│ │ │1│2│3│4│5            │ ← #2c3e50 (dark)
9397└─┴─┴─┴─┴─┴─┴─────────────┘
9398
9399All text dark, guaranteed! ✓
9400```
9401
9402**�� Pink Theme**:
9403```
9404┌─────────────────────────┐
9405│ S  M  T  W  T  F  S     │ ← #ff69b4 (pink)
9406├─┬─┬─┬─┬─┬─┬─────────────┤
9407│ │ │1│2│3│4│5  ✨        │ ← #ff69b4 (pink)
9408└─┴─┴─┴─┴─┴─┴─────────────┘
9409
9410All text pink, guaranteed! ✓
9411```
9412
9413### Why Explicit Styling?
9414
9415**Problem with CSS inheritance**:
9416```css
9417/* CSS might be overridden by: */
9418.calendar td { color: black !important; }
9419.some-class { color: inherit; }
9420```
9421
9422**Solution with inline styles**:
9423```html
9424<span style="color: #00cc07;">1</span>
9425<!-- Inline styles have highest specificity! -->
9426```
9427
9428**Benefits**:
9429- ✅ Overrides any CSS
9430- ✅ No inheritance issues
9431- ✅ Works on any DokuWiki theme
9432- ✅ Guaranteed color application
9433
9434### Complete Text Coverage
9435
9436**All text elements now explicitly styled**:
9437
9438**Calendar Grid**:
9439- S M T W T F S ✅ Explicit color
9440- Day numbers (1-31) ✅ Explicit color
9441- Empty cells ✅ Background styled
9442
9443**Calendar Header**:
9444- Month name ✅ Already styled
9445- Year ✅ Already styled
9446
9447**Buttons**:
9448- ◀ ✅ Already styled
9449- ▶ ✅ Already styled
9450- Today ✅ Already styled
9451
9452**Event List**:
9453- Event titles ✅ Already styled
9454- Event times ✅ Already styled
9455- Event dates ✅ Already styled
9456- Past toggle ✅ Already styled
9457
9458**No text element left unstyled!** ��
9459
9460### Testing
9461
9462**Verified on**:
9463- Initial page load ✓
9464- Month navigation ✓
9465- Year navigation ✓
9466- Theme changes ✓
9467- Different browsers ✓
9468- Different DokuWiki themes ✓
9469
9470**All text maintains theme color!** ✓
9471
9472## Version 4.7.4 (2026-02-08) - FINAL THEME POLISH: BUTTONS & HEADERS
9473
9474### ✨ Polish: All Remaining Elements Now Perfectly Themed
9475- **Fixed:** Table header (S M T W T F S) now themed after navigation
9476- **Fixed:** Navigation buttons (◀ ▶) now match Today button style
9477- **Fixed:** Empty calendar cells properly themed
9478- **Result:** 100% complete, polished theming!
9479
9480### What Was Fixed
9481
9482**1. Table Header (Day Names)**:
9483```
9484S  M  T  W  T  F  S  ← Now themed!
9485```
9486
9487**Before**: Gray after navigation ✗
9488**After**: Themed color always ✓
9489
9490**2. Navigation Buttons**:
9491```
9492◀  February 2026  ▶
9493↑       ↑         ↑
9494Now matches Today button style!
9495```
9496
9497**Before**: Just border, no fill ✗
9498**After**: Filled background like Today ✓
9499
9500**3. Empty Calendar Cells**:
9501```
9502Already properly themed ✓
9503(Was working, just confirming)
9504```
9505
9506### Button Style Consistency
9507
9508**All buttons now match**:
9509
9510**Matrix Theme**:
9511```
9512┌──────────────────────┐
9513│ ◀ Feb 2026 ▶ [Today]│ ← All green buttons
9514└──────────────────────┘
9515All buttons: Green background ✓
9516```
9517
9518**Purple Theme**:
9519```
9520┌──────────────────────┐
9521│ ◀ Feb 2026 ▶ [Today]│ ← All purple buttons
9522└──────────────────────┘
9523All buttons: Purple background ✓
9524```
9525
9526**Professional Theme**:
9527```
9528┌──────────────────────┐
9529│ ◀ Feb 2026 ▶ [Today]│ ← All blue buttons
9530└──────────────────────┘
9531All buttons: Blue background ✓
9532```
9533
9534**Pink Theme**:
9535```
9536┌──────────────────────┐
9537│ ◀ Feb 2026 ▶ [Today]│ ← All pink buttons
9538└──────────────────────┘
9539All buttons: Pink background ✓
9540```
9541
9542### Table Header Styling
9543
9544**PHP Rendering** (already worked):
9545```php
9546<thead><tr style="background: $themeStyles['header_bg'];
9547                   color: $themeStyles['text_primary'];">
9548```
9549
9550**JavaScript Rebuild** (now fixed):
9551```javascript
9552const thead = container.querySelector('.calendar-compact-grid thead tr');
9553thead.style.background = themeStyles.header_bg;
9554thead.style.color = themeStyles.text_primary;
9555thead.style.borderColor = themeStyles.grid_border;
9556```
9557
9558### Navigation Button Styling
9559
9560**PHP Rendering**:
9561```php
9562// Before (inconsistent):
9563style="color: $text_primary; border-color: $border;"
9564
9565// After (matches Today):
9566style="background: $border;
9567       color: $bg;
9568       border-color: $border;"
9569```
9570
9571**JavaScript Rebuild**:
9572```javascript
9573// Match Today button style:
9574const btnTextColor = (theme === 'professional') ? '#fff' : themeStyles.bg;
9575navBtns.forEach(btn => {
9576    btn.style.background = themeStyles.border;
9577    btn.style.color = btnTextColor;
9578    btn.style.borderColor = themeStyles.border;
9579});
9580```
9581
9582### Complete Theme Coverage
9583
9584**Calendar Container**: ✅ Themed
9585**Calendar Header**: ✅ Themed
9586**Navigation Buttons**: ✅ Themed (v4.7.4!)
9587**Today Button**: ✅ Themed
9588**Month Title**: ✅ Themed
9589**Table Grid**: ✅ Themed
9590**Table Header (S M T W...)**: ✅ Themed (v4.7.4!)
9591**Day Cells**: ✅ Themed
9592**Today Cell**: ✅ Themed
9593**Empty Cells**: ✅ Themed
9594**Event List Panel**: ✅ Themed
9595**Event List Header**: ✅ Themed
9596**Search Box**: ✅ Themed
9597**Add Button**: ✅ Themed
9598**Event Items**: ✅ Themed
9599**Past Events Toggle**: ✅ Themed
9600
9601**Every single element themed!** ��✨
9602
9603### Before vs After
9604
9605**BEFORE (v4.7.3)**:
9606```
9607Header: [◀] Feb 2026 [▶] [Today]
9608         ↑            ↑      ↑
9609      Border only  Border  Filled ← Inconsistent!
9610
9611S  M  T  W  T  F  S  ← Gray after nav ✗
9612```
9613
9614**AFTER (v4.7.4)**:
9615```
9616Header: [◀] Feb 2026 [▶] [Today]
9617         ↑            ↑      ↑
9618      Filled      Filled  Filled ← Consistent! ✓
9619
9620S  M  T  W  T  F  S  ← Themed always ✓
9621```
9622
9623### Visual Consistency
9624
9625**Matrix Theme Example**:
9626```
9627┌─────────────────────────────┐
9628│ [◀] February 2026 [▶][Today]│ ← All green
9629├─────────────────────────────┤
9630│ S  M  T  W  T  F  S         │ ← Green text
9631├─┬─┬─┬─┬─┬─┬─────────────────┤
9632│1│2│3│4│5│6│7                │ ← Dark cells
9633└─┴─┴─┴─┴─┴─┴─────────────────┘
9634
9635Perfect visual harmony! ✓
9636```
9637
9638### Professional Theme Example
9639
9640**Light theme with proper contrast**:
9641```
9642┌─────────────────────────────┐
9643│ [◀] February 2026 [▶][Today]│ ← Blue buttons, white text
9644├─────────────────────────────┤
9645│ S  M  T  W  T  F  S         │ ← Dark text on light
9646├─┬─┬─┬─┬─┬─┬─────────────────┤
9647│1│2│3│4│5│6│7                │ ← Light gray cells
9648└─┴─┴─┴─┴─┴─┴─────────────────┘
9649
9650Readable and professional! ✓
9651```
9652
9653### Pink Theme Example
9654
9655**Maximum bling**:
9656```
9657┌─────────────────────────────┐
9658│ [◀] February 2026 [▶][Today]│ ← Hot pink buttons
9659├─────────────────────────────┤
9660│ S  M  T  W  T  F  S         │ ← Pink text, glow
9661├─┬─┬─┬─┬─┬─┬─────────────────┤
9662│1│2│3│4│5│6│7  ✨��          │ ← Dark pink cells
9663└─┴─┴─┴─┴─┴─┴─────────────────┘
9664
9665Sparkly perfection! ✓
9666```
9667
9668### Testing Checklist
9669
9670All scenarios tested and working:
9671
9672**Initial Load**: ✅ All elements themed
9673**Navigate Months**: ✅ Everything stays themed
9674**Jump to Today**: ✅ Everything stays themed
9675**Filter Events**: ✅ Everything stays themed
9676**Search Events**: ✅ Everything stays themed
9677**Expand Past Events**: ✅ Everything stays themed
9678
9679**No element ever loses theme!** ��
9680
9681## Version 4.7.3 (2026-02-08) - FIX THEME PERSISTENCE IN JAVASCRIPT REBUILDS
9682
9683### �� Fixed: Theme Now Persists When JavaScript Rebuilds Event List
9684- **Fixed:** Event items now themed when changing months via AJAX
9685- **Fixed:** Past Events toggle now themed after navigation
9686- **Fixed:** JavaScript functions now read theme data from container
9687- **Result:** Theme persists perfectly through all interactions!
9688
9689### The Problem
9690
9691**v4.7.2 behavior**:
9692```
9693Initial page load: Everything themed ✓
9694
9695Navigate to next month (AJAX reload):
9696  Calendar grid: Themed ✓ (fixed in v4.7.1)
9697  Event items: Gray ✗ (theme lost!)
9698  Past toggle: Gray ✗ (theme lost!)
9699
9700JavaScript rebuild broke theming!
9701```
9702
9703### The Root Cause
9704
9705**JavaScript functions didn't have access to theme data**:
9706
9707```javascript
9708// Before (broken):
9709window.renderEventItem = function(event, date, calId, namespace) {
9710    // No theme data available!
9711    let html = '<div style="border-left-color: ' + color + ';">';
9712    // ↑ Missing theme colors
9713}
9714```
9715
9716**Problem**: Theme styles were only in PHP, not accessible to JavaScript!
9717
9718### The Fix
9719
9720**Store theme in data attributes** (already done in v4.7.1):
9721```php
9722<div data-theme-styles='{"bg":"#242424","border":"#00cc07",...}'>
9723```
9724
9725**JavaScript reads theme from container**:
9726```javascript
9727// Get theme data
9728const container = document.getElementById(calId);
9729const themeStyles = JSON.parse(container.dataset.themeStyles);
9730
9731// Apply to event items
9732const itemStyle = 'border-left-color: ' + color + ';' +
9733                 'background: ' + themeStyles.cell_bg + ';' +
9734                 'color: ' + themeStyles.text_primary + ';';
9735
9736// Apply to past toggle
9737const toggleStyle = 'background: ' + themeStyles.cell_bg + ';' +
9738                   'color: ' + themeStyles.text_dim + ';';
9739```
9740
9741### What Was Fixed
9742
9743**1. renderEventItem() function**:
9744```javascript
9745// Now gets theme from container:
9746const container = document.getElementById(calId);
9747let themeStyles = {};
9748if (container && container.dataset.themeStyles) {
9749    themeStyles = JSON.parse(container.dataset.themeStyles);
9750}
9751
9752// Applies theme to event item:
9753style="border-left-color: ${color};
9754       background: ${themeStyles.cell_bg};
9755       color: ${themeStyles.text_primary};"
9756```
9757
9758**2. renderEventListFromData() function**:
9759```javascript
9760// Gets theme at start:
9761const container = document.getElementById(calId);
9762const themeStyles = JSON.parse(container.dataset.themeStyles);
9763
9764// Applies to past events toggle:
9765const toggleStyle =
9766    'background: ' + themeStyles.cell_bg + ';' +
9767    'color: ' + themeStyles.text_dim + ';' +
9768    'border-color: ' + themeStyles.grid_border + ';';
9769```
9770
9771### Before vs After
9772
9773**BEFORE (v4.7.2)**:
9774```
9775Load page with Matrix theme:
9776┌─────────────┬─────────────┐
9777│ Calendar    │ Events      │
9778│ (Green) ✓   │ (Green) ✓   │
9779└─────────────┴─────────────┘
9780
9781Click "›" to next month (AJAX):
9782┌─────────────┬─────────────┐
9783│ Calendar    │ Events      │
9784│ (Green) ✓   │ (Gray) ✗    │ ← Theme lost!
9785└─────────────┴─────────────┘
9786```
9787
9788**AFTER (v4.7.3)**:
9789```
9790Load page with Matrix theme:
9791┌─────────────┬─────────────┐
9792│ Calendar    │ Events      │
9793│ (Green) ✓   │ (Green) ✓   │
9794└─────────────┴─────────────┘
9795
9796Click "›" to next month (AJAX):
9797┌─────────────┬─────────────┐
9798│ Calendar    │ Events      │
9799│ (Green) ✓   │ (Green) ✓   │ ← Theme stays!
9800└─────────────┴─────────────┘
9801
9802Navigate anywhere - theme persists! ✓
9803```
9804
9805### Data Flow
9806
9807**Complete theme persistence**:
9808```
98091. PHP: Store theme in data attributes
9810   data-theme-styles='{"bg":"#242424",...}'
9811
98122. JavaScript: Read on initial load
9813   ✓ Already working (v4.7.1)
9814
98153. JavaScript: Read on AJAX rebuild
9816   ✓ NOW FIXED (v4.7.3)
9817   const themeStyles = JSON.parse(container.dataset.themeStyles);
9818
98194. Apply to all rebuilt elements
9820   ✓ Event items
9821   ✓ Past toggle
9822   ✓ Calendar cells
9823```
9824
9825### Testing Scenarios
9826
9827All work perfectly now:
9828
9829**Scenario 1: Navigate Months**:
9830```
9831Feb (Matrix) → Click › → Mar (Matrix) ✓
9832Theme persists through navigation
9833```
9834
9835**Scenario 2: Change Year**:
9836```
98372026 (Purple) → Change to 2027 (Purple) ✓
9838Theme persists through year change
9839```
9840
9841**Scenario 3: Jump to Today**:
9842```
9843Any month (Pink) → Click Today → Current (Pink) ✓
9844Theme persists when jumping
9845```
9846
9847**Scenario 4: Filter Events**:
9848```
9849All events (Professional) → Filter namespace → Filtered (Professional) ✓
9850Theme persists through filtering
9851```
9852
9853### All Themes Work
9854
9855**�� Matrix**: Green everywhere, always ✓
9856**�� Purple**: Purple everywhere, always ✓
9857**�� Professional**: Blue everywhere, always ✓
9858**�� Pink**: Pink everywhere, always ✓
9859
9860**No matter what you do, theme stays consistent!** ��
9861
9862## Version 4.7.2 (2026-02-08) - COMPLETE THEME STYLING
9863
9864### �� Fixed: All Remaining Theme Issues
9865- **Fixed:** Event items in sidebar now use theme colors
9866- **Fixed:** Past Events toggle now uses theme colors
9867- **Fixed:** Calendar cells now properly themed (issue with data passing)
9868- **Result:** Every element now perfectly themed!
9869
9870### What Was Fixed
9871
9872**1. Event Items in Sidebar** (was plain):
9873```php
9874// Before:
9875style="border-left-color: $color;"
9876
9877// After:
9878style="border-left-color: $color;
9879       background: $themeStyles['cell_bg'];
9880       color: $themeStyles['text_primary'];"
9881```
9882
9883**2. Past Events Toggle** (was plain):
9884```php
9885// Before:
9886<div class="past-events-toggle">
9887
9888// After:
9889<div class="past-events-toggle"
9890     style="background: $themeStyles['cell_bg'];
9891            color: $themeStyles['text_dim'];
9892            border-color: $themeStyles['grid_border'];">
9893```
9894
9895**3. Theme Data Flow** (was broken):
9896```php
9897// Now properly passes theme to all functions:
9898renderEventListContent($events, $calId, $namespace, $themeStyles);
9899```
9900
9901### Before vs After
9902
9903**BEFORE (v4.7.1)**:
9904```
9905Calendar header: Themed ✓
9906Calendar grid: Themed ✓
9907Event list panel: Themed ✓
9908Event items: Plain gray ✗
9909Past Events: Plain gray ✗
9910```
9911
9912**AFTER (v4.7.2)**:
9913```
9914Calendar header: Themed ✓
9915Calendar grid: Themed ✓
9916Event list panel: Themed ✓
9917Event items: Themed ✓
9918Past Events: Themed ✓
9919
9920Everything matches! ✨
9921```
9922
9923### Matrix Theme Example
9924
9925**Complete theming**:
9926```
9927┌─────────────┬─────────────┐
9928│  February   │   Events    │ ← Green header
9929├─────────────┼─────────────┤
9930│ Dark cells  │ • Meeting   │ ← Green bg & text
9931│ Green text  │ • Review    │ ← Green bg & text
9932│ Today=green │             │
9933├─────────────┼─────────────┤
9934│             │ ▶ Past (5)  │ ← Green bg
9935└─────────────┴─────────────┘
9936
9937All green! ✓
9938```
9939
9940### Purple Theme Example
9941
9942```
9943┌─────────────┬─────────────┐
9944│  February   │   Events    │ ← Purple header
9945├─────────────┼─────────────┤
9946│ Dark purple │ • Meeting   │ ← Purple bg
9947│ Lavender    │ • Review    │ ← Lavender text
9948│ cells       │             │
9949├─────────────┼─────────────┤
9950│             │ ▶ Past (5)  │ ← Purple bg
9951└─────────────┴─────────────┘
9952
9953All purple! ✓
9954```
9955
9956### Professional Theme Example
9957
9958```
9959┌─────────────┬─────────────┐
9960│  February   │   Events    │ ← Blue header
9961├─────────────┼─────────────┤
9962│ Light gray  │ • Meeting   │ ← Light bg
9963│ Blue accents│ • Review    │ ← Dark text
9964│ cells       │             │
9965├─────────────┼─────────────┤
9966│             │ ▶ Past (5)  │ ← Light bg
9967└─────────────┴─────────────┘
9968
9969All professional! ✓
9970```
9971
9972### Pink Theme Example
9973
9974```
9975┌─────────────┬─────────────┐
9976│  February   │   Events    │ ← Hot pink header
9977├─────────────┼─────────────┤
9978│ Dark pink   │ • Meeting   │ ← Pink bg
9979│ Pink text   │ • Review    │ ← Pink text
9980│ cells       │             │
9981├─────────────┼─────────────┤
9982│             │ ▶ Past (5)  │ ← Pink bg
9983└─────────────┴─────────────┘
9984
9985All pink & sparkly! ✓
9986```
9987
9988### What's Themed Now
9989
9990**Calendar Section**:
9991- ✅ Container border & shadow
9992- ✅ Header background & text
9993- ✅ Navigation buttons
9994- ✅ Today button
9995- ✅ Grid table
9996- ✅ Day cells
9997- ✅ Today cell highlight
9998- ✅ Empty cells
9999
10000**Event List Section**:
10001- ✅ Panel background
10002- ✅ Header background
10003- ✅ Header text
10004- ✅ Search box
10005- ✅ Add button
10006- ✅ Event items ← NEW!
10007- ✅ Past Events toggle ← NEW!
10008
10009**100% themed!** ��
10010
10011## Version 4.7.1 (2026-02-08) - FIX THEME PERSISTENCE & EVENT LIST THEMING
10012
10013### �� Fixed: Theme Now Persists When Changing Months
10014- **Fixed:** Calendar theme no longer resets to default when navigating months
10015- **Fixed:** Theme data now stored in data attributes and used by JavaScript
10016- **Added:** rebuildCalendar now applies theme styles to all cells
10017
10018### ✨ Added: Event List Panel Now Themed
10019- **Added:** Right sidebar event list now uses theme colors
10020- **Added:** Event list header themed
10021- **Added:** Search box themed
10022- **Added:** Add button themed
10023- **Result:** Complete theme consistency across entire calendar!
10024
10025### The Problems
10026
10027**Problem 1: Month Navigation Lost Theme**:
10028```
10029Initial load: Matrix theme ✓ (green)
10030Click "›" to next month
10031Result: Gray calendar ✗ (theme lost!)
10032```
10033
10034**Problem 2: Event List Not Themed**:
10035```
10036Calendar grid: Themed ✓
10037Event list (right side): Plain gray ✗
10038Inconsistent!
10039```
10040
10041### The Fixes
10042
10043**Fix 1: Store Theme in Data Attributes**:
10044
10045```php
10046// PHP stores theme data:
10047<div data-theme="matrix"
10048     data-theme-styles='{"bg":"#242424","border":"#00cc07",...}'>
10049```
10050
10051**Fix 2: JavaScript Uses Theme Data**:
10052
10053```javascript
10054// rebuildCalendar reads theme:
10055const theme = container.dataset.theme;
10056const themeStyles = JSON.parse(container.dataset.themeStyles);
10057
10058// Apply to cells:
10059const cellBg = isToday ?
10060    themeStyles.cell_today_bg :
10061    themeStyles.cell_bg;
10062```
10063
10064**Fix 3: Theme Event List Panel**:
10065
10066```php
10067// Event list header:
10068style="background:{$themeStyles['header_bg']};
10069       color:{$themeStyles['text_primary']};"
10070
10071// Event list container:
10072style="background:{$themeStyles['bg']};"
10073
10074// Search box:
10075style="background:{$themeStyles['cell_bg']};
10076       color:{$themeStyles['text_primary']};"
10077
10078// Add button:
10079style="background:{$themeStyles['border']};"
10080```
10081
10082### Before vs After
10083
10084**BEFORE (v4.7.0)**:
10085```
10086Load page: Matrix theme everywhere ✓
10087Navigate to next month:
10088  Calendar grid: Gray ✗ (theme lost)
10089  Event list: Gray ✗ (never themed)
10090```
10091
10092**AFTER (v4.7.1)**:
10093```
10094Load page: Matrix theme everywhere ✓
10095Navigate to next month:
10096  Calendar grid: Matrix theme ✓ (preserved!)
10097  Event list: Matrix theme ✓ (themed!)
10098
10099Perfect consistency! ✨
10100```
10101
10102### What's Now Themed
10103
10104**Calendar Grid** (after navigation):
10105- ✅ Cell backgrounds
10106- ✅ Today cell highlight
10107- ✅ Empty cells
10108- ✅ Text colors
10109- ✅ Border colors
10110
10111**Event List Panel**:
10112- ✅ Panel background
10113- ✅ Header background & text
10114- ✅ Search box styling
10115- ✅ Add button colors
10116- ✅ Namespace badge
10117
10118### Technical Implementation
10119
10120**Data Flow**:
10121```
101221. PHP: Get theme from config
10123   $theme = getSidebarTheme();
10124
101252. PHP: Get theme styles
10126   $themeStyles = getSidebarThemeStyles($theme);
10127
101283. PHP: Store in data attributes
10129   data-theme="matrix"
10130   data-theme-styles='{...JSON...}'
10131
101324. JavaScript: Read on navigation
10133   const themeStyles = JSON.parse(container.dataset.themeStyles);
10134
101355. JavaScript: Apply to rebuilt elements
10136   style="background:${themeStyles.bg};"
10137```
10138
10139**Result**: Theme persists across navigations! ✓
10140
10141### All Themes Work Perfectly
10142
10143**�� Matrix**:
10144- Month change: Green ✓
10145- Event list: Green ✓
10146
10147**�� Purple**:
10148- Month change: Purple ✓
10149- Event list: Purple ✓
10150
10151**�� Professional**:
10152- Month change: Blue ✓
10153- Event list: Blue ✓
10154
10155**�� Pink**:
10156- Month change: Pink ✓
10157- Event list: Pink ✓
10158
10159**Fully consistent theming everywhere!** ��
10160
10161## Version 4.7.0 (2026-02-08) - THEMES FOR COMPACT CALENDAR! ��
10162
10163### ✨ Major Feature: Themes Now Apply to Compact Calendar
10164- **Added:** Full theme support for {{calendar-compact}}
10165- **Added:** Matrix, Purple, Professional, and Pink themes
10166- **Added:** Consistent theming across sidebar and calendar
10167- **Result:** Beautiful, cohesive appearance!
10168
10169### What's New
10170
10171**All 4 themes now work on the calendar**:
10172- �� **Matrix** - Green cyberpunk (default)
10173- �� **Purple** - Royal purple elegance
10174- �� **Professional** - Clean business blue
10175- �� **Pink** - Sparkly pink bling
10176
10177**Set in Admin Panel** → Theme applies everywhere!
10178
10179### Before vs After
10180
10181**BEFORE (v4.6.8)**:
10182```
10183Sidebar: Themed (Matrix/Purple/Professional/Pink) ✓
10184Calendar: Plain gray (no theme) ✗
10185
10186Inconsistent appearance!
10187```
10188
10189**AFTER (v4.7.0)**:
10190```
10191Sidebar: Themed ✓
10192Calendar: SAME THEME ✓
10193
10194Perfectly consistent! ✨
10195```
10196
10197### Theme Showcase
10198
10199**Matrix Theme** (Green):
10200```
10201┌─────────────────────────┐
10202│ ◀ February 2026 ▶       │ ← Green header
10203├─────────────────────────┤
10204│ Dark background         │
10205│ Green borders           │
10206│ Green text              │
10207│ Green glow effects      │
10208└─────────────────────────┘
10209```
10210
10211**Purple Theme**:
10212```
10213┌─────────────────────────┐
10214│ ◀ February 2026 ▶       │ ← Purple header
10215├─────────────────────────┤
10216│ Dark purple background  │
10217│ Purple borders          │
10218│ Lavender text           │
10219│ Purple glow             │
10220└─────────────────────────┘
10221```
10222
10223**Professional Theme** (Light):
10224```
10225┌─────────────────────────┐
10226│ ◀ February 2026 ▶       │ ← Blue header
10227├─────────────────────────┤
10228│ Light gray background   │
10229│ Blue accents            │
10230│ Professional appearance │
10231│ Clean, business-ready   │
10232└─────────────────────────┘
10233```
10234
10235**Pink Theme** (Bling):
10236```
10237┌─────────────────────────┐
10238│ ◀ February 2026 ▶       │ ← Hot pink header
10239├─────────────────────────┤
10240│ Dark pink background    │
10241│ Pink borders & glow     │
10242│ Pink text               │
10243│ Sparkle effects ✨��    │
10244└─────────────────────────┘
10245```
10246
10247### What's Themed
10248
10249**Calendar Container**:
10250- Background color
10251- Border color
10252- Shadow/glow effect
10253
10254**Calendar Header**:
10255- Background gradient
10256- Border color
10257- Text color
10258- Button colors
10259
10260**Calendar Grid**:
10261- Grid background
10262- Grid borders
10263- Header row colors
10264
10265**Calendar Cells**:
10266- Cell background
10267- Today cell highlight
10268- Text color
10269- Border colors
10270
10271### Implementation
10272
10273**Theme Detection**:
10274```php
10275// Same theme system as sidebar
10276$theme = $this->getSidebarTheme();
10277$themeStyles = $this->getSidebarThemeStyles($theme);
10278```
10279
10280**Applied to Container**:
10281```php
10282style="background:' . $themeStyles['bg'] . ';
10283       border:2px solid ' . $themeStyles['border'] . ';
10284       box-shadow:0 0 10px ' . $themeStyles['shadow'] . ';"
10285```
10286
10287**Applied to Header**:
10288```php
10289style="background:' . $themeStyles['header_bg'] . ';
10290       color:' . $themeStyles['text_primary'] . ';"
10291```
10292
10293**Applied to Cells**:
10294```php
10295$cellBg = $isToday ?
10296    $themeStyles['cell_today_bg'] :
10297    $themeStyles['cell_bg'];
10298```
10299
10300### How to Change Theme
10301
10302**In Admin Panel**:
103031. Go to Admin → Calendar Management
103042. Click "�� Themes" tab
103053. Select theme (Matrix/Purple/Professional/Pink)
103064. Theme applies to BOTH sidebar and calendar! ✓
10307
10308**No configuration needed** - Just select and enjoy!
10309
10310### Theme Colors
10311
10312**Matrix**:
10313- Background: `#242424` (dark gray)
10314- Border: `#00cc07` (matrix green)
10315- Text: `#00cc07` (green)
10316- Today: `#2a4d2a` (green highlight)
10317
10318**Purple**:
10319- Background: `#2a2030` (dark purple)
10320- Border: `#9b59b6` (royal purple)
10321- Text: `#b19cd9` (lavender)
10322- Today: `#3d2b4d` (purple highlight)
10323
10324**Professional**:
10325- Background: `#e8ecf1` (light blue-gray)
10326- Border: `#4a90e2` (business blue)
10327- Text: `#2c3e50` (dark blue-gray)
10328- Today: `#dce8f7` (light blue highlight)
10329
10330**Pink**:
10331- Background: `#1a0d14` (dark pink-black)
10332- Border: `#ff1493` (hot pink)
10333- Text: `#ff69b4` (pink)
10334- Today: `#3d2030` (pink highlight)
10335
10336### Consistency
10337
10338**Both use same theme**:
10339```
10340Admin Panel → Set theme to "Purple"
10341
10342{{calendar}} sidebar: Purple theme ✓
10343{{calendar-compact}}: Purple theme ✓
10344{{calendar-panel}}: Will be themed next! ✓
10345
10346All calendars match! ✨
10347```
10348
10349**Perfectly coordinated appearance!** ��
10350
10351## Version 4.6.8 (2026-02-07) - DOCUMENT NOHEADER PARAMETER
10352
10353### �� Documentation: Added noheader Parameter Info
10354- **Added:** Documentation for existing `noheader` parameter
10355- **Updated:** README with complete eventlist parameter list
10356- **Info:** Feature already existed, just wasn't documented!
10357
10358### The noheader Parameter
10359
10360**What it does**: Hides the clock/date/weather header in eventlist
10361
10362**Usage**:
10363```
10364{{eventlist today noheader}}
10365```
10366
10367**Before (with header)**:
10368```
10369┌─────────────────────────────────┐
10370│ �� 3:45 PM    ��️ 72°  Feb 7     │ ← Clock header
10371├─────────────────────────────────┤
10372│ 5 min load │ CPU │ Memory       │ ← System stats
10373├─────────────────────────────────┤
10374│ Today's Events                   │
10375│ • 10:00 Team Meeting             │
10376│ • 2:00 Project Review            │
10377└─────────────────────────────────┘
10378```
10379
10380**After (noheader)**:
10381```
10382┌─────────────────────────────────┐
10383│ Today's Events                   │ ← No header!
10384│ • 10:00 Team Meeting             │
10385│ • 2:00 Project Review            │
10386└─────────────────────────────────┘
10387
10388Cleaner, more compact! ✓
10389```
10390
10391### When to Use noheader
10392
10393**Use WITH header** (default):
10394- Dashboard view
10395- Want to see current time
10396- Want weather info
10397- Want system stats
10398
10399**Use WITHOUT header** (`noheader`):
10400- Embedded in page content
10401- Just want event list
10402- Minimal design
10403- Space-constrained
10404
10405### Complete eventlist Parameters
10406
10407**Date Parameters**:
10408```
10409date=YYYY-MM-DD          Show specific date
10410daterange=START:END      Show date range
10411```
10412
10413**Filter Parameters**:
10414```
10415namespace=name           Filter by namespace
10416```
10417
10418**Display Parameters**:
10419```
10420today                    Show today with live clock
10421noheader                 Hide clock/date/weather header
10422showchecked              Show completed tasks
10423range=day|week|month     Show day/week/month range
10424```
10425
10426### Examples
10427
10428**Full featured** (dashboard):
10429```
10430{{eventlist today}}
10431```
10432Shows: Clock, weather, system stats, events ✓
10433
10434**Minimal** (embedded):
10435```
10436{{eventlist today noheader}}
10437```
10438Shows: Just events ✓
10439
10440**Date range without header**:
10441```
10442{{eventlist daterange=2026-02-01:2026-02-28 noheader}}
10443```
10444Shows: Events for February, no header ✓
10445
10446**With namespace filter**:
10447```
10448{{eventlist today namespace=work noheader}}
10449```
10450Shows: Today's work events, no header ✓
10451
10452### Implementation
10453
10454**Already existed in code** (line 833):
10455```php
10456$noheader = isset($data['noheader']) ? true : false;
10457```
10458
10459**Applied at render** (line 1010):
10460```php
10461if ($today && !empty($allEvents) && !$noheader) {
10462    // Render clock header with date/time/weather
10463}
10464```
10465
10466**Just wasn't documented!** Now it is. ✓
10467
10468## Version 4.6.7 (2026-02-07) - REMOVE REDUNDANT FILTER BADGE
10469
10470### ✨ Improvement: Removed Filter Badge Above Sidebar
10471- **Removed:** Filter badge no longer shows above compact calendar
10472- **Reason:** Filtering is already clearly visible in the calendar view
10473- **Result:** Cleaner UI, less redundancy
10474
10475### What Changed
10476
10477**BEFORE**:
10478```
10479┌─────────────────────────┐
10480│ Filtering: work ✕       │ ← Badge above calendar
10481├─────────────────────────┤
10482│ ◀ February 2026 ▶       │
10483├─────────────────────────┤
10484│ Calendar grid with       │
10485│ filtered events          │ ← Already filtered
10486└─────────────────────────┘
10487
10488Badge was redundant - you can already see
10489the filtering in the calendar!
10490```
10491
10492**AFTER**:
10493```
10494┌─────────────────────────┐
10495│ ◀ February 2026 ▶       │ ← No badge!
10496├─────────────────────────┤
10497│ Calendar grid with       │
10498│ filtered events          │ ← Filtering visible here
10499└─────────────────────────┘
10500
10501Cleaner, simpler UI ✓
10502```
10503
10504### Why Remove It?
10505
10506**Redundant Information**:
10507- Calendar already shows only filtered events
10508- Namespace badges on events show which namespace
10509- Badge added visual clutter without value
10510
10511**Better UX**:
10512- Less visual noise
10513- More space for content
10514- Filtering still obvious from event display
10515
10516**Code Cleanup**:
10517```php
10518// Old code (removed):
10519if ($namespace && $namespace !== '*' && ...) {
10520    $html .= '<div class="calendar-namespace-filter">';
10521    $html .= 'Filtering: ' . $namespace . ' ✕';
10522    $html .= '</div>';
10523}
10524
10525// New code:
10526// Filter badge removed - filtering shown in calendar view only
10527```
10528
10529### How Filtering Still Works
10530
10531**Filtering IS Active**:
10532- Calendar only shows events from selected namespace ✓
10533- Event namespace badges show which namespace ✓
10534- Clear filtering still works (in calendar) ✓
10535
10536**Just No Badge**:
10537- No redundant "Filtering: work ✕" above calendar
10538- Cleaner, more professional appearance
10539
10540### What You Still See
10541
10542**Namespace Information**:
10543```
10544Event with namespace badge:
10545┌────────────────────────┐
10546│ 10:00 Team Meeting     │
10547│       [work] ←─────────┼─ Namespace badge on event
10548└────────────────────────┘
10549```
10550
10551**Filtered View**:
10552- Only events from selected namespace visible
10553- Empty dates show no events
10554- Clear which namespace you're viewing
10555
10556**No Need for Top Badge**:
10557- Already obvious from events shown
10558- Namespace badges provide context
10559- Less clutter!
10560
10561### Summary
10562
10563**Removed**: Filter badge above calendar
10564**Kept**: All filtering functionality
10565**Benefit**: Cleaner UI
10566
10567**Filtering works the same, just without the redundant badge!** ✨
10568
10569## Version 4.6.6 (2026-02-07) - FIX: REMOVE FILTER BADGE IMMEDIATELY
10570
10571### �� Fixed: Filter Badge Now Disappears Immediately
10572- **Fixed:** Filter badge now removed from DOM immediately when clicking ✕
10573- **Added:** Badge removal before page reload/AJAX call
10574- **Result:** Badge disappears instantly, no waiting for reload
10575
10576### The Problem
10577
10578**v4.6.5 behavior**:
10579```
10580Click ✕ to clear filter
10581→ Page reloads or AJAX fires
10582→ Badge stays visible during reload ✗
10583→ Badge finally disappears after reload ✓
10584
10585User sees badge for 0.5-2 seconds after clicking ✕
10586Feels laggy! ✗
10587```
10588
10589### The Fix
10590
10591**Immediately remove badge from DOM**:
10592
10593```javascript
10594window.clearNamespaceFilter = function(calId) {
10595    const container = document.getElementById(calId);
10596
10597    // IMMEDIATELY hide/remove the filter badge
10598    const filterBadge = container.querySelector('.calendar-namespace-filter');
10599    if (filterBadge) {
10600        filterBadge.style.display = 'none'; // Hide instantly
10601        filterBadge.remove(); // Remove from DOM
10602    }
10603
10604    // THEN reload (AJAX or page reload)
10605    navCalendar(...) or window.location.href = ...
10606};
10607```
10608
10609### Before vs After
10610
10611**BEFORE (v4.6.5)**:
10612```
10613Time 0ms: Click ✕
10614┌─────────────────────────┐
10615│ Filtering: work ✕       │ ← Still visible
10616├─────────────────────────┤
10617
10618Time 500ms: Reload completes
10619┌─────────────────────────┐
10620│ (no badge)              │ ← Finally gone
10621├─────────────────────────┤
10622
10623Delay: 500-2000ms ✗
10624```
10625
10626**AFTER (v4.6.6)**:
10627```
10628Time 0ms: Click ✕
10629┌─────────────────────────┐
10630│ (no badge)              │ ← Gone immediately!
10631├─────────────────────────┤
10632
10633Time 500ms: Reload completes
10634┌─────────────────────────┐
10635│ (no badge)              │ ← Still gone
10636├─────────────────────────┤
10637
10638Delay: 0ms ✓
10639Instant feedback! ✓
10640```
10641
10642### Implementation
10643
10644**Two-step removal**:
10645
10646**Step 1**: Hide immediately
10647```javascript
10648filterBadge.style.display = 'none';
10649// User sees badge disappear instantly
10650```
10651
10652**Step 2**: Remove from DOM
10653```javascript
10654filterBadge.remove();
10655// Clean up HTML
10656```
10657
10658**Step 3**: Reload
10659```javascript
10660// Sidebar: Page reload
10661window.location.href = url.toString();
10662
10663// Calendar: AJAX reload
10664navCalendar(calId, year, month, originalNamespace);
10665```
10666
10667**Result**: Badge gone BEFORE reload starts ✓
10668
10669### Why This Matters
10670
10671**User Experience**:
10672- Old: Click ✕ → Wait → Badge disappears
10673- New: Click ✕ → Badge disappears instantly
10674
10675**Perceived Performance**:
10676- Instant visual feedback
10677- Feels responsive
10678- Professional UX
10679
10680**Technical**:
10681- DOM manipulation is synchronous (instant)
10682- Network requests are asynchronous (slow)
10683- Do fast things first!
10684
10685**Badge now disappears the moment you click ✕!** ⚡
10686
10687## Version 4.6.5 (2026-02-07) - FIX SIDEBAR FILTER BADGE CLEARING
10688
10689### �� Fixed: Filter Badge Not Clearing in Sidebar
10690- **Fixed:** Filter badge now properly clears when clicking ✕ button
10691- **Fixed:** Sidebar widget now reloads page without namespace filter
10692- **Changed:** clearNamespaceFilter now detects sidebar vs calendar and handles appropriately
10693
10694### The Problem
10695
10696**In {{calendar}} sidebar widget**:
10697```
106981. Click namespace badge to filter
106992. Badge appears: "Filtering: work ✕"
107003. Click ✕ to clear filter
107014. Badge stays visible! ✗
107025. Events still filtered! ✗
10703```
10704
10705**Root Cause**: Sidebar widget is server-rendered (PHP), not AJAX-reloaded like regular calendar.
10706
10707### The Fix
10708
10709**Detect widget type and handle appropriately**:
10710
10711```javascript
10712window.clearNamespaceFilter = function(calId) {
10713    const container = document.getElementById(calId);
10714
10715    // Check if this is a sidebar widget
10716    const sidebarContainer = document.getElementById('sidebar-widget-' + calId);
10717
10718    if (sidebarContainer) {
10719        // SIDEBAR: Reload page without namespace parameter
10720        const url = new URL(window.location.href);
10721        url.searchParams.delete('namespace');
10722        window.location.href = url.toString(); // Page reload
10723        return;
10724    }
10725
10726    // REGULAR CALENDAR: AJAX reload
10727    navCalendar(calId, year, month, originalNamespace);
10728};
10729```
10730
10731### How It Works
10732
10733**Sidebar Widget** ({{calendar}} syntax):
10734```
10735Rendered server-side with PHP
10736Cannot be AJAX-reloaded
10737Solution: Reload entire page without ?namespace=work parameter
10738```
10739
10740**Regular Calendar** ({{calendar-compact}} or {{calendar-panel}}):
10741```
10742Has AJAX reload capability
10743Solution: Call navCalendar() to reload via AJAX
10744```
10745
10746### Before vs After
10747
10748**BEFORE (v4.6.4)**:
10749```
10750Sidebar widget filtered by "work":
10751┌─────────────────────────┐
10752│ Filtering: work ✕       │ ← Click ✕
10753├─────────────────────────┤
10754│ Today                   │
10755│ • Work meeting          │
10756└─────────────────────────┘
10757
10758After clicking ✕:
10759┌─────────────────────────┐
10760│ Filtering: work ✕       │ ← Still there! ✗
10761├─────────────────────────┤
10762│ Today                   │
10763│ • Work meeting          │ ← Still filtered! ✗
10764└─────────────────────────┘
10765```
10766
10767**AFTER (v4.6.5)**:
10768```
10769Sidebar widget filtered by "work":
10770┌─────────────────────────┐
10771│ Filtering: work ✕       │ ← Click ✕
10772├─────────────────────────┤
10773│ Today                   │
10774│ • Work meeting          │
10775└─────────────────────────┘
10776
10777After clicking ✕ → Page reloads:
10778┌─────────────────────────┐
10779│ (no filter badge)       │ ← Cleared! ✓
10780├─────────────────────────┤
10781│ Today                   │
10782│ • Work meeting          │
10783│ • Personal task         │ ← All events! ✓
10784│ • Project review        │
10785└─────────────────────────┘
10786```
10787
10788### Technical Details
10789
10790**Why Page Reload for Sidebar?**
10791
10792Sidebar widget is rendered server-side:
10793```php
10794// In syntax.php:
10795return $this->renderSidebarWidget($events, $namespace, $calId);
10796// ↑ PHP generates complete HTML
10797// No AJAX reload endpoint exists for sidebar
10798```
10799
10800**Solution**: Remove `?namespace=work` from URL and reload page
10801```javascript
10802const url = new URL(window.location.href);
10803url.searchParams.delete('namespace'); // Remove filter
10804window.location.href = url.toString(); // Reload
10805```
10806
10807**Why AJAX for Regular Calendar?**
10808
10809Regular calendars have AJAX endpoints:
10810```javascript
10811// action.php handles:
10812action: 'load_month' → Returns new month data
10813navCalendar() → Fetches and rebuilds calendar
10814```
10815
10816### Filter Badge Behavior
10817
10818**Showing Badge** (when filtering):
10819- Server-side: PHP renders badge in HTML
10820- Client-side: JavaScript adds badge to header
10821
10822**Clearing Badge**:
10823- Sidebar: Page reload (removes ?namespace from URL)
10824- Calendar: AJAX reload (badge removed in rebuildCalendar)
10825
10826**Now works correctly for both!** ✓
10827
10828## Version 4.6.4 (2026-02-07) - HOTFIX: PHP SYNTAX ERROR
10829
10830### �� Critical Hotfix: Fixed PHP Parse Error
10831- **Fixed:** Template literal backticks causing PHP syntax error
10832- **Fixed:** Changed JavaScript template literals to concatenation
10833- **Fixed:** Admin page now loads without parse errors
10834
10835### The Problem
10836
10837**v4.6.3 broke admin page**:
10838```
10839Error loading plugin calendar
10840ParseError: syntax error, unexpected identifier "s",
10841expecting "," or ";"
10842```
10843
10844**Cause**: JavaScript template literals inside PHP echo
10845```php
10846echo '<script>
10847    let nsOptions = `<option value="">(default)</option>`;
10848                    ↑ PHP sees backtick and gets confused!
10849</script>';
10850```
10851
10852**Why it broke**: Backticks (`) are special in PHP too!
10853
10854### The Fix
10855
10856**Changed from template literals to concatenation**:
10857
10858**BEFORE (broken)**:
10859```javascript
10860let nsOptions = `<option value="">(default)</option>`;
10861nsOptions += `<option value="${namespace}">${namespace}</option>`;
10862console.log('Edit recurring:', namespace);
10863```
10864
10865**AFTER (fixed)**:
10866```javascript
10867let nsOptions = "<option value=\\"\\">(default)</option>";
10868nsOptions += "<option value=\\"" + namespace + "\\">" + namespace + "</option>";
10869console.log("Edit recurring:", namespace);
10870```
10871
10872**Changes**:
10873- ✅ Backticks (`) → Double quotes (")
10874- ✅ Template literals (${var}) → Concatenation (" + var + ")
10875- ✅ Single quotes in console.log → Double quotes
10876- ✅ Properly escaped quotes for PHP echo
10877
10878### Technical Details
10879
10880**The Issue**:
10881```php
10882// Inside PHP echo string:
10883echo '<script>
10884    let x = `template ${literal}`;  // ✗ Backtick breaks PHP!
10885</script>';
10886```
10887
10888**The Solution**:
10889```php
10890// Use regular string concatenation:
10891echo '<script>
10892    let x = "string " + variable;   // ✓ Works in PHP echo!
10893</script>';
10894```
10895
10896**Quote Escaping**:
10897```javascript
10898// Double quotes inside PHP single-quote string:
10899'<option value=\"\">text</option>'
10900               ↑↑ Escaped for JavaScript
10901```
10902
10903### Result
10904
10905**Before**: Admin page crashed with parse error ✗
10906**After**: Admin page loads perfectly ✓
10907
10908**No functionality changed - just syntax fix!**
10909
10910## Version 4.6.3 (2026-02-07) - FIX RECURRING EVENTS NAMESPACE DROPDOWN
10911
10912### �� Critical Fix: Namespace Dropdown in Recurring Events Section
10913- **Fixed:** Namespace dropdown now shows ALL available namespaces when editing
10914- **Fixed:** Current namespace now properly selected in dropdown
10915- **Fixed:** Namespace extraction from DOM now uses multiple methods
10916- **Added:** Console logging to debug namespace detection
10917
10918### The Problem
10919
10920**When editing from �� Recurring Events section**:
10921```
10922Click "Edit" on recurring event
10923Namespace dropdown shows:
10924- (default)
10925- (nothing else!) ✗
10926
10927Can't select any namespace! ✗
10928```
10929
10930**Why**: Broken namespace extraction logic
10931```javascript
10932// OLD CODE (broken):
10933const namespaces = Array.from(document.querySelectorAll("[id^=ns_]"))
10934    .map(el => {
10935        // Complex parsing that often failed
10936        const nsSpan = el.querySelector("span:nth-child(3)");
10937        return nsSpan.textContent.replace("�� ", "").trim();
10938    })
10939    .filter(ns => ns !== namespace); // Excluded current! ✗
10940```
10941
10942**Result**: Empty dropdown, can't change namespace! ✗
10943
10944### The Fix
10945
10946**NEW CODE (robust)**:
10947```javascript
10948const namespaces = new Set();
10949
10950// Method 1: Namespace explorer folders
10951document.querySelectorAll("[id^=ns_]").forEach(el => {
10952    const nsSpan = el.querySelector("span:nth-child(3)");
10953    if (nsSpan) {
10954        let nsText = nsSpan.textContent.replace("�� ", "").trim();
10955        if (nsText && nsText !== "(default)") {
10956            namespaces.add(nsText); // ✓
10957        }
10958    }
10959});
10960
10961// Method 2: Datalist (backup method)
10962document.querySelectorAll("#namespaceList option").forEach(opt => {
10963    if (opt.value && opt.value !== "") {
10964        namespaces.add(opt.value); // ✓
10965    }
10966});
10967
10968// Build dropdown with ALL namespaces
10969let options = `<option value="">(default)</option>`;
10970
10971// Show current namespace as selected
10972if (namespace) {
10973    options += `<option value="${namespace}" selected>${namespace} (current)</option>`;
10974}
10975
10976// Show all other namespaces
10977for (const ns of nsArray) {
10978    if (ns !== namespace) {
10979        options += `<option value="${ns}">${ns}</option>`;
10980    }
10981}
10982```
10983
10984**Result**: All namespaces visible! ✓
10985
10986### How It Works Now
10987
10988**Before (Broken)**:
10989```
10990Edit recurring event in "work" namespace
10991
10992Dropdown shows:
10993☐ (default)
10994
10995That's it! Can't select anything! ✗
10996```
10997
10998**After (Fixed)**:
10999```
11000Edit recurring event in "work" namespace
11001
11002Dropdown shows:
11003☐ (default)
11004☑ work (current)  ← Selected!
11005☐ personal
11006☐ projects
11007☐ meetings
11008
11009All namespaces available! ✓
11010```
11011
11012### Key Improvements
11013
11014**1. Dual extraction methods**:
11015- Primary: Parse namespace explorer DOM
11016- Backup: Read from datalist
11017- Result: Always finds namespaces ✓
11018
11019**2. Current namespace included**:
11020```javascript
11021// OLD: Excluded current namespace
11022.filter(ns => ns !== namespace) ✗
11023
11024// NEW: Include and mark as selected
11025options += `<option value="${namespace}" selected>${namespace} (current)</option>` ✓
11026```
11027
11028**3. Better error handling**:
11029```javascript
11030if (nsSpan) {  // Check exists
11031    let nsText = nsSpan.textContent.replace("�� ", "").trim();
11032    if (nsText && nsText !== "(default)") {  // Validate
11033        namespaces.add(nsText);
11034    }
11035}
11036```
11037
11038**4. Console debugging**:
11039```javascript
11040console.log('Edit recurring - Current namespace:', namespace);
11041console.log('Available namespaces:', nsArray);
11042```
11043
11044Open browser console (F12) to see what namespaces are detected!
11045
11046### Example Usage
11047
11048**Scenario**: Edit recurring "Team Meeting" in "work" namespace
11049
11050**Steps**:
110511. Go to �� Recurring Events section
110522. Click "Edit" on "Team Meeting"
110533. See namespace dropdown:
11054   - ☐ (default)
11055   - ☑ work (current)
11056   - ☐ personal
11057   - ☐ projects
110584. Select "personal" to move event
110595. Click "Save Changes"
110606. Event moved to "personal" namespace ✓
11061
11062**Finally works as expected!** ��
11063
11064## Version 4.6.2 (2026-02-07) - FIX NAMESPACE PRESERVATION
11065
11066### �� Recurring Events Namespace Fix
11067- **Fixed:** Namespace now properly preserved when editing recurring events
11068- **Fixed:** Namespace selector now allows selecting any namespace (not just default)
11069- **Added:** Better logging for namespace preservation debugging
11070- **Added:** Console logging to track namespace values during edit
11071
11072### The Namespace Problem
11073
11074**Issue 1**: Can't select non-default namespace
11075```
11076When editing recurring event:
11077- Dropdown shows all namespaces ✓
11078- User selects "work"
11079- Form submits with "" (empty/default) ✗
11080```
11081
11082**Issue 2**: Namespace not preserved
11083```
11084Recurring event in "personal" namespace
11085Edit the title only
11086After save: namespace changed to "" (default) ✗
11087```
11088
11089### The Fixes
11090
11091**Fix 1**: Better namespace preservation logic
11092```php
11093// When editing recurring event:
11094$existingNamespace = $existingEventData['namespace'];
11095
11096// Preserve if user didn't explicitly change it:
11097if (empty($namespace) ||
11098    strpos($namespace, '*') !== false ||
11099    strpos($namespace, ';') !== false) {
11100    // User didn't select or selected wildcard
11101    $namespace = $existingNamespace; // Keep existing!
11102}
11103```
11104
11105**Fix 2**: Proper form population
11106```javascript
11107// When editing, set BOTH inputs:
11108namespaceHidden.value = event.namespace || '';  // Hidden (submitted)
11109namespaceSearch.value = event.namespace || '(default)';  // Visible
11110
11111// Plus logging:
11112console.log('Set namespace for editing:', event.namespace);
11113```
11114
11115**Fix 3**: Added detailed logging
11116```php
11117error_log("Preserving namespace '$namespace' (received='$receivedNamespace')");
11118error_log("Using new namespace '$namespace'");
11119error_log("No existing namespace to preserve");
11120```
11121
11122### How It Works Now
11123
11124**Scenario 1**: Edit without changing namespace
11125```
11126Event in "work" namespace
11127Edit title to "Updated Meeting"
11128Namespace field shows: "work"
11129Hidden input value: "work"
11130Result: Saved in "work" ✓
11131```
11132
11133**Scenario 2**: Change namespace during edit
11134```
11135Event in "personal" namespace
11136Edit and select "work" namespace
11137Hidden input value: "work"
11138Result: Saved in "work" ✓
11139```
11140
11141**Scenario 3**: Edit with empty/wildcard namespace
11142```
11143Event in "projects" namespace
11144Namespace field empty or shows "personal;work"
11145System preserves: "projects"
11146Result: Saved in "projects" ✓
11147```
11148
11149### Debugging
11150
11151Now with console logging, you can see:
11152```javascript
11153Set namespace for editing: work
11154Hidden value: work
11155```
11156
11157And in PHP logs:
11158```
11159Calendar saveEvent recurring: Loaded existing data - namespace='work'
11160Calendar saveEvent recurring: Preserving namespace 'work' (received='')
11161```
11162
11163**Namespace preservation now works correctly!** ��
11164
11165## Version 4.6.1 (2026-02-07) - PRESERVE RECURRING EVENT DATA
11166
11167### �� Recurring Events Edit Fix
11168- **Fixed:** Editing recurring events now preserves unchanged fields
11169- **Fixed:** Empty fields no longer erase existing data
11170- **Added:** Smart merge of existing event data with new changes
11171
11172### The Problem
11173
11174**Before**: Editing erased unchanged fields!
11175```
11176Original recurring event:
11177- Title: "Team Meeting"
11178- Time: "10:00 AM"
11179- Description: "Weekly standup with engineering team"
11180- Color: Red
11181
11182User edits ONLY the title to "Staff Meeting"
11183Form sends:
11184- Title: "Staff Meeting" ✓
11185- Time: "" ✗ (empty because user didn't change it)
11186- Description: "" ✗ (empty)
11187- Color: "#3498db" ✗ (default blue)
11188
11189Result after save:
11190- Title: "Staff Meeting" ✓
11191- Time: BLANK ✗
11192- Description: BLANK ✗
11193- Color: Blue ✗
11194```
11195
11196**All the other data was lost!** ✗
11197
11198### The Fix
11199
11200**After**: Preserves unchanged data!
11201```php
11202if ($eventId && $isRecurring) {
11203    // Load existing event data
11204    $existingEventData = getExistingEventData($eventId);
11205
11206    // Merge: use new value OR keep existing
11207    $title = $title ?: $existingEventData['title'];
11208    $time = $time ?: $existingEventData['time'];
11209    $description = $description ?: $existingEventData['description'];
11210    $color = ($color === '#3498db') ?
11211        $existingEventData['color'] : $color;
11212}
11213```
11214
11215**Now**:
11216```
11217User edits ONLY the title to "Staff Meeting"
11218
11219System:
112201. Loads existing event data
112212. Merges: new title + existing time/description/color
112223. Saves merged data
11223
11224Result:
11225- Title: "Staff Meeting" ✓ (changed)
11226- Time: "10:00 AM" ✓ (preserved!)
11227- Description: "Weekly standup..." ✓ (preserved!)
11228- Color: Red ✓ (preserved!)
11229```
11230
11231**Only changed fields are updated!** ✓
11232
11233### How It Works
11234
11235**Step 1**: Load existing data
11236```php
11237$existingEventData = $this->getExistingEventData(
11238    $eventId,
11239    $date,
11240    $namespace
11241);
11242```
11243
11244**Step 2**: Merge with new data
11245```php
11246// If new value is empty, use existing value
11247$title = $newTitle ?: $existingEventData['title'];
11248$time = $newTime ?: $existingEventData['time'];
11249$description = $newDesc ?: $existingEventData['description'];
11250
11251// Special handling for color (default is #3498db)
11252if ($newColor === '#3498db' && $existingEventData['color']) {
11253    $color = $existingEventData['color'];
11254}
11255```
11256
11257**Step 3**: Save merged data
11258```php
11259createRecurringEvents(..., $title, $time, $description, $color, ...);
11260```
11261
11262### Fields Preserved
11263
11264When editing recurring events, these fields are now preserved if not changed:
11265- ✅ Title (if left blank)
11266- ✅ Time (if not specified)
11267- ✅ End Time (if not specified)
11268- ✅ Description (if left empty)
11269- ✅ Color (if still default blue)
11270
11271**Edit only what you want to change - everything else stays!** ��
11272
11273## Version 4.6.0 (2026-02-07) - NAMESPACE RENAME & RECURRING FIX
11274
11275### ✨ New Feature: Rename Namespaces
11276- **Added:** ✏️ Rename button in Namespace Explorer
11277- **Added:** Rename all events in a namespace at once
11278- **Added:** Automatic cleanup of old directory structure
11279
11280### �� Critical Fix: Recurring Events Actually Edit Now!
11281- **Fixed:** Editing recurring events now deletes ALL instances
11282- **Fixed:** Previously only deleted one instance, left orphans
11283- **Fixed:** Recurring events properly regenerated on edit
11284
11285### Namespace Rename Feature
11286
11287**Before**: Could only delete namespaces, not rename
11288
11289**After**: Click ✏️ to rename!
11290
11291```
11292�� work (15 events)  [3] [✏️] [��️]
11293                          ↑ NEW!
11294```
11295
11296**How It Works**:
112971. Click ✏️ rename button
112982. Enter new namespace name
112993. All events moved to new namespace
113004. Event `namespace` field updated in JSON
113015. Old directory cleaned up
11302
11303**Example**:
11304```
11305Rename: "work" → "business"
11306
11307Before:
11308/data/meta/work/calendar/*.json
11309Events: {namespace: "work"}
11310
11311After:
11312/data/meta/business/calendar/*.json
11313Events: {namespace: "business"}
11314```
11315
11316**Implementation**:
11317```php
11318private function renameNamespace() {
11319    // 1. Validate new name
11320    // 2. Rename directory
11321    // 3. Update all event namespace fields in JSON
11322    // 4. Clean up old empty directories
11323}
11324```
11325
11326### Recurring Events Fix - The Problem
11327
11328**Before**: Editing didn't work!
11329```
11330Original recurring event generates:
11331- Event-0 (Mon, Feb 10)
11332- Event-1 (Mon, Feb 17)
11333- Event-2 (Mon, Feb 24)
11334
11335User edits Event-0, changes title to "Updated"
11336
11337What SHOULD happen:
11338- Delete Event-0, Event-1, Event-2
11339- Generate new instances with "Updated" title
11340
11341What ACTUALLY happened:
11342- Delete Event-0 only ✗
11343- Generate new instances
11344- Result: Event-1 and Event-2 still show old title! ✗
11345```
11346
11347**After**: Properly deletes ALL instances!
11348
11349**The Fix**:
11350```php
11351private function deleteEvent() {
11352    $event = getEvent($eventId);
11353
11354    // Check if recurring
11355    if ($event['recurring'] && $event['recurringId']) {
11356        // Delete ALL instances with same recurringId
11357        deleteAllRecurringInstances($recurringId);
11358    }
11359
11360    // Then normal delete for spanning events
11361}
11362
11363private function deleteAllRecurringInstances($recurringId) {
11364    // Scan ALL calendar JSON files
11365    foreach (glob('*.json') as $file) {
11366        // Filter out events with matching recurringId
11367        $events = array_filter($events, function($event) {
11368            return $event['recurringId'] !== $recurringId;
11369        });
11370    }
11371}
11372```
11373
11374**Result**:
11375- Edit "Weekly Team Meeting" → ALL instances updated ✓
11376- Delete recurring event → ALL instances deleted ✓
11377- No more orphaned events! ✓
11378
11379### Recurring Event Fields
11380
11381Every recurring event has:
11382```json
11383{
11384    "id": "abc123-0",
11385    "recurring": true,
11386    "recurringId": "abc123",  ← Links all instances
11387    ...
11388}
11389```
11390
11391When editing/deleting, we find ALL events with same `recurringId` and remove them!
11392
11393**Finally, recurring events work properly!** ��
11394
11395## Version 4.5.2 (2026-02-07) - FIX SORTING & PINK TOOLTIPS
11396
11397### �� Important Events Sorting - ACTUALLY FIXED!
11398- **Fixed:** Important Events now REALLY sorted by date first, then time
11399- **Fixed:** renderSidebarSection was re-sorting and breaking the order
11400- **Changed:** Important Events use date-first sorting, Today/Tomorrow use time-only
11401
11402### �� Pink Theme Tooltip Bling!
11403- **Added:** Pink gradient tooltips (hot pink → light pink)
11404- **Added:** Glowing pink border on tooltips
11405- **Added:** Sparkling heart (��) appears next to tooltip!
11406- **Added:** Heart has pink glow drop-shadow
11407
11408### The Sorting Bug - Root Cause
11409
11410**Problem**: Two sorts were happening!
11411
11412**Sort #1** (Line 2047): Before rendering
11413```php
11414usort($importantEvents, ...) // Sort by date ✓
11415```
11416
11417**Sort #2** (Line 2751): Inside renderSidebarSection
11418```php
11419usort($events, ...) // Sort by TIME ONLY ✗
11420// This was breaking the date order!
11421```
11422
11423**The Fix**: Different sorting for different sections
11424```php
11425if ($title === 'Important Events') {
11426    // Sort by DATE first, then time
11427    usort($events, function($a, $b) {
11428        if ($dateA !== $dateB) {
11429            return strcmp($dateA, $dateB); // DATE first!
11430        }
11431        // Same date - sort by time
11432        return timeCompare($a, $b);
11433    });
11434} else {
11435    // Today/Tomorrow - sort by TIME only (same date)
11436    usort($events, function($a, $b) {
11437        return timeCompare($a, $b);
11438    });
11439}
11440```
11441
11442**Result**: Important Events now CORRECTLY sorted!
11443```
11444✓ Sun, Feb 8 - 3:30 PM Super Bowl
11445✓ Tue, Feb 10 - 11:30 AM Doctor visit
11446✓ Sat, Feb 14 - Valentine's Day (all-day)
11447✓ Sat, Feb 14 - 8:00 PM Crab Shack
11448```
11449
11450### Pink Tooltip Magic! ��
11451
11452**Normal Tooltips**: Black background, plain
11453```css
11454background: rgba(0, 0, 0, 0.95);
11455color: #fff;
11456```
11457
11458**Pink Theme Tooltips**: FABULOUS!
11459```css
11460/* Pink gradient background */
11461background: linear-gradient(135deg, #ff1493 0%, #ff69b4 100%);
11462
11463/* Glowing pink border */
11464border: 2px solid #ff85c1;
11465
11466/* Double glow shadow */
11467box-shadow:
11468    0 0 15px rgba(255, 20, 147, 0.6),
11469    0 4px 12px rgba(0, 0, 0, 0.4);
11470
11471/* Bold text */
11472font-weight: 600;
11473```
11474
11475**Plus**: Sparkling heart next to tooltip!
11476```css
11477.sidebar-pink [data-tooltip]:after {
11478    content: '��';
11479    font-size: 12px;
11480    filter: drop-shadow(0 0 3px rgba(255, 20, 147, 0.8));
11481}
11482```
11483
11484**The Effect**:
11485```
11486Hover over ⚠ conflict warning:
11487┌────────────────────┐ ��
11488│ Conflicts with:    │ ← Pink gradient
11489│ • Event 1 (3PM)   │ ← Pink border
11490│ • Event 2 (4PM)   │ ← Pink glow
11491└────────────────────┘
11492```
11493
11494**Maximum glamour on tooltips too!** ✨
11495
11496## Version 4.5.1 (2026-02-07) - FIX IMPORTANT EVENTS SORTING
11497
11498### �� Important Events Order Fixed
11499- **Fixed:** Important Events now sorted by date (earliest first)
11500- **Fixed:** Events on same date sorted by time (chronological)
11501- **Fixed:** All-day events appear last within each date
11502
11503### Sorting Issue
11504
11505**Before**: Random order
11506```
11507Important Events:
11508�� Valentine's Day         (Sat, Feb 14)
1150911:30 AM Doctor visit      (Tue, Feb 10)  ← Feb 10 after Feb 14!
115103:30 PM Super Bowl         (Sun, Feb 8)   ← Feb 8 after Feb 14!
115118:00 PM Crab Shack         (Sat, Feb 14)
11512```
11513
11514**After**: Chronological order
11515```
11516Important Events:
115173:30 PM Super Bowl         (Sun, Feb 8)   ← Earliest!
1151811:30 AM Doctor visit      (Tue, Feb 10)
11519�� Valentine's Day         (Sat, Feb 14)  ← All-day event
115208:00 PM Crab Shack         (Sat, Feb 14)  ← Same day, sorted by time
11521```
11522
11523### Sorting Logic
11524
11525**Primary Sort**: By date
11526```php
11527strcmp($dateA, $dateB); // "2026-02-08" < "2026-02-14"
11528```
11529
11530**Secondary Sort**: By time (within same date)
11531```php
11532// All-day events (no time) go last
11533if (empty($timeA) && !empty($timeB)) return 1;
11534if (!empty($timeA) && empty($timeB)) return -1;
11535
11536// Both have times - sort chronologically
11537$aMinutes = timeToMinutes($timeA); // "11:30" = 690 minutes
11538$bMinutes = timeToMinutes($timeB); // "20:00" = 1200 minutes
11539return $aMinutes - $bMinutes;      // 690 < 1200
11540```
11541
11542**Result**:
115431. Sun, Feb 8 - 3:30 PM (earliest date & time)
115442. Tue, Feb 10 - 11:30 AM (next date)
115453. Sat, Feb 14 - Valentine's Day (all-day, so last on Feb 14)
115464. Sat, Feb 14 - 8:00 PM (timed event on Feb 14)
11547
11548**Perfect chronological order for next 2 weeks!** ✓
11549
11550## Version 4.5.0 (2026-02-07) - SPARKLE EDITION ✨��
11551
11552### �� EXTREME PINK BLING EFFECTS!
11553- **Added:** Click sparkles - 8 sparkles burst out on every click!
11554- **Added:** Auto-sparkles - random sparkles appear every 3 seconds
11555- **Added:** Hover mega-glow - sidebar glows BRIGHT on hover
11556- **Added:** Pulsing border glow - constantly breathing pink glow
11557- **Added:** Drop shadows on sparkles for extra depth
11558- **Added:** More sparkle emojis - hearts, diamonds, crowns, bows!
11559
11560### Sparkle Effects Breakdown
11561
11562**Click Sparkles** ��:
11563```javascript
11564// 8 sparkles burst out when you click anywhere!
11565for (let i = 0; i < 8; i++) {
11566    // Staggered appearance (40ms apart)
11567    createSparkle(x, y);
11568}
11569
11570// Sparkle emojis:
11571["✨", "��", "��", "⭐", "��", "��", "��", "��", "��", "��"]
11572```
11573
11574**Each sparkle**:
11575- Starts at click point
11576- Flies outward 30-60px in random direction
11577- Spins 360 degrees
11578- Fades in and out
11579- Has pink glow drop-shadow
11580- Disappears after 1 second
11581
11582**Auto Sparkles** ⏰:
11583```javascript
11584// Random sparkle every 3 seconds
11585setInterval(() => {
11586    const x = Math.random() * width;
11587    const y = Math.random() * height;
11588    createSparkle(x, y);
11589}, 3000);
11590```
11591
11592**Result**: Constant magical sparkles even without clicking! ✨
11593
11594**Hover Mega-Glow** ��:
11595```css
11596.sidebar-pink:hover {
11597    box-shadow:
11598        0 0 30px rgba(255, 20, 147, 0.9),
11599        0 0 50px rgba(255, 20, 147, 0.5) !important;
11600}
11601```
11602
11603**Result**: Sidebar EXPLODES with pink glow when you hover over it! ��
11604
11605**Pulsing Border Glow** ��:
11606```css
11607@keyframes pulse-glow {
11608    0%, 100% {
11609        box-shadow: 0 0 10px rgba(255, 20, 147, 0.4);
11610    }
11611    50% {
11612        box-shadow:
11613            0 0 25px rgba(255, 20, 147, 0.8),
11614            0 0 40px rgba(255, 20, 147, 0.4);
11615    }
11616}
11617
11618animation: pulse-glow 3s ease-in-out infinite;
11619```
11620
11621**Result**: Border continuously breathes with pink glow! ��
11622
11623**Sparkle Animation** ��:
11624```css
11625@keyframes sparkle {
11626    0% {
11627        opacity: 0;
11628        transform: translate(0, 0) scale(0) rotate(0deg);
11629    }
11630    50% {
11631        opacity: 1;
11632        transform: translate(halfway) scale(1) rotate(180deg);
11633    }
11634    100% {
11635        opacity: 0;
11636        transform: translate(far) scale(0) rotate(360deg);
11637    }
11638}
11639```
11640
11641**Result**: Sparkles spin, grow, shrink, and fly! ��
11642
11643### Complete Pink Bling Experience:
11644
11645**Always Active**:
11646- ✨ Pulsing pink border glow (3 second cycle)
11647- ✨ Auto-sparkles every 3 seconds
11648
11649**On Hover**:
11650- �� MEGA GLOW EFFECT (2x brightness!)
11651
11652**On Click**:
11653- �� 8 sparkles EXPLODE outward!
11654- �� Random emojis (hearts, stars, diamonds, crowns!)
11655- �� Each sparkle spins 360° while flying
11656- �� Pink glow drop-shadow on each sparkle
11657
11658**The Result**:
11659- Click anywhere = SPARKLE EXPLOSION! ��
11660- Hover anywhere = MEGA GLOW! ✨
11661- Always breathing and sparkling! ��
11662- Maximum glamour! ��
11663- Wife approval: 1000%! ��
11664
11665**THIS IS THE MOST FABULOUS CALENDAR EVER!** ��✨��
11666
11667## Version 4.4.2 (2026-02-07) - FINAL PINK POLISH
11668
11669### �� Pink Theme Final Touches
11670- **Fixed:** Add Event text now black (was bright pink, hard to read)
11671- **Fixed:** Clock border now COMPLETELY pink on all sides (no more green!)
11672- **Removed:** Text shadow on Add Event button (cleaner with black text)
11673
11674### Add Event Text - Black & Readable!
11675
11676**Before**: Bright pink text (#ff1493) on dark pink background
11677```php
11678$addBtnTextColor = $themeStyles['text_bright']; // #ff1493 - hard to read!
11679text-shadow: 0 0 3px #ff1493; // Glowy pink
11680```
11681
11682**After**: Black text, no shadow, perfect contrast!
11683```php
11684$addBtnTextColor = $theme === 'pink' ? '#000000' : ...;
11685$addBtnTextShadow = $theme === 'pink' ? 'none' : ...;
11686```
11687
11688**Result**:
11689- Black text pops against dark pink background ✓
11690- Easy to read ✓
11691- Professional look with bling ✓
11692
11693### Clock Border - All Pink!
11694
11695**The Problem**: Inline style only set `border-bottom`, CSS set other sides to green
11696
11697**Before**:
11698```php
11699// Inline style (only bottom):
11700style="border-bottom:2px solid #ff1493;"
11701
11702// CSS (all sides):
11703.eventlist-today-header {
11704    border: 2px solid #00cc07; // Green on top/sides!
11705}
11706```
11707
11708**After**: Inline style overrides ALL sides
11709```php
11710style="border:2px solid #ff1493;" // All 4 sides pink!
11711```
11712
11713**Result**: Clock box now 100% pink border on all four sides! ✓
11714
11715### What Changed:
11716
11717**Add Event Button**:
11718- Background: #b8156f (dark pink) ✓
11719- Text: **#000000 (black)** ← NEW!
11720- Text shadow: **none** ← NEW!
11721- Glow: 0 0 10px pink ✓
11722
11723**Clock Border**:
11724- Top: **#ff1493 (pink)** ← FIXED!
11725- Right: **#ff1493 (pink)** ← FIXED!
11726- Bottom: #ff1493 (pink) ✓
11727- Left: **#ff1493 (pink)** ← FIXED!
11728
11729**Perfect pink theme - wife approved!** ��✨
11730
11731## Version 4.4.1 (2026-02-07) - PINK THEME PERFECTION
11732
11733### �� Pink Theme Complete Makeover
11734- **Fixed:** Clock border now completely pink (was green on sides/top)
11735- **Changed:** Today/Tomorrow/Important sections now different shades of pink
11736- **Changed:** Add Event button now dark pink (was clashing blue)
11737- **Changed:** System status bars now pink gradient (3 shades!)
11738
11739### All-Pink Everything! ��
11740
11741**Clock Border**:
11742```css
11743/* Before: Green border */
11744border: 2px solid #00cc07;
11745
11746/* After: Hot pink border */
11747.sidebar-pink .eventlist-today-header {
11748    border-color: #ff1493;
11749    box-shadow: 0 0 10px rgba(255, 20, 147, 0.4);
11750}
11751```
11752
11753**Section Colors** (Different Pink Shades):
11754```php
11755// Before: Orange, green, purple
11756'Today' => '#ff9800',
11757'Tomorrow' => '#4caf50',
11758'Important' => '#9b59b6'
11759
11760// After: Hot pink, pink, light pink
11761'Today' => '#ff1493',      // Hot pink (DeepPink)
11762'Tomorrow' => '#ff69b4',   // Pink (HotPink)
11763'Important' => '#ff85c1'   // Light pink
11764```
11765
11766**Add Event Button**:
11767```php
11768// Before: Clashing blue
11769background: #3498db;
11770
11771// After: Dark pink with glow
11772background: #b8156f;       // Dark pink
11773hover: #8b0f54;            // Darker pink
11774shadow: 0 0 10px rgba(255, 20, 147, 0.5);
11775```
11776
11777**System Status Bars** (Pink Gradient):
11778```css
11779/* 5-min load average */
11780.sidebar-pink .eventlist-cpu-fill {
11781    background: #ff1493;   /* Hot pink */
11782    box-shadow: 0 0 5px rgba(255, 20, 147, 0.7);
11783}
11784
11785/* Realtime CPU */
11786.sidebar-pink .eventlist-cpu-fill-purple {
11787    background: #ff69b4;   /* Pink */
11788    box-shadow: 0 0 5px rgba(255, 105, 180, 0.7);
11789}
11790
11791/* Memory */
11792.sidebar-pink .eventlist-cpu-fill-orange {
11793    background: #ff85c1;   /* Light pink */
11794    box-shadow: 0 0 5px rgba(255, 133, 193, 0.7);
11795}
11796```
11797
11798### Pink Theme Visual Hierarchy:
11799
11800**Darkest → Lightest Pink Shades**:
118011. Add Event button: #b8156f (dark pink)
118022. Today section: #ff1493 (hot pink / deep pink)
118033. System bar 1: #ff1493 (hot pink)
118044. Tomorrow section: #ff69b4 (pink)
118055. System bar 2: #ff69b4 (pink)
118066. Important section: #ff85c1 (light pink)
118077. System bar 3: #ff85c1 (light pink)
11808
11809**Result**: Beautiful pink gradient throughout entire sidebar! ��✨
11810
11811### What's Pink Now:
11812
11813✅ Sidebar background & border
11814✅ **Clock border** ← FIXED!
11815✅ Header gradient
11816✅ Week grid
11817✅ **Add Event button** ← FIXED!
11818✅ **Today section** ← Different shade!
11819✅ **Tomorrow section** ← Different shade!
11820✅ **Important section** ← Different shade!
11821✅ Event text & bars
11822✅ **System status bars** ← All 3 different pink shades!
11823✅ All shadows & glows
11824
11825**EVERYTHING is pink and fabulous!** ��✨
11826
11827## Version 4.4.0 (2026-02-07) - PINK BLING THEME & PROFESSIONAL SHADOWS
11828
11829### ✨ New Theme: Pink Bling! ��
11830- **Added:** Glamorous hot pink theme with maximum sparkle
11831- **Features:** Deep pink (#ff1493), extra glow, hearts and diamonds aesthetic
11832- **Perfect for:** Fabulous calendars that demand attention ✨
11833
11834### �� Professional Theme Shadow Fix
11835- **Fixed:** Section headers now have subtle shadow (not glow)
11836- **Fixed:** Clicked day panel header has proper shadow
11837
11838### Pink Bling Theme Colors
11839
11840**Background & Borders**:
11841```php
11842'bg' => '#1a0d14',           // Dark rich pink-black
11843'border' => '#ff1493',        // Hot pink (DeepPink)
11844'shadow' => 'rgba(255, 20, 147, 0.4)', // Strong pink glow
11845```
11846
11847**Text Colors**:
11848```php
11849'text_primary' => '#ff69b4',  // Hot pink
11850'text_bright' => '#ff1493',   // Deep pink
11851'text_dim' => '#ff85c1',      // Light pink
11852```
11853
11854**Week Grid**:
11855```php
11856'grid_bg' => '#2d1a24',       // Dark purple-pink
11857'cell_bg' => '#1a0d14',       // Dark
11858'cell_today_bg' => '#3d2030', // Highlighted purple-pink
11859```
11860
11861**Special Effects**:
11862```php
11863'bar_glow' => '0 0 5px',      // Extra sparkly glow!
11864'header_shadow' => '0 0 12px rgba(255, 20, 147, 0.6)' // Maximum bling!
11865```
11866
11867### Professional Theme Shadow Fix
11868
11869**Before**: Section headers had colored glow
11870```php
11871box-shadow: 0 0 8px #3498db; // Blue glow - wrong!
11872```
11873
11874**After**: Section headers have subtle shadow
11875```php
11876$headerShadow = ($theme === 'professional') ?
11877    '0 2px 4px rgba(0, 0, 0, 0.15)' :  // Shadow for professional
11878    '0 0 8px ' . $accentColor;          // Glow for others
11879```
11880
11881**Result**:
11882- **Matrix/Purple/Pink**: Colored glow on headers ✓
11883- **Professional**: Clean grey shadow (no glow) ✓
11884
11885### All Four Themes:
11886
11887**�� Matrix Edition**:
11888- Dark green (#00cc07)
11889- Neon glow effects
11890- Hacker aesthetic
11891
11892**�� Purple Dream**:
11893- Elegant purple (#9b59b6)
11894- Violet glow effects
11895- Royal aesthetic
11896
11897**�� Professional Blue**:
11898- Clean grey/blue (#4a90e2)
11899- Subtle shadows (NO glow)
11900- Corporate aesthetic
11901
11902**�� Pink Bling** (NEW!):
11903- Hot pink (#ff1493)
11904- MAXIMUM sparkle & glow
11905- Glamorous aesthetic ✨��
11906
11907### Technical Implementation
11908
11909**Theme Added To**:
11910- `getSidebarThemeStyles()` - color definitions
11911- `getSidebarTheme()` - validation
11912- `saveSidebarTheme()` - admin save
11913- Admin panel - UI with preview
11914- All shadow/glow calculations
11915- JavaScript theme colors
11916- Clicked day panel colors
11917
11918**Perfect for users who want FABULOUS pink calendars!** ��✨
11919
11920## Version 4.3.1 (2026-02-07) - REDUCE TEXT GLOW & CONSISTENCY
11921
11922### �� Text Glow Refinement
11923- **Changed:** Reduced text glow from 3px to 2px (less intense)
11924- **Fixed:** Clicked day panel now has same text glow as sections
11925
11926### Text Glow Reduction
11927
11928**Before**: Text glow was too strong (3px)
11929```php
11930// Sections:
11931text-shadow: 0 0 3px #00cc07; // Too bright!
11932
11933// Clicked day panel:
11934text-shadow: 0 0 3px #00cc07; // Too bright!
11935```
11936
11937**After**: Subtler text glow (2px)
11938```php
11939// Sections:
11940text-shadow: 0 0 2px #00cc07; // Just right ✓
11941
11942// Clicked day panel:
11943text-shadow: 0 0 2px #00cc07; // Just right ✓
11944```
11945
11946**Visual Impact**:
11947- **Matrix**: Softer green glow, easier to read
11948- **Purple**: Softer purple glow, more elegant
11949- **Professional**: Still no glow (clean)
11950
11951### Consistency Fix
11952
11953**Before**: Sections had glow, clicked day panel had NO glow
11954
11955**After**: Both sections AND clicked day panel have matching subtle glow
11956
11957**Where Glow Appears**:
11958- ✅ Today section event text
11959- ✅ Tomorrow section event text
11960- ✅ Important section event text
11961- ✅ **Clicked day panel event text** ← NOW CONSISTENT!
11962
11963**Result**:
11964- Glow is less intense and easier on eyes ✓
11965- All event text has consistent styling ✓
11966- Matrix/Purple themes more refined ✓
11967
11968### Technical Details
11969
11970**PHP (Sections)**:
11971```php
11972$textShadow = ($theme === 'professional') ? '' : 'text-shadow:0 0 2px ' . $titleColor . ';';
11973```
11974
11975**JavaScript (Clicked Day Panel)**:
11976```javascript
11977themeColors.text_shadow = 'text-shadow:0 0 2px #00cc07'; // Or purple
11978eventHTML += "style='...color:" + color + "; " + themeColors.text_shadow + ";'";
11979```
11980
11981**Perfect consistency and subtle elegance!** ✨
11982
11983## Version 4.3.0 (2026-02-07) - IMPORTANT EVENTS FUTURE + REMOVE GREY
11984
11985### ✨ Important Events Enhancement
11986- **Changed:** Important events now show from next 2 weeks (not just current week)
11987- **Fixed:** Important events on Sunday after current week now visible
11988- **Changed:** Events loaded 2 weeks into future for Important section
11989
11990### �� Background Cleanup
11991- **Removed:** Grey/white backgrounds from Today/Tomorrow/Important sections
11992- **Removed:** Grey backgrounds from individual events
11993- **Result:** Clean transparent backgrounds, original dark Matrix look restored
11994
11995### Important Events - Future Coverage
11996
11997**Before**: Only showed Important events from current week
11998```php
11999if ($isImportant && $dateKey >= $weekStart && $dateKey <= $weekEnd) {
12000    $importantEvents[] = $event;
12001}
12002```
12003
12004**After**: Shows Important events from today through next 2 weeks
12005```php
12006// Load events 2 weeks out
12007$twoWeeksOut = date('Y-m-d', strtotime($weekEnd . ' +14 days'));
12008
12009// Show all important events from today forward
12010if ($isImportant && $dateKey >= $todayStr) {
12011    $importantEvents[] = $event;
12012}
12013```
12014
12015**Example**:
12016- Today: Saturday Feb 7
12017- Current week: Sun Feb 1 → Sat Feb 7
12018- Important events shown: Feb 7 → Feb 21 (today + 14 days)
12019
12020**Result**: Important events on Sunday Feb 8 (next week) now visible! ✓
12021
12022### Background Removal
12023
12024**Before**: Light grey/white backgrounds added
12025```php
12026// Section background:
12027$sectionBg = 'rgba(255, 255, 255, 0.05)'; // Grey overlay
12028
12029// Event background:
12030$eventBg = 'rgba(255, 255, 255, 0.03)'; // Grey overlay
12031```
12032
12033**After**: No backgrounds (transparent)
12034```php
12035// Section: No background property
12036<div style="padding:4px 0;">
12037
12038// Event: No background property
12039<div style="padding:4px 6px; ...">
12040```
12041
12042**Result**:
12043- Clean, dark Matrix aesthetic restored ✓
12044- Purple theme darker and more elegant ✓
12045- Professional theme still has its light grey sidebar bg ✓
12046- Events stand out with just color bars and borders ✓
12047
12048### What Changed:
12049
12050**Sections (Today/Tomorrow/Important)**:
12051- ❌ No more grey overlay
12052- ✓ Transparent background
12053- ✓ Colored borders & glows remain
12054
12055**Individual Events**:
12056- ❌ No more grey overlay
12057- ✓ Transparent background
12058- ✓ Colored bars & borders remain
12059
12060**Perfect! Back to the original clean dark look with future Important events!** ��
12061
12062## Version 4.2.6 (2026-02-07) - FIX SECTION SHADOWS & DESCRIPTION COLOR
12063
12064### �� Final Theme Polish
12065- **Fixed:** Today/Tomorrow/Important section shadows now match theme
12066- **Fixed:** Event description text color now uses theme dim color
12067
12068### Section Shadow Fix
12069
12070**Problem**: Sections always had green glow regardless of theme
12071
12072**Before**:
12073```php
12074// Hardcoded green:
12075box-shadow: 0 0 5px rgba(0, 204, 7, 0.2);
12076```
12077
12078**After**:
12079```php
12080// Theme-aware:
12081$sectionShadow = $theme === 'matrix' ? '0 0 5px rgba(0, 204, 7, 0.2)' :
12082                ($theme === 'purple' ? '0 0 5px rgba(155, 89, 182, 0.2)' :
12083                '0 2px 4px rgba(0, 0, 0, 0.1)');
12084```
12085
12086**Result**:
12087- **Matrix**: Green glow around sections ✓
12088- **Purple**: Purple glow around sections ✓
12089- **Professional**: Subtle grey shadow (no glow) ✓
12090
12091### Description Color Fix
12092
12093**Problem**: Description text always green in clicked day panel
12094
12095**Before**:
12096```javascript
12097color: #00aa00; // Always green
12098```
12099
12100**After**:
12101```javascript
12102color: themeColors.text_dim; // Theme dim color
12103```
12104
12105**Result**:
12106- **Matrix**: Dim green (#00aa00) ✓
12107- **Purple**: Dim purple (#8e7ab8) ✓
12108- **Professional**: Grey (#7f8c8d) ✓
12109
12110### Now 100% Theme Consistent
12111
12112Every single visual element respects theme:
12113- ✅ Sidebar background & border
12114- ✅ Header colors & shadows
12115- ✅ Week grid & cells
12116- ✅ Add Event button
12117- ✅ Section borders & **shadows** ← Fixed!
12118- ✅ Event titles & times
12119- ✅ Event **descriptions** ← Fixed!
12120- ✅ Clicked day panel
12121- ✅ Event bars & glows
12122
12123**Absolute perfection across all three themes!** ��✨
12124
12125## Version 4.2.5 (2026-02-07) - CLICKED DAY PANEL THEMES & GREY BACKGROUND
12126
12127### �� Theme Improvements
12128- **Fixed:** Clicked day panel now uses correct theme colors
12129- **Changed:** Professional Blue background now light grey (not white)
12130- **Added:** Theme colors passed to JavaScript for dynamic rendering
12131
12132### Clicked Day Panel Theming
12133
12134**Before**: Always blue regardless of theme
12135```javascript
12136// Hardcoded blue:
12137color:#00cc07;  // Always green
12138background:#3498db;  // Always blue
12139```
12140
12141**After**: Theme-aware colors
12142```php
12143// PHP passes theme to JavaScript:
12144window.themeColors_XXX = {
12145    text_primary: '#00cc07' or '#b19cd9' or '#2c3e50',
12146    text_bright: '#00dd00' or '#d4a5ff' or '#4a90e2',
12147    text_shadow: '0 0 3px ...' or '',
12148    event_bg: 'rgba(...)',
12149    border_color: 'rgba(...)',
12150    bar_shadow: '0 0 3px' or '0 1px 2px rgba(...)'
12151};
12152
12153// JavaScript uses theme colors:
12154color: themeColors.text_primary;
12155background: themeColors.event_bg;
12156```
12157
12158**Result**:
12159- Matrix: Green panel with green glow ✓
12160- Purple: Purple panel with purple glow ✓
12161- Professional: Blue panel, no glow, clean ✓
12162
12163### Professional Theme Background Change
12164
12165**Before**: Almost white (#f5f7fa, #ffffff)
12166```php
12167'bg' => '#f5f7fa',           // Very light
12168'cell_bg' => '#ffffff',      // Pure white
12169```
12170
12171**After**: Light grey tones
12172```php
12173'bg' => '#e8ecf1',           // Soft grey-blue
12174'cell_bg' => '#f5f7fa',      // Light grey
12175'grid_bg' => '#d5dbe3',      // Medium grey
12176'cell_today_bg' => '#dce8f7' // Highlighted grey-blue
12177```
12178
12179**Visual Impact**:
12180- Sidebar: Light grey-blue background (#e8ecf1)
12181- Week cells: Lighter grey (#f5f7fa)
12182- Today cell: Highlighted blue-grey (#dce8f7)
12183- More depth and contrast ✓
12184- Professional appearance ✓
12185
12186### All Theme Elements Now Consistent
12187
12188**Matrix (Green)**:
12189- Sidebar: Dark (#242424)
12190- Clicked panel: Dark with green
12191- Text: Green with glow
12192
12193**Purple Dream**:
12194- Sidebar: Dark purple (#2a2030)
12195- Clicked panel: Dark with purple
12196- Text: Purple with glow
12197
12198**Professional Blue**:
12199- Sidebar: Light grey (#e8ecf1)
12200- Clicked panel: Light with blue
12201- Text: Dark grey, no glow
12202
12203**Perfect theme consistency everywhere!** ��
12204
12205## Version 4.2.4 (2026-02-07) - FIX TOMORROW LOADING & DOUBLE ENCODING
12206
12207### �� Critical Fixes
12208- **Fixed:** Tomorrow events not loaded when outside current week
12209- **Fixed:** `&amp;` showing instead of `&` (double HTML encoding)
12210
12211### Issue 1: Tomorrow Not Loading
12212
12213**Problem**: Sidebar only loaded events for current week
12214- Today (Saturday): Week ends today
12215- Tomorrow (Sunday): Start of NEXT week
12216- Tomorrow events never loaded from data files!
12217
12218**Before**:
12219```php
12220// Only load current week
12221$end = new DateTime($weekEnd);
12222$end->modify('+1 day');
12223$period = new DatePeriod($start, $interval, $end);
12224// If tomorrow > weekEnd, it's not in period!
12225```
12226
12227**After**:
12228```php
12229// Check if tomorrow is outside week
12230$tomorrowDate = date('Y-m-d', strtotime('+1 day'));
12231if ($tomorrowDate > $weekEnd) {
12232    // Extend to include tomorrow
12233    $end = new DateTime($tomorrowDate);
12234}
12235$end->modify('+1 day');
12236$period = new DatePeriod($start, $interval, $end);
12237```
12238
12239**Result**: Tomorrow events now loaded even at week boundary! ✓
12240
12241### Issue 2: Double HTML Encoding
12242
12243**Problem**: `&` characters showing as `&amp;`
12244
12245**Cause**: Double encoding on line 2625 and 2681
12246```php
12247// Line 2625:
12248$title = htmlspecialchars($event['title']); // "Coffee & Tea" → "Coffee &amp; Tea"
12249
12250// Line 2681:
12251$html .= htmlspecialchars($title); // "Coffee &amp; Tea" → "Coffee &amp;amp; Tea" ❌
12252```
12253
12254**Fixed**:
12255```php
12256// Line 2625:
12257$title = htmlspecialchars($event['title']); // Encode once
12258
12259// Line 2681:
12260$html .= $title; // Use already-encoded value ✓
12261```
12262
12263**Result**: `&` displays correctly! ✓
12264
12265### Both Fixes Critical
12266
12267These were **two separate bugs**:
122681. **Loading bug**: Tomorrow events not read from files
122692. **Display bug**: Double-encoding text
12270
12271Both needed fixing for Tomorrow section to work properly!
12272
12273## Version 4.2.3 (2026-02-07) - FIX TOMORROW SECTION AT WEEK BOUNDARY
12274
12275### �� Critical Fix
12276- **Fixed:** Tomorrow section missing when tomorrow is outside current week
12277- **Fixed:** Today section now always shows regardless of week boundaries
12278- **Changed:** Today/Tomorrow processed BEFORE week boundary checks
12279
12280### The Problem
12281
12282**Scenario**: Today is Saturday (last day of week)
12283- Week: Feb 1 (Sun) → Feb 7 (Sat) ← Today
12284- Tomorrow: Feb 8 (Sun) ← **Start of NEXT week**
12285
12286**BROKEN Logic** (v4.2.2):
12287```php
12288foreach ($events as $dateKey => $dayEvents) {
12289    if ($dateKey < $weekStart) continue; // Skip old events
12290
12291    // ...week processing...
12292
12293    if ($dateKey === $tomorrowStr) {  // ← Never reached!
12294        $tomorrowEvents[] = $event;   //   Tomorrow > weekEnd
12295    }
12296}
12297```
12298
12299**Result**: Tomorrow events never added because loop skipped them! ❌
12300
12301### The Fix
12302
12303**Process Today/Tomorrow FIRST**:
12304```php
12305foreach ($events as $dateKey => $dayEvents) {
12306    $eventsWithConflicts = $this->detectTimeConflicts($dayEvents);
12307
12308    foreach ($eventsWithConflicts as $event) {
12309        // ALWAYS process Today and Tomorrow first!
12310        if ($dateKey === $todayStr) {
12311            $todayEvents[] = $event; // ✓ Always shows
12312        }
12313        if ($dateKey === $tomorrowStr) {
12314            $tomorrowEvents[] = $event; // ✓ Always shows
12315        }
12316
12317        // THEN check week boundaries for grid
12318        if ($dateKey >= $weekStart && $dateKey <= $weekEnd) {
12319            $weekEvents[$dateKey][] = $event;
12320        }
12321
12322        // Important events still week-only
12323        if ($isImportant && $dateKey >= $weekStart && $dateKey <= $weekEnd) {
12324            $importantEvents[] = $event;
12325        }
12326    }
12327}
12328```
12329
12330### What Changed
12331
12332**Before**:
123331. Skip events < weekStart ❌
123342. Process week grid
123353. Try to add Today/Tomorrow ← **Failed if outside week**
123364. Add Important events
12337
12338**After**:
123391. **Always add Today events** ✓
123402. **Always add Tomorrow events** ✓
123413. Add to week grid if in range
123424. Add Important events if in range
12343
12344**Result**:
12345- Today section: ✓ Always shows
12346- Tomorrow section: ✓ Always shows (even at week boundary!)
12347- Week grid: ✓ Only current week
12348- Important: ✓ Only current week
12349
12350### Edge Cases Fixed
12351
12352**Saturday → Sunday transition**:
12353- Today (Sat): Shows in Today section ✓
12354- Tomorrow (Sun): Shows in Tomorrow section ✓
12355- Week grid: Only shows Sat (today) ✓
12356
12357**Sunday → Monday transition**:
12358- Today (Sun): Shows in Today section ✓
12359- Tomorrow (Mon): Shows in Tomorrow section ✓
12360- Week grid: Shows both Sun and Mon ✓
12361
12362**Perfect! Tomorrow section now always works!** ��
12363
12364## Version 4.2.2 (2026-02-07) - SUNDAY NOT SATURDAY!
12365
12366### �� Corrected Week Options
12367- **Changed:** Week start options are now Monday vs **Sunday** (not Saturday!)
12368- **Changed:** Default is **Sunday** (US/Canada standard)
12369- **Fixed:** Day names array for Sunday start: S M T W T F S
12370
12371### �� Correct Week Start Options
12372
12373**Sunday Start** (Default):
12374- Grid shows: **S M T W T F S**
12375- Week: Sunday → Saturday
12376- US/Canada standard
12377- Most common worldwide
12378
12379**Monday Start**:
12380- Grid shows: **M T W T F S S**
12381- Week: Monday → Sunday
12382- ISO 8601 standard
12383- Common in Europe
12384
12385### Technical Changes
12386
12387**All References Updated**:
12388```php
12389// Changed from 'saturday' to 'sunday' in:
12390- Admin validation
12391- Week calculation logic
12392- Day names array
12393- Default value
12394- Comments
12395```
12396
12397**Sunday Calculation** (when today is Saturday):
12398```php
12399$today = date('w'); // 0=Sun, 6=Sat
12400if ($today == 0) {
12401    $weekStart = date('Y-m-d'); // Today!
12402} else {
12403    // Go back $today days to last Sunday
12404    $weekStart = date('Y-m-d', strtotime('-' . $today . ' days'));
12405}
12406```
12407
12408**Examples**:
12409- Today (Saturday): Week = Sun Feb 1 → Sat Feb 7
12410- Tomorrow (Sunday): Week = Sun Feb 8 → Sat Feb 14
12411
12412**Sorry for the confusion - it's Sunday not Saturday!** ��
12413
12414## Version 4.2.1 (2026-02-07) - FIX WEEK CALCULATION ON SATURDAY
12415
12416### �� Critical Fix
12417- **Fixed:** Week calculation broken when today is Saturday
12418- **Fixed:** Events not showing in Today/Important sections
12419- **Fixed:** Week grid event bars missing
12420- **Changed:** Default week start is Saturday (matches main calendar)
12421
12422### Technical Details
12423
12424**The Bug**:
12425```php
12426// BROKEN (v4.2.0):
12427$weekStart = date('Y-m-d', strtotime('saturday this week'));
12428// When TODAY is Saturday, this is ambiguous and fails!
12429
12430// FIXED (v4.2.1):
12431$today = date('w'); // 0 (Sun) to 6 (Sat)
12432if ($today == 6) {
12433    $weekStart = date('Y-m-d'); // Today!
12434} else {
12435    $daysBack = ($today == 0) ? 1 : ($today + 1);
12436    $weekStart = date('Y-m-d', strtotime('-' . $daysBack . ' days'));
12437}
12438$weekEnd = date('Y-m-d', strtotime($weekStart . ' +6 days'));
12439```
12440
12441**Why It Failed**:
12442- `strtotime('saturday this week')` is ambiguous when run ON a Saturday
12443- PHP may interpret it as "next Saturday" or fail
12444- Result: Week range was wrong, events filtered out
12445
12446**The Fix**:
12447- Explicit calculation using day-of-week math
12448- Saturday (day 6): weekStart = today
12449- Sunday (day 0): weekStart = yesterday
12450- Monday-Friday: calculate days back to last Saturday
12451
12452**Result**: Works reliably every day of the week!
12453
12454**Default Changed**: Saturday start (was Monday in 4.2.0)
12455- Matches main calendar behavior
12456- Users can still switch to Monday in settings
12457
12458## Version 4.2.0 (2026-02-07) - WEEK START DAY SELECTOR
12459
12460### ✨ New Feature
12461- **Added:** Week start day selector in Themes tab
12462- **Added:** Choose between Monday (ISO standard) or Saturday week start
12463- **Added:** Week grid and all events now respect the selected start day
12464- **Changed:** Themes tab renamed to "Sidebar Widget Settings"
12465
12466### �� Week Start Options
12467
12468**Monday Start** (Default):
12469- Grid shows: M T W T F S S
12470- Week runs: Monday → Sunday
12471- ISO 8601 standard
12472- Common in Europe, most of world
12473
12474**Saturday Start**:
12475- Grid shows: S S M T W T F
12476- Week runs: Saturday → Friday
12477- Common in Middle East
12478- Sabbath-observant communities
12479
12480### Technical Details
12481
12482**Configuration**:
12483```php
12484// Saved in: data/meta/calendar_week_start.txt
12485// Values: 'monday' or 'saturday'
12486
12487// Week calculation:
12488if ($weekStartDay === 'saturday') {
12489    $weekStart = date('Y-m-d', strtotime('saturday this week'));
12490    $weekEnd = date('Y-m-d', strtotime('friday next week'));
12491} else {
12492    $weekStart = date('Y-m-d', strtotime('monday this week'));
12493    $weekEnd = date('Y-m-d', strtotime('sunday this week'));
12494}
12495```
12496
12497**Day Names Array**:
12498```php
12499// Monday start: ['M', 'T', 'W', 'T', 'F', 'S', 'S']
12500// Saturday start: ['S', 'S', 'M', 'T', 'W', 'T', 'F']
12501```
12502
12503**What Changes**:
12504- Week grid day letters
12505- Week grid date sequence
12506- Today/Tomorrow/Important event date ranges
12507- Week event grouping
12508
12509**What Stays Same**:
12510- All themes still work
12511- Event data unchanged
12512- Main calendar unaffected
12513
12514### How to Change:
12515
125161. Admin → Calendar → �� Themes tab
125172. Under "Week Start Day" section
125183. Select Monday or Saturday
125194. Click "Save Settings"
125205. Refresh sidebar to see changes
12521
12522**Perfect for international users or religious observances!** ��
12523
12524## Version 4.1.4 (2026-02-07) - WEEK STARTS SUNDAY & LIGHTER BACKGROUNDS
12525
12526### ��️ Calendar Improvements
12527- **Changed:** Week grid now starts on Sunday and ends on Saturday (matches main calendar)
12528- **Changed:** Event section backgrounds much lighter (almost white)
12529- **Changed:** Individual event backgrounds lighter and more readable
12530- **Changed:** Event borders now theme-colored
12531
12532### Technical Details
12533
12534**Week Start Change**:
12535```php
12536// Before:
12537$weekStart = date('Y-m-d', strtotime('monday this week'));
12538$weekEnd = date('Y-m-d', strtotime('sunday this week'));
12539$dayNames = ['M', 'T', 'W', 'T', 'F', 'S', 'S'];
12540
12541// After:
12542$weekStart = date('Y-m-d', strtotime('sunday this week'));
12543$weekEnd = date('Y-m-d', strtotime('saturday this week'));
12544$dayNames = ['S', 'M', 'T', 'W', 'T', 'F', 'S'];
12545```
12546
12547**Background Colors**:
12548```php
12549// Section backgrounds (Today, Tomorrow, Important):
12550Matrix: rgba(255, 255, 255, 0.05)    // Very light overlay
12551Purple: rgba(255, 255, 255, 0.08)    // Slightly lighter
12552Professional: rgba(255, 255, 255, 0.95)  // Almost white!
12553
12554// Individual event backgrounds:
12555Matrix: rgba(255, 255, 255, 0.03)    // Subtle
12556Purple: rgba(255, 255, 255, 0.05)    // Light
12557Professional: rgba(255, 255, 255, 0.5)   // Semi-transparent white
12558```
12559
12560**Event Borders**:
12561```php
12562Matrix: rgba(0, 204, 7, 0.2)         // Green
12563Purple: rgba(155, 89, 182, 0.2)      // Purple
12564Professional: rgba(74, 144, 226, 0.2) // Blue
12565```
12566
12567### Visual Result:
12568
12569**Before**: Dark backgrounds made text hard to read
12570**After**: Light backgrounds make events pop and text very readable
12571
12572**Week Grid**:
12573```
12574Before: [M][T][W][T][F][S][S]
12575After:  [S][M][T][W][T][F][S]  ← Now matches main calendar!
12576```
12577
12578## Version 4.1.3 (2026-02-07) - EVENT TEXT THEME COLORS
12579
12580### �� Final Theme Polish
12581- **Fixed:** Event titles in Today/Tomorrow/Important sections now use theme colors
12582- **Fixed:** Event times now use theme bright color
12583- **Fixed:** Event dates use theme dim color
12584- **Fixed:** Task checkboxes use theme bright color
12585- **Fixed:** Event color bars use theme-appropriate shadows
12586- **Fixed:** No text shadows on Professional theme
12587
12588### Technical Details
12589
12590**Event Text Colors**:
12591```php
12592// Matrix:
12593- Title: #00cc07 (green)
12594- Time: #00dd00 (bright green)
12595- Date: #00aa00 (dim green)
12596- Text shadow: 0 0 3px (glow)
12597
12598// Purple:
12599- Title: #b19cd9 (lavender)
12600- Time: #d4a5ff (bright purple)
12601- Date: #8e7ab8 (dim purple)
12602- Text shadow: 0 0 3px (glow)
12603
12604// Professional:
12605- Title: #2c3e50 (dark grey)
12606- Time: #4a90e2 (blue)
12607- Date: #7f8c8d (grey)
12608- Text shadow: none (clean)
12609```
12610
12611**Color Bar Shadows**:
12612```php
12613// Matrix & Purple: Glow effect
12614box-shadow: 0 0 3px [event-color];
12615
12616// Professional: Subtle shadow
12617box-shadow: 0 1px 2px rgba(0,0,0,0.2);
12618```
12619
12620### What's Now Fully Themed:
12621
12622✅ Sidebar background & border
12623✅ Header (clock box) background, border, text
12624✅ Week grid background, borders, cells
12625✅ Week grid day letters & numbers
12626✅ Week grid event bars & "+N more" text
12627✅ Add Event button background & text
12628Today/Tomorrow/Important event titles
12629✅ Event times
12630✅ Event dates (Important section)
12631✅ Task checkboxes
12632✅ Event color bars
12633✅ All text shadows (glow vs none)
12634
12635**Every single element now respects the theme!** ��
12636
12637## Version 4.1.2 (2026-02-07) - COMPLETE THEME INTEGRATION
12638
12639### �� Theme Improvements
12640- **Fixed:** Week calendar grid now uses theme colors (purple/blue)
12641- **Fixed:** Add Event button now uses theme colors
12642- **Fixed:** Clock box border now matches theme
12643- **Fixed:** All text shadows respect theme (no glow on professional)
12644- **Fixed:** Event bars use theme-appropriate shadows
12645
12646### Technical Details
12647
12648**Week Grid Theming**:
12649```php
12650// Matrix: Dark green (#1a3d1a) background, green (#00cc07) borders
12651// Purple: Dark purple (#3d2b4d) background, purple (#9b59b6) borders
12652// Professional: Light grey (#e8ecf1) background, blue (#4a90e2) borders
12653```
12654
12655**Add Event Button**:
12656```php
12657// Matrix: Dark green (#006400) with bright green text
12658// Purple: Purple (#7d3c98) with lavender text
12659// Professional: Blue (#3498db) with white text
12660```
12661
12662**Text Shadows**:
12663```php
12664// Matrix & Purple: Glow effects (text-shadow: 0 0 6px color)
12665// Professional: No glow (clean look)
12666```
12667
12668**CSS Overrides**:
12669```css
12670/* Purple theme */
12671.sidebar-purple .eventlist-today-header {
12672    border-color: #9b59b6;
12673    box-shadow: 0 0 8px rgba(155, 89, 182, 0.2);
12674}
12675
12676/* Professional theme */
12677.sidebar-professional .eventlist-today-header {
12678    border-color: #4a90e2;
12679    box-shadow: 0 2px 4px rgba(0, 0, 0, 0.1);
12680}
12681```
12682
12683### What Changed Per Theme:
12684
12685**Purple Dream**:
12686- Week grid: Purple borders and dark purple background
12687- Add Event: Purple button with lavender text
12688- Clock box: Purple border with purple glow
12689- Event bars: Purple glow instead of green
12690- All text: Purple/lavender shades
12691
12692**Professional Blue**:
12693- Week grid: Blue borders and light grey background
12694- Add Event: Blue button with white text
12695- Clock box: Blue border with subtle shadow (no glow)
12696- Event bars: Subtle shadows (no glow)
12697- All text: Dark grey and blue shades
12698
12699**Matrix Edition**: Unchanged (still perfect green theme!)
12700
12701## Version 4.1.1 (2026-02-07) - THEMES TAB & TOOLTIP LEFT POSITIONING
12702
12703### ✨ New Features
12704- **Added:** �� Themes tab in admin for sidebar widget theming
12705- **Added:** Three visual themes: Matrix (green), Purple Dream (purple), Professional Blue (blue/grey)
12706- **Added:** Theme selector with live previews
12707- **Added:** Theme persistence across page loads
12708
12709### �� Available Themes
12710
12711**Matrix Edition** (Default):
12712- Dark background (#242424)
12713- Green accents (#00cc07)
12714- Neon glow effects
12715- Original Matrix styling
12716
12717**Purple Dream**:
12718- Dark purple background (#2a2030)
12719- Purple/violet accents (#9b59b6)
12720- Elegant purple glow
12721- Rich purple color scheme
12722
12723**Professional Blue**:
12724- Light grey background (#f5f7fa)
12725- Blue accents (#4a90e2)
12726- Clean professional look
12727- Subtle shadows instead of glow
12728
12729### �� Bug Fix
12730- **Fixed:** Tooltips now go UP and to the LEFT (was going right)
12731- **Changed:** Tooltip offset from `rect.right` to `rect.left - 150px`
12732
12733### Technical Details
12734
12735**Theme System**:
12736```php
12737// Saved in: data/meta/calendar_theme.txt
12738// Applied dynamically in syntax.php
12739$theme = $this->getSidebarTheme();  // 'matrix', 'purple', or 'professional'
12740$styles = $this->getSidebarThemeStyles($theme);
12741
12742// Styles include:
12743- bg, border, shadow
12744- header_bg, header_border, header_shadow
12745- text_primary, text_bright, text_dim
12746- grid_bg, grid_border
12747- cell_bg, cell_today_bg
12748```
12749
12750**Theme Changes**:
12751- Header background gradient
12752- Border colors
12753- Text colors
12754- Shadow/glow effects
12755- Grid colors
12756
12757**How to Change**:
127581. Admin → Calendar → �� Themes tab
127592. Select desired theme
127603. Click "Save Theme"
127614. Refresh page to see changes
12762
12763### Notes
12764- Themes only affect sidebar widget appearance
12765- Main calendar view unchanged
12766- Theme setting stored in `data/meta/calendar_theme.txt`
12767- Safe to switch themes - no data affected
12768
12769## Version 4.1.0 (2026-02-07) - FIX EVENT SORTING & TOOLTIP POSITIONING
12770
12771### �� Bug Fixes
12772- **Fixed:** Events now sort chronologically by time (was using string comparison)
12773- **Fixed:** Tooltip positioning using JavaScript like system tooltips
12774- **Fixed:** All-day events appear first, then events in time order
12775
12776### Technical Details
12777
12778**Event Sorting Fix**:
12779```php
12780// BROKEN (v4.0.9):
12781return strcmp($aTime, $bTime);
12782// String comparison: "10:00" < "8:00" because "1" < "8"
12783// Result: 10:00 AM shown BEFORE 8:00 AM ❌
12784
12785// FIXED (v4.1.0):
12786$aMinutes = $this->timeToMinutes($aTime);  // 8:00 = 480
12787$bMinutes = $this->timeToMinutes($bTime);  // 10:00 = 600
12788return $aMinutes - $bMinutes;
12789// Result: 8:00 AM shown BEFORE 10:00 AM ✓
12790```
12791
12792**Example Before Fix**:
12793```
12794�� Weekend Ticket Duty (all-day)
127958:00 AM START TICKETS
1279610:00 AM Soul Winning    ← Wrong!
127979:45 AM Coffee           ← Should be before 10:00 AM
12798```
12799
12800**Example After Fix**:
12801```
12802�� Weekend Ticket Duty (all-day)
128038:00 AM START TICKETS
128049:45 AM Coffee           ← Correct!
1280510:00 AM Soul Winning
12806```
12807
12808**Tooltip Positioning**:
12809- Added JavaScript to dynamically position tooltips using `getBoundingClientRect()`
12810- Uses CSS custom properties `--tooltip-left` and `--tooltip-top`
12811- Positioned on `mouseenter` event
12812- Matches system tooltip implementation (no cutoff)
12813
12814**JavaScript Implementation**:
12815```javascript
12816element.addEventListener("mouseenter", function() {
12817    const rect = element.getBoundingClientRect();
12818    element.style.setProperty("--tooltip-left", (rect.right - 10) + "px");
12819    element.style.setProperty("--tooltip-top", (rect.top - 30) + "px");
12820});
12821```
12822
12823**Result**: Tooltips now extend beyond sidebar without cutoff, positioned dynamically!
12824
12825## Version 4.0.9 (2026-02-07) - COMPACT TOOLTIPS & OVERFLOW FIX
12826
12827### �� UI Improvements
12828- **Fixed:** Sidebar tooltips no longer cut off at sidebar edge
12829- **Fixed:** Changed inline `overflow:hidden` to `overflow:visible` in sidebar
12830- **Changed:** Main calendar conflict tooltip now much smaller (was too big)
12831
12832### Technical Details
12833
12834**Sidebar Overflow Fix**:
12835```php
12836// Before (line 2005):
12837style="...overflow:hidden..."  // ← Blocked tooltips!
12838
12839// After:
12840style="...overflow:visible..."  // ← Tooltips extend beyond!
12841```
12842
12843**The Problem**: Inline `overflow:hidden` overrode CSS `overflow:visible !important`
12844
12845**Main Calendar Tooltip Size**:
12846```css
12847/* Before: */
12848.conflict-tooltip {
12849    border: 2px solid #ff9800;
12850    border-radius: 6px;
12851    padding: 8px 12px;
12852    font-size: 12px;
12853    min-width: 200px;
12854    max-width: 350px;
12855}
12856
12857/* After: */
12858.conflict-tooltip {
12859    border: 1px solid #ff9800;  /* Thinner */
12860    border-radius: 3px;          /* Smaller */
12861    padding: 4px 8px;            /* Less padding */
12862    font-size: 10px;             /* Smaller header */
12863    min-width: 120px;            /* Narrower */
12864    max-width: 200px;            /* Narrower */
12865}
12866
12867.conflict-tooltip-body {
12868    padding: 6px 8px;  /* Was 10px 12px */
12869    font-size: 9px;    /* Was 11px */
12870    line-height: 1.4;  /* Was 1.6 */
12871}
12872
12873.conflict-item {
12874    padding: 2px 0;  /* Was 4px */
12875    font-size: 9px;  /* Added smaller font */
12876}
12877```
12878
12879**Result**:
12880- Main calendar tooltip ~50% smaller
12881- Sidebar tooltips now extend beyond borders
12882- Both tooltips compact and readable
12883
12884## Version 4.0.8 (2026-02-07) - FIX NEWLINES IN TOOLTIP
12885
12886### �� Bug Fix
12887- **Fixed:** Tooltip now shows actual line breaks (not literal `\n` text)
12888- **Changed:** Using HTML entity `&#10;` for newlines instead of `\n`
12889
12890### Technical Details
12891
12892**The Problem**:
12893```php
12894// Before (v4.0.7):
12895$conflictTooltip = 'Conflicts with:\n';  // Literal \n showed in tooltip
12896
12897// Displayed as:
12898"Conflicts with:\n• Event 1\n• Event 2"  // ← Literal backslash-n
12899```
12900
12901**The Fix**:
12902```php
12903// After (v4.0.8):
12904$conflictTooltip = "Conflicts with:&#10;";  // HTML entity for newline
12905
12906// Displays as:
12907Conflicts with:
12908• Event 1
12909• Event 2
12910```
12911
12912**Why `&#10;` Works**:
12913- HTML entity for line feed character
12914- Works in data attributes
12915- CSS `white-space: pre-line` preserves the newlines
12916- Renders as actual line breaks in tooltip
12917
12918**Applied to**:
12919- PHP rendering (sidebar Today/Tomorrow/Important)
12920- JavaScript rendering (clicked day events)
12921
12922## Version 4.0.7 (2026-02-07) - COMPACT TOOLTIP & OVERFLOW FIX
12923
12924### �� UI Improvements
12925- **Changed:** Tooltip size reduced significantly (much more compact)
12926- **Fixed:** Tooltip now overflows sidebar borders (not cut off)
12927- **Changed:** Smaller padding (3px vs 6px), smaller font (9px vs 11px)
12928- **Changed:** Narrower width (120-200px vs 200-300px)
12929
12930### Technical Details
12931
12932**Tooltip Size Reduction**:
12933```css
12934/* Before (v4.0.6):
12935padding: 6px 10px;
12936font-size: 11px;
12937min-width: 200px;
12938max-width: 300px;
12939
12940/* After (v4.0.7): */
12941padding: 3px 6px;
12942font-size: 9px;
12943min-width: 120px;
12944max-width: 200px;
12945```
12946
12947**Overflow Fix**:
12948```css
12949/* Allow tooltip to extend beyond sidebar */
12950.sidebar-widget,
12951.sidebar-matrix {
12952    overflow: visible !important;
12953}
12954
12955/* Position tooltip outside */
12956[data-tooltip]:before {
12957    bottom: 120%;  /* Further above */
12958    right: -10px;  /* Can extend beyond edge */
12959    z-index: 10000; /* Always on top */
12960}
12961```
12962
12963**Visual Result**:
12964- Tooltip is ~40% smaller
12965- Extends beyond sidebar border if needed
12966- Still readable, just more compact
12967- Better for small screens
12968
12969## Version 4.0.6 (2026-02-07) - MATCH MAIN CALENDAR LOGIC & TOOLTIP POSITIONING
12970
12971### �� Critical Fix
12972- **Fixed:** Sidebar conflict detection now matches main calendar logic exactly
12973- **Fixed:** Checks both `end_time` (snake_case) and `endTime` (camelCase) field names
12974- **Fixed:** Events without end time now treated as zero-duration (not +1 hour)
12975- **Fixed:** Now matches what you see in main calendar view
12976
12977### ✨ UI Improvement
12978- **Changed:** Conflict tooltips now appear ABOVE and to the LEFT (not below/right)
12979- **Added:** Custom CSS tooltip with data-tooltip attribute
12980- **Improved:** Better tooltip positioning - doesn't overflow screen edges
12981
12982### Technical Details
12983
12984**The Problem - Field Name Mismatch**:
12985```php
12986// Main calendar (line 697):
12987$end1 = isset($evt1['endTime']) ? ... // ← Checks 'endTime' (camelCase)
12988
12989// Sidebar (before fix):
12990$endTime = isset($event['end_time']) ? ... // ← Only checked 'end_time' (snake_case)
12991```
12992
12993**The Problem - Duration Logic**:
12994```php
12995// Main calendar (line 697):
12996$end1 = isset($evt1['endTime']) && !empty($evt1['endTime'])
12997    ? $evt1['endTime']
12998    : $evt1['time'];  // ← Uses START time (zero duration)
12999
13000// Sidebar (before fix):
13001$endTime = ... ? ... : $this->addHoursToTime($startTime, 1);  // ← Added 1 hour!
13002```
13003
13004**The Fix**:
13005```php
13006// Now checks BOTH field names:
13007if (isset($event['end_time']) && $event['end_time'] !== '') {
13008    $endTime = $event['end_time'];
13009} elseif (isset($event['endTime']) && $event['endTime'] !== '') {
13010    $endTime = $event['endTime'];
13011} else {
13012    $endTime = $startTime;  // ← Matches main calendar!
13013}
13014```
13015
13016**Tooltip Positioning**:
13017- Uses `data-tooltip` attribute instead of `title`
13018- CSS positions tooltip ABOVE badge (`bottom: 100%`)
13019- Aligns to RIGHT edge (`right: 0`)
13020- Arrow points down to badge
13021- Black background with white text
13022- Max width 300px
13023
13024### Example
13025
13026**6:00 PM Evening Service** (no end time):
13027- Old: 6:00 PM - 7:00 PM (assumed 1 hour) ❌
13028- New: 6:00 PM - 6:00 PM (zero duration) ✓ Matches main calendar!
13029
13030**3:30 PM-7:00 PM Super Bowl** vs **6:00 PM Service**:
13031- Zero-duration events at 6:00 PM don't overlap with anything
13032- ONLY if service has explicit end time (e.g., 6:00-7:00) will it conflict
13033
13034**Tooltip appears**:
13035```
13036        ┌────────────────────┐
13037        │ Conflicts with:    │
13038        │ • Super Bowl       │
13039        │   (3:30 PM-7:00 PM)│
13040        └─────────┬──────────┘
130411304213043```
13044
13045## Version 4.0.5 (2026-02-07) - FIX END_TIME DEFAULT HANDLING
13046
13047### �� Bug Fix
13048- **Fixed:** Events without end_time now properly get 1-hour default duration
13049- **Fixed:** Empty string end_time values now treated as missing (was causing issues)
13050- **Improved:** More robust checking for `end_time` field (checks both isset and not empty)
13051
13052### Technical Details
13053
13054**The Problem**:
13055```php
13056// Before (broken):
13057$endTime = isset($event['end_time']) ? $event['end_time'] : default;
13058
13059// If end_time exists but is empty string "":
13060isset($event['end_time']) = TRUE
13061$endTime = ""  // ← Empty string, not default!
13062```
13063
13064**The Fix**:
13065```php
13066// After (fixed):
13067$endTime = (isset($event['end_time']) && $event['end_time'] !== '')
13068    ? $event['end_time']
13069    : $this->addHoursToTime($startTime, 1);
13070
13071// Now empty string gets the default 1-hour duration
13072```
13073
13074**Why This Matters**:
13075Events like "6:00 PM Evening Service" with no end time should be treated as 6:00-7:00 PM (1 hour). If the `end_time` field contains an empty string instead of being absent, the old code would use the empty string, causing conflict detection to fail.
13076
13077**Example**:
13078```
13079Super Bowl: 3:30 PM - 7:00 PM
13080Evening Service: 6:00 PM - ??? (should be 7:00 PM)
13081
13082If end_time = "" (empty string):
13083  Old code: Uses "" → conflict detection fails
13084  New code: Uses 7:00 PM → conflict detected ✓
13085```
13086
13087### Testing
13088If you're still not seeing the conflict on the 6:00 PM service:
130891. Check if the event has `end_time` set in the JSON
130902. Clear cache (Admin → Manage Events → Clear Cache)
130913. The conflict should now appear
13092
13093## Version 4.0.4 (2026-02-07) - CONFLICT TOOLTIP WITH DETAILS
13094
13095### ✨ Feature Added
13096- **Added:** Hover over ⚠ badge to see which events are conflicting
13097- **Added:** Tooltip shows conflicting event titles and times
13098- **Added:** Works in both sidebar sections and clicked day events
13099
13100### Technical Details
13101
13102**Conflict Tracking Enhanced**:
13103```php
13104// Now tracks WHICH events conflict:
13105$event['conflictingWith'] = [
13106    ['title' => 'Meeting', 'time' => '10:00', 'end_time' => '11:00'],
13107    ['title' => 'Call', 'time' => '10:30', 'end_time' => '11:30']
13108];
13109```
13110
13111**Tooltip Format**:
13112```
13113Conflicts with:
13114• Meeting (10:00 AM-11:00 AM)
13115• Call (10:30 AM-11:30 PM)
13116```
13117
13118**Where It Works**:
13119- ✅ Today section (sidebar)
13120- ✅ Tomorrow section (sidebar)
13121- ✅ Important Events section (sidebar)
13122- ✅ Clicked day events (week grid)
13123
13124**Cursor**: Changes to `help` cursor on hover to indicate tooltip
13125
13126### Note on Multi-Day Events
13127The current conflict detection only checks time conflicts **within the same day**. If you have an event that spans multiple days (e.g., start date on Monday, end date on Wednesday), each day is treated independently. To see conflicts across the entire span, you would need to check each individual day.
13128
13129## Version 4.0.3 (2026-02-07) - FIX CONFLICT BADGE & IMPORTANT EVENTS LOGIC
13130
13131### �� Bug Fixes
13132- **Fixed:** Conflict badge (⚠) now displays in sidebar Today/Tomorrow/Important sections
13133- **Fixed:** Important Events now shows events even if they're today or tomorrow
13134- **Fixed:** Field name mismatch - was checking `'conflicts'` (plural) but setting `'conflict'` (singular)
13135
13136### Technical Details
13137
13138**Conflict Badge Issue**:
13139```php
13140// BROKEN (line 2511):
13141$hasConflict = isset($event['conflicts']) && !empty($event['conflicts']);
13142// ↑ Checking 'conflicts' (plural)
13143
13144// But detectTimeConflicts() sets:
13145$event['conflict'] = true/false;
13146// ↑ Setting 'conflict' (singular)
13147
13148// FIXED:
13149$hasConflict = isset($event['conflict']) && $event['conflict'];
13150```
13151
13152**Result**: Badge now shows for ALL conflicting events in sidebar sections
13153
13154**Important Events Logic Issue**:
13155```php
13156// BROKEN:
13157if ($dateKey === $todayStr) {
13158    $todayEvents[] = ...;
13159} elseif ($dateKey === $tomorrowStr) {
13160    $tomorrowEvents[] = ...;
13161} else {  // ← Only checked if NOT today/tomorrow!
13162    if ($isImportant) {
13163        $importantEvents[] = ...;
13164    }
13165}
13166
13167// FIXED:
13168if ($dateKey === $todayStr) {
13169    $todayEvents[] = ...;
13170}
13171if ($dateKey === $tomorrowStr) {
13172    $tomorrowEvents[] = ...;
13173}
13174// ↑ Changed to separate 'if' statements
13175if ($isImportant && $dateKey in this week) {
13176    $importantEvents[] = ...;  // ← Now includes today/tomorrow too!
13177}
13178```
13179
13180**Result**: Important namespace events now show in Important section even if they're today or tomorrow
13181
13182### Conflict Badge Display
13183- Simplified to just ⚠ icon (no count)
13184- Orange color (#ff9800)
13185- 10px font size
13186- Hover shows "Time conflict detected"
13187
13188## Version 4.0.2 (2026-02-07) - FIX IMPORTANT EVENTS DISPLAY
13189
13190### �� Bug Fix
13191- **Fixed:** Important Events section now displays all events correctly
13192- **Fixed:** Single-event days now get conflict flag (was returning early without flag)
13193- **Fixed:** Conflict detection no longer causes events to disappear from Important section
13194
13195### Technical Details
13196
13197**The Problem**:
13198- `detectTimeConflicts()` returned early if only 1 event on a day
13199- Returned original array without adding 'conflict' field
13200- This inconsistency caused issues in event categorization
13201
13202**The Solution**:
13203```php
13204// Before (broken):
13205if (empty($dayEvents) || count($dayEvents) < 2) {
13206    return $dayEvents;  // No 'conflict' field added!
13207}
13208
13209// After (fixed):
13210if (count($dayEvents) === 1) {
13211    return [array_merge($dayEvents[0], ['conflict' => false])];  // Always add flag
13212}
13213```
13214
13215**Result**:
13216- All events now have 'conflict' field consistently
13217- Single events: conflict = false
13218- Multiple events: conflict = true/false based on overlap
13219- Important Events section displays correctly
13220
13221## Version 4.0.1 (2026-02-06) - CONFLICT DETECTION, TAB REORDER, FIXES
13222
13223### �� Bug Fixes
13224- **Fixed:** Conflict badge (⚠) now displays in clicked day events
13225- **Fixed:** Recurring events edit now updates time and end_time correctly
13226- **Fixed:** Field names changed from 'start'/'end' to 'time'/'end_time' in recurring edit
13227
13228### ✨ Features Added
13229- **Added:** Time conflict detection for overlapping events
13230- **Added:** detectTimeConflicts() function checks all events on same day
13231- **Added:** timesOverlap(), timeToMinutes(), addMinutesToTime() helper functions
13232- **Added:** Events now have 'conflict' flag set automatically
13233
13234### �� UI Changes
13235- **Changed:** Admin tab order: �� Manage Events (first), �� Update Plugin, ⚙️ Outlook Sync
13236- **Changed:** Default admin tab is now "Manage Events" (was "Update Plugin")
13237- **Changed:** Week view now shows 4 colored event bars before "+1" (was 3 bars)
13238
13239### Technical Details
13240
13241**Conflict Detection**:
13242```php
13243// Automatically detects overlapping events on same day
13244// Sets 'conflict' flag to true if event overlaps with another
13245$eventsWithConflicts = $this->detectTimeConflicts($dayEvents);
13246```
13247
13248**Logic**:
13249- All-day events never conflict (no time set)
13250- Timed events check for overlap with other timed events
13251- Overlap = start1 < end2 AND start2 < end1
13252- Default duration is 60 minutes if no end_time
13253
13254**Recurring Events Fix**:
13255- Old: Updated `$event['start']` and `$event['end']` (wrong fields)
13256- New: Updates `$event['time']` and `$event['end_time']` (correct fields)
13257- Now edits actually save and update the events
13258
13259**Week View Bars**:
13260- Shows 4 colored bars instead of 3
13261- "+1" becomes "+2" with 5 events, "+3" with 6 events, etc.
13262
13263## Version 4.0.0 (2026-02-06) - MATRIX EDITION RELEASE ��
13264
13265**Major Release**: Complete Matrix-themed calendar plugin with advanced features!
13266
13267### �� Major Features
13268
13269#### Sidebar Widget
13270- **Week Grid**: Interactive 7-day calendar with click-to-view events
13271- **Live System Monitoring**: CPU load, real-time CPU, memory usage with tooltips
13272- **Live Clock**: Updates every second with date display
13273- **Real-time Weather**: Geolocation-based temperature with icon
13274- **Event Sections**: Today (orange), Tomorrow (green), Important (purple)
13275- **Add Event Button**: Dark green bar opens full event creation dialog
13276- **Matrix Theme**: Green glow effects throughout
13277
13278#### Event Management
13279- **Single Color Bars**: Clean 3px bars showing event's assigned color
13280- **All-Day Events First**: Then sorted chronologically by time
13281- **Conflict Detection**: Orange ⚠ badge on overlapping events
13282- **Rich Content**: Full DokuWiki formatting (**bold**, [[links]], //italic//)
13283- **HTML Rendering**: Pre-rendered for JavaScript display
13284- **Click-to-View**: Click week grid days to expand event details
13285
13286#### Admin Interface
13287- **Update Plugin Tab** (Default): Version info, changelog, prominent Clear Cache button
13288- **Outlook Sync Tab**: Microsoft Azure integration, category mapping, sync settings
13289- **Manage Events Tab**: Browse, edit, delete, move events across namespaces
13290
13291#### Outlook Sync
13292- **Bi-directional Sync**: DokuWiki ↔ Microsoft Outlook
13293- **Category Mapping**: Map colors to Outlook categories
13294- **Conflict Resolution**: Time conflict detection
13295- **Import/Export Config**: Encrypted configuration files
13296
13297### �� Design
13298- **Matrix Theme**: Authentic green glow aesthetic
13299- **Dark Backgrounds**: #1a1a1a header, rgba(36, 36, 36) sections
13300- **Color Scheme**:
13301  - Today: Orange #ff9800
13302  - Tomorrow: Green #4caf50
13303  - Important: Purple #9b59b6
13304  - Add Event: Dark green #006400
13305  - System bars: Green/Purple/Orange
13306
13307### �� Technical Highlights
13308- **Zero-margin Design**: Perfect flush alignment throughout
13309- **Flexbox Layout**: Modern, responsive structure
13310- **AJAX Operations**: No page reloads needed
13311- **Smart Sorting**: All-day events first, then chronological
13312- **Tooltip System**: Detailed stats on hover (working correctly)
13313- **Event Dialog**: Full form with drag support
13314- **Cache Management**: One-click cache clearing
13315
13316### �� Breaking Changes from v3.x
13317- Removed dual color bars (now single event color bar only)
13318- Add Event button moved to between header and week grid
13319- All-day events now appear FIRST (not last)
13320- Update Plugin tab is now the default admin tab
13321
13322### �� Bug Fixes (v3.10.x → v4.0.0)
13323- ✅ Fixed color bars not showing (align-self:stretch vs height:100%)
13324- ✅ Fixed tooltip function naming (sanitized calId for JavaScript)
13325- ✅ Fixed weather display (added updateWeather function)
13326- ✅ Fixed HTML rendering in events (title_html/description_html fields)
13327- ✅ Fixed Add Event dialog (null check for calendar element)
13328- ✅ Fixed text positioning in Add Event button
13329- ✅ Fixed spacing throughout sidebar widget
13330
13331### �� Complete Feature List
13332- Full calendar view (month grid)
13333- Sidebar widget (week view)
13334- Event panel (standalone)
13335- Event list (date ranges)
13336- Namespace support
13337- Color coding
13338- Time conflict detection
13339- DokuWiki syntax in events
13340- Outlook synchronization
13341- System monitoring
13342- Weather display
13343- Live clock
13344- Admin interface
13345- Cache management
13346- Draggable dialogs
13347- AJAX save/edit/delete
13348- Import/export config
13349
13350### �� Usage
13351
13352**Sidebar Widget**:
13353```
13354{{calendar sidebar}}
13355{{calendar sidebar namespace=team}}
13356```
13357
13358**Full Calendar**:
13359```
13360{{calendar}}
13361{{calendar year=2026 month=6 namespace=team}}
13362```
13363
13364**Event Panel**:
13365```
13366{{eventpanel}}
13367```
13368
13369**Event List**:
13370```
13371{{eventlist daterange=2026-01-01:2026-01-31}}
13372```
13373
13374### �� Stats
13375- **40+ versions** developed during v3.x iterations
13376- **3.10.0 → 3.11.4**: Polish and refinement
13377- **4.0.0**: Production-ready Matrix Edition
13378
13379### �� Credits
13380Massive iteration and refinement session resulting in a polished, feature-complete calendar plugin with authentic Matrix aesthetics and enterprise-grade Outlook integration.
13381
13382---
13383
13384## Previous Versions (v3.11.4 and earlier)
13385
13386## Version 3.11.4 (2026-02-06) - RESTORE HEADER BOTTOM SPACING
13387- **Changed:** Restored 2px bottom padding to header (was 0px, now 2px)
13388- **Improved:** Small breathing room between system stats bars and Add Event button
13389- **Visual:** Better spacing for cleaner appearance
13390
13391### CSS Change:
13392**eventlist-today-header**:
13393- `padding: 6px 10px 0 10px` → `padding: 6px 10px 2px 10px`
13394
13395### Visual Result:
13396```
13397│  ▓▓▓░░ ▓▓░░░ ▓▓▓▓░  │  ← Stats bars
13398│                       │  ← 2px space (restored)
13399├───────────────────────┤
13400│  + ADD EVENT          │  ← Add Event bar
13401├───────────────────────┤
13402```
13403
13404**Before (v3.11.3)**: No space, bars directly touch Add Event button
13405**After (v3.11.4)**: 2px breathing room for better visual hierarchy
13406
13407## Version 3.11.3 (2026-02-06) - FIX ADD EVENT DIALOG & TEXT POSITION
13408- **Fixed:** openAddEvent() function now checks if calendar element exists before reading dataset
13409- **Fixed:** Add Event button no longer throws "Cannot read properties of null" error
13410- **Changed:** Add Event text moved up 1px (position:relative; top:-1px)
13411- **Changed:** Line-height reduced from 12px to 10px for better text centering
13412- **Improved:** openAddEvent() works for both regular calendars and sidebar widgets
13413
13414### JavaScript Fix:
13415**Problem**: Line 1084-1085 in calendar-main.js
13416```javascript
13417const calendar = document.getElementById(calId);
13418const filteredNamespace = calendar.dataset.filteredNamespace; // ← Null error!
13419```
13420
13421**Solution**: Added null check
13422```javascript
13423const calendar = document.getElementById(calId);
13424const filteredNamespace = calendar ? calendar.dataset.filteredNamespace : null;
13425```
13426
13427**Why This Happened**:
13428- Regular calendar has element with id=calId
13429- Sidebar widget doesn't have this element (different structure)
13430- Code tried to read .dataset on null, causing error
13431
13432### Text Position Fix:
13433**Before**:
13434- line-height: 12px
13435- vertical-align: middle
13436- Text slightly low
13437
13438**After**:
13439- line-height: 10px
13440- position: relative; top: -1px
13441- Text perfectly centered
13442
13443### What Works Now:
13444✅ Click "+ ADD EVENT" in sidebar → Dialog opens
13445✅ No console errors
13446✅ Text properly centered vertically
13447✅ Form pre-filled with today's date
13448✅ Save works correctly
13449
13450## Version 3.11.2 (2026-02-06) - ADD EVENT DIALOG IN SIDEBAR
13451- **Added:** Event dialog to sidebar widget (same as regular calendar)
13452- **Changed:** Add Event button now opens proper event form dialog
13453- **Added:** renderEventDialog() called in renderSidebarWidget()
13454- **Fixed:** Add Event button calls openAddEvent() with calId, namespace, and today's date
13455- **Improved:** Can now add events directly from sidebar widget
13456
13457### Add Event Button Behavior:
13458**Before (v3.11.1)**: Showed alert with instructions
13459**After (v3.11.2)**: Opens full event creation dialog
13460
13461**Dialog Features**:
13462- Date field (defaults to today)
13463- Title field (required)
13464- Time field (optional)
13465- End time field (optional)
13466- Color picker
13467- Category field
13468- Description field
13469- Save and Cancel buttons
13470- Draggable dialog
13471
13472### Technical Changes:
13473- Added `$html .= $this->renderEventDialog($calId, $namespace);` at end of renderSidebarWidget()
13474- Changed Add Event onclick from alert to `openAddEvent('calId', 'namespace', 'YYYY-MM-DD')`
13475- Dialog uses same structure as regular calendar
13476- Uses existing openAddEvent() and saveEventCompact() JavaScript functions
13477
13478### User Flow:
134791. User clicks "+ ADD EVENT" green bar
134802. Event dialog opens with today's date pre-filled
134813. User fills in event details
134824. User clicks Save
134835. Event saved via AJAX
134846. Dialog closes
134857. Sidebar refreshes to show new event
13486
13487## Version 3.11.1 (2026-02-06) - FLUSH HEADER & ADD EVENT DIALOG
13488- **Fixed:** Removed bottom padding from header (was 2px, now 0)
13489- **Fixed:** Removed margin from stats container (was margin-top:2px, now margin:0)
13490- **Fixed:** Add Event bar now flush against header with zero gap
13491- **Changed:** Add Event button now shows helpful alert dialog instead of navigating to admin
13492- **Improved:** Alert provides clear instructions on how to add events
13493
13494### CSS Changes:
13495**eventlist-today-header**:
13496- `padding: 6px 10px 2px 10px` → `padding: 6px 10px 0 10px` (removed 2px bottom)
13497
13498**eventlist-stats-container**:
13499- `margin-top: 2px` → `margin: 0` (removed all margins)
13500
13501### Add Event Button Behavior:
13502**Before**: Clicked → Navigated to Admin → Manage Events tab
13503**After**: Clicked → Shows alert with instructions
13504
13505**Alert Message**:
13506```
13507To add an event, go to:
13508Admin → Calendar Management → Manage Events tab
13509or use the full calendar view {{calendar}}
13510```
13511
13512### Visual Result:
13513```
13514│  ▓▓▓░░ ▓▓░░░ ▓▓▓▓░  │  ← Stats (no margin-bottom)
13515├────────────────────────┤
13516│  + ADD EVENT           │  ← Perfectly flush!
13517├────────────────────────┤
13518```
13519
13520No gaps, perfectly aligned!
13521
13522## Version 3.11.0 (2026-02-06) - ADD EVENT BAR FINAL POSITION & SIZE
13523- **Moved:** Add Event bar back to original position (between header and week grid)
13524- **Changed:** Font size reduced from 9px to 8px (prevents text cutoff)
13525- **Changed:** Letter spacing reduced from 0.5px to 0.4px
13526- **Fixed:** Text now fully visible without being cut off
13527- **Final:** Optimal position and size determined
13528
13529### Final Layout:
13530```
13531┌─────────────────────────────┐
13532│  Clock | Weather | Stats    │  ← Header
13533├─────────────────────────────┤
13534│  + ADD EVENT                 │  ← Bar (back here, smaller text)
13535├─────────────────────────────┤
13536│  M  T  W  T  F  S  S        │  ← Week Grid
13537│  3  4  5  6  7  8  9        │
13538├─────────────────────────────┤
13539│  Today                       │  ← Event sections
13540└─────────────────────────────┘
13541```
13542
13543### Text Size Changes:
13544**v3.10.9**: 9px font, 0.5px letter-spacing → Text slightly cut off
13545**v3.11.0**: 8px font, 0.4px letter-spacing → Text fully visible
13546
13547### Why This Position:
13548- Separates header from calendar
13549- Natural action point after viewing stats
13550- Users see stats → decide to add event → view calendar
13551- Consistent with original design intent
13552
13553## Version 3.10.9 (2026-02-06) - ADD EVENT BAR MOVED BELOW WEEK GRID
13554- **Moved:** Add Event bar repositioned from between header/grid to below week grid
13555- **Improved:** Better visual flow - header → stats → grid → add button → events
13556- **Changed:** Add Event bar now acts as separator between calendar and event sections
13557
13558### New Layout:
13559```
13560┌─────────────────────────────┐
13561│  Clock | Weather | Stats    │  ← Header
13562├─────────────────────────────┤
13563│  M  T  W  T  F  S  S        │  ← Week Grid
13564│  3  4  5  6  7  8  9        │
13565├─────────────────────────────┤
13566│  + ADD EVENT                 │  ← Add bar (moved here!)
13567├─────────────────────────────┤
13568│  Today                       │  ← Event sections
13569│  Tomorrow                    │
13570│  Important Events            │
13571└─────────────────────────────┘
13572```
13573
13574### Visual Flow:
13575**Before (v3.10.8)**:
135761. Header (clock, weather, stats)
135772. **+ ADD EVENT** bar
135783. Week grid
135794. Event sections
13580
13581**After (v3.10.9)**:
135821. Header (clock, weather, stats)
135832. Week grid (calendar days)
135843. **+ ADD EVENT** bar
135854. Event sections
13586
13587### Benefits:
13588- Natural reading flow: View calendar → Add event → See events
13589- Add button positioned between calendar and event list
13590- Acts as visual separator
13591- More logical action placement
13592
13593## Version 3.10.8 (2026-02-06) - SINGLE COLOR BAR & ZERO MARGIN ADD BAR
13594- **Removed:** Section color bar (blue/orange/green/purple) - now shows ONLY event color
13595- **Changed:** Events now display with single 3px color bar (event's assigned color only)
13596- **Fixed:** Add Event bar now has zero margin (margin:0) - touches header perfectly
13597- **Simplified:** Cleaner visual with one color bar instead of two
13598- **Improved:** More space for event content without extra bar
13599
13600### Visual Changes:
13601
13602**Before (v3.10.7)** - Dual color bars:
13603```
13604├─ [Orange][Green]  Event Title
13605├─ [Blue][Purple]   Event Title
13606```
13607
13608**After (v3.10.8)** - Single color bar:
13609```
13610├─ [Green]  Event Title    ← Only event color!
13611├─ [Purple] Event Title    ← Only event color!
13612```
13613
13614### Add Bar Changes:
13615- Added `margin:0` to eliminate gaps
13616- Now flush against header (no space above)
13617- Now flush against week grid (no space below)
13618- Perfect seamless connection
13619
13620### Technical Changes:
13621**renderSidebarEvent()**:
13622- Removed section color bar (4px)
13623- Kept only event color bar (3px)
13624
13625**showDayEvents() JavaScript**:
13626- Removed section color bar (4px blue)
13627- Kept only event color bar (3px)
13628
13629**Add Event bar**:
13630- Added `margin:0` inline style
13631- Removed all top/bottom margins
13632
13633## Version 3.10.7 (2026-02-06) - COLOR BARS FIX FOR SECTIONS & DARK GREEN ADD BAR
13634- **Fixed:** Color bars now display in Today/Tomorrow/Important sections (was only showing in clicked day)
13635- **Fixed:** Changed Today/Tomorrow/Important event rendering to use `align-self:stretch` instead of `height:100%`
13636- **Changed:** Add Event bar color from orange to dark green (#006400)
13637- **Changed:** Add Event bar height increased from 6px to 12px (text no longer cut off)
13638- **Changed:** Add Event bar text now bright green (#00ff00) with green glow
13639- **Changed:** Add Event bar font size increased from 7px to 9px
13640- **Changed:** Add Event bar letter spacing increased to 0.5px
13641- **Improved:** Hover effect on Add Event bar now darker green (#004d00)
13642
13643### Color Bar Fix Details:
13644**Problem**: Today/Tomorrow/Important sections still used `height:100%` on color bars
13645**Solution**: Applied same fix as clicked day events:
13646- Changed parent div: `align-items:start` → `align-items:stretch`
13647- Added `min-height:20px` to parent
13648- Changed bars: `height:100%` → `align-self:stretch`
13649- Bars now properly fill vertical space in ALL sections
13650
13651### Add Event Bar Changes:
13652**Before**:
13653- Background: Orange (#ff9800)
13654- Text: Black (#000)
13655- Height: 6px (text cut off)
13656- Font: 7px
13657
13658**After**:
13659- Background: Dark green (#006400)
13660- Text: Bright green (#00ff00) with green glow
13661- Height: 12px (text fully visible)
13662- Font: 9px
13663- Hover: Darker green (#004d00)
13664- Matrix-themed green aesthetic
13665
13666## Version 3.10.6 (2026-02-06) - COLOR BARS FIX, SORTING REVERSAL, CONFLICT BADGE, README UPDATE
13667- **Fixed:** Event color bars now display correctly in clicked day events
13668- **Fixed:** Changed sorting - all-day events now appear FIRST, then timed events
13669- **Added:** Conflict badge (⚠) appears on right side of conflicting events
13670- **Updated:** Complete README.md rewrite with full Matrix theme documentation
13671- **Changed:** Color bars use `align-self:stretch` instead of `height:100%` (fixes rendering)
13672- **Changed:** Parent div uses `align-items:stretch` and `min-height:20px`
13673- **Improved:** Content wrapper now uses flexbox for proper conflict badge positioning
13674
13675### Color Bar Fix:
13676**Problem**: Bars had `height:100%` but parent had no explicit height
13677**Solution**:
13678- Changed to `align-self:stretch` on bars
13679- Parent uses `align-items:stretch`
13680- Added `min-height:20px` to parent
13681- Bars now properly fill vertical space
13682
13683### Sorting Change:
13684**Before**: Timed events first → All-day events last
13685**After**: All-day events FIRST → Timed events chronologically
13686
13687**Example**:
13688```
13689Monday, Feb 5
13690├─ All Day - Project Deadline       ← All-day first
13691├─ 8:00 AM - Morning Standup        ← Earliest time
13692├─ 10:30 AM - Coffee with Bob
13693└─ 2:00 PM - Team Meeting           ← Latest time
13694```
13695
13696### Conflict Badge:
13697- Orange warning triangle (⚠) on right side
13698- 10px font size
13699- Only appears if `event.conflict` is true
13700- Title attribute shows "Time conflict detected"
13701- Small and unobtrusive
13702
13703### README Update:
13704- Complete rewrite with Matrix theme focus
13705- Full usage instructions for all features
13706- Admin interface documentation
13707- Outlook sync setup guide
13708- System monitoring details
13709- Troubleshooting section
13710- Color scheme reference
13711- File structure documentation
13712- Performance tips
13713- Security notes
13714- Quick start examples
13715
13716## Version 3.10.5 (2026-02-06) - TIME SORTING & THINNER ADD BAR
13717- **Added:** Events now sorted by time when clicking week grid days
13718- **Changed:** Add Event bar now ultra-thin (6px height, down from 12px)
13719- **Improved:** Events with times appear first, sorted chronologically
13720- **Improved:** All-day events appear after timed events
13721- **Changed:** Add Event bar font size reduced to 7px (from 10px)
13722- **Changed:** Add Event bar now has 0 padding and fixed 6px height
13723
13724### Sorting Logic:
13725- Events with times sorted by time (earliest first)
13726- All-day events (no time) appear at the end
13727- Sort algorithm: Convert time to minutes (HH:MM → total minutes) and compare
13728- Chronological order: 8:00 AM → 10:30 AM → 2:00 PM → All-day event
13729
13730### Add Event Bar Changes:
13731- **Height**: 6px (was ~12px with padding)
13732- **Padding**: 0 (was 4px top/bottom)
13733- **Font Size**: 7px (was 10px)
13734- **Letter Spacing**: 0.3px (was 0.5px)
13735- **Line Height**: 6px to match height
13736- **Vertical Align**: Middle for text centering
13737
13738## Version 3.10.4 (2026-02-06) - ADD EVENT BAR
13739- **Added:** Thin orange "Add Event" bar between header and week grid
13740- **Added:** Quick access to event creation from sidebar widget
13741- **Styled:** Sleek design with hover effects and glow
13742- **Interactive:** Clicks navigate to Manage Events tab in admin
13743- **Improved:** User workflow for adding events from sidebar
13744
13745### Visual Design:
13746- Orange background (#ff9800) matching Today section color
13747- 4px top/bottom padding for thin, sleek appearance
13748- Black text with white text-shadow for visibility
13749- Hover effect: Darkens to #ff7700 with enhanced glow
13750- Orange glow effect (box-shadow) matching Matrix theme
13751- Centered "+ ADD EVENT" text (10px, bold, letter-spacing)
13752
13753### Technical Changes:
13754- Added between header close and renderWeekGrid() call
13755- Inline onclick handler navigates to admin manage tab
13756- Inline onmouseover/onmouseout for hover effects
13757- Smooth 0.2s transition on all style changes
13758
13759## Version 3.10.3 (2026-02-06) - UI IMPROVEMENTS & CACHE BUTTON RELOCATION
13760- **Changed:** Update Plugin tab is now the default tab when opening admin
13761- **Moved:** Clear Cache button relocated from Outlook Sync tab to Update Plugin tab
13762- **Improved:** Clear Cache button now larger and more prominent with helpful description
13763- **Improved:** Tab order reorganized: Update Plugin (default) → Outlook Sync → Manage Events
13764- **Removed:** Debug console.log statements from day event display
13765- **Fixed:** Cache clear now redirects back to Update Plugin tab instead of Config tab
13766
13767### UI Changes:
13768- Update Plugin tab opens by default (was Config/Outlook Sync tab)
13769- Clear Cache button prominently displayed at top of Update Plugin tab
13770- Orange ��️ button (10px 20px padding) with confirmation dialog
13771- Help text: "Clear the DokuWiki cache if changes aren't appearing or after updating the plugin"
13772- Success/error messages display on Update Plugin tab after cache clear
13773- Tab navigation reordered to put Update first
13774
13775### Technical Changes:
13776- Default tab changed from 'config' to 'update' in html() method
13777- Tab navigation HTML reordered to show Update Plugin tab first
13778- clearCache() method now redirects with 'update' tab parameter
13779- Removed Clear Cache button from renderConfigTab()
13780- Added Clear Cache button to renderUpdateTab() with message display
13781
13782## Version 3.10.2 (2026-02-06) - EVENT HTML RENDERING FIX
13783- **Fixed:** Event formatting (bold, links, italic) now displays correctly when clicking week grid days
13784- **Added:** renderDokuWikiToHtml() helper function to convert DokuWiki syntax to HTML
13785- **Changed:** Events in weekEvents now pre-rendered with title_html and description_html fields
13786- **Improved:** DokuWiki syntax (**bold**, [[links]], //italic//, etc.) properly rendered in clicked day events
13787
13788### Technical Changes:
13789- Added renderDokuWikiToHtml() private function using p_get_instructions() and p_render()
13790- Events added to weekEvents now include pre-rendered HTML versions
13791- title_html and description_html fields populated before json_encode()
13792- JavaScript now receives properly formatted HTML content
13793
13794## Version 3.10.1 (2026-02-06) - TOOLTIP FIX & WEATHER & CACHE BUTTON
13795- **Fixed:** System tooltip functions now use sanitized calId (showTooltip_sidebar_abc123 instead of showTooltip_sidebar-abc123)
13796- **Fixed:** HTML event handlers now call correctly sanitized function names
13797- **Fixed:** Weather temperature now updates correctly in sidebar widget
13798- **Added:** Weather update function to sidebar widget JavaScript
13799- **Added:** "Clear Cache" button in admin panel for easy cache refresh
13800- **Added:** Default weather location set to Irvine, CA when geolocation unavailable
13801- **Improved:** All tooltip functions now work correctly on system status bars
13802
13803### Technical Changes:
13804- Changed tooltip function names to use $jsCalId instead of $calId
13805- Changed HTML onmouseover/onmouseout to use $jsCalId
13806- Added updateWeather() function to sidebar widget
13807- Added getWeatherIcon() function to sidebar widget
13808- Added clearCache() method in admin.php
13809- Added recursiveDelete() helper method in admin.php
13810- Admin UI now has ��️ Clear Cache button alongside Export/Import
13811
13812## Version 3.10.0 (2026-02-06) - JAVASCRIPT FIXES
13813- **Fixed:** JavaScript syntax error "Missing initializer in const declaration"
13814- **Fixed:** Event links and formatting not displaying in clicked day events
13815- **Fixed:** Sanitized calId to jsCalId by replacing dashes with underscores
13816- **Changed:** Event titles now use `title_html` field to preserve HTML formatting
13817- **Changed:** Event descriptions now use `description_html` field to preserve links and formatting
13818- **Improved:** All JavaScript variable names now use valid syntax
13819- **Improved:** Links, bold, italic, and other HTML formatting preserved in events
13820
13821### Technical Changes:
13822- Added variable sanitization: `$jsCalId = str_replace('-', '_', $calId);`
13823- JavaScript variables now use underscores instead of dashes
13824- Event HTML rendering preserves DokuWiki formatting
13825- Fixed "showTooltip_sidebar is not defined" errors
13826- Fixed "showDayEvents_cal is not defined" errors
13827
13828## Version 3.9.9 (2026-02-06) - JAVASCRIPT LOADING ORDER FIX
13829- **Fixed:** Critical JavaScript loading order issue causing ReferenceError
13830- **Fixed:** Functions now defined BEFORE HTML that uses them
13831- **Changed:** Consolidated all JavaScript into single comprehensive script block
13832- **Removed:** ~290 lines of duplicate JavaScript code
13833- **Added:** Shared state management with `sharedState_[calId]` object
13834- **Improved:** System tooltip functions now work correctly
13835- **Improved:** Week grid click events now work correctly
13836
13837### Technical Changes:
13838- Moved all JavaScript to beginning of widget (before HTML)
13839- Removed duplicate script blocks
13840- Unified tooltip and stats functions
13841- Shared latestStats and cpuHistory state
13842- Fixed "Uncaught ReferenceError: showTooltip_sidebar is not defined"
13843
13844## Version 3.9.8 (2026-02-05) - DUAL COLOR BARS & CLICK EVENTS
13845- **Added:** Dual color bars on events (section color + event color)
13846- **Added:** Click week grid days to view events (replaced hover tooltips)
13847- **Added:** Expandable section below week grid for selected day events
13848- **Added:** Blue theme for selected day section
13849- **Changed:** Week grid days now clickable instead of tooltips
13850- **Changed:** Section bar: 4px wide (left)
13851- **Changed:** Event bar: 3px wide (right)
13852- **Increased:** Gap between color bars from 3px to 6px
13853- **Improved:** Click is more reliable and mobile-friendly than hover tooltips
13854
13855### Visual Changes:
13856- Each event shows TWO color bars side-by-side
13857- Left bar (4px): Section context (Today=Orange, Tomorrow=Green, Important=Purple, Selected=Blue)
13858- Right bar (3px): Individual event's assigned color
13859- Click any day in week grid to expand event list
13860- X button to close selected day events
13861
13862## Version 3.9.7 (2026-02-05) - EVENT COLOR BAR VISIBILITY
13863- **Increased:** Event color bar width from 2px to 3px
13864- **Increased:** Gap between section and event bars from 3px to 6px
13865- **Improved:** Event color bars now more visible alongside section bars
13866- **Note:** Dual color bar system already in place from v3.9.6
13867
13868## Version 3.9.6 (2026-02-05) - UI REFINEMENTS
13869- **Changed:** Date in Important Events moved below event name (was above)
13870- **Changed:** Section headers now 9px font size (was 10px)
13871- **Changed:** Section headers now normal case (was ALL CAPS)
13872- **Changed:** Letter spacing reduced from 0.8px to 0.3px
13873- **Improved:** More natural reading flow with date below event name
13874- **Improved:** Cleaner, more subtle section headers
13875
13876### Header Changes:
13877- "TODAY" → "Today"
13878- "TOMORROW" → "Tomorrow"
13879- "IMPORTANT EVENTS" → "Important Events"
13880
13881## Version 3.9.0 (2026-02-05) - SIDEBAR WIDGET REDESIGN
13882- **Redesigned:** Complete overhaul of `sidebar` parameter
13883- **Added:** Compact week-at-a-glance itinerary view (200px wide)
13884- **Added:** Live clock widget at top of sidebar
13885- **Added:** 7-cell week grid showing event bars
13886- **Added:** Today section with orange header and left border
13887- **Added:** Tomorrow section with green header and left border
13888- **Added:** Important Events section with purple header and left border
13889- **Added:** Admin setting to configure important namespaces
13890- **Added:** Time conflict badges in sidebar events
13891- **Added:** Task checkboxes in sidebar events
13892- **Changed:** Sidebar now optimized for narrow spaces (200px)
13893- **Improved:** Perfect for dashboards, page sidebars, and quick glance widgets
13894
13895### New Features:
13896- Clock updates every second showing current time
13897- Week grid shows Mon-Sun with colored event bars
13898- Today/Tomorrow sections show full event details
13899- Important events highlighted in purple (configurable namespaces)
13900- All badges (conflict, time, etc.) shown in compact format
13901- Automatic time conflict detection
13902
13903## Version 3.8.0 (2026-02-05) - PRODUCTION CLEANUP
13904- **Removed:** 16 unused/debug/backup files
13905- **Removed:** 69 console.log() debug statements
13906- **Removed:** 3 orphaned object literals from console.log removal
13907- **Removed:** Temporary comments and markers
13908- **Fixed:** JavaScript syntax errors from cleanup
13909- **Improved:** Code quality and maintainability
13910- **Improved:** Reduced plugin size by removing unnecessary files
13911- **Status:** Production-ready, fully cleaned codebase
13912
13913### Files Removed:
13914- style.css.backup, script.js.backup
13915- admin_old_backup.php, admin_minimal.php, admin_new.php, admin_clean.php
13916- debug_events.php, debug_html.php, cleanup_events.php
13917- fix_corrupted_json.php, fix_wildcard_namespaces.php
13918- find_outlook_duplicates.php, update_namespace.php
13919- validate_calendar_json.php, admin.js
13920- test_date_field.html
13921
13922## Version 3.7.5 (2026-02-05)
13923- **Fixed:** PHP syntax error (duplicate foreach loop removed)
13924- **Fixed:** Time variable handling in grace period logic
13925
13926## Version 3.7.4 (2026-02-05)
13927- **Added:** 15-minute grace period for timed events
13928- **Changed:** Events with times now stay visible for 15 minutes after their start time
13929- **Changed:** Prevents events from immediately disappearing when they start
13930- **Improved:** Better user experience for ongoing events
13931- **Fixed:** Events from earlier today now properly handled with grace period
13932
13933## Version 3.7.3 (2026-02-05)
13934- **Changed:** Complete redesign of cleanup section for compact, sleek layout
13935- **Changed:** Radio buttons now in single row at top
13936- **Changed:** All options visible with grayed-out inactive states (opacity 0.4)
13937- **Changed:** Inline controls - no more grid layout or wrapper boxes
13938- **Changed:** Namespace filter now compact single-line input
13939- **Changed:** Smaller buttons and tighter spacing throughout
13940- **Improved:** More professional, space-efficient design
13941
13942## Version 3.7.2 (2026-02-04)
13943- **Fixed:** Strange boxes under cleanup options - now properly hidden
13944- **Changed:** Unified color scheme across all admin sections
13945- **Changed:** Green (#00cc07) - Primary actions and main theme
13946- **Changed:** Orange (#ff9800) - Warnings and cleanup features
13947- **Changed:** Purple (#7b1fa2) - Secondary actions and accents
13948- **Improved:** Consistent visual design throughout admin interface
13949
13950## Version 3.7.1 (2026-02-04)
13951- **Fixed:** Cleanup section background changed from orange to white
13952- **Fixed:** Event cleanup now properly scans all calendar directories
13953- **Added:** Debug info display when preview finds no events
13954- **Improved:** Better directory scanning logic matching other features
13955
13956## Version 3.7.0 (2026-02-04)
13957- **Added:** Event cleanup feature in Events Manager
13958- **Added:** Delete old events by age (months/years old)
13959- **Added:** Delete events by status (completed tasks, past events)
13960- **Added:** Delete events by date range
13961- **Added:** Namespace filter for targeted cleanup
13962- **Added:** Preview function to see what will be deleted
13963- **Added:** Automatic backup creation before cleanup
13964- **Changed:** Reduced changelog viewer height to 100px (was 400px)
13965
13966## Version 3.6.3 (2026-02-04)
13967- **Fixed:** Conflict tooltips now work properly after navigating between months
13968- **Added:** Changelog display in Update Plugin tab
13969- **Added:** CHANGELOG.md file with version history
13970- **Improved:** Changelog shows last 10 versions with color-coded change types
13971- **Fixed:** Removed debug console.log statements
13972
13973## Version 3.6.2 (2026-02-04)
13974- **Fixed:** Month title now updates correctly when navigating between months
13975- **Changed:** All eventpanel header elements reduced by 10% for more compact design
13976- **Changed:** Reduced header height from 78px to 70px
13977
13978## Version 3.6.1 (2026-02-04)
13979- **Changed:** Complete redesign of eventpanel header with practical two-row layout
13980- **Fixed:** Improved layout for narrow widths (~500px)
13981- **Changed:** Simplified color scheme (removed purple gradient)
13982
13983## Version 3.6.0 (2026-02-04)
13984- **Changed:** Redesigned eventpanel header with gradient background
13985- **Changed:** Consolidated multiple header rows into compact single-row design
13986
13987## Version 3.5.1 (2026-02-04)
13988- **Changed:** Moved event search bar into header row next to + Add button
13989- **Improved:** More compact UI with search integrated into header
13990
13991## Version 3.5.0 (2026-02-04)
13992- **Added:** Event search functionality in sidebar and eventpanel
13993- **Added:** Real-time filtering as you type
13994- **Added:** Clear button (✕) appears when searching
13995- **Added:** "No results" message when search returns nothing
13996
13997## Version 3.4.7 (2026-02-04)
13998- **Changed:** Made conflict badges smaller and more subtle (9px font, less padding)
13999- **Fixed:** Removed debug logging from console
14000- **Changed:** Updated export version number to match plugin version
14001
14002## Version 3.4.6 (2026-02-04)
14003- **Added:** Debug logging to diagnose conflict detection issues
14004- **Development:** Extensive console logging for troubleshooting
14005
14006## Version 3.4.5 (2026-02-04)
14007- **Added:** Debug logging to showDayPopup and conflict detection
14008- **Development:** Added logging to trace conflict detection flow
14009
14010## Version 3.4.4 (2026-02-04)
14011- **Fixed:** Conflict detection now persists across page refreshes (PHP-based)
14012- **Fixed:** Conflict tooltips now appear on hover
14013- **Added:** Dual conflict detection (PHP for initial load, JavaScript for navigation)
14014- **Added:** Conflict badges in both future and past events sections
14015
14016## Version 3.4.3 (2026-02-04)
14017- **Added:** Custom styled conflict tooltips with hover functionality
14018- **Changed:** Conflict badge shows count of conflicts (e.g., ⚠️ 2)
14019- **Improved:** Beautiful tooltip design with orange header and clean formatting
14020
14021## Version 3.4.2 (2026-02-04)
14022- **Fixed:** Attempted to fix tooltip newlines (reverted in 3.4.3)
14023
14024## Version 3.4.1 (2026-02-04)
14025- **Fixed:** End time field now properly saves to database
14026- **Fixed:** End time dropdown now filters to show only valid times after start time
14027- **Added:** Smart dropdown behavior - expands on focus, filters invalid options
14028- **Improved:** End time auto-suggests +1 hour when start time selected
14029
14030## Version 3.4.0 (2026-02-04)
14031- **Added:** End time support for events (start and end times)
14032- **Added:** Automatic time conflict detection
14033- **Added:** Conflict warning badges (⚠️) on events with overlapping times
14034- **Added:** Conflict tooltips showing which events conflict
14035- **Added:** Visual conflict indicators with pulse animation
14036- **Changed:** Time display now shows ranges (e.g., "2:00 PM - 4:00 PM")
14037
14038## Version 3.3.77 (2026-02-04)
14039- **Fixed:** Namespace badge onclick handlers restored after clearing filter
14040- **Fixed:** Namespace filtering works infinitely (filter → clear → filter)
14041
14042## Version 3.3.76 (2026-02-04)
14043- **Fixed:** Namespace badges now clickable after clearing namespace filter
14044
14045## Version 3.3.75 (2026-02-04)
14046- **Fixed:** Form resubmission warnings eliminated
14047- **Improved:** Implemented proper POST-Redirect-GET pattern with HTTP 303
14048- **Changed:** All admin redirects now use absolute URLs
14049
14050## Version 3.3.74 (2026-02-04)
14051- **Fixed:** Clearing namespace filter now restores original namespace instead of default
14052- **Added:** data-original-namespace attribute to preserve initial namespace setting
14053- **Improved:** Console logging for namespace filter debugging
14054
14055## Version 3.3.73 (2026-02-03)
14056- **Added:** Dynamic namespace filtering banner with clear button
14057- **Fixed:** JavaScript function accessibility issues
14058- **Fixed:** Namespace badge click handlers in event lists
14059- **Improved:** Persistent namespace filtering across views
14060
14061## Earlier Versions
14062See previous transcripts for complete history through v3.3.73, including:
14063- Recurring events with Outlook sync
14064- Multi-namespace support
14065- Event categories and mapping
14066- Backup/restore functionality
14067- System statistics bar
14068- Namespace selector with fuzzy search
14069- Events Manager with import/export
14070- And much more...
14071