- JS: fix checkbox/radio required validation using .checked not .value
- JS: guard _cpTrigger.focus() with document.contains() check
- JS: add arrow/Home/End key navigation to tab groups (WCAG 2.1)
- JS: clamp context menu left edge with Math.max(8, ...) to prevent off-screen
- JS: fix wizard _show() to removeAttribute aria-hidden on active step
- HTML: add role="region" + aria-label to notification panel
- HTML: convert Assigned To span+div to label+select with for/id association
- HTML: add role="article" tabindex="0" aria-label to all kanban cards
- HTML: remove aria-hidden="false" anti-pattern from wizard active step
- CSS/HTML/JS: replace aria-hidden="false" show-hook with :not([aria-hidden])
so open state is represented by absent attribute rather than false value
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
- Fix duplicate function showToast declaration causing infinite recursion
(showToast declared twice → function hoisting → _origShowToast === self)
Progress bar now inlined directly into _displayToast; Module 47 removed
- Notification bell now opens a proper dropdown panel with unread items,
per-item click-to-read, "Mark all read", close on outside click/Esc
- Ticket detail drawer now has real editable fields (title, status,
priority, assignee, description textarea, comment box) instead of
read-only KV pairs; Save Changes and Post Comment buttons functional
- Advanced ▾ filter dropdown: status/priority/assignee selects + Apply/Reset
- Bulk Actions dropdown: Close/Reassign/Export/Delete with toast feedback
- Generic .lt-dropdown-trigger toggle system (works for any future dropdown)
- Add CSS sections 76 (notification panel) and 77 (dropdown widget + .lt-textarea)
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
- Fix lt.clipboard.init() → initCopyButtons() (crashed init handler
before context menu, split pane, lightbox, theme btn could register)
- Add lt.pagination module (Module 55) with ellipsis rendering,
prev/next, onChange callback; wire demo-pagination nav
- Upgrade lt.sortable for cross-list group dragging (shared module-level
drag state enables kanban card movement between columns)
- Wire kanban columns (open/pending/inprogress/closed) to lt.sortable
with group:'kanban' for drag-and-drop between columns
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
Root cause: two SyntaxErrors prevented the IIFE from completing,
meaning window.lt was never created and all features were broken.
Fixes applied:
1. CRITICAL: Renamed auth's apiFetch redeclaration → _apiFetchAuth
(duplicate function declaration in strict-mode IIFE = SyntaxError)
2. CRITICAL: Renamed toast queue vars (_toastQueue/_toastActive already
declared by original showToast in outer scope = SyntaxError)
Replaced heavy queue wrapper with lightweight progress-bar injector
3. timer.countdown: classList.add(urgentClass) throws on space-separated
class string — split/filter/forEach now used
4. contextMenu: _ctxItems declared as [] but used as string-keyed object
— changed to {}
5. Split pane divider: background was border-dim (7% opacity, invisible)
— raised to border-color (16%), added ::before hit-area expansion,
hover state uses accent-cyan for clear visual feedback
6. Light theme: html background-image was hardcoded cyan rgba, didn't
update with data-theme — added explicit html[data-theme="light"] rule
7. Light theme: .lt-header background was hardcoded rgba(3,5,8,0.96)
— added explicit light-mode override
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
- base.js: Fix boot sequence title centering — old formula was off by 1
char for odd-length app names (PULSE, GANDALF). Remove unused `bar`
variable. New logic computes left/right padding independently to
handle both even and odd title lengths correctly.
- node/middleware.js: Prune expired rate-limit entries from Map when
size exceeds 5000 to prevent unbounded memory growth. Also use
req.socket?.remoteAddress as fallback for req.ip.
- README.md: Document lt.beep() in the JS API section. Clarify Quick
Start to distinguish core files from platform-specific helpers.
Note that tableNav.init() and sortTable.init() require explicit calls.
- aesthetic_diff.md: Correct §8 toast icon format — base.js uses
bracketed symbols [✓][✗][!][i], not >> prefix as previously stated.
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
Unified CSS, JavaScript utilities, HTML template, and framework skeleton
files for Tinker Tickets (PHP), PULSE (Node.js), and GANDALF (Flask).
Includes aesthetic_diff.md documenting every divergence between the three
apps with prioritised recommendations for convergence.
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>