Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
26 commits
Select commit Hold shift + click to select a range
e1bd19d
feat(site-controls): a section registry, so other features add rows t…
siyabendoezdemir Oct 11, 2026
3ff0afe
WIP: Tweaks item 1 (BO-01, BO-02, BO-18) in progress, before merging …
siyabendoezdemir Oct 11, 2026
1ccdbad
Merge origin/main (PR #27, pages) into lane/tweaks
siyabendoezdemir Oct 11, 2026
b7a762f
feat(tweaks): every entry point opens the Tweak editor over the page;…
siyabendoezdemir Oct 11, 2026
73eb3f9
Merge origin/main (PR #28, sign-off feel marks) into lane/tweaks
siyabendoezdemir Oct 11, 2026
521f4fc
docs(tweaks): D40 entry for the Tweak sheet channel; BO-01/02/18 stat…
siyabendoezdemir Oct 11, 2026
ebee412
feat(tweaks): CSS and JavaScript in the editor, scope and site switch…
siyabendoezdemir Oct 11, 2026
9a5cb07
feat(tweaks): the no-code controls: colour wheel, invert, sliders, fo…
siyabendoezdemir Oct 11, 2026
3f6bad0
feat(tweaks): the Library's Tweaks and the switch for all of them (BO…
siyabendoezdemir Oct 11, 2026
d2e22b1
Merge origin/main (PR #29) into lane/tweaks; regenerate FEATURES.md
siyabendoezdemir Oct 11, 2026
2c92ed3
fix(tweaks): first-paint sheets the page can't read, drop or outrank,…
siyabendoezdemir Oct 11, 2026
41c1a2b
fix(tweaks): a Mini Window's page takes no Tweak, and its Tweak keys …
siyabendoezdemir Oct 11, 2026
fb99d3a
fix(tweaks): the Library's Edit stops waiting as the site's load fail…
siyabendoezdemir Oct 11, 2026
7ffe605
style(tweaks): the panel and its menus open on FL-01's snappy token, …
siyabendoezdemir Oct 11, 2026
bc5194d
test(tweaks): BO-03's drag also counts the edits main takes, one a mo…
siyabendoezdemir Oct 11, 2026
46a87d9
docs(tweaks): notes and the Settings text say what is true after fix …
siyabendoezdemir Oct 11, 2026
18fec3d
fix(tweaks): a pass for an old document never holds up the new one; a…
siyabendoezdemir Oct 11, 2026
1d6957f
feat(tweaks): Hide mode asked for while the page loads shows at once …
siyabendoezdemir Oct 11, 2026
829a737
docs(tweaks): BO-10 says how Hide mode starts on a page still loading…
siyabendoezdemir Oct 11, 2026
ee76269
docs(architecture): a Tweak change waits only while its document is t…
siyabendoezdemir Oct 11, 2026
8ac1585
fix(tweaks): a Hide mode start ends with a document that a navigation…
siyabendoezdemir Oct 11, 2026
db7354c
test(tweaks): BO-02's size check measures the panel once its opening …
siyabendoezdemir Oct 11, 2026
8d3201a
Merge origin/main (PR #31, finish-tabs) into lane/tweaks
siyabendoezdemir Oct 11, 2026
80748ac
fix(tweaks): fix round 3: a Mini Window's Tweak notes go where the Li…
siyabendoezdemir Oct 11, 2026
20300e2
test(tweaks): the late-key test names the first frame that lost the T…
siyabendoezdemir Oct 11, 2026
86dcc5e
test(tweaks): the late-key test waits for the page that came back, no…
siyabendoezdemir Oct 11, 2026
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
50 changes: 25 additions & 25 deletions FEATURES.md

Large diffs are not rendered by default.

6 changes: 4 additions & 2 deletions docs/ARCHITECTURE.md

Large diffs are not rendered by default.

21 changes: 20 additions & 1 deletion docs/feature-status.json

Large diffs are not rendered by default.

6 changes: 5 additions & 1 deletion src/main/miniwindow/index.ts
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,7 @@ import { existsSync } from 'node:fs'
import { join } from 'node:path'
import { app, BrowserWindow, globalShortcut, Menu, nativeTheme, screen, type WebContents } from 'electron'
import { toElectronAccelerator } from '../../shared/actions'
import { TWEAK_ACTIONS } from '../../shared/commands/tweaks'
import { createWindowState } from '../../shared/defaults'
import { newId } from '../../shared/ids'
import { routeFor } from '../../shared/link-routing'
Expand Down Expand Up @@ -944,7 +945,9 @@ export function registerMiniWindow(ctx: MainContext): void {

// In a Mini Window, keys act on its page; sidebar, Space and tab-list keys do nothing (KS-20).
// Help → Keyboard Shortcuts, File → Open File… and the Library's keys (⌘Y / Ctrl+H for History,
// ⌘⇧L) act in the browser window behind (OB-12, KS-12, AR-10, keys lane).
// ⌘⇧L) act in the browser window behind (OB-12, KS-12, AR-10, keys lane). So do the Tweak
// actions' own handlers (BO-21): View Tweaks opens the Library there, and the others say there
// why a Mini Window's page takes no Tweak (BO-01; tweaks review F7).
const APP_ACTIONS = new Set([
'window.new',
'window.newBlank',
Expand All @@ -956,6 +959,7 @@ export function registerMiniWindow(ctx: MainContext): void {
'app.library',
'help.shortcuts',
'file.open',
...TWEAK_ACTIONS.map((a) => a.id),
])
actions.intercept((id, c) => {
const mini = miniOf(c)
Expand Down
4 changes: 3 additions & 1 deletion src/main/persist.ts
Original file line number Diff line number Diff line change
Expand Up @@ -18,6 +18,7 @@ import { withoutPrivate } from '../shared/private'
import type { ItemId, OrbitState, ProfileId, Space, SpaceId, SplitLayout, TabId } from '../shared/state'
import { STATE_SCHEMA } from '../shared/state'
import { normalizeSpaceTheme } from '../shared/theme'
import { normalizeTweakSettings, normalizeTweaks } from '../shared/tweaks'
import { fallbackTitle } from '../shared/url'
import { normalizeKeySettings } from './keys/bindings'
import { normalizeSettingsPrefs } from './settings/normalize'
Expand Down Expand Up @@ -103,10 +104,11 @@ export function normalizeState(input: Partial<OrbitState>): OrbitState {
archive: Array.isArray(input.archive) ? input.archive.filter(isRecord) : [],
settings: { ...DEFAULT_SETTINGS, ...(isRecord(input.settings) ? input.settings : {}) },
downloads: record(input.downloads),
tweaks: record(input.tweaks),
tweaks: normalizeTweaks(input.tweaks),
}
if (!['system', 'light', 'dark'].includes(state.settings.appearance)) state.settings.appearance = 'system'
normalizeMediaSettings(state.settings, Date.now())
normalizeTweakSettings(state.settings)
seedAppearanceFromOldThemes(state)
normalizeEntities(state, base)
// Site searches (CB-11): keep well-formed http(s) entries; a missing list gets the defaults.
Expand Down
5 changes: 4 additions & 1 deletion src/main/tabs/commands.ts
Original file line number Diff line number Diff line change
Expand Up @@ -32,6 +32,7 @@ import { onGesture } from '../pages/gestures'
import type { CallContext } from '../registry'
import { registerSpaceOrderUndo } from '../spaces/order-undo'
import { tabSplitMenuItems } from '../split/menu'
import { TWEAK_TAB_MENU_KEYS, tabTweakMenuItems } from '../tweaks/menu'
import { registerBlankWindows } from './blank'
import { registerLinkDrop } from './link-drop'
import { TabMaintenance } from './maintenance'
Expand Down Expand Up @@ -246,6 +247,7 @@ export function registerTabs(ctx: MainContext): { ops: TabOps; maintenance: TabM
pasteUrlInto: (folderId) => void pasteUrlAsTab(windowId, { kind: 'folder', folderId }),
deleteFolder: (folderId) => void confirmDeleteFolder(windowId, folderId),
splitItems: (tabIds) => tabSplitMenuItems(ctx, tabIds, windowId),
tweakItems: (tabId) => tabTweakMenuItems(ctx, tabId, windowId),
})

const rowMenus = registerRowMenus(ctx)
Expand Down Expand Up @@ -434,7 +436,8 @@ export function registerTabs(ctx: MainContext): { ops: TabOps; maintenance: TabM
const state = store.state
const mo = menuOps(windowId)
// Keys lane: an item that a key also does shows the key (KS-18).
const forTab = (tabId: TabId) => withKeyHints(tabMenu(state, tabId, selection, mo), TAB_MENU_KEYS)
const forTab = (tabId: TabId) =>
withKeyHints(tabMenu(state, tabId, selection, mo), [...TAB_MENU_KEYS, ...TWEAK_TAB_MENU_KEYS])
const all = isFolderId(id) ? folderMenu(state, id, mo) : isTabId(id) ? forTab(id) : []
// Private and blank windows have no pinned tabs, Favorites, folders or other Spaces (NV-11, SB-25, TB-17).
const own = isTabId(id) && (isPrivateTab(state, id) || isBlankSpace(state, state.tabs[id]?.spaceId))
Expand Down
3 changes: 3 additions & 0 deletions src/main/tabs/menus.ts
Original file line number Diff line number Diff line change
Expand Up @@ -32,6 +32,8 @@ export interface MenuOps {
deleteFolder(folderId: FolderId): void
/** Split View items for these tabs ("Open in Split View", SV-06/SV-09), from the split lane. */
splitItems?(tabIds: TabId[]): MenuItemConstructorOptions[]
/** "Tweak this Site…" for a tab (BO-01), from the tweaks lane. */
tweakItems?(tabId: TabId): MenuItemConstructorOptions[]
}

/** Folders of a Space's pinned area, depth-first, with indentation for the Move to menu. */
Expand Down Expand Up @@ -151,6 +153,7 @@ export function tabMenu(
{ label: 'Duplicate', click: () => ops.duplicate(tabId) },
...(ops.splitItems?.([tabId]) ?? []),
{ label: tab.muted ? 'Unmute Tab' : 'Mute Tab', click: () => ops.setMuted(tabId, !tab.muted) },
...(ops.tweakItems?.(tabId) ?? []),
{
label: 'Move to',
submenu: moveToMenu(state, [item], ops, { favoritesProfileId: section === 'favorite' ? undefined : profileId }),
Expand Down
Loading