Add _dead set to _IntrospectionCache to track paths that timeout.
Failed introspections are skipped on future lookups, reducing
timeout blocks from 300-500ms to near-zero.
Extract _create_system_menu and _create_title_menu factories.
Use ModusDropdown and dropdown_option for system menu.
Convert _build_gtk_menu_from_children to show_all.
Add _make_click_handler method, remove dead _has_extracted_menu.
Use logger.exception for all error logging.
Replace layer-shell AppletWindow-based dropdown with Gtk.Menu approach.
Adds hide signal for button state reset, dropdown_option factory,
append/clear methods, and popup_at_widget/popup aliases.
- Add secondary color and font-sm to app name
- Add font-xs timestamp style
- Add bottom margin to notification header
- Clean up summary and button-label selectors
- Show FlatScale slider (20-100%) next to charge limit toggle
- Display current threshold value as label
- Only rendered when sysfs charge_control path is detected
- Read charge_control_end/charge_control from /sys/class/power_supply/BAT*
- Store threshold value and sysfs path in ChargeLimit dataclass
- Fall back to UPower D-Bus when sysfs unavailable
- Remove opacity transition (Revealer handles visibility now)
- Bump min-size from 20px to 24px to match SwayNotificationCenter
- Zero padding for circular button appearance
- Use @glass-hover/@glass-active for consistent theme colors
- Replace CSS opacity toggle with Gtk.Revealer CROSSFADE for close button
- Add 80ms delayed hide to prevent race condition on boundary crossing
- Fix _refresh_group_widget to sync expanded list in-place instead of
destroy/recreate when group is expanded
- Scope show_all() to expanded_container only to prevent collapsed state
from becoming visible alongside expanded state
- Replace CSS opacity toggle with Gtk.Revealer CROSSFADE for close button
- Wrap close button in EventBox for reliable hover detection
- Add 80ms delayed hide to prevent race condition on boundary crossing
- Implement swipe-right-to-dismiss with _fixed.move() for smooth 60fps
- Skip SlideRevealer.hide() on swipe dismiss to prevent skeleton flash
- volume_scale/brightness_scale disconnect_by_func may fail if signals
were never connected (e.g. on first hide before resources init)
- Downgrade from error to silent pass
- Timeouts are expected for services without introspection support
- _dbus_get_pid and _dbus_introspect now log at debug level
- Cache already stores empty results; invalidation on service appear
causes retries which is correct behavior
- Replace system-search-symbolic with misc/search.svg
- Add _ICON_SVG_MAP for GTK theme to SVG path resolution
- Move all imports to top of file (fix E402)
- Replace GTK theme notifications icon with SVG
- Fix load_and_cache_theme_icon to use Gtk.IconTheme directly
instead of IconResolver (designed for app IDs, not theme names)
- Add suffix fallbacks for theme icon resolution