Skip to content

v0.2.2

Pre-release
Pre-release

Choose a tag to compare

@AbdelrahmanBerchan AbdelrahmanBerchan released this 31 Mar 17:56
· 134 commits to main since this release
f4d0c31

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_RIGHT so 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, defaults Cmd+,), 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 click handlers forward to the renderer via browser-shortcut send (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 role items (Undo, Redo, Cut, Copy, Paste), plus Find in Page (shortcut from settings, default Cmd/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 — defaults Cmd+0, Cmd+=, Cmd+-), Toggle Sidebar (Cmd/Ctrl+B by default), Toggle Chat (Cmd/Ctrl+Shift+E by 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 stays display: flex so width / opacity / margins can animate (~0.36s, custom cubic ease) while pointer-events are disabled and visibility flips after the transition (avoids “invisible but still wide” and stray focus).
  • Toggling the sidebar clears slide-out / slide-out-closing and inline animation so hover-peek state never leaks into the normal docked bar.
  • macOS traffic lights: setWindowButtonVisibility follows sidebar visibility (hidden vs visible).

Edge peek when the sidebar is hidden

  • A thin #sidebar-hover-area strip (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-width preserves 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-closing runs slide-out animation ~0.22s; on animationend (with a timeout fallback) cleanup removes overlay classes and temporarily sets transition: none on 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 via body.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: 6px on 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-view uses overflow: hidden and isolation: isolate because .webview-container::after is used for the loading spinner (the old full-bleed ::after corner 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 ::after clipping.
  • 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: isolate on #single-view trapped descendant z-index, so the webview stack no longer sat above #content-area::before (the draggable top strip at z-index: 1).
  • Fix: #main-area.sidebar-right #single-view now uses z-index: 2 so 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 incognito session; that breaks the same IPC/window wiring path used for set-window-title vs normal windows.
  • Fix: shell uses the default session like a normal window; only <webview partition="incognito"> uses the private session. incognitoSession is still cleared when the incognito window closes.
  • Renderer always drives the title via existing updateTabTitlesetWindowTitle:
    • Uses getActiveWebview() (with fallback) so the title matches the active tab’s webview.
    • switchToTab calls updateTabTitle() so the native title updates when changing tabs.
    • Placeholder / empty states use Axis — Incognito instead of Axis Browser where appropriate.
  • Default BrowserWindow title for new incognito windows set to Axis — Incognito for consistency before the first navigation.

Incognito: black seam between sidebar and webview (“resize line leaking”)

  • First pass: seam-side border-radius + overflow: hidden on #sidebar so 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 #sidebar stays at z-index: 1000 and negative margins (sidebar margin-right: -8px, .webview-container margin-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: 0 on #sidebar, margin-left: 0 on .webview-container.
    • Right sidebar: margin-left: 0 on #sidebar, margin-right: 0 on .webview-container.
  • 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 (top derived 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-filter blur (~20px) with boosted saturation, 1px border at rgba(255, 255, 255, 0.09), 12px corner 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 #1a1a1a input, subtle border, 10px radius, 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—cacheDragIcons pre-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, 12px radius, blur, shadow).
  • Placement: Top-right overlay (top ~42px, right 16px) 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-buildertinyglobby, etc.): pinned to 4.0.4 for CVE-2024-38672 / GHSA-3v7f-55p6-f55p (moderate — method injection affecting POSIX glob matching). Direct devDependency at 4.0.4 so the tree dedupes to a single patched version; overrides.picomatch is set for npm versions that apply overrides.

Full Changelog: v0.2.1...v0.2.2

Screen.Recording.2026-03-31.at.8.13.20.PM.mov