v0.2.2
Pre-release
Pre-release
·
134 commits
to main
since this release
Axis Browser v0.2.2
Tab dragging and reorder (sidebar tabs)
- Smoother drag-and-reorder of vertical sidebar tabs with less jank.
- Fixed incorrect transforms / visual state on inactive tabs during drag.
- Eliminated “teleport” or snapping issues when dropping near the bottom of the list.
- Improved easing and continuity so reordering feels closer to native list behavior.
macOS window controls (traffic lights)
- Kept traffic-light cluster aligned with the in-window UI (URL bar / chrome) with symmetric insets.
- Shared
MACOS_TRAFFIC_LIGHT_INSET(16px) for consistent distance from the window edge on both sides. - When the sidebar is docked on the right, traffic lights mirror to the top-right using
MACOS_TRAFFIC_LIGHT_CLUSTER_WIDTH_RIGHTso placement stays correct after resize. - Main process positions lights via
positionMacTrafficLights/attachMacTrafficLightResize; renderer syncs layout when sidebar position toggles (setSidebarTrafficLayout/syncMacOSTrafficLayout).
macOS menu bar (native application menu)
Built in createMenu() so the menu bar matches the app’s shortcuts (createMenu() reads getShortcuts() and is re-run when keyboard shortcuts are saved, so accelerators stay in sync with Settings).
- macOS app menu (first menu, uses
app.name): About, Settings… (user-defined accelerator, defaultsCmd+,), Services, Hide / Hide Others / Unhide, Quit (Cmd+Q) with the native quit confirmation path when a main window exists. - File: New Tab, Close Tab, Reopen Closed Tab, History, Downloads, Quit — all
clickhandlers forward to the renderer viabrowser-shortcutsend(e.g.new-tab,close-tab,recover-tab,history,downloads). Windows/Linux also get New Window, New Incognito Window, and a Quit variant appropriate to those platforms; macOS keeps New Window / Incognito under Window instead. - Edit: Standard
roleitems (Undo, Redo, Cut, Copy, Paste), plus Find in Page (shortcut from settings, defaultCmd/Ctrl+F). Settings… appears here on non-macOS only (macOS uses the app menu). - View: Reload Page (user shortcut, default
Cmd/Ctrl+R), Force Reload Window, Toggle Developer Tools, Actual Size / Zoom In / Zoom Out (reset, in, out — defaultsCmd+0,Cmd+=,Cmd+-), Toggle Sidebar (Cmd/Ctrl+Bby default), Toggle Chat (Cmd/Ctrl+Shift+Eby default), Enter Full Screen. - Window (macOS): New Window (
Shift+Cmd+N), New Incognito Window (Alt+Cmd+N), standard Minimize and Zoom, Bring All to Front, Close Window, Close All (Alt+Cmd+W). - Dock menu (macOS
app.dock.setMenu): quick actions New Window and New Incognito Window alongside the default dock behavior.
Sidebar: docked collapse animation and edge “peek” overlay
Docked hide (toggle sidebar) — #sidebar.hidden
- Does not use
display: none: the bar staysdisplay: flexso width / opacity / margins can animate (~0.36s, custom cubic ease) whilepointer-eventsare disabled andvisibilityflips after the transition (avoids “invisible but still wide” and stray focus). - Toggling the sidebar clears
slide-out/slide-out-closingand inline animation so hover-peek state never leaks into the normal docked bar. - macOS traffic lights:
setWindowButtonVisibilityfollows sidebar visibility (hidden vs visible).
Edge peek when the sidebar is hidden
- A thin
#sidebar-hover-areastrip (fixed, left or right depending on#main-area.sidebar-right) only accepts pointer events while#sidebar.hidden; hover reveals the sidebar as a fixed full-height overlay (#sidebar.slide-out). - Reveal:
--sidebar-reveal-widthpreserves the last docked width (clamped 200–500px); slide-in keyframes ~0.28s (translate from off-screen + opacity). Left-docked uses slide from left; right-docked uses mirrored slide from right (sidebarSlideInLeft/sidebarSlideInRight). - Hide overlay:
slide-out-closingruns slide-out animation ~0.22s; onanimationend(with a timeout fallback) cleanup removes overlay classes and temporarily setstransition: noneon the sidebar so the flex column does not re-run the docked width easing and twitch the webview. - Dismiss peek when the pointer leaves the hover strip and sidebar (timed ~280ms), or on click outside the overlay / hover strip.
- Overlay uses elevated
z-index, backdrop-style--sidebar-slide-out-background, blur, and side-appropriate box-shadow; light theme swaps slide-out background viabody.light-theme. - Sidebar context menu (native): items such as New tab, New incognito tab, New tab group, Toggle sidebar, and Move sidebar left/right stay wired through the same
sidebar-context-menu-action/ renderer flows as the menu bar.
Right-docked sidebar: webview card and URL bar
- Matched the rounded webview + top bar treatment to the left-sidebar layout.
- Full-card rounding on
#single-view:border-radius: 6pxon all four corners (not only the window side), so empty / new-tab and web content no longer show square corners on the seam toward the sidebar. - Clipping:
#single-viewusesoverflow: hiddenandisolation: isolatebecause.webview-container::afteris used for the loading spinner (the old full-bleed::aftercorner mask no longer covers the shell). - Inner layers under right-sidebar mode force flat radii on webviews / containers so they don’t fight the spinner
::afterclipping. - Themed URL bar under right-sidebar:
border-radius: 6px 6px 0 0(both top corners).
Right-docked sidebar: top bar hit-testing (URL bar buttons)
- Fixed hover and clicks on URL bar controls (back, forward, reload, omnibox, etc.) when the sidebar is on the right: the stack felt “dead” unless the pointer was exactly on an edge.
- Cause:
isolation: isolateon#single-viewtrapped descendantz-index, so the webview stack no longer sat above#content-area::before(the draggable top strip atz-index: 1). - Fix:
#main-area.sidebar-right #single-viewnow usesz-index: 2so the whole card (including the URL bar) stacks above the drag strip while keeping isolation for clipping.
Incognito: Dock and window title (active page name)
- Dock / “Windows” list and native window title now update with the current page title in incognito windows, same as regular windows.
- Cause: the incognito BrowserWindow had put the entire shell (including preload) on the private
incognitosession; that breaks the same IPC/window wiring path used forset-window-titlevs normal windows. - Fix: shell uses the default session like a normal window; only
<webview partition="incognito">uses the private session.incognitoSessionis still cleared when the incognito window closes. - Renderer always drives the title via existing
updateTabTitle→setWindowTitle:- Uses
getActiveWebview()(with fallback) so the title matches the active tab’s webview. switchToTabcallsupdateTabTitle()so the native title updates when changing tabs.- Placeholder / empty states use
Axis — Incognitoinstead ofAxis Browserwhere appropriate.
- Uses
- Default
BrowserWindowtitle for new incognito windows set toAxis — Incognitofor consistency before the first navigation.
Incognito: black seam between sidebar and webview (“resize line leaking”)
- First pass: seam-side border-radius +
overflow: hiddenon#sidebarso the resize handle and corners don’t paint into the webview’s rounded card (left vs right sidebar variants). - Second pass (full-height black strip): incognito forces pure black on the sidebar while
#sidebarstays atz-index: 1000and negative margins (sidebarmargin-right: -8px,.webview-containermargin-left: -1px, and the mirrored values when the sidebar is on the right) pull the sidebar on top of the webview, producing a tall black band—not just the resize control. - Fix for incognito only: cancel those negative margins so the sidebar and webview meet edge-to-edge without stacking overlap:
- Left sidebar:
margin-right: 0on#sidebar,margin-left: 0on.webview-container. - Right sidebar:
margin-left: 0on#sidebar,margin-right: 0on.webview-container.
- Left sidebar:
- Keeps the rounded + clipped sidebar treatment for incognito so corners stay clean.
In-app popovers: Find (Cmd+F), Downloads, and Zoom
These three surfaces share a unified “glass” chrome so the browser feels consistent: near-black translucent panels, soft blur, light hairline borders, and depth from shadow—rather than flat toolbox windows.
Find in page (Cmd+F) — .search-modal
- Placement: Fixed under the themed URL bar (
topderived from content padding + bar height + gap), upper-right over the page so it reads as part of the chrome stack, not a centered dialog. - Shell:
rgba(10, 10, 12, 0.86)fill,backdrop-filterblur (~20px) with boosted saturation,1pxborder atrgba(255, 255, 255, 0.09),12pxcorner radius, and a soft drop shadow for separation from the webview. - Layout: Compact horizontal bar—min width 220px, max width capped to viewport—matching a toolbar density rather than a full search panel.
- Field: Dark
#1a1a1ainput, subtle border,10pxradius, light inset shadow for a recessed field; Prev / Next / Close as 24×24 icon buttons with 8px rounded hit targets and hover wash.
Downloads popup — .downloads-popup
- Shell aligned with Find: Same glass formula (
rgba(10, 10, 12, 0.86), blur/saturation, border, shadow); codebase explicitly calls out parity with the Cmd+F shell (comments reference.search-modal). - Shape: Slightly larger corner radius (16px) and a wider default footprint (248–340px) so lists and thumbnails breathe.
- Motion: Enter/exit uses opacity, scale (~0.97→1), and a short vertical shift for a quick, menu-like feel (unlike an OS modal).
- Header row: Title + icon with a pill-shaped “Clear” control (full-radius button, muted fill, stronger hover).
- List: Tight vertical rhythm, thumbnail + filename + time rows, per-row “Show in Finder” affordance on hover, type-tinted thumbnail wells (image, video, PDF, etc.), and a minimal 4px scrollbar that stays unobtrusive.
- Footer: Primary action to open the Downloads folder as a full-width style strip consistent with the panel.
- Drag out for upload / attach: Each download row is draggable; starting a drag kicks off a native OS file drag (main
start-file-drag) so you can drop the file onto pages, compose windows, or other apps—cacheDragIconspre-warms thumbnail ghosts for a smoother drag affordance.
Zoom indicator — .zoom-indicator / .zoom-content
- Same visual DNA as Cmd+F: Matching glass block (
rgba(10, 10, 12, 0.86), same border,12pxradius, blur, shadow). - Placement: Top-right overlay (
top~42px,right16px) so zoom feedback sits near window controls / URL chrome without covering the center of the page. - Behavior: No enter/exit transform—only opacity toggles—so zoom level reads as fleeting HUD feedback, not a second modal.
- Content: Icon + percentage in a compact horizontal chip with emphasized numeric weight for the zoom value.
Security
- picomatch (transitive via electron-builder → tinyglobby, etc.): pinned to 4.0.4 for CVE-2024-38672 / GHSA-3v7f-55p6-f55p (moderate — method injection affecting POSIX glob matching). Direct
devDependencyat4.0.4so the tree dedupes to a single patched version;overrides.picomatchis set for npm versions that apply overrides.
Full Changelog: v0.2.1...v0.2.2