Skip to content

v0.2.4

Pre-release
Pre-release

Choose a tag to compare

@AbdelrahmanBerchan AbdelrahmanBerchan released this 10 Apr 12:43
· 117 commits to main since this release
c48b6e1

Axis Browser v0.2.4

Dependencies

  • lodash 4.17.23 → 4.18.1 (devDependency; aligns with security-focused Dependabot-style bump).

Shell / desktop luminosity

  • Much more light through the chrome: Default --background-color tint, sidebar, main area, and slide-out panels use lower rgba alphas and lighter backdrop blur (~26–28px instead of heavy frosting) so wallpaper and ambient desktop light read clearly. Transparent-sites URL bar and new-tab frosted blocks match the same thinner glass.
  • Settings ▸ Window glass brightness (windowChromeLight, 0–100): Opaque on the left, most light / most transparent on the right (the previous maximum), 50 = default (blend). Drives tint alphas, backdrop blur, and transparent-mode URL bar / new-tab glass via getShellChromeStyle() and :root CSS variables (--axis-ts-*, --axis-nt-*). Slider 0 now means actually solid chrome (alpha 1, no backdrop blur) — not the old partly translucent “opaque” blend. macOS: applyMainWindowVibrancyFromStore() calls setVibrancy(null) at 0 so the desktop doesn’t show through the window. Settings UI: value / caption above the slider; range control back to the original width (140px / 40vw).
  • Gradient + glass opacity: Theme gradients now always resolve the second stop from settings.gradientColor when colors.gradientColor is missing (webpage theme, empty-state fallbacks), and --primary-gradient uses the same translucent multi-stop gradient as --background-color / #app ( glassAlpha, not opaque hex). hexToRgba accepts rgb() / rgba() inputs for picker values.

