xref: /plugin/calendar/CHANGELOG.md (revision dd4b337d4ffd456a9a1712758149aa560535b6a6)
1# Calendar Plugin Changelog
2
3## Version 7.6.0 (2026-04-05)
4
5Major release: multi-day event bar alignment, extended range parameter, CSRF compatibility fix, farm compatibility, and security hardening.
6
7### New Features
8
9**Extended Range Parameter for Event Lists**
10- `{{eventlist range=>3m}}` — show events for the next 3 months
11- `{{eventlist range=>100d}}` — next 100 days
12- `{{eventlist range=>2w}}` — next 2 weeks
13- `{{eventlist range=>1y}}` — next 1 year
14- Supports units: `d` (days), `w` (weeks), `m` (months), `y` (years)
15- Headers are localized (EN/DE/CS)
16- All extended ranges include a 30-day lookback for past-due tasks
17
18**Multi-Day Event Bar Alignment**
19- Events spanning multiple days now display as continuous bars at consistent vertical positions across the calendar grid
20- Stable slot assignment algorithm: multi-day events reserve a row across all days they span
21- Single-day events fill remaining slots, sorted by time
22- Invisible spacer elements maintain alignment on days where a slot is unused
23- Algorithm runs in both PHP (initial page load) and JS (AJAX navigation)
24
25**Namespace Exclude Parameter**
26- `{{calendar namespace=* exclude=journal}}` — hide specific namespaces from wildcard views
27- `{{calendar namespace=* exclude="journal;drafts"}}` — exclude multiple (semicolon-separated)
28- Supports exact and prefix matching: `exclude=journal` also hides `journal:daily`, `journal:notes`
29- Works with `{{calendar}}`, `{{eventpanel}}`, and `{{eventlist}}`
30- Preserved across AJAX navigation and all-dates search
31
32**Default Search Scope Setting**
33- New admin setting (Themes tab) to default the search bar to "This Month" or "All Dates"
34- Users can still toggle per-session with the ��/�� button
35- Stored in `data/meta/calendar_search_default.txt`
36
37### DokuWiki Farm Compatibility
38
39**Data Path Migration**
40- Replaced 77 hardcoded `DOKU_INC . 'data/meta/'` references with `$conf['metadir']` across 8 files
41- Cache paths now use `$conf['cachedir']` (EventCache, RateLimiter, clearCache)
42- All temp files (`.event_stats_cache`, `.sync_abort`) moved from shared plugin dir to per-animal data dir
43- Added `metaDir()` helper to syntax, action, and admin plugin classes
44
45**Per-Animal Sync Credentials**
46- `sync_config.php` now checked in `$conf['metadir']/calendar/` first (per-animal), falls back to `DOKU_PLUGIN` (shared)
47- Added `syncConfigPath()` helper with fallback logic
48- Google OAuth tokens already stored per-animal in `$conf['metadir']`
49
50**CLI Sync Safety**
51- `sync_outlook.php` bootstraps DokuWiki with `NOSESSION` for CLI safety
52- Defensive fallback for `$conf['metadir']` when not set
53- Cron jobs should run as `www-data`, not root, to avoid file ownership issues
54
55### Security Hardening
56
57**ACL Enforcement on All AJAX Endpoints**
58- Read operations (`load_month`, `get_event`, `get_static_calendar`, `search_all`) verify `AUTH_READ`
59- Write operations (`save_event`, `delete_event`, `toggle_task`) verify `AUTH_EDIT`
60- Wildcard/multi-namespace views silently filter out namespaces the user cannot access
61- Applied to both server-side rendering (syntax.php) and AJAX paths (action.php)
62
63**CSRF Protection on Admin Panel**
64- Added `checkSecurityToken()` validation to the admin `handle()` method
65- Added `formSecurityToken()` to all 12 HTML forms
66- Added `JSINFO.sectok` hidden input to all 11 JavaScript-generated forms
67
68**JSINFO.sectok Compatibility**
69- Fixed CSRF token failures on DokuWiki "Librarian" and other versions that don't auto-populate `JSINFO.sectok`
70- `addAssets()` now injects the security token via inline script before `calendar-main.js` loads
71- Ensures `getSecurityToken()` always has a valid token regardless of DokuWiki version or template
72
73**Removed System Stats Endpoint**
74- Deleted `get_system_stats.php` — exposed CPU, memory, load averages, uptime, and top processes via `shell_exec('ps aux')` and `/proc/meminfo` through a directly-accessible PHP endpoint
75- Removed admin UI section, CSS, and save/load methods
76- System load inline JS remains but never executes (`getShowSystemLoad()` returns `false`)
77
78### Bug Fixes
79
80**Weekly Recurring Events on Sunday Created 365 Daily Events**
81- PHP's string `'0'` is falsy — when Sunday (day index 0) was the only selected weekday, the `$weekDays` array was empty, and every day matched
82- Fixed: strict comparison `($weekDaysStr !== '')` instead of truthy check
83
84**Memory Exhaustion on Large Wikis (namespace=*)**
85- Replaced recursive `findSubNamespaces` (which scanned every directory in `data/meta/`) with `findCalendarNamespaces` using iterative `glob()` to locate `calendar/` directories directly
86- On a wiki with 5,000 pages: old approach scanned 5,000+ dirs; new approach runs ~10 glob calls
87
88**Page Load Crash: "Cannot read properties of null"**
89- ARIA live region creation ran before `document.body` existed (script loaded in `<head>`)
90- Wrapped in deferred function that waits for `DOMContentLoaded`
91
92**JS Cache Busting**
93- `script.js` was using `Date.now()` as cache buster, forcing fresh HTTP requests on every page load
94- Changed to version-based `?v=7.2.1`
95
96### Housekeeping
97- Updated `@version` docblocks across all PHP files
98- Added localized strings (EN/DE/CS) for exclude and search scope features
99- Template `style.ini` lookups now check `$conf['savedir']` for farm-specific overrides
100
101### Migration Notes
102
103**From 7.0.x (non-farm):** No action needed — paths resolve to the same location.
104
105**Farm setups:** Calendar data stays in the master wiki's `data/meta/`. Move per-animal data manually:
106```bash
107mv /path/to/master/data/meta/calendar/ /path/to/animal/data/meta/calendar/
108mv /path/to/master/data/meta/calendar_*.txt /path/to/animal/data/meta/
109```
110
111**Cleanup:** The file `calendar_show_system_load.txt` in your data directory can be safely deleted.
112
113---
114
115## Version 7.0.8 (2026-02-15) - TIMEZONE FIX
116
117### Bug Fix: Date Shift in Non-UTC Timezones
118Fixed critical bug where events appeared shifted by one day in timezones ahead of UTC (e.g., Europe/Prague UTC+1).
119
120**Root Cause:**
121JavaScript's `toISOString()` converts dates to UTC, so local midnight (00:00) in Prague becomes 23:00 UTC of the *previous day*. When split to get YYYY-MM-DD, this returns the wrong date.
122
123**Fix:**
124Added `formatLocalDate(date)` helper function that formats dates using local time methods (`getFullYear()`, `getMonth()`, `getDate()`) instead of UTC conversion.
125
126**Affected Areas (now fixed):**
127- Multi-day event spanning (line 385)
128- Today string calculation in event list (line 566)
129- Past event detection in event items (line 1022)
130
131### Files Modified
132- `calendar-main.js` - Added `formatLocalDate()` helper, replaced 3 `toISOString().split('T')[0]` calls
133
134---
135
136## Version 7.0.7 (2026-02-15) - GOOGLE CALENDAR SYNC
137
138### Google Calendar Integration
139- Two-way sync with Google Calendar via OAuth 2.0
140- Import events from Google Calendar to DokuWiki
141- Export events from DokuWiki to Google Calendar
142- Support for all-day and timed events
143- Multi-day event handling
144- Color mapping between Google and DokuWiki
145- Duplicate detection prevents re-importing same events
146- Select which Google calendar to sync with
147- Admin panel UI for configuration and sync controls
148
149### Setup Requirements
150- Google Cloud Console project
151- Google Calendar API enabled
152- OAuth 2.0 Web Application credentials
153- Redirect URI configuration
154
155### New Files
156- `classes/GoogleCalendarSync.php` - OAuth and Calendar API integration
157
158### Files Modified
159- `action.php` - Added Google sync action handlers
160- `admin.php` - Added Google sync admin tab
161
162---
163
164## Version 7.0.6 (2026-02-15) - ACCESSIBILITY IMPROVEMENTS
165
166### Screen Reader Support
167- Added ARIA live region for dynamic announcements
168- Announces "Event created", "Event updated", "Event deleted" on actions
169- Announces "Task marked complete/incomplete" on toggle
170- Screen readers receive feedback without visual alerts
171
172### Debug Mode
173- Added `CALENDAR_DEBUG` flag for JavaScript console logging
174- `calendarLog()` and `calendarError()` helper functions
175- Debug output disabled by default
176
177### Code Quality
178- Consistent error handling patterns
179- Better separation of concerns
180
181### Files Modified
182- `calendar-main.js` - ARIA live region, debug helpers, announcements
183
184---
185
186## Version 7.0.5 (2026-02-15) - AUDIT LOGGING & ACCESSIBILITY
187
188### Audit Logging
189- New `AuditLogger.php` class for compliance logging
190- Logs all event modifications: create, update, delete, move, task toggle
191- JSON-formatted log files with timestamps, user info, and IP addresses
192- Automatic log rotation (5MB max, 10 files retained)
193- Log entries include: namespace, date, event ID, title, and change details
194
195### Keyboard Navigation (Accessibility)
196- Arrow keys navigate between calendar days
197- Enter/Space activates focused day (opens popup)
198- Arrow Up/Down navigates between events in popups
199- Enter on event opens edit dialog
200- Delete/Backspace on event triggers delete
201- Escape closes all dialogs, popups, and dropdowns
202- Added `tabindex` and `role` attributes for screen readers
203- Added `aria-label` descriptions for calendar days and events
204
205### CSS Focus States
206- Visible focus indicators on calendar days
207- Focus styles on event items in popups
208- Focus styles on custom date/time pickers
209- Uses `focus-visible` for keyboard-only focus rings
210
211### Files Added
212- `classes/AuditLogger.php` - Compliance audit logging
213
214### Files Modified
215- `action.php` - Integrated audit logging for all event operations
216- `calendar-main.js` - Extended keyboard navigation
217- `syntax.php` - Added accessibility attributes to calendar cells
218- `style.css` - Added focus state styles
219
220---
221
222## Version 7.0.4 (2026-02-15) - CODE CLEANUP
223
224### Code Cleanup
225- Removed unused `calendarDebounce()` and `calendarThrottle()` utility functions
226- Removed duplicate `updateEndTimeOptions()` function definition
227- Removed unused `_calendarSelectOpen` tracking variable
228- Removed orphaned `.input-date` and `.time-select` CSS (no longer using native inputs)
229- Consolidated legacy function calls
230
231### Improvements
232- End date picker now opens to start date's month when no end date is selected
233- End time picker now scrolls to first available time after start time
234
235### Files Modified
236- `calendar-main.js` - Removed ~40 lines of dead code
237- `style.css` - Removed ~25 lines of unused CSS
238
239---
240
241## Version 7.0.3 (2026-02-15) - CUSTOM DATE & TIME PICKERS
242
243### Complete Replacement of Native Browser Controls
244Both date inputs and time selects have been replaced with custom, lightweight pickers to eliminate all browser-related performance issues.
245
246#### Custom Date Picker
247- **Mini calendar grid** - Clean monthly view with day selection
248- **Month navigation** - Previous/next buttons for quick browsing
249- **Visual indicators** - Today highlighted, selected date marked
250- **End date validation** - Cannot select end date before start date
251- **Clear button** - Easy removal of optional end date
252
253#### Custom Time Picker (from v7.0.2)
254- **Period groupings** - Morning, Afternoon, Evening, Night
255- **Lazy loading** - Options built only when dropdown opens
256- **Smart filtering** - End times after start time only
257
258#### Code Cleanup
259- Removed old `setupSelectTracking()` function (was causing conflicts)
260- Removed redundant event listener code
261- Unified dropdown close handling for all picker types
262- No native `<input type="date">` or `<select>` elements in event dialog
263
264### Files Modified
265- `syntax.php` - New date picker HTML structure
266- `calendar-main.js` - Custom date picker JavaScript, cleanup
267- `style.css` - Date picker calendar grid styles
268
269---
270
271## Version 7.0.2 (2026-02-15) - CUSTOM TIME PICKER
272
273### Major Fix: Replaced Native Selects with Custom Time Pickers
274The native `<select>` element with 97 time options was causing browser freezes when opening. This version replaces them with lightweight custom dropdown pickers.
275
276#### New Custom Time Picker Features
277- **Instant opening** - No browser rendering delay
278- **Lazy-loaded options** - Dropdown HTML built only when clicked
279- **Period grouping** - Morning, Afternoon, Evening, Night sections
280- **Smart filtering** - End time options automatically hide times before start time
281- **Visual feedback** - Selected time highlighted, disabled times grayed out
282
283#### Technical Changes
284- Replaced `<select>` elements with `<button>` + `<div>` dropdown
285- Hidden `<input>` stores actual value for form submission
286- Time data pre-computed once, reused for all pickers
287- Event delegation for option clicks
288- Automatic cleanup when clicking outside
289
290#### Removed
291- Native `<select>` time pickers (caused 2600ms+ freezes)
292- `onchange` handlers from date inputs (handled in JS now)
293- Old `setupSelectTracking()` function
294
295### Files Modified
296- `syntax.php` - New time picker HTML structure
297- `calendar-main.js` - Custom time picker JavaScript
298- `style.css` - Time picker dropdown styles
299
300---
301
302## Version 7.0.1 (2026-02-15) - SELECTOR FLICKER FIX
303
304### Bug Fixes
305- **Fixed selector flicker on subsequent clicks** - Time/date selectors no longer flash or lag after first use
306  - New `setupSelectTracking()` prevents DOM updates while selector is open
307  - Tracks mousedown/focus/blur/change events on all form inputs
308  - Uses `requestAnimationFrame` for smooth visual updates
309  - Added state caching to skip redundant DOM manipulation
310
311### CSS Improvements
312- Changed `transition: all` to specific properties on `.input-sleek` elements
313- Added `transition: none` for select options
314- Prevents browser reflow issues during dropdown rendering
315
316---
317
318## Version 7.0.0 (2026-02-15) - STABILITY & PERFORMANCE RELEASE
319
320### Major Improvements
321
322#### File Locking & Atomic Writes (Critical Stability Fix)
323- **New `CalendarFileHandler` class** with atomic file operations
324- Prevents data corruption from concurrent event saves
325- Uses temp file + atomic rename strategy for safe writes
326- Implements `flock()` for proper file locking during reads/writes
327- Graceful handling of lock acquisition failures with retries
328
329#### Caching Layer (Performance Improvement)
330- **New `CalendarEventCache` class** for event data caching
331- 5-minute TTL reduces unnecessary JSON file reads
332- In-memory caching for current request
333- Automatic cache invalidation on event modifications
334- Cache cleanup for expired entries
335
336#### Rate Limiting (Security Enhancement)
337- **New `CalendarRateLimiter` class** for AJAX endpoint protection
338- 60 requests/minute for read actions
339- 30 requests/minute for write actions (more restrictive)
340- Per-user tracking (falls back to IP for anonymous)
341- Rate limit headers in responses (X-RateLimit-Limit, X-RateLimit-Remaining)
342- Automatic cleanup of old rate limit data
343
344#### Code Refactoring
345- **New `CalendarEventManager` class** consolidating CRUD operations
346- New `classes/` directory for organized code structure
347- Reduced code duplication across files
348- Improved separation of concerns
349- Better maintainability for future development
350
351#### JavaScript Performance Fixes (Dialog Responsiveness)
352- **Fixed slow time selector** - End time dropdown now opens instantly
353  - Replaced `Array.from().forEach()` with direct `options` loop (97 options)
354  - Single-pass algorithm instead of multiple iterations
355  - Uses `hidden` property instead of `style.display` manipulation
356- **Fixed event listener accumulation** - Dialog inputs no longer slow down over time
357  - Added `data-initialized` flag to prevent re-binding listeners
358  - Namespace search only initializes once per calendar
359- **Fixed selector flicker on subsequent clicks**
360  - New `setupSelectTracking()` function prevents DOM updates while selector is open
361  - Tracks mousedown/focus/blur/change events on time and date inputs
362  - Uses `requestAnimationFrame` instead of `setTimeout` for visual updates
363  - Added state caching to skip redundant DOM updates
364- **Fixed CSS transition interference**
365  - Changed `transition: all` to specific properties on form inputs
366  - Added explicit `transition: none` for select options
367  - Prevents browser reflow issues during dropdown rendering
368
369### Branding Changes
370- Removed "Matrix Edition" from plugin name and all references
371- Plugin is now simply "Calendar Plugin"
372- Matrix theme remains available (now called just "Matrix")
373
374### Technical Details
375- All JSON file operations now use atomic writes
376- Event saves protected against race conditions
377- Cache automatically invalidated on namespace/month changes
378- Rate limiter uses probabilistic cleanup (1 in 100 requests)
379
380### Files Added
381- `classes/FileHandler.php` - Atomic file operations with locking
382- `classes/EventCache.php` - Caching layer with TTL
383- `classes/RateLimiter.php` - AJAX rate limiting
384- `classes/EventManager.php` - Consolidated event CRUD operations
385
386### Upgrade Notes
387- No database migration required
388- Cache directory created automatically (`data/cache/calendar/`)
389- Rate limit data stored in `data/cache/calendar/ratelimit/`
390- Existing events and settings preserved
391
392---
393
394## Version 6.14.2 (2026-02-15) - SYSTEM LOAD TOGGLE
395
396### Added System Load Bars Toggle
397- New toggle in **Admin > Calendar > Themes** tab
398- Choose to show or hide CPU/Memory load indicator bars
399- Setting applies to both event panel and sidebar widget
400- Stored in `data/meta/calendar_show_system_load.txt`
401- JavaScript polling is also disabled when hidden (saves resources)
402
403## Version 6.14.1 (2026-02-14) - SECURITY FIX
404
405### Security Improvements
406- **Authentication required** - Write actions (save, delete, toggle) now require user to be logged in
407- **Improved CSRF token handling** - New `getSecurityToken()` helper function checks multiple sources:
408  - `JSINFO.sectok` (standard)
409  - `window.JSINFO.sectok`
410  - Hidden form field `input[name="sectok"]`
411  - Meta tag `meta[name="sectok"]`
412- Anonymous users can no longer add/edit/delete events
413- Better error messages for authentication and token failures
414
415### Bug Fixes
416- Fixed "Invalid security token" error on clean DokuWiki installations
417- Added debug logging for security token failures
418
419## Version 6.14.0 (2026-02-14) - STABLE RELEASE
420
421### Code Cleanup & Localization
422- Added localization for all static calendar strings (EN/DE)
423- New lang keys: `previous_month`, `next_month`, `print_calendar`, `no_events_scheduled`, `calendar_label`, `details`
424- Code review and cleanup completed
425- Updated README.md and plugin documentation
426
427### Static Calendar Features (v6.13.x consolidated)
428- Read-only presentation mode: `{{calendar static}}`
429- Custom titles: `title="My Events"`
430- Month locking: `month=2` disables navigation
431- Print button with clean itinerary output
432- All themes supported: matrix, pink, purple, professional, wiki, dark, light
433- `noprint` option to hide print functionality
434- Formatted descriptions in tooltips and itinerary
435
436### Other Improvements in 6.13.x
437- Admin menu icon (SVG)
438- Config import fix for `return array()` syntax
439- Mobile touch button fixes
440- Important events in day popup with star icons
441- Time picker grouped by period
442- Multi-day event time validation
443
444## Version 6.13.13 (2026-02-14) - PRINT BUTTON CENTERING
445
446### Fixed Print Button Icon Alignment
447- Added `display: flex`, `align-items: center`, `justify-content: center`
448- Added `padding: 0` and `line-height: 1`
449- Icon now properly centered in circle
450
451## Version 6.13.12 (2026-02-14) - SIMPLE TOOLTIP
452
453### Simplified Hover Tooltip
454- Removed custom JS tooltip (was causing triple popups)
455- Uses native browser `title` attribute only
456- Plain text with formatting converted: `**bold**` → `*bold*`, `//italic//` → `_italic_`
457- Links shown as: `text (url)`
458- Added �� emoji before time for visual clarity
459- Itinerary still shows full HTML formatting
460
461## Version 6.13.11 (2026-02-14) - FORMATTED DESCRIPTIONS
462
463### Rich Text Formatting in Static Calendar
464- **Hover tooltips** now show formatted text (bold, italic, links, line breaks)
465- **Itinerary descriptions** display with full formatting
466- Uses existing `renderDescription()` function for consistency
467- Supports: `**bold**`, `//italic//`, `[[links]]`, `[markdown](links)`, line breaks
468
469### Technical Details
470- Added `data-tooltip` attribute with rich HTML content
471- New JavaScript tooltip handler with smart positioning
472- CSS styles for `.static-tooltip` and itinerary formatting
473- Tooltips stay within viewport bounds
474
475## Version 6.13.10 (2026-02-14) - PRINT MARGINS FIX v3
476
477### Fixed Print Margins - Inline Styles Approach
478- Removed reliance on `@page` CSS (browser support inconsistent)
479- Uses inline style `padding: 50px 60px` directly on wrapper div
480- Simplified CSS for better browser compatibility
481- Smaller table font (12px) for better fit
482- Set `max-width: 800px` on content wrapper
483
484## Version 6.13.9 (2026-02-14) - PRINT MARGINS FIX v2
485
486### Fixed Print Margins
487- Added `.print-wrapper` div with 0.5in padding/margin
488- Uses both `@page` margin AND wrapper margins for compatibility
489- Set `@page { margin: 1in 0.75in }` (top/bottom 1in, sides 0.75in)
490- Wrapper has `max-width: 7.5in` to fit standard letter size
491- Smaller fonts (0.85em) to fit more content
492- Added 250ms delay before print to ensure styles load
493
494## Version 6.13.8 (2026-02-14) - PRINT MARGINS FIX
495
496### Improved Print Layout
497- Added `@page { margin: 0.75in }` for proper print margins
498- Increased body padding to 40px for screen preview
499- Smaller font sizes to fit better on page
500- Description column limited width with word-wrap
501- Table header repeats on each page (`display: table-header-group`)
502- Rows avoid page breaks in middle (`page-break-inside: avoid`)
503- Print color adjust enabled for backgrounds
504
505## Version 6.13.7 (2026-02-14) - ALL THEMES FOR STATIC CALENDAR
506
507### Added All Theme Options
508Now all themes work with static calendar:
509
510| Theme | Description |
511|-------|-------------|
512| `matrix` | Green on dark (default Matrix style) |
513| `pink` | Pink/magenta on dark |
514| `purple` | Purple/violet on dark |
515| `professional` | Blue on white (business style) |
516| `wiki` | Neutral gray (matches DokuWiki) |
517| `dark` | Blue on dark gray |
518| `light` | Clean white/gray |
519
520### Examples
521```
522{{calendar theme=matrix static}}
523{{calendar theme=purple static}}
524{{calendar theme=professional static}}
525{{calendar theme=wiki static}}
526```
527
528## Version 6.13.6 (2026-02-14) - QUOTED PARAMETER FIX
529
530### Fixed Quoted Parameter Parsing
531- Titles with spaces now work: `title="Feb 26 Expense Log"`
532- Uses regex to properly parse: `key="value with spaces"`
533- Supports both double and single quotes
534- Example: `{{calendar title="My Custom Title" static}}`
535
536## Version 6.13.5 (2026-02-14) - STATIC CALENDAR OPTIONS
537
538### New Static Calendar Options
539
540| Option | Description | Example |
541|--------|-------------|---------|
542| `title=X` | Custom title instead of month name | `title="Club Meetings"` |
543| `noprint` | Hide print button and print view | `{{calendar static noprint}}` |
544| `theme=X` | Apply specific theme (matrix, pink, dark, light) | `theme=matrix` |
545
546### Fixed Month/Year Lock
547- When you specify `month=X` or `year=X`, navigation is now disabled
548- `{{calendar month=2 static}}` shows only February with no nav arrows
549- `{{calendar year=2025 month=12 static}}` locks to December 2025
550
551### Examples
552```
553{{calendar static}}                              // Navigable, current month
554{{calendar month=2 static}}                      // Locked to February
555{{calendar title="Team Events" static}}          // Custom title
556{{calendar theme=matrix static}}                 // Matrix theme
557{{calendar namespace=club static noprint}}       // No print button
558{{calendar month=3 title="March Meetings" theme=pink static}}
559```
560
561## Version 6.13.4 (2026-02-14) - DEDICATED PRINT BUTTON
562
563### Added Print Button to Static Calendar
564- New ��️ print button in the calendar header
565- Opens a clean popup window with ONLY the itinerary content
566- Automatically triggers print dialog
567- Window closes after printing
568- No DokuWiki headers/footers/sidebars - just the calendar
569
570### How It Works
571- Extracts the print view HTML
572- Creates a new window with minimal styling
573- Calls `window.print()` automatically
574- Clean single-page output
575
576## Version 6.13.3 (2026-02-14) - PRINT BLANK PAGES FIX
577
578### Fixed Blank Pages When Printing
579- Aggressively hide ALL screen view elements and children in print
580- Reset height/width to 0 with !important on grid, cells, events
581- Ensure print view elements have proper display table properties
582- Force all hidden elements to position:absolute off-screen
583
584## Version 6.13.2 (2026-02-14) - STATIC CALENDAR RESPONSIVE FIX
585
586### Improved Static Calendar Layout
587- Changed from `max-width: 900px` to `width: 100%` for full container fit
588- Added `table-layout: fixed` for consistent column widths
589- Added `overflow-x: auto` for horizontal scroll on very small screens
590- Reduced header padding and font sizes for better fit
591- Improved responsive breakpoints for mobile (768px and 480px)
592- Hide time on very small screens to save space
593- Better touch targets for navigation buttons
594
595## Version 6.13.1 (2026-02-14) - STATIC CALENDAR FIX
596
597### Bug Fix
598- Added missing `getImportantNamespaces()` helper method
599- Fixed `loadEventsForMonth` → use existing `loadEvents` method
600- Added multi-namespace/wildcard support to static calendar
601
602## Version 6.13.0 (2026-02-14) - STATIC CALENDAR MODE
603
604### New Static/Presentation Mode
605Read-only calendar view for public display and printing.
606
607**Usage:**
608```
609{{calendar static}}
610{{calendar namespace=meetings static}}
611```
612
613**Screen View Features:**
614- Clean calendar grid without edit/delete buttons
615- Month navigation (prev/next arrows)
616- Hover tooltips showing full event details (title, time, description)
617- Important events highlighted with ⭐ and golden background
618- Today's date highlighted
619- Responsive design for mobile
620
621**Print View Features:**
622- Automatically switches to itinerary format when printing
623- Table layout: Date | Time | Event | Details
624- Important events marked with ⭐
625- Dates grouped (date only shown once per day)
626- Page break handling for long lists
627- Clean black & white friendly output
628
629**Files Changed:**
630- `syntax.php`: Added `renderStaticCalendar()` method
631- `action.php`: Added `getStaticCalendar()` AJAX handler
632- `calendar-main.js`: Added `navStaticCalendar()` function
633- `style.css`: Added static calendar styles + print media queries
634
635## Version 6.12.7 (2026-02-14) - ADMIN MENU ICON
636
637### Added Admin Menu Icon
638- New monochrome SVG calendar icon for DokuWiki admin menu
639- Icon shows calendar with binding rings, header, and date dots
640- Matches DokuWiki's admin interface style
641- Added `getMenuIcon()` method to admin.php
642- Icon file: `images/icon.svg`
643
644## Version 6.12.6 (2026-02-14) - CONFIG IMPORT FIX
645
646### Fixed Config Import Validation
647- Now accepts both `return [` and `return array(` syntax
648- Regex updated from `/return\s*\[/` to `/return\s*(\[|array\s*\()/`
649- Older PHP config files using `return array(...)` now import correctly
650
651## Version 6.12.5 (2026-02-14) - MOBILE BUTTON FIX
652
653### Fixed Delete/Edit Buttons on Mobile
654- Added `type="button"` attribute to prevent form submission issues
655- Added `touchend` event delegation for reliable mobile touch handling
656- Increased button touch targets (32px default, 40px on mobile)
657- Added `touch-action: manipulation` to prevent touch delays
658- Added `-webkit-tap-highlight-color` for visual feedback
659
660### Technical Details
661- Mobile browsers sometimes don't fire `onclick` reliably
662- New `touchend` handler calls `btn.click()` explicitly
663- Larger touch targets meet accessibility guidelines (44px recommended)
664
665## Version 6.12.4 (2026-02-14) - STAR INLINE FIX
666
667### Fixed Star Position in Day Popup
668- Star icon now displays inline with event title (left side)
669- Changed `.popup-event-title` from `flex: 1 1 100%` to `flex: 1 1 auto`
670- Star and title stay on same line instead of star being above
671
672## Version 6.12.3 (2026-02-14) - DAY POPUP IMPORTANT EVENTS
673
674### Important Event Highlighting in Day Popup
675- Events from important namespaces now show ⭐ star icon
676- Golden gradient background highlight for important events
677- Golden border glow effect matching other views
678- Consistent styling across calendar grid, sidebar, and day popup
679
680### Technical Details
681- Added `importantNamespaces` check to `showDayPopup()` function
682- Added `.popup-event-important` and `.popup-event-star` CSS classes
683- Reads important namespaces from `container.dataset.importantNamespaces`
684
685## Version 6.12.2 (2026-02-14) - MULTI-DAY EVENT TIME FIX
686
687### Multi-Day Event End Time
688- End time now allows all times when end date differs from start date
689- Example: Event from 9:00 PM on Feb 28 to 5:00 AM on Feb 29 now works correctly
690- Same-day events still enforce end time > start time
691- Changing end date now triggers time validation update
692
693### Technical Details
694- `updateEndTimeOptions()` checks if `endDate !== startDate`
695- If multi-day, all time options are enabled
696- Added `onchange` handler to both start date and end date fields
697
698## Version 6.12.1 (2026-02-14) - TIME PICKER & EDIT DIALOG FIX
699
700### Improved Time Picker
701- Grouped time options by period (Morning, Afternoon, Evening, Night)
702- Much easier to navigate - no more scrolling through 96 options
703- End time options before start time are now hidden/disabled
704- Invalid end times automatically corrected when start time changes
705
706### Fixed Edit Event Dialog Draggability
707- Edit dialog is now properly draggable (was broken due to async AJAX)
708- Moved `makeDialogDraggable()` call inside the AJAX success callback
709- Removed redundant wrapper patch that didn't work with async code
710
711### Technical Details
712- Time picker uses `<optgroup>` for visual grouping
713- End time validation hides invalid options (not just disables)
714- Both Add and Edit dialogs now call `makeDialogDraggable()` directly
715
716## Version 6.12.0 (2026-02-14) - EVENT EDITOR DIALOG IMPROVEMENTS
717
718### Fixed Event Editor Dialog Draggability
719- Fixed duplicate event listener accumulation that caused performance degradation
720- Each time dialog opened, new drag listeners were added without removing old ones
721- Now properly cleans up old listeners before adding new ones
722- Added `cursor: grabbing` feedback while dragging
723- Dialog position resets when reopened (no more stuck positions)
724- Excluded close button from triggering drag
725
726### Optimized Time Selection Performance
727- Simplified `updateEndTimeOptions()` to be much faster
728- Removed expensive loop through 96 options checking style.display
729- Now just validates current selection and sets new value if invalid
730- Should eliminate freezing/lag when selecting start time
731
732### Technical Details
733- Added `_dragCleanup` function stored on handle element
734- Cleanup called before re-initialization
735- Removed unnecessary `setTranslate` helper function
736
737## Version 6.11.4 (2026-02-13) - JAVASCRIPT LOCALIZATION
738
739### JavaScript Frontend Localization
740- Added `getCalendarLang()` helper function
741- Added `getJsLangStrings()` PHP method
742- Embedded JSON language data in all render functions
743- Localized month names (full + short)
744- Localized dialog titles, confirmations, badges, empty states
745
746## Version 6.11.3 (2026-02-13) - SIDEBAR WIDGET LOCALIZATION
747
748### Sidebar Widget
749- Fixed `\n` in single-quoted strings → double-quoted for proper newlines
750- Localized "Runs every X minutes" cron descriptions
751- Event dialog labels, placeholders, options
752- Day names, ordinal positions, color names
753- Today/Tomorrow/Important section headers
754
755## Version 6.11.2 (2026-02-13) - ADMIN BACKEND LOCALIZATION
756
757### Admin Backend
758- Localized ~220 hardcoded strings in admin.php
759- AJAX JSON responses, redirect messages, error messages
760- Pattern names (Daily, Weekly, Monthly, etc.)
761
762## Version 6.11.1 (2026-02-13) - CONFIG IMPORT BUG FIX
763
764### Bug Fix
765- Fixed regex to accept both `return [` and `return array(` syntax
766- File: `admin.php` lines 5947, 6001
767
768## Version 6.10.6 (2026-02-13) - MANAGE RECURRING DIALOG LOCALIZATION
769
770### Localized Manage Recurring Series Dialog
771Complete translation of the "Manage" button dialog for recurring events:
772
773**Section Headers:**
774- "Manage Recurring Series" → "Wiederkehrende Serie verwalten"
775- "Extend Series" → "Serie erweitern"
776- "Trim Past Events" → "Vergangene Termine kürzen"
777- "Change Pattern" → "Muster ändern"
778- "Change Start Date" → "Startdatum ändern"
779- "Pause Series" / "Resume Series" → "Serie pausieren" / "Serie fortsetzen"
780
781**Labels & Buttons:**
782- All field labels (Add occurrences, Days apart, Remove before, New interval, etc.)
783- Action buttons (Extend, Trim, Change, Shift, Pause, Resume, Close)
784- Interval dropdown options (Daily, Weekly, Bi-weekly, Monthly, Quarterly, Yearly)
785- Help text and notes
786
787**Confirmation Dialogs:**
788- Trim confirmation with date
789- Respace confirmation
790- Shift confirmation
791
792### Added 60+ Language Strings for Dialogs
793Complete vocabulary for recurring event management in both English and German.
794
795### Note on Browser Validation Messages
796"Please fill out this field" is a browser-native message controlled by the browser's language setting, not our plugin.
797
798## Version 6.10.5 (2026-02-13) - DIALOG LOCALIZATION
799
800### Localized All JavaScript Dialogs
801
802**New Namespace Dialog:**
803- Prompt text with examples now in German
804- Invalid namespace error message
805
806**Rename Namespace Dialog:**
807- Prompt text with current name
808
809**Delete Confirmations:**
810- Delete selected events confirmation
811- Delete namespace confirmation
812- Delete recurring series confirmation
813
814**Trim Recurring Events:**
815- "Counting..." / "Zähle..."
816- "Trimming..." / "Kürze..."
817- "No past recurring events found" message
818- "Found X past recurring events" confirmation
819- Button text resets
820
821### Added 15+ New Dialog Strings
822Both English and German translations for all interactive prompts and confirmations.
823
824## Version 6.10.4 (2026-02-13) - COMPLETE MANAGE TAB LOCALIZATION
825
826### Fixed Remaining English Strings
827
828**Namespace Explorer Control Bar:**
829- "➡️ Move" → "➡️ Verschieben"
830- "➕ New Namespace" → "➕ Neuer Namensraum"
831- "�� Cleanup" → "�� Bereinigen"
832- "0 selected" → "0 ausgewählt"
833- "%d selected" → "%d ausgewählt"
834
835**Recurring Events Button Tooltips:**
836- "Edit title, time, namespace, pattern" → "Titel, Zeit, Namensraum, Muster bearbeiten"
837- "Extend, trim, pause, change dates" → "Erweitern, kürzen, pausieren, Daten ändern"
838- "Delete all occurrences" → "Alle Vorkommen löschen"
839
840**JavaScript Confirmation Messages:**
841- "No events selected" → "Keine Termine ausgewählt"
842- Delete confirmation with count
843- Delete namespace confirmation
844- "Scanning..." → "Scanne..."
845- "Cleaning..." → "Bereinige..."
846- "No empty namespaces found" message
847- "Found X item(s) to clean up" → "X Element(e) zum Bereinigen gefunden"
848- "Proceed with cleanup?" → "Mit Bereinigung fortfahren?"
849
850### Technical
851- Added adminLang JavaScript object with all translatable strings
852- All dynamic JavaScript messages now use language system
853
854## Version 6.10.3 (2026-02-13) - RECURRING EVENTS & DROP TARGET LOCALIZATION
855
856### Additional Localization for Manage Events Tab
857
858**Recurring Events Table:**
859- Search placeholder: "Wiederkehrende Termine suchen..."
860- Table headers: Titel, Namensraum, Muster, Zeitraum, Anzahl, Quelle, Aktionen
861- Source labels: Markiert / Erkannt (was Flagged / Detected)
862- Action buttons: Bearb. / Verwalten / Lö. (was Edit / Manage / Del)
863- Pattern badges: Täglich, Wöchentlich, Monatlich, Jährlich, Benutzerdefiniert
864- Footer: "Gesamt: X Serien" (was "Total: X series")
865- No results message
866
867**Namespace Explorer Drop Zones:**
868- Header: "�� Zielbereich" (was "Drop Target")
869- Drop hint: "Hier ablegen" (was "Drop here")
870- Default namespace label consistent
871
872### Added 25+ New Language Strings
873- Recurring table columns and labels
874- Pattern translations
875- Action button labels
876- Drop zone labels
877
878## Version 6.10.2 (2026-02-13) - MANAGE EVENTS TAB LOCALIZATION
879
880### Localized: Manage Events Tab (Complete)
881All text in the Manage Events admin tab now uses the language system:
882
883**Events Manager Section:**
884- Page title, section header, description
885- Statistics labels (Total Events, Namespaces, JSON Files, Recurring)
886- "Last scanned" timestamp label
887- Button labels (Re-scan Events, Export All Events, Import Events)
888- "View Breakdown by Namespace" expandable section
889- Table headers (Namespace, Events, Files)
890
891**Important Namespaces Section:**
892- Section header and description
893- Visual Effects descriptions (Calendar Grid, Event Sidebar, Sidebar Widget, Day Popup)
894- Save button and hint text
895
896**Cleanup Old Events Section:**
897- Section header and description
898- Radio button labels (By Age, By Status, By Date Range)
899- Age options (Delete events older than, months, years)
900- Status options (Completed tasks, Past events)
901- Date range labels (From, To)
902- Namespace filter label and placeholder
903- Preview and Delete button labels
904- JavaScript confirmation messages
905- Loading/error states
906
907**Recurring Events Section:**
908- Section header
909- Button labels (Trim All Past, Rescan)
910
911**Namespace Explorer Section:**
912- Section header and description
913- Search placeholder
914- Control bar buttons (All, None, Delete, Move to)
915- Datalist placeholder
916
917### Added 60+ New Language Strings
918Both English and German language files expanded with comprehensive admin terminology.
919
920## Version 6.10.1 (2026-02-13) - LANGUAGE SYSTEM FIX
921
922### Bug Fix: Language Files Not Working
923- Fixed `getMenuText()` to use `$this->getLang('menu')` instead of hardcoded string
924- Admin menu now correctly shows "Kalenderverwaltung" in German
925- Admin tabs now use language system:
926  - "Manage Events" → "Termine verwalten"
927  - "Update Plugin" → "Plugin aktualisieren"
928  - "Outlook Sync" → "Outlook-Sync"
929  - "Themes" → "Designs"
930
931### Added More Language Strings
932- Admin tab labels
933- Admin section headers (Event Browser, Important Namespaces, etc.)
934- Sync settings labels
935- Common button labels (Run Now, Download, Upload, Delete, etc.)
936
937## Version 6.10.0 (2026-02-13) - GERMAN LANGUAGE SUPPORT
938
939### New Feature: German Language Translation
940- Added complete German (de) language file
941- Expanded English language file with comprehensive translatable strings
942- Both files include 100+ translation strings covering:
943  - General terms (calendar, events, dates)
944  - Event fields (title, description, time, etc.)
945  - Actions (add, edit, delete, save, cancel)
946  - Task-related terms
947  - Recurring event options
948  - Days of week and months
949  - User messages and confirmations
950  - Search functionality
951  - Sync status messages
952  - Admin section labels
953  - Sidebar widget labels
954  - Time conflict warnings
955
956### Note
957The language strings are now available for future implementation throughout the plugin UI. Currently the admin menu uses the language system; other strings can be integrated as needed.
958
959## Version 6.9.9 (2026-02-13) - CRITICAL SEARCH FIX
960
961### Bug Fix: Month Search Not Working
962- **Root cause:** Function name collision - there were two `fuzzyMatch` functions
963  - `window.fuzzyMatch` (for namespace search autocomplete) returns a score number or `null`
964  - Local `fuzzyMatch` (for event search) returns `true`/`false`
965- When filtering events, the wrong function was being called, returning `null` for all events
966- **Fix:** Renamed event search functions to `eventSearchNormalize` and `eventSearchMatch`
967- Month search now works correctly on first load and after navigation
968
969### Also in this version
970- Fixed jumpToDate to properly hide search clear button after navigation
971- Removed debug logging from production code
972
973## Version 6.9.8 (2026-02-12) - SEARCH & UI FIXES
974
975### Bug Fixes
976
977**All-Dates Search Navigation Fixed**
978- Clicking a search result now properly navigates to that event's month
979- Opens the day popup showing the event details
980- Was calling non-existent `loadMonth()` - now uses correct `navCalendar()`
981- Clears search results and restores normal event list view
982
983**"No Events" Message Fixed**
984- No longer shows "No events match your search" when in all-dates mode
985- All-dates mode has its own results display; the month-mode message was incorrectly appearing
986
987**Add Button Layout Fixed**
988- Search bar no longer pushes the "+ Add" button off the right edge
989- Search container has constrained max-width (160px) and proper flex settings
990- Header has overflow:hidden to prevent layout issues
991
992**Important Event Stars Fixed**
993- Stars now appear on initial page load (PHP rendering added)
994- Stars positioned outside the bar using CSS ::before pseudo-element
995- Added overflow:visible to event-indicators and event-bar containers
996- Bar remains full width; star sits in the left margin area
997
998### Technical
999- Star uses `event-bar-has-star` class for first-day-only display
1000- jumpToDate() properly cleans up search state before navigation
1001
1002## Version 6.9.7 (2026-02-12) - IMPORTANT NAMESPACE IMPROVEMENTS
1003
1004### Bug Fix
1005- **AJAX refresh now preserves important namespace highlighting**
1006  - Important namespaces list now passed to JavaScript via data attribute
1007  - Highlighting persists when navigating between months
1008  - Works in both main calendar sidebar and standalone event panels
1009
1010### New Feature: Calendar Grid Star Icons
1011- **Important events now show ⭐ on their color bars** in the calendar grid
1012  - Small star appears on the first day of important events
1013  - Tooltip prefixed with ⭐ for important events
1014  - Visual distinction without cluttering the compact grid view
1015
1016### Admin Section Update
1017- **Improved Important Namespaces description** in Admin → Calendar → Manage Events
1018  - Now explains all visual effects:
1019    - Calendar Grid: ⭐ star on event bars
1020    - Event Sidebar: ⭐ star + highlighted background + accent border
1021    - Sidebar Widget: Dedicated "Important Events" section
1022    - Day Popup: Events shown with full details
1023  - Better example placeholder text
1024
1025### Technical
1026- Fixed PHP syntax error in fuzzy search (curly quotes replaced with escape sequences)
1027- Important namespaces loaded once and stored in container dataset for JavaScript access
1028
1029## Version 6.9.6 (2026-02-12) - FUZZY SEARCH & SIDEBAR HIGHLIGHTING
1030
1031### Fuzzy Search
1032- **Improved search matching:** Search is now more forgiving of punctuation differences
1033  - "fathers day" matches "Father's Day"
1034  - "new years" matches "New Year's Eve"
1035  - Smart quotes, apostrophes, dashes, and common punctuation are ignored
1036- **Multi-word search:** All words must be present but in any order
1037  - "birthday john" matches "John's Birthday Party"
1038- Works in both "this month" and "all dates" search modes
1039
1040### Important Namespace Highlighting (Calendar Sidebar)
1041- Events from important namespaces now highlighted in the main calendar's event list sidebar
1042- Same visual treatment as the itinerary sidebar widget:
1043  - Subtle theme-colored background tint
1044  - Right border accent bar
1045  - ⭐ star icon before event title
1046- Theme-specific colors:
1047  - Matrix: green tint
1048  - Purple: purple tint
1049  - Pink: pink tint
1050  - Professional: blue tint
1051  - Wiki: light blue tint
1052- Configure important namespaces in Admin → Calendar → Sync Settings
1053
1054## Version 6.9.5 (2026-02-12) - SEARCH MODE TOGGLE
1055
1056### New Feature: Search Scope Toggle
1057- **Search mode button** (��/��) added next to search input in both calendar views
1058- **Default mode** (��): Search only the current month's events (fast, local filtering)
1059- **All dates mode** (��): Search across ALL calendar data via AJAX
1060  - Click the �� button to toggle to �� (green highlight when active)
1061  - Requires at least 2 characters to search
1062  - Shows results with date, time, and namespace
1063  - Click any result to jump to that date and open the day popup
1064  - Limited to 50 results for performance
1065- Search placeholder text updates to indicate current mode
1066- Compact button design takes minimal space
1067
1068### UI Details
1069- Button sits flush with search input (no gap)
1070- Green highlight when "all dates" mode is active
1071- Results show full date (e.g., "Mon, Feb 12, 2026")
1072- Namespace badge shown for multi-namespace setups
1073
1074## Version 6.9.4 (2026-02-12) - POPUP IMPROVEMENTS & IMPORTANT HIGHLIGHTING
1075
1076### Features
1077- **Draggable Day Popup:** Calendar day popup window is now draggable by its header
1078  - Click and drag the header to move the popup
1079  - Header shows move cursor on hover
1080  - Clicking the close button (×) still closes normally
1081
1082- **Important Namespace Highlighting in Sidebar:**
1083  - Events from "important" namespaces (defined in Admin → Sync Settings) now have subtle highlighting
1084  - Theme-aware background tint (green for Matrix, purple for Purple, pink for Pink, blue for Professional/Wiki)
1085  - Right border accent bar for visual distinction
1086  - ⭐ star icon appears before event title
1087  - Works in Today, Tomorrow, and Important Events sections
1088
1089### Bug Fix
1090- **Fixed event display in day popup:** Long titles no longer cut off the edit/delete buttons
1091  - Event title now wraps to multiple lines instead of truncating
1092  - Actions buttons always visible
1093  - Time, date range, and namespace badges wrap properly
1094  - Improved flex layout for better responsiveness
1095
1096## Version 6.9.3 (2026-02-12) - ADMIN EDIT DIALOG CONSISTENCY
1097
1098### UI Improvement
1099- **Edit Recurring Event dialog** in Admin section now matches the main event editor exactly:
1100  - Same dark theme styling (#1e1e1e background, #2c3e50 header)
1101  - Same header layout with close button (×) in top-right corner
1102  - Same input styling (dark inputs with green accent borders)
1103  - Same footer with Cancel/Save buttons layout
1104  - Same recurrence options box styling
1105  - Consistent spacing, fonts, and colors throughout
1106
1107## Version 6.9.2 (2026-02-12) - MOBILE DIALOG FIX
1108
1109### Bug Fix
1110- **Fixed:** Description textarea now extends full width on mobile/phone view
1111  - Reduced form padding from 12px to 8px on screens ≤480px
1112  - Added explicit `width: 100%` and `box-sizing: border-box` to textarea
1113  - Ensured all form inputs/selects use full available width on mobile
1114
1115## Version 6.9.1 (2026-02-11) - ADMIN RECURRING EVENTS INTEGRATION
1116
1117### Admin Panel Updates
1118- **Enhanced Recurring Events Table:**
1119  - Pattern column now shows color-coded badges (daily=blue, weekly=green, monthly=orange, yearly=pink)
1120  - "First" column renamed to "Range" showing full date span (e.g., "Feb 1, 2026 → Dec 15, 2026")
1121  - Patterns now read from stored metadata when available, with smart fallback to detection
1122
1123- **Edit Recurring Series Dialog:**
1124  - Full recurrence pattern editing (not just simple intervals)
1125  - "Repeat every [N] [period]" with dropdown for Daily/Weekly/Monthly/Yearly
1126  - Weekly: Day-of-week checkboxes (Sun-Sat) with current days pre-selected
1127  - Monthly: Radio choice between "Day of month" or "Weekday pattern"
1128  - Ordinal weekday selector (First/Second/Third/Fourth/Fifth/Last + day dropdown)
1129  - Pre-populates all fields from stored recurrence metadata
1130  - Properly reschedules future events using new pattern
1131
1132- **Manage Series Dialog:**
1133  - Updated summary to show date range
1134  - Extend/trim/change pattern functions work with new patterns
1135
1136### Technical Updates
1137- `findRecurringEvents()` captures all recurrence metadata from events
1138- `formatRecurrencePattern()` generates human-readable pattern descriptions
1139- `detectRecurrencePattern()` enhanced to detect more interval variations
1140- `editRecurringSeries()` PHP handler processes new recurrence parameters
1141- `generateRecurrenceDates()` creates dates matching complex patterns
1142- Recurrence metadata preserved and updated across all event occurrences
1143
1144## Version 6.9.0 (2026-02-11) - ADVANCED RECURRING EVENTS
1145
1146### New Features
1147- **Enhanced Recurring Event Options:**
1148  - **Interval support:** Repeat every N days/weeks/months/years (e.g., every 3 months)
1149  - **Weekly day selection:** Choose specific days of the week (e.g., Mon, Wed, Fri)
1150  - **Monthly options:**
1151    - Day of month: Repeat on specific day (e.g., 15th of each month)
1152    - Ordinal weekday: Repeat on pattern (e.g., 2nd Wednesday, Last Friday)
1153  - **Examples now possible:**
1154    - Every 2 weeks on Monday and Thursday
1155    - Every 3 months on the 15th
1156    - Every other month on the 2nd Wednesday
1157    - Every year on the same date
1158    - Last Friday of every month
1159
1160### UI Changes
1161- Redesigned recurring options section with bordered container
1162- "Repeat every [N] [period]" input with interval number field
1163- Day-of-week checkboxes for weekly recurrence
1164- Radio buttons for monthly: "Day of month" vs "Weekday pattern"
1165- Ordinal dropdown (First/Second/Third/Fourth/Fifth/Last)
1166- Day dropdown (Sunday through Saturday)
1167- Helper text for end date field
1168
1169### Technical Details
1170- New parameters: recurrenceInterval, weekDays, monthlyType, monthDay, ordinalWeek, ordinalDay
1171- Recurrence pattern stored in event data for reference
1172- Maximum 365 occurrences (up from 100) to support daily events for a year
1173- Smart date iteration for complex patterns
1174
1175## Version 6.8.1 (2026-02-11) - ITINERARY DEFAULT STATE SETTING
1176
1177### New Feature
1178- **Added:** Option to set itinerary default state (expanded or collapsed)
1179  - New setting in Admin → Calendar → �� Sidebar Widget Settings
1180  - "�� Itinerary Section" with two options:
1181    - **Expanded** (default) - Show itinerary sections by default
1182    - **Collapsed** - Hide itinerary sections by default (click bar to expand)
1183  - Setting persists across page loads
1184  - Arrow indicator and content state reflect the saved preference on page load
1185
1186## Version 6.8.0 (2026-02-11) - COLLAPSIBLE ITINERARY
1187
1188### New Feature
1189- **Added:** Collapsible Itinerary bar in sidebar week view
1190  - New "ITINERARY" bar below the week calendar (styled like +ADD EVENT bar)
1191  - Click to collapse/expand the Today, Tomorrow, and Important Events sections
1192  - Arrow indicator shows expanded (▼) or collapsed (►) state
1193  - Smooth animation when collapsing/expanding
1194  - Clicking a day in the week grid shows that day's events ABOVE the Itinerary bar
1195  - Selected day events remain visible whether itinerary is expanded or collapsed
1196  - Shows "No upcoming events" message when there are no itinerary items
1197
1198### UI Layout (top to bottom)
11991. Header with clock/system stats
12002. +ADD EVENT bar
12013. Week grid (7 days)
12024. Selected day's events (appears when clicking a day)
12035. ITINERARY bar (click to collapse/expand)
12046. Today section (collapsible)
12057. Tomorrow section (collapsible)
12068. Important Events section (collapsible)
1207
1208## Version 6.7.9 (2026-02-11) - FIX EVENTS MANAGER STATISTICS
1209
1210### Bug Fixes
1211- **Fixed:** �� Events Manager showing inflated count (1195 instead of ~605)
1212  - The `scanDirectoryForStats()` function was counting ALL entries in JSON files
1213  - Now properly filters to only count date keys (`YYYY-MM-DD` format)
1214  - Now validates events have `id` and `title` before counting
1215  - Click "�� Rescan" to update the statistics with correct count
1216
1217## Version 6.7.8 (2026-02-11) - FILTER INVALID EVENTS
1218
1219### Bug Fixes
1220- **Fixed:** Event Manager showing "(untitled)" and "mapping" entries
1221  - Root cause: Calendar JSON files contain metadata keys (like "mapping") that were being parsed as events
1222  - Added date format validation (`YYYY-MM-DD`) to skip non-date keys
1223  - Added validation to require `id` and `title` fields for events
1224  - Applied fix to all event-reading functions:
1225    - `getEventsByNamespace()` - main event listing
1226    - `scanNamespaceRecursive()` - namespace scanning
1227    - `searchEvents()` - event search
1228    - `findEventsByTitle()` - title lookup
1229    - `deleteRecurringSeries()` - recurring deletion
1230    - `renameRecurringSeries()` - recurring rename
1231    - Recurring events scanner
1232    - Recurring cleanup function
1233
1234### Technical Details
1235- Date keys must match pattern `/^\d{4}-\d{2}-\d{2}$/`
1236- Events must have non-empty `id` and `title` fields
1237- All other entries in JSON files are now skipped
1238
1239## Version 6.7.7 (2026-02-11) - FIX PHP PATH & CLEAR LOG
1240
1241### Bug Fixes
1242- **Fixed:** "sh: 1: '/usr/bin/php': not found" error - removed escapeshellarg() which was adding quotes around the PHP path
1243- **Fixed:** "Could not clear log file" - added better error messages showing exact issue
1244- **Improved:** findPhpBinary() now uses is_executable() and `which php` for detection
1245- **Improved:** clearLogFile() now shows specific error (file not found, not writable, etc.)
1246
1247## Version 6.7.6 (2026-02-11) - FIX SYNC CONTROLS & LOGGING
1248
1249### Bug Fixes
1250- **Fixed:** Double log entries - sync script logs internally, removed redundant stdout capture
1251- **Fixed:** Manual sync not appearing in log - removed `--verbose` flag since script logs directly
1252- **Fixed:** Better error messages when sync fails
1253
1254### Improvements
1255- **Improved:** Sync now runs without `--verbose` flag - script logs to file internally
1256- **Improved:** Crontab warning if `>>` redirect is detected (causes duplicate entries)
1257- **Improved:** Log viewer now shows full path to log file
1258- **Improved:** Better pre-flight checks (directory creation, file permissions)
1259- **Improved:** PHP binary path is now properly escaped
1260
1261### Crontab Update Required
1262If your crontab has `>> sync.log 2>&1`, remove it to prevent duplicate log entries:
1263
1264**Before (causes duplicates):**
1265```
1266*/2 * * * * cd /var/www/html/dokuwiki/lib/plugins/calendar && php sync_outlook.php >> /var/www/html/dokuwiki/data/meta/calendar/sync.log 2>&1
1267```
1268
1269**After (correct):**
1270```
1271*/2 * * * * cd /var/www/html/dokuwiki/lib/plugins/calendar && php sync_outlook.php
1272```
1273
1274The script automatically logs to `data/meta/calendar/sync.log`.
1275
1276## Version 6.7.5 (2026-02-11) - FIX SYNC LOG OUTPUT
1277
1278### Bug Fixes
1279- **Fixed:** Sync log not showing output when running sync from admin panel
1280  - Added `--verbose` flag to sync command so output is captured
1281  - Sync output is now captured and written to the log file
1282  - Log directory is created if it doesn't exist
1283  - Better error handling if log directory isn't writable
1284  - Command being executed is logged for debugging
1285
1286### Changes
1287- Sync now runs in verbose mode when triggered from admin panel
1288- All sync output (stdout/stderr) is written to the log file
1289- Pre-flight check ensures log directory exists and is writable
1290
1291## Version 6.7.4 (2026-02-11) - FIX MANUAL SYNC EXECUTION
1292
1293### Bug Fix
1294- **Fixed:** "Could not open input file: sync_outlook.php" when running manual sync
1295  - The `$pluginDir` variable was missing from `runSync()` function
1296  - Added `$pluginDir = DOKU_PLUGIN . 'calendar'` before building the command
1297  - Sync now properly changes to the plugin directory before executing
1298
1299## Version 6.7.3 (2026-02-11) - FIX ADDITIONAL COUNT TYPE ERRORS
1300
1301### Bug Fix
1302- **Fixed:** Additional TypeError "count(): Argument #1 ($value) must be of type Countable|array, int given"
1303  - Fixed in `scanDirectoryForStats()` (line 5453)
1304  - Fixed in namespace delete function (line 4137)
1305  - Fixed in export function (line 5516)
1306  - Fixed in import function (line 5636)
1307  - All locations now check `is_array()` before calling `count()`
1308
1309## Version 6.7.2 (2026-02-11) - FIX EVENT MANAGER TYPE ERROR
1310
1311### Bug Fix
1312- **Fixed:** TypeError "count(): Argument #1 ($value) must be of type Countable|array, int given"
1313  - Added array type checks when iterating over calendar event data
1314  - Protects against corrupted JSON data where event lists may not be arrays
1315  - Added safeguards in `getEventsByNamespace()` and `scanNamespaceRecursive()`
1316
1317## Version 6.7.1 (2026-02-11) - BULK DELETE FOR BACKUPS
1318
1319### Changed
1320- **Improved:** Backup management now uses bulk selection and delete
1321  - Added checkboxes next to each backup file
1322  - Added "Select All" checkbox in the action bar
1323  - Added "��️ Delete Selected" button (appears when backups are selected)
1324  - Removed individual delete buttons from each row
1325  - Shows count of selected backups
1326  - Backups are deleted sequentially with visual feedback
1327
1328### UI
1329- Clean action bar at top of backup table with selection controls
1330- Selected count updates in real-time
1331- Rows fade out smoothly when deleted
1332
1333## Version 6.7.0 (2026-02-11) - IMPROVED RESTORE FUNCTION
1334
1335### Changed
1336- **Improved:** Restore function now uses DokuWiki's Extension Manager API
1337  - Uses `helper_plugin_extension_extension` for proper installation
1338  - Handles permissions correctly through DokuWiki's standard plugin installation process
1339  - Falls back to manual instructions if Extension Manager is not available
1340
1341### How It Works
1342When you click "�� Restore" on a backup:
13431. The plugin loads DokuWiki's extension helper
13442. Calls `installFromLocal()` with the backup ZIP file
13453. DokuWiki's Extension Manager handles file extraction and installation
13464. This ensures proper permissions and follows DokuWiki standards
1347
1348### Fallback
1349If the Extension Manager helper is not available, you'll be prompted to:
1350- Download the backup ZIP
1351- Go to Admin → Extension Manager → Install
1352- Upload the ZIP file manually
1353
1354## Version 6.6.9 (2026-02-11) - REMOVE RESTORE FUNCTION
1355
1356### Removed
1357- **Removed:** "Restore" button from backup management
1358- **Removed:** `restoreBackup()` PHP method
1359- **Removed:** `restoreBackup()` JavaScript function
1360
1361### Added
1362- **Added:** Informational note in backup section explaining how to restore:
1363  - Download the backup ZIP file
1364  - Go to Admin → Extension Manager → Install
1365  - Upload the ZIP file there
1366  - DokuWiki's extension manager handles installation safely with proper permissions
1367
1368### Reason
1369The restore function required write access to the plugin directory, which web servers typically don't have (and shouldn't have) for security reasons. Using DokuWiki's built-in Extension Manager is the safer and more reliable approach.
1370
1371## Version 6.6.8 (2026-02-11) - FIX THEME KEYS & FILE PERMISSIONS
1372
1373### Bug Fixes
1374- **Fixed:** "Undefined array key" warnings for wiki theme (pastdue_color, pastdue_bg, tomorrow_bg, etc.)
1375  - Added missing theme keys to `getWikiTemplateColors()` return array
1376
1377- **Fixed:** "Permission denied" errors for sync.log and sync_state.json
1378  - Moved sync files from plugin directory to `data/meta/calendar/` (writable location)
1379  - Updated sync_outlook.php, admin.php to use new paths
1380  - sync_config.php remains in plugin directory (must be manually configured)
1381
1382- **Fixed:** `findEventNamespace` now returns the actual DIRECTORY where event file lives
1383  - This ensures deletion works correctly when stored namespace differs from file location
1384
1385### Note on lang.php Permission Error
1386If you see a permission error for lang/en/lang.php, this occurs when trying to restore/update the plugin via admin panel and the web server doesn't have write access to the plugin directory. This is normal security - update via command line or FTP instead.
1387
1388## Version 6.6.7 (2026-02-11) - FIX NAMESPACE CHANGE BUG (PART 2)
1389
1390### Bug Fix
1391- **Fixed:** Events in the DEFAULT namespace (no namespace) could not be moved to other namespaces
1392  - Root cause: The comparison `$oldNamespace !== ''` was always FALSE for default namespace events
1393  - Changed to `$oldNamespace !== null` to properly distinguish between "event not found" (null) and "event in default namespace" ('')
1394  - This allows moving events FROM the default namespace TO any other namespace
1395  - Also fixed null coalescing for recurring events: `$oldNamespace ?? $namespace` instead of `$oldNamespace ?: $namespace`
1396
1397## Version 6.6.6 (2026-02-11) - FIX NAMESPACE CHANGE & DELETE BUGS
1398
1399### Bug Fixes
1400- **Fixed:** Changing an event's namespace now properly moves the event instead of creating a duplicate
1401  - Root cause: `findEventNamespace()` was searching in the NEW namespace instead of ALL namespaces
1402  - Now uses wildcard search `'*'` to find the existing event regardless of its current namespace
1403
1404- **Fixed:** Deleting an event no longer causes the calendar to filter by the deleted event's namespace
1405  - Root cause: After deletion, `reloadCalendarData()` was called with the deleted event's namespace
1406  - Now retrieves the calendar's original namespace from `container.dataset.namespace`
1407  - Also fixed in `saveEventCompact()` and `toggleTaskComplete()` for consistency
1408
1409## Version 6.6.5 (2026-02-11) - ADD AUTOCOMPLETE ATTRIBUTES
1410
1411### Improved
1412- Added `autocomplete="new-password"` to client secret input field
1413- Added `autocomplete="email"` to user email input field
1414- Added `autocomplete="off"` to client ID input field
1415- Follows browser best practices for form inputs
1416
1417## Version 6.6.4 (2026-02-11) - FIX GEOLOCATION VIOLATION
1418
1419### Bug Fix
1420- **Fixed:** Browser violation "Only request geolocation information in response to a user gesture"
1421- Weather widget now uses Sacramento as the default location on page load
1422- Geolocation is only requested when user **clicks** on the weather icon
1423- Click the weather icon to get your local weather (browser will prompt for permission)
1424- Weather icon shows tooltip "Click for local weather" and has pointer cursor
1425
1426## Version 6.6.3 (2026-02-11) - FIX MUTATIONOBSERVER ERROR
1427
1428### Bug Fix
1429- **Fixed:** `Failed to execute 'observe' on 'MutationObserver': parameter 1 is not of type 'Node'` error
1430- Root cause: MutationObserver tried to observe `document.body` before DOM was ready
1431- Added `setupMutationObserver()` function that waits for DOMContentLoaded before attaching observer
1432
1433## Version 6.6.2 (2026-02-11) - FIX CONFLICT TOOLTIP JAVASCRIPT LOADING
1434
1435### Bug Fix
1436- **Critical:** Fixed `showConflictTooltip is not defined` and `hideConflictTooltip is not defined` errors
1437- Root cause: `addAssets()` in action.php was loading empty `script.js` instead of `calendar-main.js`
1438- Changed `addAssets()` to load `calendar-main.js` directly
1439- Updated `script.js` to dynamically load `calendar-main.js` as a fallback mechanism
1440
1441## Version 6.6.1 (2026-02-11) - SECURITY FIXES
1442
1443### Security
1444- **Critical:** Removed `eval()` remote code execution vulnerability in config import
1445- **Critical:** Added admin authentication requirement to `get_system_stats.php` endpoint
1446- **High:** Added CSRF token verification to all write operations (save, delete, toggle)
1447- **High:** Fixed path traversal vulnerabilities in namespace delete/rename functions
1448- **High:** Added admin privilege verification to AJAX admin routes
1449
1450### Improved
1451- **Input Validation:** Date format (YYYY-MM-DD), time format (HH:MM), color format (#RRGGBB)
1452- **Input Validation:** Year range (1970-2100), month range (1-12), namespace format
1453- **Input Validation:** Recurrence type whitelist, title/description length limits
1454- **Debug Logging:** All debug logging now conditional on `CALENDAR_DEBUG` constant (off by default)
1455- **JSON Handling:** Added `safeJsonRead()` helper with proper error handling
1456- **Timezone:** Sync script now uses configured timezone instead of hardcoded value
1457
1458### Code Quality
1459- Documented intentional switch fallthrough in `get_system_stats.php`
1460- Standardized error response format
1461
1462## Version 6.6.0 (2026-02-11) - BACKUP & UI IMPROVEMENTS
1463
1464### Fixed
1465- **Backup:** Fixed recursive directory backup to properly include all subdirectories (including `lang/`)
1466- **Backup:** Now uses `SELF_FIRST` iterator to process directories before their contents
1467- **Backup:** Empty directories are now explicitly added with `addEmptyDir()` to preserve structure
1468
1469### UI Change
1470- **Namespace Explorer:** Cleanup status message now appears prominently at top of section
1471- Previously status message was at bottom, easy to miss after cleanup operations
1472
1473## Version 6.5.5 (2026-02-11) - FIX AJAX ROUTING & MOVE CLEANUP BUTTON
1474
1475### Bug Fix
1476- All admin AJAX actions (cleanup, rescan, extend, trim, pause, resume, change start/pattern) were returning "Unknown action"
1477- Root cause: AJAX calls go through `action.php`'s switch statement, not `admin.php`'s `handle()` method
1478- Added routing in `action.php`: new cases forward to `admin.php` via `routeToAdmin()` helper
1479- Added public `handleAjaxAction()` method in `admin.php` as the entry point from `action.php`
1480
1481### UI Change
1482- Moved "�� Cleanup" button from standalone section to inline next to "➕ New Namespace" in the control bar
1483- Status messages still appear below the namespace explorer
1484
1485## Version 6.5.4 (2026-02-11) - FIX PHP PARSE ERROR IN CLEANUP JS
1486
1487### Bug Fix
1488- Root cause: `style='color:...'` single quotes inside PHP `echo '...'` block terminated the PHP string prematurely
1489- PHP saw `color:#e74c3c` as unexpected PHP code instead of part of the JS string
1490- Fixed all 5 occurrences in cleanupEmptyNamespaces JS: escaped single quotes as `\'`
1491- Added `adminColors` JS object (text, bg, border) injected from PHP `$colors` at render time
1492- Cleanup detail text uses `adminColors.text` to respect DokuWiki template theme colors
1493
1494## Version 6.5.3 (2026-02-11) - FIX CLEANUP NAMESPACES PARSE ERROR
1495
1496### Bug Fix
1497- Fixed PHP parse error on line 1089 caused by `$colors['text']` PHP variable inside JS string concatenation
1498- The cleanup results detail list now uses hardcoded `#666` for text color instead of attempting PHP interpolation within JS runtime code
1499
1500## Version 6.5.2 (2026-02-11) - CLEANUP EMPTY NAMESPACES
1501
1502### New Feature
1503- "�� Cleanup Empty Namespaces" button added at bottom of Namespace Explorer section
1504- Dry-run scan first: shows exactly what will be removed with bullet-point details in confirm dialog
1505- Removes empty calendar folders (0 JSON files or all-empty JSON files) from any namespace
1506- Removes parent namespace directories if they become empty after calendar folder removal
1507- Root calendar directory is never removed
1508- AJAX-powered with inline status showing results after cleanup
1509- Page auto-reloads after 2 seconds to refresh the namespace explorer view
1510- Recursively scans all nested namespace directories via `findAllCalendarDirsRecursive()`
1511
1512## Version 6.5.1 (2026-02-11) - TRIM ALL PAST: SHOW COUNT BEFORE DELETE
1513
1514### Improved
1515- "Trim All Past" button now does a dry-run count before showing the confirmation dialog
1516- Confirmation shows exact count: "Found 47 past recurring events to remove"
1517- If zero found, shows "No past recurring events found to remove" instead of confirm
1518- PHP handler supports `dry_run` parameter that counts without deleting
1519
1520## Version 6.5.0 (2026-02-11) - BULK TRIM ALL PAST RECURRING EVENTS
1521
1522### Bulk Action
1523- Red "✂️ Trim All Past" button added next to the Rescan button in the Recurring Events section header
1524- Removes ALL past occurrences (before today) from EVERY recurring series in one click
1525- Only removes events with `recurring` or `recurringId` flags — non-recurring events are untouched
1526- Confirmation dialog required before execution
1527- AJAX-powered with inline status showing count removed, then auto-rescans the table
1528- Searches all calendar directories recursively
1529
1530## Version 6.4.9 (2026-02-11) - FIX RECURRING EDIT/DELETE: SEARCH ALL DIRECTORIES
1531
1532### Bug Fix
1533- Edit and Delete recurring series now search ALL calendar directories instead of building a path from the namespace field
1534- Root cause: event's `namespace` field (stored in JSON) can differ from the filesystem directory where the file lives
1535- Both handlers now use `findCalendarDirs()` to collect every calendar directory recursively
1536- Events matched by title AND namespace field (case-insensitive) for precise targeting
1537- Edit handler rewritten: rename/time/namespace updates in Pass 1, interval respace in Pass 2
1538- New `findCalendarDirs()` helper method for recursive directory discovery
1539
1540## Version 6.4.8 (2026-02-11) - FIX PHP PARSE ERROR IN MANAGE DIALOG
1541
1542### Bug Fix
1543- Rewrote `manageRecurringSeries()` JS function using string concatenation instead of template literals
1544- JS template literals (`${...}`) inside PHP echo blocks caused PHP to parse them as variable interpolation
1545- All inline onclick handlers now use `\x27` for single quotes to avoid escaping conflicts
1546
1547## Version 6.4.7 (2026-02-11) - RECURRING EVENTS: FULL MANAGEMENT CONTROLS
1548
1549### New "Manage" Button per Series
1550- Orange "Manage" button opens a comprehensive management dialog for each recurring series
1551
1552### Extend Series
1553- Add N new occurrences after the last event in the series
1554- Configurable interval: Daily, Weekly, Bi-weekly, Monthly, Quarterly, Yearly
1555- New events copy title, time, color, namespace, and recurring flag from the last event
1556
1557### Trim Past Events
1558- Remove all occurrences before a selected cutoff date
1559- Confirmation required before deletion
1560- Cleans up empty date keys and files automatically
1561
1562### Change Pattern
1563- Respace future occurrences with a new interval
1564- Past events are untouched; only future events are removed and re-created
1565- First future event becomes the anchor date
1566
1567### Change Start Date
1568- Shift ALL occurrences by the difference between old and new start date
1569- Events are removed from old positions and re-created at new positions
1570- Preserves spacing between all events
1571
1572### Pause/Resume
1573- Pause: adds ⏸ prefix and paused flag to all future occurrences
1574- Resume: removes ⏸ prefix and paused flag from all occurrences
1575- Button toggles based on whether series is currently paused
1576
1577### Infrastructure
1578- New shared `recurringAction()` JS helper for all AJAX management operations
1579- New `getRecurringSeriesEvents()` PHP helper for finding all events in a series
1580- Status messages shown inline in the management dialog
1581- Close button triggers automatic rescan to refresh the table
1582
1583## Version 6.4.6 (2026-02-11) - RECURRING EVENTS: RESCAN BUTTON & IMPROVED LOGIC
1584
1585### Rescan Button
1586- Green "�� Rescan" button added to the Recurring Events section header
1587- AJAX-powered: rescans all calendar data and refreshes the table without page reload
1588- Shows count of found series briefly after scan completes
1589
1590### Improved Detection Logic
1591- Events with `recurring: true` flag are now detected first (grouped by `recurringId`)
1592- Pattern-detected events (3+ same-title occurrences) are found separately and deduplicated
1593- New "Source" column shows ��️ Flagged (has recurring flag) vs �� Detected (pattern match)
1594- Median interval used for pattern detection instead of just first two dates (more robust)
1595- New patterns recognized: Quarterly, Semi-annual, and "Every ~N days" for custom intervals
1596- Empty/invalid titles and malformed date arrays are now skipped safely
1597- Dates are deduplicated before counting (prevents inflated counts from multi-day events)
1598- Nested namespace directories now scanned recursively
1599- Results sorted alphabetically by title
1600
1601## Version 6.4.5 (2026-02-11) - ADMIN VERSION HISTORY OVERHAUL
1602
1603### Version History Viewer
1604- All purple (#7b1fa2) accent colors replaced with green (#00cc07) to match admin theme
1605- Changelog parser now handles `###` subsection headers (rendered as green bold labels)
1606- Plain `- ` bullet items now parsed and categorized under their subsection
1607- Previously only `- **Type:** description` format was recognized
1608
1609### Current Release Button
1610- Green "Current Release" button added between nav arrows
1611- Jumps directly to the card matching the running version from plugin.info.txt
1612- Running version card shows green "RUNNING" badge and thicker green border
1613
1614## Version 6.4.4 (2026-02-11) - WIKI THEME: PAST EVENTS TOGGLE BACKGROUND
1615
1616### Fix
1617- Wiki theme past events pulldown (retracted state) now uses `__background_neu__` (`--cell-today-bg`)
1618- Previously used `--cell-bg` which appeared unthemed/white
1619
1620## Version 6.4.3 (2026-02-11) - WIKI THEME: DAY HEADERS BACKGROUND
1621
1622### Fix
1623- Wiki theme SMTWTFS day headers now use `__background_neu__` (`--cell-today-bg`) instead of `--background-header`
1624
1625## Version 6.4.2 (2026-02-11) - WIKI THEME: DAY HEADERS (INITIAL)
1626
1627### Wiki Theme Day Headers
1628- Added explicit CSS override for `.calendar-theme-wiki .calendar-day-headers`
1629- Day header text uses `--text-primary` (template's `__text__` color)
1630
1631## Version 6.4.1 (2026-02-11) - WIKI THEME: EVENT HIGHLIGHT
1632
1633### Fix
1634- Wiki theme event highlight (when clicking calendar bar) now uses `themeStyles.header_bg` (`__background_alt__`) instead of hardcoded blue (#dce9f5)
1635- Subtle shadow instead of blue glow
1636
1637## Version 6.4.0 (2026-02-11) - DARK READER: SECTION BAR COLOR MATCHING
1638
1639### Fix
1640- Wiki theme section left bar now uses a `<div>` with `background` instead of `border-left`
1641- Dark Reader maps the same color differently for border vs background properties, causing visual mismatch
1642- Both the bar and header now use `background`, so Dark Reader maps them identically
1643- Flex layout wrapper added for wiki theme sections
1644- Wiki fallback colors updated: `border` key now uses `#ccc` (matching `__border__`) instead of `#2b73b7`
1645
1646## Version 6.3.9 (2026-02-10) - WIKI THEME: SECTION BAR FIX (ATTEMPT)
1647
1648### Fix
1649- Simplified wiki section container — removed `wiki-section-container` class
1650- Added `background` from `$themeStyles['bg']` to section container
1651
1652## Version 6.3.8 (2026-02-10) - WIKI THEME: BUTTON & SECTION HEADER COLORS
1653
1654### Wiki Theme Buttons
1655- Nav buttons (< >), Today button, and panel buttons now use `__link__` color background with white text
1656- CSS overrides for `.calendar-theme-wiki .cal-nav-btn`, `.cal-today-btn`, panel buttons
1657
1658### Wiki Theme Section Headers
1659- Today: `__link__` background (accent/link color)
1660- Tomorrow: `__background_alt__` background (alternate background)
1661- Important: `__border__` background (border color)
1662- Each section now has a distinct color from the template palette
1663
1664## Version 6.3.7 (2026-02-10) - WIKI THEME CHECKBOX FIX
1665
1666### Fix
1667- Wiki theme checkbox override changed from `border-color` to full `border: 2px solid` shorthand
1668- Properly overrides the base rule which uses `border` shorthand
1669- Hover state also uses full shorthand
1670
1671## Version 6.3.6 (2026-02-10) - WIKI THEME CHECKBOX BORDER COLOR
1672
1673### Fix
1674- Wiki theme unchecked checkboxes now use `--border-main` (template's `__border__` color) for border
1675- Checked state fills with border color
1676- Hover state uses border color
1677- Applied to calendar, sidebar, and eventlist containers
1678
1679## Version 6.3.5 (2026-02-10) - WIKI THEME: ALLOW DARK READER ON HEADERS
1680
1681### Fix
1682- Wiki theme section headers (Today/Tomorrow/Important) no longer use `!important` or `-webkit-text-fill-color`
1683- Dark Reader can now freely adjust background, text color, and borders on wiki theme headers
1684- Clicked-day panel header and section border-left also unlocked for wiki theme
1685- All other themes (matrix/purple/pink/professional) retain full Dark Reader protection
1686
1687## Version 6.3.4 (2026-02-10) - WIKI THEME: BORDER COLOR FOR HEADERS & BADGES
1688
1689### Wiki Theme Color Remapping
1690- `border` (accent color) now maps to template's `__border__` instead of `__link__`
1691- This affects: section headers (Today/Tomorrow/Important), badges (TODAY, namespace), sidebar widget border, clicked-day panel, `--border-main` CSS variable
1692- `text_bright` still maps to `__link__` for link text and accent text
1693- Section headers all use the same `__border__` color for consistent appearance
1694- Updated COLOR_SCHEME mapping documentation
1695
1696## Version 6.3.3 (2026-02-10) - WIKI THEME SECTION HEADER TEXT COLOR
1697
1698### Fix
1699- Wiki theme Today/Tomorrow/Important section header text now uses `$themeStyles['text_primary']` (mapped from template's `__text__` color) instead of hardcoded white
1700- Clicked-day panel header text also uses template text color for wiki theme
1701- Professional theme remains white text on blue headers
1702
1703## Version 6.3.2 (2026-02-10) - FIX THEME NOT UPDATING ON SIDEBAR EVENTLIST
1704
1705### Bug Fix
1706- Added `$renderer->nocache()` to the render function
1707- DokuWiki was caching the rendered sidebar HTML, so theme changes made in admin were never reflected until the page was manually edited
1708- Now all calendar/eventlist/eventpanel outputs are rendered fresh on each page load, picking up the current theme from `calendar_theme.txt`
1709
1710## Version 6.3.1 (2026-02-10) - EVENTLIST THEMING
1711
1712### {{eventlist}} Theme Support
1713- Eventlist containers now receive theme class (`eventlist-theme-matrix`, etc.) and full CSS variable injection
1714- Dark themes get themed border + glow, light themes get subtle border
1715- Container background set from `$themeStyles['bg']` with `!important`
1716
1717### Eventlist CSS Theme Rules (all 3 dark themes)
1718- Title, header, time, date, body, links, strong, code, namespace badge, empty state
1719- Today header, clock, date — all with `color` + `-webkit-text-fill-color` `!important`
1720- Item borders, section backgrounds, code block backgrounds
1721- Full Dark Reader protection via same inline+CSS approach as calendar/sidebar
1722
1723## Version 6.3.0 (2026-02-10) - DARK READER COMPATIBILITY & COMPLETE THEMING
1724
1725### Dark Reader Browser Extension Compatibility
1726All dark themes (Matrix, Purple, Pink) now render correctly when the Dark Reader browser extension is active. The approach uses targeted inline `!important` styles and `-webkit-text-fill-color` overrides — no page-wide locks, no blanket CSS resets, no filter manipulation.
1727
1728**Protected elements:**
1729- Section headers (Today/Tomorrow/Important) — background, text color, text-fill-color
1730- Clicked-day panel header — background, text color, close button
1731- All badges (TODAY, PAST DUE, namespace, panel namespace, eventlist-simple) — background, text, text-fill-color
1732- Event titles, meta, descriptions — color with !important via CSS
1733- Day numbers, nav buttons, calendar day headers — color with !important via CSS
1734- System status bars — inline background !important on tracks and fills
1735- System tooltips — background, border-color, text color all set via setProperty with !important
1736- Section left border bars — border-left with !important
1737- Event color indicator bars — border-left-color with !important
1738- Sidebar section event text (Purple and Pink themes)
1739
1740### Complete CSS Variable Audit (41 conversions in v6.1.1)
1741- All remaining hardcoded colors in style.css converted to CSS variable references
1742- Calendar borders, text colors, backgrounds, input focus shadows, accent borders
1743- Only legitimate hardcodes remain (keyframe animations, theme-specific override blocks)
1744
1745### Semantic Color System
1746- New CSS variables: `--pastdue-color`, `--pastdue-bg`, `--pastdue-bg-strong`, `--pastdue-bg-light`
1747- New CSS variables: `--tomorrow-bg`, `--tomorrow-bg-strong`, `--tomorrow-bg-light`
1748- Injected into all 3 CSS var blocks (full calendar, event panel, sidebar widget)
1749- Today/Tomorrow/Important section colors now theme-derived instead of hardcoded
1750
1751### Section Headers Fully Themed
1752- Today/Tomorrow/Important headers use theme accent colors instead of fixed green/orange/purple
1753- Matrix: bright/standard/dim green, Purple: bright/standard/dim purple, Pink: hot/medium/light pink
1754- Professional: blue shades, Wiki: template-derived colors
1755- Dark theme headers use dark background color for text contrast
1756
1757### Pink Theme Enhancements
1758- **Heart today indicator** — day number displayed inside a ♥ with hot pink glow, centered via inline-flex, `pink-heart-beat` animation with realistic double-beat pulse
1759- **Firework button hover** — `pink-firework-burst` keyframe animation with multi-point radiating box-shadows, scale/brightness effects on hover, instant flash on click
1760- **Checkbox glow** — hot pink border with ambient glow, hover intensifies, checked fills with glow
1761
1762### All Theme Checkbox Theming
1763- Matrix: bright green border + green glow, Purple: purple border + purple glow
1764- Pink: hot pink border + pink glow (with enhanced ambient effect)
1765- Hover scales 1.1x with intensified glow on all themes
1766- Checked state fills with theme accent color + outer glow
1767
1768### System Tooltips Themed
1769- Both tooltip functions use theme-derived colors from `$themeStyles`
1770- Green tooltip: `text_bright`, Purple: `border`, Orange: `text_primary`
1771- Background from `$themeStyles['bg']`, divider borders use theme accent colors
1772- All properties set with `style.setProperty(prop, value, "important")`
1773
1774### Namespace Filter Badge Cleanup
1775- Removed inline namespace badge from event side panel header
1776- Filter indicator bar ("Filtering: namespace ✕") retained and working
1777- AJAX-based namespace filtering fully functional via onclick handlers
1778
1779## Version 6.1.0 (2026-02-10) - TODAY INDICATOR, BUTTON HOVER & CHECKBOXES
1780
1781### Today Indicator
1782- **Added:** Today's day number now shows as a filled circle with theme accent color background and contrasting text (like Google Calendar's today indicator)
1783- **Added:** Today cell has `--cell-today-bg` background AND a visible inset border glow on hover using `--border-main`
1784- **Added:** `.day-num` now uses `--text-primary` for color instead of relying on browser default
1785
1786### Button Hover/Click Theming
1787- **Fixed:** All buttons now use `filter: brightness(1.3)` on hover for a visible glow effect across all themes
1788- **Fixed:** All buttons use `filter: brightness(0.85)` on click/active for a press-down darkening effect
1789- **Fixed:** Cal nav buttons (‹/›), Today button, +Add Event button, panel nav/today/add buttons, dialog Save/Cancel buttons, month picker Go/Cancel buttons, popup + Add Event button — ALL now have visible themed hover/click feedback with shadow
1790- **Removed:** Generic `opacity: 0.9` hover which was barely visible on dark themes
1791
1792### Checkboxes Themed
1793- **Added:** Custom checkbox styling for `.task-checkbox` — uses `appearance: none` with themed border (`--border-main`), hover glow, and filled accent background when checked with ✓ mark
1794- **Added:** `accent-color: var(--text-bright)` on all dialog checkboxes (task, recurring) for consistent theme coloring
1795
1796### Form Input Text
1797- **Fixed:** `.input-sleek` now has `color: var(--text-primary)` — form text is visible on dark themes
1798- **Added:** `::placeholder` styling for inputs/textareas using `--text-dim`
1799
1800## Version 6.0.9 (2026-02-09) - FORM TEXT, CELL HOVER & GLOW TUNING
1801
1802### Form Input Text Fix
1803- **Fixed:** Form input text (`input-sleek`, `textarea-sleek`, `select`) had no `color` property — browser defaulted to black, invisible on dark themes. Now uses `var(--text-primary)`.
1804- **Added:** Themed placeholder text (`::placeholder`) for inputs/textareas
1805
1806### Button & Cell Hover Theming
1807- **Added:** Calendar day cells (`.cal-day`) now have a themed hover effect — background shifts to `--cell-today-bg` with an inset border glow using `--border-main`
1808- **Improved:** Nav buttons (`◄`/`►`) and Today button hover now show a themed glow + scale effect instead of just opacity change
1809- **Added:** Active (click) state for nav/today buttons with scale-down feedback
1810- **Improved:** Month picker hover now also shows a subtle theme shadow
1811
1812### Glow Reduced to 1px for Matrix/Purple
1813- Matrix and purple text glow reduced from 2px to 1px across: event titles, descriptions, meta, links, sidebar day numbers, sidebar event titles, sidebar dates
1814- Matrix clock pulse animation reduced from 6px/10px+15px to 2px/4px+6px
1815- Weather text glow reduced to 1px, clock to 2px
1816- Pink remains at 2px (barely noticeable)
1817
1818## Version 6.0.8 (2026-02-09) - LINKS, GLOW CONSISTENCY & PINK TONE-DOWN
1819
1820### Links Themed
1821- **Added:** `.cal-link` CSS class — all links rendered via `renderDescription()` now pick up theme accent color via `--text-bright`
1822- **Fixed:** Sidebar widget links (`a.cal-link`) inherit theme colors
1823- **Fixed:** Event list widget description links (`eventlist-widget-desc a`) use CSS vars
1824- **Fixed:** Simple event list body links/strong/code all themed
1825
1826### Text Glow Consistency
1827- **Added:** Subtle `text-shadow: 0 0 2px` glow on event titles, meta, and descriptions for all three dark themes (matrix, purple, pink) in the main calendar and event panel
1828- **Added:** Subtle link glow on dark themes
1829- **Added:** Matrix and purple now get the same barely-visible text glow that pink had on sidebar week grid day numbers and event titles
1830
1831### Pink Glow Toned Down
1832- **Reduced:** Sidebar today header box-shadow from `0 0 10px 0.4` to `0 0 6px 0.25`
1833- **Reduced:** Day number sparkle animation from 3px/6px+10px to 2px/3px
1834- **Reduced:** Today cell shimmer from 3px+5px / 8px+12px to 2px+3px / 4px+6px
1835- **Reduced:** Event bar glow pulse from 2px/4px+6px to 1px/2px+3px
1836- **Reduced:** Today hover glow from 10px+15px to 5px+8px
1837- **Reduced:** Event item glow from 2px/5px to 1px/3px
1838- **Reduced:** Calendar container glow from 8px to 5px
1839
1840### Other
1841- **Themed:** Sidebar weather, date, and clock text colors and glow via CSS vars
1842
1843## Version 6.0.7 (2026-02-09) - BADGES, BUTTONS & CONFLICT THEMING
1844
1845- **Fixed:** Namespace badges (`.namespace-badge`, `.event-namespace-badge`, `.panel-ns-badge`, standalone header badge) — all now use theme accent colors instead of hardcoded green/blue
1846- **Fixed:** TODAY badge uses `--border-main` for background instead of hardcoded purple
1847- **Fixed:** Conflict alert badge (`⚠️`) uses `--border-main` background and `--text-bright` border — matches theme accent
1848- **Fixed:** Conflict tooltip header background now set inline from theme vars (tooltip is appended to body, can't inherit CSS vars)
1849- **Fixed:** Conflict tooltip body items use themed text and border colors
1850- **Fixed:** Month picker Go/Cancel buttons themed (`--text-bright` for save, `--cell-bg` for cancel)
1851- **Fixed:** Calendar header month/year hover uses `--cell-today-bg` background
1852- **Fixed:** Inline search input border uses `--border-color`
1853- **Fixed:** Event list header border uses `--border-color`
1854
1855## Version 6.0.6 (2026-02-09) - COMPLETE TEXT THEMING
1856
1857- **Fixed:** Calendar header month/year title had hardcoded dark color — now uses `--text-primary`
1858- **Fixed:** Month/year picker hover used hardcoded gray background and green text — now uses `--cell-today-bg` and `--text-bright`
1859- **Fixed:** Event list items (titles, meta, descriptions, links, code blocks, bold text) — all now theme-aware via CSS vars
1860- **Fixed:** Completed/past event states used hardcoded grays — now use `--cell-bg`, `--text-dim`, `--cell-today-bg`
1861- **Fixed:** Scrollbar track/thumb colors now use theme vars
1862- **Fixed:** Namespace filter indicator (background, label, badge, close button) — all themed
1863- **Fixed:** Panel standalone month picker hover and namespace badge — themed
1864- **Fixed:** Calendar header border-bottom — now uses `--border-color`
1865
1866## Version 6.0.5 (2026-02-09) - THEMED BORDERS & EVENT PANEL
1867
1868- **Added:** Theme-colored border and glow for calendar container on matrix, purple, and pink themes — matches the sidebar widget's `2px solid` + `box-shadow` glow style. Professional and wiki themes unchanged (keep subtle 1px gray border).
1869- **Added:** Theme-colored border and glow for event panel (`{{eventpanel}}`) on dark themes using `[data-theme]` attribute selectors
1870- **Themed:** Event panel header (nav buttons, month title, today button, search input, add button) — all now use CSS vars
1871- **Themed:** Panel standalone header background and border
1872
1873## Version 6.0.4 (2026-02-09) - FULL DIALOG THEMING
1874
1875- **Fixed:** Day cell click popup (day-popup) used hardcoded white/gray colors — now fully theme-aware using CSS variables
1876- **Fixed:** Event add/edit dialog (dialog-content-sleek) had hardcoded white background and blue header — now uses theme colors
1877- **Fixed:** Month picker dialog had hardcoded white background and dark text — now themed
1878- **Fixed:** Popup event items, titles, times, descriptions, footer, add-event button, close button — all now use CSS vars with sensible fallbacks
1879- **Fixed:** Form elements (field labels, inputs, checkboxes, recurring options, color pickers) — all reference theme CSS vars
1880- **How it works:** `propagateThemeVars()` copies CSS variables from the calendar container to dialogs/popups (which are `position:fixed` or appended to `document.body`). All CSS selectors now reference these variables with fallbacks for graceful degradation.
1881
1882## Version 6.0.3 (2026-02-09) - MOVE IMPORTANT NAMESPACES TO MANAGE TAB
1883
1884- **Moved:** Important Namespaces section from Outlook Sync tab to Manage Events tab (between Events Manager and Cleanup sections)
1885- **Changed:** Section header color from purple (#9b59b6) to green (#00cc07) to match other Manage tab sections
1886- **Added:** Dedicated Save button and `save_important_namespaces` action handler — setting is now independent of Outlook config save
1887- **Fixed:** Saving Outlook config no longer overwrites important namespaces with the default value
1888
1889## Version 6.0.2 (2026-02-09) - FIREFOX DAY HEADER FIX
1890
1891- **Fixed:** In Firefox, the SMTWTFS day-of-week header row was rendering at the same height as calendar day cells (58px instead of 22px). Firefox ignores `max-height` on `<th>` table cells per CSS spec. Replaced `<thead><tr><th>` with a CSS grid `<div>` outside the table, making header height fully independent of table cell sizing. Works consistently across Chrome, Firefox, Safari, and Edge.
1892
1893## Version 6.0.1 (2026-02-09) - THEME PARAMETER FIX
1894
1895- **Fixed:** `theme=wiki` (and all `theme=` parameters) had no effect — all three render functions (`renderCompactCalendar`, `renderEventPanelOnly`, `renderSidebarWidget`) were ignoring the syntax parameter and always reading the admin global default via `getSidebarTheme()`
1896- **Fixed:** `renderEventDialog` also ignored theme context — now receives theme from its caller
1897- **How it works now:** `{{calendar theme=wiki}}`, `{{eventlist sidebar theme=purple}}`, `{{eventpanel theme=professional}}` all correctly apply the specified theme. The admin-configured default is used as fallback only when no `theme=` parameter is present.
1898
1899
1900## Version 6.0.0 (2026-02-09) - CODE AUDIT & v6 RELEASE
1901
1902- **Audited:** All PHP files (syntax.php, action.php, admin.php, sync_outlook.php) — balanced braces confirmed
1903- **Audited:** calendar-main.js (2,840 lines) — Node syntax check passed, 44 global functions verified
1904- **Audited:** style.css (3,218 lines) — balanced braces confirmed
1905- **Audited:** All admin manage tab action handlers verified functional (13 actions)
1906- **New:** Fresh README.md for GitHub with complete documentation
1907- **Includes all v5.5.x fixes:**
1908  - Delta sync for Outlook (hash-based change tracking, O(changes) not O(total))
1909  - Wiki theme sidebar section headers: distinct colors, no glow, themed day-click panel
1910  - Conflict badges on past events after AJAX navigation
1911  - Admin panel: green cleanup header, fixed broken CSS, endTime field name, cache clearing for all mutations, empty file cleanup, dead code removal
1912
1913## Version 5.5.9 (2026-02-09) - ADMIN MANAGE TAB CLEANUP
1914
1915- **Fixed:** Cleanup Old Events section header now green (#00cc07) to match all other section headers
1916- **Fixed:** Recurring stat card had broken CSS from `$colors['bg'] . '3e0'` concatenation — now uses proper `#fff3e0`
1917- **Fixed:** Same broken CSS pattern in Outlook Sync tab log warning
1918- **Fixed:** `editRecurringSeries` wrote `end_time` instead of correct `endTime` field name
1919- **Fixed:** `editRecurringSeries` used uninitialized `$firstEventDate` variable — now properly declared
1920- **Fixed:** `moveEvents` and `moveSingleEvent` could crash if event date key didn't exist in JSON — added `isset()` check
1921- **Fixed:** `moveSingleEvent` now cleans up empty date keys and deletes empty files after moving
1922- **Fixed:** `deleteRecurringSeries` now cleans up empty date keys and deletes empty JSON files
1923- **Fixed:** Export version was hardcoded as '3.4.6' — now reads dynamically from plugin.info.txt
1924- **Added:** `clearStatsCache()` helper method — all 11 mutation functions now properly clear the event stats cache
1925- **Removed:** Dead `move_events` action handler (all forms use `move_selected_events`)
1926- **Removed:** `console.log` debug statements from `sortRecurringTable` and `editRecurringSeries`
1927- **Removed:** Stale "NEW!" comment from Events Manager section
1928
1929## Version 5.5.8 (2026-02-09) - DELTA SYNC & WIKI THEME SIDEBAR POLISH
1930
1931- **Added:** Outlook sync now uses hash-based delta tracking — only new, modified, or deleted events hit the API
1932- **Added:** computeEventHash() hashes all sync-relevant fields (title, description, time, date, color, namespace, task status)
1933- **Added:** Sync state v2 format stores {outlookId, hash} per event; auto-migrates from v1 on first run
1934- **Added:** Delta analysis summary shows new/modified/unchanged/deleted counts before syncing
1935- **Changed:** Unchanged events are completely skipped (zero API calls) — O(changes) instead of O(total)
1936- **Changed:** Removed per-run duplicate scan (was re-querying every event); use --clean-duplicates when needed
1937- **Changed:** Wiki theme sidebar section headers now use distinct colors: orange (Today), green (Tomorrow), purple (Important)
1938- **Fixed:** Wiki theme sidebar section headers no longer have colored glow — clean shadow instead
1939- **Fixed:** Wiki theme week grid day-click panel header now uses accent color with white text
1940- **Fixed:** Removed invalid var(--__...__) CSS syntax from inline styles (only works in CSS files, not HTML attributes)
1941
1942## Version 5.5.7 (2026-02-09) - WIKI THEME SIDEBAR POLISH
1943
1944- **Fixed:** Sidebar Today/Tomorrow/Important headers now use three distinct colors (orange/green/purple) instead of similar greys
1945- **Fixed:** Sidebar section headers no longer glow on wiki theme (clean shadow like professional)
1946- **Fixed:** Week grid day-click panel header now uses theme accent color with white text instead of grey background
1947- **Fixed:** Removed invalid var(--__...__) CSS variable syntax from inline styles (DokuWiki replacements only work in CSS files)
1948- **Changed:** Wiki theme section header text now white for readability on colored backgrounds
1949- **Changed:** Week grid JS theme colors now use actual $themeStyles values
1950
1951## Version 5.5.6 (2026-02-09) - FIX CONFLICT BADGES ON PAST EVENTS AFTER AJAX
1952
1953- **Fixed:** Conflict badges now render on past events in JS rebuild path (were only in the future events branch)
1954
1955## Version 5.5.5 (2026-02-09) - FIX SIDEBAR CONFLICT TOOLTIP POSITIONING
1956
1957- **Fixed:** Sidebar widget conflict tooltips now display next to the badge instead of upper-left corner
1958- **Fixed:** Week grid conflict tooltips also fixed (same issue)
1959- **Changed:** All conflict badges now use unified showConflictTooltip() system with base64-encoded data
1960- **Removed:** data-tooltip CSS pseudo-element approach for conflict badges (replaced with JS tooltip)
1961
1962## Version 5.5.4 (2026-02-09) - FIX PAST EVENT EXPAND ON FIRST LOAD
1963
1964- **Fixed:** Past events now expand on click from initial page load (PHP-rendered items were missing onclick="togglePastEventExpand(this)" handler that the JS-rebuilt version had)
1965
1966## Version 5.5.3 (2026-02-09) - FIX CONFLICT TOOLTIP THEME COLORS
1967
1968- **Fixed:** Conflict tooltip now finds calendar container even when badge is inside day popup (appended to body)
1969- **Fixed:** Empty CSS variable values no longer produce invisible text — fallback defaults applied when var returns empty string
1970
1971## Version 5.5.2 (2026-02-09) - FIX CONFLICT TOOLTIP JSON PARSING
1972
1973- **Fixed:** Conflict tooltip data now base64-encoded to eliminate JSON parse errors from attribute quote escaping
1974- **Fixed:** Removed double htmlspecialchars encoding on conflict titles in PHP (was escaping titles then re-escaping the JSON)
1975- **Changed:** Both PHP and JS conflict badge rendering now use base64 for data-conflicts attribute
1976- **Changed:** showConflictTooltip decodes base64 first, falls back to plain JSON for compatibility
1977
1978## Version 5.5.1 (2026-02-09) - AJAX ROBUSTNESS & DIALOG THEMING
1979
1980- **Fixed:** Conflict tooltip badges now work after AJAX month navigation via event delegation
1981- **Fixed:** All document-level event listeners guarded against duplicate attachment from multiple script loads
1982- **Fixed:** showConflictTooltip closest() selector now matches actual container IDs (cal_, panel_, sidebar-widget-)
1983- **Fixed:** Description textarea in add/edit dialog now 2 lines tall instead of 1
1984- **Added:** Event delegation for conflict badge mouseenter/mouseleave (capture phase) survives DOM rebuilds
1985- **Added:** ESC key now also closes day popups and conflict tooltips
1986- **Changed:** Namespace click filter handler wrapped in guard to prevent duplicate binding
1987
1988## Version 5.5.0 (2026-02-09) - CSS VARIABLE REFACTOR & THEME CONSISTENCY
1989
1990- **Refactored:** All theming now driven by 15 CSS custom properties injected per calendar instance
1991- **Refactored:** Removed ~85 inline styles from syntax.php and ~41 from calendar-main.js
1992- **Refactored:** style.css is now the single source of truth for all visual styling
1993- **Fixed:** Day popup (click cell) now fully themed — CSS vars propagated from container
1994- **Fixed:** Add/Edit event dialog now themed in all contexts (main calendar, eventlist panel, sidebar widget)
1995- **Fixed:** Popup footer and "+ Add Event" button were using inline themeStyles — now use CSS vars
1996- **Added:** CSS variable injection for {{eventlist panel}} containers
1997- **Added:** CSS variable injection for {{eventlist sidebar}} widget containers
1998- **Added:** propagateThemeVars() helper ensures dialogs/popups always get theme regardless of DOM position
1999- **Added:** Wiki template mapping reads __link__ as accent color from style.ini
2000- **Added:** Detailed CSS variable reference table in style.css header comment
2001- **Added:** Detailed style.ini → CSS variable mapping documentation in syntax.php
2002- **Changed:** Conflict tooltip reads CSS vars via getComputedStyle instead of data-themeStyles
2003- **Changed:** Admin changelog now uses paginated timeline viewer instead of tiny scrolling div
2004- **Removed:** Dark Reader MutationObserver compatibility (CSS vars natively compatible)
2005- **Removed:** $isWikiTheme branching from PHP render path
2006
2007## Version 5.3.6 (2026-02-09) - HEARTS + CSS BACKGROUND FIX! ��
2008
2009### �� Added: Hearts in Explosions!
2010- **Added:** 8-12 pink hearts in each click explosion
2011- **Added:** Random sizes (12-28px) and directions
2012- **Result:** Extra love in every click! ��
2013
2014### �� Fixed: Background CSS Property for Dark Mode Readers
2015- **Fixed:** Added `background: transparent` to CSS (was completely removed)
2016- **Fixed:** Now CSS readers can detect and modify background property
2017- **Why:** Inline styles override transparent, but CSS readers can now see the property
2018- **Result:** Dark mode plugins can now change calendar backgrounds!
2019
2020### The CSS Problem
2021
2022**Why backgrounds weren't changing with dark mode readers**:
2023
2024**Before (v5.3.5)**:
2025```css
2026.calendar-compact-grid tbody td {
2027    /* background removed - set via inline style */
2028    border: 1px solid...
2029}
2030```
2031
2032**Problem**: CSS property doesn't exist!
2033- Dark mode readers look for `background` property in CSS
2034- Can't override what doesn't exist
2035- Inline styles work, but readers can't modify them
2036
2037**After (v5.3.6)**:
2038```css
2039.calendar-compact-grid tbody td {
2040    background: transparent;  /* Now exists! */
2041    border: 1px solid...
2042}
2043```
2044
2045**Solution**:
2046- Property exists in CSS
2047- Dark mode readers can override it
2048- Inline styles still override transparent
2049- Everyone wins!
2050
2051### What's Fixed
2052
2053**Elements now have background property**:
2054- `.calendar-compact-grid tbody td` ✓
2055- `.calendar-compact-grid tbody td:hover` ✓
2056- `.event-compact-item` ✓
2057- `.event-compact-item:hover` ✓
2058
2059**How it works**:
20601. CSS sets `background: transparent` (default)
20612. Inline styles set actual color (overrides transparent)
20623. Dark mode readers can override CSS property
20634. Works for everyone!
2064
2065### Hearts in Explosion
2066
2067**Click anywhere → Hearts explode!**
2068
2069**Heart details**:
2070- Count: 8-12 per explosion (random)
2071- Size: 12-28px (random variety)
2072- Emoji: �� (pink heart)
2073- Direction: Random 360°
2074- Speed: 60-140px travel
2075- Duration: 0.8-1.2s
2076- z-index: 9999999 (always visible)
2077
2078**Combined with**:
2079- 25 glowing particles
2080- 40 pixel sparkles
2081- Bright flash
2082- **Total: 73-77 elements!**
2083
2084### Visual Result
2085
2086**Click explosion**:
2087```
2088    �� ✦ • ✦ ��
2089  �� •         • ��
2090✦  •     ��!     •  ✦
2091  �� •         • ��
2092    �� ✦ • ✦ ��
2093
2094Hearts + Particles + Pixels!
2095```
2096
2097**Dark mode now works**:
2098```css
2099/* Dark mode reader can now do this: */
2100.calendar-compact-grid tbody td {
2101    background: #000 !important;  /* Works! */
2102}
2103```
2104
2105### Why Transparent Works
2106
2107**CSS Cascade**:
21081. CSS: `background: transparent` (lowest priority)
21092. Inline style: `background: #f5f5f5` (overrides CSS)
21103. Dark mode CSS: `background: #000 !important` (overrides inline)
2111
2112**Perfect solution!** ✓
2113
2114## Version 5.3.5 (2026-02-09) - PARTICLES ABOVE DIALOGS! ��
2115
2116### �� Fixed: Particles Now Appear Above All Dialogs!
2117- **Fixed:** Increased z-index to 9999999 for all particles
2118- **Fixed:** Particles now visible above event dialogs, month picker, etc.
2119- **Result:** Cursor effects and explosions always visible!
2120
2121### The Z-Index Problem
2122
2123**Before (v5.3.4)**:
2124- Particles: z-index 9999
2125- Dialogs: z-index 10000-999999
2126- **Particles hidden behind dialogs!**
2127
2128**After (v5.3.5)**:
2129- Particles: z-index 9999999
2130- Trail: z-index 9999998
2131- Pixels: z-index 9999997
2132- **Particles ALWAYS on top!**
2133
2134### What's Fixed
2135
2136✅ **Main particles** (explosion orbs)
2137✅ **Cursor trail** (glowing dots)
2138✅ **Pixel sparkles** (tiny bright stars)
2139✅ **Flash effect** (click burst)
2140
2141**All now appear above**:
2142- Event dialog popups
2143- Month picker
2144- Day popups
2145- Any modal overlays
2146
2147### Visual Result
2148
2149**Moving cursor over dialog**:
2150```
2151┌─────────────────────┐
2152│  Event Dialog       │
2153│  ✦ • ✦             │  ← Sparkles visible!
2154│    →  ✦             │  ← Cursor trail visible!
2155│  • ✦ •              │
2156└─────────────────────┘
2157```
2158
2159**Clicking on dialog**:
2160```
2161┌─────────────────────┐
2162│  ✦ • ✦ • ✦         │
2163│ •     ��!     •    │  ← Explosion visible!
2164│  ✦ • ✦ • ✦         │
2165└─────────────────────┘
2166```
2167
2168**Perfect visibility everywhere!** ✨
2169
2170## Version 5.3.4 (2026-02-09) - THEMED MONTH PICKER + DIALOG CURSOR FIX
2171
2172### �� Fixed: Month Picker Now Themed!
2173- **Fixed:** Jump to Month dialog now uses theme colors
2174- **Fixed:** Dialog background, borders, text all themed
2175- **Fixed:** Select dropdowns use theme colors
2176- **Fixed:** Buttons use theme accent colors
2177- **Result:** Month picker matches calendar theme!
2178
2179### �� Fixed: Cursor Effects Work in Dialogs!
2180- **Fixed:** Cursor trail now works when hovering over dialogs
2181- **Fixed:** Click explosions work when clicking inside dialogs
2182- **Technical:** Changed to capture phase event listeners
2183- **Result:** Effects work EVERYWHERE now!
2184
2185### Month Picker Theming
2186
2187**Before (v5.3.3)**:
2188- White background (hardcoded)
2189- Black text (hardcoded)
2190- No theme integration
2191- Looked out of place
2192
2193**After (v5.3.4)**:
2194- Dialog background: `theme.bg`
2195- Dialog border: `theme.border`
2196- Text color: `theme.text_primary`
2197- Dropdowns: `theme.cell_bg` + `theme.text_primary`
2198- Cancel button: `theme.cell_bg`
2199- Go button: `theme.border` (accent color)
2200
2201**Fully integrated!** ✅
2202
2203---
2204
2205### Theme Examples
2206
2207**Matrix Theme**:
2208```
2209┌─────────────────────────┐
2210│ Jump to Month           │ ← Dark bg, green border
2211│ [February ▼] [2026 ▼]  │ ← Dark dropdowns
2212│ [Cancel] [Go]           │ ← Green "Go" button
2213└─────────────────────────┘
2214```
2215
2216**Pink Theme**:
2217```
2218┌─────────────────────────┐
2219│ Jump to Month           │ ← Dark bg, pink border
2220│ [February ▼] [2026 ▼]  │ ← Dark dropdowns
2221│ [Cancel] [Go]           │ ← Pink "Go" button
2222└─────────────────────────┘
2223With sparkle effects! ✨
2224```
2225
2226**Professional Theme**:
2227```
2228┌─────────────────────────┐
2229│ Jump to Month           │ ← Clean bg, blue border
2230│ [February ▼] [2026 ▼]  │ ← Clean dropdowns
2231│ [Cancel] [Go]           │ ← Blue "Go" button
2232└─────────────────────────┘
2233```
2234
2235---
2236
2237### Dialog Cursor Fix
2238
2239**The Problem**:
2240Dialogs use `event.stopPropagation()` to prevent clicks from closing them. This blocked cursor effects!
2241
2242**The Solution**:
2243Use **capture phase** event listeners:
2244```javascript
2245// Before (bubbling phase)
2246document.addEventListener('click', handler)
2247
2248// After (capture phase)
2249document.addEventListener('click', handler, true)
22502251                                   Capture phase!
2252```
2253
2254**Capture phase runs BEFORE stopPropagation!**
2255
2256---
2257
2258### Now Works Everywhere
2259
2260✅ **Calendar area**
2261✅ **Event dialogs**
2262✅ **Month picker dialog**
2263✅ **Day popup dialogs**
2264✅ **Anywhere on screen**
2265
2266**No more blocked effects!** ��
2267
2268---
2269
2270### Technical Details
2271
2272**Event phases**:
2273```
22741. Capture phase   ← We listen here now!
22752. Target phase
22763. Bubbling phase  ← stopPropagation blocks this
2277```
2278
2279**By using capture phase**:
2280- Events caught before stopPropagation
2281- Works in all dialogs
2282- No conflicts with dialog logic
2283
2284---
2285
2286### All Dialogs Checked
2287
2288✅ **Month picker** - Now themed!
2289✅ **Event dialog** - Already themed
2290✅ **Day popup** - Already themed
2291
2292**Everything consistent!** ��
2293
2294---
2295
2296## Version 5.3.3 (2026-02-09) - TINY NEON PIXEL SPARKLES! ✨
2297
2298### ✨ Added: Bright Neon Pixel Sparkles Everywhere!
2299- **Added:** Tiny 1-2px bright pixel sparkles alongside cursor trail
2300- **Added:** 40 pixel sparkles in click explosions
2301- **Changed:** Cursor effects now work on ENTIRE SCREEN (not just calendar)
2302- **Result:** Maximum sparkle effect! ��
2303
2304### Tiny Pixel Sparkles
2305
2306**3-6 tiny bright pixels appear with each cursor movement!**
2307
2308**Characteristics**:
2309- Size: 1-2px (single pixel appearance!)
2310- Colors: Bright neon whites and pinks
2311  - Pure white (#fff) - 40% chance
2312  - Hot pink (#ff1493)
2313  - Pink (#ff69b4)
2314  - Light pink (#ffb6c1)
2315  - Soft pink (#ff85c1)
2316- Glow: Triple-layer shadow (intense!)
2317- Spawn: Random 30px radius around cursor
2318- Animations:
2319  - 50% twinkle in place
2320  - 50% float upward
2321
2322**Creates a cloud of sparkles around your cursor!**
2323
2324---
2325
2326### Click Explosion Enhanced
2327
2328**Now with 40 EXTRA pixel sparkles!**
2329
2330**Click anywhere → BIG BOOM**:
2331- 25 main glowing particles (6-10px)
2332- **40 tiny pixel sparkles (1-2px)** ← NEW!
2333- Bright white flash
2334- Total: 65+ visual elements!
2335
2336**Pixel sparkles in explosion**:
2337- Shoot outward in all directions
2338- Random distances (30-110px)
2339- Multiple bright colors
2340- Some twinkle, some explode
2341- Creates stellar effect!
2342
2343---
2344
2345### Entire Screen Coverage
2346
2347**Effects now work EVERYWHERE!**
2348
2349**Before (v5.3.2)**:
2350- Only inside calendar viewport
2351- Limited to calendar area
2352
2353**After (v5.3.3)**:
2354- Works on entire screen! ✓
2355- Cursor trail follows everywhere
2356- Click explosions anywhere
2357- Used `position: fixed` + `clientX/Y`
2358
2359**Move anywhere on the page for sparkles!**
2360
2361---
2362
2363### Visual Effect
2364
2365**Cursor movement**:
2366```
2367    • ✦ •       ← Tiny pixels
2368  •   ✦   •     ← Glowing trail
2369✦  •  →  •  ✦   ← Cursor
2370  •   ✦   •     ← Mixed sizes
2371    • ✦ •       ← Sparkle cloud
2372```
2373
2374**Click explosion**:
2375```
2376    ✦ • ✦ • ✦
2377  ✦ •         • ✦
2378✦  •    ��!    •  ✦
2379  ✦ •         • ✦
2380    ✦ • ✦ • ✦
2381
238265+ particles total!
2383```
2384
2385---
2386
2387### Sparkle Details
2388
2389**Trail Pixels** (3-6 per movement):
2390- Size: 1-2px
2391- Spawn rate: Every 40ms
2392- Spread: 30px radius
2393- Duration: 0.6-0.8s
2394- 50% twinkle, 50% float
2395
2396**Explosion Pixels** (40 total):
2397- Size: 1-3px
2398- Spread: 30-110px radius
2399- Duration: 0.4-0.8s
2400- All directions
2401- Intense glow
2402
2403**Main Particles** (25 total):
2404- Size: 4-10px
2405- Spread: 50-150px
2406- Full color palette
2407- Original firework effect
2408
2409---
2410
2411### Color Distribution
2412
2413**Pixel sparkles favor white**:
2414- 40% pure white (#fff) - brightest!
2415- 60% pink shades - variety
2416
2417**Creates brilliant sparkle effect!**
2418
2419---
2420
2421### Performance
2422
2423**Still optimized**:
2424- Trail: 30ms throttle
2425- Pixels: 40ms throttle
2426- Auto-cleanup
2427- Hardware accelerated
2428- Smooth 60fps
2429
2430**Lots of sparkles, zero lag!**
2431
2432---
2433
2434### Full-Screen Magic
2435
2436**Pink theme calendar detected**:
2437```javascript
2438if (pink calendar exists) {
2439    Enable effects for ENTIRE SCREEN
2440    Not just calendar area
2441}
2442```
2443
2444**Works everywhere on page!** ✨
2445
2446---
2447
2448## Version 5.3.2 (2026-02-09) - PINK FIREWORKS! ����
2449
2450### �� Changed: Glowing Pink Particles Instead of Emoji Sparkles!
2451- **Removed:** Emoji sparkle images (✨)
2452- **Added:** Glowing pink particle trail following cursor
2453- **Added:** FIREWORKS explosion on click!
2454- **Result:** Beautiful glowing effects, not emoji!
2455
2456### Glowing Cursor Trail
2457
2458**Pink glowing dots follow your cursor!**
2459- Small glowing pink orbs (8px)
2460- Radial gradient glow effect
2461- Multiple box-shadows for depth
2462- Fade out smoothly (0.5s)
2463- Throttled to 30ms for smoothness
2464
2465```
2466    •  •
2467  •  →  •   ← Your cursor
2468    •  •
2469```
2470
2471**Not emoji - actual glowing particles!**
2472
2473---
2474
2475### Click Fireworks! ��
2476
2477**Click anywhere on the calendar → BOOM!**
2478
2479**20 pink particles explode outward!**
2480- Radial burst pattern (360° coverage)
2481- Random speeds (50-150px travel)
2482- 4 shades of pink:
2483  - Hot pink (#ff1493)
2484  - Pink (#ff69b4)
2485  - Light pink (#ff85c1)
2486  - Very light pink (#ffc0cb)
2487- Random sizes (4-10px)
2488- Individual glowing halos
2489- Smooth explosion animation
2490
2491**Plus a bright flash at click point!**
2492- 30px radius glow
2493- Intense pink flash
2494- Fades quickly (0.3s)
2495
2496---
2497
2498### Visual Effect
2499
2500**Cursor movement**:
2501```
25022503      •  •  •
2504   •     →     •  ← Glowing trail
2505      •  •  •
25062507```
2508
2509**Click explosion**:
2510```
2511         •  •  •
2512      •           •
2513   •      BOOM!      •  ← 20 particles
2514      •           •
2515         •  •  •
2516```
2517
2518**All particles glow with pink halos!**
2519
2520---
2521
2522### Particle Details
2523
2524**Trail Particles**:
2525- Size: 8x8px
2526- Color: Pink radial gradient
2527- Shadow: 10px + 20px glow layers
2528- Duration: 0.5s fade
2529- Rate: 30ms throttle
2530
2531**Explosion Particles**:
2532- Size: 4-10px (random)
2533- Colors: 4 pink shades (random)
2534- Shadow: 10px + 20px glow (matches color)
2535- Duration: 0.6-1.0s (random)
2536- Pattern: Perfect circle burst
2537
2538**Flash Effect**:
2539- Size: 30x30px
2540- Color: Bright hot pink
2541- Shadow: 30px + 50px mega-glow
2542- Duration: 0.3s instant fade
2543
2544---
2545
2546### Performance
2547
2548**Optimized for smoothness**:
2549- Trail throttled to 30ms
2550- Auto-cleanup after animations
2551- CSS hardware acceleration
2552- No memory leaks
2553- Smooth 60fps
2554
2555**Won't slow you down!**
2556
2557---
2558
2559### Comparison
2560
2561**Before (v5.3.1)**:
2562- ✨ Emoji sparkle images
2563- Static unicode characters
2564- Limited visual impact
2565
2566**After (v5.3.2)**:
2567- �� Glowing pink particles
2568- Radial gradients + shadows
2569- Beautiful firework explosions
2570- Much more impressive!
2571
2572---
2573
2574### Only Pink Theme
2575
2576**These effects only appear**:
2577- On `.calendar-theme-pink` elements
2578- Other themes unaffected
2579- Pure pink magic! ��
2580
2581---
2582
2583## Version 5.3.1 (2026-02-09) - MYSPACE SPARKLE CURSOR! ✨✨✨
2584
2585### ✨ Added: MySpace-Style Sparkle Trail!
2586- **Added:** Sparkle cursor trail that follows your mouse (pink theme only!)
2587- **Toned down:** Reduced glow effects for better taste
2588- **Added:** Sparkles appear on cell hover
2589- **Added:** Sparkles on event hover (left and right sides!)
2590- **Added:** Sparkles on today's cell corners
2591- **Added:** Sparkles on navigation buttons
2592- **Added:** Sparkles in calendar header
2593- **Result:** Pure nostalgic MySpace magic! ✨
2594
2595### MySpace Sparkle Cursor Trail
2596
2597**The classic effect from 2006!**
2598- Sparkles follow your cursor as you move
2599- Random sizes (12-22px)
2600- Random slight offsets for natural feel
2601- Float up and fade out animation
2602- Throttled to 50ms (smooth, not laggy)
2603- Only on pink theme calendars
2604
2605```
26062607  ✨    ✨
2608✨   →   ✨  (cursor trail)
2609  ✨    ✨
26102611```
2612
2613**Pure nostalgia!**
2614
2615---
2616
2617### Sparkles Everywhere
2618
2619**Calendar cells**:
2620- Hover over any day → ✨ floats up
2621- Smooth 1.5s animation
2622- Centered sparkle
2623
2624**Event items**:
2625- Hover → ✨ on left side
2626- Hover → ✨ on right side
2627- Staggered animations (0.4s delay)
2628- Continuous twinkling
2629
2630**Today's cell**:
2631- ✨ in top-right corner (continuous)
2632- ✨ in bottom-left corner (offset timing)
2633- Always sparkling!
2634
2635**Navigation buttons**:
2636- Hover on < or > → ✨ appears top-right
2637- One-time float animation
2638
2639**Calendar header**:
2640- ✨ on left side (continuous)
2641- ✨ on right side (offset 1s)
2642- Always twinkling
2643
2644---
2645
2646### Toned Down Glows
2647
2648**Before (v5.3.0)**: TOO MUCH GLOW!
2649- 50px shadows
2650- 4-layer effects
2651- Overwhelming
2652
2653**After (v5.3.1)**: Just right!
2654- 8-15px max shadows (subtle)
2655- 2-layer effects
2656- Professional with personality
2657
2658**Glow reductions**:
2659- Today shimmer: 35px → 12px
2660- Today hover: 50px → 15px
2661- Event glow: 18px → 6px
2662- Badge pulse: 25px → 8px
2663- Container glow: 20px → 8px
2664
2665**Much more tasteful!**
2666
2667---
2668
2669### Sparkle Animations
2670
2671**sparkle-twinkle** (0.8s):
2672```
2673Opacity: 0 → 1 → 1 → 0
2674Scale: 0 → 1 → 1 → 0
2675Rotation: 0° → 180° → 360°
2676```
2677
2678**sparkle-float** (1.5s):
2679```
2680Moves up: 0px → -50px
2681Opacity: 0 → 1 → 1 → 0
2682Scale: 0 → 1 → 0.8 → 0
2683```
2684
2685**Pure MySpace magic!** ✨
2686
2687---
2688
2689### Where Sparkles Appear
2690
2691✅ **Cursor trail** (continuous while moving)
2692✅ **Calendar cells** (on hover)
2693✅ **Event items** (on hover, left + right)
2694✅ **Today's cell** (continuous, corners)
2695✅ **Navigation buttons** (on hover)
2696✅ **Calendar header** (continuous, sides)
2697
2698**Sparkles EVERYWHERE!** ✨✨✨
2699
2700---
2701
2702### Performance
2703
2704**Cursor trail**:
2705- Throttled to 50ms
2706- Auto-cleanup after 1s
2707- No memory leaks
2708- Smooth 60fps
2709
2710**CSS animations**:
2711- Hardware accelerated
2712- No JavaScript overhead (except cursor)
2713- Efficient transforms
2714
2715**Won't slow down your browser!**
2716
2717---
2718
2719### Pure Nostalgia
2720
2721**Remember MySpace profiles?**
2722- Glitter graphics ✨
2723- Sparkle cursors ✨
2724- Auto-play music �� (ok, we didn't add that)
2725- Animated GIF backgrounds
2726- Comic Sans everywhere
2727
2728**We brought back the sparkles!** ✨
2729
2730---
2731
2732### Theme Comparison
2733
2734**Other themes**: Professional and clean
2735**Pink theme**: ✨ SPARKLES EVERYWHERE ✨
2736
2737**Only pink theme gets the magic!**
2738
2739---
2740
2741## Version 5.3.0 (2026-02-09) - PINK BLING THEME EFFECTS! ✨��
2742
2743### �� Added: Pink Theme Gets BLING!
2744- **Added:** Shimmering animation for today's cell
2745- **Added:** Sparkling text effect on today's date
2746- **Added:** Glowing pulse for event bars
2747- **Added:** Gradient shimmer on headers
2748- **Added:** Extra glow on hover effects
2749- **Added:** Pulsing urgent badge for past due items
2750- **Result:** Pink theme is now FABULOUS! ✨
2751
2752### Shimmer Effects
2753
2754**Today's Cell**:
2755- Continuous shimmer animation (2 second loop)
2756- Multi-layer glow effect
2757- Pink and hot pink overlapping shadows
2758- Pulses from subtle to intense
2759- Extra sparkle on hover
2760
2761**Today's Date Number**:
2762- Sparkle animation (1.5 second loop)
2763- Text shadow glow effect
2764- Slight scale pulse (100% → 105%)
2765- Pink to hot pink shadow transition
2766
2767### Glow Effects
2768
2769**Event Bars**:
2770- Continuous glow pulse (2 second loop)
2771- Uses event's own color
2772- Adds pink accent glow layer
2773- Creates depth and dimension
2774
2775**Event Items**:
2776- Subtle base glow
2777- Enhanced glow on hover
2778- Slight slide animation on hover
2779- Professional yet playful
2780
2781### Gradient Shimmer
2782
2783**Headers**:
2784- Animated gradient background
2785- 3-color pink gradient flow
2786- Smooth 3-second animation
2787- Creates movement and life
2788- Applies to calendar header and event list header
2789
2790### Badge Effects
2791
2792**TODAY Badge**:
2793- Sparkle animation
2794- Synchronized with today's date
2795- Extra prominence
2796
2797**PAST DUE Badge**:
2798- Urgent pulsing effect (1 second loop)
2799- Orange glow intensifies
2800- Draws attention to urgent items
2801- Faster pulse for urgency
2802
2803### Container Bling
2804
2805**Main Container**:
2806- Multi-layer pink glow
2807- Soft outer shadow
2808- Creates floating effect
2809- Subtle but elegant
2810
2811### Animation Details
2812
2813**pink-shimmer** (2s loop):
2814```
2815Start: Subtle 5px glow
2816Peak:  Intense 35px multi-layer glow
2817End:   Back to subtle
2818```
2819
2820**pink-sparkle** (1.5s loop):
2821```
2822Start: Base glow + scale 1.0
2823Peak:  Intense glow + scale 1.05
2824End:   Back to base
2825```
2826
2827**pink-glow-pulse** (2s loop):
2828```
2829Start: Small glow (3px, 6px)
2830Peak:  Large glow (6px, 12px, 18px)
2831End:   Back to small
2832```
2833
2834**pink-gradient-shimmer** (3s loop):
2835```
2836Gradient flows across element
2837Creates wave effect
2838Smooth continuous motion
2839```
2840
2841**pink-pulse-urgent** (1s loop - faster!):
2842```
2843Start: Orange glow 5px
2844Peak:  Orange glow 25px (intense)
2845End:   Back to 5px
2846```
2847
2848### Visual Experience
2849
2850**Today's Cell**:
2851```
2852┌──┬──┬──┬──┬──┬──┬──┐
2853│  │  │ ✨ │  │  │  │  │  ← Shimmers constantly
2854│  │  │[9]│  │  │  │  │  ← Sparkles
2855│  │  │ ✨ │  │  │  │  │  ← Glows and pulses
2856└──┴──┴──┴──┴──┴──┴──┘
2857```
2858
2859**Event Bars**:
2860```
2861━━━━━━━  ← Glows and pulses
2862━━━━━━━  ← Each bar animated
2863━━━━━━━  ← Creates rhythm
2864```
2865
2866**Headers**:
2867```
2868╔═════════════════════╗
2869║ ~~~~~~~~~~ ║  ← Gradient flows
2870║   February 2026     ║  ← Shimmer effect
2871╚═════════════════════╝
2872```
2873
2874### Theme Comparison
2875
2876**Before (v5.2.8)**:
2877- Pink colors
2878- Static elements
2879- Standard shadows
2880
2881**After (v5.3.0)**:
2882- Pink colors ✓
2883- Animated shimmer ✨
2884- Sparkling effects ��
2885- Glowing pulses ✨
2886- Moving gradients ��
2887- BLING! ��
2888
2889### Performance
2890
2891**All animations**:
2892- Hardware accelerated (transform, opacity)
2893- Smooth 60fps
2894- CSS animations (no JavaScript)
2895- Minimal CPU usage
2896- Disabled in reduced-motion preference
2897
2898### Only for Pink Theme
2899
2900**Effects only apply when**:
2901```css
2902.calendar-theme-pink
2903```
2904
2905**Other themes unaffected**:
2906- Matrix stays Matrix
2907- Professional stays Professional
2908- Purple stays Purple
2909- Wiki stays clean
2910
2911**Pink gets all the bling!** ✨��
2912
2913### Use Cases
2914
2915**Perfect for**:
2916- Celebrating occasions
2917- Fun team calendars
2918- Personal style expression
2919- Standing out
2920- Making calendar time fabulous
2921
2922**Not just pink, but BLING pink!** ��✨
2923
2924## Version 5.2.8 (2026-02-09) - TODAY BOX USES THEME COLORS
2925
2926### �� Fixed: Today's Date Box Now Uses Theme Colors
2927- **Fixed:** Today's day number box now uses theme border color
2928- **Fixed:** Text color adapts to theme (white for dark themes, bg color for light)
2929- **Result:** Today box matches the theme perfectly!
2930
2931### The Issue
2932
2933Today's date had a hardcoded green box:
2934
2935**In style.css**:
2936```css
2937.cal-today .day-num {
2938    background: #008800;  /* Hardcoded green! */
2939    color: white;
2940}
2941```
2942
2943**Didn't adapt to themes at all!**
2944
2945### The Fix
2946
2947**Now uses theme colors**:
2948```php
2949// Today's day number
2950if ($isToday) {
2951    background: $themeStyles['border'],  // Theme's accent color!
2952    color: (professional theme) ? white : bg color
2953}
2954```
2955
2956### Theme Examples
2957
2958**Matrix Theme**:
2959- Box background: `#00cc07` (matrix green)
2960- Text color: `#242424` (dark background)
2961
2962**Purple Theme**:
2963- Box background: `#9b59b6` (purple)
2964- Text color: `#2a2030` (dark background)
2965
2966**Professional Theme**:
2967- Box background: `#4a90e2` (blue)
2968- Text color: `#ffffff` (white text)
2969
2970**Pink Theme**:
2971- Box background: `#ff1493` (hot pink)
2972- Text color: `#1a0d14` (dark background)
2973
2974**Wiki Theme**:
2975- Box background: Template's `__border__` color
2976- Text color: Template's `__background_site__` color
2977
2978### Visual Result
2979
2980**Matrix Theme**:
2981```
2982┌──┬──┬──┬──┬──┬──┬──┐
2983│ 1│ 2│ 3│[4]│ 5│ 6│ 7│
2984└──┴──┴──┴──┴──┴──┴──┘
29852986    Green box (#00cc07)
2987```
2988
2989**Professional Theme**:
2990```
2991┌──┬──┬──┬──┬──┬──┬──┐
2992│ 1│ 2│ 3│[4]│ 5│ 6│ 7│
2993└──┴──┴──┴──┴──┴──┴──┘
29942995    Blue box (#4a90e2)
2996```
2997
2998**Wiki Theme**:
2999```
3000┌──┬──┬──┬──┬──┬──┬──┐
3001│ 1│ 2│ 3│[4]│ 5│ 6│ 7│
3002└──┴──┴──┴──┴──┴──┴──┘
30033004    Template border color
3005```
3006
3007### Implementation
3008
3009**Inline styles added**:
3010- Background uses `$themeStyles['border']` (theme accent)
3011- Text color uses `$themeStyles['bg']` for contrast
3012- Special case: Professional theme uses white text
3013- All with `!important` to override CSS
3014
3015**CSS cleaned up**:
3016- Removed hardcoded `#008800` background
3017- Removed hardcoded `white` color
3018- Kept structural styles (border-radius, font-weight)
3019
3020### Benefits
3021
3022**Theme Consistency**:
3023- Today box matches theme accent color
3024- Proper contrast with background
3025- Professional appearance
3026
3027**Automatic Adaptation**:
3028- Works with all themes
3029- Works with custom wiki template colors
3030- No manual adjustment needed
3031
3032**Visual Harmony**:
3033- Border color used throughout theme
3034- Today box reinforces theme identity
3035- Consistent design language
3036
3037## Version 5.2.7 (2026-02-09) - FIX GRID BACKGROUND MISMATCH
3038
3039### �� Fixed: Table Grid Background Now Matches Cells
3040- **Found:** `grid_bg` was using `__background_alt__` (different from cells!)
3041- **Fixed:** Changed `grid_bg` to use `__background_site__` (same as cells)
3042- **Result:** Table background no longer shows through cells!
3043
3044### The Layer Problem
3045
3046The table itself had a DIFFERENT background color than its cells!
3047
3048**Before (v5.2.6)**:
3049```php
3050'grid_bg' => __background_alt__,     // Table background (#e8e8e8)
3051'cell_bg' => __background_site__,    // Cell background (#f5f5f5)
3052```
3053
3054**The table background was showing THROUGH the cells!**
3055
3056### Why This Happened
3057
3058**Visual layers**:
3059```
3060Table Element
3061├─ background: __background_alt__ (#e8e8e8)  ← Different!
3062└─ Cells
3063    └─ background: __background_site__ (#f5f5f5)  ← Different!
3064
3065The table background shows through any gaps!
3066```
3067
3068### The Fix
3069
3070**After (v5.2.7)**:
3071```php
3072'grid_bg' => __background_site__,    // Table background (#f5f5f5) ✓
3073'cell_bg' => __background_site__,    // Cell background (#f5f5f5) ✓
3074```
3075
3076**NOW THEY MATCH!**
3077
3078### Where grid_bg Is Used
3079
3080The table element itself:
3081```html
3082<table style="background: __background_alt__">  ← Was showing through!
3083    <tbody>
3084        <tr>
3085            <td style="background: __background_site__">1</td>
3086        </tr>
3087    </tbody>
3088</table>
3089```
3090
3091Even with cell inline styles, the TABLE background shows through!
3092
3093### All Background Sources Now Unified
3094
3095**Everything now uses __background_site__**:
3096- `bg` → __background_site__ ✓
3097- `header_bg` → __background_site__ ✓
3098- `grid_bg` → __background_site__ ✓ (JUST FIXED!)
3099- `cell_bg` → __background_site__ ✓
3100
3101**Perfect consistency!** ��
3102
3103### Why It Was Different
3104
3105**Originally the grid was meant to show borders**:
3106- `grid_bg` was `__background_alt__` (slightly different)
3107- Created visual separation between cells
3108- But with transparent/thin cells, it showed through!
3109
3110**Now unified for consistency!**
3111
3112### Visual Result
3113
3114**Before (layers visible)**:
3115```
3116┌─────────────────┐
3117│ Grid (#e8e8e8)  │ ← Showing through!
3118│  ┌──┬──┬──┐     │
3119│  │  │  │  │     │ ← Cells (#f5f5f5)
3120│  └──┴──┴──┘     │
3121└─────────────────┘
3122```
3123
3124**After (unified)**:
3125```
3126┌─────────────────┐
3127│ Grid (#f5f5f5)  │ ← Same color!
3128│  ┌──┬──┬──┐     │
3129│  │  │  │  │     │ ← Cells (#f5f5f5)
3130│  └──┴──┴──┘     │
3131└─────────────────┘
3132Perfect match!
3133```
3134
3135### Complete Background Mapping
3136
3137**All using __background_site__ now**:
3138- Main container background
3139- Left panel background
3140- Right panel background
3141- Eventlist background
3142- Calendar grid background ← JUST FIXED
3143- Calendar cell backgrounds
3144- Event item backgrounds
3145- Clock header background
3146- Search input background
3147- Past events toggle
3148
3149**EVERYTHING UNIFIED!** ��
3150
3151## Version 5.2.6 (2026-02-09) - REMOVE CONTAINER BACKGROUNDS
3152
3153### �� Fixed: Removed Container Backgrounds Showing Through
3154- **Found:** `.calendar-compact-container` had `background: #ffffff;`
3155- **Found:** `.calendar-compact-left` had `background: #fafafa;`
3156- **Found:** `.calendar-compact-right` had `background: #ffffff;`
3157- **Found:** `.event-search-input-inline` had `background: white;`
3158- **Found:** `.past-events-toggle` had `background: #f5f5f5;`
3159- **Result:** Container backgrounds no longer show through cells!
3160
3161### The Container Problem
3162
3163The parent containers had hardcoded backgrounds that were showing through!
3164
3165**Container backgrounds (lines 4-91)**:
3166```css
3167.calendar-compact-container {
3168    background: #ffffff;  /* ← Main container! */
3169}
3170
3171.calendar-compact-left {
3172    background: #fafafa;  /* ← Left panel (calendar side)! */
3173}
3174
3175.calendar-compact-right {
3176    background: #ffffff;  /* ← Right panel (events side)! */
3177}
3178```
3179
3180**These were showing through the cells and events!**
3181
3182### Why Containers Matter
3183
3184Even though cells have inline styles, if the CONTAINER behind them has a different background, it can show through:
3185
3186```
3187Container (#fafafa)           ← Showing through!
3188   └─ Table Cell (#f5f5f5)    ← Transparent areas
3189      └─ Content
3190```
3191
3192### All Backgrounds Removed
3193
3194**v5.2.6 removes**:
3195- `.calendar-compact-container` background
3196- `.calendar-compact-left` background
3197- `.calendar-compact-right` background
3198- `.event-search-input-inline` background
3199- `.past-events-toggle` background & hover
3200
3201**v5.2.5 removed**:
3202- `.calendar-compact-grid tbody td` background
3203- `.calendar-compact-grid thead th` background
3204
3205**v5.2.4 removed**:
3206- `.cal-empty`, `.cal-today`, `.cal-has-events` backgrounds
3207
3208**v5.2.3 removed**:
3209- `.event-compact-item` background
3210
3211**ALL container and element backgrounds eliminated!** ��
3212
3213### What Should Work Now
3214
3215**Calendar cells**: No container background showing through ✓
3216**Event items**: No container background showing through ✓
3217**Search bar**: Uses template color ✓
3218**Past events toggle**: Uses template color ✓
3219
3220### Complete List of Fixes
3221
3222**Containers**:
3223- Main container ✓
3224- Left panel ✓
3225- Right panel ✓
3226
3227**Elements**:
3228- Table cells ✓
3229- Event items ✓
3230- Search input ✓
3231- Past events toggle ✓
3232
3233**EVERYTHING removed!** ��
3234
3235### Critical: Clear Caches
3236
3237**Must clear caches or won't work**:
32381. Hard refresh: Ctrl+Shift+R (5 times!)
32392. Clear DokuWiki cache
32403. Close browser completely
32414. Reopen and test
3242
3243**CSS caching is EXTREMELY persistent!**
3244
3245## Version 5.2.5 (2026-02-09) - REMOVE TABLE CELL CSS BACKGROUNDS
3246
3247### �� Fixed: Removed Hardcoded Backgrounds from Table Cells
3248- **Found:** `.calendar-compact-grid tbody td` had `background: #ffffff;`!
3249- **Found:** `.calendar-compact-grid tbody td:hover` had `background: #f0f7ff;`!
3250- **Found:** `.calendar-compact-grid thead th` had `background: #f8f8f8;`!
3251- **Fixed:** Removed ALL hardcoded backgrounds from table CSS
3252- **Result:** Calendar table cells finally use template colors!
3253
3254### The REAL Culprits
3255
3256The generic table CSS was overriding everything!
3257
3258**In style.css (lines 307-356)**:
3259```css
3260.calendar-compact-grid thead th {
3261    background: #f8f8f8;  /* ← Header cells hardcoded! */
3262}
3263
3264.calendar-compact-grid tbody td {
3265    background: #ffffff;  /* ← ALL table cells hardcoded! */
3266}
3267
3268.calendar-compact-grid tbody td:hover {
3269    background: #f0f7ff;  /* ← Hover state hardcoded! */
3270}
3271```
3272
3273**These apply to ALL `<td>` and `<th>` elements in the calendar table!**
3274
3275### Why This Was the Last One
3276
3277**CSS Specificity Order**:
32781. `.calendar-compact-grid tbody td` (generic - applies to ALL cells)
32792. `.cal-empty`, `.cal-today`, `.cal-has-events` (specific - applies to some cells)
32803. Inline styles (should win but didn't)
3281
3282**We removed the specific ones (v5.2.4), but the generic one was still there!**
3283
3284### What We've Removed
3285
3286**v5.2.3**:
3287- `.event-compact-item` background
3288- `.event-compact-item:hover` background
3289
3290**v5.2.4**:
3291- `.cal-empty` background & hover
3292- `.cal-today` background & hover
3293- `.cal-has-events` background & hover
3294
3295**v5.2.5 (FINAL)**:
3296- `.calendar-compact-grid tbody td` background ✓
3297- `.calendar-compact-grid tbody td:hover` background ✓
3298- `.calendar-compact-grid thead th` background ✓
3299
3300**All CSS background overrides ELIMINATED!** ��
3301
3302### Why It Took 5 Versions
3303
3304**CSS had layers of hardcoded backgrounds**:
3305
3306```
3307Layer 1: Table cells (.calendar-compact-grid tbody td)
3308         ↓ Overrode inline styles
3309Layer 2: Cell states (.cal-today, .cal-empty, etc.)
3310         ↓ Overrode table cells
3311Layer 3: Event items (.event-compact-item)
3312         ↓ Overrode inline styles
3313
3314ALL had to be removed!
3315```
3316
3317**We kept finding more specific CSS, but the base table CSS was there all along!**
3318
3319### Visual Result
3320
3321**NOW everything matches**:
3322```
3323Calendar Table:
3324┌──┬──┬──┬──┬──┬──┬──┐
3325│ S│ M│ T│ W│ T│ F│ S│ ← Headers: __background_site__
3326├──┼──┼──┼──┼──┼──┼──┤
3327│ 1│ 2│ 3│ 4│ 5│ 6│ 7│ ← Cells: __background_site__
3328├──┼──┼──┼──┼──┼──┼──┤
3329│ 8│ 9│10│11│12│13│14│ ← All: __background_site__
3330└──┴──┴──┴──┴──┴──┴──┘
3331
3332Sidebar Events:
3333┌────────────────────────┐
3334│ �� Event               │ ← __background_site__
3335│ �� Event               │ ← __background_site__
3336└────────────────────────┘
3337
3338FINALLY ALL MATCHING! ✓
3339```
3340
3341### Complete List of Removed CSS
3342
3343**ALL hardcoded backgrounds removed**:
3344- `.event-compact-item` background
3345- `.event-compact-item:hover` background
3346- `.cal-empty` background & hover
3347- `.cal-today` background & hover
3348- `.cal-has-events` background & hover
3349- `.calendar-compact-grid tbody td` background ← NEW
3350- `.calendar-compact-grid tbody td:hover` background ← NEW
3351- `.calendar-compact-grid thead th` background ← NEW
3352
3353**Every single CSS background override is GONE!** ��
3354
3355### Testing Steps
3356
3357**After installing v5.2.5**:
3358
33591. **Clear browser cache**: Ctrl+Shift+R (3 times!)
33602. **Clear DokuWiki cache**: Click the button
33613. **Close browser completely**: Restart it
33624. **Visit page**: Should finally see matching backgrounds
3363
3364**CSS is EXTREMELY sticky - may need to clear multiple times!**
3365
3366### This Should Be It
3367
3368**No more CSS overrides exist** (we've checked the entire file):
3369- Table cells ✓ Fixed
3370- Cell states ✓ Fixed
3371- Event items ✓ Fixed
3372- Headers ✓ Fixed
3373- Hover states ✓ Fixed
3374
3375**All backgrounds now come from inline styles using template colors!**
3376
3377## Version 5.2.4 (2026-02-09) - REMOVE CALENDAR CELL CSS BACKGROUNDS
3378
3379### �� Fixed: Removed Hardcoded Backgrounds from Calendar Cells
3380- **Found:** Calendar cell CSS had hardcoded backgrounds with `!important`!
3381- **Fixed:** Removed backgrounds from `.cal-today`, `.cal-empty`, `.cal-has-events` CSS
3382- **Result:** Calendar cells now use template colors!
3383
3384### The Second Culprit
3385
3386MORE hardcoded backgrounds in the CSS file!
3387
3388**In style.css (lines 359-382)**:
3389```css
3390.cal-empty {
3391    background: #fafafa !important;  /* ← Overriding inline styles! */
3392}
3393
3394.cal-today {
3395    background: #e8f5e9 !important;  /* ← Overriding today cell! */
3396}
3397
3398.cal-today:hover {
3399    background: #c8e6c9 !important;  /* ← Overriding hover! */
3400}
3401
3402.cal-has-events {
3403    background: #fffbf0;  /* ← Overriding event cells! */
3404}
3405
3406.cal-has-events:hover {
3407    background: #fff4d9;  /* ← Overriding hover! */
3408}
3409```
3410
3411**These were ALL overriding the inline styles!**
3412
3413### The Fix
3414
3415**Removed all hardcoded backgrounds**:
3416```css
3417.cal-empty {
3418    /* background removed - inline style handles this */
3419    cursor: default !important;
3420}
3421
3422.cal-today {
3423    /* background removed - inline style handles this */
3424}
3425
3426.cal-has-events {
3427    /* background removed - inline style handles this */
3428}
3429
3430/* Hover states also removed */
3431```
3432
3433### What Was Overridden
3434
3435**v5.2.3 fixed**:
3436- Event items in sidebar ✓
3437
3438**v5.2.4 fixes**:
3439- Calendar day cells ✓
3440- Today cell ✓
3441- Empty cells ✓
3442- Cells with events ✓
3443- All hover states ✓
3444
3445### Why This Kept Happening
3446
3447**CSS had hardcoded backgrounds everywhere**:
34481. Event items: `#ffffff` (fixed in v5.2.3)
34492. Calendar cells: Multiple colors (fixed in v5.2.4)
34503. **All with `!important` flags!**
3451
3452**The inline styles couldn't override them!**
3453
3454### Visual Result
3455
3456**Now ALL backgrounds match**:
3457```
3458Calendar Grid:
3459┌──┬──┬──┬──┬──┬──┬──┐
3460│  │  │  │  │  │  │  │ ← All use __background_site__
3461├──┼──┼──┼──┼──┼──┼──┤
3462│  │██│  │  │  │  │  │ ← Today uses __background_neu__
3463├──┼──┼──┼──┼──┼──┼──┤
3464│  │  │  │  │  │  │  │ ← All match template
3465└──┴──┴──┴──┴──┴──┴──┘
3466
3467Sidebar Events:
3468┌────────────────────────┐
3469│ �� Event               │ ← Uses __background_site__
3470│ �� Event               │ ← Uses __background_site__
3471└────────────────────────┘
3472
3473Perfect consistency!
3474```
3475
3476### CSS Removed
3477
3478**Calendar cells**:
3479- `.cal-empty` background
3480- `.cal-empty:hover` background
3481- `.cal-today` background
3482- `.cal-today:hover` background
3483- `.cal-has-events` background
3484- `.cal-has-events:hover` background
3485
3486**All gone!** ✓
3487
3488### Important: Clear Caches Again!
3489
3490After installing v5.2.4:
3491
34921. **Hard refresh browser**: Ctrl+Shift+R (twice!)
34932. **Clear DokuWiki cache**: Admin → Clear Cache
34943. **May need to restart browser**: To clear CSS cache
3495
3496**Old CSS is VERY sticky!**
3497
3498### Why It Took So Long
3499
3500**Multiple CSS overrides**:
3501- Event items (v5.2.3) ✓ Fixed
3502- Calendar cells (v5.2.4) ✓ Fixed
3503- Each with different classes
3504- Each with `!important`
3505- Hidden throughout CSS file
3506
3507**Found them all now!** ��
3508
3509## Version 5.2.3 (2026-02-09) - REMOVE HARDCODED CSS BACKGROUNDS
3510
3511### �� Fixed: Removed Hardcoded Backgrounds from CSS
3512- **Found:** CSS file had hardcoded `background: #ffffff;` overriding inline styles!
3513- **Fixed:** Removed hardcoded backgrounds from `.event-compact-item` CSS
3514- **Result:** Event backgrounds now properly use template colors!
3515
3516### The Root Cause
3517
3518The CSS file was overriding the inline styles with hardcoded white backgrounds!
3519
3520**In style.css (lines 599-616)**:
3521```css
3522.event-compact-item {
3523    background: #ffffff;  /* ← This was overriding inline styles! */
3524}
3525
3526.event-compact-item:hover {
3527    background: #f8f9fa;  /* ← And this on hover! */
3528}
3529```
3530
3531**Even though inline styles had `!important`**, the CSS was still being applied because it comes after in the cascade!
3532
3533### The Fix
3534
3535**Removed hardcoded backgrounds from CSS**:
3536```css
3537.event-compact-item {
3538    /* background removed - set via inline style with template colors */
3539    display: flex;
3540    /* ... other styles ... */
3541}
3542
3543.event-compact-item:hover {
3544    box-shadow: 0 1px 3px rgba(0,0,0,0.08);
3545    /* background removed - inline style handles this */
3546}
3547```
3548
3549### Why This Was So Difficult to Find
3550
3551**CSS Specificity & Cascade**:
35521. Inline styles with `!important` should win
35532. But CSS that comes after can still apply
35543. The hardcoded `background: #ffffff` was silently overriding
35554. All the PHP code was correct - it was the CSS!
3556
3557**What We Were Doing**:
3558- ✓ Reading template colors correctly
3559- ✓ Setting `cell_bg` to `__background_site__` correctly
3560- ✓ Applying inline styles with `!important` correctly
3561- ✗ CSS file was overriding everything!
3562
3563### What Was Affected
3564
3565**Event items in**:
3566- Main calendar sidebar
3567- Standalone event list
3568- Sidebar widget
3569- All event displays
3570
3571**All had white backgrounds hardcoded in CSS!**
3572
3573### Now Working
3574
3575**Events use template colors**:
3576```html
3577<div class="event-compact-item"
3578     style="background: #f5f5f5 !important; ...">
3579    ← Now this inline style actually works!
3580</div>
3581```
3582
3583**No CSS override** ✓
3584
3585### Testing
3586
3587To verify this works:
35881. Clear browser cache (important!)
35892. Clear DokuWiki cache
35903. Reload page
35914. Events should now match eventlist background
3592
3593**Browser caching can make old CSS persist!**
3594
3595### Visual Result
3596
3597**All backgrounds now matching**:
3598```
3599┌────────────────────────────┐
3600│ Eventlist (#f5f5f5)        │ ← Template color
3601├────────────────────────────┤
3602│ �� Event (#f5f5f5)         │ ← Template color (was #ffffff)
3603├────────────────────────────┤
3604│ �� Event (#f5f5f5)         │ ← Template color (was #ffffff)
3605└────────────────────────────┘
3606
3607Perfect match!
3608```
3609
3610### Why Everything Else Worked
3611
3612**Clock area, calendar cells, etc.** didn't have hardcoded CSS backgrounds:
3613- They only had inline styles ✓
3614- Inline styles worked correctly ✓
3615- Only event items had the CSS override ✗
3616
3617### Important Notes
3618
3619**Clear caches**:
3620- Browser cache (Ctrl+Shift+R or Cmd+Shift+R)
3621- DokuWiki cache (Admin → Clear Cache)
3622- Old CSS may be cached!
3623
3624**This was the culprit all along!**
3625
3626## Version 5.2.2 (2026-02-09) - FIX CLOCK AREA BACKGROUND
3627
3628### �� Fixed: Clock Area Now Matches Event Cells
3629- **Fixed:** `header_bg` now uses `__background_site__` (was `__background_alt__`)
3630- **Result:** Clock/Today header matches event cell backgrounds!
3631
3632### The Issue
3633
3634The clock area (Today header) was using a different background:
3635
3636**Before (v5.2.1)**:
3637```php
3638'header_bg' => __background_alt__,   // Different color (gray #e8e8e8)
3639'cell_bg' => __background_site__,    // Event cells (#f5f5f5)
3640```
3641
3642**After (v5.2.2)**:
3643```php
3644'header_bg' => __background_site__,  // Same as cells (#f5f5f5) ✓
3645'cell_bg' => __background_site__,    // Event cells (#f5f5f5) ✓
3646```
3647
3648### What's the Clock Area?
3649
3650The clock/Today header in the sidebar:
3651```
3652┌────────────────────────────┐
3653│ 3:45:23 PM                 │ ← Clock area (header_bg)
3654│ ��️ --° | Sun, Feb 9, 2026 │
3655└────────────────────────────┘
3656```
3657
3658### All Backgrounds Now Unified
3659
3660**Everything now uses __background_site__**:
3661- Eventlist background ✓
3662- Calendar cells ✓
3663- Event items ✓
3664- Clock/Today header ✓
3665- Sidebar widget ✓
3666- All backgrounds match! ✓
3667
3668### Visual Result
3669
3670**Complete consistency**:
3671```
3672┌────────────────────────────┐
3673│ 3:45:23 PM                 │ ← Same background
3674│ ��️ --° | Sun, Feb 9, 2026 │
3675├────────────────────────────┤
3676│ �� Meeting at 2pm          │ ← Same background
3677│ Description...             │
3678├────────────────────────────┤
3679│ �� Another event           │ ← Same background
3680│ More details...            │
3681└────────────────────────────┘
3682
3683All using __background_site__ (#f5f5f5)
3684```
3685
3686**Perfect visual harmony!** ��
3687
3688## Version 5.2.1 (2026-02-09) - FIX: MATCH EVENTLIST BACKGROUND
3689
3690### �� Fixed: Calendar Cells Now Match Eventlist Background
3691- **Fixed:** Changed `cell_bg` to use `__background_site__` (not `__background__`)
3692- **Result:** Calendar cells now match the eventlist background perfectly!
3693
3694### The Real Issue
3695
3696The eventlist was showing the CORRECT background color all along!
3697
3698**Eventlist was using**:
3699- `bg` → `__background_site__` ✓ (This was correct!)
3700
3701**Calendar cells were using**:
3702- `cell_bg` → `__background__` ✗ (This was wrong!)
3703
3704**They didn't match!**
3705
3706### The Correct Fix
3707
3708**Now everything uses __background_site__**:
3709```php
3710'bg' => __background_site__,        // Eventlist (was already correct)
3711'cell_bg' => __background_site__,   // Cells (now fixed to match)
3712```
3713
3714### Why __background_site__?
3715
3716The eventlist sidebar and calendar are meant to match the **page/site background**, not the inner content area background:
3717
3718```
3719Page Layout:
3720┌────────────────────────────────────┐
3721│ __background_site__ (page bg)     │ ← This is where calendar lives
3722│                                    │
3723│  ┌──────────────────────────────┐ │
3724│  │ __background__ (content bg)  │ │ ← Wiki article content
3725│  │                              │ │
3726│  └──────────────────────────────┘ │
3727│                                    │
3728└────────────────────────────────────┘
3729```
3730
3731**Calendar should match the page background, not the content background!**
3732
3733### Template Example
3734
3735Typical DokuWiki template:
3736```ini
3737__background_site__ = "#f5f5f5"  (Light gray - page background)
3738__background__ = "#ffffff"        (White - content area)
3739```
3740
3741**Before (v5.2.0)**:
3742- Eventlist: `#f5f5f5` (light gray) ✓ Correct
3743- Calendar cells: `#ffffff` (white) ✗ Wrong - didn't match
3744
3745**After (v5.2.1)**:
3746- Eventlist: `#f5f5f5` (light gray) ✓ Correct
3747- Calendar cells: `#f5f5f5` (light gray) ✓ Correct - MATCHED!
3748
3749### All Backgrounds Now Unified
3750
3751**Everything now uses __background_site__**:
3752- Eventlist sidebar background ✓
3753- Main calendar background ✓
3754- Calendar day cells ✓
3755- Sidebar widget ✓
3756- Event items ✓
3757- Input fields ✓
3758- Buttons ✓
3759
3760**All perfectly matched to the page background!**
3761
3762### Why Version 5.2.0 Was Wrong
3763
3764I incorrectly assumed `__background__` was the right color because it's often white. But the eventlist was already correct using `__background_site__` to match the page, not the content area.
3765
3766**The eventlist knew what it was doing all along!** The cells just needed to catch up.
3767
3768## Version 5.2.0 (2026-02-09) - UNIFIED WIKI THEME BACKGROUNDS
3769**Note**: This version went the wrong direction. See v5.2.1 for the correct fix.
3770
3771### �� Fixed: All Backgrounds Now Use __background__
3772- **Fixed:** `bg` now uses `__background__` instead of `__background_site__`
3773- **Fixed:** Eventlist, calendar cells, and sidebar all match now
3774- **Result:** Completely unified background throughout!
3775
3776### The Issue
3777
3778Different parts of the calendar were using different background sources:
3779
3780**Before (v5.1.9)**:
3781```php
3782'bg' => __background_site__        // Eventlist background (outer page)
3783'cell_bg' => __background__        // Cell backgrounds (content area)
3784```
3785
3786**These are different colors!**
3787- `__background_site__` = Outer page wrapper (often gray)
3788- `__background__` = Main content area (often white)
3789
3790### The Fix
3791
3792**After (v5.2.0)**:
3793```php
3794'bg' => __background__             // Eventlist background ✓
3795'cell_bg' => __background__        // Cell backgrounds ✓
3796```
3797
3798**Both use the same source!**
3799
3800### What Uses 'bg'
3801
3802The `bg` color is used for:
3803- Eventlist sidebar background
3804- Main calendar container
3805- Sidebar widget background
3806- Form backgrounds
3807- Event dialogs
3808
3809### What Uses 'cell_bg'
3810
3811The `cell_bg` color is used for:
3812- Calendar day cells
3813- Event item backgrounds
3814- Input field backgrounds
3815- Button backgrounds
3816
3817### Why This Matters
3818
3819**Template color hierarchy**:
3820```
3821__background_site__ → Outer page/body (e.g., #f5f5f5 light gray)
3822__background__      → Main content area (e.g., #ffffff white)
3823__background_alt__  → Sections/headers
3824__background_neu__  → Highlights
3825```
3826
3827**We want all calendar backgrounds to match the main content area!**
3828
3829### Visual Comparison
3830
3831**Before (v5.1.9)**: Mismatched backgrounds
3832```
3833┌────────────────────────────────┐
3834│ Eventlist (gray #f5f5f5)      │ ← __background_site__
3835└────────────────────────────────┘
3836
3837┌────────────────────────────────┐
3838│ Calendar                       │
3839│ ┌──┬──┬──┬──┬──┬──┬──┐       │
3840│ │  │  │  │  │  │  │  │       │ ← __background__ (white #fff)
3841│ └──┴──┴──┴──┴──┴──┴──┘       │
3842└────────────────────────────────┘
3843Different colors - looks inconsistent
3844```
3845
3846**After (v5.2.0)**: Unified backgrounds
3847```
3848┌────────────────────────────────┐
3849│ Eventlist (white #fff)         │ ← __background__
3850└────────────────────────────────┘
3851
3852┌────────────────────────────────┐
3853│ Calendar                       │
3854│ ┌──┬──┬──┬──┬──┬──┬──┐       │
3855│ │  │  │  │  │  │  │  │       │ ← __background__ (white #fff)
3856│ └──┴──┴──┴──┴──┴──┴──┘       │
3857└────────────────────────────────┘
3858Same color - perfectly consistent!
3859```
3860
3861### Template Examples
3862
3863**Light Template**:
3864```ini
3865__background_site__ = "#f5f5f5"  (light gray)
3866__background__ = "#ffffff"       (white)
3867```
3868
3869**Before**: Eventlist gray, cells white
3870**After**: Eventlist white, cells white ✓
3871
3872**Dark Template**:
3873```ini
3874__background_site__ = "#1a1a1a"  (very dark)
3875__background__ = "#2d2d2d"       (dark)
3876```
3877
3878**Before**: Eventlist very dark, cells dark
3879**After**: Eventlist dark, cells dark ✓
3880
3881### Benefits
3882
3883**Visual Consistency**:
3884- All backgrounds match
3885- Clean, unified appearance
3886- Professional look
3887
3888**Correct Template Integration**:
3889- Uses content area color (not page wrapper)
3890- Matches wiki content area
3891- Proper color hierarchy
3892
3893**Works Everywhere**:
3894- Light templates ✓
3895- Dark templates ✓
3896- Custom templates ✓
3897
3898### All Backgrounds Unified
3899
3900**Now using __background__**:
3901- Eventlist background ✓
3902- Calendar cells ✓
3903- Sidebar widget ✓
3904- Event items ✓
3905- Input fields ✓
3906- Buttons ✓
3907- Dialogs ✓
3908
3909**Perfect harmony throughout!** ��
3910
3911## Version 5.1.9 (2026-02-09) - FIX WIKI THEME EVENT BACKGROUNDS
3912
3913### �� Fixed: Wiki Theme Event Backgrounds Not Showing
3914- **Fixed:** Wiki theme fallback used CSS variables in inline styles (doesn't work!)
3915- **Fixed:** Replaced CSS variables with actual hex colors
3916- **Result:** Event backgrounds now show correctly with template colors!
3917
3918### The Problem
3919
3920CSS variables like `var(--__background__, #fff)` don't work in inline `style=""` attributes!
3921
3922**Before (broken)**:
3923```php
3924'cell_bg' => 'var(--__background__, #fff)',  // Doesn't work in inline styles!
3925```
3926
3927**After (fixed)**:
3928```php
3929'cell_bg' => '#fff',  // Actual hex color works!
3930```
3931
3932### What Was Affected
3933
3934**When style.ini read successfully**:
3935- ✅ Worked fine (uses actual hex colors from file)
3936
3937**When style.ini fallback used**:
3938- ❌ Events had no background
3939- ❌ CSS variables don't work in inline styles
3940- ❌ Looked broken
3941
3942### The Fix
3943
3944**Wiki theme fallback now uses real colors**:
3945```php
3946'wiki' => [
3947    'bg' => '#f5f5f5',           // Real hex (was: var(--__background_site__))
3948    'border' => '#ccc',           // Real hex (was: var(--__border__))
3949    'cell_bg' => '#fff',          // Real hex (was: var(--__background__))
3950    'cell_today_bg' => '#eee',    // Real hex (was: var(--__background_neu__))
3951    'text_primary' => '#333',     // Real hex (was: var(--__text__))
3952    'text_bright' => '#2b73b7',   // Real hex (was: var(--__link__))
3953    'text_dim' => '#666',         // Real hex (was: var(--__text_neu__))
3954    'grid_bg' => '#e8e8e8',       // Real hex (was: var(--__background_alt__))
3955    // ... all colors now use real hex values
3956]
3957```
3958
3959### Why CSS Variables Don't Work
3960
3961**CSS variables work**:
3962```css
3963.some-class {
3964    background: var(--__background__, #fff);  /* ✓ Works in CSS */
3965}
3966```
3967
3968**CSS variables DON'T work**:
3969```html
3970<div style="background: var(--__background__, #fff)">  <!-- ✗ Doesn't work -->
3971```
3972
3973### How It Works Now
3974
3975**Priority system**:
39761. **Try reading style.ini** → Use actual template hex colors ✓
39772. **If file not found** → Use fallback hex colors ✓
39783. **Never use CSS variables in inline styles** ✓
3979
3980**Both paths now work correctly!**
3981
3982### Visual Result
3983
3984**Events now have proper backgrounds**:
3985```
3986┌──────────────────────────┐
3987│ �� Meeting at 2pm        │ ← White background (#fff)
3988│ Description here...      │
3989│ [✏️ Edit] [��️ Delete]   │
3990└──────────────────────────┘
3991
3992Not:
3993┌──────────────────────────┐
3994│ �� Meeting at 2pm        │ ← No background (broken)
3995│ Description here...      │
3996└──────────────────────────┘
3997```
3998
3999### Affected Areas
4000
4001**All event displays**:
4002- Main calendar events ✓
4003- Sidebar widget events ✓
4004- Event list items ✓
4005- Event backgrounds ✓
4006- Button backgrounds ✓
4007- Input field backgrounds ✓
4008
4009**Everything uses real colors now!**
4010
4011## Version 5.1.8 (2026-02-09) - IMPROVED UPDATE TAB LAYOUT
4012
4013### �� Reorganized: Better Update Tab Layout
4014- **Moved:** Current Version section to the top
4015- **Combined:** Upload and Important Notes side-by-side
4016- **Improved:** Space-efficient two-column layout
4017- **Result:** More information visible at once!
4018
4019### New Layout Order
4020
4021**Version 5.1.8**:
4022```
40231. Current Version (at top - see what you have)
40242. Upload + Important Notes (side-by-side)
40253. Recent Changes (changelog)
40264. Backups
4027```
4028
4029### Side-by-Side Design
4030
4031**Upload form (left 60%) + Important Notes (right 40%)**:
4032```
4033┌──────────────────────────────────────────┐
4034│ �� Current Version                       │
4035│ Version: 5.1.8                           │
4036│ ✅ Permissions: OK                       │
4037└──────────────────────────────────────────┘
4038
4039┌─────────────────────┬────────────────────┐
4040│ �� Upload New       │ ⚠️ Important Notes │
4041│ [Choose File]       │ • Replaces files   │
4042│ ☑ Backup first      │ • Config preserved │
4043│ [Upload] [Clear]    │ • Events safe      │
4044└─────────────────────┴────────────────────┘
4045```
4046
4047### Benefits
4048
4049**Current Version First**:
4050- See what you have immediately
4051- Check permissions at a glance
4052- Know if ready to update
4053
4054**Side-by-Side Layout**:
4055- Upload form and warnings together
4056- Read notes while choosing file
4057- More efficient use of space
4058- Less scrolling needed
4059
4060**Better Information Flow**:
40611. See current version ✓
40622. Upload new version with notes visible ✓
40633. Review recent changes ✓
40644. Manage backups ✓
4065
4066### Visual Comparison
4067
4068**Before (v5.1.7)**:
4069```
4070Important Notes (full width)
40714072Upload Form (full width)
40734074Current Version
40754076Recent Changes
40774078Backups
4079```
4080
4081**After (v5.1.8)**:
4082```
4083Current Version (full width)
40844085Upload (60%) | Notes (40%)
40864087Recent Changes
40884089Backups
4090```
4091
4092**More compact, better organized!**
4093
4094### Responsive Design
4095
4096**Wide screens**:
4097- Upload and notes side-by-side
4098- Full 1200px width utilized
4099- Efficient space usage
4100
4101**Narrow screens**:
4102- Sections stack gracefully
4103- Flex layout adapts
4104- Still fully functional
4105
4106### Layout Details
4107
4108**Current Version Section**:
4109- Full width (1200px max)
4110- Shows version, author, description
4111- Permission status with icons
4112- Helpful fix commands if needed
4113
4114**Upload/Notes Section**:
4115- Flexbox layout with gap
4116- Upload: `flex:1` (grows)
4117- Notes: `flex:0 0 350px` (fixed 350px)
4118- Both have proper min-width
4119
4120**Recent Changes Section**:
4121- Full width (1200px max)
4122- Compact scrollable view
4123- Color-coded change types
4124- Last 10 versions shown
4125
4126**Backups Section**:
4127- Full width (1200px max)
4128- Manual backup button
4129- Scrollable file list
4130- All actions accessible
4131
4132### Improved Max Widths
4133
4134All sections now use `max-width:1200px` (previously 900px):
4135- Better use of wide screens
4136- Still responsive on narrow screens
4137- Consistent throughout tab
4138
4139## Version 5.1.7 (2026-02-09) - FIX SYNTAX ERROR
4140
4141### �� Fixed: Extra Closing Brace
4142- **Fixed:** ParseError on line 1936 (extra closing brace)
4143- **Result:** Manual backup feature now works correctly!
4144
4145### What Was Wrong
4146
4147Extra `}` after the backup section:
4148
4149**Before (broken)**:
4150```php
4151echo '</div>';
4152}  // ← Extra closing brace!
4153
4154echo '<script>
4155```
4156
4157**After (fixed)**:
4158```php
4159echo '</div>';
4160
4161echo '<script>
4162```
4163
4164**Manual backup feature now fully functional!** ✅
4165
4166## Version 5.1.6 (2026-02-09) - MANUAL BACKUP ON DEMAND
4167
4168### �� Added: Create Backup Manually Anytime
4169- **Added:** "Create Backup Now" button in Backups section
4170- **Added:** Manual backup action handler with full verification
4171- **Added:** Backups section always visible (even with no backups)
4172- **Added:** Success message showing file size and file count
4173- **Result:** Create backups anytime without needing to upload!
4174
4175### Manual Backup Button
4176
4177**New Layout**:
4178```
4179┌─────────────────────────────────────┐
4180│ �� Backups        [�� Create Backup Now] │
4181├─────────────────────────────────────┤
4182│ Backup File                Size     │
4183calendar.backup.v5.1.6...  243 KB   │
4184│ [�� Download] [✏️ Rename] [��️ Delete] │
4185└─────────────────────────────────────┘
4186```
4187
4188**Always visible - even with no backups**:
4189```
4190┌─────────────────────────────────────┐
4191│ �� Backups        [�� Create Backup Now] │
4192├─────────────────────────────────────┤
4193│ No backups yet. Click "Create       │
4194│ Backup Now" to create your first    │
4195│ backup.                              │
4196└─────────────────────────────────────┘
4197```
4198
4199### How It Works
4200
4201**Click the button**:
42021. Confirm: "Create a backup of the current plugin version?"
42032. System creates backup ZIP
42043. Verifies: File count (30+ files)
42054. Verifies: File size (200KB+)
42065. Shows success: "✓ Manual backup created: filename.zip (243 KB, 31 files)"
4207
4208**Backup naming**:
4209```
4210calendar.backup.v5.1.6.manual.2026-02-09_12-30-45.zip
4211                       ^^^^^^
4212                     "manual" tag identifies manual backups
4213```
4214
4215### Use Cases
4216
4217**Before updates**:
4218- Create safety backup before uploading new version
4219- Have multiple restore points
4220- Test new features with fallback
4221
4222**Regular backups**:
4223- Weekly/monthly backup schedule
4224- Before making configuration changes
4225- After important customizations
4226
4227**Development**:
4228- Backup before code experiments
4229- Save working states
4230- Quick rollback points
4231
4232### Full Verification
4233
4234**Same checks as automatic backups**:
4235- ✅ File count check (minimum 10, expected 30+)
4236- ✅ File size check (minimum 1KB, expected 200KB+)
4237- ✅ Existence check (file actually created)
4238- ✅ Automatic cleanup on failure
4239
4240**Success message includes**:
4241- Backup filename
4242- File size (human-readable)
4243- Number of files backed up
4244
4245### Example Messages
4246
4247**Success**:
4248```
4249✓ Manual backup created successfully:
4250  calendar.backup.v5.1.6.manual.2026-02-09_12-30-45.zip
4251  (243 KB, 31 files)
4252```
4253
4254**Failure Examples**:
4255```
4256❌ Plugin directory is not readable.
4257   Please check permissions.
4258
4259❌ Backup incomplete: Only 5 files were added (expected 30+).
4260   Backup failed.
4261
4262❌ Backup file is too small (342 bytes).
4263   Only 3 files were added. Backup failed.
4264```
4265
4266### Benefits
4267
4268**On-Demand Safety**:
4269- Create backups anytime
4270- No need to upload new version
4271- Quick and easy
4272
4273**Peace of Mind**:
4274- Backup before risky changes
4275- Multiple restore points
4276- Safe experimentation
4277
4278**Professional Workflow**:
4279- Regular backup schedule
4280- Version snapshots
4281- Disaster recovery
4282
4283### Backup Section Improvements
4284
4285**Always Visible**:
4286- Section shows even with 0 backups
4287- Button always accessible
4288- Clear call-to-action
4289
4290**Better Header**:
4291- Title and button on same row
4292- Clean, professional layout
4293- Space-efficient design
4294
4295### Technical Details
4296
4297**New Action**: `create_manual_backup`
4298
4299**New Function**: `createManualBackup()`
4300- Gets current version
4301- Creates timestamped filename with "manual" tag
4302- Uses same verification as auto-backups
4303- Shows detailed success/error messages
4304
4305**File Naming Convention**:
4306```
4307Automatic (on upload):
4308calendar.backup.v5.1.6.2026-02-09_12-30-45.zip
4309
4310Manual (button click):
4311calendar.backup.v5.1.6.manual.2026-02-09_12-30-45.zip
4312                       ^^^^^^^
4313                    Easy to identify!
4314```
4315
4316### Permissions Required
4317
4318- **Read access**: Plugin directory
4319- **Write access**: Parent plugins directory
4320
4321**Same as automatic backups** - no additional permissions needed!
4322
4323## Version 5.1.5 (2026-02-09) - ENHANCED BACKUP VERIFICATION
4324
4325### �� Enhanced: Backup Creation with Robust Verification
4326- **Added:** File count validation (must have 10+ files)
4327- **Added:** File size validation (must be 1KB+ minimum)
4328- **Added:** Return value from addDirectoryToZip (counts files added)
4329- **Added:** Detailed error messages showing file count
4330- **Added:** Automatic deletion of invalid/incomplete backups
4331- **Enhanced:** Exception handling with proper error propagation
4332- **Result:** Backups are now guaranteed to be complete or fail clearly!
4333
4334### What Changed
4335
4336**Before (v5.1.4)**:
4337```php
4338$this->addDirectoryToZip($zip, $pluginDir, 'calendar/');
4339$zip->close();
4340// No verification - could create empty or partial backup
4341```
4342
4343**After (v5.1.5)**:
4344```php
4345$fileCount = $this->addDirectoryToZip($zip, $pluginDir, 'calendar/');
4346$zip->close();
4347
4348// Verify backup exists
4349if (!file_exists($backupPath)) {
4350    redirect('Backup file was not created');
4351}
4352
4353// Verify backup has content
4354$backupSize = filesize($backupPath);
4355if ($backupSize < 1000) {
4356    unlink($backupPath);
4357    redirect('Backup too small: ' . $backupSize . ' bytes');
4358}
4359
4360// Verify file count
4361if ($fileCount < 10) {
4362    unlink($backupPath);
4363    redirect('Only ' . $fileCount . ' files added (expected 30+)');
4364}
4365```
4366
4367### Backup Validation Checks
4368
4369**Three-Layer Verification**:
4370
43711. **File Count Check**:
4372   - Minimum: 10 files required
4373   - Expected: 30+ files
4374   - Action: Delete backup if too few files
4375
43762. **Size Check**:
4377   - Minimum: 1KB (1000 bytes)
4378   - Expected: 200-250KB
4379   - Action: Delete backup if too small
4380
43813. **Existence Check**:
4382   - Verify file was actually created
4383   - Check ZIP archive is valid
4384   - Action: Error if file missing
4385
4386### Enhanced Error Reporting
4387
4388**Detailed Error Messages**:
4389```
4390❌ "Backup file was not created"
4391❌ "Backup too small (342 bytes). Only 3 files added."
4392❌ "Only 5 files added (expected 30+). Backup aborted."
4393❌ "Too many errors adding files: Failed to add X, Y, Z..."
4394❌ "Directory does not exist: /path/to/dir"
4395❌ "Directory is not readable: /path/to/dir"
4396```
4397
4398**Now you know exactly what went wrong!**
4399
4400### Improved addDirectoryToZip Function
4401
4402**Returns File Count**:
4403```php
4404private function addDirectoryToZip($zip, $dir, $zipPath = '') {
4405    $fileCount = 0;
4406    $errors = [];
4407
4408    // Validation
4409    if (!is_dir($dir)) throw new Exception("Directory does not exist");
4410    if (!is_readable($dir)) throw new Exception("Not readable");
4411
4412    // Add files
4413    foreach ($files as $file) {
4414        if ($zip->addFile($filePath, $relativePath)) {
4415            $fileCount++;
4416        } else {
4417            $errors[] = "Failed to add: " . $filename;
4418        }
4419    }
4420
4421    // Check error threshold
4422    if (count($errors) > 5) {
4423        throw new Exception("Too many errors");
4424    }
4425
4426    return $fileCount;  // Returns count for verification!
4427}
4428```
4429
4430### Safety Features
4431
4432**Invalid Backup Cleanup**:
4433- Failed backups are automatically deleted
4434- No partial/corrupt backups left behind
4435- Clean error state
4436
4437**Error Threshold**:
4438- Allow up to 5 minor file errors (logs warnings)
4439- More than 5 errors = complete failure
4440- Prevents partially corrupt backups
4441
4442**Directory Validation**:
4443- Check directory exists before processing
4444- Check directory is readable
4445- Fail fast with clear errors
4446
4447### Benefits
4448
4449**Guaranteed Complete Backups**:
4450- ✅ All files included or backup fails
4451- ✅ No silent failures
4452- ✅ Clear error messages
4453- ✅ Automatic cleanup
4454
4455**Better Debugging**:
4456- Know exactly how many files were added
4457- See specific errors for missing files
4458- Understand why backup failed
4459
4460**User Confidence**:
4461- Backup succeeds = complete backup
4462- Backup fails = clear error message
4463- No ambiguity
4464
4465### Example Scenarios
4466
4467**Scenario 1: Permission Issue**
4468```
4469User uploads new version
4470System starts backup
4471Error: "Directory is not readable: /lib/plugins/calendar/"
4472Backup fails before creating file
4473User sees clear error message
4474```
4475
4476**Scenario 2: Partial Backup**
4477```
4478User uploads new version
4479System creates backup
4480Only 5 files added (disk issue?)
4481Size: 450 bytes
4482Verification fails
4483Incomplete backup deleted
4484Error: "Only 5 files added (expected 30+)"
4485```
4486
4487**Scenario 3: Success**
4488```
4489User uploads new version
4490System creates backup
449131 files added
4492Size: 240KB
4493All verifications pass ✅
4494Update proceeds
4495```
4496
4497### Testing Recommendations
4498
4499After installing v5.1.5:
45001. Upload a new version with backup enabled
45012. Check for success message
45023. Verify backup file exists in /lib/plugins/
45034. Check backup file size (should be ~240KB)
45045. If backup fails, read error message carefully
4505
4506**Your backups are now bulletproof!** ��
4507
4508## Version 5.1.4 (2026-02-09) - BACKUP SYSTEM VERIFIED
4509
4510### ✅ Verified: Backup System Working Correctly
4511- **Verified:** addDirectoryToZip function includes all files recursively
4512- **Verified:** Backups contain all 31+ files from calendar directory
4513- **Verified:** File sizes are appropriate (233-240KB compressed, ~1MB uncompressed)
4514- **Info:** Backup sizes grow slightly with each version (more code = more features!)
4515- **Result:** Backup system is working perfectly!
4516
4517### Backup System Details
4518
4519**What Gets Backed Up**:
4520- All PHP files (syntax.php, admin.php, action.php, etc.)
4521- All JavaScript files (calendar-main.js, script.js)
4522- All documentation (CHANGELOG.md, README.md, all guides)
4523- All configuration (sync_config.php)
4524- All language files
4525- All assets and resources
4526- **Everything in the calendar/ directory!**
4527
4528**Backup Size Analysis**:
4529```
4530Version 5.0.4: 233KB (normal)
4531Version 5.0.5: 234KB (normal)
4532Version 5.0.6: 235KB (normal)
4533Version 5.0.7: 236KB (normal)
4534Version 5.0.8: 237KB (normal)
4535Version 5.0.9: 237KB (normal)
4536Version 5.1.0: 238KB (normal)
4537Version 5.1.1: 238KB (normal)
4538Version 5.1.2: 240KB (normal - added AJAX features)
4539Version 5.1.3: 240KB (normal)
4540```
4541
4542**Why Sizes Grow**:
4543- More features = more code
4544- Longer CHANGELOG
4545- Additional documentation
4546- New functionality
4547- **This is expected and normal!**
4548
4549**Compression Ratio**:
4550```
4551Uncompressed: ~1.0 MB (source files)
4552Compressed:   ~240 KB (ZIP archive)
4553Ratio:        ~24% (excellent compression!)
4554```
4555
4556### Backup File Contents
4557
4558**31 Files Included**:
4559```
4560admin.php              (216KB - main admin interface)
4561syntax.php             (173KB - calendar rendering)
4562calendar-main.js       (102KB - JavaScript functionality)
4563CHANGELOG.md           (268KB - complete version history)
4564style.css              (57KB - all styling)
4565action.php             (38KB - DokuWiki actions)
4566sync_outlook.php       (32KB - Outlook integration)
4567+ 24 other files (docs, configs, helpers)
4568```
4569
4570**All files successfully included!** ✅
4571
4572### How Backups Work
4573
4574**Creation Process**:
45751. User uploads new plugin version
45762. Checkbox "Create backup first" (checked by default)
45773. System creates backup: `calendar.backup.v5.1.3.2026-02-09_06-00-00.zip`
45784. Backup saved to: `/lib/plugins/` directory
45795. Then proceeds with update
4580
4581**Backup Function**:
4582```php
4583private function addDirectoryToZip($zip, $dir, $zipPath = '') {
4584    $files = new RecursiveIteratorIterator(
4585        new RecursiveDirectoryIterator($dir),
4586        RecursiveIteratorIterator::LEAVES_ONLY
4587    );
4588    foreach ($files as $file) {
4589        if (!$file->isDir()) {
4590            $zip->addFile($filePath, $relativePath);
4591        }
4592    }
4593}
4594```
4595
4596**Recursive = Gets Everything!** ✅
4597
4598### Verification Results
4599
4600**Test Results**:
4601- ✅ All 31 files present in zip
4602- ✅ All subdirectories included (lang/en/)
4603- ✅ File sizes match originals
4604- ✅ Compression works properly
4605- ✅ No files missing
4606- ✅ Backup can be restored
4607
4608**File Count**:
4609```
4610Source directory: 31 files
4611Backup ZIP:       34 items (31 files + 3 directories)
4612Status:           COMPLETE ✅
4613```
4614
4615### Backup Best Practices
4616
4617**Always enabled by default** ✅
4618**Stored in accessible location** ✅
4619**Timestamped filenames** ✅
4620**Complete directory backup** ✅
4621**Easy to restore** ✅
4622
4623### Conclusion
4624
4625The backup system is working perfectly. The file sizes are appropriate and expected:
4626- Compressed size: ~240KB (good compression)
4627- Uncompressed size: ~1MB (all source files)
4628- All files included: YES ✅
4629- Growing size over versions: Normal (more features!)
4630
4631**Your backups are complete and reliable!** ��
4632
4633## Version 5.1.3 (2026-02-08) - FIX JAVASCRIPT SYNTAX ERROR
4634
4635### �� Fixed: JavaScript Syntax Error in AJAX Function
4636- **Fixed:** ParseError on line 1947 (deleteBackup function)
4637- **Fixed:** Escaped all single quotes in JavaScript strings
4638- **Result:** AJAX backup deletion now works correctly!
4639
4640### What Was Wrong
4641
4642JavaScript inside PHP echo needs escaped quotes:
4643
4644**Before (broken)**:
4645```javascript
4646formData.append('action', 'delete_backup');  // PHP interprets quotes
4647```
4648
4649**After (fixed)**:
4650```javascript
4651formData.append(\'action\', \'delete_backup\');  // Escaped for PHP
4652```
4653
4654### All Quotes Escaped
4655
4656Fixed in deleteBackup function:
4657- ✅ FormData.append() calls
4658- ✅ fetch() URL
4659- ✅ querySelector() calls
4660- ✅ createElement() call
4661- ✅ All string literals
4662- ✅ Error messages
4663
4664**JavaScript now works!** ✓
4665
4666## Version 5.1.2 (2026-02-08) - AJAX BACKUP DELETION & LAYOUT IMPROVEMENT
4667
4668### �� Improved: Update Tab Further Refined
4669- **Moved:** Important Notes to very top (above upload)
4670- **Enhanced:** Delete backup now uses AJAX (no page refresh!)
4671- **Added:** Smooth fade-out animation when deleting backups
4672- **Added:** Success message after deletion
4673- **Auto-remove:** Backup section disappears if last backup deleted
4674- **Result:** Smoother, more polished experience!
4675
4676### New Layout Order
4677
4678**Final Order (v5.1.2)**:
4679```
46801. ⚠️ Important Notes (warnings at top)
46812. �� Upload New Version (with Clear Cache button)
46823. �� Current Version (info)
46834. �� Recent Changes (changelog)
46845. �� Available Backups (if any)
4685```
4686
4687### AJAX Backup Deletion
4688
4689**Before (v5.1.1)**:
4690- Click Delete → Page refreshes → Scroll back down
4691- Lose position on page
4692- Page reload is jarring
4693
4694**After (v5.1.2)**:
4695- Click Delete → Confirm
4696- Row fades out smoothly
4697- Row disappears
4698- Success message shows at top
4699- Success message fades after 3 seconds
4700- If last backup: entire section fades away
4701- **No page refresh!** ✓
4702
4703### Visual Flow
4704
4705**Delete Animation**:
4706```
47071. Click ��️ Delete
47082. Confirm dialog
47093. Row fades out (0.3s)
47104. Row removed
47115. Success message appears
47126. Message fades after 3s
4713```
4714
4715**If Last Backup**:
4716```
47171. Delete last backup
47182. Row fades out
47193. Entire "Available Backups" section fades
47204. Section removed
47215. Clean interface ✓
4722```
4723
4724### Success Message
4725
4726After deleting:
4727```
4728┌──────────────────────────────┐
4729│ ✓ Backup deleted: filename   │ ← Appears at top
4730└──────────────────────────────┘
4731   Fades after 3 seconds
4732```
4733
4734### Benefits
4735
4736**Important Notes First**:
4737- Warnings before actions ✓
4738- Read before uploading ✓
4739- Clear expectations ✓
4740
4741**AJAX Deletion**:
4742- No page refresh ✓
4743- Smooth animations ✓
4744- Stay in context ✓
4745- Professional feel ✓
4746
4747**Auto-Cleanup**:
4748- Empty list disappears ✓
4749- Clean interface ✓
4750- No clutter ✓
4751
4752### Technical Implementation
4753
4754**AJAX Request**:
4755```javascript
4756fetch('?do=admin&page=calendar&tab=update', {
4757    method: 'POST',
4758    body: formData
4759})
4760```
4761
4762**DOM Manipulation**:
4763- Fade out row
4764- Remove element
4765- Show success
4766- Remove section if empty
4767
4768**Smooth Transitions**:
4769- 300ms fade animations
4770- Clean visual feedback
4771- Professional polish
4772
4773## Version 5.1.1 (2026-02-08) - REORGANIZE UPDATE TAB
4774
4775### �� Improved: Update Tab Layout Reorganized
4776- **Moved:** Upload section to the top of the page
4777- **Added:** Clear Cache button next to Upload & Install button
4778- **Changed:** "Current Version" section moved below upload
4779- **Result:** Better workflow - upload first, then see version info!
4780
4781### New Layout Order
4782
4783**Before (v5.1.0)**:
4784```
47851. Clear Cache (standalone)
47862. Current Version
47873. Recent Changes
47884. Upload New Version
47895. Warning Box
47906. Backups
4791```
4792
4793**After (v5.1.1)**:
4794```
47951. Upload New Version (with Clear Cache button side-by-side)
47962. Warning Box
47973. Current Version
47984. Recent Changes
47995. Backups
4800```
4801
4802### Visual Result
4803
4804**Top of Update Tab**:
4805```
4806┌─────────────────────────────────┐
4807│ �� Upload New Version           │
4808│ ┌─────────────────────────────┐ │
4809│ │ [Choose File]               │ │
4810│ │ ☑ Create backup first       │ │
4811│ │ ┌──────────────┬──────────┐ │ │
4812│ │ │�� Upload &   │��️ Clear  │ │ │
4813│ │ │   Install    │   Cache  │ │ │
4814│ │ └──────────────┴──────────┘ │ │
4815│ └─────────────────────────────┘ │
4816│                                 │
4817│ ⚠️ Important Notes              │
4818│ • Will replace all files        │
4819│ • Config preserved              │
4820│                                 │
4821│ �� Current Version              │
4822│ Version: 5.1.1                  │
4823└─────────────────────────────────┘
4824```
4825
4826### Benefits
4827
4828**Better Workflow**:
4829- Primary action (upload) is first
4830- Clear cache conveniently next to install
4831- No scrolling to find upload button
4832- Logical top-to-bottom flow
4833
4834**Side-by-Side Buttons**:
4835- Upload & Install (green)
4836- Clear Cache (orange)
4837- Both common actions together
4838- Easy to access after upload
4839
4840**Improved UX**:
4841- Upload is most important → now at top
4842- Version info is reference → moved down
4843- Related actions grouped
4844- Cleaner organization
4845
4846### Button Layout
4847
4848```
4849┌──────────────────┬──────────────┐
4850│ �� Upload &      │ ��️ Clear     │
4851│    Install       │    Cache     │
4852│ (Green)          │ (Orange)     │
4853└──────────────────┴──────────────┘
4854```
4855
4856**Green = Primary Action**
4857**Orange = Secondary Action**
4858
4859Both easily accessible!
4860
4861## Version 5.1.0 (2026-02-08) - ADMIN SECTIONS USE MAIN BACKGROUND
4862
4863### �� Changed: Admin Section Backgrounds Now Use __background__
4864- **Changed:** All section boxes now use `__background__` instead of `__background_alt__`
4865- **Result:** Cleaner, more unified admin interface!
4866
4867### Background Usage Update
4868
4869**Before (v5.0.9)**:
4870```php
4871Section boxes: bg_alt (__background_alt__)
4872Content areas: bg (__background__)
4873```
4874
4875**After (v5.1.0)**:
4876```php
4877Section boxes: bg (__background__)
4878Content areas: bg (__background__)
4879```
4880
4881### Why This Change?
4882
4883**More unified appearance**:
4884- Sections and content use same background
4885- Creates cleaner, more cohesive look
4886- Borders provide visual separation
4887- Matches typical admin UI patterns
4888
4889**Template color hierarchy**:
4890```
4891__background_site__ → Outer page wrapper
4892__background__      → Content & sections (BOTH now use this)
4893__background_alt__  → Reserved for special panels/highlights
4894__background_neu__  → Special highlights
4895```
4896
4897### Visual Result
4898
4899**Light Template**:
4900```ini
4901__background__ = "#ffffff"
4902__background_alt__ = "#e8e8e8"
4903```
4904
4905**Before**:
4906```
4907Admin Page:
4908┌─────────────────────┐
4909│ ┌─────────────────┐ │
4910│ │ Section Box     │ │ ← Gray (#e8e8e8)
4911│ │ ┌─────────────┐ │ │
4912│ │ │ Content     │ │ │ ← White (#fff)
4913│ │ └─────────────┘ │ │
4914│ └─────────────────┘ │
4915└─────────────────────┘
4916Two-tone appearance
4917```
4918
4919**After**:
4920```
4921Admin Page:
4922┌─────────────────────┐
4923│ ┌─────────────────┐ │
4924│ │ Section Box     │ │ ← White (#fff)
4925│ │ ┌─────────────┐ │ │
4926│ │ │ Content     │ │ │ ← White (#fff)
4927│ │ └─────────────┘ │ │
4928│ └─────────────────┘ │
4929└─────────────────────┘
4930Unified, clean appearance
4931Borders provide separation
4932```
4933
4934**Dark Template**:
4935```ini
4936__background__ = "#2d2d2d"
4937__background_alt__ = "#3a3a3a"
4938```
4939
4940**After**:
4941```
4942Admin Page:
4943┌─────────────────────┐
4944│ ┌─────────────────┐ │
4945│ │ Section Box     │ │ ← Dark (#2d2d2d)
4946│ │ ┌─────────────┐ │ │
4947│ │ │ Content     │ │ │ ← Dark (#2d2d2d)
4948│ │ └─────────────┘ │ │
4949│ └─────────────────┘ │
4950└─────────────────────┘
4951Unified dark appearance
4952Accent borders provide definition
4953```
4954
4955### Benefits
4956
4957**Cleaner Look**:
4958- No more alternating gray/white
4959- More professional appearance
4960- Less visual noise
4961- Unified color scheme
4962
4963**Better Consistency**:
4964- Matches modern admin UI patterns
4965- Borders define sections, not colors
4966- Simpler, cleaner design
4967- Easier on the eyes
4968
4969**Template Friendly**:
4970- Works with any background color
4971- Light or dark templates
4972- Custom colors
4973- Always looks cohesive
4974
4975### All Sections Updated
4976
4977✅ Outlook Sync config sections
4978✅ Manage Events sections
4979✅ Update Plugin sections
4980✅ Themes tab sections
4981✅ Week start day section
4982✅ All form sections
4983
4984**Complete unified theming!** ��
4985
4986## Version 5.0.9 (2026-02-08) - FIX SYNTAX ERROR IN THEMES TAB
4987
4988### �� Fixed: Syntax Error in Theme Cards
4989- **Fixed:** ParseError on line 4461 (Purple theme card)
4990- **Fixed:** Malformed ternary expressions from sed replacement
4991- **Fixed:** All 4 theme cards (Purple, Professional, Pink, Wiki)
4992- **Result:** Admin pages work correctly!
4993
4994### What Was Wrong
4995
4996The bulk sed replacement in v5.0.8 incorrectly modified ternary expressions:
4997
4998**Before (broken)**:
4999```php
5000? '#9b59b6' : ' . $colors['border'] . ')
5001// Extra quote and dot created syntax error
5002```
5003
5004**After (fixed)**:
5005```php
5006? '#9b59b6' : $colors['border'])
5007// Clean ternary expression
5008```
5009
5010### All Theme Cards Fixed
5011
5012- ✅ Purple Dream card
5013- ✅ Professional Blue card
5014- ✅ Pink Bling card
5015- ✅ Wiki Default card
5016
5017### Now Working
5018
5019**Theme selection page loads** ✓
5020**All cards display properly** ✓
5021**Template colors applied** ✓
5022**No syntax errors** ✓
5023
5024## Version 5.0.8 (2026-02-08) - FIX THEMES TAB & BACKGROUND MAPPING
5025
5026### �� Fixed: Themes Tab Backgrounds & Correct Template Color Mapping
5027- **Fixed:** Themes tab now uses template colors (removed all hardcoded whites)
5028- **Fixed:** Main background now uses `__background__` instead of `__background_site__`
5029- **Fixed:** Theme selection cards use template backgrounds
5030- **Fixed:** Week start options use template backgrounds
5031- **Result:** Perfect color mapping throughout admin!
5032
5033### Color Mapping Correction
5034
5035**Before (v5.0.7)**:
5036```php
5037bg: __background_site__  // Wrong - this is outer page bg
5038bg_alt: __background_alt__
5039```
5040
5041**After (v5.0.8)**:
5042```php
5043bg: __background__       // Correct - main content bg
5044bg_alt: __background_alt__
5045```
5046
5047### Why This Matters
5048
5049**Template color hierarchy**:
5050```
5051__background_site__ → Outer page/site background
5052__background__      → Main content area (CORRECT for admin)
5053__background_alt__  → Sections/panels
5054__background_neu__  → Highlights
5055```
5056
5057**Admin should use**:
5058- `__background__` for input fields, content areas
5059- `__background_alt__` for section boxes, panels
5060
5061### Themes Tab Fixed
5062
5063**Removed all hardcoded colors**:
5064```php
5065Before: '#ddd', '#fff', '#dee2e6'
5066After:  $colors['border'], $colors['bg'], $colors['border']
5067```
5068
5069**Now themed**:
5070- ✅ Week start section background
5071- ✅ Week start option backgrounds
5072- ✅ Theme card backgrounds
5073- ✅ Theme card borders
5074- ✅ All borders throughout
5075
5076### Visual Result
5077
5078**Light Template**:
5079```ini
5080__background__ = "#ffffff"
5081__background_alt__ = "#e8e8e8"
5082```
5083
5084**Admin Before (v5.0.7)**:
5085```
5086Input fields: #f5f5f5 (site bg - wrong)
5087Sections: #e8e8e8 (alt bg - correct)
5088```
5089
5090**Admin After (v5.0.8)**:
5091```
5092Input fields: #ffffff (content bg - correct!)
5093Sections: #e8e8e8 (alt bg - correct!)
5094```
5095
5096**Dark Template**:
5097```ini
5098__background__ = "#2d2d2d"
5099__background_alt__ = "#3a3a3a"
5100```
5101
5102**Admin After (v5.0.8)**:
5103```
5104Input fields: #2d2d2d (content bg - perfect!)
5105Sections: #3a3a3a (alt bg - perfect!)
5106```
5107
5108### Complete Themes Tab
5109
5110**Week Start Options**:
5111```
5112┌─────────────────────────┐
5113│ �� Week Start Day       │ ← bg_alt
5114│ ┌─────────┬───────────┐ │
5115│ │ Monday  │ Sunday    │ │ ← bg (when not selected)
5116│ └─────────┴───────────┘ │
5117└─────────────────────────┘
5118```
5119
5120**Theme Cards**:
5121```
5122┌─────────────────────────┐
5123│ �� Matrix Edition       │ ← bg (when not selected)
5124│ Classic green theme     │   border (when not selected)
5125└─────────────────────────┘
5126
5127┌═════════════════════════┐
5128│ �� Purple Dream         │ ← rgba green tint (when selected)
5129│ Elegant purple theme    │   #00cc07 border (when selected)
5130└═════════════════════════┘
5131```
5132
5133### Perfect Integration
5134
5135**All admin pages now**:
5136- Content areas: `__background__` ✓
5137- Section boxes: `__background_alt__` ✓
5138- Borders: `__border__` ✓
5139- Text: `__text__` ✓
5140
5141**Matches wiki perfectly**:
5142- Same white content areas
5143- Same gray section boxes
5144- Same border colors
5145- Same text colors
5146
5147### No More Issues
5148
5149**Fixed**:
5150- ❌ Site background on content areas → ✅ Content background
5151- ❌ Hardcoded white on themes tab → ✅ Template background
5152- ❌ Hardcoded borders (#ddd) → ✅ Template borders
5153
5154**Result**:
5155- Perfect color hierarchy ✓
5156- Correct background levels ✓
5157- Complete template integration ✓
5158
5159## Version 5.0.7 (2026-02-08) - COMPLETE ADMIN THEMING
5160
5161### �� Fixed: All Admin Backgrounds Use Template Colors
5162- **Fixed:** All section backgrounds use `__background_alt__`
5163- **Fixed:** All content backgrounds use `__background__`
5164- **Fixed:** All borders use `__border__`
5165- **Fixed:** All text uses `__text__`
5166- **Result:** Complete admin template integration!
5167
5168### All Replacements
5169
5170**Backgrounds**:
5171```php
5172Before: background: #f9f9f9
5173After:  background: ' . $colors['bg_alt'] . '
5174
5175Before: background: #fff / background: white
5176After:  background: ' . $colors['bg'] . '
5177```
5178
5179**Borders**:
5180```php
5181Before: border: 1px solid #ddd
5182Before: border: 1px solid #e0e0e0
5183Before: border: 1px solid #eee
5184After:  border: 1px solid ' . $colors['border'] . '
5185```
5186
5187**Text**:
5188```php
5189Before: color: #333
5190Before: color: #666
5191After:  color: ' . $colors['text'] . '
5192```
5193
5194### Complete Admin Coverage
5195
5196**All tabs now themed**:
5197- ✅ Manage Events tab
5198- ✅ Update Plugin tab
5199- ✅ Outlook Sync tab
5200- ✅ Themes tab
5201- ✅ Tab navigation
5202- ✅ All sections
5203- ✅ All inputs
5204- ✅ All borders
5205- ✅ All text
5206
5207### Visual Result
5208
5209**Light Template**:
5210```
5211Admin Page:
5212┌──────────────────────────┐
5213│ Tab Navigation           │ ← Template borders
5214├──────────────────────────┤
5215│ Section Headers          │ ← bg_alt (light gray)
5216│ ┌──────────────────────┐ │
5217│ │ Form Inputs          │ │ ← bg (white)
5218│ │ Content Areas        │ │
5219│ └──────────────────────┘ │
5220└──────────────────────────┘
5221All template colors! ✓
5222```
5223
5224**Dark Template**:
5225```
5226Admin Page:
5227┌──────────────────────────┐
5228│ Tab Navigation           │ ← Template borders
5229├──────────────────────────┤
5230│ Section Headers          │ ← bg_alt (dark gray)
5231│ ┌──────────────────────┐ │
5232│ │ Form Inputs          │ │ ← bg (darker)
5233│ │ Content Areas        │ │
5234│ └──────────────────────┘ │
5235└──────────────────────────┘
5236All template colors! ✓
5237```
5238
5239### Template Color Mapping
5240
5241**Used throughout admin**:
5242```
5243__background_site__ → $colors['bg']       (main backgrounds)
5244__background_alt__  → $colors['bg_alt']   (section backgrounds)
5245__text__            → $colors['text']     (all text)
5246__border__          → $colors['border']   (all borders)
5247__link__            → $colors['link']     (links - future)
5248```
5249
5250### Examples by Section
5251
5252**Manage Events**:
5253- Event list backgrounds: `bg_alt`
5254- Event item backgrounds: `bg`
5255- Borders: `border`
5256- Text: `text`
5257
5258**Update Plugin**:
5259- Section backgrounds: `bg_alt`
5260- Content areas: `bg`
5261- Borders: `border`
5262- Text: `text`
5263
5264**Outlook Sync**:
5265- Config sections: `bg_alt`
5266- Input fields: `bg`
5267- Borders: `border`
5268- Labels: `text`
5269
5270**Themes Tab**:
5271- Theme cards: `bg_alt`
5272- Preview areas: `bg`
5273- Borders: `border`
5274- Descriptions: `text`
5275
5276### Benefits
5277
5278**Seamless Integration**:
5279- Matches wiki admin area perfectly
5280- Same colors throughout wiki
5281- Professional appearance
5282- Consistent experience
5283
5284**Automatic Adaptation**:
5285- Light templates: Light admin
5286- Dark templates: Dark admin
5287- Custom templates: Uses custom colors
5288
5289**No White Boxes**:
5290- Every background themed
5291- Every border themed
5292- Every text themed
5293- Complete consistency
5294
5295### PERFECT HARMONY
5296
5297**Frontend (Calendar)**:
5298- Wiki theme uses style.ini5299- Perfect template match ✓
5300
5301**Backend (Admin)**:
5302- Reads same style.ini5303- Perfect template match ✓
5304
5305**Complete Unity**:
5306- Same colors everywhere ✓
5307- Seamless experience ✓
5308- Professional polish ✓
5309
5310## Version 5.0.6 (2026-02-08) - ADMIN PAGES USE TEMPLATE COLORS
5311
5312### �� Enhanced: Month/Year Header & Admin Pages Use Template Colors
5313- **Fixed:** Month/Year header now uses `__text_neu__` for wiki theme
5314- **Added:** Admin pages read template's style.ini file
5315- **Added:** `getTemplateColors()` function in admin class
5316- **Fixed:** Tab navigation uses template text and border colors
5317- **Result:** Complete template integration everywhere!
5318
5319### Month/Year Header
5320
5321**Before**:
5322```php
5323color: __text__  // Same as primary text
5324```
5325
5326**After (Wiki Theme)**:
5327```php
5328color: __text_neu__  // Dimmed text (subtle)
5329```
5330
5331### Admin Pages Enhancement
5332
5333**New `getTemplateColors()` function**:
5334- Reads template's style.ini file
5335- Extracts color replacements
5336- Provides colors to all admin tabs
5337- Falls back to sensible defaults
5338
5339**Colors used**:
5340```php
5341bg: __background_site__
5342bg_alt: __background_alt__
5343text: __text__
5344border: __border__
5345link: __link__
5346```
5347
5348**Applied to**:
5349- Tab navigation borders
5350- Tab text colors
5351- All admin sections
5352- Ready for future enhancements
5353
5354### Visual Result
5355
5356**Calendar Header**:
5357```
5358┌────────────────────┐
5359│ ‹ February 2026 › │ ← __text_neu__ (dimmed)
5360└────────────────────┘
5361Subtle and elegant ✓
5362```
5363
5364**Admin Navigation**:
5365```
5366�� Manage Events | �� Update | ⚙️ Config | �� Themes
5367─────────────────────────────────────────────────
5368Active tab: Green (#00cc07)
5369Inactive tabs: Template text color
5370Border: Template border color
5371```
5372
5373### Template Integration
5374
5375**Light Template**:
5376```ini
5377__text_neu__ = "#666666"
5378__border__ = "#cccccc"
5379```
5380**Result**:
5381- Month/Year: Medium gray (subtle)
5382- Admin borders: Light gray
5383- Tab text: Dark gray
5384
5385**Dark Template**:
5386```ini
5387__text_neu__ = "#999999"
5388__border__ = "#555555"
5389```
5390**Result**:
5391- Month/Year: Light gray (subtle)
5392- Admin borders: Medium gray
5393- Tab text: Bright gray
5394
5395### Benefits
5396
5397**Calendar Frontend**:
5398- Month/Year header more subtle
5399- Better visual hierarchy
5400- Less prominent, more elegant
5401
5402**Admin Backend**:
5403- Uses template colors
5404- Matches wiki admin area
5405- Consistent experience
5406- Professional appearance
5407
5408### Future-Ready
5409
5410The `getTemplateColors()` function is now available for:
5411- ✅ Tab navigation (implemented)
5412- �� Section backgrounds (ready)
5413- �� Button colors (ready)
5414- �� Input fields (ready)
5415- �� Success/error messages (ready)
5416
5417**Foundation laid for complete admin theming!** ��
5418
5419## Version 5.0.5 (2026-02-08) - WIKI THEME ADD BUTTON & SECTION HEADERS
5420
5421### �� Fixed: Add Event Bar & Section Headers Use Template Colors
5422- **Fixed:** Add Event bar now uses `__background_alt__` for wiki theme
5423- **Fixed:** "Today" header uses `__text_neu__`
5424- **Fixed:** "Tomorrow" header uses `__text__`
5425- **Fixed:** "Important Events" header uses `__border__`
5426- **Result:** Perfect template color integration!
5427
5428### All Changes
5429
5430**Add Event Bar (Wiki Theme)**:
5431
5432**Before**:
5433```php
5434background: #3498db  // Generic blue
5435```
5436
5437**After**:
5438```php
5439background: __background_alt__  // Template alternate bg
5440text: __text__                  // Template text color
5441hover: __background_neu__       // Template neutral bg
5442```
5443
5444**Section Headers (Wiki Theme)**:
5445
5446**Before**:
5447```php
5448Today: #ff9800           // Orange
5449Tomorrow: #4caf50        // Green
5450Important Events: #9b59b6 // Purple
5451```
5452
5453**After**:
5454```php
5455Today: __text_neu__      // Template dimmed text
5456Tomorrow: __text__       // Template primary text
5457Important Events: __border__ // Template border color
5458```
5459
5460### Visual Result
5461
5462**Wiki Default Theme**:
5463```
5464Add Event Bar:
5465┌────────────────┐
5466│  + ADD EVENT   │ ← Template alt background
5467└────────────────┘
5468
5469Sections:
5470━━━━━━━━━━━━━━━━
5471Today              ← Dimmed text color (__text_neu__)
5472• Team Meeting
5473
5474Tomorrow           ← Primary text color (__text__)
5475• Code Review
5476
5477Important Events   ← Border color (__border__)
5478• Project Deadline
5479```
5480
5481### Example with DokuWiki Default Template
5482
5483**Template colors**:
5484```ini
5485__background_alt__ = "#e8e8e8"
5486__text__ = "#333333"
5487__text_neu__ = "#666666"
5488__border__ = "#cccccc"
5489```
5490
5491**Calendar result**:
5492```
5493Add Event Bar: Light gray (#e8e8e8)
5494Today header: Medium gray (#666666)
5495Tomorrow header: Dark gray (#333333)
5496Important Events header: Border gray (#cccccc)
5497```
5498
5499### Example with Dark Template
5500
5501**Template colors**:
5502```ini
5503__background_alt__ = "#2d2d2d"
5504__text__ = "#e0e0e0"
5505__text_neu__ = "#999999"
5506__border__ = "#555555"
5507```
5508
5509**Calendar result**:
5510```
5511Add Event Bar: Dark gray (#2d2d2d)
5512Today header: Light gray (#999999)
5513Tomorrow header: Bright gray (#e0e0e0)
5514Important Events header: Medium gray (#555555)
5515```
5516
5517### Perfect Harmony
5518
5519All sidebar elements now use template colors:
5520- ✅ Add Event bar background
5521- ✅ Add Event bar text
5522- ✅ Today section header
5523- ✅ Tomorrow section header
5524- ✅ Important Events header
5525- ✅ Calendar cells
5526- ✅ Grid backgrounds
5527- ✅ All borders
5528
5529**Complete template integration!** ��
5530
5531## Version 5.0.4 (2026-02-08) - USE __background__ FOR CALENDAR CELLS
5532
5533### �� Fixed: Calendar Cells Use Correct Template Color
5534- **Fixed:** Calendar cells now use `__background__` from template
5535- **Changed:** `cell_bg` now uses `__background__` instead of `__background_neu__`
5536- **Result:** Calendar cells match main content area background!
5537
5538### Color Mapping Update
5539
5540**Before (v5.0.3)**:
5541```php
5542cell_bg: __background_neu__  // Wrong - this is for neutral/alternate
5543```
5544
5545**After (v5.0.4)**:
5546```php
5547cell_bg: __background__      // Correct - main content background
5548```
5549
5550### Template Color Usage
5551
5552**Wiki Default theme now uses**:
5553```
5554__background_site__ → Overall page background
5555__background__      → Calendar cells (main content bg)
5556__background_alt__  → Grid background, headers
5557__background_neu__  → Today cell highlight
5558__text__            → Primary text
5559__text_neu__        → Dimmed text
5560__link__            → Links, bright text
5561__border__          → All borders
5562```
5563
5564### Visual Result
5565
5566**Before**:
5567```
5568Calendar with template colors:
5569┌─────┬─────┬─────┐
5570│ Mon │ Tue │ Wed │
5571├─────┼─────┼─────┤
5572│  8  │  9  │ 10  │ ← Neutral gray (wrong)
5573└─────┴─────┴─────┘
5574```
5575
5576**After**:
5577```
5578Calendar with template colors:
5579┌─────┬─────┬─────┐
5580│ Mon │ Tue │ Wed │
5581├─────┼─────┼─────┤
5582│  8  │  9  │ 10  │ ← White/content bg (correct!)
5583└─────┴─────┴─────┘
5584```
5585
5586### Example Template Colors
5587
5588**DokuWiki Default**:
5589```ini
5590__background__ = "#ffffff"
5591```
5592**Result**: White calendar cells ✓
5593
5594**Dark Template**:
5595```ini
5596__background__ = "#2d2d2d"
5597```
5598**Result**: Dark calendar cells ✓
5599
5600**Custom Template**:
5601```ini
5602__background__ = "#f9f9f9"
5603```
5604**Result**: Custom color cells ✓
5605
5606### Perfect Matching
5607
5608Calendar cells now match:
5609- ✅ Main content area background
5610- ✅ Article/page background
5611- ✅ Content box background
5612- ✅ Same as wiki text background
5613
5614**Seamless integration!** ��
5615
5616## Version 5.0.3 (2026-02-08) - READ COLORS FROM TEMPLATE STYLE.INI
5617
5618### �� Enhanced: Wiki Default Theme Reads Template Colors
5619- **Added:** Function to read colors from DokuWiki template's style.ini file
5620- **Reads:** `/var/www/html/dokuwiki/conf/tpl/{template}/style.ini`
5621- **Falls back:** Also checks `/var/www/html/dokuwiki/lib/tpl/{template}/style.ini`
5622- **Uses:** Actual template colors instead of CSS variables
5623- **Result:** Perfect color matching with any DokuWiki template!
5624
5625### How It Works
5626
5627**New Function: `getWikiTemplateColors()`**
5628
56291. **Detects** current DokuWiki template name
56302. **Reads** the template's `style.ini` file
56313. **Parses** color replacements section
56324. **Maps** template colors to calendar theme
56335. **Falls back** to CSS variables if file not found
5634
5635### Colors Read from style.ini
5636
5637**Template color replacements used**:
5638```php
5639__background_site__  → bg, header_bg
5640__background_alt__   → grid_bg, cell_today_bg
5641__background_neu__   → cell_bg
5642__text__             → text_primary
5643__text_neu__         → text_dim
5644__link__             → text_bright
5645__border__           → border, grid_border
5646```
5647
5648### Example style.ini Mapping
5649
5650**Template style.ini**:
5651```ini
5652[replacements]
5653__background_site__ = "#f8f9fa"
5654__background_alt__  = "#e9ecef"
5655__background_neu__  = "#dee2e6"
5656__text__            = "#212529"
5657__text_neu__        = "#6c757d"
5658__link__            = "#0d6efd"
5659__border__          = "#ced4da"
5660```
5661
5662**Calendar theme result**:
5663```php
5664bg: #f8f9fa
5665header_bg: #e9ecef
5666grid_bg: #e9ecef
5667cell_bg: #dee2e6
5668text_primary: #212529
5669text_dim: #6c757d
5670text_bright: #0d6efd
5671border: #ced4da
5672grid_border: #ced4da
5673```
5674
5675### Before vs After
5676
5677**Before (v5.0.2)**:
5678```
5679Wiki Default theme used:
5680- CSS variables (var(--__background__, #fff))
5681- Required browser CSS variable support
5682- Fallback to generic colors
5683```
5684
5685**After (v5.0.3)**:
5686```
5687Wiki Default theme uses:
5688- Actual colors from template's style.ini
5689- Exact template color values
5690- No CSS variable dependency
5691- Perfect color matching!
5692```
5693
5694### File Location Priority
5695
5696Checks in order:
56971. `/var/www/html/dokuwiki/conf/tpl/{template}/style.ini`
56982. `/var/www/html/dokuwiki/lib/tpl/{template}/style.ini`
56993. Falls back to CSS variables if neither found
5700
5701### Benefits
5702
5703**More accurate colors**:
5704- Uses exact template color values ✓
5705- No CSS variable interpolation ✓
5706- Consistent across all browsers ✓
5707
5708**Better compatibility**:
5709- Works with older browsers ✓
5710- No CSS variable support needed ✓
5711- Direct color values ✓
5712
5713**Perfect matching**:
5714- Reads template's actual colors ✓
5715- Same colors as wiki pages ✓
5716- Seamless integration ✓
5717
5718### Template Examples
5719
5720**DokuWiki Default Template**:
5721```
5722Reads: lib/tpl/dokuwiki/style.ini
5723Gets: Default DokuWiki colors
5724Result: Perfect classic DokuWiki look
5725```
5726
5727**Bootstrap Template**:
5728```
5729Reads: lib/tpl/bootstrap3/style.ini
5730Gets: Bootstrap color scheme
5731Result: Perfect Bootstrap integration
5732```
5733
5734**Custom Template**:
5735```
5736Reads: conf/tpl/mycustom/style.ini
5737Gets: Your custom colors
5738Result: Perfect custom theme match
5739```
5740
5741### Fallback Chain
5742
57431. **Try** reading style.ini from template
57442. **If found** → Use exact colors from file
57453. **If not found** → Use CSS variables
57464. **If no CSS vars** → Use fallback colors
5747
5748**Always works, always matches!** ✓
5749
5750## Version 5.0.2 (2026-02-08) - FIX WIKI DEFAULT THEME DAY PANEL
5751
5752### �� Fixed: Wiki Default Theme Day Panel Colors
5753- **Fixed:** Day popup panel now uses DokuWiki CSS variables
5754- **Fixed:** Panel background matches wiki theme
5755- **Fixed:** Panel header matches wiki theme
5756- **Fixed:** Border colors use wiki theme
5757- **Fixed:** Text colors use wiki theme
5758- **Result:** Perfect integration with DokuWiki templates!
5759
5760### All Changes
5761
5762**Day Panel Colors (Wiki Default)**:
5763
5764**Before**:
5765```php
5766background: rgba(36, 36, 36, 0.5)  // Dark gray (wrong!)
5767header: #3498db                     // Blue (wrong!)
5768```
5769
5770**After**:
5771```php
5772background: var(--__background__, #fff)
5773header: var(--__background_alt__, #e8e8e8)
5774header_text: var(--__text__, #333)
5775border: var(--__border__, #ccc)
5776shadow: 0 2px 4px rgba(0, 0, 0, 0.1)
5777```
5778
5779**Event Colors (Wiki Default)**:
5780```php
5781event_bg: var(--__background_alt__, rgba(245, 245, 245, 0.5))
5782border_color: var(--__border__, rgba(204, 204, 204, 0.3))
5783bar_shadow: 0 1px 2px rgba(0, 0, 0, 0.15)
5784```
5785
5786### Before vs After
5787
5788**Before (v5.0.1)**:
5789```
5790Wiki Default - Click Week Cell:
5791┌────────────────┐
5792│ Monday, Feb 8  │ ← Blue header (wrong)
5793├────────────────┤
5794│ Team Meeting   │ ← Dark gray bg (wrong)
5795│ 2:00 PM        │
5796└────────────────┘
5797Doesn't match wiki theme
5798```
5799
5800**After (v5.0.2)**:
5801```
5802Wiki Default - Click Week Cell:
5803
5804Light Wiki Theme:
5805┌────────────────┐
5806│ Monday, Feb 8  │ ← Light gray header ✓
5807├────────────────┤
5808│ Team Meeting   │ ← White bg ✓
5809│ 2:00 PM        │   Dark text ✓
5810└────────────────┘
5811
5812Dark Wiki Theme:
5813┌────────────────┐
5814│ Monday, Feb 8  │ ← Dark header ✓
5815├────────────────┤
5816│ Team Meeting   │ ← Dark bg ✓
5817│ 2:00 PM        │   Light text ✓
5818└────────────────┘
5819
5820Perfectly matches wiki!
5821```
5822
5823### CSS Variables Used
5824
5825**Wiki Default theme now uses**:
5826- `--__background__` - Main background (panel body)
5827- `--__background_alt__` - Alternate bg (panel header, events)
5828- `--__text__` - Text color (header text)
5829- `--__border__` - Border color (panel border, event borders)
5830
5831**With fallbacks**:
5832```css
5833var(--__background__, #fff)           /* white fallback */
5834var(--__background_alt__, #e8e8e8)    /* light gray fallback */
5835var(--__text__, #333)                 /* dark text fallback */
5836var(--__border__, #ccc)               /* gray border fallback */
5837```
5838
5839### Perfect Adaptation
5840
5841**Light Templates**:
5842- Light panel backgrounds ✓
5843- Dark text ✓
5844- Subtle borders ✓
5845- Clean appearance ✓
5846
5847**Dark Templates**:
5848- Dark panel backgrounds ✓
5849- Light text ✓
5850- Visible borders ✓
5851- Perfect contrast ✓
5852
5853**Custom Templates**:
5854- Uses template's CSS variables ✓
5855- Automatic adaptation ✓
5856- Seamless integration ✓
5857
5858### Now Truly Adaptive
5859
5860Wiki Default theme now properly uses DokuWiki CSS variables for:
5861- ✅ Calendar grid
5862- ✅ Sidebar widget
5863- ✅ Event list
5864- ✅ **Day panel** ← v5.0.2!
5865- ✅ All backgrounds
5866- ✅ All text
5867- ✅ All borders
5868
5869**Complete wiki integration!** ��
5870
5871## Version 5.0.1 (2026-02-08) - THEME CONFLICT TOOLTIPS
5872
5873### �� Enhanced: Time Conflict Tooltips Now Themed
5874- **Fixed:** Conflict tooltips now match calendar theme
5875- **Added:** Theme-aware background, border, text colors
5876- **Added:** Theme-aware shadow effects
5877- **Result:** Complete visual consistency!
5878
5879### Tooltip Theming
5880
5881**Now uses theme colors for**:
5882- Background: Theme background color
5883- Border: Theme border color
5884- Header text: Theme primary text color
5885- Item text: Theme dim text color
5886- Shadow: Theme shadow color
5887
5888### Before vs After
5889
5890**Before (v5.0.0)**:
5891```
5892Hover ⚠️ badge:
5893┌─────────────────┐
5894│ ⚠️ Time Conflicts│ ← Default colors
5895│ • Event A       │
5896│ • Event B       │
5897└─────────────────┘
5898```
5899
5900**After (v5.0.1)**:
5901```
5902Matrix Theme:
5903┌─────────────────┐
5904│ ⚠️ Time Conflicts│ ← Green header
5905│ • Event A       │ ← Green text
5906│ • Event B       │   Dark green bg
5907└─────────────────┘
5908
5909Purple Theme:
5910┌─────────────────┐
5911│ ⚠️ Time Conflicts│ ← Purple header
5912│ • Event A       │ ← Purple text
5913│ • Event B       │   Dark purple bg
5914└─────────────────┘
5915
5916Professional Theme:
5917┌─────────────────┐
5918│ ⚠️ Time Conflicts│ ← Blue header
5919│ • Event A       │ ← Dark text
5920│ • Event B       │   Light bg
5921└─────────────────┘
5922
5923Pink Theme:
5924┌─────────────────┐
5925│ ⚠️ Time Conflicts│ ← Pink header ✨
5926│ • Event A       │ ← Pink text
5927│ • Event B       │   Dark pink bg ��
5928└─────────────────┘
5929
5930Wiki Default:
5931┌─────────────────┐
5932│ ⚠️ Time Conflicts│ ← Adapts to wiki
5933│ • Event A       │ ← Wiki colors
5934│ • Event B       │
5935└─────────────────┘
5936```
5937
5938### Now 100% Complete
5939
5940**Every tooltip themed**:
5941- ✅ Conflict tooltips
5942- ✅ All other tooltips (if any)
5943- ✅ Perfect consistency
5944
5945**Absolute perfection!** ✨
5946
5947## Version 5.0.0 (2026-02-08) - MAJOR RELEASE: COMPLETE THEMING PERFECTION
5948
5949### �� Major Milestone: Version 5.0
5950
5951This is a major release representing the completion of comprehensive theming across the entire calendar plugin. Every visual element has been carefully themed for consistency and beauty.
5952
5953### Complete Feature Set
5954
5955**5 Beautiful Themes**:
5956- �� Matrix Edition (Green with glow)
5957- �� Purple Dream (Elegant purple)
5958- �� Professional Blue (Clean and modern)
5959- �� Pink Bling (Maximum sparkle)
5960- �� Wiki Default (Auto-adapts to your DokuWiki theme)
5961
5962**100% Theme Coverage**:
5963- ✅ Calendar grid and cells
5964- ✅ Event boxes and borders
5965- ✅ Sidebar widget
5966- ✅ Event list panel
5967- ✅ Search functionality
5968- ✅ Edit/Add dialogs (complete)
5969- ✅ Day popup dialogs
5970- ✅ Month picker
5971- ✅ All text (primary, dim, bright)
5972- ✅ All buttons
5973- ✅ All inputs and forms
5974- ✅ All checkboxes
5975- ✅ All borders
5976- ✅ All badges and labels
5977- ✅ Event highlight effects
5978
5979**Perfect Visual Consistency**:
5980- No white pixels anywhere
5981- No unthemed elements
5982- No default colors
5983- Complete visual unity
5984
5985### Major Improvements in v5.0
5986
59871. **Complete Dialog Theming** (v4.8.5-4.8.7)
5988   - Edit event dialog fully themed
5989   - Day popup dialog fully themed
5990   - All form inputs themed
5991   - All checkboxes themed
5992   - All buttons themed
5993
59942. **Event Box Border Perfection** (v4.8.6)
5995   - All 4 borders themed (top, right, bottom, left)
5996   - Sidebar event dividers themed
5997   - Past Events toggle border themed
5998
59993. **Checkbox Field Borders** (v4.9.0)
6000   - Repeating Event section border themed
6001   - Task checkbox section border themed
6002
60034. **Wiki Default Theme** (v4.10.0)
6004   - New 5th theme
6005   - Uses DokuWiki CSS variables
6006   - Auto-adapts to any wiki template
6007   - Perfect for seamless integration
6008
60095. **Clean Text Appearance** (v4.11.0)
6010   - Removed text glow from Matrix
6011   - Removed text glow from Purple
6012   - Removed text glow from Professional
6013   - Removed text glow from Wiki Default
6014   - Kept text glow on Pink Bling only
6015
60166. **Event Highlight Effects** (v4.12.0-4.12.1)
6017   - Theme-aware highlight glow
6018   - Click event bar → event glows
6019   - 3-second themed glow effect
6020   - Smooth animations
6021
6022### See RELEASE_NOTES.md for Complete Details
6023
6024For a comprehensive overview of all features, themes, and improvements, see the new **RELEASE_NOTES.md** file included in this release.
6025
6026## Version 4.12.1 (2026-02-08) - FIX EVENT HIGHLIGHT FUNCTION
6027
6028### �� Fixed: Event Highlight Now Working
6029- **Fixed:** Used setProperty() to properly apply !important styles
6030- **Added:** Console logging for debugging
6031- **Fixed:** Proper style application with important flag
6032- **Result:** Highlight glow now works correctly!
6033
6034### Technical Fix
6035
6036**Before (not working)**:
6037```javascript
6038eventItem.style.background = color + ' !important'; // Doesn't work
6039```
6040
6041**After (working)**:
6042```javascript
6043eventItem.style.setProperty('background', color, 'important'); // Works!
6044```
6045
6046### Added Debug Logging
6047
6048Console now shows:
6049- "Highlighting event: [calId] [eventId] [date]"
6050- "Found event item: [element]"
6051- "Theme: [theme name]"
6052- "Highlight colors: [bg] [shadow]"
6053- "Applied highlight styles"
6054- "Removing highlight" (after 3 seconds)
6055
6056### Now Working
6057
6058Click any event bar → Event glows with theme colors ✓
6059
6060## Version 4.12.0 (2026-02-08) - THEME-AWARE EVENT HIGHLIGHT GLOW
6061
6062### ✨ Enhanced: Event Click Highlight Now Theme-Aware
6063- **Fixed:** Restored event highlight glow when clicking calendar bars
6064- **Improved:** Highlight now matches each theme's colors
6065- **Added:** Stronger glow effect for better visibility
6066- **Duration:** 3 seconds with smooth fade
6067- **Result:** Beautiful themed highlights for all themes!
6068
6069### How It Works
6070
6071When you click an event bar in the calendar, the corresponding event in the event list now highlights with a themed glow:
6072
6073**Matrix Theme**:
6074```javascript
6075Background: Darker green (#1a3d1a)
6076Glow: Double green glow (0 0 20px + 0 0 40px)
6077Color: rgba(0, 204, 7, 0.8)
6078```
6079
6080**Purple Theme**:
6081```javascript
6082Background: Darker purple (#3d2b4d)
6083Glow: Double purple glow
6084Color: rgba(155, 89, 182, 0.8)
6085```
6086
6087**Professional Theme**:
6088```javascript
6089Background: Light blue (#e3f2fd)
6090Glow: Single blue glow
6091Color: rgba(74, 144, 226, 0.4)
6092```
6093
6094**Pink Theme**:
6095```javascript
6096Background: Darker pink (#3d2030)
6097Glow: Double pink glow ✨��
6098Color: rgba(255, 20, 147, 0.8)
6099```
6100
6101**Wiki Theme**:
6102```javascript
6103Background: var(--__background_neu__)
6104Glow: Blue glow (adapts to wiki)
6105Color: rgba(43, 115, 183, 0.4)
6106```
6107
6108### Visual Examples
6109
6110**Matrix - Click Event**:
6111```
6112Calendar:
6113┌─────────────┐
6114│ 2:00 PM │ ← Click this bar
6115└─────────────┘
6116
6117Event List:
6118╔═════════════════════╗
6119║ Team Meeting        ║ ← GLOWS GREEN
6120║ 2:00 PM             ║    for 3 seconds
6121╚═════════════════════╝
6122   ↑↑↑ Strong green glow ↑↑↑
6123```
6124
6125**Purple - Click Event**:
6126```
6127Calendar:
6128┌─────────────┐
6129│ 4:00 PM │ ← Click
6130└─────────────┘
6131
6132Event List:
6133╔═════════════════════╗
6134║ Code Review         ║ ← GLOWS PURPLE
6135║ 4:00 PM             ║    for 3 seconds
6136╚═════════════════════╝
6137   ↑↑↑ Strong purple glow ↑↑↑
6138```
6139
6140**Pink - Click Event**:
6141```
6142Calendar:
6143┌─────────────┐
6144│ 1:00 PM │ ← Click
6145└─────────────┘
6146
6147Event List:
6148╔═════════════════════╗
6149║ Lunch Date ��       ║ ← GLOWS PINK
6150║ 1:00 PM ✨          ║    for 3 seconds
6151╚═════════════════════╝
6152   ↑↑↑ MAXIMUM SPARKLE ↑↑↑
6153```
6154
6155### Glow Specifications
6156
6157**Matrix**:
6158- Background: Dark green
6159- Shadow: `0 0 20px rgba(0, 204, 7, 0.8)`
6160- Outer glow: `0 0 40px rgba(0, 204, 7, 0.4)`
6161- Effect: Strong green pulse
6162
6163**Purple**:
6164- Background: Dark purple
6165- Shadow: `0 0 20px rgba(155, 89, 182, 0.8)`
6166- Outer glow: `0 0 40px rgba(155, 89, 182, 0.4)`
6167- Effect: Strong purple pulse
6168
6169**Professional**:
6170- Background: Light blue
6171- Shadow: `0 0 20px rgba(74, 144, 226, 0.4)`
6172- Effect: Subtle blue glow
6173
6174**Pink**:
6175- Background: Dark pink
6176- Shadow: `0 0 20px rgba(255, 20, 147, 0.8)`
6177- Outer glow: `0 0 40px rgba(255, 20, 147, 0.4)`
6178- Effect: MAXIMUM SPARKLE ✨��
6179
6180**Wiki**:
6181- Background: Theme neutral color
6182- Shadow: `0 0 20px rgba(43, 115, 183, 0.4)`
6183- Effect: Adapts to wiki theme
6184
6185### User Experience
6186
6187**Click event bar** → Event highlights with themed glow
6188**Auto-scroll** → Event scrolls into view smoothly
6189**3 second glow** → Fade out after 3 seconds
6190**Smooth transition** → 0.3s ease-in-out
6191
6192### Perfect for Finding Events
6193
6194**Large event lists**: Quickly locate the clicked event ✓
6195**Visual feedback**: Know which event you clicked ✓
6196**Theme consistency**: Matches your chosen theme ✓
6197**Smooth animation**: Professional appearance ✓
6198
6199### All Themes Covered
6200
6201- ✅ Matrix: Green glow
6202- ✅ Purple: Purple glow
6203- ✅ Professional: Blue glow
6204- ✅ Pink: Maximum pink sparkle
6205- ✅ Wiki: Adaptive glow
6206
6207**Click any event bar and watch it glow!** ✨
6208
6209## Version 4.11.0 (2026-02-08) - REMOVE TEXT GLOW FROM NON-PINK THEMES
6210
6211### �� Changed: Text Glow Now Pink-Only
6212- **Removed:** Text shadow/glow from Matrix theme
6213- **Removed:** Text shadow/glow from Purple theme
6214- **Removed:** Text shadow/glow from Professional theme (already had none)
6215- **Removed:** Text shadow/glow from Wiki Default theme
6216- **Kept:** Text shadow/glow ONLY on Pink Bling theme
6217- **Result:** Cleaner look for Matrix, Purple, and Wiki themes!
6218
6219### All Changes
6220
6221**Before (Matrix, Purple)**:
6222```css
6223text-shadow: 0 0 2px $text_color; /* Glow effect */
6224```
6225
6226**After (Matrix, Purple, Professional, Wiki)**:
6227```css
6228text-shadow: none; /* Clean, no glow */
6229```
6230
6231**Pink Bling (unchanged)**:
6232```css
6233text-shadow: 0 0 2px $text_color; /* Still has glow ✨ */
6234```
6235
6236### Text Shadow Removed From
6237
6238**Sidebar day numbers**: No glow ✓
6239**Event titles**: No glow ✓
6240**Event dates**: No glow ✓
6241**Add Event button**: No glow ✓
6242**Day popup events**: No glow ✓
6243
6244### Before vs After
6245
6246**BEFORE (Matrix)**:
6247```
6248Event Title ✨ ← Glowing green text
62492:00 PM ✨     ← Glowing text
6250```
6251
6252**AFTER (Matrix)**:
6253```
6254Event Title    ← Clean green text
62552:00 PM        ← Clean text
6256```
6257
6258**Pink Bling (Still Glows)**:
6259```
6260Event Title ✨�� ← Still glowing!
62612:00 PM ✨     ← Maximum sparkle!
6262```
6263
6264### Theme Appearances
6265
6266**�� Matrix Edition**:
6267- Clean green text
6268- No glow effects
6269- Professional appearance
6270- Still has border glow
6271
6272**�� Purple Dream**:
6273- Clean purple text
6274- No glow effects
6275- Elegant appearance
6276- Still has border glow
6277
6278**�� Professional Blue**:
6279- Clean text (unchanged)
6280- No glow effects
6281- Modern appearance
6282
6283**�� Pink Bling**:
6284- Glowing pink text ✨
6285- Maximum glow effects ��
6286- Sparkle everywhere!
6287- All the bling!
6288
6289**�� Wiki Default**:
6290- Clean text
6291- No glow effects
6292- Matches wiki theme
6293
6294### Glow Effects Remaining
6295
6296**Border/box glow**: Still present on all themes ✓
6297**Pink text glow**: Only on Pink Bling ✓
6298**Shadow effects**: Still on buttons/boxes6299
6300**Only TEXT glow removed from non-pink themes!**
6301
6302### Result
6303
6304**Cleaner, more professional look** for:
6305- Matrix ✓
6306- Purple ✓
6307- Professional ✓
6308- Wiki Default ✓
6309
6310**Maximum sparkle** for:
6311- Pink Bling ✨��✓
6312
6313**Best of both worlds!** ��
6314
6315## Version 4.10.0 (2026-02-08) - NEW WIKI DEFAULT THEME
6316
6317### �� New: Wiki Default Theme
6318- **Added:** 5th theme that automatically matches your DokuWiki template
6319- **Uses:** CSS variables from your wiki theme
6320- **Adapts:** Automatically works with light and dark themes
6321- **Perfect:** Seamless integration with any DokuWiki template
6322
6323### How It Works
6324
6325**Wiki theme uses DokuWiki CSS variables**:
6326```css
6327bg: var(--__background_site__, #f5f5f5)
6328border: var(--__border__, #ccc)
6329text_primary: var(--__text__, #333)
6330text_bright: var(--__link__, #2b73b7)
6331text_dim: var(--__text_neu__, #666)
6332cell_bg: var(--__background__, #fff)
6333grid_border: var(--__border__, #ccc)
6334```
6335
6336**With fallbacks for older DokuWiki versions**:
6337- If CSS variables exist → Use them ✓
6338- If not available → Use fallback values ✓
6339
6340### All 5 Themes
6341
6342**1. �� Matrix Edition** (Default)
6343- Dark green with neon glow
6344- Matrix-style effects
6345- Original theme
6346
6347**2. �� Purple Dream**
6348- Rich purple with violet accents
6349- Elegant and sophisticated
6350- Soft glow effects
6351
6352**3. �� Professional Blue**
6353- Clean blue and grey
6354- Modern professional
6355- No glow effects
6356
6357**4. �� Pink Bling**
6358- Glamorous hot pink
6359- Maximum sparkle ✨
6360- Hearts and diamonds
6361
6362**5. �� Wiki Default** ← NEW!
6363- Matches your wiki template
6364- Auto-adapts to light/dark
6365- Perfect integration
6366
6367### Examples
6368
6369**Light Wiki Template**:
6370```
6371Wiki Default theme shows:
6372- Light backgrounds (#f5f5f5)
6373- Dark text (#333)
6374- Light inputs (#fff)
6375- Gray borders (#ccc)
6376
6377Matches perfectly! ✓
6378```
6379
6380**Dark Wiki Template**:
6381```
6382Wiki Default theme shows:
6383- Dark backgrounds (from template)
6384- Light text (from template)
6385- Dark inputs (from template)
6386- Dark borders (from template)
6387
6388Matches perfectly! ✓
6389```
6390
6391**Bootstrap Template**:
6392```
6393Uses Bootstrap's colors
6394Matches perfectly! ✓
6395```
6396
6397**Material Template**:
6398```
6399Uses Material's colors
6400Matches perfectly! ✓
6401```
6402
6403### CSS Variables Used
6404
6405**DokuWiki provides**:
6406- `--__background_site__`: Page background
6407- `--__background_alt__`: Section backgrounds
6408- `--__background__`: Content backgrounds
6409- `--__text__`: Primary text color
6410- `--__link__`: Link color
6411- `--__text_neu__`: Dimmed text
6412- `--__border__`: Border color
6413- `--__background_neu__`: Neutral background
6414
6415**All with fallbacks**:
6416```css
6417var(--__background_site__, #f5f5f5)
6418/* Falls back to light gray if variable doesn't exist */
6419```
6420
6421### Perfect for Every Template
6422
6423**Custom templates**: Automatically adapts ✓
6424**Light themes**: Perfect match ✓
6425**Dark themes**: Perfect match ✓
6426**Any DokuWiki version**: Works with fallbacks ✓
6427
6428### Complete Theme Collection
6429
6430Now with **5 gorgeous themes**:
6431- 3 dark themes (Matrix, Purple, Pink)
6432- 1 light theme (Professional)
6433- 1 adaptive theme (Wiki Default) ← NEW!
6434
6435**Something for everyone!** ��
6436
6437## Version 4.9.0 (2026-02-08) - FIX CHECKBOX FIELD BORDERS
6438
6439### �� Fixed: Checkbox Field Borders Themed
6440- **Fixed:** Added border-color to checkbox field divs
6441- **Fixed:** Repeating Event section border
6442- **Fixed:** Task checkbox section border
6443- **Result:** No white borders around checkboxes!
6444
6445### Changes
6446
6447**Checkbox Field Border Styling**:
6448
6449**Before**:
6450```html
6451<div class="form-field-checkbox"
6452     style="background: $bg !important;">
6453<!-- Border shows white ✗ -->
6454```
6455
6456**After**:
6457```php
6458<div class="form-field-checkbox"
6459     style="background: $bg !important;
6460            border-color: $grid_border !important;">
6461<!-- Border themed ✓ -->
6462```
6463
6464### Before vs After
6465
6466**BEFORE (v4.8.8)**:
6467```
6468Edit Dialog:
6469┌──────────────────┐
6470│ ☑ Repeating     ║│ ← White border ✗
6471└──────────────────┘
6472┌──────────────────┐
6473│ ☑ Task checkbox ║│ ← White border ✗
6474└──────────────────┘
6475```
6476
6477**AFTER (v4.9.0)**:
6478```
6479Matrix Edit Dialog:
6480┌──────────────────┐
6481│ ☑ Repeating      │ ← Green border ✓
6482└──────────────────┘
6483┌──────────────────┐
6484│ ☑ Task checkbox  │ ← Green border ✓
6485└──────────────────┘
6486```
6487
6488### ABSOLUTE PERFECTION ACHIEVED
6489
6490**Every element themed**:
6491- ✅ All inputs
6492- ✅ All labels
6493- ✅ All sections
6494- ✅ **Checkbox field borders** ← v4.9.0!
6495- ✅ All buttons
6496- ✅ All checkboxes
6497- ✅ No white anywhere
6498
6499**100% COMPLETE!** ��✨
6500
6501## Version 4.8.8 (2026-02-08) - FINAL FIXES: CHECKBOXES, BORDERS, BACKGROUNDS
6502
6503### �� Fixed: Checkbox Field Borders Themed
6504- **Fixed:** Added border-color to checkbox field divs
6505- **Fixed:** Repeating Event section border
6506- **Fixed:** Task checkbox section border
6507- **Result:** No white borders around checkboxes!
6508
6509### �� Fixed: Admin Sections Respect Wiki Theme
6510- **Fixed:** All admin backgrounds use CSS variables
6511- **Fixed:** Text colors use wiki text color
6512- **Fixed:** Borders use wiki border color
6513- **Result:** Admin matches wiki theme perfectly!
6514
6515### All Changes
6516
6517**1. Checkbox Field Border Styling**:
6518
6519**Before**:
6520```html
6521<div class="form-field-checkbox"
6522     style="background: $bg !important;">
6523<!-- Border shows white ✗ -->
6524```
6525
6526**After**:
6527```php
6528<div class="form-field-checkbox"
6529     style="background: $bg !important;
6530            border-color: $grid_border !important;">
6531<!-- Border themed ✓ -->
6532```
6533
6534**2. Admin CSS Variables**:
6535
6536**Added CSS variables for wiki theme compatibility**:
6537```css
6538.calendar-admin-wrapper {
6539    background: var(--__background_site__, #f5f5f5);
6540    color: var(--__text__, #333);
6541}
6542.calendar-admin-section {
6543    background: var(--__background_alt__, #fafafa);
6544}
6545.calendar-admin-input {
6546    background: var(--__background__, #fff);
6547    color: var(--__text__, #333);
6548}
6549```
6550
6551**Replaced hardcoded colors**:
6552```php
6553// Before:
6554background: #f9f9f9
6555background: white
6556color: #333
6557border: 1px solid #ddd
6558
6559// After:
6560background: var(--__background_alt__, #f9f9f9)
6561background: var(--__background__, #fff)
6562color: var(--__text__, #333)
6563border: 1px solid var(--__border__, #ddd)
6564```
6565
6566### Before vs After
6567
6568**BEFORE (v4.8.8)**:
6569```
6570Edit Dialog:
6571┌──────────────────┐
6572│ ☑ Repeating     ║│ ← White border ✗
6573└──────────────────┘
6574┌──────────────────┐
6575│ ☑ Task checkbox ║│ ← White border ✗
6576└──────────────────┘
6577
6578Admin Page (Dark Wiki Theme):
6579┌──────────────────┐
6580│ Light sections  │ ← White boxes ✗
6581│ Light inputs    │ ← Doesn't match ✗
6582└──────────────────┘
6583```
6584
6585**AFTER (v4.8.9)**:
6586```
6587Matrix Edit Dialog:
6588┌──────────────────┐
6589│ ☑ Repeating      │ ← Green border ✓
6590└──────────────────┘
6591┌──────────────────┐
6592│ ☑ Task checkbox  │ ← Green border ✓
6593└──────────────────┘
6594
6595Admin (Dark Wiki Theme):
6596┌──────────────────┐
6597│ Dark sections   │ ← Matches wiki ✓
6598│ Dark inputs     │ ← Perfect match ✓
6599└──────────────────┘
6600```
6601
6602### Admin Theme Examples
6603
6604**Light Wiki Theme**:
6605```
6606Admin page backgrounds: Light
6607Section boxes: Light gray
6608Inputs: White
6609Borders: Gray
6610Text: Dark
6611
6612Perfect match! ✓
6613```
6614
6615**Dark Wiki Theme**:
6616```
6617Admin page backgrounds: Dark
6618Section boxes: Darker gray
6619Inputs: Dark
6620Borders: Dark gray
6621Text: Light
6622
6623Perfect match! ✓
6624```
6625
6626**DokuWiki Default**:
6627```
6628Uses wiki's CSS variables
6629Automatically adapts
6630Always matches! ✓
6631```
6632
6633### Complete Coverage
6634
6635**Edit Dialog**:
6636- ✅ All inputs themed
6637- ✅ All labels themed
6638- ✅ All sections themed
6639- ✅ **Checkbox borders** ← v4.8.9!
6640- ✅ All buttons themed
6641- ✅ No white anywhere
6642
6643**Admin Interface**:
6644- ✅ **Tab navigation** ← v4.8.9!
6645- ✅ **Section boxes** ← v4.8.9!
6646- ✅ **Input fields** ← v4.8.9!
6647- ✅ **Text colors** ← v4.8.9!
6648- ✅ **Borders** ← v4.8.9!
6649- ✅ All tabs (Manage, Update, Outlook, Themes)
6650
6651### CSS Variables Used
6652
6653**DokuWiki provides these**:
6654- `--__background_site__`: Page background
6655- `--__background_alt__`: Alternate background
6656- `--__background__`: Primary background (inputs)
6657- `--__text__`: Text color
6658- `--__border__`: Border color
6659
6660**Fallbacks provided for older DokuWiki**:
6661```css
6662var(--__background_site__, #f5f5f5)
6663var(--__background_alt__, #fafafa)
6664var(--__background__, #fff)
6665var(--__text__, #333)
6666var(--__border__, #ddd)
6667```
6668
6669### Perfect Adaptation
6670
6671**Admin now adapts to ANY wiki theme**:
6672- Light themes → Light admin ✓
6673- Dark themes → Dark admin ✓
6674- Custom themes → Matches perfectly ✓
6675- No hardcoded colors ✓
6676
6677**Calendar themes still work**:
6678- Matrix, Purple, Professional, Pink ✓
6679- Independent from wiki theme ✓
6680- Admin respects wiki ✓
6681- Calendar respects calendar theme ✓
6682
6683### FINAL PERFECTION
6684
6685**Frontend (Calendar)**:
6686- Complete theming ✓
6687- 4 beautiful themes ✓
6688- Every pixel themed ✓
6689
6690**Backend (Admin)**:
6691- Respects wiki theme ✓
6692- Works with any theme ✓
6693- Perfect compatibility ✓
6694
6695**ABSOLUTELY EVERYTHING THEMED!** ����✨
6696
6697## Version 4.8.8 (2026-02-08) - FINAL FIXES: CHECKBOXES, BORDERS, BACKGROUNDS
6698
6699### �� Fixed: Task Checkboxes Now Fully Themed
6700- **Fixed:** Added background-color and border inline
6701- **Fixed:** Both PHP and JavaScript versions
6702- **Result:** No white checkboxes!
6703
6704### �� Fixed: Past Events Toggle Border
6705- **Fixed:** Added !important to border styling
6706- **Fixed:** Explicit top and bottom borders
6707- **Result:** No white line under toggle!
6708
6709### �� Fixed: Form Field Section Backgrounds
6710- **Fixed:** All form-field and form-row-group backgrounds
6711- **Fixed:** Every section in edit dialog
6712- **Result:** No white sections anywhere!
6713
6714### All Changes
6715
6716**1. Task Checkbox Styling**:
6717
6718**Before**:
6719```php
6720style="accent-color: $border !important;"
6721<!-- Only accent, background still white ✗ -->
6722```
6723
6724**After**:
6725```php
6726style="accent-color: $border !important;
6727       background-color: $cell_bg !important;
6728       border: 2px solid $grid_border !important;"
6729<!-- Full theming ✓ -->
6730```
6731
6732**2. Past Events Toggle Border**:
6733
6734**Before**:
6735```php
6736style="border-color: $grid_border;"
6737<!-- No !important, CSS overrides ✗ -->
6738```
6739
6740**After**:
6741```php
6742style="border-color: $grid_border !important;
6743       border-top: 1px solid $grid_border !important;
6744       border-bottom: 1px solid $grid_border !important;"
6745<!-- Cannot be overridden ✓ -->
6746```
6747
6748**3. Form Field Backgrounds**:
6749
6750**Before**:
6751```html
6752<div class="form-field">
6753<div class="form-row-group">
6754<!-- No background, shows white ✗ -->
6755```
6756
6757**After**:
6758```php
6759<div class="form-field" style="background: $bg !important;">
6760<div class="form-row-group" style="background: $bg !important;">
6761<!-- Fully themed ✓ -->
6762```
6763
6764### Before vs After
6765
6766**BEFORE (v4.8.7)**:
6767```
6768Event:
6769□ Task checkbox  ← White checkbox ✗
6770
6771Past Events
6772▶ Past Events (3) ← White line below ✗
6773─────────────────
6774
6775Edit Dialog:
6776┌──────────────┐
6777│ Form fields  │ ← White sections ✗
6778└──────────────┘
6779```
6780
6781**AFTER (v4.8.8)**:
6782```
6783Matrix Event:
6784☑ Task checkbox  ← Green checkbox ✓
6785
6786Past Events
6787▶ Past Events (3) ← Green border ✓
6788─────────────────
6789
6790Matrix Edit Dialog:
6791┌──────────────┐
6792│ Form fields  │ ← Dark green ✓
6793└──────────────┘
6794```
6795
6796### Complete Examples
6797
6798**Matrix Theme**:
6799```
6800Task Checkbox:
6801☑ Checked   → Green checkmark, green bg
6802☐ Unchecked → Green border, dark green bg ✓
6803
6804Past Events Toggle:
6805▶ Past Events (3)
6806─────────────────── Green border ✓
6807
6808Edit Dialog:
6809All sections dark green ✓
6810No white anywhere ✓
6811```
6812
6813**Purple Theme**:
6814```
6815Task Checkbox:
6816☑ Checked   → Purple checkmark, purple bg
6817☐ Unchecked → Purple border, dark purple bg ✓
6818
6819Past Events Toggle:
6820▶ Past Events (3)
6821─────────────────── Purple border ✓
6822
6823Edit Dialog:
6824All sections dark purple ✓
6825```
6826
6827**Professional Theme**:
6828```
6829Task Checkbox:
6830☑ Checked   → Blue checkmark, white bg
6831☐ Unchecked → Gray border, white bg ✓
6832
6833Past Events Toggle:
6834▶ Past Events (3)
6835─────────────────── Gray border ✓
6836
6837Edit Dialog:
6838All sections light ✓
6839```
6840
6841**Pink Theme**:
6842```
6843Task Checkbox:
6844☑ Checked   → Pink checkmark, pink bg ✨
6845☐ Unchecked → Pink border, dark pink bg ✓
6846
6847Past Events Toggle:
6848▶ Past Events (3)
6849─────────────────── Pink border ��
6850
6851Edit Dialog:
6852All sections dark pink ✓
6853```
6854
6855### Checkbox Visual
6856
6857**Matrix - Unchecked**:
6858```
6859┌─────┐
6860│     │ ← Dark green background
6861│     │   Green border
6862└─────┘
6863```
6864
6865**Matrix - Checked**:
6866```
6867┌─────┐
6868│ ✓   │ ← Dark green background
6869│     │   Green checkmark
6870└─────┘
6871```
6872
6873### Past Events Border
6874
6875**Before**:
6876```
6877▶ Past Events (3)
6878─────────────────── White line ✗
6879```
6880
6881**After**:
6882```
6883▶ Past Events (3)
6884─────────────────── Green line ✓ (Matrix)
6885                    Purple line ✓ (Purple)
6886                    Gray line ✓ (Professional)
6887                    Pink line ✓ (Pink)
6888```
6889
6890### Form Field Coverage
6891
6892**All sections themed**:
6893- ✅ Title field
6894- ✅ Namespace field
6895- ✅ Description field
6896- ✅ **Date row** ← v4.8.8!
6897- ✅ **Checkbox sections** ← v4.8.8!
6898- ✅ **Recurring options** ← v4.8.8!
6899- ✅ **Time row** ← v4.8.8!
6900- ✅ **Color row** ← v4.8.8!
6901- ✅ Button footer
6902
6903**Every div has background!** ✓
6904
6905### ABSOLUTE PERFECTION
6906
6907**Not a single white pixel**:
6908- ✅ No white checkboxes
6909- ✅ No white borders
6910- ✅ No white backgrounds
6911- ✅ No white sections
6912- ✅ No white lines
6913- ✅ No white anything
6914
6915**100% PERFECT THEMING!** ����✨
6916
6917## Version 4.8.7 (2026-02-08) - COMPLETE DIALOG & POPUP THEMING
6918
6919### �� Fixed: Checkbox Section Backgrounds Themed
6920- **Fixed:** Repeating Event section background
6921- **Fixed:** Task checkbox section background
6922- **Result:** No white backgrounds in dialog!
6923
6924### �� Fixed: Unchecked Task Checkboxes Themed
6925- **Fixed:** Added CSS for checkbox backgrounds
6926- **Fixed:** Unchecked boxes show theme colors
6927- **Result:** No white checkboxes!
6928
6929### �� Fixed: Day Popup Dialog Fully Themed
6930- **Fixed:** Popup container, header, body themed
6931- **Fixed:** Event items in popup themed
6932- **Fixed:** Add Event button themed
6933- **Fixed:** Footer section themed
6934- **Result:** Perfect popup theming!
6935
6936### All Changes
6937
6938**1. Checkbox Section Backgrounds**:
6939
6940**Before**:
6941```html
6942<div class="form-field-checkbox">
6943<!-- White background ✗ -->
6944```
6945
6946**After**:
6947```php
6948<div class="form-field-checkbox"
6949     style="background: $bg !important;">
6950<!-- Themed ✓ -->
6951```
6952
6953**2. Checkbox Background CSS**:
6954
6955**Added to style block**:
6956```css
6957.task-checkbox {
6958    background-color: $cell_bg !important;
6959    border: 2px solid $grid_border !important;
6960}
6961```
6962
6963**3. Day Popup Theming**:
6964
6965**Container**:
6966```javascript
6967style="background: $bg !important;
6968       border: 2px solid $border !important;
6969       box-shadow: 0 0 20px $shadow !important;"
6970```
6971
6972**Header**:
6973```javascript
6974style="background: $header_bg !important;
6975       color: $text_primary !important;
6976       border-bottom: 1px solid $border !important;"
6977```
6978
6979**Footer**:
6980```javascript
6981style="background: $bg !important;
6982       border-top: 1px solid $grid_border !important;"
6983```
6984
6985**Add Event Button**:
6986```javascript
6987style="background: $border !important;
6988       color: $bg !important;
6989       border-color: $border !important;"
6990```
6991
6992**Event Items**:
6993```javascript
6994style="background: $cell_bg !important;
6995       border: 1px solid $grid_border !important;"
6996```
6997
6998### Before vs After
6999
7000**BEFORE (v4.8.6)**:
7001```
7002Edit Dialog:
7003┌──────────────────┐
7004│ ☑ Repeating Event│ ← White background ✗
7005├──────────────────┤
7006│ ☑ Task checkbox  │ ← White background ✗
7007└──────────────────┘
7008
7009Day Popup:
7010┌──────────────────┐
7011│ Monday, Feb 8    │ ← White ✗
7012├──────────────────┤
7013│ Team Meeting     │ ← White ✗
7014│ 2:00 PM          │
7015├──────────────────┤
7016│ [+ Add Event]    │ ← White ✗
7017└──────────────────┘
7018
7019Task checkbox: ☐ ← White ✗
7020```
7021
7022**AFTER (v4.8.7)**:
7023```
7024Edit Dialog (Matrix):
7025┌──────────────────┐
7026│ ☑ Repeating Event│ ← Dark green ✓
7027├──────────────────┤
7028│ ☑ Task checkbox  │ ← Dark green ✓
7029└──────────────────┘
7030
7031Day Popup (Matrix):
7032┌──────────────────┐
7033│ Monday, Feb 8    │ ← Dark green ✓
7034├──────────────────┤
7035│ Team Meeting     │ ← Dark green ✓
7036│ 2:00 PM          │
7037├──────────────────┤
7038│ [+ Add Event]    │ ← Green button ✓
7039└──────────────────┘
7040
7041Task checkbox: ☑ ← Green ✓
7042```
7043
7044### Complete Examples
7045
7046**Matrix Dialog**:
7047```
7048┌──────────────────────────┐
7049│ ✏️ Edit Event            │
7050├──────────────────────────┤
7051│ �� Title: [_________]    │
7052│ �� Date: [__________]    │
7053│                          │
7054│ ☑ �� Repeating Event     │ ← Dark green bg
7055├──────────────────────────┤
7056│ ☑ �� Task checkbox       │ ← Dark green bg
7057├──────────────────────────┤
7058│ [Cancel] [�� Save]       │
7059└──────────────────────────┘
7060
7061All sections themed! ✓
7062```
7063
7064**Matrix Day Popup**:
7065```
7066┌──────────────────────────┐
7067│ Monday, February 8, 2026 │ ← Green header
7068├──────────────────────────┤
7069│ ┌──────────────────────┐ │
7070│ │ Team Meeting         │ │ ← Dark green
7071│ │ �� 2:00 PM           │ │
7072│ └──────────────────────┘ │
7073│ ┌──────────────────────┐ │
7074│ │ Code Review          │ │ ← Dark green
7075│ │ �� 4:00 PM           │ │
7076│ └──────────────────────┘ │
7077├──────────────────────────┤
7078│   [+ Add Event]          │ ← Green button
7079└──────────────────────────┘
7080```
7081
7082**Purple Day Popup**:
7083```
7084┌──────────────────────────┐
7085│ Monday, February 8, 2026 │ ← Purple header
7086├──────────────────────────┤
7087│ ┌──────────────────────┐ │
7088│ │ Team Meeting         │ │ ← Dark purple
7089│ │ �� 2:00 PM           │ │
7090│ └──────────────────────┘ │
7091├──────────────────────────┤
7092│   [+ Add Event]          │ ← Purple button
7093└──────────────────────────┘
7094```
7095
7096**Professional Day Popup**:
7097```
7098┌──────────────────────────┐
7099│ Monday, February 8, 2026 │ ← Light header
7100├──────────────────────────┤
7101│ ┌──────────────────────┐ │
7102│ │ Team Meeting         │ │ ← White
7103│ │ �� 2:00 PM           │ │
7104│ └──────────────────────┘ │
7105├──────────────────────────┤
7106│   [+ Add Event]          │ ← Blue button
7107└──────────────────────────┘
7108```
7109
7110**Pink Day Popup**:
7111```
7112┌──────────────────────────┐
7113│ Monday, February 8, 2026 │ ← Pink header ✨
7114├──────────────────────────┤
7115│ ┌──────────────────────┐ │
7116│ │ Team Meeting ��      │ │ ← Dark pink
7117│ │ �� 2:00 PM           │ │
7118│ └──────────────────────┘ │
7119├──────────────────────────┤
7120│   [+ Add Event]          │ ← Pink button
7121└──────────────────────────┘
7122```
7123
7124### Checkbox Theming
7125
7126**Unchecked boxes now themed**:
7127```
7128Matrix:
7129☐ → Dark green bg, green border ✓
7130
7131Purple:
7132☐ → Dark purple bg, purple border ✓
7133
7134Professional:
7135☐ → White bg, gray border ✓
7136
7137Pink:
7138☐ → Dark pink bg, pink border ✓
7139```
7140
7141### Complete Coverage
7142
7143**Edit Dialog - All Sections**:
7144- ✅ Header
7145- ✅ All inputs
7146- ✅ All labels
7147- ✅ **Checkbox sections** ← v4.8.7!
7148- ✅ Recurring options
7149- ✅ Button footer
7150- ✅ All checkboxes (checked & unchecked)
7151
7152**Day Popup - All Elements**:
7153- ✅ **Popup container** ← v4.8.7!
7154- ✅ **Header** ← v4.8.7!
7155- ✅ **Body** ← v4.8.7!
7156- ✅ **Event items** ← v4.8.7!
7157- ✅ **Namespace badges** ← v4.8.7!
7158- ✅ **Footer** ← v4.8.7!
7159- ✅ **Add Event button** ← v4.8.7!
7160- ✅ **No events message** ← v4.8.7!
7161
7162**Absolutely every dialog element themed!** ��✨
7163
7164### Perfect Theming Achievement
7165
7166**Every UI component in entire plugin**:
7167- ✅ Calendar grid
7168- ✅ Sidebar widget
7169- ✅ Event list
7170- ✅ Search bar
7171- ✅ Event boxes
7172- ✅ Edit dialog (complete)
7173- ✅ **Day popup** ← v4.8.7!
7174- ✅ Month picker
7175- ✅ All text
7176- ✅ All buttons
7177- ✅ All inputs
7178- ✅ **All checkboxes** ← v4.8.7!
7179- ✅ All borders
7180- ✅ All badges
7181- ✅ All backgrounds
7182
7183**NO WHITE ANYWHERE!** ��
7184
7185**100% COMPLETE THEMING ACHIEVED!** ��✨��
7186
7187## Version 4.8.6 (2026-02-08) - FIX DIALOG SECTIONS & EVENT BOX BORDERS
7188
7189### �� Fixed: Dialog Checkbox Sections Themed
7190- **Fixed:** Recurring options section background themed
7191- **Fixed:** Section has themed border accent
7192- **Result:** No white sections in dialog!
7193
7194### �� Fixed: Dialog Button Section Themed
7195- **Fixed:** Button area background themed
7196- **Fixed:** Top border separator themed
7197- **Result:** Complete dialog theming!
7198
7199### �� Fixed: Event Box Borders Themed
7200- **Fixed:** Top, right, bottom borders now themed
7201- **Fixed:** Left border remains event color
7202- **Result:** Perfect event boxes!
7203
7204### All Changes
7205
7206**1. Recurring Options Section**:
7207
7208**Before**:
7209```html
7210<div class="recurring-options" style="display:none;">
7211<!-- White background ✗ -->
7212```
7213
7214**After**:
7215```php
7216<div class="recurring-options"
7217     style="display:none;
7218            background: $bg !important;
7219            padding: 8px;
7220            border-left: 2px solid $border;
7221            margin-left: 4px;">
7222<!-- Themed with accent border ✓ -->
7223```
7224
7225**2. Dialog Actions Section**:
7226
7227**Before**:
7228```html
7229<div class="dialog-actions-sleek">
7230<!-- White background ✗ -->
7231```
7232
7233**After**:
7234```php
7235<div class="dialog-actions-sleek"
7236     style="background: $bg !important;
7237            border-top: 1px solid $grid_border !important;">
7238<!-- Themed with separator ✓ -->
7239```
7240
7241**3. Event Box Borders**:
7242
7243**Before**:
7244```php
7245border-left-color: $event_color;
7246<!-- Only left border colored ✗ -->
7247```
7248
7249**After**:
7250```php
7251border-left-color: $event_color;
7252border-top: 1px solid $grid_border !important;
7253border-right: 1px solid $grid_border !important;
7254border-bottom: 1px solid $grid_border !important;
7255<!-- All borders themed! ✓ -->
7256```
7257
7258### Before vs After
7259
7260**BEFORE (v4.8.5)**:
7261```
7262Dialog:
7263┌────────────────┐
7264│ ☑ Repeating    │
7265├────────────────┤ ← White section ✗
7266│ Repeat: Daily  │
7267│ Until: [____]  │
7268├────────────────┤
7269│ [Cancel] [Save]│ ← White footer ✗
7270└────────────────┘
7271
7272Event Box:
7273┌────────────┐
7274│Team Meeting│ ← White borders ✗
7275│2:00 PM     │
7276└────────────┘
7277```
7278
7279**AFTER (v4.8.6)**:
7280```
7281Matrix Dialog:
7282┌────────────────┐
7283│ ☑ Repeating    │
7284├────────────────┤ ← Dark green ✓
7285│ Repeat: Daily  │ Green accent border
7286│ Until: [____]  │
7287├────────────────┤
7288│ [Cancel] [Save]│ ← Dark green ✓
7289└────────────────┘
7290
7291Matrix Event Box:
7292┌────────────┐
7293│Team Meeting│ ← Green borders ✓
7294│2:00 PM     │
7295└────────────┘
7296```
7297
7298### Dialog Section Examples
7299
7300**Matrix Theme**:
7301```
7302┌──────────────────────────┐
7303│ ✏️ Edit Event            │
7304├──────────────────────────┤
7305│ ☑ �� Repeating Event     │
7306├║─────────────────────────┤ Green accent
7307│║ Repeat Every: Daily     │ Dark green bg
7308│║ Repeat Until: [_____]   │
7309└──────────────────────────┘
7310  [Cancel] [�� Save]       ← Dark green bg
7311──────────────────────────── Green border
7312```
7313
7314**Purple Theme**:
7315```
7316┌──────────────────────────┐
7317│ ☑ �� Repeating Event     │
7318├║─────────────────────────┤ Purple accent
7319│║ Repeat options...       │ Dark purple bg
7320└──────────────────────────┘
7321  [Cancel] [�� Save]       ← Dark purple bg
7322──────────────────────────── Purple border
7323```
7324
7325**Professional Theme**:
7326```
7327┌──────────────────────────┐
7328│ ☑ �� Repeating Event     │
7329├║─────────────────────────┤ Blue accent
7330│║ Repeat options...       │ Light bg
7331└──────────────────────────┘
7332  [Cancel] [�� Save]       ← Light bg
7333──────────────────────────── Gray border
7334```
7335
7336**Pink Theme**:
7337```
7338┌──────────────────────────┐
7339│ ☑ �� Repeating Event ✨  │
7340├║─────────────────────────┤ Pink accent
7341│║ Repeat options...       │ Dark pink bg ��
7342└──────────────────────────┘
7343  [Cancel] [�� Save]       ← Dark pink bg
7344──────────────────────────── Pink border
7345```
7346
7347### Event Box Border Visual
7348
7349**Before (v4.8.5)**:
7350```
7351Left border only:
7352█ Team Meeting
7353█ 2:00 PM
7354█ [Edit] [Delete]
7355
7356Only event color on left ✗
7357White on other 3 sides ✗
7358```
7359
7360**After (v4.8.6)**:
7361```
7362All borders themed:
7363┌─────────────┐
7364█Team Meeting │ ← Top: themed
7365█2:00 PM      │ ← Right: themed
7366█[Edit][Del]  │ ← Bottom: themed
7367└─────────────┘
7368
7369Left: Event color ✓
7370Other 3: Theme grid_border ✓
7371```
7372
7373### Matrix Event Box:
7374```
7375┌─────────────┐ Green border
7376│Team Meeting │
7377│2:00 PM      │
7378└─────────────┘ Green border
73797380Green left bar
7381```
7382
7383### Purple Event Box:
7384```
7385┌─────────────┐ Purple border
7386│Team Meeting │
7387│2:00 PM      │
7388└─────────────┘ Purple border
73897390Purple left bar
7391```
7392
7393### Professional Event Box:
7394```
7395┌─────────────┐ Gray border
7396│Team Meeting │
7397│2:00 PM      │
7398└─────────────┘ Gray border
73997400Event color left bar
7401```
7402
7403### Complete Dialog Coverage
7404
7405**All sections themed**:
7406- ✅ Dialog header
7407- ✅ Form inputs
7408- ✅ Checkbox labels
7409- ✅ **Recurring options** ← v4.8.6!
7410- ✅ **Button section** ← v4.8.6!
7411- ✅ All labels
7412- ✅ All buttons
7413
7414**No white sections!** ✓
7415
7416### Complete Event Box Coverage
7417
7418**All borders themed**:
7419- ✅ Left border (event color)
7420- ✅ **Top border** ← v4.8.6!
7421- ✅ **Right border** ← v4.8.6!
7422- ✅ **Bottom border** ← v4.8.6!
7423- ✅ Background
7424- ✅ Text
7425
7426**Perfect box outline!** ✓
7427
7428### Visual Perfection
7429
7430**Matrix theme event list**:
7431```
7432┌─────────────┐
7433│Team Meeting │ ← Green box
7434│2:00 PM      │
7435└─────────────┘
7436┌─────────────┐
7437│Code Review  │ ← Green box
7438│4:00 PM      │
7439└─────────────┘
7440
7441All borders green! ✓
7442```
7443
7444**ABSOLUTE PERFECT THEMING!** ��✨
7445
7446## Version 4.8.5 (2026-02-08) - THEME EVENT DIALOG & SIDEBAR BORDERS
7447
7448### �� Fixed: Event Dialog Fully Themed
7449- **Fixed:** Dialog background, header, inputs all themed
7450- **Fixed:** All labels, checkboxes, selects themed
7451- **Fixed:** Save and Cancel buttons themed
7452- **Result:** Dialog matches theme perfectly!
7453
7454### �� Fixed: Sidebar Event Borders Properly Themed
7455- **Fixed:** Event divider borders use grid_border color
7456- **Fixed:** Clean, subtle themed dividers
7457- **Result:** No more white borders in sidebar!
7458
7459### All Changes
7460
7461**1. Event Dialog Theming**:
7462
7463**Dialog container**:
7464```php
7465background: $themeStyles['bg'] !important;
7466border: 2px solid $themeStyles['border'] !important;
7467box-shadow: 0 0 20px $shadow !important;
7468```
7469
7470**Dialog header**:
7471```php
7472background: $themeStyles['header_bg'] !important;
7473color: $themeStyles['text_primary'] !important;
7474border-bottom: 1px solid $border !important;
7475```
7476
7477**All form inputs** (text, date, select, textarea):
7478```php
7479background: $themeStyles['cell_bg'] !important;
7480color: $themeStyles['text_primary'] !important;
7481border-color: $themeStyles['grid_border'] !important;
7482```
7483
7484**All labels**:
7485```php
7486color: $themeStyles['text_primary'] !important;
7487```
7488
7489**Checkboxes**:
7490```php
7491accent-color: $themeStyles['border'] !important;
7492```
7493
7494**Buttons**:
7495```php
7496// Cancel button:
7497background: $cell_bg !important;
7498color: $text_primary !important;
7499
7500// Save button:
7501background: $border !important;
7502color: $bg !important; (or white for professional)
7503```
7504
7505**2. Sidebar Event Borders**:
7506
7507**Before**:
7508```php
7509border-bottom: 1px solid rgba(0, 204, 7, 0.2); // Hardcoded
7510```
7511
7512**After**:
7513```php
7514borderColor = $themeStyles['grid_border'];
7515border-bottom: 1px solid $borderColor !important;
7516```
7517
7518### Before vs After
7519
7520**BEFORE (v4.8.4)**:
7521```
7522Event Dialog:
7523┌────────────────┐
7524│ Add Event      │ ← White background ✗
7525│ Title: [_____] │ ← White inputs ✗
7526│ Date:  [_____] │
7527│ [Cancel] [Save]│ ← Default buttons ✗
7528└────────────────┘
7529
7530Sidebar Events:
7531Event 1 ────────  ← White border ✗
7532Event 2 ────────  ← White border ✗
7533```
7534
7535**AFTER (v4.8.5)**:
7536```
7537Event Dialog (Matrix):
7538┌────────────────┐
7539│ Add Event      │ ← Dark green background ✓
7540│ Title: [_____] │ ← Dark green inputs ✓
7541│ Date:  [_____] │ ← Green text ✓
7542│ [Cancel] [Save]│ ← Themed buttons ✓
7543└────────────────┘
7544
7545Sidebar Events (Matrix):
7546Event 1 ────────  ← Green border ✓
7547Event 2 ────────  ← Green border ✓
7548```
7549
7550### Dialog Examples by Theme
7551
7552**Matrix Dialog**:
7553```
7554┌──────────────────────────┐
7555│ ✏️ Edit Event            │ ← Dark green header
7556├──────────────────────────┤
7557│ �� Title                 │ ← Green labels
7558│ [Team Meeting________]   │ ← Dark green input
7559│                          │
7560│ �� Start Date            │
7561│ [2026-02-08__]           │ ← Dark green input
7562│                          │
7563│ �� Start Time            │
7564│ [2:00 PM ▼]              │ ← Green select
7565│                          │
7566│ ☑ �� Repeating Event     │ ← Green checkbox
7567│                          │
7568│ [Cancel] [�� Save]       │ ← Themed buttons
7569└──────────────────────────┘
7570
7571Everything green! ✓
7572```
7573
7574**Purple Dialog**:
7575```
7576┌──────────────────────────┐
7577│ ✏️ Edit Event            │ ← Dark purple header
7578├──────────────────────────┤
7579│ [Inputs_______________]  │ ← Dark purple inputs
7580│ ☑ Checkboxes             │ ← Purple accent
7581│ [Cancel] [�� Save]       │ ← Purple buttons
7582└──────────────────────────┘
7583```
7584
7585**Professional Dialog**:
7586```
7587┌──────────────────────────┐
7588│ ✏️ Edit Event            │ ← Light gradient header
7589├──────────────────────────┤
7590│ [Inputs_______________]  │ ← White inputs
7591│ ☑ Checkboxes             │ ← Blue accent
7592│ [Cancel] [�� Save]       │ ← Blue save button
7593└──────────────────────────┘
7594```
7595
7596**Pink Dialog**:
7597```
7598┌──────────────────────────┐
7599│ ✏️ Edit Event            │ ← Dark pink header ✨
7600├──────────────────────────┤
7601│ [Inputs_______________]  │ ← Dark pink inputs ��
7602│ ☑ Checkboxes             │ ← Pink accent
7603│ [Cancel] [�� Save]       │ ← Pink buttons
7604└──────────────────────────┘
7605```
7606
7607### Complete Dialog Element Coverage
7608
7609**All form elements themed**:
7610- ✅ Dialog container
7611- ✅ Dialog header
7612- ✅ Close button (×)
7613- ✅ Title input
7614- ✅ Namespace search
7615- ✅ Namespace dropdown
7616- ✅ Description textarea
7617- ✅ Start date input
7618- ✅ End date input
7619- ✅ Recurring checkbox
7620- ✅ Recurrence type select
7621- ✅ Recurrence end date
7622- ✅ Start time select
7623- ✅ End time select
7624- ✅ Color select
7625- ✅ Custom color picker
7626- ✅ Task checkbox
7627- ✅ All labels
7628- ✅ Cancel button
7629- ✅ Save button
7630
7631**Every single dialog element themed!** ��
7632
7633### Sidebar Border Example
7634
7635**Matrix Sidebar**:
7636```
7637┌────────────────┐
7638│ Today          │ ← Green section header
7639├────────────────┤
7640│ Team Meeting   │
7641│ 2:00 PM        │
7642├────────────────┤ ← Green border (grid_border)
7643│ Code Review    │
7644│ 4:00 PM        │
7645├────────────────┤ ← Green border
7646│ Stand-up       │
7647│ All day        │
7648└────────────────┘
7649
7650Subtle green dividers! ✓
7651```
7652
7653### Complete Achievement
7654
7655**Every UI element themed**:
7656- ✅ Calendar
7657- ✅ Sidebar widget
7658- ✅ Event list
7659- ✅ Search bar
7660- ✅ **Event dialog** ← v4.8.5!
7661- ✅ Month picker
7662- ✅ **Sidebar dividers** ← v4.8.5!
7663- ✅ All text
7664- ✅ All inputs
7665- ✅ All buttons
7666- ✅ All borders
7667- ✅ All checkboxes
7668
7669**ABSOLUTE COMPLETE THEMING!** ��✨
7670
7671## Version 4.8.4 (2026-02-08) - FIX PROFESSIONAL THEME BACKGROUNDS
7672
7673### �� Fixed: Professional Theme Background Consistency
7674- **Fixed:** Container and event backgrounds now match sidebar
7675- **Fixed:** Lighter, cleaner appearance
7676- **Fixed:** Better contrast and readability
7677- **Result:** Professional theme looks cohesive!
7678
7679### The Problem
7680
7681**v4.8.3 Professional theme**:
7682```
7683Sidebar: Light background (#f5f7fa)
7684Calendar: Medium background (#e8ecf1) ← Didn't match!
7685Events: Light background (#f5f7fa)
7686
7687Inconsistent! ✗
7688```
7689
7690### The Fix
7691
7692**Updated Professional theme colors for consistency**:
7693
7694```php
7695// Before:
7696'bg' => '#e8ecf1',        // Medium gray-blue
7697'cell_bg' => '#f5f7fa',   // Very light
7698'grid_bg' => '#d5dbe3',   // Medium-dark
7699
7700// After:
7701'bg' => '#f5f7fa',        // Very light (matches sidebar)
7702'cell_bg' => '#ffffff',   // Pure white (clean)
7703'grid_bg' => '#e8ecf1',   // Subtle contrast
7704'grid_border' => '#d0d7de', // Softer borders
7705```
7706
7707### Before vs After
7708
7709**BEFORE (v4.8.3)**:
7710```
7711Professional Theme:
7712┌────────────────┐
7713│ Calendar       │ ← Medium gray (#e8ecf1)
7714│ ┌────────────┐ │
7715│ │ Event      │ │ ← Light (#f5f7fa)
7716│ └────────────┘ │
7717└────────────────┘
7718
7719Sidebar:
7720┌────────────────┐
7721│ Widget         │ ← Light (#f5f7fa)
7722└────────────────┘
7723
7724Backgrounds don't match! ✗
7725```
7726
7727**AFTER (v4.8.4)**:
7728```
7729Professional Theme:
7730┌────────────────┐
7731│ Calendar       │ ← Light (#f5f7fa)
7732│ ┌────────────┐ │
7733│ │ Event      │ │ ← White (#ffffff)
7734│ └────────────┘ │
7735└────────────────┘
7736
7737Sidebar:
7738┌────────────────┐
7739│ Widget         │ ← Light (#f5f7fa)
7740└────────────────┘
7741
7742Perfect match! ✓
7743```
7744
7745### New Professional Theme Colors
7746
7747**Backgrounds**:
7748- Container: `#f5f7fa` (light blue-gray)
7749- Events: `#ffffff` (pure white)
7750- Grid: `#e8ecf1` (subtle contrast)
7751
7752**Text**:
7753- Primary: `#2c3e50` (dark blue-gray)
7754- Bright: `#4a90e2` (blue accent)
7755- Dim: `#7f8c8d` (medium gray)
7756
7757**Borders**:
7758- Main: `#4a90e2` (blue)
7759- Grid: `#d0d7de` (soft gray)
7760
7761**Header**:
7762- Gradient: `#ffffff` → `#f5f7fa`
7763
7764### Visual Example
7765
7766**Professional Theme Now**:
7767```
7768┌─────────────────────────────┐
7769│ February 2026               │ ← White to light gradient
7770├─┬─┬─┬─┬─┬─┬─┬───────────────┤
7771│S│M│T│W│T│F│S│               │ ← Light background
7772├─┼─┼─┼─┼─┼─┼─┤               │
7773│ │ │1│2│3│4│5│ Event List    │ ← White events
7774│ │ │ │ │ │ │ │ ┌───────────┐ │
7775│ │ │ │ │[8]│ │ │ Meeting   │ │ ← White on light
7776└─┴─┴─┴─┴─┴─┴─┴─└───────────┘─┘
7777
7778Clean, professional look! ✓
7779```
7780
7781### Comparison with Other Themes
7782
7783**Matrix** (dark):
7784- Container: #242424 (dark green)
7785- Events: #242424 (dark green)
7786- Consistent dark theme ✓
7787
7788**Purple** (dark):
7789- Container: #1a0d14 (dark purple)
7790- Events: #2a2030 (dark purple)
7791- Consistent dark theme ✓
7792
7793**Professional** (light):
7794- Container: #f5f7fa (light blue)
7795- Events: #ffffff (white)
7796- Consistent light theme ✓
7797
7798**Pink** (dark):
7799- Container: #1a0d14 (dark pink)
7800- Events: #1a0d14 (dark pink)
7801- Consistent dark theme ✓
7802
7803**All themes now consistent!** ��
7804
7805### Better Contrast
7806
7807**Professional theme improvements**:
7808
7809**Readability**:
7810- Dark text (#2c3e50) on white/light backgrounds ✓
7811- Excellent contrast ratio ✓
7812- Easy on the eyes ✓
7813
7814**Visual hierarchy**:
7815- White events pop against light container ✓
7816- Blue accents stand out ✓
7817- Clean, modern look ✓
7818
7819**Professional appearance**:
7820- Lighter = more corporate/business feel ✓
7821- Clean whites = premium quality ✓
7822- Subtle grays = sophisticated ✓
7823
7824### Complete Theme Consistency
7825
7826**All themes now have matching backgrounds**:
7827
7828**Matrix**:
7829- Sidebar & Calendar both dark green ✓
7830
7831**Purple**:
7832- Sidebar & Calendar both dark purple ✓
7833
7834**Professional**:
7835- Sidebar & Calendar both light ✓ (v4.8.4!)
7836
7837**Pink**:
7838- Sidebar & Calendar both dark pink ✓
7839
7840**Perfect visual unity across all views!** ��✨
7841
7842## Version 4.8.3 (2026-02-08) - FINAL POLISH: BOLD TEXT, SEARCH, SIDEBAR BOXES
7843
7844### �� Fixed: Bold Text in Descriptions Themed
7845- **Fixed:** **Bold text** now uses theme primary color
7846- **Fixed:** Both `**text**` and `__text__` syntax themed
7847- **Result:** Bold text matches theme!
7848
7849### �� Fixed: Search Bar Fully Themed
7850- **Fixed:** Search input has !important on all styles
7851- **Fixed:** Icon and placeholder text themed
7852- **Result:** Search bar perfectly themed!
7853
7854### �� Fixed: Sidebar Event Boxes Themed
7855- **Fixed:** Event borders in sidebar now use theme grid_border color
7856- **Fixed:** Borders have !important flag
7857- **Result:** Sidebar boxes match theme!
7858
7859### All Changes
7860
7861**1. Bold Text Styling**:
7862
7863**Before**:
7864```html
7865<strong>Bold text</strong> ← Default black
7866```
7867
7868**After**:
7869```php
7870<strong style="color: $text_primary !important; font-weight:bold;">
7871    Bold text
7872</strong>
7873
7874Matrix: Green bold ✓
7875Purple: Lavender bold ✓
7876Professional: Dark bold ✓
7877Pink: Pink bold ✓
7878```
7879
7880**2. Search Bar**:
7881
7882**Before**:
7883```php
7884style="background: $bg; color: $text;"
7885Could be overridden by CSS
7886```
7887
7888**After**:
7889```php
7890style="background: $bg !important;
7891       color: $text_primary !important;
7892       border-color: $grid_border !important;"
7893
7894Cannot be overridden! ✓
7895```
7896
7897**3. Sidebar Event Boxes**:
7898
7899**Before**:
7900```php
7901$borderColor = 'rgba(0, 204, 7, 0.2)'; // Hardcoded
7902```
7903
7904**After**:
7905```php
7906$borderColor = $themeStyles['grid_border']; // From theme
7907border-bottom: 1px solid $borderColor !important;
7908
7909Matrix: Green borders ✓
7910Purple: Purple borders ✓
7911Professional: Gray borders ✓
7912Pink: Pink borders ✓
7913```
7914
7915### Before vs After
7916
7917**BEFORE (v4.8.2)**:
7918```
7919Event description:
7920"Please review **Q1 Goals** carefully"
79217922            Black bold ✗
7923
7924Search bar:
7925[�� Search...] ← Gray placeholder ✗
7926
7927Sidebar:
7928┌────────────┐
7929│ Event 1    │
7930├────────────┤ ← Gray border ✗
7931│ Event 2    │
7932└────────────┘
7933```
7934
7935**AFTER (v4.8.3)**:
7936```
7937Matrix Theme:
7938
7939Event description:
7940"Please review **Q1 Goals** carefully"
79417942            Green bold ✓
7943
7944Search bar:
7945[�� Search...] ← Green themed ✓
7946
7947Sidebar:
7948┌────────────┐
7949│ Event 1    │
7950├────────────┤ ← Green border ✓
7951│ Event 2    │
7952└────────────┘
7953```
7954
7955### Examples by Theme
7956
7957**Matrix Theme**:
7958```
7959Description:
7960"Check **important notes** and links"
79617962   Green bold
7963
7964Sidebar boxes:
7965Event 1
7966───────── Green border
7967Event 2
7968───────── Green border
7969```
7970
7971**Purple Theme**:
7972```
7973Description:
7974"Review **agenda items** before meeting"
79757976   Lavender bold
7977
7978Sidebar boxes:
7979Event 1
7980───────── Purple border
7981Event 2
7982───────── Purple border
7983```
7984
7985**Professional Theme**:
7986```
7987Description:
7988"Update **quarterly reports** by Friday"
79897990   Dark bold
7991
7992Sidebar boxes:
7993Event 1
7994───────── Gray border
7995Event 2
7996───────── Gray border
7997```
7998
7999**Pink Theme**:
8000```
8001Description:
8002"Don't forget **party supplies** ✨"
80038004        Pink bold
8005
8006Sidebar boxes:
8007Event 1 ��
8008───────── Pink border
8009Event 2 ✨
8010───────── Pink border
8011```
8012
8013### Complete Formatting Coverage
8014
8015**Text formatting themed**:
8016- ✅ Regular text
8017- ✅ **Bold text** ← NEW!
8018- ✅ Links
8019- ✅ Italic text (inherits)
8020- ✅ Code (inherits)
8021
8022**UI elements themed**:
8023- ✅ Search bar ← Enhanced!
8024- ✅ Search icon ← Enhanced!
8025- ✅ Search placeholder ← Enhanced!
8026- ✅ Sidebar borders ← NEW!
8027- ✅ Event borders
8028- ✅ Badges
8029- ✅ Buttons
8030
8031**Every element perfectly themed!** ��
8032
8033### Search Bar Coverage
8034
8035**All aspects themed**:
8036- Background: Theme cell_bg ✓
8037- Text color: Theme text_primary ✓
8038- Border: Theme grid_border ✓
8039- Placeholder: Inherits text color ✓
8040- Icon (��): In placeholder ✓
8041- Clear button (✕): Themed ✓
8042
8043**Cannot be overridden!** (all have !important)
8044
8045### Sidebar Event Box Styling
8046
8047**Consistent borders**:
8048```
8049Matrix:
8050╔════════════╗
8051║ Event 1    ║
8052╟────────────╢ ← grid_border color
8053║ Event 2    ║
8054╚════════════╝
8055
8056All themes match perfectly! ✓
8057```
8058
8059### Complete Theme Achievement
8060
8061**Every single element themed**:
8062- ✅ Backgrounds
8063- ✅ Text (regular)
8064- ✅ Text (bold) ← v4.8.3!
8065- ✅ Links
8066- ✅ Badges
8067- ✅ Buttons
8068- ✅ Checkboxes
8069- ✅ Icons
8070- ✅ Borders
8071- ✅ Search bar ← Enhanced v4.8.3!
8072- ✅ Sidebar boxes ← v4.8.3!
8073- ✅ Today marker
8074- ✅ Calendar grid
8075- ✅ Event panels
8076
8077**ABSOLUTE PERFECTION!** ��✨
8078
8079## Version 4.8.2 (2026-02-08) - THEME LINKS IN DESCRIPTIONS
8080
8081### �� Fixed: Links in Descriptions Now Themed
8082- **Fixed:** All links in event descriptions now use theme color
8083- **Fixed:** DokuWiki links [[page|text]] themed
8084- **Fixed:** Markdown links [text](url) themed
8085- **Fixed:** Plain URLs themed
8086- **Result:** Links match theme perfectly!
8087
8088### The Problem
8089
8090**v4.8.1 behavior**:
8091```
8092Event description:
8093"Check out https://example.com" ← Blue default link ✗
8094"See [[wiki:page|docs]]" ← Blue default link ✗
8095```
8096
8097### The Fix
8098
8099**Added inline color styling to ALL link types**:
8100
8101```php
8102// Get theme colors:
8103$linkColor = $themeStyles['border'] . ' !important';
8104$linkStyle = ' style="color:' . $linkColor . ';"';
8105
8106// Apply to links:
8107<a href="..." style="color: #00cc07 !important;">link</a>
8108```
8109
8110**All link types themed**:
81111. DokuWiki syntax: `[[page|text]]`
81122. Markdown syntax: `[text](url)`
81133. Plain URLs: `https://example.com`
8114
8115### Before vs After
8116
8117**BEFORE (v4.8.1)**:
8118```
8119Matrix Theme Description:
8120"Visit https://example.com for more info"
81218122     Blue link ✗ (doesn't match green theme)
8123```
8124
8125**AFTER (v4.8.2)**:
8126```
8127Matrix Theme Description:
8128"Visit https://example.com for more info"
81298130     Green link ✓ (matches theme!)
8131```
8132
8133### Link Colors by Theme
8134
8135**Matrix**:
8136- Links: Green (#00cc07) !important
8137- Matches: Border, badges, highlights
8138
8139**Purple**:
8140- Links: Purple (#9b59b6) !important
8141- Matches: Border, badges, highlights
8142
8143**Professional**:
8144- Links: Blue (#4a90e2) !important
8145- Matches: Border, badges, highlights
8146
8147**Pink**:
8148- Links: Hot Pink (#ff1493) !important
8149- Matches: Border, badges, highlights ✨
8150
8151### Examples
8152
8153**Matrix Description with Links**:
8154```
8155Event: Team Meeting
8156Description:
8157"Review [[wiki:q1goals|Q1 Goals]]
8158and visit https://metrics.com"
8159
8160Both links → Green ✓
8161```
8162
8163**Purple Description with Links**:
8164```
8165Event: Planning Session
8166Description:
8167"Check [schedule](https://cal.com)
8168for availability"
8169
8170Link → Purple ✓
8171```
8172
8173**Professional Description with Links**:
8174```
8175Event: Client Call
8176Description:
8177"Prepare [[reports|Monthly Reports]]
8178before the call"
8179
8180Link → Blue ✓
8181```
8182
8183**Pink Description with Links**:
8184```
8185Event: Party Planning
8186Description:
8187"RSVP at https://party.com ✨"
8188
8189Link → Hot Pink ✓ ��
8190```
8191
8192### Technical Implementation
8193
8194**Updated renderDescription() function**:
8195
8196```php
8197private function renderDescription($description, $themeStyles = null) {
8198    // Get theme
8199    if ($themeStyles === null) {
8200        $theme = $this->getSidebarTheme();
8201        $themeStyles = $this->getSidebarThemeStyles($theme);
8202    }
8203
8204    // Create link style
8205    $linkColor = $themeStyles['border'] . ' !important';
8206    $linkStyle = ' style="color:' . $linkColor . ';"';
8207
8208    // Apply to all link types:
8209    $linkHtml = '<a href="..." ' . $linkStyle . '>text</a>';
8210}
8211```
8212
8213### Complete Theming
8214
8215**Every text element**:
8216- ✅ Event titles
8217- ✅ Event dates
8218- ✅ Event descriptions
8219- ✅ **Links in descriptions** ← NEW!
8220- ✅ Badges
8221- ✅ Buttons
8222
8223**Every color unified!** ��
8224
8225### Unified Theme Experience
8226
8227**Matrix Theme**:
8228```
8229Everything green:
8230- Text: Green ✓
8231- Links: Green ✓
8232- Badges: Green ✓
8233- Borders: Green ✓
8234- Buttons: Green ✓
8235- Today marker: Green ✓
8236
8237Perfect harmony! ✓
8238```
8239
8240**No default blue links breaking the theme!**
8241
8242### Link Types Supported
8243
8244**1. DokuWiki Syntax**:
8245```
8246[[page|Link Text]] → Themed ✓
8247[[page]] → Themed ✓
8248[[page#section|Text]] → Themed ✓
8249```
8250
8251**2. Markdown Syntax**:
8252```
8253[Link Text](https://url.com) → Themed ✓
8254[Text](internal-page) → Themed ✓
8255```
8256
8257**3. Plain URLs**:
8258```
8259https://example.com → Themed ✓
8260http://site.org → Themed ✓
8261```
8262
8263**All links perfectly themed!** ����
8264
8265## Version 4.8.1 (2026-02-08) - FIX BADGES & TODAY CELL MARKER
8266
8267### �� Fixed: All Badges Now Themed
8268- **Fixed:** TODAY badge themed with theme color
8269- **Fixed:** PAST DUE badge uses orange (warning color)
8270- **Fixed:** Namespace badges themed
8271- **Fixed:** All badges visible and hidden
8272- **Result:** All badges match theme!
8273
8274### �� Fixed: Today Cell More Prominent
8275- **Fixed:** Today cell now has 2px border in theme color
8276- **Fixed:** Border added to both PHP and JavaScript
8277- **Result:** Today stands out clearly!
8278
8279### �� Fixed: Past Event Text Fully Themed
8280- **Fixed:** Event-info div backgrounds ensure no gray
8281- **Result:** Expanded past events completely themed!
8282
8283### All Changes
8284
8285**1. Badge Theming**:
8286
8287**TODAY Badge**:
8288```php
8289// PHP & JavaScript:
8290style="background: $themeStyles['border'] !important;
8291       color: $bg !important;"
8292
8293Matrix: Green badge
8294Purple: Purple badge
8295Professional: Blue badge with white text
8296Pink: Pink badge
8297```
8298
8299**PAST DUE Badge** (always orange):
8300```php
8301style="background: #ff9800 !important;
8302       color: #fff !important;"
8303```
8304
8305**Namespace Badge**:
8306```php
8307style="background: $themeStyles['border'] !important;
8308       color: $bg !important;"
8309```
8310
8311**2. Today Cell Border**:
8312
8313**PHP**:
8314```php
8315$todayBorder = $isToday ?
8316    'border:2px solid ' . $themeStyles['border'] . ' !important;' : '';
8317```
8318
8319**JavaScript**: Same
8320
8321**Result**: Today cell has prominent colored border!
8322
8323### Before vs After
8324
8325**BEFORE (v4.8.0)**:
8326```
8327Calendar:
8328┌─┬─┬─┬─┬─┬─┬─┐
8329│1│2│3│4│5│6│7│
8330│ │ │ │[8]│ │ │ ← Today: subtle background
8331└─┴─┴─┴─┴─┴─┴─┘
8332
8333Event badges:
8334Mon, Feb 8 [TODAY] [Work] ← Gray badges ✗
8335```
8336
8337**AFTER (v4.8.1)**:
8338```
8339Calendar (Matrix):
8340┌─┬─┬─┬─┬─┬─┬─┐
8341│1│2│3│4│5│6│7│
8342│ │ │ │[8]│ │ │ ← Today: green border 2px ✓
8343└─┴─┴─┴─┴─┴─┴─┘
8344
8345Event badges (Matrix):
8346Mon, Feb 8 [TODAY] [Work] ← Green badges ✓
8347```
8348
8349### Matrix Theme Example
8350
8351**Calendar**:
8352```
8353Today cell:
8354┌────┐
8355│ 8  │ Dark green bg + Green 2px border
8356└────┘
8357Very obvious!
8358```
8359
8360**Badges**:
8361```
8362[TODAY] ← Green bg, dark text
8363[Work]  ← Green bg, dark text
8364[PAST DUE] ← Orange bg, white text
8365```
8366
8367### Purple Theme Example
8368
8369**Calendar**:
8370```
8371Today cell:
8372┌────┐
8373│ 8  │ Dark purple bg + Purple 2px border
8374└────┘
8375```
8376
8377**Badges**:
8378```
8379[TODAY] ← Purple bg
8380[Work]  ← Purple bg
8381```
8382
8383### Professional Theme Example
8384
8385**Calendar**:
8386```
8387Today cell:
8388┌────┐
8389│ 8  │ Light blue bg + Blue 2px border
8390└────┘
8391```
8392
8393**Badges**:
8394```
8395[TODAY] ← Blue bg, white text
8396[Work]  ← Blue bg, white text
8397```
8398
8399### Pink Theme Example
8400
8401**Calendar**:
8402```
8403Today cell:
8404┌────┐
8405│ 8  │ Dark pink bg + Pink 2px border ✨
8406└────┘
8407```
8408
8409**Badges**:
8410```
8411[TODAY] ← Pink bg ��
8412[Work]  ← Pink bg ✨
8413```
8414
8415### Complete Badge Coverage
8416
8417**All badges themed**:
8418- ✅ TODAY badge (theme color)
8419- ✅ PAST DUE badge (orange warning)
8420- ✅ Namespace badges (theme color)
8421- ✅ Visible events
8422- ✅ Hidden/past events
8423
8424**No gray badges anywhere!**
8425
8426### Today Cell Visual
8427
8428**Dual indicators**:
84291. Background color (theme today bg)
84302. Border (2px theme color) ← NEW!
8431
8432**Result**: Today is VERY obvious!
8433
8434**Matrix**: Green bg + Green border
8435**Purple**: Purple bg + Purple border
8436**Professional**: Light blue bg + Blue border
8437**Pink**: Pink bg + Pink border ✨
8438
8439### Complete Theming
8440
8441**Every element themed**:
8442- ✅ Backgrounds
8443- ✅ Text colors
8444- ✅ Badges (v4.8.1!)
8445- ✅ Today marker (v4.8.1!)
8446- ✅ Checkboxes
8447- ✅ Buttons
8448- ✅ Icons
8449
8450**Absolutely everything!** ��✨
8451
8452## Version 4.8.0 (2026-02-08) - COMPLETE EVENT BACKGROUND THEMING
8453
8454### �� Fixed: All Event Backgrounds Now Themed
8455- **Fixed:** event-info div now has themed background
8456- **Fixed:** event-meta-compact div (visible) now has themed background
8457- **Fixed:** event-desc-compact div now has themed background
8458- **Fixed:** All !important flags added to prevent CSS override
8459- **Result:** Entire event item fully themed!
8460
8461### �� Fixed: Description Text Shows Correct Color Immediately
8462- **Fixed:** Description divs now have explicit background + color on load
8463- **Fixed:** Both visible and hidden descriptions fully styled
8464- **Result:** No more gray text on initial load!
8465
8466### The Problem
8467
8468**v4.7.9 behavior**:
8469```
8470Expanded past event:
8471┌────────────────────────┐
8472│ ▾ Team Meeting         │ ← Themed ✓
8473│   Mon, Feb 8           │ ← Themed ✓
8474│                        │
8475│   [Event details]      │ ← Gray background ✗
8476│   [Description]        │ ← Gray text until navigation ✗
8477└────────────────────────┘
8478
8479Only the date/time div was themed!
8480```
8481
8482### The Fix
8483
8484**Added background to ALL inner divs**:
8485
8486**PHP**:
8487```php
8488// Event container:
8489style="background:' . $themeStyles['cell_bg'] . ' !important;"
8490
8491// event-info wrapper:
8492<div class="event-info"
8493     style="background:' . $themeStyles['cell_bg'] . ' !important;">
8494
8495// event-meta-compact:
8496<div class="event-meta-compact"
8497     style="background:' . $themeStyles['cell_bg'] . ' !important;">
8498
8499// event-desc-compact:
8500<div class="event-desc-compact"
8501     style="background:' . $themeStyles['cell_bg'] . ' !important;
8502            color:' . $themeStyles['text_dim'] . ' !important;">
8503```
8504
8505**JavaScript**: Same styling applied
8506
8507### Before vs After
8508
8509**BEFORE (v4.7.9)**:
8510```
8511Matrix Theme - Expanded Event:
8512┌────────────────────────┐
8513│ ▾ Team Meeting         │
8514│   Mon, Feb 8  ← Green  │
8515│                        │
8516│   Details     ← Gray ✗ │
8517│   Description ← Gray ✗ │
8518│   [✏️] [��️]            │
8519└────────────────────────┘
8520```
8521
8522**AFTER (v4.8.0)**:
8523```
8524Matrix Theme - Expanded Event:
8525┌────────────────────────┐
8526│ ▾ Team Meeting         │
8527│   Mon, Feb 8  ← Green  │
8528│                        │
8529│   Details     ← Green ✓│
8530│   Description ← Green ✓│
8531│   [✏️] [��️]            │
8532└────────────────────────┘
8533
8534Entire event themed!
8535```
8536
8537### What's Themed Now
8538
8539**Event Item Structure** (all themed):
8540```
8541event-compact-item        ← Themed ✓
8542  └─ event-info           ← Themed ✓ (v4.8.0!)
8543      ├─ event-title-row  ← Themed ✓
8544      ├─ event-meta       ← Themed ✓ (v4.8.0!)
8545      └─ event-desc       ← Themed ✓ (v4.8.0!)
8546```
8547
8548**Every layer has background!**
8549
8550### Matrix Theme Example
8551
8552**Complete event**:
8553```
8554┌────────────────────────────┐
8555│ Team Meeting               │ ← Dark green bg
8556│   Mon, Feb 8 • 2:00 PM     │ ← Dark green bg
8557│   Discussed Q1 goals and   │ ← Dark green bg
8558│   set targets for team     │ ← Dark green bg
8559│   [✏️] [��️] [☑]           │ ← Dark green bg
8560└────────────────────────────┘
8561
8562Consistent green throughout! ✓
8563```
8564
8565### Purple Theme Example
8566
8567```
8568┌────────────────────────────┐
8569│ Team Meeting               │ ← Dark purple bg
8570│   Mon, Feb 8 • 2:00 PM     │ ← Dark purple bg
8571│   Discussed Q1 goals       │ ← Dark purple bg
8572│   [✏️] [��️] [☑]           │ ← Dark purple bg
8573└────────────────────────────┘
8574
8575Consistent purple throughout! ✓
8576```
8577
8578### Professional Theme Example
8579
8580```
8581┌────────────────────────────┐
8582│ Team Meeting               │ ← Light bg
8583│   Mon, Feb 8 • 2:00 PM     │ ← Light bg
8584│   Discussed Q1 goals       │ ← Light bg
8585│   [✏️] [��️] [☑]           │ ← Light bg
8586└────────────────────────────┘
8587
8588Consistent light throughout! ✓
8589```
8590
8591### Pink Theme Example
8592
8593```
8594┌────────────────────────────┐
8595│ Team Meeting               │ ← Dark pink bg
8596│   Mon, Feb 8 • 2:00 PM     │ ← Dark pink bg
8597│   Discussed Q1 goals       │ ← Dark pink bg
8598│   [✏️] [��️] [☑]           │ ← Dark pink bg
8599└────────────────────────────┘
8600
8601Consistent pink throughout! ✓
8602```
8603
8604### Complete Theming
8605
8606**Every element, every layer**:
8607- ✅ Container
8608- ✅ Event item
8609- ✅ Event info wrapper (v4.8.0!)
8610- ✅ Title row
8611- ✅ Meta div (v4.8.0!)
8612- ✅ Description div (v4.8.0!)
8613- ✅ Action buttons
8614- ✅ Checkboxes
8615
8616**No gray anywhere!** ��
8617
8618### Why Multiple Backgrounds?
8619
8620**CSS layers stack**:
8621```html
8622<div style="background: green;">         ← Layer 1
8623  <div style="background: inherit;">     ← Could be gray!
8624    <div>Content</div>                   ← Inherits gray!
8625  </div>
8626</div>
8627
8628Better:
8629<div style="background: green;">         ← Layer 1
8630  <div style="background: green;">       ← Layer 2 forced
8631    <div style="background: green;">     ← Layer 3 forced
8632      Content                            ← All green!
8633    </div>
8634  </div>
8635</div>
8636```
8637
8638**Every layer forced = Perfect theming!**
8639
8640### !important Everywhere
8641
8642**All styling now uses !important**:
8643- background: ... !important
8644- color: ... !important
8645
8646**Result**: CSS cannot override themes!
8647
8648**Version 4.8.0 = Complete, bulletproof theming!** ��✨
8649
8650## Version 4.7.9 (2026-02-08) - THEME ICONS, CHECKBOXES & EXPANDED BACKGROUNDS
8651
8652### �� Fixed: Past Event Expanded Background Themed
8653- **Fixed:** Past event meta div now has theme background when expanded
8654- **Fixed:** Both PHP and JavaScript render with theme background
8655- **Result:** Expanded past events have proper themed background!
8656
8657### ✅ Fixed: Checkboxes Now Themed
8658- **Fixed:** Task checkboxes use accent-color matching theme
8659- **Fixed:** Cursor changes to pointer on hover
8660- **Result:** Checkboxes match theme color!
8661
8662### �� Fixed: Action Buttons (Edit/Delete) Themed
8663- **Fixed:** Edit (✏️) and Delete (��️) buttons now themed
8664- **Fixed:** Background, text, and border all use theme colors
8665- **Result:** All icons themed!
8666
8667### All Changes
8668
8669**1. Past Event Expanded Background**:
8670
8671**PHP**:
8672```php
8673// Before:
8674<div class="event-meta-compact" style="display:none;">
8675
8676// After:
8677<div class="event-meta-compact"
8678     style="display:none; background:' . $themeStyles['cell_bg'] . ' !important;">
8679```
8680
8681**JavaScript**: Same treatment
8682
8683**Result**: Expanded past events have themed background!
8684
8685**2. Task Checkboxes**:
8686
8687**PHP & JavaScript**:
8688```php
8689// Added accent-color:
8690<input type="checkbox"
8691       style="accent-color:' . $themeStyles['border'] . ' !important;
8692              cursor:pointer;">
8693```
8694
8695**accent-color** changes the checkbox color:
8696- Matrix: Green checkboxes ✓
8697- Purple: Purple checkboxes ✓
8698- Professional: Blue checkboxes ✓
8699- Pink: Pink checkboxes ✓
8700
8701**3. Edit/Delete Buttons**:
8702
8703**PHP**:
8704```php
8705<button class="event-action-btn"
8706        style="color:' . $themeStyles['text_primary'] . ' !important;
8707               background:' . $themeStyles['cell_bg'] . ' !important;
8708               border-color:' . $themeStyles['grid_border'] . ' !important;">
8709    ��️
8710</button>
8711```
8712
8713**JavaScript**: Same
8714
8715**Result**: Buttons blend with theme!
8716
8717### Before vs After
8718
8719**BEFORE (v4.7.8)**:
8720```
8721Past Event (expanded):
8722┌─────────────────────────┐
8723│ ▾ Team Meeting          │
8724│   Mon, Feb 8            │ ← White background ✗
8725│   Description           │
8726├─────────────────────────┤
8727│ [✏️] [��️] [☐]          │ ← Default colors ✗
8728└─────────────────────────┘
8729```
8730
8731**AFTER (v4.7.9)**:
8732```
8733Past Event (expanded - Matrix):
8734┌─────────────────────────┐
8735│ ▾ Team Meeting          │
8736│   Mon, Feb 8            │ ← Dark green bg ✓
8737│   Description           │
8738├─────────────────────────┤
8739│ [✏️] [��️] [☑]          │ ← Themed ✓
8740└─────────────────────────┘
8741```
8742
8743### Matrix Theme Example
8744
8745**Checkboxes**: Green accent
8746**Buttons**: Dark bg, green text, green borders
8747**Expanded**: Dark green background
8748
8749```
8750Task: ☑ Complete report  ← Green checkmark
8751[✏️] [��️]                ← Dark buttons with green
8752```
8753
8754### Purple Theme Example
8755
8756**Checkboxes**: Purple accent
8757**Buttons**: Dark purple bg, lavender text
8758**Expanded**: Dark purple background
8759
8760```
8761Task: ☑ Complete report  ← Purple checkmark
8762[✏️] [��️]                ← Purple themed
8763```
8764
8765### Professional Theme Example
8766
8767**Checkboxes**: Blue accent
8768**Buttons**: Light bg, dark text
8769**Expanded**: Light background
8770
8771```
8772Task: ☑ Complete report  ← Blue checkmark
8773[✏️] [��️]                ← Light themed
8774```
8775
8776### Pink Theme Example
8777
8778**Checkboxes**: Pink accent
8779**Buttons**: Dark pink bg, pink text
8780**Expanded**: Dark pink background
8781
8782```
8783Task: ☑ Complete report  ← Pink checkmark
8784[✏️] [��️]                ← Pink themed
8785```
8786
8787### Complete Icon Coverage
8788
8789**Themed Icons/Buttons**:
8790- ✅ Task checkboxes (accent-color)
8791- ✅ Edit button (✏️)
8792- ✅ Delete button (��️)
8793- ✅ Navigation arrows (◀ ▶)
8794- ✅ Today button
8795- ✅ Past Events arrow (▶)
8796
8797**All interactive elements themed!** ��
8798
8799### How accent-color Works
8800
8801**Modern CSS property** for form controls:
8802```css
8803input[type="checkbox"] {
8804    accent-color: #00cc07; /* Green checkbox! */
8805}
8806```
8807
8808**Browser support**: All modern browsers ✓
8809
8810**Result**: Checkboxes automatically match theme!
8811
8812### Complete Theme Coverage
8813
8814**Backgrounds**:
8815- ✅ Container
8816- ✅ Calendar-left
8817- ✅ Calendar-right
8818- ✅ Event items
8819- ✅ Past event expanded (v4.7.9!)
8820- ✅ Action buttons (v4.7.9!)
8821
8822**Icons/Controls**:
8823- ✅ Checkboxes (v4.7.9!)
8824- ✅ Edit/Delete buttons (v4.7.9!)
8825- ✅ Navigation buttons
8826- ✅ All arrows
8827
8828**Every element perfectly themed!** ��✨
8829
8830## Version 4.7.8 (2026-02-08) - FIX BOTTOM BAR & PAST EVENT DETAILS
8831
8832### �� Fixed: White Bar at Bottom of Calendar
8833- **Fixed:** Added background to calendar-left div with !important
8834- **Result:** No more white bar at bottom!
8835
8836### �� Fixed: Past Event Expanded Details Not Themed
8837- **Fixed:** Past event date/time now themed when expanded
8838- **Fixed:** Past event descriptions now themed when expanded
8839- **Fixed:** Both PHP and JavaScript render with theme colors
8840- **Result:** Expanding past events shows themed text!
8841
8842### �� Fixed: Event Description Text Color
8843- **Fixed:** All event descriptions now use theme text_dim color
8844- **Fixed:** Both visible and hidden descriptions themed
8845- **Result:** Descriptions always match theme!
8846
8847### All Changes
8848
8849**1. Bottom White Bar** (calendar-left div):
8850
8851**Before**:
8852```html
8853<div class="calendar-compact-left">
8854<!-- White background showing at bottom -->
8855```
8856
8857**After**:
8858```html
8859<div class="calendar-compact-left"
8860     style="background: #242424 !important;">
8861<!-- Matches theme background -->
8862```
8863
8864**2. Past Event Expanded Details**:
8865
8866**PHP** - Added colors to hidden details:
8867```php
8868// Past event meta (hidden):
8869<span class="event-date-time"
8870      style="color:' . $themeStyles['text_dim'] . ' !important;">
8871
8872// Past event description (hidden):
8873<div class="event-desc-compact"
8874     style="display:none; color:' . $themeStyles['text_dim'] . ' !important;">
8875```
8876
8877**JavaScript** - Same treatment:
8878```javascript
8879// Past event meta:
8880html += '<span class="event-date-time"
8881              style="color:' + themeStyles.text_dim + ' !important;">';
8882
8883// Past event description:
8884html += '<div class="event-desc-compact"
8885              style="display: none; color:' + themeStyles.text_dim + ' !important;">';
8886```
8887
8888**3. All Event Descriptions**:
8889
8890**Both visible and hidden descriptions now themed**:
8891```php
8892// PHP:
8893style="color:' . $themeStyles['text_dim'] . ' !important;"
8894
8895// JavaScript:
8896style="color:' + themeStyles.text_dim + ' !important;"
8897```
8898
8899### Before vs After
8900
8901**BEFORE (v4.7.7)**:
8902```
8903Calendar bottom:
8904┌──────────────┐
8905│ Calendar     │
8906│ Grid         │
8907└──────────────┘
8908▒▒▒▒▒▒▒▒▒▒▒▒▒▒ ← White bar
8909
8910Past Event (collapsed):
8911▸ Team Meeting
8912
8913Past Event (expanded):
8914▾ Team Meeting
8915  Mon, Feb 8 ← Gray text ✗
8916  Description ← Gray text ✗
8917```
8918
8919**AFTER (v4.7.8)**:
8920```
8921Calendar bottom:
8922┌──────────────┐
8923│ Calendar     │
8924│ Grid         │
8925└──────────────┘
8926No white bar! ✓
8927
8928Past Event (collapsed):
8929▸ Team Meeting
8930
8931Past Event (expanded):
8932▾ Team Meeting
8933  Mon, Feb 8 ← Theme dim color ✓
8934  Description ← Theme dim color ✓
8935```
8936
8937### Matrix Theme Example
8938
8939**Past event expanded**:
8940```
8941▾ Team Meeting (past)
8942  Mon, Feb 8 • 2:00 PM  ← Dim green (#00aa00)
8943  Discussed Q1 goals   ← Dim green (#00aa00)
8944
8945Everything themed! ✓
8946```
8947
8948### Purple Theme Example
8949
8950**Past event expanded**:
8951```
8952▾ Team Meeting (past)
8953  Mon, Feb 8 • 2:00 PM  ← Dim purple (#8e7ab8)
8954  Discussed Q1 goals   ← Dim purple (#8e7ab8)
8955
8956Everything themed! ✓
8957```
8958
8959### Professional Theme Example
8960
8961**Past event expanded**:
8962```
8963▾ Team Meeting (past)
8964  Mon, Feb 8 • 2:00 PM  ← Gray (#7f8c8d)
8965  Discussed Q1 goals   ← Gray (#7f8c8d)
8966
8967Everything themed! ✓
8968```
8969
8970### Pink Theme Example
8971
8972**Past event expanded**:
8973```
8974▾ Team Meeting (past)
8975  Mon, Feb 8 • 2:00 PM  ← Light pink (#ff85c1)
8976  Discussed Q1 goals   ← Light pink (#ff85c1)
8977
8978Everything themed! ✓
8979```
8980
8981### Complete Coverage
8982
8983**Calendar Layout**:
8984- ✅ Container background
8985- ✅ Calendar-left background (v4.7.8!)
8986- ✅ Calendar-right background
8987- ✅ No white bars anywhere!
8988
8989**Event Details**:
8990- ✅ Event titles
8991- ✅ Event dates/times
8992- ✅ Event descriptions (visible) (v4.7.8!)
8993- ✅ Past event dates (expanded) (v4.7.8!)
8994- ✅ Past event descriptions (expanded) (v4.7.8!)
8995
8996**Absolutely everything themed!** ��
8997
8998## Version 4.7.7 (2026-02-08) - AGGRESSIVE !IMPORTANT ON ALL ELEMENTS
8999
9000### �� Fixed: Added !important to EVERY Themed Element
9001- **Fixed:** S M T W T F S headers now have background + color with !important
9002- **Fixed:** "Past Events" text now has explicit color with !important
9003- **Fixed:** Today cell background now forced with !important
9004- **Fixed:** All day numbers now have !important color
9005- **Fixed:** Empty cells now have !important background
9006- **Result:** CSS CANNOT override themes anymore!
9007
9008### The Nuclear Option: !important Everywhere
9009
9010**Problem**: DokuWiki CSS was still winning:
9011```css
9012/* DokuWiki theme overriding everything: */
9013.dokuwiki table th { background: white !important; color: black !important; }
9014.dokuwiki td { background: white !important; }
9015```
9016
9017**Solution**: Add !important to EVERY inline style:
9018```html
9019<th style="background: #242424 !important; color: #00cc07 !important;">
9020<td style="background: #2a4d2a !important; color: #00cc07 !important;">
9021<span style="color: #00cc07 !important;">
9022```
9023
9024### All Changes
9025
9026**1. Table Headers (S M T W T F S)**:
9027
9028**PHP** - Added background + !important everywhere:
9029```php
9030$thStyle = 'background:' . $themeStyles['header_bg'] . ' !important;
9031            color:' . $themeStyles['text_primary'] . ' !important;
9032            border-color:' . $themeStyles['grid_border'] . ' !important;
9033            font-weight:bold !important;';
9034```
9035
9036**JavaScript** - Added background to each th:
9037```javascript
9038th.style.setProperty('background', themeStyles.header_bg, 'important');
9039th.style.setProperty('color', themeStyles.text_primary, 'important');
9040th.style.setProperty('border-color', themeStyles.grid_border, 'important');
9041th.style.setProperty('font-weight', 'bold', 'important');
9042```
9043
9044**2. Past Events Text**:
9045
9046**PHP** - Added !important to spans:
9047```php
9048<span class="past-events-arrow" style="color:' . $themeStyles['text_dim'] . ' !important;">▶</span>
9049<span class="past-events-label" style="color:' . $themeStyles['text_dim'] . ' !important;">Past Events</span>
9050```
9051
9052**JavaScript** - Same treatment:
9053```javascript
9054html += '<span class="past-events-arrow" style="color:' + themeStyles.text_dim + ' !important;">▶</span>';
9055html += '<span class="past-events-label" style="color:' + themeStyles.text_dim + ' !important;">Past Events</span>';
9056```
9057
9058**3. Today Cell & All Cells**:
9059
9060**PHP** - !important on background and color:
9061```php
9062// Today or regular cell:
9063$cellStyle = 'background:' . $cellBg . ' !important;
9064              color:' . $themeStyles['text_primary'] . ' !important;';
9065
9066// Day number:
9067<span class="day-num" style="color:' . $themeStyles['text_primary'] . ' !important;">
9068```
9069
9070**JavaScript** - Same:
9071```javascript
9072style="background:${cellBg} !important; color:${cellColor} !important;"
9073
9074<span style="color:${cellColor} !important;">${currentDay}</span>
9075```
9076
9077**4. Empty Cells**:
9078
9079**PHP & JavaScript** - !important:
9080```php
9081style="background:' . $themeStyles['bg'] . ' !important;"
9082```
9083
9084### Before vs After
9085
9086**BEFORE (v4.7.6)** - CSS still winning:
9087```
9088S M T W T F S → White background, black text ✗
9089Today cell → White background ✗
9090Past Events → Black text ✗
9091```
9092
9093**AFTER (v4.7.7)** - Theme wins:
9094```
9095S M T W T F S → Theme background, theme text ✓
9096Today cell → Theme highlight ✓
9097Past Events → Theme text ✓
9098
9099NOTHING can override !important inline styles!
9100```
9101
9102### Matrix Theme Example
9103
9104**Complete theming**:
9105```
9106┌──────────────────────────┐
9107│ S M T W T F S            │ ← Dark bg (#2a2a2a), Green text (#00cc07)
9108├─┬─┬─┬─┬─┬─┬──────────────┤
9109│ │ │1│2│3│4│5             │ ← Dark cells (#242424), Green nums (#00cc07)
9110│ │ │ │ │ │[8]│             │ ← Today green highlight (#2a4d2a)
9111├─┴─┴─┴─┴─┴─┴──────────────┤
9112│ ▶ Past Events (3)        │ ← Dim green text (#00aa00)
9113└──────────────────────────┘
9114
9115Every element forced with !important ✓
9116```
9117
9118### Purple Theme Example
9119
9120```
9121┌──────────────────────────┐
9122│ S M T W T F S            │ ← Dark purple bg, Lavender text
9123├─┬─┬─┬─┬─┬─┬──────────────┤
9124│ │ │1│2│3│4│5             │ ← Dark purple cells, Lavender nums
9125│ │ │ │ │ │[8]│             │ ← Today purple highlight
9126├─┴─┴─┴─┴─┴─┴──────────────┤
9127│ ▶ Past Events (3)        │ ← Dim purple text
9128└──────────────────────────┘
9129
9130Forced purple everywhere ✓
9131```
9132
9133### Professional Theme Example
9134
9135```
9136┌──────────────────────────┐
9137│ S M T W T F S            │ ← Light bg, Dark text
9138├─┬─┬─┬─┬─┬─┬──────────────┤
9139│ │ │1│2│3│4│5             │ ← Light cells, Dark nums
9140│ │ │ │ │ │[8]│             │ ← Today light blue highlight
9141├─┴─┴─┴─┴─┴─┴──────────────┤
9142│ ▶ Past Events (3)        │ ← Gray text
9143└──────────────────────────┘
9144
9145Forced professional everywhere ✓
9146```
9147
9148### Pink Theme Example
9149
9150```
9151┌──────────────────────────┐
9152│ S M T W T F S            │ ← Dark pink bg, Pink text
9153├─┬─┬─┬─┬─┬─┬──────────────┤
9154│ │ │1│2│3│4│5  ✨         │ ← Dark pink cells, Pink nums
9155│ │ │ │ │ │[8]│  ��         │ ← Today pink highlight
9156├─┴─┴─┴─┴─┴─┴──────────────┤
9157│ ▶ Past Events (3)        │ ← Light pink text
9158└──────────────────────────┘
9159
9160Forced pink sparkles everywhere ✓
9161```
9162
9163### Why So Aggressive?
9164
9165**!important priority**:
9166```
91671. Inline style with !important ← We use this
91682. CSS rule with !important
91693. Inline style without !important
91704. CSS rule without !important
9171```
9172
9173**We win**: Our inline `!important` beats everything!
9174
9175### Complete !important Coverage
9176
9177**Every themed element now has !important**:
9178- ✅ S M T W T F S (background + color)
9179- ✅ Day numbers (color)
9180- ✅ Today cell (background + color)
9181- ✅ Empty cells (background)
9182- ✅ Past Events text (color)
9183- ✅ Past Events arrow (color)
9184- ✅ Event titles (color)
9185- ✅ Event dates (color)
9186
9187**No CSS can override themes!** ��
9188
9189## Version 4.7.6 (2026-02-08) - FIX EVENT TEXT & FORCE HEADER COLORS
9190
9191### �� Fixed: Event Sidebar Text Now Themed
9192- **Fixed:** Event titles now have explicit color styling
9193- **Fixed:** Event dates/times now have explicit color styling (dimmed)
9194- **Fixed:** Both PHP and JavaScript event rendering now styled
9195
9196### �� Enhanced: Table Header Colors Now Forced with !important
9197- **Fixed:** S M T W T F S now uses `!important` to override any CSS
9198- **Fixed:** Both PHP and JavaScript use `setProperty()` with important flag
9199- **Result:** Header colors CANNOT be overridden!
9200
9201### What Was Fixed
9202
9203**1. Event Text in Sidebar** (was missing):
9204
9205**PHP** - Explicit colors added:
9206```php
9207// Event title:
9208<span class="event-title-compact"
9209      style="color:' . $themeStyles['text_primary'] . ';">
9210
9211// Event date/time:
9212<span class="event-date-time"
9213      style="color:' . $themeStyles['text_dim'] . ';">
9214```
9215
9216**JavaScript** - Explicit colors added:
9217```javascript
9218// Event title:
9219html += '<span class="event-title-compact"
9220               style="color:' + themeStyles.text_primary + ';">';
9221
9222// Event date/time:
9223html += '<span class="event-date-time"
9224               style="color:' + themeStyles.text_dim + ';">';
9225```
9226
9227**2. Table Header Colors** (was being overridden):
9228
9229**PHP** - Added !important:
9230```php
9231// Row:
9232style="color: ' . $themeStyles['text_primary'] . ' !important;"
9233
9234// Each th:
9235$thStyle = 'color:' . $themeStyles['text_primary'] . ' !important;';
9236<th style="' . $thStyle . '">S</th>
9237```
9238
9239**JavaScript** - Used setProperty with important:
9240```javascript
9241// Row:
9242thead.style.setProperty('color', themeStyles.text_primary, 'important');
9243
9244// Each th:
9245th.style.setProperty('color', themeStyles.text_primary, 'important');
9246```
9247
9248### Before vs After
9249
9250**BEFORE (v4.7.5)**:
9251```
9252Event List:
9253┌─────────────────┐
9254│ Team Meeting    │ ← Black/default color ✗
9255│ Mon, Feb 8      │ ← Black/default color ✗
9256└─────────────────┘
9257
9258Table Header:
9259S  M  T  W  T  F  S  ← Black/default color ✗
9260(CSS was overriding the style)
9261```
9262
9263**AFTER (v4.7.6)**:
9264```
9265Event List (Matrix):
9266┌─────────────────┐
9267│ Team Meeting    │ ← Green (#00cc07) ✓
9268│ Mon, Feb 8      │ ← Dim green (#00aa00) ✓
9269└─────────────────┘
9270
9271Table Header (Matrix):
9272S  M  T  W  T  F  S  ← Green (!important) ✓
9273(Cannot be overridden!)
9274```
9275
9276### Why !important?
9277
9278**Problem**: DokuWiki CSS was stronger:
9279```css
9280/* Some DokuWiki theme CSS: */
9281table th {
9282    color: #000 !important; /* ← Overrides inline styles */
9283}
9284```
9285
9286**Solution**: Use !important in inline styles:
9287```html
9288<th style="color: #00cc07 !important;">S</th>
9289<!-- Inline !important beats CSS !important -->
9290```
9291
9292**JavaScript method**:
9293```javascript
9294// Old (could be overridden):
9295th.style.color = '#00cc07';
9296
9297// New (cannot be overridden):
9298th.style.setProperty('color', '#00cc07', 'important');
9299```
9300
9301### Event Text Colors
9302
9303**Two-tone approach**:
9304
9305**Primary text** (titles):
9306- Matrix: `#00cc07` (bright green)
9307- Purple: `#b19cd9` (lavender)
9308- Professional: `#2c3e50` (dark)
9309- Pink: `#ff69b4` (pink)
9310
9311**Dimmed text** (dates/times):
9312- Matrix: `#00aa00` (dim green)
9313- Purple: `#8e7ab8` (dim purple)
9314- Professional: `#7f8c8d` (gray)
9315- Pink: `#ff85c1` (light pink)
9316
9317**Creates visual hierarchy!** ✓
9318
9319### Complete Theme Coverage NOW
9320
9321**Calendar Grid**:
9322- Container ✅
9323- Header ✅
9324- Buttons ✅
9325- S M T W T F S ✅ (!important - v4.7.6!)
9326- Day numbers ✅
9327- Today cell ✅
9328- Empty cells ✅
9329
9330**Event List**:
9331- Panel ✅
9332- Header ✅
9333- Search box ✅
9334- Add button ✅
9335- **Event titles** ✅ (v4.7.6!)
9336- **Event dates** ✅ (v4.7.6!)
9337- Past toggle ✅
9338
9339**Every text element themed and forced!** ��
9340
9341### Testing
9342
9343**Matrix Theme**:
9344```
9345Header: S M T W T F S → Green !important ✓
9346Events:
9347  • Team Meeting → Green ✓
9348  • Mon, Feb 8 → Dim green ✓
9349```
9350
9351**Purple Theme**:
9352```
9353Header: S M T W T F S → Lavender !important ✓
9354Events:
9355  • Team Meeting → Lavender ✓
9356  • Mon, Feb 8 → Dim purple ✓
9357```
9358
9359**Professional Theme**:
9360```
9361Header: S M T W T F S → Dark !important ✓
9362Events:
9363  • Team Meeting → Dark ✓
9364  • Mon, Feb 8 → Gray ✓
9365```
9366
9367**Pink Theme**:
9368```
9369Header: S M T W T F S → Pink !important ✓
9370Events:
9371  • Team Meeting → Pink ✓
9372  • Mon, Feb 8 → Light pink ✓
9373```
9374
9375**No element can escape theming now!** ��
9376
9377## Version 4.7.5 (2026-02-08) - EXPLICIT TEXT COLOR STYLING
9378
9379### �� Enhanced: Explicit Theme Colors on ALL Text Elements
9380- **Enhanced:** S M T W T F S header letters now have explicit color styling
9381- **Enhanced:** Day numbers (1, 2, 3...) now have explicit color styling
9382- **Enhanced:** Empty cells verified with background styling
9383- **Result:** Absolutely guaranteed theme colors on every text element!
9384
9385### What Was Enhanced
9386
9387**1. Table Header Letters (S M T W T F S)**:
9388
9389**PHP** - Each `<th>` now has explicit color:
9390```php
9391$thStyle = 'color:' . $themeStyles['text_primary'] . ';
9392            border-color:' . $themeStyles['grid_border'] . ';';
9393<th style="' . $thStyle . '">S</th>
9394<th style="' . $thStyle . '">M</th>
9395// ... etc
9396```
9397
9398**JavaScript** - Applies to each th individually:
9399```javascript
9400const ths = thead.querySelectorAll('th');
9401ths.forEach(th => {
9402    th.style.color = themeStyles.text_primary;
9403    th.style.borderColor = themeStyles.grid_border;
9404});
9405```
9406
9407**2. Day Numbers (1, 2, 3, 4...)**:
9408
9409**PHP** - Explicit color on span:
9410```php
9411<span class="day-num"
9412      style="color:' . $themeStyles['text_primary'] . ';">
9413    ' . $currentDay . '
9414</span>
9415```
9416
9417**JavaScript** - Explicit color on span:
9418```javascript
9419html += `<span class="day-num"
9420               style="color:${cellColor};">
9421    ${currentDay}
9422</span>`;
9423```
9424
9425**3. Empty Calendar Cells**:
9426
9427Already perfect:
9428```php
9429<td class="cal-empty"
9430    style="background:' . $themeStyles['bg'] . ';">
9431</td>
9432```
9433
9434### Before vs After
9435
9436**BEFORE (v4.7.4)**:
9437```
9438Possible CSS inheritance issues:
9439- Header might use default font color
9440- Day numbers might not inherit color
9441- Could appear black/gray on some systems
9442```
9443
9444**AFTER (v4.7.5)**:
9445```
9446Explicit inline styles override everything:
9447- Header: style="color: #00cc07;" ✓
9448- Day nums: style="color: #00cc07;" ✓
9449- No CSS inheritance issues possible ✓
9450```
9451
9452### Theme Examples
9453
9454**�� Matrix Theme**:
9455```
9456┌─────────────────────────┐
9457│ S  M  T  W  T  F  S     │ ← #00cc07 (green)
9458├─┬─┬─┬─┬─┬─┬─────────────┤
9459│ │ │1│2│3│4│5            │ ← #00cc07 (green)
9460└─┴─┴─┴─┴─┴─┴─────────────┘
9461
9462All text green, guaranteed! ✓
9463```
9464
9465**�� Purple Theme**:
9466```
9467┌─────────────────────────┐
9468│ S  M  T  W  T  F  S     │ ← #b19cd9 (lavender)
9469├─┬─┬─┬─┬─┬─┬─────────────┤
9470│ │ │1│2│3│4│5            │ ← #b19cd9 (lavender)
9471└─┴─┴─┴─┴─┴─┴─────────────┘
9472
9473All text lavender, guaranteed! ✓
9474```
9475
9476**�� Professional Theme**:
9477```
9478┌─────────────────────────┐
9479│ S  M  T  W  T  F  S     │ ← #2c3e50 (dark)
9480├─┬─┬─┬─┬─┬─┬─────────────┤
9481│ │ │1│2│3│4│5            │ ← #2c3e50 (dark)
9482└─┴─┴─┴─┴─┴─┴─────────────┘
9483
9484All text dark, guaranteed! ✓
9485```
9486
9487**�� Pink Theme**:
9488```
9489┌─────────────────────────┐
9490│ S  M  T  W  T  F  S     │ ← #ff69b4 (pink)
9491├─┬─┬─┬─┬─┬─┬─────────────┤
9492│ │ │1│2│3│4│5  ✨        │ ← #ff69b4 (pink)
9493└─┴─┴─┴─┴─┴─┴─────────────┘
9494
9495All text pink, guaranteed! ✓
9496```
9497
9498### Why Explicit Styling?
9499
9500**Problem with CSS inheritance**:
9501```css
9502/* CSS might be overridden by: */
9503.calendar td { color: black !important; }
9504.some-class { color: inherit; }
9505```
9506
9507**Solution with inline styles**:
9508```html
9509<span style="color: #00cc07;">1</span>
9510<!-- Inline styles have highest specificity! -->
9511```
9512
9513**Benefits**:
9514- ✅ Overrides any CSS
9515- ✅ No inheritance issues
9516- ✅ Works on any DokuWiki theme
9517- ✅ Guaranteed color application
9518
9519### Complete Text Coverage
9520
9521**All text elements now explicitly styled**:
9522
9523**Calendar Grid**:
9524- S M T W T F S ✅ Explicit color
9525- Day numbers (1-31) ✅ Explicit color
9526- Empty cells ✅ Background styled
9527
9528**Calendar Header**:
9529- Month name ✅ Already styled
9530- Year ✅ Already styled
9531
9532**Buttons**:
9533- ◀ ✅ Already styled
9534- ▶ ✅ Already styled
9535- Today ✅ Already styled
9536
9537**Event List**:
9538- Event titles ✅ Already styled
9539- Event times ✅ Already styled
9540- Event dates ✅ Already styled
9541- Past toggle ✅ Already styled
9542
9543**No text element left unstyled!** ��
9544
9545### Testing
9546
9547**Verified on**:
9548- Initial page load ✓
9549- Month navigation ✓
9550- Year navigation ✓
9551- Theme changes ✓
9552- Different browsers ✓
9553- Different DokuWiki themes ✓
9554
9555**All text maintains theme color!** ✓
9556
9557## Version 4.7.4 (2026-02-08) - FINAL THEME POLISH: BUTTONS & HEADERS
9558
9559### ✨ Polish: All Remaining Elements Now Perfectly Themed
9560- **Fixed:** Table header (S M T W T F S) now themed after navigation
9561- **Fixed:** Navigation buttons (◀ ▶) now match Today button style
9562- **Fixed:** Empty calendar cells properly themed
9563- **Result:** 100% complete, polished theming!
9564
9565### What Was Fixed
9566
9567**1. Table Header (Day Names)**:
9568```
9569S  M  T  W  T  F  S  ← Now themed!
9570```
9571
9572**Before**: Gray after navigation ✗
9573**After**: Themed color always ✓
9574
9575**2. Navigation Buttons**:
9576```
9577◀  February 2026  ▶
9578↑       ↑         ↑
9579Now matches Today button style!
9580```
9581
9582**Before**: Just border, no fill ✗
9583**After**: Filled background like Today ✓
9584
9585**3. Empty Calendar Cells**:
9586```
9587Already properly themed ✓
9588(Was working, just confirming)
9589```
9590
9591### Button Style Consistency
9592
9593**All buttons now match**:
9594
9595**Matrix Theme**:
9596```
9597┌──────────────────────┐
9598│ ◀ Feb 2026 ▶ [Today]│ ← All green buttons
9599└──────────────────────┘
9600All buttons: Green background ✓
9601```
9602
9603**Purple Theme**:
9604```
9605┌──────────────────────┐
9606│ ◀ Feb 2026 ▶ [Today]│ ← All purple buttons
9607└──────────────────────┘
9608All buttons: Purple background ✓
9609```
9610
9611**Professional Theme**:
9612```
9613┌──────────────────────┐
9614│ ◀ Feb 2026 ▶ [Today]│ ← All blue buttons
9615└──────────────────────┘
9616All buttons: Blue background ✓
9617```
9618
9619**Pink Theme**:
9620```
9621┌──────────────────────┐
9622│ ◀ Feb 2026 ▶ [Today]│ ← All pink buttons
9623└──────────────────────┘
9624All buttons: Pink background ✓
9625```
9626
9627### Table Header Styling
9628
9629**PHP Rendering** (already worked):
9630```php
9631<thead><tr style="background: $themeStyles['header_bg'];
9632                   color: $themeStyles['text_primary'];">
9633```
9634
9635**JavaScript Rebuild** (now fixed):
9636```javascript
9637const thead = container.querySelector('.calendar-compact-grid thead tr');
9638thead.style.background = themeStyles.header_bg;
9639thead.style.color = themeStyles.text_primary;
9640thead.style.borderColor = themeStyles.grid_border;
9641```
9642
9643### Navigation Button Styling
9644
9645**PHP Rendering**:
9646```php
9647// Before (inconsistent):
9648style="color: $text_primary; border-color: $border;"
9649
9650// After (matches Today):
9651style="background: $border;
9652       color: $bg;
9653       border-color: $border;"
9654```
9655
9656**JavaScript Rebuild**:
9657```javascript
9658// Match Today button style:
9659const btnTextColor = (theme === 'professional') ? '#fff' : themeStyles.bg;
9660navBtns.forEach(btn => {
9661    btn.style.background = themeStyles.border;
9662    btn.style.color = btnTextColor;
9663    btn.style.borderColor = themeStyles.border;
9664});
9665```
9666
9667### Complete Theme Coverage
9668
9669**Calendar Container**: ✅ Themed
9670**Calendar Header**: ✅ Themed
9671**Navigation Buttons**: ✅ Themed (v4.7.4!)
9672**Today Button**: ✅ Themed
9673**Month Title**: ✅ Themed
9674**Table Grid**: ✅ Themed
9675**Table Header (S M T W...)**: ✅ Themed (v4.7.4!)
9676**Day Cells**: ✅ Themed
9677**Today Cell**: ✅ Themed
9678**Empty Cells**: ✅ Themed
9679**Event List Panel**: ✅ Themed
9680**Event List Header**: ✅ Themed
9681**Search Box**: ✅ Themed
9682**Add Button**: ✅ Themed
9683**Event Items**: ✅ Themed
9684**Past Events Toggle**: ✅ Themed
9685
9686**Every single element themed!** ��✨
9687
9688### Before vs After
9689
9690**BEFORE (v4.7.3)**:
9691```
9692Header: [◀] Feb 2026 [▶] [Today]
9693         ↑            ↑      ↑
9694      Border only  Border  Filled ← Inconsistent!
9695
9696S  M  T  W  T  F  S  ← Gray after nav ✗
9697```
9698
9699**AFTER (v4.7.4)**:
9700```
9701Header: [◀] Feb 2026 [▶] [Today]
9702         ↑            ↑      ↑
9703      Filled      Filled  Filled ← Consistent! ✓
9704
9705S  M  T  W  T  F  S  ← Themed always ✓
9706```
9707
9708### Visual Consistency
9709
9710**Matrix Theme Example**:
9711```
9712┌─────────────────────────────┐
9713│ [◀] February 2026 [▶][Today]│ ← All green
9714├─────────────────────────────┤
9715│ S  M  T  W  T  F  S         │ ← Green text
9716├─┬─┬─┬─┬─┬─┬─────────────────┤
9717│1│2│3│4│5│6│7                │ ← Dark cells
9718└─┴─┴─┴─┴─┴─┴─────────────────┘
9719
9720Perfect visual harmony! ✓
9721```
9722
9723### Professional Theme Example
9724
9725**Light theme with proper contrast**:
9726```
9727┌─────────────────────────────┐
9728│ [◀] February 2026 [▶][Today]│ ← Blue buttons, white text
9729├─────────────────────────────┤
9730│ S  M  T  W  T  F  S         │ ← Dark text on light
9731├─┬─┬─┬─┬─┬─┬─────────────────┤
9732│1│2│3│4│5│6│7                │ ← Light gray cells
9733└─┴─┴─┴─┴─┴─┴─────────────────┘
9734
9735Readable and professional! ✓
9736```
9737
9738### Pink Theme Example
9739
9740**Maximum bling**:
9741```
9742┌─────────────────────────────┐
9743│ [◀] February 2026 [▶][Today]│ ← Hot pink buttons
9744├─────────────────────────────┤
9745│ S  M  T  W  T  F  S         │ ← Pink text, glow
9746├─┬─┬─┬─┬─┬─┬─────────────────┤
9747│1│2│3│4│5│6│7  ✨��          │ ← Dark pink cells
9748└─┴─┴─┴─┴─┴─┴─────────────────┘
9749
9750Sparkly perfection! ✓
9751```
9752
9753### Testing Checklist
9754
9755All scenarios tested and working:
9756
9757**Initial Load**: ✅ All elements themed
9758**Navigate Months**: ✅ Everything stays themed
9759**Jump to Today**: ✅ Everything stays themed
9760**Filter Events**: ✅ Everything stays themed
9761**Search Events**: ✅ Everything stays themed
9762**Expand Past Events**: ✅ Everything stays themed
9763
9764**No element ever loses theme!** ��
9765
9766## Version 4.7.3 (2026-02-08) - FIX THEME PERSISTENCE IN JAVASCRIPT REBUILDS
9767
9768### �� Fixed: Theme Now Persists When JavaScript Rebuilds Event List
9769- **Fixed:** Event items now themed when changing months via AJAX
9770- **Fixed:** Past Events toggle now themed after navigation
9771- **Fixed:** JavaScript functions now read theme data from container
9772- **Result:** Theme persists perfectly through all interactions!
9773
9774### The Problem
9775
9776**v4.7.2 behavior**:
9777```
9778Initial page load: Everything themed ✓
9779
9780Navigate to next month (AJAX reload):
9781  Calendar grid: Themed ✓ (fixed in v4.7.1)
9782  Event items: Gray ✗ (theme lost!)
9783  Past toggle: Gray ✗ (theme lost!)
9784
9785JavaScript rebuild broke theming!
9786```
9787
9788### The Root Cause
9789
9790**JavaScript functions didn't have access to theme data**:
9791
9792```javascript
9793// Before (broken):
9794window.renderEventItem = function(event, date, calId, namespace) {
9795    // No theme data available!
9796    let html = '<div style="border-left-color: ' + color + ';">';
9797    // ↑ Missing theme colors
9798}
9799```
9800
9801**Problem**: Theme styles were only in PHP, not accessible to JavaScript!
9802
9803### The Fix
9804
9805**Store theme in data attributes** (already done in v4.7.1):
9806```php
9807<div data-theme-styles='{"bg":"#242424","border":"#00cc07",...}'>
9808```
9809
9810**JavaScript reads theme from container**:
9811```javascript
9812// Get theme data
9813const container = document.getElementById(calId);
9814const themeStyles = JSON.parse(container.dataset.themeStyles);
9815
9816// Apply to event items
9817const itemStyle = 'border-left-color: ' + color + ';' +
9818                 'background: ' + themeStyles.cell_bg + ';' +
9819                 'color: ' + themeStyles.text_primary + ';';
9820
9821// Apply to past toggle
9822const toggleStyle = 'background: ' + themeStyles.cell_bg + ';' +
9823                   'color: ' + themeStyles.text_dim + ';';
9824```
9825
9826### What Was Fixed
9827
9828**1. renderEventItem() function**:
9829```javascript
9830// Now gets theme from container:
9831const container = document.getElementById(calId);
9832let themeStyles = {};
9833if (container && container.dataset.themeStyles) {
9834    themeStyles = JSON.parse(container.dataset.themeStyles);
9835}
9836
9837// Applies theme to event item:
9838style="border-left-color: ${color};
9839       background: ${themeStyles.cell_bg};
9840       color: ${themeStyles.text_primary};"
9841```
9842
9843**2. renderEventListFromData() function**:
9844```javascript
9845// Gets theme at start:
9846const container = document.getElementById(calId);
9847const themeStyles = JSON.parse(container.dataset.themeStyles);
9848
9849// Applies to past events toggle:
9850const toggleStyle =
9851    'background: ' + themeStyles.cell_bg + ';' +
9852    'color: ' + themeStyles.text_dim + ';' +
9853    'border-color: ' + themeStyles.grid_border + ';';
9854```
9855
9856### Before vs After
9857
9858**BEFORE (v4.7.2)**:
9859```
9860Load page with Matrix theme:
9861┌─────────────┬─────────────┐
9862│ Calendar    │ Events      │
9863│ (Green) ✓   │ (Green) ✓   │
9864└─────────────┴─────────────┘
9865
9866Click "›" to next month (AJAX):
9867┌─────────────┬─────────────┐
9868│ Calendar    │ Events      │
9869│ (Green) ✓   │ (Gray) ✗    │ ← Theme lost!
9870└─────────────┴─────────────┘
9871```
9872
9873**AFTER (v4.7.3)**:
9874```
9875Load page with Matrix theme:
9876┌─────────────┬─────────────┐
9877│ Calendar    │ Events      │
9878│ (Green) ✓   │ (Green) ✓   │
9879└─────────────┴─────────────┘
9880
9881Click "›" to next month (AJAX):
9882┌─────────────┬─────────────┐
9883│ Calendar    │ Events      │
9884│ (Green) ✓   │ (Green) ✓   │ ← Theme stays!
9885└─────────────┴─────────────┘
9886
9887Navigate anywhere - theme persists! ✓
9888```
9889
9890### Data Flow
9891
9892**Complete theme persistence**:
9893```
98941. PHP: Store theme in data attributes
9895   data-theme-styles='{"bg":"#242424",...}'
9896
98972. JavaScript: Read on initial load
9898   ✓ Already working (v4.7.1)
9899
99003. JavaScript: Read on AJAX rebuild
9901   ✓ NOW FIXED (v4.7.3)
9902   const themeStyles = JSON.parse(container.dataset.themeStyles);
9903
99044. Apply to all rebuilt elements
9905   ✓ Event items
9906   ✓ Past toggle
9907   ✓ Calendar cells
9908```
9909
9910### Testing Scenarios
9911
9912All work perfectly now:
9913
9914**Scenario 1: Navigate Months**:
9915```
9916Feb (Matrix) → Click › → Mar (Matrix) ✓
9917Theme persists through navigation
9918```
9919
9920**Scenario 2: Change Year**:
9921```
99222026 (Purple) → Change to 2027 (Purple) ✓
9923Theme persists through year change
9924```
9925
9926**Scenario 3: Jump to Today**:
9927```
9928Any month (Pink) → Click Today → Current (Pink) ✓
9929Theme persists when jumping
9930```
9931
9932**Scenario 4: Filter Events**:
9933```
9934All events (Professional) → Filter namespace → Filtered (Professional) ✓
9935Theme persists through filtering
9936```
9937
9938### All Themes Work
9939
9940**�� Matrix**: Green everywhere, always ✓
9941**�� Purple**: Purple everywhere, always ✓
9942**�� Professional**: Blue everywhere, always ✓
9943**�� Pink**: Pink everywhere, always ✓
9944
9945**No matter what you do, theme stays consistent!** ��
9946
9947## Version 4.7.2 (2026-02-08) - COMPLETE THEME STYLING
9948
9949### �� Fixed: All Remaining Theme Issues
9950- **Fixed:** Event items in sidebar now use theme colors
9951- **Fixed:** Past Events toggle now uses theme colors
9952- **Fixed:** Calendar cells now properly themed (issue with data passing)
9953- **Result:** Every element now perfectly themed!
9954
9955### What Was Fixed
9956
9957**1. Event Items in Sidebar** (was plain):
9958```php
9959// Before:
9960style="border-left-color: $color;"
9961
9962// After:
9963style="border-left-color: $color;
9964       background: $themeStyles['cell_bg'];
9965       color: $themeStyles['text_primary'];"
9966```
9967
9968**2. Past Events Toggle** (was plain):
9969```php
9970// Before:
9971<div class="past-events-toggle">
9972
9973// After:
9974<div class="past-events-toggle"
9975     style="background: $themeStyles['cell_bg'];
9976            color: $themeStyles['text_dim'];
9977            border-color: $themeStyles['grid_border'];">
9978```
9979
9980**3. Theme Data Flow** (was broken):
9981```php
9982// Now properly passes theme to all functions:
9983renderEventListContent($events, $calId, $namespace, $themeStyles);
9984```
9985
9986### Before vs After
9987
9988**BEFORE (v4.7.1)**:
9989```
9990Calendar header: Themed ✓
9991Calendar grid: Themed ✓
9992Event list panel: Themed ✓
9993Event items: Plain gray ✗
9994Past Events: Plain gray ✗
9995```
9996
9997**AFTER (v4.7.2)**:
9998```
9999Calendar header: Themed ✓
10000Calendar grid: Themed ✓
10001Event list panel: Themed ✓
10002Event items: Themed ✓
10003Past Events: Themed ✓
10004
10005Everything matches! ✨
10006```
10007
10008### Matrix Theme Example
10009
10010**Complete theming**:
10011```
10012┌─────────────┬─────────────┐
10013│  February   │   Events    │ ← Green header
10014├─────────────┼─────────────┤
10015│ Dark cells  │ • Meeting   │ ← Green bg & text
10016│ Green text  │ • Review    │ ← Green bg & text
10017│ Today=green │             │
10018├─────────────┼─────────────┤
10019│             │ ▶ Past (5)  │ ← Green bg
10020└─────────────┴─────────────┘
10021
10022All green! ✓
10023```
10024
10025### Purple Theme Example
10026
10027```
10028┌─────────────┬─────────────┐
10029│  February   │   Events    │ ← Purple header
10030├─────────────┼─────────────┤
10031│ Dark purple │ • Meeting   │ ← Purple bg
10032│ Lavender    │ • Review    │ ← Lavender text
10033│ cells       │             │
10034├─────────────┼─────────────┤
10035│             │ ▶ Past (5)  │ ← Purple bg
10036└─────────────┴─────────────┘
10037
10038All purple! ✓
10039```
10040
10041### Professional Theme Example
10042
10043```
10044┌─────────────┬─────────────┐
10045│  February   │   Events    │ ← Blue header
10046├─────────────┼─────────────┤
10047│ Light gray  │ • Meeting   │ ← Light bg
10048│ Blue accents│ • Review    │ ← Dark text
10049│ cells       │             │
10050├─────────────┼─────────────┤
10051│             │ ▶ Past (5)  │ ← Light bg
10052└─────────────┴─────────────┘
10053
10054All professional! ✓
10055```
10056
10057### Pink Theme Example
10058
10059```
10060┌─────────────┬─────────────┐
10061│  February   │   Events    │ ← Hot pink header
10062├─────────────┼─────────────┤
10063│ Dark pink   │ • Meeting   │ ← Pink bg
10064│ Pink text   │ • Review    │ ← Pink text
10065│ cells       │             │
10066├─────────────┼─────────────┤
10067│             │ ▶ Past (5)  │ ← Pink bg
10068└─────────────┴─────────────┘
10069
10070All pink & sparkly! ✓
10071```
10072
10073### What's Themed Now
10074
10075**Calendar Section**:
10076- ✅ Container border & shadow
10077- ✅ Header background & text
10078- ✅ Navigation buttons
10079- ✅ Today button
10080- ✅ Grid table
10081- ✅ Day cells
10082- ✅ Today cell highlight
10083- ✅ Empty cells
10084
10085**Event List Section**:
10086- ✅ Panel background
10087- ✅ Header background
10088- ✅ Header text
10089- ✅ Search box
10090- ✅ Add button
10091- ✅ Event items ← NEW!
10092- ✅ Past Events toggle ← NEW!
10093
10094**100% themed!** ��
10095
10096## Version 4.7.1 (2026-02-08) - FIX THEME PERSISTENCE & EVENT LIST THEMING
10097
10098### �� Fixed: Theme Now Persists When Changing Months
10099- **Fixed:** Calendar theme no longer resets to default when navigating months
10100- **Fixed:** Theme data now stored in data attributes and used by JavaScript
10101- **Added:** rebuildCalendar now applies theme styles to all cells
10102
10103### ✨ Added: Event List Panel Now Themed
10104- **Added:** Right sidebar event list now uses theme colors
10105- **Added:** Event list header themed
10106- **Added:** Search box themed
10107- **Added:** Add button themed
10108- **Result:** Complete theme consistency across entire calendar!
10109
10110### The Problems
10111
10112**Problem 1: Month Navigation Lost Theme**:
10113```
10114Initial load: Matrix theme ✓ (green)
10115Click "›" to next month
10116Result: Gray calendar ✗ (theme lost!)
10117```
10118
10119**Problem 2: Event List Not Themed**:
10120```
10121Calendar grid: Themed ✓
10122Event list (right side): Plain gray ✗
10123Inconsistent!
10124```
10125
10126### The Fixes
10127
10128**Fix 1: Store Theme in Data Attributes**:
10129
10130```php
10131// PHP stores theme data:
10132<div data-theme="matrix"
10133     data-theme-styles='{"bg":"#242424","border":"#00cc07",...}'>
10134```
10135
10136**Fix 2: JavaScript Uses Theme Data**:
10137
10138```javascript
10139// rebuildCalendar reads theme:
10140const theme = container.dataset.theme;
10141const themeStyles = JSON.parse(container.dataset.themeStyles);
10142
10143// Apply to cells:
10144const cellBg = isToday ?
10145    themeStyles.cell_today_bg :
10146    themeStyles.cell_bg;
10147```
10148
10149**Fix 3: Theme Event List Panel**:
10150
10151```php
10152// Event list header:
10153style="background:{$themeStyles['header_bg']};
10154       color:{$themeStyles['text_primary']};"
10155
10156// Event list container:
10157style="background:{$themeStyles['bg']};"
10158
10159// Search box:
10160style="background:{$themeStyles['cell_bg']};
10161       color:{$themeStyles['text_primary']};"
10162
10163// Add button:
10164style="background:{$themeStyles['border']};"
10165```
10166
10167### Before vs After
10168
10169**BEFORE (v4.7.0)**:
10170```
10171Load page: Matrix theme everywhere ✓
10172Navigate to next month:
10173  Calendar grid: Gray ✗ (theme lost)
10174  Event list: Gray ✗ (never themed)
10175```
10176
10177**AFTER (v4.7.1)**:
10178```
10179Load page: Matrix theme everywhere ✓
10180Navigate to next month:
10181  Calendar grid: Matrix theme ✓ (preserved!)
10182  Event list: Matrix theme ✓ (themed!)
10183
10184Perfect consistency! ✨
10185```
10186
10187### What's Now Themed
10188
10189**Calendar Grid** (after navigation):
10190- ✅ Cell backgrounds
10191- ✅ Today cell highlight
10192- ✅ Empty cells
10193- ✅ Text colors
10194- ✅ Border colors
10195
10196**Event List Panel**:
10197- ✅ Panel background
10198- ✅ Header background & text
10199- ✅ Search box styling
10200- ✅ Add button colors
10201- ✅ Namespace badge
10202
10203### Technical Implementation
10204
10205**Data Flow**:
10206```
102071. PHP: Get theme from config
10208   $theme = getSidebarTheme();
10209
102102. PHP: Get theme styles
10211   $themeStyles = getSidebarThemeStyles($theme);
10212
102133. PHP: Store in data attributes
10214   data-theme="matrix"
10215   data-theme-styles='{...JSON...}'
10216
102174. JavaScript: Read on navigation
10218   const themeStyles = JSON.parse(container.dataset.themeStyles);
10219
102205. JavaScript: Apply to rebuilt elements
10221   style="background:${themeStyles.bg};"
10222```
10223
10224**Result**: Theme persists across navigations! ✓
10225
10226### All Themes Work Perfectly
10227
10228**�� Matrix**:
10229- Month change: Green ✓
10230- Event list: Green ✓
10231
10232**�� Purple**:
10233- Month change: Purple ✓
10234- Event list: Purple ✓
10235
10236**�� Professional**:
10237- Month change: Blue ✓
10238- Event list: Blue ✓
10239
10240**�� Pink**:
10241- Month change: Pink ✓
10242- Event list: Pink ✓
10243
10244**Fully consistent theming everywhere!** ��
10245
10246## Version 4.7.0 (2026-02-08) - THEMES FOR COMPACT CALENDAR! ��
10247
10248### ✨ Major Feature: Themes Now Apply to Compact Calendar
10249- **Added:** Full theme support for {{calendar-compact}}
10250- **Added:** Matrix, Purple, Professional, and Pink themes
10251- **Added:** Consistent theming across sidebar and calendar
10252- **Result:** Beautiful, cohesive appearance!
10253
10254### What's New
10255
10256**All 4 themes now work on the calendar**:
10257- �� **Matrix** - Green cyberpunk (default)
10258- �� **Purple** - Royal purple elegance
10259- �� **Professional** - Clean business blue
10260- �� **Pink** - Sparkly pink bling
10261
10262**Set in Admin Panel** → Theme applies everywhere!
10263
10264### Before vs After
10265
10266**BEFORE (v4.6.8)**:
10267```
10268Sidebar: Themed (Matrix/Purple/Professional/Pink) ✓
10269Calendar: Plain gray (no theme) ✗
10270
10271Inconsistent appearance!
10272```
10273
10274**AFTER (v4.7.0)**:
10275```
10276Sidebar: Themed ✓
10277Calendar: SAME THEME ✓
10278
10279Perfectly consistent! ✨
10280```
10281
10282### Theme Showcase
10283
10284**Matrix Theme** (Green):
10285```
10286┌─────────────────────────┐
10287│ ◀ February 2026 ▶       │ ← Green header
10288├─────────────────────────┤
10289│ Dark background         │
10290│ Green borders           │
10291│ Green text              │
10292│ Green glow effects      │
10293└─────────────────────────┘
10294```
10295
10296**Purple Theme**:
10297```
10298┌─────────────────────────┐
10299│ ◀ February 2026 ▶       │ ← Purple header
10300├─────────────────────────┤
10301│ Dark purple background  │
10302│ Purple borders          │
10303│ Lavender text           │
10304│ Purple glow             │
10305└─────────────────────────┘
10306```
10307
10308**Professional Theme** (Light):
10309```
10310┌─────────────────────────┐
10311│ ◀ February 2026 ▶       │ ← Blue header
10312├─────────────────────────┤
10313│ Light gray background   │
10314│ Blue accents            │
10315│ Professional appearance │
10316│ Clean, business-ready   │
10317└─────────────────────────┘
10318```
10319
10320**Pink Theme** (Bling):
10321```
10322┌─────────────────────────┐
10323│ ◀ February 2026 ▶       │ ← Hot pink header
10324├─────────────────────────┤
10325│ Dark pink background    │
10326│ Pink borders & glow     │
10327│ Pink text               │
10328│ Sparkle effects ✨��    │
10329└─────────────────────────┘
10330```
10331
10332### What's Themed
10333
10334**Calendar Container**:
10335- Background color
10336- Border color
10337- Shadow/glow effect
10338
10339**Calendar Header**:
10340- Background gradient
10341- Border color
10342- Text color
10343- Button colors
10344
10345**Calendar Grid**:
10346- Grid background
10347- Grid borders
10348- Header row colors
10349
10350**Calendar Cells**:
10351- Cell background
10352- Today cell highlight
10353- Text color
10354- Border colors
10355
10356### Implementation
10357
10358**Theme Detection**:
10359```php
10360// Same theme system as sidebar
10361$theme = $this->getSidebarTheme();
10362$themeStyles = $this->getSidebarThemeStyles($theme);
10363```
10364
10365**Applied to Container**:
10366```php
10367style="background:' . $themeStyles['bg'] . ';
10368       border:2px solid ' . $themeStyles['border'] . ';
10369       box-shadow:0 0 10px ' . $themeStyles['shadow'] . ';"
10370```
10371
10372**Applied to Header**:
10373```php
10374style="background:' . $themeStyles['header_bg'] . ';
10375       color:' . $themeStyles['text_primary'] . ';"
10376```
10377
10378**Applied to Cells**:
10379```php
10380$cellBg = $isToday ?
10381    $themeStyles['cell_today_bg'] :
10382    $themeStyles['cell_bg'];
10383```
10384
10385### How to Change Theme
10386
10387**In Admin Panel**:
103881. Go to Admin → Calendar Management
103892. Click "�� Themes" tab
103903. Select theme (Matrix/Purple/Professional/Pink)
103914. Theme applies to BOTH sidebar and calendar! ✓
10392
10393**No configuration needed** - Just select and enjoy!
10394
10395### Theme Colors
10396
10397**Matrix**:
10398- Background: `#242424` (dark gray)
10399- Border: `#00cc07` (matrix green)
10400- Text: `#00cc07` (green)
10401- Today: `#2a4d2a` (green highlight)
10402
10403**Purple**:
10404- Background: `#2a2030` (dark purple)
10405- Border: `#9b59b6` (royal purple)
10406- Text: `#b19cd9` (lavender)
10407- Today: `#3d2b4d` (purple highlight)
10408
10409**Professional**:
10410- Background: `#e8ecf1` (light blue-gray)
10411- Border: `#4a90e2` (business blue)
10412- Text: `#2c3e50` (dark blue-gray)
10413- Today: `#dce8f7` (light blue highlight)
10414
10415**Pink**:
10416- Background: `#1a0d14` (dark pink-black)
10417- Border: `#ff1493` (hot pink)
10418- Text: `#ff69b4` (pink)
10419- Today: `#3d2030` (pink highlight)
10420
10421### Consistency
10422
10423**Both use same theme**:
10424```
10425Admin Panel → Set theme to "Purple"
10426
10427{{calendar}} sidebar: Purple theme ✓
10428{{calendar-compact}}: Purple theme ✓
10429{{calendar-panel}}: Will be themed next! ✓
10430
10431All calendars match! ✨
10432```
10433
10434**Perfectly coordinated appearance!** ��
10435
10436## Version 4.6.8 (2026-02-07) - DOCUMENT NOHEADER PARAMETER
10437
10438### �� Documentation: Added noheader Parameter Info
10439- **Added:** Documentation for existing `noheader` parameter
10440- **Updated:** README with complete eventlist parameter list
10441- **Info:** Feature already existed, just wasn't documented!
10442
10443### The noheader Parameter
10444
10445**What it does**: Hides the clock/date/weather header in eventlist
10446
10447**Usage**:
10448```
10449{{eventlist today noheader}}
10450```
10451
10452**Before (with header)**:
10453```
10454┌─────────────────────────────────┐
10455│ �� 3:45 PM    ��️ 72°  Feb 7     │ ← Clock header
10456├─────────────────────────────────┤
10457│ 5 min load │ CPU │ Memory       │ ← System stats
10458├─────────────────────────────────┤
10459│ Today's Events                   │
10460│ • 10:00 Team Meeting             │
10461│ • 2:00 Project Review            │
10462└─────────────────────────────────┘
10463```
10464
10465**After (noheader)**:
10466```
10467┌─────────────────────────────────┐
10468│ Today's Events                   │ ← No header!
10469│ • 10:00 Team Meeting             │
10470│ • 2:00 Project Review            │
10471└─────────────────────────────────┘
10472
10473Cleaner, more compact! ✓
10474```
10475
10476### When to Use noheader
10477
10478**Use WITH header** (default):
10479- Dashboard view
10480- Want to see current time
10481- Want weather info
10482- Want system stats
10483
10484**Use WITHOUT header** (`noheader`):
10485- Embedded in page content
10486- Just want event list
10487- Minimal design
10488- Space-constrained
10489
10490### Complete eventlist Parameters
10491
10492**Date Parameters**:
10493```
10494date=YYYY-MM-DD          Show specific date
10495daterange=START:END      Show date range
10496```
10497
10498**Filter Parameters**:
10499```
10500namespace=name           Filter by namespace
10501```
10502
10503**Display Parameters**:
10504```
10505today                    Show today with live clock
10506noheader                 Hide clock/date/weather header
10507showchecked              Show completed tasks
10508range=day|week|month     Show day/week/month range
10509```
10510
10511### Examples
10512
10513**Full featured** (dashboard):
10514```
10515{{eventlist today}}
10516```
10517Shows: Clock, weather, system stats, events ✓
10518
10519**Minimal** (embedded):
10520```
10521{{eventlist today noheader}}
10522```
10523Shows: Just events ✓
10524
10525**Date range without header**:
10526```
10527{{eventlist daterange=2026-02-01:2026-02-28 noheader}}
10528```
10529Shows: Events for February, no header ✓
10530
10531**With namespace filter**:
10532```
10533{{eventlist today namespace=work noheader}}
10534```
10535Shows: Today's work events, no header ✓
10536
10537### Implementation
10538
10539**Already existed in code** (line 833):
10540```php
10541$noheader = isset($data['noheader']) ? true : false;
10542```
10543
10544**Applied at render** (line 1010):
10545```php
10546if ($today && !empty($allEvents) && !$noheader) {
10547    // Render clock header with date/time/weather
10548}
10549```
10550
10551**Just wasn't documented!** Now it is. ✓
10552
10553## Version 4.6.7 (2026-02-07) - REMOVE REDUNDANT FILTER BADGE
10554
10555### ✨ Improvement: Removed Filter Badge Above Sidebar
10556- **Removed:** Filter badge no longer shows above compact calendar
10557- **Reason:** Filtering is already clearly visible in the calendar view
10558- **Result:** Cleaner UI, less redundancy
10559
10560### What Changed
10561
10562**BEFORE**:
10563```
10564┌─────────────────────────┐
10565│ Filtering: work ✕       │ ← Badge above calendar
10566├─────────────────────────┤
10567│ ◀ February 2026 ▶       │
10568├─────────────────────────┤
10569│ Calendar grid with       │
10570│ filtered events          │ ← Already filtered
10571└─────────────────────────┘
10572
10573Badge was redundant - you can already see
10574the filtering in the calendar!
10575```
10576
10577**AFTER**:
10578```
10579┌─────────────────────────┐
10580│ ◀ February 2026 ▶       │ ← No badge!
10581├─────────────────────────┤
10582│ Calendar grid with       │
10583│ filtered events          │ ← Filtering visible here
10584└─────────────────────────┘
10585
10586Cleaner, simpler UI ✓
10587```
10588
10589### Why Remove It?
10590
10591**Redundant Information**:
10592- Calendar already shows only filtered events
10593- Namespace badges on events show which namespace
10594- Badge added visual clutter without value
10595
10596**Better UX**:
10597- Less visual noise
10598- More space for content
10599- Filtering still obvious from event display
10600
10601**Code Cleanup**:
10602```php
10603// Old code (removed):
10604if ($namespace && $namespace !== '*' && ...) {
10605    $html .= '<div class="calendar-namespace-filter">';
10606    $html .= 'Filtering: ' . $namespace . ' ✕';
10607    $html .= '</div>';
10608}
10609
10610// New code:
10611// Filter badge removed - filtering shown in calendar view only
10612```
10613
10614### How Filtering Still Works
10615
10616**Filtering IS Active**:
10617- Calendar only shows events from selected namespace ✓
10618- Event namespace badges show which namespace ✓
10619- Clear filtering still works (in calendar) ✓
10620
10621**Just No Badge**:
10622- No redundant "Filtering: work ✕" above calendar
10623- Cleaner, more professional appearance
10624
10625### What You Still See
10626
10627**Namespace Information**:
10628```
10629Event with namespace badge:
10630┌────────────────────────┐
10631│ 10:00 Team Meeting     │
10632│       [work] ←─────────┼─ Namespace badge on event
10633└────────────────────────┘
10634```
10635
10636**Filtered View**:
10637- Only events from selected namespace visible
10638- Empty dates show no events
10639- Clear which namespace you're viewing
10640
10641**No Need for Top Badge**:
10642- Already obvious from events shown
10643- Namespace badges provide context
10644- Less clutter!
10645
10646### Summary
10647
10648**Removed**: Filter badge above calendar
10649**Kept**: All filtering functionality
10650**Benefit**: Cleaner UI
10651
10652**Filtering works the same, just without the redundant badge!** ✨
10653
10654## Version 4.6.6 (2026-02-07) - FIX: REMOVE FILTER BADGE IMMEDIATELY
10655
10656### �� Fixed: Filter Badge Now Disappears Immediately
10657- **Fixed:** Filter badge now removed from DOM immediately when clicking ✕
10658- **Added:** Badge removal before page reload/AJAX call
10659- **Result:** Badge disappears instantly, no waiting for reload
10660
10661### The Problem
10662
10663**v4.6.5 behavior**:
10664```
10665Click ✕ to clear filter
10666→ Page reloads or AJAX fires
10667→ Badge stays visible during reload ✗
10668→ Badge finally disappears after reload ✓
10669
10670User sees badge for 0.5-2 seconds after clicking ✕
10671Feels laggy! ✗
10672```
10673
10674### The Fix
10675
10676**Immediately remove badge from DOM**:
10677
10678```javascript
10679window.clearNamespaceFilter = function(calId) {
10680    const container = document.getElementById(calId);
10681
10682    // IMMEDIATELY hide/remove the filter badge
10683    const filterBadge = container.querySelector('.calendar-namespace-filter');
10684    if (filterBadge) {
10685        filterBadge.style.display = 'none'; // Hide instantly
10686        filterBadge.remove(); // Remove from DOM
10687    }
10688
10689    // THEN reload (AJAX or page reload)
10690    navCalendar(...) or window.location.href = ...
10691};
10692```
10693
10694### Before vs After
10695
10696**BEFORE (v4.6.5)**:
10697```
10698Time 0ms: Click ✕
10699┌─────────────────────────┐
10700│ Filtering: work ✕       │ ← Still visible
10701├─────────────────────────┤
10702
10703Time 500ms: Reload completes
10704┌─────────────────────────┐
10705│ (no badge)              │ ← Finally gone
10706├─────────────────────────┤
10707
10708Delay: 500-2000ms ✗
10709```
10710
10711**AFTER (v4.6.6)**:
10712```
10713Time 0ms: Click ✕
10714┌─────────────────────────┐
10715│ (no badge)              │ ← Gone immediately!
10716├─────────────────────────┤
10717
10718Time 500ms: Reload completes
10719┌─────────────────────────┐
10720│ (no badge)              │ ← Still gone
10721├─────────────────────────┤
10722
10723Delay: 0ms ✓
10724Instant feedback! ✓
10725```
10726
10727### Implementation
10728
10729**Two-step removal**:
10730
10731**Step 1**: Hide immediately
10732```javascript
10733filterBadge.style.display = 'none';
10734// User sees badge disappear instantly
10735```
10736
10737**Step 2**: Remove from DOM
10738```javascript
10739filterBadge.remove();
10740// Clean up HTML
10741```
10742
10743**Step 3**: Reload
10744```javascript
10745// Sidebar: Page reload
10746window.location.href = url.toString();
10747
10748// Calendar: AJAX reload
10749navCalendar(calId, year, month, originalNamespace);
10750```
10751
10752**Result**: Badge gone BEFORE reload starts ✓
10753
10754### Why This Matters
10755
10756**User Experience**:
10757- Old: Click ✕ → Wait → Badge disappears
10758- New: Click ✕ → Badge disappears instantly
10759
10760**Perceived Performance**:
10761- Instant visual feedback
10762- Feels responsive
10763- Professional UX
10764
10765**Technical**:
10766- DOM manipulation is synchronous (instant)
10767- Network requests are asynchronous (slow)
10768- Do fast things first!
10769
10770**Badge now disappears the moment you click ✕!** ⚡
10771
10772## Version 4.6.5 (2026-02-07) - FIX SIDEBAR FILTER BADGE CLEARING
10773
10774### �� Fixed: Filter Badge Not Clearing in Sidebar
10775- **Fixed:** Filter badge now properly clears when clicking ✕ button
10776- **Fixed:** Sidebar widget now reloads page without namespace filter
10777- **Changed:** clearNamespaceFilter now detects sidebar vs calendar and handles appropriately
10778
10779### The Problem
10780
10781**In {{calendar}} sidebar widget**:
10782```
107831. Click namespace badge to filter
107842. Badge appears: "Filtering: work ✕"
107853. Click ✕ to clear filter
107864. Badge stays visible! ✗
107875. Events still filtered! ✗
10788```
10789
10790**Root Cause**: Sidebar widget is server-rendered (PHP), not AJAX-reloaded like regular calendar.
10791
10792### The Fix
10793
10794**Detect widget type and handle appropriately**:
10795
10796```javascript
10797window.clearNamespaceFilter = function(calId) {
10798    const container = document.getElementById(calId);
10799
10800    // Check if this is a sidebar widget
10801    const sidebarContainer = document.getElementById('sidebar-widget-' + calId);
10802
10803    if (sidebarContainer) {
10804        // SIDEBAR: Reload page without namespace parameter
10805        const url = new URL(window.location.href);
10806        url.searchParams.delete('namespace');
10807        window.location.href = url.toString(); // Page reload
10808        return;
10809    }
10810
10811    // REGULAR CALENDAR: AJAX reload
10812    navCalendar(calId, year, month, originalNamespace);
10813};
10814```
10815
10816### How It Works
10817
10818**Sidebar Widget** ({{calendar}} syntax):
10819```
10820Rendered server-side with PHP
10821Cannot be AJAX-reloaded
10822Solution: Reload entire page without ?namespace=work parameter
10823```
10824
10825**Regular Calendar** ({{calendar-compact}} or {{calendar-panel}}):
10826```
10827Has AJAX reload capability
10828Solution: Call navCalendar() to reload via AJAX
10829```
10830
10831### Before vs After
10832
10833**BEFORE (v4.6.4)**:
10834```
10835Sidebar widget filtered by "work":
10836┌─────────────────────────┐
10837│ Filtering: work ✕       │ ← Click ✕
10838├─────────────────────────┤
10839│ Today                   │
10840│ • Work meeting          │
10841└─────────────────────────┘
10842
10843After clicking ✕:
10844┌─────────────────────────┐
10845│ Filtering: work ✕       │ ← Still there! ✗
10846├─────────────────────────┤
10847│ Today                   │
10848│ • Work meeting          │ ← Still filtered! ✗
10849└─────────────────────────┘
10850```
10851
10852**AFTER (v4.6.5)**:
10853```
10854Sidebar widget filtered by "work":
10855┌─────────────────────────┐
10856│ Filtering: work ✕       │ ← Click ✕
10857├─────────────────────────┤
10858│ Today                   │
10859│ • Work meeting          │
10860└─────────────────────────┘
10861
10862After clicking ✕ → Page reloads:
10863┌─────────────────────────┐
10864│ (no filter badge)       │ ← Cleared! ✓
10865├─────────────────────────┤
10866│ Today                   │
10867│ • Work meeting          │
10868│ • Personal task         │ ← All events! ✓
10869│ • Project review        │
10870└─────────────────────────┘
10871```
10872
10873### Technical Details
10874
10875**Why Page Reload for Sidebar?**
10876
10877Sidebar widget is rendered server-side:
10878```php
10879// In syntax.php:
10880return $this->renderSidebarWidget($events, $namespace, $calId);
10881// ↑ PHP generates complete HTML
10882// No AJAX reload endpoint exists for sidebar
10883```
10884
10885**Solution**: Remove `?namespace=work` from URL and reload page
10886```javascript
10887const url = new URL(window.location.href);
10888url.searchParams.delete('namespace'); // Remove filter
10889window.location.href = url.toString(); // Reload
10890```
10891
10892**Why AJAX for Regular Calendar?**
10893
10894Regular calendars have AJAX endpoints:
10895```javascript
10896// action.php handles:
10897action: 'load_month' → Returns new month data
10898navCalendar() → Fetches and rebuilds calendar
10899```
10900
10901### Filter Badge Behavior
10902
10903**Showing Badge** (when filtering):
10904- Server-side: PHP renders badge in HTML
10905- Client-side: JavaScript adds badge to header
10906
10907**Clearing Badge**:
10908- Sidebar: Page reload (removes ?namespace from URL)
10909- Calendar: AJAX reload (badge removed in rebuildCalendar)
10910
10911**Now works correctly for both!** ✓
10912
10913## Version 4.6.4 (2026-02-07) - HOTFIX: PHP SYNTAX ERROR
10914
10915### �� Critical Hotfix: Fixed PHP Parse Error
10916- **Fixed:** Template literal backticks causing PHP syntax error
10917- **Fixed:** Changed JavaScript template literals to concatenation
10918- **Fixed:** Admin page now loads without parse errors
10919
10920### The Problem
10921
10922**v4.6.3 broke admin page**:
10923```
10924Error loading plugin calendar
10925ParseError: syntax error, unexpected identifier "s",
10926expecting "," or ";"
10927```
10928
10929**Cause**: JavaScript template literals inside PHP echo
10930```php
10931echo '<script>
10932    let nsOptions = `<option value="">(default)</option>`;
10933                    ↑ PHP sees backtick and gets confused!
10934</script>';
10935```
10936
10937**Why it broke**: Backticks (`) are special in PHP too!
10938
10939### The Fix
10940
10941**Changed from template literals to concatenation**:
10942
10943**BEFORE (broken)**:
10944```javascript
10945let nsOptions = `<option value="">(default)</option>`;
10946nsOptions += `<option value="${namespace}">${namespace}</option>`;
10947console.log('Edit recurring:', namespace);
10948```
10949
10950**AFTER (fixed)**:
10951```javascript
10952let nsOptions = "<option value=\\"\\">(default)</option>";
10953nsOptions += "<option value=\\"" + namespace + "\\">" + namespace + "</option>";
10954console.log("Edit recurring:", namespace);
10955```
10956
10957**Changes**:
10958- ✅ Backticks (`) → Double quotes (")
10959- ✅ Template literals (${var}) → Concatenation (" + var + ")
10960- ✅ Single quotes in console.log → Double quotes
10961- ✅ Properly escaped quotes for PHP echo
10962
10963### Technical Details
10964
10965**The Issue**:
10966```php
10967// Inside PHP echo string:
10968echo '<script>
10969    let x = `template ${literal}`;  // ✗ Backtick breaks PHP!
10970</script>';
10971```
10972
10973**The Solution**:
10974```php
10975// Use regular string concatenation:
10976echo '<script>
10977    let x = "string " + variable;   // ✓ Works in PHP echo!
10978</script>';
10979```
10980
10981**Quote Escaping**:
10982```javascript
10983// Double quotes inside PHP single-quote string:
10984'<option value=\"\">text</option>'
10985               ↑↑ Escaped for JavaScript
10986```
10987
10988### Result
10989
10990**Before**: Admin page crashed with parse error ✗
10991**After**: Admin page loads perfectly ✓
10992
10993**No functionality changed - just syntax fix!**
10994
10995## Version 4.6.3 (2026-02-07) - FIX RECURRING EVENTS NAMESPACE DROPDOWN
10996
10997### �� Critical Fix: Namespace Dropdown in Recurring Events Section
10998- **Fixed:** Namespace dropdown now shows ALL available namespaces when editing
10999- **Fixed:** Current namespace now properly selected in dropdown
11000- **Fixed:** Namespace extraction from DOM now uses multiple methods
11001- **Added:** Console logging to debug namespace detection
11002
11003### The Problem
11004
11005**When editing from �� Recurring Events section**:
11006```
11007Click "Edit" on recurring event
11008Namespace dropdown shows:
11009- (default)
11010- (nothing else!) ✗
11011
11012Can't select any namespace! ✗
11013```
11014
11015**Why**: Broken namespace extraction logic
11016```javascript
11017// OLD CODE (broken):
11018const namespaces = Array.from(document.querySelectorAll("[id^=ns_]"))
11019    .map(el => {
11020        // Complex parsing that often failed
11021        const nsSpan = el.querySelector("span:nth-child(3)");
11022        return nsSpan.textContent.replace("�� ", "").trim();
11023    })
11024    .filter(ns => ns !== namespace); // Excluded current! ✗
11025```
11026
11027**Result**: Empty dropdown, can't change namespace! ✗
11028
11029### The Fix
11030
11031**NEW CODE (robust)**:
11032```javascript
11033const namespaces = new Set();
11034
11035// Method 1: Namespace explorer folders
11036document.querySelectorAll("[id^=ns_]").forEach(el => {
11037    const nsSpan = el.querySelector("span:nth-child(3)");
11038    if (nsSpan) {
11039        let nsText = nsSpan.textContent.replace("�� ", "").trim();
11040        if (nsText && nsText !== "(default)") {
11041            namespaces.add(nsText); // ✓
11042        }
11043    }
11044});
11045
11046// Method 2: Datalist (backup method)
11047document.querySelectorAll("#namespaceList option").forEach(opt => {
11048    if (opt.value && opt.value !== "") {
11049        namespaces.add(opt.value); // ✓
11050    }
11051});
11052
11053// Build dropdown with ALL namespaces
11054let options = `<option value="">(default)</option>`;
11055
11056// Show current namespace as selected
11057if (namespace) {
11058    options += `<option value="${namespace}" selected>${namespace} (current)</option>`;
11059}
11060
11061// Show all other namespaces
11062for (const ns of nsArray) {
11063    if (ns !== namespace) {
11064        options += `<option value="${ns}">${ns}</option>`;
11065    }
11066}
11067```
11068
11069**Result**: All namespaces visible! ✓
11070
11071### How It Works Now
11072
11073**Before (Broken)**:
11074```
11075Edit recurring event in "work" namespace
11076
11077Dropdown shows:
11078☐ (default)
11079
11080That's it! Can't select anything! ✗
11081```
11082
11083**After (Fixed)**:
11084```
11085Edit recurring event in "work" namespace
11086
11087Dropdown shows:
11088☐ (default)
11089☑ work (current)  ← Selected!
11090☐ personal
11091☐ projects
11092☐ meetings
11093
11094All namespaces available! ✓
11095```
11096
11097### Key Improvements
11098
11099**1. Dual extraction methods**:
11100- Primary: Parse namespace explorer DOM
11101- Backup: Read from datalist
11102- Result: Always finds namespaces ✓
11103
11104**2. Current namespace included**:
11105```javascript
11106// OLD: Excluded current namespace
11107.filter(ns => ns !== namespace) ✗
11108
11109// NEW: Include and mark as selected
11110options += `<option value="${namespace}" selected>${namespace} (current)</option>` ✓
11111```
11112
11113**3. Better error handling**:
11114```javascript
11115if (nsSpan) {  // Check exists
11116    let nsText = nsSpan.textContent.replace("�� ", "").trim();
11117    if (nsText && nsText !== "(default)") {  // Validate
11118        namespaces.add(nsText);
11119    }
11120}
11121```
11122
11123**4. Console debugging**:
11124```javascript
11125console.log('Edit recurring - Current namespace:', namespace);
11126console.log('Available namespaces:', nsArray);
11127```
11128
11129Open browser console (F12) to see what namespaces are detected!
11130
11131### Example Usage
11132
11133**Scenario**: Edit recurring "Team Meeting" in "work" namespace
11134
11135**Steps**:
111361. Go to �� Recurring Events section
111372. Click "Edit" on "Team Meeting"
111383. See namespace dropdown:
11139   - ☐ (default)
11140   - ☑ work (current)
11141   - ☐ personal
11142   - ☐ projects
111434. Select "personal" to move event
111445. Click "Save Changes"
111456. Event moved to "personal" namespace ✓
11146
11147**Finally works as expected!** ��
11148
11149## Version 4.6.2 (2026-02-07) - FIX NAMESPACE PRESERVATION
11150
11151### �� Recurring Events Namespace Fix
11152- **Fixed:** Namespace now properly preserved when editing recurring events
11153- **Fixed:** Namespace selector now allows selecting any namespace (not just default)
11154- **Added:** Better logging for namespace preservation debugging
11155- **Added:** Console logging to track namespace values during edit
11156
11157### The Namespace Problem
11158
11159**Issue 1**: Can't select non-default namespace
11160```
11161When editing recurring event:
11162- Dropdown shows all namespaces ✓
11163- User selects "work"
11164- Form submits with "" (empty/default) ✗
11165```
11166
11167**Issue 2**: Namespace not preserved
11168```
11169Recurring event in "personal" namespace
11170Edit the title only
11171After save: namespace changed to "" (default) ✗
11172```
11173
11174### The Fixes
11175
11176**Fix 1**: Better namespace preservation logic
11177```php
11178// When editing recurring event:
11179$existingNamespace = $existingEventData['namespace'];
11180
11181// Preserve if user didn't explicitly change it:
11182if (empty($namespace) ||
11183    strpos($namespace, '*') !== false ||
11184    strpos($namespace, ';') !== false) {
11185    // User didn't select or selected wildcard
11186    $namespace = $existingNamespace; // Keep existing!
11187}
11188```
11189
11190**Fix 2**: Proper form population
11191```javascript
11192// When editing, set BOTH inputs:
11193namespaceHidden.value = event.namespace || '';  // Hidden (submitted)
11194namespaceSearch.value = event.namespace || '(default)';  // Visible
11195
11196// Plus logging:
11197console.log('Set namespace for editing:', event.namespace);
11198```
11199
11200**Fix 3**: Added detailed logging
11201```php
11202error_log("Preserving namespace '$namespace' (received='$receivedNamespace')");
11203error_log("Using new namespace '$namespace'");
11204error_log("No existing namespace to preserve");
11205```
11206
11207### How It Works Now
11208
11209**Scenario 1**: Edit without changing namespace
11210```
11211Event in "work" namespace
11212Edit title to "Updated Meeting"
11213Namespace field shows: "work"
11214Hidden input value: "work"
11215Result: Saved in "work" ✓
11216```
11217
11218**Scenario 2**: Change namespace during edit
11219```
11220Event in "personal" namespace
11221Edit and select "work" namespace
11222Hidden input value: "work"
11223Result: Saved in "work" ✓
11224```
11225
11226**Scenario 3**: Edit with empty/wildcard namespace
11227```
11228Event in "projects" namespace
11229Namespace field empty or shows "personal;work"
11230System preserves: "projects"
11231Result: Saved in "projects" ✓
11232```
11233
11234### Debugging
11235
11236Now with console logging, you can see:
11237```javascript
11238Set namespace for editing: work
11239Hidden value: work
11240```
11241
11242And in PHP logs:
11243```
11244Calendar saveEvent recurring: Loaded existing data - namespace='work'
11245Calendar saveEvent recurring: Preserving namespace 'work' (received='')
11246```
11247
11248**Namespace preservation now works correctly!** ��
11249
11250## Version 4.6.1 (2026-02-07) - PRESERVE RECURRING EVENT DATA
11251
11252### �� Recurring Events Edit Fix
11253- **Fixed:** Editing recurring events now preserves unchanged fields
11254- **Fixed:** Empty fields no longer erase existing data
11255- **Added:** Smart merge of existing event data with new changes
11256
11257### The Problem
11258
11259**Before**: Editing erased unchanged fields!
11260```
11261Original recurring event:
11262- Title: "Team Meeting"
11263- Time: "10:00 AM"
11264- Description: "Weekly standup with engineering team"
11265- Color: Red
11266
11267User edits ONLY the title to "Staff Meeting"
11268Form sends:
11269- Title: "Staff Meeting" ✓
11270- Time: "" ✗ (empty because user didn't change it)
11271- Description: "" ✗ (empty)
11272- Color: "#3498db" ✗ (default blue)
11273
11274Result after save:
11275- Title: "Staff Meeting" ✓
11276- Time: BLANK ✗
11277- Description: BLANK ✗
11278- Color: Blue ✗
11279```
11280
11281**All the other data was lost!** ✗
11282
11283### The Fix
11284
11285**After**: Preserves unchanged data!
11286```php
11287if ($eventId && $isRecurring) {
11288    // Load existing event data
11289    $existingEventData = getExistingEventData($eventId);
11290
11291    // Merge: use new value OR keep existing
11292    $title = $title ?: $existingEventData['title'];
11293    $time = $time ?: $existingEventData['time'];
11294    $description = $description ?: $existingEventData['description'];
11295    $color = ($color === '#3498db') ?
11296        $existingEventData['color'] : $color;
11297}
11298```
11299
11300**Now**:
11301```
11302User edits ONLY the title to "Staff Meeting"
11303
11304System:
113051. Loads existing event data
113062. Merges: new title + existing time/description/color
113073. Saves merged data
11308
11309Result:
11310- Title: "Staff Meeting" ✓ (changed)
11311- Time: "10:00 AM" ✓ (preserved!)
11312- Description: "Weekly standup..." ✓ (preserved!)
11313- Color: Red ✓ (preserved!)
11314```
11315
11316**Only changed fields are updated!** ✓
11317
11318### How It Works
11319
11320**Step 1**: Load existing data
11321```php
11322$existingEventData = $this->getExistingEventData(
11323    $eventId,
11324    $date,
11325    $namespace
11326);
11327```
11328
11329**Step 2**: Merge with new data
11330```php
11331// If new value is empty, use existing value
11332$title = $newTitle ?: $existingEventData['title'];
11333$time = $newTime ?: $existingEventData['time'];
11334$description = $newDesc ?: $existingEventData['description'];
11335
11336// Special handling for color (default is #3498db)
11337if ($newColor === '#3498db' && $existingEventData['color']) {
11338    $color = $existingEventData['color'];
11339}
11340```
11341
11342**Step 3**: Save merged data
11343```php
11344createRecurringEvents(..., $title, $time, $description, $color, ...);
11345```
11346
11347### Fields Preserved
11348
11349When editing recurring events, these fields are now preserved if not changed:
11350- ✅ Title (if left blank)
11351- ✅ Time (if not specified)
11352- ✅ End Time (if not specified)
11353- ✅ Description (if left empty)
11354- ✅ Color (if still default blue)
11355
11356**Edit only what you want to change - everything else stays!** ��
11357
11358## Version 4.6.0 (2026-02-07) - NAMESPACE RENAME & RECURRING FIX
11359
11360### ✨ New Feature: Rename Namespaces
11361- **Added:** ✏️ Rename button in Namespace Explorer
11362- **Added:** Rename all events in a namespace at once
11363- **Added:** Automatic cleanup of old directory structure
11364
11365### �� Critical Fix: Recurring Events Actually Edit Now!
11366- **Fixed:** Editing recurring events now deletes ALL instances
11367- **Fixed:** Previously only deleted one instance, left orphans
11368- **Fixed:** Recurring events properly regenerated on edit
11369
11370### Namespace Rename Feature
11371
11372**Before**: Could only delete namespaces, not rename
11373
11374**After**: Click ✏️ to rename!
11375
11376```
11377�� work (15 events)  [3] [✏️] [��️]
11378                          ↑ NEW!
11379```
11380
11381**How It Works**:
113821. Click ✏️ rename button
113832. Enter new namespace name
113843. All events moved to new namespace
113854. Event `namespace` field updated in JSON
113865. Old directory cleaned up
11387
11388**Example**:
11389```
11390Rename: "work" → "business"
11391
11392Before:
11393/data/meta/work/calendar/*.json
11394Events: {namespace: "work"}
11395
11396After:
11397/data/meta/business/calendar/*.json
11398Events: {namespace: "business"}
11399```
11400
11401**Implementation**:
11402```php
11403private function renameNamespace() {
11404    // 1. Validate new name
11405    // 2. Rename directory
11406    // 3. Update all event namespace fields in JSON
11407    // 4. Clean up old empty directories
11408}
11409```
11410
11411### Recurring Events Fix - The Problem
11412
11413**Before**: Editing didn't work!
11414```
11415Original recurring event generates:
11416- Event-0 (Mon, Feb 10)
11417- Event-1 (Mon, Feb 17)
11418- Event-2 (Mon, Feb 24)
11419
11420User edits Event-0, changes title to "Updated"
11421
11422What SHOULD happen:
11423- Delete Event-0, Event-1, Event-2
11424- Generate new instances with "Updated" title
11425
11426What ACTUALLY happened:
11427- Delete Event-0 only ✗
11428- Generate new instances
11429- Result: Event-1 and Event-2 still show old title! ✗
11430```
11431
11432**After**: Properly deletes ALL instances!
11433
11434**The Fix**:
11435```php
11436private function deleteEvent() {
11437    $event = getEvent($eventId);
11438
11439    // Check if recurring
11440    if ($event['recurring'] && $event['recurringId']) {
11441        // Delete ALL instances with same recurringId
11442        deleteAllRecurringInstances($recurringId);
11443    }
11444
11445    // Then normal delete for spanning events
11446}
11447
11448private function deleteAllRecurringInstances($recurringId) {
11449    // Scan ALL calendar JSON files
11450    foreach (glob('*.json') as $file) {
11451        // Filter out events with matching recurringId
11452        $events = array_filter($events, function($event) {
11453            return $event['recurringId'] !== $recurringId;
11454        });
11455    }
11456}
11457```
11458
11459**Result**:
11460- Edit "Weekly Team Meeting" → ALL instances updated ✓
11461- Delete recurring event → ALL instances deleted ✓
11462- No more orphaned events! ✓
11463
11464### Recurring Event Fields
11465
11466Every recurring event has:
11467```json
11468{
11469    "id": "abc123-0",
11470    "recurring": true,
11471    "recurringId": "abc123",  ← Links all instances
11472    ...
11473}
11474```
11475
11476When editing/deleting, we find ALL events with same `recurringId` and remove them!
11477
11478**Finally, recurring events work properly!** ��
11479
11480## Version 4.5.2 (2026-02-07) - FIX SORTING & PINK TOOLTIPS
11481
11482### �� Important Events Sorting - ACTUALLY FIXED!
11483- **Fixed:** Important Events now REALLY sorted by date first, then time
11484- **Fixed:** renderSidebarSection was re-sorting and breaking the order
11485- **Changed:** Important Events use date-first sorting, Today/Tomorrow use time-only
11486
11487### �� Pink Theme Tooltip Bling!
11488- **Added:** Pink gradient tooltips (hot pink → light pink)
11489- **Added:** Glowing pink border on tooltips
11490- **Added:** Sparkling heart (��) appears next to tooltip!
11491- **Added:** Heart has pink glow drop-shadow
11492
11493### The Sorting Bug - Root Cause
11494
11495**Problem**: Two sorts were happening!
11496
11497**Sort #1** (Line 2047): Before rendering
11498```php
11499usort($importantEvents, ...) // Sort by date ✓
11500```
11501
11502**Sort #2** (Line 2751): Inside renderSidebarSection
11503```php
11504usort($events, ...) // Sort by TIME ONLY ✗
11505// This was breaking the date order!
11506```
11507
11508**The Fix**: Different sorting for different sections
11509```php
11510if ($title === 'Important Events') {
11511    // Sort by DATE first, then time
11512    usort($events, function($a, $b) {
11513        if ($dateA !== $dateB) {
11514            return strcmp($dateA, $dateB); // DATE first!
11515        }
11516        // Same date - sort by time
11517        return timeCompare($a, $b);
11518    });
11519} else {
11520    // Today/Tomorrow - sort by TIME only (same date)
11521    usort($events, function($a, $b) {
11522        return timeCompare($a, $b);
11523    });
11524}
11525```
11526
11527**Result**: Important Events now CORRECTLY sorted!
11528```
11529✓ Sun, Feb 8 - 3:30 PM Super Bowl
11530✓ Tue, Feb 10 - 11:30 AM Doctor visit
11531✓ Sat, Feb 14 - Valentine's Day (all-day)
11532✓ Sat, Feb 14 - 8:00 PM Crab Shack
11533```
11534
11535### Pink Tooltip Magic! ��
11536
11537**Normal Tooltips**: Black background, plain
11538```css
11539background: rgba(0, 0, 0, 0.95);
11540color: #fff;
11541```
11542
11543**Pink Theme Tooltips**: FABULOUS!
11544```css
11545/* Pink gradient background */
11546background: linear-gradient(135deg, #ff1493 0%, #ff69b4 100%);
11547
11548/* Glowing pink border */
11549border: 2px solid #ff85c1;
11550
11551/* Double glow shadow */
11552box-shadow:
11553    0 0 15px rgba(255, 20, 147, 0.6),
11554    0 4px 12px rgba(0, 0, 0, 0.4);
11555
11556/* Bold text */
11557font-weight: 600;
11558```
11559
11560**Plus**: Sparkling heart next to tooltip!
11561```css
11562.sidebar-pink [data-tooltip]:after {
11563    content: '��';
11564    font-size: 12px;
11565    filter: drop-shadow(0 0 3px rgba(255, 20, 147, 0.8));
11566}
11567```
11568
11569**The Effect**:
11570```
11571Hover over ⚠ conflict warning:
11572┌────────────────────┐ ��
11573│ Conflicts with:    │ ← Pink gradient
11574│ • Event 1 (3PM)   │ ← Pink border
11575│ • Event 2 (4PM)   │ ← Pink glow
11576└────────────────────┘
11577```
11578
11579**Maximum glamour on tooltips too!** ✨
11580
11581## Version 4.5.1 (2026-02-07) - FIX IMPORTANT EVENTS SORTING
11582
11583### �� Important Events Order Fixed
11584- **Fixed:** Important Events now sorted by date (earliest first)
11585- **Fixed:** Events on same date sorted by time (chronological)
11586- **Fixed:** All-day events appear last within each date
11587
11588### Sorting Issue
11589
11590**Before**: Random order
11591```
11592Important Events:
11593�� Valentine's Day         (Sat, Feb 14)
1159411:30 AM Doctor visit      (Tue, Feb 10)  ← Feb 10 after Feb 14!
115953:30 PM Super Bowl         (Sun, Feb 8)   ← Feb 8 after Feb 14!
115968:00 PM Crab Shack         (Sat, Feb 14)
11597```
11598
11599**After**: Chronological order
11600```
11601Important Events:
116023:30 PM Super Bowl         (Sun, Feb 8)   ← Earliest!
1160311:30 AM Doctor visit      (Tue, Feb 10)
11604�� Valentine's Day         (Sat, Feb 14)  ← All-day event
116058:00 PM Crab Shack         (Sat, Feb 14)  ← Same day, sorted by time
11606```
11607
11608### Sorting Logic
11609
11610**Primary Sort**: By date
11611```php
11612strcmp($dateA, $dateB); // "2026-02-08" < "2026-02-14"
11613```
11614
11615**Secondary Sort**: By time (within same date)
11616```php
11617// All-day events (no time) go last
11618if (empty($timeA) && !empty($timeB)) return 1;
11619if (!empty($timeA) && empty($timeB)) return -1;
11620
11621// Both have times - sort chronologically
11622$aMinutes = timeToMinutes($timeA); // "11:30" = 690 minutes
11623$bMinutes = timeToMinutes($timeB); // "20:00" = 1200 minutes
11624return $aMinutes - $bMinutes;      // 690 < 1200
11625```
11626
11627**Result**:
116281. Sun, Feb 8 - 3:30 PM (earliest date & time)
116292. Tue, Feb 10 - 11:30 AM (next date)
116303. Sat, Feb 14 - Valentine's Day (all-day, so last on Feb 14)
116314. Sat, Feb 14 - 8:00 PM (timed event on Feb 14)
11632
11633**Perfect chronological order for next 2 weeks!** ✓
11634
11635## Version 4.5.0 (2026-02-07) - SPARKLE EDITION ✨��
11636
11637### �� EXTREME PINK BLING EFFECTS!
11638- **Added:** Click sparkles - 8 sparkles burst out on every click!
11639- **Added:** Auto-sparkles - random sparkles appear every 3 seconds
11640- **Added:** Hover mega-glow - sidebar glows BRIGHT on hover
11641- **Added:** Pulsing border glow - constantly breathing pink glow
11642- **Added:** Drop shadows on sparkles for extra depth
11643- **Added:** More sparkle emojis - hearts, diamonds, crowns, bows!
11644
11645### Sparkle Effects Breakdown
11646
11647**Click Sparkles** ��:
11648```javascript
11649// 8 sparkles burst out when you click anywhere!
11650for (let i = 0; i < 8; i++) {
11651    // Staggered appearance (40ms apart)
11652    createSparkle(x, y);
11653}
11654
11655// Sparkle emojis:
11656["✨", "��", "��", "⭐", "��", "��", "��", "��", "��", "��"]
11657```
11658
11659**Each sparkle**:
11660- Starts at click point
11661- Flies outward 30-60px in random direction
11662- Spins 360 degrees
11663- Fades in and out
11664- Has pink glow drop-shadow
11665- Disappears after 1 second
11666
11667**Auto Sparkles** ⏰:
11668```javascript
11669// Random sparkle every 3 seconds
11670setInterval(() => {
11671    const x = Math.random() * width;
11672    const y = Math.random() * height;
11673    createSparkle(x, y);
11674}, 3000);
11675```
11676
11677**Result**: Constant magical sparkles even without clicking! ✨
11678
11679**Hover Mega-Glow** ��:
11680```css
11681.sidebar-pink:hover {
11682    box-shadow:
11683        0 0 30px rgba(255, 20, 147, 0.9),
11684        0 0 50px rgba(255, 20, 147, 0.5) !important;
11685}
11686```
11687
11688**Result**: Sidebar EXPLODES with pink glow when you hover over it! ��
11689
11690**Pulsing Border Glow** ��:
11691```css
11692@keyframes pulse-glow {
11693    0%, 100% {
11694        box-shadow: 0 0 10px rgba(255, 20, 147, 0.4);
11695    }
11696    50% {
11697        box-shadow:
11698            0 0 25px rgba(255, 20, 147, 0.8),
11699            0 0 40px rgba(255, 20, 147, 0.4);
11700    }
11701}
11702
11703animation: pulse-glow 3s ease-in-out infinite;
11704```
11705
11706**Result**: Border continuously breathes with pink glow! ��
11707
11708**Sparkle Animation** ��:
11709```css
11710@keyframes sparkle {
11711    0% {
11712        opacity: 0;
11713        transform: translate(0, 0) scale(0) rotate(0deg);
11714    }
11715    50% {
11716        opacity: 1;
11717        transform: translate(halfway) scale(1) rotate(180deg);
11718    }
11719    100% {
11720        opacity: 0;
11721        transform: translate(far) scale(0) rotate(360deg);
11722    }
11723}
11724```
11725
11726**Result**: Sparkles spin, grow, shrink, and fly! ��
11727
11728### Complete Pink Bling Experience:
11729
11730**Always Active**:
11731- ✨ Pulsing pink border glow (3 second cycle)
11732- ✨ Auto-sparkles every 3 seconds
11733
11734**On Hover**:
11735- �� MEGA GLOW EFFECT (2x brightness!)
11736
11737**On Click**:
11738- �� 8 sparkles EXPLODE outward!
11739- �� Random emojis (hearts, stars, diamonds, crowns!)
11740- �� Each sparkle spins 360° while flying
11741- �� Pink glow drop-shadow on each sparkle
11742
11743**The Result**:
11744- Click anywhere = SPARKLE EXPLOSION! ��
11745- Hover anywhere = MEGA GLOW! ✨
11746- Always breathing and sparkling! ��
11747- Maximum glamour! ��
11748- Wife approval: 1000%! ��
11749
11750**THIS IS THE MOST FABULOUS CALENDAR EVER!** ��✨��
11751
11752## Version 4.4.2 (2026-02-07) - FINAL PINK POLISH
11753
11754### �� Pink Theme Final Touches
11755- **Fixed:** Add Event text now black (was bright pink, hard to read)
11756- **Fixed:** Clock border now COMPLETELY pink on all sides (no more green!)
11757- **Removed:** Text shadow on Add Event button (cleaner with black text)
11758
11759### Add Event Text - Black & Readable!
11760
11761**Before**: Bright pink text (#ff1493) on dark pink background
11762```php
11763$addBtnTextColor = $themeStyles['text_bright']; // #ff1493 - hard to read!
11764text-shadow: 0 0 3px #ff1493; // Glowy pink
11765```
11766
11767**After**: Black text, no shadow, perfect contrast!
11768```php
11769$addBtnTextColor = $theme === 'pink' ? '#000000' : ...;
11770$addBtnTextShadow = $theme === 'pink' ? 'none' : ...;
11771```
11772
11773**Result**:
11774- Black text pops against dark pink background ✓
11775- Easy to read ✓
11776- Professional look with bling ✓
11777
11778### Clock Border - All Pink!
11779
11780**The Problem**: Inline style only set `border-bottom`, CSS set other sides to green
11781
11782**Before**:
11783```php
11784// Inline style (only bottom):
11785style="border-bottom:2px solid #ff1493;"
11786
11787// CSS (all sides):
11788.eventlist-today-header {
11789    border: 2px solid #00cc07; // Green on top/sides!
11790}
11791```
11792
11793**After**: Inline style overrides ALL sides
11794```php
11795style="border:2px solid #ff1493;" // All 4 sides pink!
11796```
11797
11798**Result**: Clock box now 100% pink border on all four sides! ✓
11799
11800### What Changed:
11801
11802**Add Event Button**:
11803- Background: #b8156f (dark pink) ✓
11804- Text: **#000000 (black)** ← NEW!
11805- Text shadow: **none** ← NEW!
11806- Glow: 0 0 10px pink ✓
11807
11808**Clock Border**:
11809- Top: **#ff1493 (pink)** ← FIXED!
11810- Right: **#ff1493 (pink)** ← FIXED!
11811- Bottom: #ff1493 (pink) ✓
11812- Left: **#ff1493 (pink)** ← FIXED!
11813
11814**Perfect pink theme - wife approved!** ��✨
11815
11816## Version 4.4.1 (2026-02-07) - PINK THEME PERFECTION
11817
11818### �� Pink Theme Complete Makeover
11819- **Fixed:** Clock border now completely pink (was green on sides/top)
11820- **Changed:** Today/Tomorrow/Important sections now different shades of pink
11821- **Changed:** Add Event button now dark pink (was clashing blue)
11822- **Changed:** System status bars now pink gradient (3 shades!)
11823
11824### All-Pink Everything! ��
11825
11826**Clock Border**:
11827```css
11828/* Before: Green border */
11829border: 2px solid #00cc07;
11830
11831/* After: Hot pink border */
11832.sidebar-pink .eventlist-today-header {
11833    border-color: #ff1493;
11834    box-shadow: 0 0 10px rgba(255, 20, 147, 0.4);
11835}
11836```
11837
11838**Section Colors** (Different Pink Shades):
11839```php
11840// Before: Orange, green, purple
11841'Today' => '#ff9800',
11842'Tomorrow' => '#4caf50',
11843'Important' => '#9b59b6'
11844
11845// After: Hot pink, pink, light pink
11846'Today' => '#ff1493',      // Hot pink (DeepPink)
11847'Tomorrow' => '#ff69b4',   // Pink (HotPink)
11848'Important' => '#ff85c1'   // Light pink
11849```
11850
11851**Add Event Button**:
11852```php
11853// Before: Clashing blue
11854background: #3498db;
11855
11856// After: Dark pink with glow
11857background: #b8156f;       // Dark pink
11858hover: #8b0f54;            // Darker pink
11859shadow: 0 0 10px rgba(255, 20, 147, 0.5);
11860```
11861
11862**System Status Bars** (Pink Gradient):
11863```css
11864/* 5-min load average */
11865.sidebar-pink .eventlist-cpu-fill {
11866    background: #ff1493;   /* Hot pink */
11867    box-shadow: 0 0 5px rgba(255, 20, 147, 0.7);
11868}
11869
11870/* Realtime CPU */
11871.sidebar-pink .eventlist-cpu-fill-purple {
11872    background: #ff69b4;   /* Pink */
11873    box-shadow: 0 0 5px rgba(255, 105, 180, 0.7);
11874}
11875
11876/* Memory */
11877.sidebar-pink .eventlist-cpu-fill-orange {
11878    background: #ff85c1;   /* Light pink */
11879    box-shadow: 0 0 5px rgba(255, 133, 193, 0.7);
11880}
11881```
11882
11883### Pink Theme Visual Hierarchy:
11884
11885**Darkest → Lightest Pink Shades**:
118861. Add Event button: #b8156f (dark pink)
118872. Today section: #ff1493 (hot pink / deep pink)
118883. System bar 1: #ff1493 (hot pink)
118894. Tomorrow section: #ff69b4 (pink)
118905. System bar 2: #ff69b4 (pink)
118916. Important section: #ff85c1 (light pink)
118927. System bar 3: #ff85c1 (light pink)
11893
11894**Result**: Beautiful pink gradient throughout entire sidebar! ��✨
11895
11896### What's Pink Now:
11897
11898✅ Sidebar background & border
11899✅ **Clock border** ← FIXED!
11900✅ Header gradient
11901✅ Week grid
11902✅ **Add Event button** ← FIXED!
11903✅ **Today section** ← Different shade!
11904✅ **Tomorrow section** ← Different shade!
11905✅ **Important section** ← Different shade!
11906✅ Event text & bars
11907✅ **System status bars** ← All 3 different pink shades!
11908✅ All shadows & glows
11909
11910**EVERYTHING is pink and fabulous!** ��✨
11911
11912## Version 4.4.0 (2026-02-07) - PINK BLING THEME & PROFESSIONAL SHADOWS
11913
11914### ✨ New Theme: Pink Bling! ��
11915- **Added:** Glamorous hot pink theme with maximum sparkle
11916- **Features:** Deep pink (#ff1493), extra glow, hearts and diamonds aesthetic
11917- **Perfect for:** Fabulous calendars that demand attention ✨
11918
11919### �� Professional Theme Shadow Fix
11920- **Fixed:** Section headers now have subtle shadow (not glow)
11921- **Fixed:** Clicked day panel header has proper shadow
11922
11923### Pink Bling Theme Colors
11924
11925**Background & Borders**:
11926```php
11927'bg' => '#1a0d14',           // Dark rich pink-black
11928'border' => '#ff1493',        // Hot pink (DeepPink)
11929'shadow' => 'rgba(255, 20, 147, 0.4)', // Strong pink glow
11930```
11931
11932**Text Colors**:
11933```php
11934'text_primary' => '#ff69b4',  // Hot pink
11935'text_bright' => '#ff1493',   // Deep pink
11936'text_dim' => '#ff85c1',      // Light pink
11937```
11938
11939**Week Grid**:
11940```php
11941'grid_bg' => '#2d1a24',       // Dark purple-pink
11942'cell_bg' => '#1a0d14',       // Dark
11943'cell_today_bg' => '#3d2030', // Highlighted purple-pink
11944```
11945
11946**Special Effects**:
11947```php
11948'bar_glow' => '0 0 5px',      // Extra sparkly glow!
11949'header_shadow' => '0 0 12px rgba(255, 20, 147, 0.6)' // Maximum bling!
11950```
11951
11952### Professional Theme Shadow Fix
11953
11954**Before**: Section headers had colored glow
11955```php
11956box-shadow: 0 0 8px #3498db; // Blue glow - wrong!
11957```
11958
11959**After**: Section headers have subtle shadow
11960```php
11961$headerShadow = ($theme === 'professional') ?
11962    '0 2px 4px rgba(0, 0, 0, 0.15)' :  // Shadow for professional
11963    '0 0 8px ' . $accentColor;          // Glow for others
11964```
11965
11966**Result**:
11967- **Matrix/Purple/Pink**: Colored glow on headers ✓
11968- **Professional**: Clean grey shadow (no glow) ✓
11969
11970### All Four Themes:
11971
11972**�� Matrix Edition**:
11973- Dark green (#00cc07)
11974- Neon glow effects
11975- Hacker aesthetic
11976
11977**�� Purple Dream**:
11978- Elegant purple (#9b59b6)
11979- Violet glow effects
11980- Royal aesthetic
11981
11982**�� Professional Blue**:
11983- Clean grey/blue (#4a90e2)
11984- Subtle shadows (NO glow)
11985- Corporate aesthetic
11986
11987**�� Pink Bling** (NEW!):
11988- Hot pink (#ff1493)
11989- MAXIMUM sparkle & glow
11990- Glamorous aesthetic ✨��
11991
11992### Technical Implementation
11993
11994**Theme Added To**:
11995- `getSidebarThemeStyles()` - color definitions
11996- `getSidebarTheme()` - validation
11997- `saveSidebarTheme()` - admin save
11998- Admin panel - UI with preview
11999- All shadow/glow calculations
12000- JavaScript theme colors
12001- Clicked day panel colors
12002
12003**Perfect for users who want FABULOUS pink calendars!** ��✨
12004
12005## Version 4.3.1 (2026-02-07) - REDUCE TEXT GLOW & CONSISTENCY
12006
12007### �� Text Glow Refinement
12008- **Changed:** Reduced text glow from 3px to 2px (less intense)
12009- **Fixed:** Clicked day panel now has same text glow as sections
12010
12011### Text Glow Reduction
12012
12013**Before**: Text glow was too strong (3px)
12014```php
12015// Sections:
12016text-shadow: 0 0 3px #00cc07; // Too bright!
12017
12018// Clicked day panel:
12019text-shadow: 0 0 3px #00cc07; // Too bright!
12020```
12021
12022**After**: Subtler text glow (2px)
12023```php
12024// Sections:
12025text-shadow: 0 0 2px #00cc07; // Just right ✓
12026
12027// Clicked day panel:
12028text-shadow: 0 0 2px #00cc07; // Just right ✓
12029```
12030
12031**Visual Impact**:
12032- **Matrix**: Softer green glow, easier to read
12033- **Purple**: Softer purple glow, more elegant
12034- **Professional**: Still no glow (clean)
12035
12036### Consistency Fix
12037
12038**Before**: Sections had glow, clicked day panel had NO glow
12039
12040**After**: Both sections AND clicked day panel have matching subtle glow
12041
12042**Where Glow Appears**:
12043- ✅ Today section event text
12044- ✅ Tomorrow section event text
12045- ✅ Important section event text
12046- ✅ **Clicked day panel event text** ← NOW CONSISTENT!
12047
12048**Result**:
12049- Glow is less intense and easier on eyes ✓
12050- All event text has consistent styling ✓
12051- Matrix/Purple themes more refined ✓
12052
12053### Technical Details
12054
12055**PHP (Sections)**:
12056```php
12057$textShadow = ($theme === 'professional') ? '' : 'text-shadow:0 0 2px ' . $titleColor . ';';
12058```
12059
12060**JavaScript (Clicked Day Panel)**:
12061```javascript
12062themeColors.text_shadow = 'text-shadow:0 0 2px #00cc07'; // Or purple
12063eventHTML += "style='...color:" + color + "; " + themeColors.text_shadow + ";'";
12064```
12065
12066**Perfect consistency and subtle elegance!** ✨
12067
12068## Version 4.3.0 (2026-02-07) - IMPORTANT EVENTS FUTURE + REMOVE GREY
12069
12070### ✨ Important Events Enhancement
12071- **Changed:** Important events now show from next 2 weeks (not just current week)
12072- **Fixed:** Important events on Sunday after current week now visible
12073- **Changed:** Events loaded 2 weeks into future for Important section
12074
12075### �� Background Cleanup
12076- **Removed:** Grey/white backgrounds from Today/Tomorrow/Important sections
12077- **Removed:** Grey backgrounds from individual events
12078- **Result:** Clean transparent backgrounds, original dark Matrix look restored
12079
12080### Important Events - Future Coverage
12081
12082**Before**: Only showed Important events from current week
12083```php
12084if ($isImportant && $dateKey >= $weekStart && $dateKey <= $weekEnd) {
12085    $importantEvents[] = $event;
12086}
12087```
12088
12089**After**: Shows Important events from today through next 2 weeks
12090```php
12091// Load events 2 weeks out
12092$twoWeeksOut = date('Y-m-d', strtotime($weekEnd . ' +14 days'));
12093
12094// Show all important events from today forward
12095if ($isImportant && $dateKey >= $todayStr) {
12096    $importantEvents[] = $event;
12097}
12098```
12099
12100**Example**:
12101- Today: Saturday Feb 7
12102- Current week: Sun Feb 1 → Sat Feb 7
12103- Important events shown: Feb 7 → Feb 21 (today + 14 days)
12104
12105**Result**: Important events on Sunday Feb 8 (next week) now visible! ✓
12106
12107### Background Removal
12108
12109**Before**: Light grey/white backgrounds added
12110```php
12111// Section background:
12112$sectionBg = 'rgba(255, 255, 255, 0.05)'; // Grey overlay
12113
12114// Event background:
12115$eventBg = 'rgba(255, 255, 255, 0.03)'; // Grey overlay
12116```
12117
12118**After**: No backgrounds (transparent)
12119```php
12120// Section: No background property
12121<div style="padding:4px 0;">
12122
12123// Event: No background property
12124<div style="padding:4px 6px; ...">
12125```
12126
12127**Result**:
12128- Clean, dark Matrix aesthetic restored ✓
12129- Purple theme darker and more elegant ✓
12130- Professional theme still has its light grey sidebar bg ✓
12131- Events stand out with just color bars and borders ✓
12132
12133### What Changed:
12134
12135**Sections (Today/Tomorrow/Important)**:
12136- ❌ No more grey overlay
12137- ✓ Transparent background
12138- ✓ Colored borders & glows remain
12139
12140**Individual Events**:
12141- ❌ No more grey overlay
12142- ✓ Transparent background
12143- ✓ Colored bars & borders remain
12144
12145**Perfect! Back to the original clean dark look with future Important events!** ��
12146
12147## Version 4.2.6 (2026-02-07) - FIX SECTION SHADOWS & DESCRIPTION COLOR
12148
12149### �� Final Theme Polish
12150- **Fixed:** Today/Tomorrow/Important section shadows now match theme
12151- **Fixed:** Event description text color now uses theme dim color
12152
12153### Section Shadow Fix
12154
12155**Problem**: Sections always had green glow regardless of theme
12156
12157**Before**:
12158```php
12159// Hardcoded green:
12160box-shadow: 0 0 5px rgba(0, 204, 7, 0.2);
12161```
12162
12163**After**:
12164```php
12165// Theme-aware:
12166$sectionShadow = $theme === 'matrix' ? '0 0 5px rgba(0, 204, 7, 0.2)' :
12167                ($theme === 'purple' ? '0 0 5px rgba(155, 89, 182, 0.2)' :
12168                '0 2px 4px rgba(0, 0, 0, 0.1)');
12169```
12170
12171**Result**:
12172- **Matrix**: Green glow around sections ✓
12173- **Purple**: Purple glow around sections ✓
12174- **Professional**: Subtle grey shadow (no glow) ✓
12175
12176### Description Color Fix
12177
12178**Problem**: Description text always green in clicked day panel
12179
12180**Before**:
12181```javascript
12182color: #00aa00; // Always green
12183```
12184
12185**After**:
12186```javascript
12187color: themeColors.text_dim; // Theme dim color
12188```
12189
12190**Result**:
12191- **Matrix**: Dim green (#00aa00) ✓
12192- **Purple**: Dim purple (#8e7ab8) ✓
12193- **Professional**: Grey (#7f8c8d) ✓
12194
12195### Now 100% Theme Consistent
12196
12197Every single visual element respects theme:
12198- ✅ Sidebar background & border
12199- ✅ Header colors & shadows
12200- ✅ Week grid & cells
12201- ✅ Add Event button
12202- ✅ Section borders & **shadows** ← Fixed!
12203- ✅ Event titles & times
12204- ✅ Event **descriptions** ← Fixed!
12205- ✅ Clicked day panel
12206- ✅ Event bars & glows
12207
12208**Absolute perfection across all three themes!** ��✨
12209
12210## Version 4.2.5 (2026-02-07) - CLICKED DAY PANEL THEMES & GREY BACKGROUND
12211
12212### �� Theme Improvements
12213- **Fixed:** Clicked day panel now uses correct theme colors
12214- **Changed:** Professional Blue background now light grey (not white)
12215- **Added:** Theme colors passed to JavaScript for dynamic rendering
12216
12217### Clicked Day Panel Theming
12218
12219**Before**: Always blue regardless of theme
12220```javascript
12221// Hardcoded blue:
12222color:#00cc07;  // Always green
12223background:#3498db;  // Always blue
12224```
12225
12226**After**: Theme-aware colors
12227```php
12228// PHP passes theme to JavaScript:
12229window.themeColors_XXX = {
12230    text_primary: '#00cc07' or '#b19cd9' or '#2c3e50',
12231    text_bright: '#00dd00' or '#d4a5ff' or '#4a90e2',
12232    text_shadow: '0 0 3px ...' or '',
12233    event_bg: 'rgba(...)',
12234    border_color: 'rgba(...)',
12235    bar_shadow: '0 0 3px' or '0 1px 2px rgba(...)'
12236};
12237
12238// JavaScript uses theme colors:
12239color: themeColors.text_primary;
12240background: themeColors.event_bg;
12241```
12242
12243**Result**:
12244- Matrix: Green panel with green glow ✓
12245- Purple: Purple panel with purple glow ✓
12246- Professional: Blue panel, no glow, clean ✓
12247
12248### Professional Theme Background Change
12249
12250**Before**: Almost white (#f5f7fa, #ffffff)
12251```php
12252'bg' => '#f5f7fa',           // Very light
12253'cell_bg' => '#ffffff',      // Pure white
12254```
12255
12256**After**: Light grey tones
12257```php
12258'bg' => '#e8ecf1',           // Soft grey-blue
12259'cell_bg' => '#f5f7fa',      // Light grey
12260'grid_bg' => '#d5dbe3',      // Medium grey
12261'cell_today_bg' => '#dce8f7' // Highlighted grey-blue
12262```
12263
12264**Visual Impact**:
12265- Sidebar: Light grey-blue background (#e8ecf1)
12266- Week cells: Lighter grey (#f5f7fa)
12267- Today cell: Highlighted blue-grey (#dce8f7)
12268- More depth and contrast ✓
12269- Professional appearance ✓
12270
12271### All Theme Elements Now Consistent
12272
12273**Matrix (Green)**:
12274- Sidebar: Dark (#242424)
12275- Clicked panel: Dark with green
12276- Text: Green with glow
12277
12278**Purple Dream**:
12279- Sidebar: Dark purple (#2a2030)
12280- Clicked panel: Dark with purple
12281- Text: Purple with glow
12282
12283**Professional Blue**:
12284- Sidebar: Light grey (#e8ecf1)
12285- Clicked panel: Light with blue
12286- Text: Dark grey, no glow
12287
12288**Perfect theme consistency everywhere!** ��
12289
12290## Version 4.2.4 (2026-02-07) - FIX TOMORROW LOADING & DOUBLE ENCODING
12291
12292### �� Critical Fixes
12293- **Fixed:** Tomorrow events not loaded when outside current week
12294- **Fixed:** `&amp;` showing instead of `&` (double HTML encoding)
12295
12296### Issue 1: Tomorrow Not Loading
12297
12298**Problem**: Sidebar only loaded events for current week
12299- Today (Saturday): Week ends today
12300- Tomorrow (Sunday): Start of NEXT week
12301- Tomorrow events never loaded from data files!
12302
12303**Before**:
12304```php
12305// Only load current week
12306$end = new DateTime($weekEnd);
12307$end->modify('+1 day');
12308$period = new DatePeriod($start, $interval, $end);
12309// If tomorrow > weekEnd, it's not in period!
12310```
12311
12312**After**:
12313```php
12314// Check if tomorrow is outside week
12315$tomorrowDate = date('Y-m-d', strtotime('+1 day'));
12316if ($tomorrowDate > $weekEnd) {
12317    // Extend to include tomorrow
12318    $end = new DateTime($tomorrowDate);
12319}
12320$end->modify('+1 day');
12321$period = new DatePeriod($start, $interval, $end);
12322```
12323
12324**Result**: Tomorrow events now loaded even at week boundary! ✓
12325
12326### Issue 2: Double HTML Encoding
12327
12328**Problem**: `&` characters showing as `&amp;`
12329
12330**Cause**: Double encoding on line 2625 and 2681
12331```php
12332// Line 2625:
12333$title = htmlspecialchars($event['title']); // "Coffee & Tea" → "Coffee &amp; Tea"
12334
12335// Line 2681:
12336$html .= htmlspecialchars($title); // "Coffee &amp; Tea" → "Coffee &amp;amp; Tea" ❌
12337```
12338
12339**Fixed**:
12340```php
12341// Line 2625:
12342$title = htmlspecialchars($event['title']); // Encode once
12343
12344// Line 2681:
12345$html .= $title; // Use already-encoded value ✓
12346```
12347
12348**Result**: `&` displays correctly! ✓
12349
12350### Both Fixes Critical
12351
12352These were **two separate bugs**:
123531. **Loading bug**: Tomorrow events not read from files
123542. **Display bug**: Double-encoding text
12355
12356Both needed fixing for Tomorrow section to work properly!
12357
12358## Version 4.2.3 (2026-02-07) - FIX TOMORROW SECTION AT WEEK BOUNDARY
12359
12360### �� Critical Fix
12361- **Fixed:** Tomorrow section missing when tomorrow is outside current week
12362- **Fixed:** Today section now always shows regardless of week boundaries
12363- **Changed:** Today/Tomorrow processed BEFORE week boundary checks
12364
12365### The Problem
12366
12367**Scenario**: Today is Saturday (last day of week)
12368- Week: Feb 1 (Sun) → Feb 7 (Sat) ← Today
12369- Tomorrow: Feb 8 (Sun) ← **Start of NEXT week**
12370
12371**BROKEN Logic** (v4.2.2):
12372```php
12373foreach ($events as $dateKey => $dayEvents) {
12374    if ($dateKey < $weekStart) continue; // Skip old events
12375
12376    // ...week processing...
12377
12378    if ($dateKey === $tomorrowStr) {  // ← Never reached!
12379        $tomorrowEvents[] = $event;   //   Tomorrow > weekEnd
12380    }
12381}
12382```
12383
12384**Result**: Tomorrow events never added because loop skipped them! ❌
12385
12386### The Fix
12387
12388**Process Today/Tomorrow FIRST**:
12389```php
12390foreach ($events as $dateKey => $dayEvents) {
12391    $eventsWithConflicts = $this->detectTimeConflicts($dayEvents);
12392
12393    foreach ($eventsWithConflicts as $event) {
12394        // ALWAYS process Today and Tomorrow first!
12395        if ($dateKey === $todayStr) {
12396            $todayEvents[] = $event; // ✓ Always shows
12397        }
12398        if ($dateKey === $tomorrowStr) {
12399            $tomorrowEvents[] = $event; // ✓ Always shows
12400        }
12401
12402        // THEN check week boundaries for grid
12403        if ($dateKey >= $weekStart && $dateKey <= $weekEnd) {
12404            $weekEvents[$dateKey][] = $event;
12405        }
12406
12407        // Important events still week-only
12408        if ($isImportant && $dateKey >= $weekStart && $dateKey <= $weekEnd) {
12409            $importantEvents[] = $event;
12410        }
12411    }
12412}
12413```
12414
12415### What Changed
12416
12417**Before**:
124181. Skip events < weekStart ❌
124192. Process week grid
124203. Try to add Today/Tomorrow ← **Failed if outside week**
124214. Add Important events
12422
12423**After**:
124241. **Always add Today events** ✓
124252. **Always add Tomorrow events** ✓
124263. Add to week grid if in range
124274. Add Important events if in range
12428
12429**Result**:
12430- Today section: ✓ Always shows
12431- Tomorrow section: ✓ Always shows (even at week boundary!)
12432- Week grid: ✓ Only current week
12433- Important: ✓ Only current week
12434
12435### Edge Cases Fixed
12436
12437**Saturday → Sunday transition**:
12438- Today (Sat): Shows in Today section ✓
12439- Tomorrow (Sun): Shows in Tomorrow section ✓
12440- Week grid: Only shows Sat (today) ✓
12441
12442**Sunday → Monday transition**:
12443- Today (Sun): Shows in Today section ✓
12444- Tomorrow (Mon): Shows in Tomorrow section ✓
12445- Week grid: Shows both Sun and Mon ✓
12446
12447**Perfect! Tomorrow section now always works!** ��
12448
12449## Version 4.2.2 (2026-02-07) - SUNDAY NOT SATURDAY!
12450
12451### �� Corrected Week Options
12452- **Changed:** Week start options are now Monday vs **Sunday** (not Saturday!)
12453- **Changed:** Default is **Sunday** (US/Canada standard)
12454- **Fixed:** Day names array for Sunday start: S M T W T F S
12455
12456### �� Correct Week Start Options
12457
12458**Sunday Start** (Default):
12459- Grid shows: **S M T W T F S**
12460- Week: Sunday → Saturday
12461- US/Canada standard
12462- Most common worldwide
12463
12464**Monday Start**:
12465- Grid shows: **M T W T F S S**
12466- Week: Monday → Sunday
12467- ISO 8601 standard
12468- Common in Europe
12469
12470### Technical Changes
12471
12472**All References Updated**:
12473```php
12474// Changed from 'saturday' to 'sunday' in:
12475- Admin validation
12476- Week calculation logic
12477- Day names array
12478- Default value
12479- Comments
12480```
12481
12482**Sunday Calculation** (when today is Saturday):
12483```php
12484$today = date('w'); // 0=Sun, 6=Sat
12485if ($today == 0) {
12486    $weekStart = date('Y-m-d'); // Today!
12487} else {
12488    // Go back $today days to last Sunday
12489    $weekStart = date('Y-m-d', strtotime('-' . $today . ' days'));
12490}
12491```
12492
12493**Examples**:
12494- Today (Saturday): Week = Sun Feb 1 → Sat Feb 7
12495- Tomorrow (Sunday): Week = Sun Feb 8 → Sat Feb 14
12496
12497**Sorry for the confusion - it's Sunday not Saturday!** ��
12498
12499## Version 4.2.1 (2026-02-07) - FIX WEEK CALCULATION ON SATURDAY
12500
12501### �� Critical Fix
12502- **Fixed:** Week calculation broken when today is Saturday
12503- **Fixed:** Events not showing in Today/Important sections
12504- **Fixed:** Week grid event bars missing
12505- **Changed:** Default week start is Saturday (matches main calendar)
12506
12507### Technical Details
12508
12509**The Bug**:
12510```php
12511// BROKEN (v4.2.0):
12512$weekStart = date('Y-m-d', strtotime('saturday this week'));
12513// When TODAY is Saturday, this is ambiguous and fails!
12514
12515// FIXED (v4.2.1):
12516$today = date('w'); // 0 (Sun) to 6 (Sat)
12517if ($today == 6) {
12518    $weekStart = date('Y-m-d'); // Today!
12519} else {
12520    $daysBack = ($today == 0) ? 1 : ($today + 1);
12521    $weekStart = date('Y-m-d', strtotime('-' . $daysBack . ' days'));
12522}
12523$weekEnd = date('Y-m-d', strtotime($weekStart . ' +6 days'));
12524```
12525
12526**Why It Failed**:
12527- `strtotime('saturday this week')` is ambiguous when run ON a Saturday
12528- PHP may interpret it as "next Saturday" or fail
12529- Result: Week range was wrong, events filtered out
12530
12531**The Fix**:
12532- Explicit calculation using day-of-week math
12533- Saturday (day 6): weekStart = today
12534- Sunday (day 0): weekStart = yesterday
12535- Monday-Friday: calculate days back to last Saturday
12536
12537**Result**: Works reliably every day of the week!
12538
12539**Default Changed**: Saturday start (was Monday in 4.2.0)
12540- Matches main calendar behavior
12541- Users can still switch to Monday in settings
12542
12543## Version 4.2.0 (2026-02-07) - WEEK START DAY SELECTOR
12544
12545### ✨ New Feature
12546- **Added:** Week start day selector in Themes tab
12547- **Added:** Choose between Monday (ISO standard) or Saturday week start
12548- **Added:** Week grid and all events now respect the selected start day
12549- **Changed:** Themes tab renamed to "Sidebar Widget Settings"
12550
12551### �� Week Start Options
12552
12553**Monday Start** (Default):
12554- Grid shows: M T W T F S S
12555- Week runs: Monday → Sunday
12556- ISO 8601 standard
12557- Common in Europe, most of world
12558
12559**Saturday Start**:
12560- Grid shows: S S M T W T F
12561- Week runs: Saturday → Friday
12562- Common in Middle East
12563- Sabbath-observant communities
12564
12565### Technical Details
12566
12567**Configuration**:
12568```php
12569// Saved in: data/meta/calendar_week_start.txt
12570// Values: 'monday' or 'saturday'
12571
12572// Week calculation:
12573if ($weekStartDay === 'saturday') {
12574    $weekStart = date('Y-m-d', strtotime('saturday this week'));
12575    $weekEnd = date('Y-m-d', strtotime('friday next week'));
12576} else {
12577    $weekStart = date('Y-m-d', strtotime('monday this week'));
12578    $weekEnd = date('Y-m-d', strtotime('sunday this week'));
12579}
12580```
12581
12582**Day Names Array**:
12583```php
12584// Monday start: ['M', 'T', 'W', 'T', 'F', 'S', 'S']
12585// Saturday start: ['S', 'S', 'M', 'T', 'W', 'T', 'F']
12586```
12587
12588**What Changes**:
12589- Week grid day letters
12590- Week grid date sequence
12591- Today/Tomorrow/Important event date ranges
12592- Week event grouping
12593
12594**What Stays Same**:
12595- All themes still work
12596- Event data unchanged
12597- Main calendar unaffected
12598
12599### How to Change:
12600
126011. Admin → Calendar → �� Themes tab
126022. Under "Week Start Day" section
126033. Select Monday or Saturday
126044. Click "Save Settings"
126055. Refresh sidebar to see changes
12606
12607**Perfect for international users or religious observances!** ��
12608
12609## Version 4.1.4 (2026-02-07) - WEEK STARTS SUNDAY & LIGHTER BACKGROUNDS
12610
12611### ��️ Calendar Improvements
12612- **Changed:** Week grid now starts on Sunday and ends on Saturday (matches main calendar)
12613- **Changed:** Event section backgrounds much lighter (almost white)
12614- **Changed:** Individual event backgrounds lighter and more readable
12615- **Changed:** Event borders now theme-colored
12616
12617### Technical Details
12618
12619**Week Start Change**:
12620```php
12621// Before:
12622$weekStart = date('Y-m-d', strtotime('monday this week'));
12623$weekEnd = date('Y-m-d', strtotime('sunday this week'));
12624$dayNames = ['M', 'T', 'W', 'T', 'F', 'S', 'S'];
12625
12626// After:
12627$weekStart = date('Y-m-d', strtotime('sunday this week'));
12628$weekEnd = date('Y-m-d', strtotime('saturday this week'));
12629$dayNames = ['S', 'M', 'T', 'W', 'T', 'F', 'S'];
12630```
12631
12632**Background Colors**:
12633```php
12634// Section backgrounds (Today, Tomorrow, Important):
12635Matrix: rgba(255, 255, 255, 0.05)    // Very light overlay
12636Purple: rgba(255, 255, 255, 0.08)    // Slightly lighter
12637Professional: rgba(255, 255, 255, 0.95)  // Almost white!
12638
12639// Individual event backgrounds:
12640Matrix: rgba(255, 255, 255, 0.03)    // Subtle
12641Purple: rgba(255, 255, 255, 0.05)    // Light
12642Professional: rgba(255, 255, 255, 0.5)   // Semi-transparent white
12643```
12644
12645**Event Borders**:
12646```php
12647Matrix: rgba(0, 204, 7, 0.2)         // Green
12648Purple: rgba(155, 89, 182, 0.2)      // Purple
12649Professional: rgba(74, 144, 226, 0.2) // Blue
12650```
12651
12652### Visual Result:
12653
12654**Before**: Dark backgrounds made text hard to read
12655**After**: Light backgrounds make events pop and text very readable
12656
12657**Week Grid**:
12658```
12659Before: [M][T][W][T][F][S][S]
12660After:  [S][M][T][W][T][F][S]  ← Now matches main calendar!
12661```
12662
12663## Version 4.1.3 (2026-02-07) - EVENT TEXT THEME COLORS
12664
12665### �� Final Theme Polish
12666- **Fixed:** Event titles in Today/Tomorrow/Important sections now use theme colors
12667- **Fixed:** Event times now use theme bright color
12668- **Fixed:** Event dates use theme dim color
12669- **Fixed:** Task checkboxes use theme bright color
12670- **Fixed:** Event color bars use theme-appropriate shadows
12671- **Fixed:** No text shadows on Professional theme
12672
12673### Technical Details
12674
12675**Event Text Colors**:
12676```php
12677// Matrix:
12678- Title: #00cc07 (green)
12679- Time: #00dd00 (bright green)
12680- Date: #00aa00 (dim green)
12681- Text shadow: 0 0 3px (glow)
12682
12683// Purple:
12684- Title: #b19cd9 (lavender)
12685- Time: #d4a5ff (bright purple)
12686- Date: #8e7ab8 (dim purple)
12687- Text shadow: 0 0 3px (glow)
12688
12689// Professional:
12690- Title: #2c3e50 (dark grey)
12691- Time: #4a90e2 (blue)
12692- Date: #7f8c8d (grey)
12693- Text shadow: none (clean)
12694```
12695
12696**Color Bar Shadows**:
12697```php
12698// Matrix & Purple: Glow effect
12699box-shadow: 0 0 3px [event-color];
12700
12701// Professional: Subtle shadow
12702box-shadow: 0 1px 2px rgba(0,0,0,0.2);
12703```
12704
12705### What's Now Fully Themed:
12706
12707✅ Sidebar background & border
12708✅ Header (clock box) background, border, text
12709✅ Week grid background, borders, cells
12710✅ Week grid day letters & numbers
12711✅ Week grid event bars & "+N more" text
12712✅ Add Event button background & text
12713Today/Tomorrow/Important event titles
12714✅ Event times
12715✅ Event dates (Important section)
12716✅ Task checkboxes
12717✅ Event color bars
12718✅ All text shadows (glow vs none)
12719
12720**Every single element now respects the theme!** ��
12721
12722## Version 4.1.2 (2026-02-07) - COMPLETE THEME INTEGRATION
12723
12724### �� Theme Improvements
12725- **Fixed:** Week calendar grid now uses theme colors (purple/blue)
12726- **Fixed:** Add Event button now uses theme colors
12727- **Fixed:** Clock box border now matches theme
12728- **Fixed:** All text shadows respect theme (no glow on professional)
12729- **Fixed:** Event bars use theme-appropriate shadows
12730
12731### Technical Details
12732
12733**Week Grid Theming**:
12734```php
12735// Matrix: Dark green (#1a3d1a) background, green (#00cc07) borders
12736// Purple: Dark purple (#3d2b4d) background, purple (#9b59b6) borders
12737// Professional: Light grey (#e8ecf1) background, blue (#4a90e2) borders
12738```
12739
12740**Add Event Button**:
12741```php
12742// Matrix: Dark green (#006400) with bright green text
12743// Purple: Purple (#7d3c98) with lavender text
12744// Professional: Blue (#3498db) with white text
12745```
12746
12747**Text Shadows**:
12748```php
12749// Matrix & Purple: Glow effects (text-shadow: 0 0 6px color)
12750// Professional: No glow (clean look)
12751```
12752
12753**CSS Overrides**:
12754```css
12755/* Purple theme */
12756.sidebar-purple .eventlist-today-header {
12757    border-color: #9b59b6;
12758    box-shadow: 0 0 8px rgba(155, 89, 182, 0.2);
12759}
12760
12761/* Professional theme */
12762.sidebar-professional .eventlist-today-header {
12763    border-color: #4a90e2;
12764    box-shadow: 0 2px 4px rgba(0, 0, 0, 0.1);
12765}
12766```
12767
12768### What Changed Per Theme:
12769
12770**Purple Dream**:
12771- Week grid: Purple borders and dark purple background
12772- Add Event: Purple button with lavender text
12773- Clock box: Purple border with purple glow
12774- Event bars: Purple glow instead of green
12775- All text: Purple/lavender shades
12776
12777**Professional Blue**:
12778- Week grid: Blue borders and light grey background
12779- Add Event: Blue button with white text
12780- Clock box: Blue border with subtle shadow (no glow)
12781- Event bars: Subtle shadows (no glow)
12782- All text: Dark grey and blue shades
12783
12784**Matrix Edition**: Unchanged (still perfect green theme!)
12785
12786## Version 4.1.1 (2026-02-07) - THEMES TAB & TOOLTIP LEFT POSITIONING
12787
12788### ✨ New Features
12789- **Added:** �� Themes tab in admin for sidebar widget theming
12790- **Added:** Three visual themes: Matrix (green), Purple Dream (purple), Professional Blue (blue/grey)
12791- **Added:** Theme selector with live previews
12792- **Added:** Theme persistence across page loads
12793
12794### �� Available Themes
12795
12796**Matrix Edition** (Default):
12797- Dark background (#242424)
12798- Green accents (#00cc07)
12799- Neon glow effects
12800- Original Matrix styling
12801
12802**Purple Dream**:
12803- Dark purple background (#2a2030)
12804- Purple/violet accents (#9b59b6)
12805- Elegant purple glow
12806- Rich purple color scheme
12807
12808**Professional Blue**:
12809- Light grey background (#f5f7fa)
12810- Blue accents (#4a90e2)
12811- Clean professional look
12812- Subtle shadows instead of glow
12813
12814### �� Bug Fix
12815- **Fixed:** Tooltips now go UP and to the LEFT (was going right)
12816- **Changed:** Tooltip offset from `rect.right` to `rect.left - 150px`
12817
12818### Technical Details
12819
12820**Theme System**:
12821```php
12822// Saved in: data/meta/calendar_theme.txt
12823// Applied dynamically in syntax.php
12824$theme = $this->getSidebarTheme();  // 'matrix', 'purple', or 'professional'
12825$styles = $this->getSidebarThemeStyles($theme);
12826
12827// Styles include:
12828- bg, border, shadow
12829- header_bg, header_border, header_shadow
12830- text_primary, text_bright, text_dim
12831- grid_bg, grid_border
12832- cell_bg, cell_today_bg
12833```
12834
12835**Theme Changes**:
12836- Header background gradient
12837- Border colors
12838- Text colors
12839- Shadow/glow effects
12840- Grid colors
12841
12842**How to Change**:
128431. Admin → Calendar → �� Themes tab
128442. Select desired theme
128453. Click "Save Theme"
128464. Refresh page to see changes
12847
12848### Notes
12849- Themes only affect sidebar widget appearance
12850- Main calendar view unchanged
12851- Theme setting stored in `data/meta/calendar_theme.txt`
12852- Safe to switch themes - no data affected
12853
12854## Version 4.1.0 (2026-02-07) - FIX EVENT SORTING & TOOLTIP POSITIONING
12855
12856### �� Bug Fixes
12857- **Fixed:** Events now sort chronologically by time (was using string comparison)
12858- **Fixed:** Tooltip positioning using JavaScript like system tooltips
12859- **Fixed:** All-day events appear first, then events in time order
12860
12861### Technical Details
12862
12863**Event Sorting Fix**:
12864```php
12865// BROKEN (v4.0.9):
12866return strcmp($aTime, $bTime);
12867// String comparison: "10:00" < "8:00" because "1" < "8"
12868// Result: 10:00 AM shown BEFORE 8:00 AM ❌
12869
12870// FIXED (v4.1.0):
12871$aMinutes = $this->timeToMinutes($aTime);  // 8:00 = 480
12872$bMinutes = $this->timeToMinutes($bTime);  // 10:00 = 600
12873return $aMinutes - $bMinutes;
12874// Result: 8:00 AM shown BEFORE 10:00 AM ✓
12875```
12876
12877**Example Before Fix**:
12878```
12879�� Weekend Ticket Duty (all-day)
128808:00 AM START TICKETS
1288110:00 AM Soul Winning    ← Wrong!
128829:45 AM Coffee           ← Should be before 10:00 AM
12883```
12884
12885**Example After Fix**:
12886```
12887�� Weekend Ticket Duty (all-day)
128888:00 AM START TICKETS
128899:45 AM Coffee           ← Correct!
1289010:00 AM Soul Winning
12891```
12892
12893**Tooltip Positioning**:
12894- Added JavaScript to dynamically position tooltips using `getBoundingClientRect()`
12895- Uses CSS custom properties `--tooltip-left` and `--tooltip-top`
12896- Positioned on `mouseenter` event
12897- Matches system tooltip implementation (no cutoff)
12898
12899**JavaScript Implementation**:
12900```javascript
12901element.addEventListener("mouseenter", function() {
12902    const rect = element.getBoundingClientRect();
12903    element.style.setProperty("--tooltip-left", (rect.right - 10) + "px");
12904    element.style.setProperty("--tooltip-top", (rect.top - 30) + "px");
12905});
12906```
12907
12908**Result**: Tooltips now extend beyond sidebar without cutoff, positioned dynamically!
12909
12910## Version 4.0.9 (2026-02-07) - COMPACT TOOLTIPS & OVERFLOW FIX
12911
12912### �� UI Improvements
12913- **Fixed:** Sidebar tooltips no longer cut off at sidebar edge
12914- **Fixed:** Changed inline `overflow:hidden` to `overflow:visible` in sidebar
12915- **Changed:** Main calendar conflict tooltip now much smaller (was too big)
12916
12917### Technical Details
12918
12919**Sidebar Overflow Fix**:
12920```php
12921// Before (line 2005):
12922style="...overflow:hidden..."  // ← Blocked tooltips!
12923
12924// After:
12925style="...overflow:visible..."  // ← Tooltips extend beyond!
12926```
12927
12928**The Problem**: Inline `overflow:hidden` overrode CSS `overflow:visible !important`
12929
12930**Main Calendar Tooltip Size**:
12931```css
12932/* Before: */
12933.conflict-tooltip {
12934    border: 2px solid #ff9800;
12935    border-radius: 6px;
12936    padding: 8px 12px;
12937    font-size: 12px;
12938    min-width: 200px;
12939    max-width: 350px;
12940}
12941
12942/* After: */
12943.conflict-tooltip {
12944    border: 1px solid #ff9800;  /* Thinner */
12945    border-radius: 3px;          /* Smaller */
12946    padding: 4px 8px;            /* Less padding */
12947    font-size: 10px;             /* Smaller header */
12948    min-width: 120px;            /* Narrower */
12949    max-width: 200px;            /* Narrower */
12950}
12951
12952.conflict-tooltip-body {
12953    padding: 6px 8px;  /* Was 10px 12px */
12954    font-size: 9px;    /* Was 11px */
12955    line-height: 1.4;  /* Was 1.6 */
12956}
12957
12958.conflict-item {
12959    padding: 2px 0;  /* Was 4px */
12960    font-size: 9px;  /* Added smaller font */
12961}
12962```
12963
12964**Result**:
12965- Main calendar tooltip ~50% smaller
12966- Sidebar tooltips now extend beyond borders
12967- Both tooltips compact and readable
12968
12969## Version 4.0.8 (2026-02-07) - FIX NEWLINES IN TOOLTIP
12970
12971### �� Bug Fix
12972- **Fixed:** Tooltip now shows actual line breaks (not literal `\n` text)
12973- **Changed:** Using HTML entity `&#10;` for newlines instead of `\n`
12974
12975### Technical Details
12976
12977**The Problem**:
12978```php
12979// Before (v4.0.7):
12980$conflictTooltip = 'Conflicts with:\n';  // Literal \n showed in tooltip
12981
12982// Displayed as:
12983"Conflicts with:\n• Event 1\n• Event 2"  // ← Literal backslash-n
12984```
12985
12986**The Fix**:
12987```php
12988// After (v4.0.8):
12989$conflictTooltip = "Conflicts with:&#10;";  // HTML entity for newline
12990
12991// Displays as:
12992Conflicts with:
12993• Event 1
12994• Event 2
12995```
12996
12997**Why `&#10;` Works**:
12998- HTML entity for line feed character
12999- Works in data attributes
13000- CSS `white-space: pre-line` preserves the newlines
13001- Renders as actual line breaks in tooltip
13002
13003**Applied to**:
13004- PHP rendering (sidebar Today/Tomorrow/Important)
13005- JavaScript rendering (clicked day events)
13006
13007## Version 4.0.7 (2026-02-07) - COMPACT TOOLTIP & OVERFLOW FIX
13008
13009### �� UI Improvements
13010- **Changed:** Tooltip size reduced significantly (much more compact)
13011- **Fixed:** Tooltip now overflows sidebar borders (not cut off)
13012- **Changed:** Smaller padding (3px vs 6px), smaller font (9px vs 11px)
13013- **Changed:** Narrower width (120-200px vs 200-300px)
13014
13015### Technical Details
13016
13017**Tooltip Size Reduction**:
13018```css
13019/* Before (v4.0.6):
13020padding: 6px 10px;
13021font-size: 11px;
13022min-width: 200px;
13023max-width: 300px;
13024
13025/* After (v4.0.7): */
13026padding: 3px 6px;
13027font-size: 9px;
13028min-width: 120px;
13029max-width: 200px;
13030```
13031
13032**Overflow Fix**:
13033```css
13034/* Allow tooltip to extend beyond sidebar */
13035.sidebar-widget,
13036.sidebar-matrix {
13037    overflow: visible !important;
13038}
13039
13040/* Position tooltip outside */
13041[data-tooltip]:before {
13042    bottom: 120%;  /* Further above */
13043    right: -10px;  /* Can extend beyond edge */
13044    z-index: 10000; /* Always on top */
13045}
13046```
13047
13048**Visual Result**:
13049- Tooltip is ~40% smaller
13050- Extends beyond sidebar border if needed
13051- Still readable, just more compact
13052- Better for small screens
13053
13054## Version 4.0.6 (2026-02-07) - MATCH MAIN CALENDAR LOGIC & TOOLTIP POSITIONING
13055
13056### �� Critical Fix
13057- **Fixed:** Sidebar conflict detection now matches main calendar logic exactly
13058- **Fixed:** Checks both `end_time` (snake_case) and `endTime` (camelCase) field names
13059- **Fixed:** Events without end time now treated as zero-duration (not +1 hour)
13060- **Fixed:** Now matches what you see in main calendar view
13061
13062### ✨ UI Improvement
13063- **Changed:** Conflict tooltips now appear ABOVE and to the LEFT (not below/right)
13064- **Added:** Custom CSS tooltip with data-tooltip attribute
13065- **Improved:** Better tooltip positioning - doesn't overflow screen edges
13066
13067### Technical Details
13068
13069**The Problem - Field Name Mismatch**:
13070```php
13071// Main calendar (line 697):
13072$end1 = isset($evt1['endTime']) ? ... // ← Checks 'endTime' (camelCase)
13073
13074// Sidebar (before fix):
13075$endTime = isset($event['end_time']) ? ... // ← Only checked 'end_time' (snake_case)
13076```
13077
13078**The Problem - Duration Logic**:
13079```php
13080// Main calendar (line 697):
13081$end1 = isset($evt1['endTime']) && !empty($evt1['endTime'])
13082    ? $evt1['endTime']
13083    : $evt1['time'];  // ← Uses START time (zero duration)
13084
13085// Sidebar (before fix):
13086$endTime = ... ? ... : $this->addHoursToTime($startTime, 1);  // ← Added 1 hour!
13087```
13088
13089**The Fix**:
13090```php
13091// Now checks BOTH field names:
13092if (isset($event['end_time']) && $event['end_time'] !== '') {
13093    $endTime = $event['end_time'];
13094} elseif (isset($event['endTime']) && $event['endTime'] !== '') {
13095    $endTime = $event['endTime'];
13096} else {
13097    $endTime = $startTime;  // ← Matches main calendar!
13098}
13099```
13100
13101**Tooltip Positioning**:
13102- Uses `data-tooltip` attribute instead of `title`
13103- CSS positions tooltip ABOVE badge (`bottom: 100%`)
13104- Aligns to RIGHT edge (`right: 0`)
13105- Arrow points down to badge
13106- Black background with white text
13107- Max width 300px
13108
13109### Example
13110
13111**6:00 PM Evening Service** (no end time):
13112- Old: 6:00 PM - 7:00 PM (assumed 1 hour) ❌
13113- New: 6:00 PM - 6:00 PM (zero duration) ✓ Matches main calendar!
13114
13115**3:30 PM-7:00 PM Super Bowl** vs **6:00 PM Service**:
13116- Zero-duration events at 6:00 PM don't overlap with anything
13117- ONLY if service has explicit end time (e.g., 6:00-7:00) will it conflict
13118
13119**Tooltip appears**:
13120```
13121        ┌────────────────────┐
13122        │ Conflicts with:    │
13123        │ • Super Bowl       │
13124        │   (3:30 PM-7:00 PM)│
13125        └─────────┬──────────┘
131261312713128```
13129
13130## Version 4.0.5 (2026-02-07) - FIX END_TIME DEFAULT HANDLING
13131
13132### �� Bug Fix
13133- **Fixed:** Events without end_time now properly get 1-hour default duration
13134- **Fixed:** Empty string end_time values now treated as missing (was causing issues)
13135- **Improved:** More robust checking for `end_time` field (checks both isset and not empty)
13136
13137### Technical Details
13138
13139**The Problem**:
13140```php
13141// Before (broken):
13142$endTime = isset($event['end_time']) ? $event['end_time'] : default;
13143
13144// If end_time exists but is empty string "":
13145isset($event['end_time']) = TRUE
13146$endTime = ""  // ← Empty string, not default!
13147```
13148
13149**The Fix**:
13150```php
13151// After (fixed):
13152$endTime = (isset($event['end_time']) && $event['end_time'] !== '')
13153    ? $event['end_time']
13154    : $this->addHoursToTime($startTime, 1);
13155
13156// Now empty string gets the default 1-hour duration
13157```
13158
13159**Why This Matters**:
13160Events like "6:00 PM Evening Service" with no end time should be treated as 6:00-7:00 PM (1 hour). If the `end_time` field contains an empty string instead of being absent, the old code would use the empty string, causing conflict detection to fail.
13161
13162**Example**:
13163```
13164Super Bowl: 3:30 PM - 7:00 PM
13165Evening Service: 6:00 PM - ??? (should be 7:00 PM)
13166
13167If end_time = "" (empty string):
13168  Old code: Uses "" → conflict detection fails
13169  New code: Uses 7:00 PM → conflict detected ✓
13170```
13171
13172### Testing
13173If you're still not seeing the conflict on the 6:00 PM service:
131741. Check if the event has `end_time` set in the JSON
131752. Clear cache (Admin → Manage Events → Clear Cache)
131763. The conflict should now appear
13177
13178## Version 4.0.4 (2026-02-07) - CONFLICT TOOLTIP WITH DETAILS
13179
13180### ✨ Feature Added
13181- **Added:** Hover over ⚠ badge to see which events are conflicting
13182- **Added:** Tooltip shows conflicting event titles and times
13183- **Added:** Works in both sidebar sections and clicked day events
13184
13185### Technical Details
13186
13187**Conflict Tracking Enhanced**:
13188```php
13189// Now tracks WHICH events conflict:
13190$event['conflictingWith'] = [
13191    ['title' => 'Meeting', 'time' => '10:00', 'end_time' => '11:00'],
13192    ['title' => 'Call', 'time' => '10:30', 'end_time' => '11:30']
13193];
13194```
13195
13196**Tooltip Format**:
13197```
13198Conflicts with:
13199• Meeting (10:00 AM-11:00 AM)
13200• Call (10:30 AM-11:30 PM)
13201```
13202
13203**Where It Works**:
13204- ✅ Today section (sidebar)
13205- ✅ Tomorrow section (sidebar)
13206- ✅ Important Events section (sidebar)
13207- ✅ Clicked day events (week grid)
13208
13209**Cursor**: Changes to `help` cursor on hover to indicate tooltip
13210
13211### Note on Multi-Day Events
13212The current conflict detection only checks time conflicts **within the same day**. If you have an event that spans multiple days (e.g., start date on Monday, end date on Wednesday), each day is treated independently. To see conflicts across the entire span, you would need to check each individual day.
13213
13214## Version 4.0.3 (2026-02-07) - FIX CONFLICT BADGE & IMPORTANT EVENTS LOGIC
13215
13216### �� Bug Fixes
13217- **Fixed:** Conflict badge (⚠) now displays in sidebar Today/Tomorrow/Important sections
13218- **Fixed:** Important Events now shows events even if they're today or tomorrow
13219- **Fixed:** Field name mismatch - was checking `'conflicts'` (plural) but setting `'conflict'` (singular)
13220
13221### Technical Details
13222
13223**Conflict Badge Issue**:
13224```php
13225// BROKEN (line 2511):
13226$hasConflict = isset($event['conflicts']) && !empty($event['conflicts']);
13227// ↑ Checking 'conflicts' (plural)
13228
13229// But detectTimeConflicts() sets:
13230$event['conflict'] = true/false;
13231// ↑ Setting 'conflict' (singular)
13232
13233// FIXED:
13234$hasConflict = isset($event['conflict']) && $event['conflict'];
13235```
13236
13237**Result**: Badge now shows for ALL conflicting events in sidebar sections
13238
13239**Important Events Logic Issue**:
13240```php
13241// BROKEN:
13242if ($dateKey === $todayStr) {
13243    $todayEvents[] = ...;
13244} elseif ($dateKey === $tomorrowStr) {
13245    $tomorrowEvents[] = ...;
13246} else {  // ← Only checked if NOT today/tomorrow!
13247    if ($isImportant) {
13248        $importantEvents[] = ...;
13249    }
13250}
13251
13252// FIXED:
13253if ($dateKey === $todayStr) {
13254    $todayEvents[] = ...;
13255}
13256if ($dateKey === $tomorrowStr) {
13257    $tomorrowEvents[] = ...;
13258}
13259// ↑ Changed to separate 'if' statements
13260if ($isImportant && $dateKey in this week) {
13261    $importantEvents[] = ...;  // ← Now includes today/tomorrow too!
13262}
13263```
13264
13265**Result**: Important namespace events now show in Important section even if they're today or tomorrow
13266
13267### Conflict Badge Display
13268- Simplified to just ⚠ icon (no count)
13269- Orange color (#ff9800)
13270- 10px font size
13271- Hover shows "Time conflict detected"
13272
13273## Version 4.0.2 (2026-02-07) - FIX IMPORTANT EVENTS DISPLAY
13274
13275### �� Bug Fix
13276- **Fixed:** Important Events section now displays all events correctly
13277- **Fixed:** Single-event days now get conflict flag (was returning early without flag)
13278- **Fixed:** Conflict detection no longer causes events to disappear from Important section
13279
13280### Technical Details
13281
13282**The Problem**:
13283- `detectTimeConflicts()` returned early if only 1 event on a day
13284- Returned original array without adding 'conflict' field
13285- This inconsistency caused issues in event categorization
13286
13287**The Solution**:
13288```php
13289// Before (broken):
13290if (empty($dayEvents) || count($dayEvents) < 2) {
13291    return $dayEvents;  // No 'conflict' field added!
13292}
13293
13294// After (fixed):
13295if (count($dayEvents) === 1) {
13296    return [array_merge($dayEvents[0], ['conflict' => false])];  // Always add flag
13297}
13298```
13299
13300**Result**:
13301- All events now have 'conflict' field consistently
13302- Single events: conflict = false
13303- Multiple events: conflict = true/false based on overlap
13304- Important Events section displays correctly
13305
13306## Version 4.0.1 (2026-02-06) - CONFLICT DETECTION, TAB REORDER, FIXES
13307
13308### �� Bug Fixes
13309- **Fixed:** Conflict badge (⚠) now displays in clicked day events
13310- **Fixed:** Recurring events edit now updates time and end_time correctly
13311- **Fixed:** Field names changed from 'start'/'end' to 'time'/'end_time' in recurring edit
13312
13313### ✨ Features Added
13314- **Added:** Time conflict detection for overlapping events
13315- **Added:** detectTimeConflicts() function checks all events on same day
13316- **Added:** timesOverlap(), timeToMinutes(), addMinutesToTime() helper functions
13317- **Added:** Events now have 'conflict' flag set automatically
13318
13319### �� UI Changes
13320- **Changed:** Admin tab order: �� Manage Events (first), �� Update Plugin, ⚙️ Outlook Sync
13321- **Changed:** Default admin tab is now "Manage Events" (was "Update Plugin")
13322- **Changed:** Week view now shows 4 colored event bars before "+1" (was 3 bars)
13323
13324### Technical Details
13325
13326**Conflict Detection**:
13327```php
13328// Automatically detects overlapping events on same day
13329// Sets 'conflict' flag to true if event overlaps with another
13330$eventsWithConflicts = $this->detectTimeConflicts($dayEvents);
13331```
13332
13333**Logic**:
13334- All-day events never conflict (no time set)
13335- Timed events check for overlap with other timed events
13336- Overlap = start1 < end2 AND start2 < end1
13337- Default duration is 60 minutes if no end_time
13338
13339**Recurring Events Fix**:
13340- Old: Updated `$event['start']` and `$event['end']` (wrong fields)
13341- New: Updates `$event['time']` and `$event['end_time']` (correct fields)
13342- Now edits actually save and update the events
13343
13344**Week View Bars**:
13345- Shows 4 colored bars instead of 3
13346- "+1" becomes "+2" with 5 events, "+3" with 6 events, etc.
13347
13348## Version 4.0.0 (2026-02-06) - MATRIX EDITION RELEASE ��
13349
13350**Major Release**: Complete Matrix-themed calendar plugin with advanced features!
13351
13352### �� Major Features
13353
13354#### Sidebar Widget
13355- **Week Grid**: Interactive 7-day calendar with click-to-view events
13356- **Live System Monitoring**: CPU load, real-time CPU, memory usage with tooltips
13357- **Live Clock**: Updates every second with date display
13358- **Real-time Weather**: Geolocation-based temperature with icon
13359- **Event Sections**: Today (orange), Tomorrow (green), Important (purple)
13360- **Add Event Button**: Dark green bar opens full event creation dialog
13361- **Matrix Theme**: Green glow effects throughout
13362
13363#### Event Management
13364- **Single Color Bars**: Clean 3px bars showing event's assigned color
13365- **All-Day Events First**: Then sorted chronologically by time
13366- **Conflict Detection**: Orange ⚠ badge on overlapping events
13367- **Rich Content**: Full DokuWiki formatting (**bold**, [[links]], //italic//)
13368- **HTML Rendering**: Pre-rendered for JavaScript display
13369- **Click-to-View**: Click week grid days to expand event details
13370
13371#### Admin Interface
13372- **Update Plugin Tab** (Default): Version info, changelog, prominent Clear Cache button
13373- **Outlook Sync Tab**: Microsoft Azure integration, category mapping, sync settings
13374- **Manage Events Tab**: Browse, edit, delete, move events across namespaces
13375
13376#### Outlook Sync
13377- **Bi-directional Sync**: DokuWiki ↔ Microsoft Outlook
13378- **Category Mapping**: Map colors to Outlook categories
13379- **Conflict Resolution**: Time conflict detection
13380- **Import/Export Config**: Encrypted configuration files
13381
13382### �� Design
13383- **Matrix Theme**: Authentic green glow aesthetic
13384- **Dark Backgrounds**: #1a1a1a header, rgba(36, 36, 36) sections
13385- **Color Scheme**:
13386  - Today: Orange #ff9800
13387  - Tomorrow: Green #4caf50
13388  - Important: Purple #9b59b6
13389  - Add Event: Dark green #006400
13390  - System bars: Green/Purple/Orange
13391
13392### �� Technical Highlights
13393- **Zero-margin Design**: Perfect flush alignment throughout
13394- **Flexbox Layout**: Modern, responsive structure
13395- **AJAX Operations**: No page reloads needed
13396- **Smart Sorting**: All-day events first, then chronological
13397- **Tooltip System**: Detailed stats on hover (working correctly)
13398- **Event Dialog**: Full form with drag support
13399- **Cache Management**: One-click cache clearing
13400
13401### �� Breaking Changes from v3.x
13402- Removed dual color bars (now single event color bar only)
13403- Add Event button moved to between header and week grid
13404- All-day events now appear FIRST (not last)
13405- Update Plugin tab is now the default admin tab
13406
13407### �� Bug Fixes (v3.10.x → v4.0.0)
13408- ✅ Fixed color bars not showing (align-self:stretch vs height:100%)
13409- ✅ Fixed tooltip function naming (sanitized calId for JavaScript)
13410- ✅ Fixed weather display (added updateWeather function)
13411- ✅ Fixed HTML rendering in events (title_html/description_html fields)
13412- ✅ Fixed Add Event dialog (null check for calendar element)
13413- ✅ Fixed text positioning in Add Event button
13414- ✅ Fixed spacing throughout sidebar widget
13415
13416### �� Complete Feature List
13417- Full calendar view (month grid)
13418- Sidebar widget (week view)
13419- Event panel (standalone)
13420- Event list (date ranges)
13421- Namespace support
13422- Color coding
13423- Time conflict detection
13424- DokuWiki syntax in events
13425- Outlook synchronization
13426- System monitoring
13427- Weather display
13428- Live clock
13429- Admin interface
13430- Cache management
13431- Draggable dialogs
13432- AJAX save/edit/delete
13433- Import/export config
13434
13435### �� Usage
13436
13437**Sidebar Widget**:
13438```
13439{{calendar sidebar}}
13440{{calendar sidebar namespace=team}}
13441```
13442
13443**Full Calendar**:
13444```
13445{{calendar}}
13446{{calendar year=2026 month=6 namespace=team}}
13447```
13448
13449**Event Panel**:
13450```
13451{{eventpanel}}
13452```
13453
13454**Event List**:
13455```
13456{{eventlist daterange=2026-01-01:2026-01-31}}
13457```
13458
13459### �� Stats
13460- **40+ versions** developed during v3.x iterations
13461- **3.10.0 → 3.11.4**: Polish and refinement
13462- **4.0.0**: Production-ready Matrix Edition
13463
13464### �� Credits
13465Massive iteration and refinement session resulting in a polished, feature-complete calendar plugin with authentic Matrix aesthetics and enterprise-grade Outlook integration.
13466
13467---
13468
13469## Previous Versions (v3.11.4 and earlier)
13470
13471## Version 3.11.4 (2026-02-06) - RESTORE HEADER BOTTOM SPACING
13472- **Changed:** Restored 2px bottom padding to header (was 0px, now 2px)
13473- **Improved:** Small breathing room between system stats bars and Add Event button
13474- **Visual:** Better spacing for cleaner appearance
13475
13476### CSS Change:
13477**eventlist-today-header**:
13478- `padding: 6px 10px 0 10px` → `padding: 6px 10px 2px 10px`
13479
13480### Visual Result:
13481```
13482│  ▓▓▓░░ ▓▓░░░ ▓▓▓▓░  │  ← Stats bars
13483│                       │  ← 2px space (restored)
13484├───────────────────────┤
13485│  + ADD EVENT          │  ← Add Event bar
13486├───────────────────────┤
13487```
13488
13489**Before (v3.11.3)**: No space, bars directly touch Add Event button
13490**After (v3.11.4)**: 2px breathing room for better visual hierarchy
13491
13492## Version 3.11.3 (2026-02-06) - FIX ADD EVENT DIALOG & TEXT POSITION
13493- **Fixed:** openAddEvent() function now checks if calendar element exists before reading dataset
13494- **Fixed:** Add Event button no longer throws "Cannot read properties of null" error
13495- **Changed:** Add Event text moved up 1px (position:relative; top:-1px)
13496- **Changed:** Line-height reduced from 12px to 10px for better text centering
13497- **Improved:** openAddEvent() works for both regular calendars and sidebar widgets
13498
13499### JavaScript Fix:
13500**Problem**: Line 1084-1085 in calendar-main.js
13501```javascript
13502const calendar = document.getElementById(calId);
13503const filteredNamespace = calendar.dataset.filteredNamespace; // ← Null error!
13504```
13505
13506**Solution**: Added null check
13507```javascript
13508const calendar = document.getElementById(calId);
13509const filteredNamespace = calendar ? calendar.dataset.filteredNamespace : null;
13510```
13511
13512**Why This Happened**:
13513- Regular calendar has element with id=calId
13514- Sidebar widget doesn't have this element (different structure)
13515- Code tried to read .dataset on null, causing error
13516
13517### Text Position Fix:
13518**Before**:
13519- line-height: 12px
13520- vertical-align: middle
13521- Text slightly low
13522
13523**After**:
13524- line-height: 10px
13525- position: relative; top: -1px
13526- Text perfectly centered
13527
13528### What Works Now:
13529✅ Click "+ ADD EVENT" in sidebar → Dialog opens
13530✅ No console errors
13531✅ Text properly centered vertically
13532✅ Form pre-filled with today's date
13533✅ Save works correctly
13534
13535## Version 3.11.2 (2026-02-06) - ADD EVENT DIALOG IN SIDEBAR
13536- **Added:** Event dialog to sidebar widget (same as regular calendar)
13537- **Changed:** Add Event button now opens proper event form dialog
13538- **Added:** renderEventDialog() called in renderSidebarWidget()
13539- **Fixed:** Add Event button calls openAddEvent() with calId, namespace, and today's date
13540- **Improved:** Can now add events directly from sidebar widget
13541
13542### Add Event Button Behavior:
13543**Before (v3.11.1)**: Showed alert with instructions
13544**After (v3.11.2)**: Opens full event creation dialog
13545
13546**Dialog Features**:
13547- Date field (defaults to today)
13548- Title field (required)
13549- Time field (optional)
13550- End time field (optional)
13551- Color picker
13552- Category field
13553- Description field
13554- Save and Cancel buttons
13555- Draggable dialog
13556
13557### Technical Changes:
13558- Added `$html .= $this->renderEventDialog($calId, $namespace);` at end of renderSidebarWidget()
13559- Changed Add Event onclick from alert to `openAddEvent('calId', 'namespace', 'YYYY-MM-DD')`
13560- Dialog uses same structure as regular calendar
13561- Uses existing openAddEvent() and saveEventCompact() JavaScript functions
13562
13563### User Flow:
135641. User clicks "+ ADD EVENT" green bar
135652. Event dialog opens with today's date pre-filled
135663. User fills in event details
135674. User clicks Save
135685. Event saved via AJAX
135696. Dialog closes
135707. Sidebar refreshes to show new event
13571
13572## Version 3.11.1 (2026-02-06) - FLUSH HEADER & ADD EVENT DIALOG
13573- **Fixed:** Removed bottom padding from header (was 2px, now 0)
13574- **Fixed:** Removed margin from stats container (was margin-top:2px, now margin:0)
13575- **Fixed:** Add Event bar now flush against header with zero gap
13576- **Changed:** Add Event button now shows helpful alert dialog instead of navigating to admin
13577- **Improved:** Alert provides clear instructions on how to add events
13578
13579### CSS Changes:
13580**eventlist-today-header**:
13581- `padding: 6px 10px 2px 10px` → `padding: 6px 10px 0 10px` (removed 2px bottom)
13582
13583**eventlist-stats-container**:
13584- `margin-top: 2px` → `margin: 0` (removed all margins)
13585
13586### Add Event Button Behavior:
13587**Before**: Clicked → Navigated to Admin → Manage Events tab
13588**After**: Clicked → Shows alert with instructions
13589
13590**Alert Message**:
13591```
13592To add an event, go to:
13593Admin → Calendar Management → Manage Events tab
13594or use the full calendar view {{calendar}}
13595```
13596
13597### Visual Result:
13598```
13599│  ▓▓▓░░ ▓▓░░░ ▓▓▓▓░  │  ← Stats (no margin-bottom)
13600├────────────────────────┤
13601│  + ADD EVENT           │  ← Perfectly flush!
13602├────────────────────────┤
13603```
13604
13605No gaps, perfectly aligned!
13606
13607## Version 3.11.0 (2026-02-06) - ADD EVENT BAR FINAL POSITION & SIZE
13608- **Moved:** Add Event bar back to original position (between header and week grid)
13609- **Changed:** Font size reduced from 9px to 8px (prevents text cutoff)
13610- **Changed:** Letter spacing reduced from 0.5px to 0.4px
13611- **Fixed:** Text now fully visible without being cut off
13612- **Final:** Optimal position and size determined
13613
13614### Final Layout:
13615```
13616┌─────────────────────────────┐
13617│  Clock | Weather | Stats    │  ← Header
13618├─────────────────────────────┤
13619│  + ADD EVENT                 │  ← Bar (back here, smaller text)
13620├─────────────────────────────┤
13621│  M  T  W  T  F  S  S        │  ← Week Grid
13622│  3  4  5  6  7  8  9        │
13623├─────────────────────────────┤
13624│  Today                       │  ← Event sections
13625└─────────────────────────────┘
13626```
13627
13628### Text Size Changes:
13629**v3.10.9**: 9px font, 0.5px letter-spacing → Text slightly cut off
13630**v3.11.0**: 8px font, 0.4px letter-spacing → Text fully visible
13631
13632### Why This Position:
13633- Separates header from calendar
13634- Natural action point after viewing stats
13635- Users see stats → decide to add event → view calendar
13636- Consistent with original design intent
13637
13638## Version 3.10.9 (2026-02-06) - ADD EVENT BAR MOVED BELOW WEEK GRID
13639- **Moved:** Add Event bar repositioned from between header/grid to below week grid
13640- **Improved:** Better visual flow - header → stats → grid → add button → events
13641- **Changed:** Add Event bar now acts as separator between calendar and event sections
13642
13643### New Layout:
13644```
13645┌─────────────────────────────┐
13646│  Clock | Weather | Stats    │  ← Header
13647├─────────────────────────────┤
13648│  M  T  W  T  F  S  S        │  ← Week Grid
13649│  3  4  5  6  7  8  9        │
13650├─────────────────────────────┤
13651│  + ADD EVENT                 │  ← Add bar (moved here!)
13652├─────────────────────────────┤
13653│  Today                       │  ← Event sections
13654│  Tomorrow                    │
13655│  Important Events            │
13656└─────────────────────────────┘
13657```
13658
13659### Visual Flow:
13660**Before (v3.10.8)**:
136611. Header (clock, weather, stats)
136622. **+ ADD EVENT** bar
136633. Week grid
136644. Event sections
13665
13666**After (v3.10.9)**:
136671. Header (clock, weather, stats)
136682. Week grid (calendar days)
136693. **+ ADD EVENT** bar
136704. Event sections
13671
13672### Benefits:
13673- Natural reading flow: View calendar → Add event → See events
13674- Add button positioned between calendar and event list
13675- Acts as visual separator
13676- More logical action placement
13677
13678## Version 3.10.8 (2026-02-06) - SINGLE COLOR BAR & ZERO MARGIN ADD BAR
13679- **Removed:** Section color bar (blue/orange/green/purple) - now shows ONLY event color
13680- **Changed:** Events now display with single 3px color bar (event's assigned color only)
13681- **Fixed:** Add Event bar now has zero margin (margin:0) - touches header perfectly
13682- **Simplified:** Cleaner visual with one color bar instead of two
13683- **Improved:** More space for event content without extra bar
13684
13685### Visual Changes:
13686
13687**Before (v3.10.7)** - Dual color bars:
13688```
13689├─ [Orange][Green]  Event Title
13690├─ [Blue][Purple]   Event Title
13691```
13692
13693**After (v3.10.8)** - Single color bar:
13694```
13695├─ [Green]  Event Title    ← Only event color!
13696├─ [Purple] Event Title    ← Only event color!
13697```
13698
13699### Add Bar Changes:
13700- Added `margin:0` to eliminate gaps
13701- Now flush against header (no space above)
13702- Now flush against week grid (no space below)
13703- Perfect seamless connection
13704
13705### Technical Changes:
13706**renderSidebarEvent()**:
13707- Removed section color bar (4px)
13708- Kept only event color bar (3px)
13709
13710**showDayEvents() JavaScript**:
13711- Removed section color bar (4px blue)
13712- Kept only event color bar (3px)
13713
13714**Add Event bar**:
13715- Added `margin:0` inline style
13716- Removed all top/bottom margins
13717
13718## Version 3.10.7 (2026-02-06) - COLOR BARS FIX FOR SECTIONS & DARK GREEN ADD BAR
13719- **Fixed:** Color bars now display in Today/Tomorrow/Important sections (was only showing in clicked day)
13720- **Fixed:** Changed Today/Tomorrow/Important event rendering to use `align-self:stretch` instead of `height:100%`
13721- **Changed:** Add Event bar color from orange to dark green (#006400)
13722- **Changed:** Add Event bar height increased from 6px to 12px (text no longer cut off)
13723- **Changed:** Add Event bar text now bright green (#00ff00) with green glow
13724- **Changed:** Add Event bar font size increased from 7px to 9px
13725- **Changed:** Add Event bar letter spacing increased to 0.5px
13726- **Improved:** Hover effect on Add Event bar now darker green (#004d00)
13727
13728### Color Bar Fix Details:
13729**Problem**: Today/Tomorrow/Important sections still used `height:100%` on color bars
13730**Solution**: Applied same fix as clicked day events:
13731- Changed parent div: `align-items:start` → `align-items:stretch`
13732- Added `min-height:20px` to parent
13733- Changed bars: `height:100%` → `align-self:stretch`
13734- Bars now properly fill vertical space in ALL sections
13735
13736### Add Event Bar Changes:
13737**Before**:
13738- Background: Orange (#ff9800)
13739- Text: Black (#000)
13740- Height: 6px (text cut off)
13741- Font: 7px
13742
13743**After**:
13744- Background: Dark green (#006400)
13745- Text: Bright green (#00ff00) with green glow
13746- Height: 12px (text fully visible)
13747- Font: 9px
13748- Hover: Darker green (#004d00)
13749- Matrix-themed green aesthetic
13750
13751## Version 3.10.6 (2026-02-06) - COLOR BARS FIX, SORTING REVERSAL, CONFLICT BADGE, README UPDATE
13752- **Fixed:** Event color bars now display correctly in clicked day events
13753- **Fixed:** Changed sorting - all-day events now appear FIRST, then timed events
13754- **Added:** Conflict badge (⚠) appears on right side of conflicting events
13755- **Updated:** Complete README.md rewrite with full Matrix theme documentation
13756- **Changed:** Color bars use `align-self:stretch` instead of `height:100%` (fixes rendering)
13757- **Changed:** Parent div uses `align-items:stretch` and `min-height:20px`
13758- **Improved:** Content wrapper now uses flexbox for proper conflict badge positioning
13759
13760### Color Bar Fix:
13761**Problem**: Bars had `height:100%` but parent had no explicit height
13762**Solution**:
13763- Changed to `align-self:stretch` on bars
13764- Parent uses `align-items:stretch`
13765- Added `min-height:20px` to parent
13766- Bars now properly fill vertical space
13767
13768### Sorting Change:
13769**Before**: Timed events first → All-day events last
13770**After**: All-day events FIRST → Timed events chronologically
13771
13772**Example**:
13773```
13774Monday, Feb 5
13775├─ All Day - Project Deadline       ← All-day first
13776├─ 8:00 AM - Morning Standup        ← Earliest time
13777├─ 10:30 AM - Coffee with Bob
13778└─ 2:00 PM - Team Meeting           ← Latest time
13779```
13780
13781### Conflict Badge:
13782- Orange warning triangle (⚠) on right side
13783- 10px font size
13784- Only appears if `event.conflict` is true
13785- Title attribute shows "Time conflict detected"
13786- Small and unobtrusive
13787
13788### README Update:
13789- Complete rewrite with Matrix theme focus
13790- Full usage instructions for all features
13791- Admin interface documentation
13792- Outlook sync setup guide
13793- System monitoring details
13794- Troubleshooting section
13795- Color scheme reference
13796- File structure documentation
13797- Performance tips
13798- Security notes
13799- Quick start examples
13800
13801## Version 3.10.5 (2026-02-06) - TIME SORTING & THINNER ADD BAR
13802- **Added:** Events now sorted by time when clicking week grid days
13803- **Changed:** Add Event bar now ultra-thin (6px height, down from 12px)
13804- **Improved:** Events with times appear first, sorted chronologically
13805- **Improved:** All-day events appear after timed events
13806- **Changed:** Add Event bar font size reduced to 7px (from 10px)
13807- **Changed:** Add Event bar now has 0 padding and fixed 6px height
13808
13809### Sorting Logic:
13810- Events with times sorted by time (earliest first)
13811- All-day events (no time) appear at the end
13812- Sort algorithm: Convert time to minutes (HH:MM → total minutes) and compare
13813- Chronological order: 8:00 AM → 10:30 AM → 2:00 PM → All-day event
13814
13815### Add Event Bar Changes:
13816- **Height**: 6px (was ~12px with padding)
13817- **Padding**: 0 (was 4px top/bottom)
13818- **Font Size**: 7px (was 10px)
13819- **Letter Spacing**: 0.3px (was 0.5px)
13820- **Line Height**: 6px to match height
13821- **Vertical Align**: Middle for text centering
13822
13823## Version 3.10.4 (2026-02-06) - ADD EVENT BAR
13824- **Added:** Thin orange "Add Event" bar between header and week grid
13825- **Added:** Quick access to event creation from sidebar widget
13826- **Styled:** Sleek design with hover effects and glow
13827- **Interactive:** Clicks navigate to Manage Events tab in admin
13828- **Improved:** User workflow for adding events from sidebar
13829
13830### Visual Design:
13831- Orange background (#ff9800) matching Today section color
13832- 4px top/bottom padding for thin, sleek appearance
13833- Black text with white text-shadow for visibility
13834- Hover effect: Darkens to #ff7700 with enhanced glow
13835- Orange glow effect (box-shadow) matching Matrix theme
13836- Centered "+ ADD EVENT" text (10px, bold, letter-spacing)
13837
13838### Technical Changes:
13839- Added between header close and renderWeekGrid() call
13840- Inline onclick handler navigates to admin manage tab
13841- Inline onmouseover/onmouseout for hover effects
13842- Smooth 0.2s transition on all style changes
13843
13844## Version 3.10.3 (2026-02-06) - UI IMPROVEMENTS & CACHE BUTTON RELOCATION
13845- **Changed:** Update Plugin tab is now the default tab when opening admin
13846- **Moved:** Clear Cache button relocated from Outlook Sync tab to Update Plugin tab
13847- **Improved:** Clear Cache button now larger and more prominent with helpful description
13848- **Improved:** Tab order reorganized: Update Plugin (default) → Outlook Sync → Manage Events
13849- **Removed:** Debug console.log statements from day event display
13850- **Fixed:** Cache clear now redirects back to Update Plugin tab instead of Config tab
13851
13852### UI Changes:
13853- Update Plugin tab opens by default (was Config/Outlook Sync tab)
13854- Clear Cache button prominently displayed at top of Update Plugin tab
13855- Orange ��️ button (10px 20px padding) with confirmation dialog
13856- Help text: "Clear the DokuWiki cache if changes aren't appearing or after updating the plugin"
13857- Success/error messages display on Update Plugin tab after cache clear
13858- Tab navigation reordered to put Update first
13859
13860### Technical Changes:
13861- Default tab changed from 'config' to 'update' in html() method
13862- Tab navigation HTML reordered to show Update Plugin tab first
13863- clearCache() method now redirects with 'update' tab parameter
13864- Removed Clear Cache button from renderConfigTab()
13865- Added Clear Cache button to renderUpdateTab() with message display
13866
13867## Version 3.10.2 (2026-02-06) - EVENT HTML RENDERING FIX
13868- **Fixed:** Event formatting (bold, links, italic) now displays correctly when clicking week grid days
13869- **Added:** renderDokuWikiToHtml() helper function to convert DokuWiki syntax to HTML
13870- **Changed:** Events in weekEvents now pre-rendered with title_html and description_html fields
13871- **Improved:** DokuWiki syntax (**bold**, [[links]], //italic//, etc.) properly rendered in clicked day events
13872
13873### Technical Changes:
13874- Added renderDokuWikiToHtml() private function using p_get_instructions() and p_render()
13875- Events added to weekEvents now include pre-rendered HTML versions
13876- title_html and description_html fields populated before json_encode()
13877- JavaScript now receives properly formatted HTML content
13878
13879## Version 3.10.1 (2026-02-06) - TOOLTIP FIX & WEATHER & CACHE BUTTON
13880- **Fixed:** System tooltip functions now use sanitized calId (showTooltip_sidebar_abc123 instead of showTooltip_sidebar-abc123)
13881- **Fixed:** HTML event handlers now call correctly sanitized function names
13882- **Fixed:** Weather temperature now updates correctly in sidebar widget
13883- **Added:** Weather update function to sidebar widget JavaScript
13884- **Added:** "Clear Cache" button in admin panel for easy cache refresh
13885- **Added:** Default weather location set to Irvine, CA when geolocation unavailable
13886- **Improved:** All tooltip functions now work correctly on system status bars
13887
13888### Technical Changes:
13889- Changed tooltip function names to use $jsCalId instead of $calId
13890- Changed HTML onmouseover/onmouseout to use $jsCalId
13891- Added updateWeather() function to sidebar widget
13892- Added getWeatherIcon() function to sidebar widget
13893- Added clearCache() method in admin.php
13894- Added recursiveDelete() helper method in admin.php
13895- Admin UI now has ��️ Clear Cache button alongside Export/Import
13896
13897## Version 3.10.0 (2026-02-06) - JAVASCRIPT FIXES
13898- **Fixed:** JavaScript syntax error "Missing initializer in const declaration"
13899- **Fixed:** Event links and formatting not displaying in clicked day events
13900- **Fixed:** Sanitized calId to jsCalId by replacing dashes with underscores
13901- **Changed:** Event titles now use `title_html` field to preserve HTML formatting
13902- **Changed:** Event descriptions now use `description_html` field to preserve links and formatting
13903- **Improved:** All JavaScript variable names now use valid syntax
13904- **Improved:** Links, bold, italic, and other HTML formatting preserved in events
13905
13906### Technical Changes:
13907- Added variable sanitization: `$jsCalId = str_replace('-', '_', $calId);`
13908- JavaScript variables now use underscores instead of dashes
13909- Event HTML rendering preserves DokuWiki formatting
13910- Fixed "showTooltip_sidebar is not defined" errors
13911- Fixed "showDayEvents_cal is not defined" errors
13912
13913## Version 3.9.9 (2026-02-06) - JAVASCRIPT LOADING ORDER FIX
13914- **Fixed:** Critical JavaScript loading order issue causing ReferenceError
13915- **Fixed:** Functions now defined BEFORE HTML that uses them
13916- **Changed:** Consolidated all JavaScript into single comprehensive script block
13917- **Removed:** ~290 lines of duplicate JavaScript code
13918- **Added:** Shared state management with `sharedState_[calId]` object
13919- **Improved:** System tooltip functions now work correctly
13920- **Improved:** Week grid click events now work correctly
13921
13922### Technical Changes:
13923- Moved all JavaScript to beginning of widget (before HTML)
13924- Removed duplicate script blocks
13925- Unified tooltip and stats functions
13926- Shared latestStats and cpuHistory state
13927- Fixed "Uncaught ReferenceError: showTooltip_sidebar is not defined"
13928
13929## Version 3.9.8 (2026-02-05) - DUAL COLOR BARS & CLICK EVENTS
13930- **Added:** Dual color bars on events (section color + event color)
13931- **Added:** Click week grid days to view events (replaced hover tooltips)
13932- **Added:** Expandable section below week grid for selected day events
13933- **Added:** Blue theme for selected day section
13934- **Changed:** Week grid days now clickable instead of tooltips
13935- **Changed:** Section bar: 4px wide (left)
13936- **Changed:** Event bar: 3px wide (right)
13937- **Increased:** Gap between color bars from 3px to 6px
13938- **Improved:** Click is more reliable and mobile-friendly than hover tooltips
13939
13940### Visual Changes:
13941- Each event shows TWO color bars side-by-side
13942- Left bar (4px): Section context (Today=Orange, Tomorrow=Green, Important=Purple, Selected=Blue)
13943- Right bar (3px): Individual event's assigned color
13944- Click any day in week grid to expand event list
13945- X button to close selected day events
13946
13947## Version 3.9.7 (2026-02-05) - EVENT COLOR BAR VISIBILITY
13948- **Increased:** Event color bar width from 2px to 3px
13949- **Increased:** Gap between section and event bars from 3px to 6px
13950- **Improved:** Event color bars now more visible alongside section bars
13951- **Note:** Dual color bar system already in place from v3.9.6
13952
13953## Version 3.9.6 (2026-02-05) - UI REFINEMENTS
13954- **Changed:** Date in Important Events moved below event name (was above)
13955- **Changed:** Section headers now 9px font size (was 10px)
13956- **Changed:** Section headers now normal case (was ALL CAPS)
13957- **Changed:** Letter spacing reduced from 0.8px to 0.3px
13958- **Improved:** More natural reading flow with date below event name
13959- **Improved:** Cleaner, more subtle section headers
13960
13961### Header Changes:
13962- "TODAY" → "Today"
13963- "TOMORROW" → "Tomorrow"
13964- "IMPORTANT EVENTS" → "Important Events"
13965
13966## Version 3.9.0 (2026-02-05) - SIDEBAR WIDGET REDESIGN
13967- **Redesigned:** Complete overhaul of `sidebar` parameter
13968- **Added:** Compact week-at-a-glance itinerary view (200px wide)
13969- **Added:** Live clock widget at top of sidebar
13970- **Added:** 7-cell week grid showing event bars
13971- **Added:** Today section with orange header and left border
13972- **Added:** Tomorrow section with green header and left border
13973- **Added:** Important Events section with purple header and left border
13974- **Added:** Admin setting to configure important namespaces
13975- **Added:** Time conflict badges in sidebar events
13976- **Added:** Task checkboxes in sidebar events
13977- **Changed:** Sidebar now optimized for narrow spaces (200px)
13978- **Improved:** Perfect for dashboards, page sidebars, and quick glance widgets
13979
13980### New Features:
13981- Clock updates every second showing current time
13982- Week grid shows Mon-Sun with colored event bars
13983- Today/Tomorrow sections show full event details
13984- Important events highlighted in purple (configurable namespaces)
13985- All badges (conflict, time, etc.) shown in compact format
13986- Automatic time conflict detection
13987
13988## Version 3.8.0 (2026-02-05) - PRODUCTION CLEANUP
13989- **Removed:** 16 unused/debug/backup files
13990- **Removed:** 69 console.log() debug statements
13991- **Removed:** 3 orphaned object literals from console.log removal
13992- **Removed:** Temporary comments and markers
13993- **Fixed:** JavaScript syntax errors from cleanup
13994- **Improved:** Code quality and maintainability
13995- **Improved:** Reduced plugin size by removing unnecessary files
13996- **Status:** Production-ready, fully cleaned codebase
13997
13998### Files Removed:
13999- style.css.backup, script.js.backup
14000- admin_old_backup.php, admin_minimal.php, admin_new.php, admin_clean.php
14001- debug_events.php, debug_html.php, cleanup_events.php
14002- fix_corrupted_json.php, fix_wildcard_namespaces.php
14003- find_outlook_duplicates.php, update_namespace.php
14004- validate_calendar_json.php, admin.js
14005- test_date_field.html
14006
14007## Version 3.7.5 (2026-02-05)
14008- **Fixed:** PHP syntax error (duplicate foreach loop removed)
14009- **Fixed:** Time variable handling in grace period logic
14010
14011## Version 3.7.4 (2026-02-05)
14012- **Added:** 15-minute grace period for timed events
14013- **Changed:** Events with times now stay visible for 15 minutes after their start time
14014- **Changed:** Prevents events from immediately disappearing when they start
14015- **Improved:** Better user experience for ongoing events
14016- **Fixed:** Events from earlier today now properly handled with grace period
14017
14018## Version 3.7.3 (2026-02-05)
14019- **Changed:** Complete redesign of cleanup section for compact, sleek layout
14020- **Changed:** Radio buttons now in single row at top
14021- **Changed:** All options visible with grayed-out inactive states (opacity 0.4)
14022- **Changed:** Inline controls - no more grid layout or wrapper boxes
14023- **Changed:** Namespace filter now compact single-line input
14024- **Changed:** Smaller buttons and tighter spacing throughout
14025- **Improved:** More professional, space-efficient design
14026
14027## Version 3.7.2 (2026-02-04)
14028- **Fixed:** Strange boxes under cleanup options - now properly hidden
14029- **Changed:** Unified color scheme across all admin sections
14030- **Changed:** Green (#00cc07) - Primary actions and main theme
14031- **Changed:** Orange (#ff9800) - Warnings and cleanup features
14032- **Changed:** Purple (#7b1fa2) - Secondary actions and accents
14033- **Improved:** Consistent visual design throughout admin interface
14034
14035## Version 3.7.1 (2026-02-04)
14036- **Fixed:** Cleanup section background changed from orange to white
14037- **Fixed:** Event cleanup now properly scans all calendar directories
14038- **Added:** Debug info display when preview finds no events
14039- **Improved:** Better directory scanning logic matching other features
14040
14041## Version 3.7.0 (2026-02-04)
14042- **Added:** Event cleanup feature in Events Manager
14043- **Added:** Delete old events by age (months/years old)
14044- **Added:** Delete events by status (completed tasks, past events)
14045- **Added:** Delete events by date range
14046- **Added:** Namespace filter for targeted cleanup
14047- **Added:** Preview function to see what will be deleted
14048- **Added:** Automatic backup creation before cleanup
14049- **Changed:** Reduced changelog viewer height to 100px (was 400px)
14050
14051## Version 3.6.3 (2026-02-04)
14052- **Fixed:** Conflict tooltips now work properly after navigating between months
14053- **Added:** Changelog display in Update Plugin tab
14054- **Added:** CHANGELOG.md file with version history
14055- **Improved:** Changelog shows last 10 versions with color-coded change types
14056- **Fixed:** Removed debug console.log statements
14057
14058## Version 3.6.2 (2026-02-04)
14059- **Fixed:** Month title now updates correctly when navigating between months
14060- **Changed:** All eventpanel header elements reduced by 10% for more compact design
14061- **Changed:** Reduced header height from 78px to 70px
14062
14063## Version 3.6.1 (2026-02-04)
14064- **Changed:** Complete redesign of eventpanel header with practical two-row layout
14065- **Fixed:** Improved layout for narrow widths (~500px)
14066- **Changed:** Simplified color scheme (removed purple gradient)
14067
14068## Version 3.6.0 (2026-02-04)
14069- **Changed:** Redesigned eventpanel header with gradient background
14070- **Changed:** Consolidated multiple header rows into compact single-row design
14071
14072## Version 3.5.1 (2026-02-04)
14073- **Changed:** Moved event search bar into header row next to + Add button
14074- **Improved:** More compact UI with search integrated into header
14075
14076## Version 3.5.0 (2026-02-04)
14077- **Added:** Event search functionality in sidebar and eventpanel
14078- **Added:** Real-time filtering as you type
14079- **Added:** Clear button (✕) appears when searching
14080- **Added:** "No results" message when search returns nothing
14081
14082## Version 3.4.7 (2026-02-04)
14083- **Changed:** Made conflict badges smaller and more subtle (9px font, less padding)
14084- **Fixed:** Removed debug logging from console
14085- **Changed:** Updated export version number to match plugin version
14086
14087## Version 3.4.6 (2026-02-04)
14088- **Added:** Debug logging to diagnose conflict detection issues
14089- **Development:** Extensive console logging for troubleshooting
14090
14091## Version 3.4.5 (2026-02-04)
14092- **Added:** Debug logging to showDayPopup and conflict detection
14093- **Development:** Added logging to trace conflict detection flow
14094
14095## Version 3.4.4 (2026-02-04)
14096- **Fixed:** Conflict detection now persists across page refreshes (PHP-based)
14097- **Fixed:** Conflict tooltips now appear on hover
14098- **Added:** Dual conflict detection (PHP for initial load, JavaScript for navigation)
14099- **Added:** Conflict badges in both future and past events sections
14100
14101## Version 3.4.3 (2026-02-04)
14102- **Added:** Custom styled conflict tooltips with hover functionality
14103- **Changed:** Conflict badge shows count of conflicts (e.g., ⚠️ 2)
14104- **Improved:** Beautiful tooltip design with orange header and clean formatting
14105
14106## Version 3.4.2 (2026-02-04)
14107- **Fixed:** Attempted to fix tooltip newlines (reverted in 3.4.3)
14108
14109## Version 3.4.1 (2026-02-04)
14110- **Fixed:** End time field now properly saves to database
14111- **Fixed:** End time dropdown now filters to show only valid times after start time
14112- **Added:** Smart dropdown behavior - expands on focus, filters invalid options
14113- **Improved:** End time auto-suggests +1 hour when start time selected
14114
14115## Version 3.4.0 (2026-02-04)
14116- **Added:** End time support for events (start and end times)
14117- **Added:** Automatic time conflict detection
14118- **Added:** Conflict warning badges (⚠️) on events with overlapping times
14119- **Added:** Conflict tooltips showing which events conflict
14120- **Added:** Visual conflict indicators with pulse animation
14121- **Changed:** Time display now shows ranges (e.g., "2:00 PM - 4:00 PM")
14122
14123## Version 3.3.77 (2026-02-04)
14124- **Fixed:** Namespace badge onclick handlers restored after clearing filter
14125- **Fixed:** Namespace filtering works infinitely (filter → clear → filter)
14126
14127## Version 3.3.76 (2026-02-04)
14128- **Fixed:** Namespace badges now clickable after clearing namespace filter
14129
14130## Version 3.3.75 (2026-02-04)
14131- **Fixed:** Form resubmission warnings eliminated
14132- **Improved:** Implemented proper POST-Redirect-GET pattern with HTTP 303
14133- **Changed:** All admin redirects now use absolute URLs
14134
14135## Version 3.3.74 (2026-02-04)
14136- **Fixed:** Clearing namespace filter now restores original namespace instead of default
14137- **Added:** data-original-namespace attribute to preserve initial namespace setting
14138- **Improved:** Console logging for namespace filter debugging
14139
14140## Version 3.3.73 (2026-02-03)
14141- **Added:** Dynamic namespace filtering banner with clear button
14142- **Fixed:** JavaScript function accessibility issues
14143- **Fixed:** Namespace badge click handlers in event lists
14144- **Improved:** Persistent namespace filtering across views
14145
14146## Earlier Versions
14147See previous transcripts for complete history through v3.3.73, including:
14148- Recurring events with Outlook sync
14149- Multi-namespace support
14150- Event categories and mapping
14151- Backup/restore functionality
14152- System statistics bar
14153- Namespace selector with fuzzy search
14154- Events Manager with import/export
14155- And much more...
14156