v0.2.4
Pre-release
Pre-release
·
117 commits
to main
since this release
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-colortint, 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 viagetShellChromeStyle()and:rootCSS 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()callssetVibrancy(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.gradientColorwhencolors.gradientColoris missing (webpage theme, empty-state fallbacks), and--primary-gradientuses the same translucent multi-stop gradient as--background-color/#app(glassAlpha, not opaque hex).hexToRgbaacceptsrgb()/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:
dblclickon a sidebar tab row runs the same inline rename as Rename Tab in the context menu (setupTabEventListeners→renameTab). Close and audio controls are excluded. Tab drag no longer usespreventDefault/stopPropagationon everymousedown(that blockeddblclick);.tabusesuser-select: none, andinput.tab-titlerestores 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) callscloseTab;mousedownmiddlepreventDefaultavoids autoscroll.
AI chat panel
- Fixed dark chrome: Chat sidebar tokens (
--chat-panel-bg/ text / border) are always black + light text viaapplyChatPanelTheme(urlBar); they no longer follow page brightness or URL barisDark(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:
switchToTabruns_prepareWebviewsForTabSwitchso every non-target webview is forced inactive before the active tab paints.applyTransparentSitesToAllWebviewshides background webviews first, injects transparency on the active tab immediately, and defers background tabs withrequestIdleCallback. Settings updates sync background webviews before theme when transparent mode is on.updateEmptyStatereapplies 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-tabsplusupdateEmptyStatestop treating the empty case like a multi-tab stack (no forced opacity: 0 / visibility: hidden on placeholders; CSS restores::beforefor inactive webviews under#webviews-container). - Where it applies: Injected stylesheet now clears
html/bodyand common SPA roots (#root,#app,#__next, Nuxt / Vue hooks,main#main, etc.), fixing pages that paint the real background on a shell, not onbody. - YouTube + Google:
--yt-spec-*tokens onhtml/ytd-app(they inherit into shadow DOM) plusytd-*host rules. Google adds#viewport,#center_col,#rso,#islsp, etc. An in-page script!important-clears known wrapper ids and[role="main"], with a debouncedMutationObserverfor late DOM (image grid, hydration). - Any site — opaque-layer sweep: After site-specific hooks, an
requestIdleCallbackpass walks the light DOM (up to ~6500 nodes), finds large rectangles whose computedbackground-coloris 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 clearsheader/footer/role=bannershells. 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:, andchrome-error:/ devtools so settings and similar pages are not stripped to transparency. - New tab page: The
axis://newtabUI is in-app HTML (not a webview). With transparent sites on,body.transparent-sites-modemakes.new-tab-pagetransparent 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 ofabout:blank; toggling the setting mid–new-tab syncs that behavior viasyncTransparentSitesUi. - 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 pane —
html/bodyareheight: 100%withoverflow: hidden,main.maingetsmin-height: 0and exclusive vertical scroll; the sidebar stays in a fixed column (overflow-y: autoonly if nav items exceed the window). The in-tab settings webview template inrenderer.jsuses the same flexmin-height: 0pattern so.settings-mainscrolls independently of.settings-sidebar.
Ambient audio (quality + volume)
- Volume curve: Slider mapping now uses a gentler perceptual curve with a lower maximum gain (~
0.26effective 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