Sidebar

  • Fixed “+ New Tab” — label contrast: The label uses a slightly darker, greyer color (#95979f, light theme #575a62) than inactive tab titles so the row reads as a control, not a normal tab.
  • Fixed “+ New Tab” — icon + hover: The plus icon matches that same muted color (full opacity, no separate dimming). Hover only adjusts the row background; text and icon no longer brighten toward white / primary text.
  • Double-click a tab to rename: dblclick on a sidebar tab row runs the same inline rename as Rename Tab in the context menu (setupTabEventListenersrenameTab). Close and audio controls are excluded. Tab drag no longer uses preventDefault / stopPropagation on every mousedown (that blocked dblclick); .tab uses user-select: none, and input.tab-title restores text selection while editing.
  • Rename tab — Escape: Escape cancels inline rename, restores the title text that was shown when editing started, and does not change tab.title / tab.customTitle. Enter / blur still commit.
  • Middle-click tab to close: Wheel / middle button on a tab row (auxclick, button 1) calls closeTab; mousedown middle preventDefault avoids autoscroll.

AI chat panel

  • Fixed dark chrome: Chat sidebar tokens (--chat-panel-bg / text / border) are always black + light text via applyChatPanelTheme(urlBar); they no longer follow page brightness or URL bar isDark (which made text illegible on light pages).

Transparent sites (glass mode)

  • Tab bleed-through / multi-webview blend: Background <webview>s are always fully hidden (opacity: 0, visibility: hidden) for both transparent glass mode and normal mode. The former 0.3 inactive stack in non-glass mode caused Chromium to composite multiple guests so other tabs (e.g. YouTube) showed through the active page. CSS still reinforces glass mode; the empty-window placeholder alone keeps the dim 0.3 frame.
  • Tab switch / toggle stability: switchToTab runs _prepareWebviewsForTabSwitch so every non-target webview is forced inactive before the active tab paints. applyTransparentSitesToAllWebviews hides background webviews first, injects transparency on the active tab immediately, and defers background tabs with requestIdleCallback. Settings updates sync background webviews before theme when transparent mode is on. updateEmptyState reapplies the full shell theme only when leaving the empty (no-tab) state, not on every tab change, to avoid blur recomputation lag.
  • Empty window (no tabs) — webview frame: With transparent sites on and no tabs open, the dimmed inactive webview glass outline (placeholder #webview / ::before) stays visible, same idea as non-transparent mode (~0.3 opacity). body.chrome-no-tabs plus updateEmptyState stop treating the empty case like a multi-tab stack (no forced opacity: 0 / visibility: hidden on placeholders; CSS restores ::before for inactive webviews under #webviews-container).
  • Where it applies: Injected stylesheet now clears html / body and common SPA roots (#root, #app, #__next, Nuxt / Vue hooks, main#main, etc.), fixing pages that paint the real background on a shell, not on body.
  • YouTube + Google: --yt-spec-* tokens on html / ytd-app (they inherit into shadow DOM) plus ytd-* host rules. Google adds #viewport, #center_col, #rso, #islsp, etc. An in-page script !important-clears known wrapper ids and [role="main"], with a debounced MutationObserver for late DOM (image grid, hydration).
  • Any site — opaque-layer sweep: After site-specific hooks, an requestIdleCallback pass walks the light DOM (up to ~6500 nodes), finds large rectangles whose computed background-color is mostly opaque, and clears them—covering obfuscated wrappers no static list can name. Skipped: ytd-* / yt-* hosts (tokens handle those), media / form controls, and modal/dialog subtrees. CSS also clears header / footer / role=banner shells. Patch namespace is __axisTransparentV4 (idle + sweep timers cleaned up when the feature is off).
  • Lifecycle: Re-applies on load-commit (main frame), dom-ready, did-finish-load, did-navigate, did-navigate-in-page, with debounced follow-ups (~100 / 420 / 1400 ms) so hydrated SPAs still get the rules after frameworks attach. DOM patch runs after each successful insertCSS; turning the feature off runs cleanup so the observer is disconnected.
  • Internals: Skips about:blank, axis:, file:, and chrome-error: / devtools so settings and similar pages are not stripped to transparency.
  • New tab page: The axis://newtab UI is in-app HTML (not a webview). With transparent sites on, body.transparent-sites-mode makes .new-tab-page transparent and the search shell / mode toggle / Ask row use frosted glass. The tab’s webview stays hidden while the overlay is open so you see shell theme instead of about:blank; toggling the setting mid–new-tab syncs that behavior via syncTransparentSitesUi.
  • New tab URL bar: While on new tab, the top bar is #000 (not user theme / gradient). With transparent sites on, it uses the same frosted tint and blur as the new-tab search shell (applyNewTabPageUrlBarStyle / --axis-nt-search-bg), not the themed URL bar used on normal pages.

Settings window (settings.html)

  • Layout: Left nav no longer scrolls with the main panehtml/body are height: 100% with overflow: hidden, main.main gets min-height: 0 and exclusive vertical scroll; the sidebar stays in a fixed column (overflow-y: auto only if nav items exceed the window). The in-tab settings webview template in renderer.js uses the same flex min-height: 0 pattern so .settings-main scrolls independently of .settings-sidebar.

Ambient audio (quality + volume)

  • Volume curve: Slider mapping now uses a gentler perceptual curve with a lower maximum gain (~0.26 effective ceiling vs the old linear × 0.55), so the layer stays a background bed and high percentages are not harsh.
  • Defaults: New default volume 48% (was 35%) so typical loudness stays pleasant after the rescale; settings copy notes the calibration.
  • Sound: Pink noise for rain and wind (smoother than raw white); longer buffers (~3.5–4s) plus loop crossfade at buffer edges to reduce seam artifacts; slightly softened brown rumble; ocean lowshelf boost reduced for less boom.
  • DSP chain: Light dynamics compressor after the master gain to tame peaks; per-preset level moved to a trim gain so live volume updates stay consistent (focus / night still no longer diverge after slider moves).

Full Changelog: v0.2.3...v0.2.4

Screen.Recording.2026-04-10.at.3.08.14.PM.mp4