├── .gitattributes
├── .github
├── scripts
│ ├── calculate_version.js
│ ├── create_github_release.js
│ └── process_changelog.js
└── workflows
│ ├── build.yml
│ └── published.yml
├── .gitignore
├── @types
├── aboutaddons.d.ts
├── addon.d.ts
├── autoReload.d.ts
├── bootstrap.d.ts
├── content.d.ts
├── custom.gecko.dom.d.ts
├── extraTabmixUtils.d.ts
├── gecko
│ ├── devtools
│ │ ├── gecko.d.ts
│ │ └── perf.d.ts
│ └── tools
│ │ ├── generated
│ │ ├── lib.gecko.darwin.d.ts
│ │ ├── lib.gecko.dom.d.ts
│ │ ├── lib.gecko.glean.d.ts
│ │ ├── lib.gecko.linux.d.ts
│ │ ├── lib.gecko.modules.d.ts
│ │ ├── lib.gecko.nsresult.d.ts
│ │ ├── lib.gecko.services.d.ts
│ │ ├── lib.gecko.win32.d.ts
│ │ └── lib.gecko.xpcom.d.ts
│ │ ├── index.d.ts
│ │ ├── lib.gecko.custom.d.ts
│ │ ├── lib.gecko.tweaks.d.ts
│ │ ├── lib.gecko.xpidl.d.ts
│ │ └── subs
│ │ └── PromiseWorker.d.ts
├── general.d.ts
├── index.d.ts
├── modules.d.ts
├── numberInput.d.ts
├── overrideGecko.d.ts
├── overrideGeckoDom.d.ts
├── preferences.d.ts
└── tabmix.d.ts
├── LICENSE.txt
├── README.md
├── addon
├── bootstrap.js
├── chrome.manifest
├── chrome
│ ├── content
│ │ ├── broadcaster.js
│ │ ├── click
│ │ │ ├── click.js
│ │ │ └── listeners.js
│ │ ├── extensions
│ │ │ └── extensions.js
│ │ ├── flst
│ │ │ └── lasttab.js
│ │ ├── links
│ │ │ ├── contentLinks.js
│ │ │ ├── setup.js
│ │ │ └── userInterface.js
│ │ ├── minit
│ │ │ ├── minit.js
│ │ │ └── tablib.js
│ │ ├── overlay
│ │ │ ├── autoReload.css
│ │ │ ├── autoReload.js
│ │ │ ├── autoReload.xhtml
│ │ │ ├── autoReload_properties.css
│ │ │ ├── browser.css
│ │ │ ├── browser_before_119.css
│ │ │ ├── multirow.css
│ │ │ ├── renameTab.xhtml
│ │ │ ├── tabContextMenu.xhtml
│ │ │ ├── tsconfig.json
│ │ │ └── zen_browser.css
│ │ ├── places
│ │ │ ├── places.js
│ │ │ └── places.xhtml
│ │ ├── preferences
│ │ │ ├── appearance.js
│ │ │ ├── appearance.xhtml
│ │ │ ├── checkbox_tmp-ce.js
│ │ │ ├── events.js
│ │ │ ├── events.xhtml
│ │ │ ├── incompatible.xhtml
│ │ │ ├── links.js
│ │ │ ├── links.xhtml
│ │ │ ├── menu.js
│ │ │ ├── menu.xhtml
│ │ │ ├── mouse.js
│ │ │ ├── mouse.xhtml
│ │ │ ├── numberinput.js
│ │ │ ├── overlay
│ │ │ │ ├── aboutaddons.js
│ │ │ │ └── aboutaddons.xhtml
│ │ │ ├── preferences.js
│ │ │ ├── preferences.xhtml
│ │ │ ├── prefs-ce.js
│ │ │ ├── session.js
│ │ │ ├── session.xhtml
│ │ │ ├── shortcuts-ce.js
│ │ │ ├── shortcuts.js
│ │ │ ├── subdialogs
│ │ │ │ ├── pref-appearance-ce.js
│ │ │ │ ├── pref-appearance.css
│ │ │ │ ├── pref-appearance.js
│ │ │ │ ├── pref-appearance.xhtml
│ │ │ │ ├── pref-filetype.js
│ │ │ │ └── pref-filetype.xhtml
│ │ │ └── tsconfig.json
│ │ ├── scripts
│ │ │ ├── content.js
│ │ │ └── tsconfig.json
│ │ ├── session
│ │ │ └── sessionStore.js
│ │ ├── tab
│ │ │ ├── scrollbox.js
│ │ │ ├── tab.js
│ │ │ ├── tabBindings.js
│ │ │ └── tabsBindings.js
│ │ ├── tabmix.js
│ │ ├── tabmix.xhtml
│ │ ├── tsconfig.json
│ │ └── utils.js
│ ├── locale
│ │ ├── bg-BG
│ │ │ ├── misc.dtd
│ │ │ ├── pref-appearance.dtd
│ │ │ ├── pref-filetype.dtd
│ │ │ ├── pref-tabmix.dtd
│ │ │ ├── shortcuts.dtd
│ │ │ ├── tabmix.dtd
│ │ │ └── tabmix.properties
│ │ ├── ca
│ │ │ ├── misc.dtd
│ │ │ ├── pref-appearance.dtd
│ │ │ ├── pref-filetype.dtd
│ │ │ ├── pref-tabmix.dtd
│ │ │ ├── shortcuts.dtd
│ │ │ ├── tabmix.dtd
│ │ │ └── tabmix.properties
│ │ ├── cs-CZ
│ │ │ ├── misc.dtd
│ │ │ ├── pref-appearance.dtd
│ │ │ ├── pref-filetype.dtd
│ │ │ ├── pref-tabmix.dtd
│ │ │ ├── shortcuts.dtd
│ │ │ ├── tabmix.dtd
│ │ │ └── tabmix.properties
│ │ ├── da
│ │ │ ├── misc.dtd
│ │ │ ├── pref-appearance.dtd
│ │ │ ├── pref-filetype.dtd
│ │ │ ├── pref-tabmix.dtd
│ │ │ ├── shortcuts.dtd
│ │ │ ├── tabmix.dtd
│ │ │ └── tabmix.properties
│ │ ├── de
│ │ │ ├── misc.dtd
│ │ │ ├── pref-appearance.dtd
│ │ │ ├── pref-filetype.dtd
│ │ │ ├── pref-tabmix.dtd
│ │ │ ├── shortcuts.dtd
│ │ │ ├── tabmix.dtd
│ │ │ └── tabmix.properties
│ │ ├── el
│ │ │ ├── misc.dtd
│ │ │ ├── pref-appearance.dtd
│ │ │ ├── pref-filetype.dtd
│ │ │ ├── pref-tabmix.dtd
│ │ │ ├── shortcuts.dtd
│ │ │ ├── tabmix.dtd
│ │ │ └── tabmix.properties
│ │ ├── en-US
│ │ │ ├── misc.dtd
│ │ │ ├── pref-appearance.dtd
│ │ │ ├── pref-filetype.dtd
│ │ │ ├── pref-tabmix.dtd
│ │ │ ├── shortcuts.dtd
│ │ │ ├── tabmix.dtd
│ │ │ └── tabmix.properties
│ │ ├── es-ES
│ │ │ ├── misc.dtd
│ │ │ ├── pref-appearance.dtd
│ │ │ ├── pref-filetype.dtd
│ │ │ ├── pref-tabmix.dtd
│ │ │ ├── shortcuts.dtd
│ │ │ ├── tabmix.dtd
│ │ │ └── tabmix.properties
│ │ ├── et-EE
│ │ │ ├── misc.dtd
│ │ │ ├── pref-appearance.dtd
│ │ │ ├── pref-filetype.dtd
│ │ │ ├── pref-tabmix.dtd
│ │ │ ├── shortcuts.dtd
│ │ │ ├── tabmix.dtd
│ │ │ └── tabmix.properties
│ │ ├── fa-IR
│ │ │ ├── misc.dtd
│ │ │ ├── pref-appearance.dtd
│ │ │ ├── pref-filetype.dtd
│ │ │ ├── pref-tabmix.dtd
│ │ │ ├── shortcuts.dtd
│ │ │ ├── tabmix.dtd
│ │ │ └── tabmix.properties
│ │ ├── fr
│ │ │ ├── misc.dtd
│ │ │ ├── pref-appearance.dtd
│ │ │ ├── pref-filetype.dtd
│ │ │ ├── pref-tabmix.dtd
│ │ │ ├── shortcuts.dtd
│ │ │ ├── tabmix.dtd
│ │ │ └── tabmix.properties
│ │ ├── he-IL
│ │ │ ├── misc.dtd
│ │ │ ├── pref-appearance.dtd
│ │ │ ├── pref-filetype.dtd
│ │ │ ├── pref-tabmix.dtd
│ │ │ ├── shortcuts.dtd
│ │ │ ├── tabmix.dtd
│ │ │ └── tabmix.properties
│ │ ├── hr-HR
│ │ │ ├── misc.dtd
│ │ │ ├── pref-appearance.dtd
│ │ │ ├── pref-filetype.dtd
│ │ │ ├── pref-tabmix.dtd
│ │ │ ├── shortcuts.dtd
│ │ │ ├── tabmix.dtd
│ │ │ └── tabmix.properties
│ │ ├── hu-HU
│ │ │ ├── misc.dtd
│ │ │ ├── pref-appearance.dtd
│ │ │ ├── pref-filetype.dtd
│ │ │ ├── pref-tabmix.dtd
│ │ │ ├── shortcuts.dtd
│ │ │ ├── tabmix.dtd
│ │ │ └── tabmix.properties
│ │ ├── it
│ │ │ ├── misc.dtd
│ │ │ ├── pref-appearance.dtd
│ │ │ ├── pref-filetype.dtd
│ │ │ ├── pref-tabmix.dtd
│ │ │ ├── shortcuts.dtd
│ │ │ ├── tabmix.dtd
│ │ │ └── tabmix.properties
│ │ ├── ja
│ │ │ ├── misc.dtd
│ │ │ ├── pref-appearance.dtd
│ │ │ ├── pref-filetype.dtd
│ │ │ ├── pref-tabmix.dtd
│ │ │ ├── shortcuts.dtd
│ │ │ ├── tabmix.dtd
│ │ │ └── tabmix.properties
│ │ ├── ko-KR
│ │ │ ├── misc.dtd
│ │ │ ├── pref-appearance.dtd
│ │ │ ├── pref-filetype.dtd
│ │ │ ├── pref-tabmix.dtd
│ │ │ ├── shortcuts.dtd
│ │ │ ├── tabmix.dtd
│ │ │ └── tabmix.properties
│ │ ├── nl
│ │ │ ├── misc.dtd
│ │ │ ├── pref-appearance.dtd
│ │ │ ├── pref-filetype.dtd
│ │ │ ├── pref-tabmix.dtd
│ │ │ ├── shortcuts.dtd
│ │ │ ├── tabmix.dtd
│ │ │ └── tabmix.properties
│ │ ├── pl
│ │ │ ├── misc.dtd
│ │ │ ├── pref-appearance.dtd
│ │ │ ├── pref-filetype.dtd
│ │ │ ├── pref-tabmix.dtd
│ │ │ ├── shortcuts.dtd
│ │ │ ├── tabmix.dtd
│ │ │ └── tabmix.properties
│ │ ├── pt-BR
│ │ │ ├── misc.dtd
│ │ │ ├── pref-appearance.dtd
│ │ │ ├── pref-filetype.dtd
│ │ │ ├── pref-tabmix.dtd
│ │ │ ├── shortcuts.dtd
│ │ │ ├── tabmix.dtd
│ │ │ └── tabmix.properties
│ │ ├── pt-PT
│ │ │ ├── misc.dtd
│ │ │ ├── pref-appearance.dtd
│ │ │ ├── pref-filetype.dtd
│ │ │ ├── pref-tabmix.dtd
│ │ │ ├── shortcuts.dtd
│ │ │ ├── tabmix.dtd
│ │ │ └── tabmix.properties
│ │ ├── ro
│ │ │ ├── misc.dtd
│ │ │ ├── pref-appearance.dtd
│ │ │ ├── pref-filetype.dtd
│ │ │ ├── pref-tabmix.dtd
│ │ │ ├── shortcuts.dtd
│ │ │ ├── tabmix.dtd
│ │ │ └── tabmix.properties
│ │ ├── ru-RU
│ │ │ ├── misc.dtd
│ │ │ ├── pref-appearance.dtd
│ │ │ ├── pref-filetype.dtd
│ │ │ ├── pref-tabmix.dtd
│ │ │ ├── shortcuts.dtd
│ │ │ ├── tabmix.dtd
│ │ │ └── tabmix.properties
│ │ ├── sk-SK
│ │ │ ├── misc.dtd
│ │ │ ├── pref-appearance.dtd
│ │ │ ├── pref-filetype.dtd
│ │ │ ├── pref-tabmix.dtd
│ │ │ ├── shortcuts.dtd
│ │ │ ├── tabmix.dtd
│ │ │ └── tabmix.properties
│ │ ├── sr
│ │ │ ├── misc.dtd
│ │ │ ├── pref-appearance.dtd
│ │ │ ├── pref-filetype.dtd
│ │ │ ├── pref-tabmix.dtd
│ │ │ ├── shortcuts.dtd
│ │ │ ├── tabmix.dtd
│ │ │ └── tabmix.properties
│ │ ├── sv-SE
│ │ │ ├── misc.dtd
│ │ │ ├── pref-appearance.dtd
│ │ │ ├── pref-filetype.dtd
│ │ │ ├── pref-tabmix.dtd
│ │ │ ├── shortcuts.dtd
│ │ │ ├── tabmix.dtd
│ │ │ └── tabmix.properties
│ │ ├── tr
│ │ │ ├── misc.dtd
│ │ │ ├── pref-appearance.dtd
│ │ │ ├── pref-filetype.dtd
│ │ │ ├── pref-tabmix.dtd
│ │ │ ├── shortcuts.dtd
│ │ │ ├── tabmix.dtd
│ │ │ └── tabmix.properties
│ │ ├── uk-UA
│ │ │ ├── misc.dtd
│ │ │ ├── pref-appearance.dtd
│ │ │ ├── pref-filetype.dtd
│ │ │ ├── pref-tabmix.dtd
│ │ │ ├── shortcuts.dtd
│ │ │ ├── tabmix.dtd
│ │ │ └── tabmix.properties
│ │ ├── vi
│ │ │ ├── misc.dtd
│ │ │ ├── pref-appearance.dtd
│ │ │ ├── pref-filetype.dtd
│ │ │ ├── pref-tabmix.dtd
│ │ │ ├── shortcuts.dtd
│ │ │ ├── tabmix.dtd
│ │ │ └── tabmix.properties
│ │ ├── zh-CN
│ │ │ ├── misc.dtd
│ │ │ ├── pref-appearance.dtd
│ │ │ ├── pref-filetype.dtd
│ │ │ ├── pref-tabmix.dtd
│ │ │ ├── shortcuts.dtd
│ │ │ ├── tabmix.dtd
│ │ │ └── tabmix.properties
│ │ └── zh-TW
│ │ │ ├── misc.dtd
│ │ │ ├── pref-appearance.dtd
│ │ │ ├── pref-filetype.dtd
│ │ │ ├── pref-tabmix.dtd
│ │ │ ├── shortcuts.dtd
│ │ │ ├── tabmix.dtd
│ │ │ └── tabmix.properties
│ └── skin
│ │ ├── app_version
│ │ ├── 91
│ │ │ ├── linux
│ │ │ │ ├── browser.css
│ │ │ │ └── tabStyles.css
│ │ │ ├── mac
│ │ │ │ ├── browser.css
│ │ │ │ └── tabStyles.css
│ │ │ ├── pref-appearance.css
│ │ │ ├── preferences.css
│ │ │ ├── tabStyles.css
│ │ │ └── win
│ │ │ │ ├── browser.css
│ │ │ │ └── tabStyles.css
│ │ ├── 119
│ │ │ ├── linux
│ │ │ │ ├── browser.css
│ │ │ │ └── tabStyles.css
│ │ │ ├── mac
│ │ │ │ ├── browser.css
│ │ │ │ └── tabStyles.css
│ │ │ ├── pref-appearance.css
│ │ │ ├── preferences.css
│ │ │ ├── tabStyles.css
│ │ │ └── win
│ │ │ │ ├── browser.css
│ │ │ │ └── tabStyles.css
│ │ └── all
│ │ │ ├── linux
│ │ │ └── browser.css
│ │ │ ├── mac
│ │ │ ├── browser.css
│ │ │ └── progress.css
│ │ │ ├── numberinput.css
│ │ │ ├── preferences-proton.css
│ │ │ ├── preferences.css
│ │ │ ├── prefwindow.css
│ │ │ ├── themeStyles.css
│ │ │ ├── themeStyles_before_126.css
│ │ │ └── win
│ │ │ ├── browser.css
│ │ │ └── progress.css
│ │ ├── arrow-up.svg
│ │ ├── autoreload.png
│ │ ├── disabled.svg
│ │ ├── dropmarker-leftright.png
│ │ ├── general.css
│ │ ├── help.png
│ │ ├── icons
│ │ ├── appearance.png
│ │ ├── closed-tabs-16x16-disabled.png
│ │ ├── closed-tabs-16x16-hovered.png
│ │ ├── closed-tabs-16x16.png
│ │ ├── closed-tabs-24x24-disabled.png
│ │ ├── closed-tabs-24x24-hovered.png
│ │ ├── closed-tabs-24x24.png
│ │ ├── closed-win-16x16-disabled.png
│ │ ├── closed-win-16x16-hovered.png
│ │ ├── closed-win-16x16.png
│ │ ├── closed-win-24x24-disabled.png
│ │ ├── closed-win-24x24-hovered.png
│ │ ├── closed-win-24x24.png
│ │ ├── events.png
│ │ ├── links.png
│ │ ├── menu.png
│ │ ├── mouse.png
│ │ ├── session-manager-16x16-disabled.png
│ │ ├── session-manager-16x16-hovered.png
│ │ ├── session-manager-16x16.png
│ │ ├── session-manager-24x24-disabled.png
│ │ ├── session-manager-24x24-hovered.png
│ │ ├── session-manager-24x24.png
│ │ ├── tab-list-16x16-disabled.png
│ │ ├── tab-list-16x16-hovered.png
│ │ ├── tab-list-16x16.png
│ │ ├── tab-list-24x24-disabled.png
│ │ ├── tab-list-24x24-hovered.png
│ │ └── tab-list-24x24.png
│ │ ├── locked.png
│ │ ├── newtab.png
│ │ ├── pin.png
│ │ ├── pref-appearance.css
│ │ ├── preferences.css
│ │ ├── protected.png
│ │ ├── question-16.png
│ │ ├── refresh.svg
│ │ ├── renameTab.css
│ │ ├── shortcuts.css
│ │ ├── tab.css
│ │ ├── tabmix-preferences.css
│ │ ├── tmp.png
│ │ └── tmpsmall.png
├── defaults
│ └── preferences
│ │ └── tabmix.js
├── icon.png
├── install.rdf
├── modules
│ ├── AutoReload.sys.mjs
│ ├── BrowserDOMWindow.sys.mjs
│ ├── BrowserVersion.sys.mjs
│ ├── Changecode.sys.mjs
│ ├── ChromeUtils.sys.mjs
│ ├── ContentClick.sys.mjs
│ ├── ContentSvc.sys.mjs
│ ├── ContextMenu.sys.mjs
│ ├── DocShellCapabilities.sys.mjs
│ ├── DownloadLastDir.sys.mjs
│ ├── DynamicRules.sys.mjs
│ ├── Floorp.sys.mjs
│ ├── LinkNodeUtils.sys.mjs
│ ├── MergeWindows.sys.mjs
│ ├── NewTabURL.sys.mjs
│ ├── Places.sys.mjs
│ ├── RenameTab.sys.mjs
│ ├── Shortcuts.sys.mjs
│ ├── SingleWindowModeUtils.sys.mjs
│ ├── Slideshow.sys.mjs
│ ├── SyncedTabs.sys.mjs
│ ├── TabContextConfig.sys.mjs
│ ├── TabmixSvc.sys.mjs
│ ├── Utils.sys.mjs
│ ├── VerticalTabs.sys.mjs
│ ├── bootstrap
│ │ ├── ChromeManifest.sys.mjs
│ │ ├── Overlays.sys.mjs
│ │ ├── PreferencesLoader.sys.mjs
│ │ ├── ScriptsLoader.sys.mjs
│ │ └── TabmixWidgets.sys.mjs
│ ├── extensions
│ │ ├── AddonManager.sys.mjs
│ │ └── CompatibilityCheck.sys.mjs
│ ├── log.sys.mjs
│ └── tsconfig.json
└── tsconfig.json
├── config
├── .prettierignore
├── .stylelintrc.json
├── base.tsconfig.json
├── eslint-plugin-tabmix
│ ├── import-globals.js
│ ├── index.js
│ ├── lazy-getter-name-match.js
│ ├── package.json
│ └── valid-lazy.js
├── husky
│ ├── commit-msg
│ ├── commitlint.config.js
│ ├── lint-staged.config.js
│ └── pre-commit
├── prettier.config.js
├── release_dates.json
├── typecheck.js
├── updates-dev-build.json
├── updates.json
└── zen_updates.json
├── eslint.config.js
├── package-lock.json
├── package.json
└── tsconfig.json
/.gitattributes:
--------------------------------------------------------------------------------
1 | # Maintain executable permissions on scripts
2 | *.js text eol=lf
3 | .github/scripts/*.js text eol=lf
4 |
--------------------------------------------------------------------------------
/.github/scripts/create_github_release.js:
--------------------------------------------------------------------------------
1 | #!/usr/bin/env node
2 |
3 | import {execSync} from "node:child_process";
4 |
5 | // Use the same environment variable that's set in the workflow
6 | const changelogExists = process.env.CHANGELOG_EXIST === "true";
7 | const previousTag = process.env.PREVIOUS_TAG;
8 | const notes = process.env.NOTES;
9 | const xpiName = process.env.XPI_NAME;
10 |
11 | console.log("Script environment variables:");
12 | console.log(`- CHANGELOG_EXIST: ${process.env.CHANGELOG_EXIST} (parsed as: ${changelogExists})`);
13 | console.log(`- PREVIOUS_TAG: ${previousTag}`);
14 | console.log(`- NOTES: ${notes}`);
15 | console.log(`- XPI_NAME: ${xpiName}`);
16 |
17 | let updateNotesCommand = "gh release edit dev-build --draft=false";
18 | if (changelogExists) {
19 | console.log("Changelog exists, using CHANGELOG.md for release notes");
20 | updateNotesCommand += " --notes-file=CHANGELOG.md";
21 | } else {
22 | console.log("No changelog exists, using default notes");
23 | // No changes since last tag
24 | const url = `https://github.com/onemen/TabMixPlus/releases/tag/${previousTag}`;
25 | const releaseNotes = `${notes}
No changes since [${previousTag}](${url})`;
26 | updateNotesCommand += ` --notes="${releaseNotes}"`;
27 | console.log(`Generated release notes: ${releaseNotes}`);
28 | }
29 |
30 | console.log(`Executing command: ${updateNotesCommand}`);
31 | // Update release notes
32 | execSync(updateNotesCommand, {stdio: "inherit"});
33 |
34 | const uploadCommand = `gh release upload dev-build /tmp/${xpiName}.xpi --clobber`;
35 | console.log(`Uploading XPI file: ${uploadCommand}`);
36 | // Upload XPI file
37 | execSync(uploadCommand, {
38 | stdio: "inherit",
39 | });
40 |
41 | console.log("GitHub release update completed successfully");
42 |
--------------------------------------------------------------------------------
/.github/workflows/published.yml:
--------------------------------------------------------------------------------
1 | name: release-published
2 |
3 | on:
4 | release:
5 | types: [published]
6 |
7 | workflow_dispatch:
8 |
9 | jobs:
10 | update-docs:
11 | runs-on: ubuntu-latest
12 | steps:
13 | - name: Update tabmixplus-docs
14 | env:
15 | GH_TOKEN: ${{ secrets.TABMIXPLUS_DOCS_TOKEN }}
16 | run: |
17 | gh workflow run --repo onemen/tabmixplus-docs --ref main deploy.yml
18 |
--------------------------------------------------------------------------------
/.gitignore:
--------------------------------------------------------------------------------
1 | # Logs
2 | logs
3 | *.log
4 | npm-debug.log*
5 | yarn-debug.log*
6 | yarn-error.log*
7 | lerna-debug.log*
8 |
9 | # Coverage directory used by tools like istanbul
10 | coverage
11 | *.lcov
12 |
13 | # temp files
14 | **/test/*
15 | **/draft/*
16 | *~.*
17 | *~*
18 |
19 | # Dependency directories
20 | node_modules/
21 |
22 | # Optional npm cache directory
23 | .npm
24 |
25 | # Optional eslint cache
26 | .eslintcache
27 |
28 | # compressed files
29 | *.tgz
30 | *.xpi
31 | *.rar
32 | *.zip
33 |
34 | **/sysmjs.txt
35 | **/usedmjs.json
36 |
37 | #hide test folder
38 | test/*
39 |
40 | **/tsconfig.tsbuildinfo
41 |
--------------------------------------------------------------------------------
/@types/aboutaddons.d.ts:
--------------------------------------------------------------------------------
1 | ///
2 |
3 | interface WindowProxy {
4 | readonly docShell: nsIDocShell;
5 | }
6 |
7 | declare var windowRoot: WindowRoot & {readonly ownerGlobal: WindowProxy};
8 |
--------------------------------------------------------------------------------
/@types/autoReload.d.ts:
--------------------------------------------------------------------------------
1 | ///
2 |
3 | declare var gNumberInput: typeof NumberInput;
4 |
5 | interface DocumentElement extends Omit {}
6 |
7 | interface GetByMap {
8 | autoreload_minutes: HTMLNumberInputElement;
9 | autoreload_seconds: HTMLNumberInputElement;
10 | reloadevery_custom_dialog: HTMLDialogElement & {readonly shadowRoot: ShadowRoot};
11 | }
12 |
13 | interface GetClosestMap {
14 | ".combined-element": HTMLElement & {firstChild: HTMLNumberInputElement};
15 | ".container": HTMLElement;
16 | }
17 |
18 | interface WindowProxy {
19 | arguments: any[];
20 | }
21 |
--------------------------------------------------------------------------------
/@types/gecko/tools/generated/lib.gecko.services.d.ts:
--------------------------------------------------------------------------------
1 | // don't check the imported files
2 | // @ts-nocheck
3 |
4 | /**
5 | * NOTE: Do not modify this file by hand.
6 | * Content was generated from services.json.
7 | * If you're updating some of the sources, see README for instructions.
8 | */
9 |
10 | interface JSServices {
11 | DAPTelemetry: nsIDAPTelemetry;
12 | appShell: nsIAppShellService;
13 | appinfo: nsICrashReporter & nsIXULAppInfo & nsIXULRuntime;
14 | blocklist: nsIBlocklistService;
15 | cache2: nsICacheStorageService;
16 | catMan: nsICategoryManager;
17 | clearData: nsIClearDataService;
18 | clipboard: nsIClipboard;
19 | console: nsIConsoleService;
20 | cookieBanners: nsICookieBannerService;
21 | cookies: nsICookieManager & nsICookieService;
22 | cpmm: ContentProcessMessageManager;
23 | dirsvc: nsIDirectoryService & nsIProperties;
24 | dns: nsIDNSService;
25 | domStorageManager: nsIDOMStorageManager & nsILocalStorageManager;
26 | droppedLinkHandler: nsIDroppedLinkHandler;
27 | eTLD: nsIEffectiveTLDService;
28 | els: nsIEventListenerService;
29 | env: nsIEnvironment;
30 | focus: nsIFocusManager;
31 | fog: nsIFOG;
32 | intl: mozIMozIntl;
33 | io: nsIIOService & nsINetUtil & nsISpeculativeConnect;
34 | loadContextInfo: nsILoadContextInfoFactory;
35 | locale: mozILocaleService;
36 | logins: nsILoginManager;
37 | mm: ChromeMessageBroadcaster;
38 | obs: nsIObserverService;
39 | perms: nsIPermissionManager;
40 | policies: nsIEnterprisePolicies;
41 | ppmm: ParentProcessMessageManager;
42 | prefs: nsIPrefBranch & nsIPrefService;
43 | profiler: nsIProfiler;
44 | prompt: nsIPromptService;
45 | qms: nsIQuotaManagerService;
46 | rfp: nsIRFPService;
47 | scriptSecurityManager: nsIScriptSecurityManager;
48 | scriptloader: mozIJSSubScriptLoader;
49 | search: nsISearchService;
50 | sessionStorage: nsISessionStorageService;
51 | startup: nsIAppStartup;
52 | storage: mozIStorageService;
53 | strings: nsIStringBundleService;
54 | sysinfo: nsIPropertyBag2 & nsISystemInfo;
55 | telemetry: nsITelemetry;
56 | textToSubURI: nsITextToSubURI;
57 | tm: nsIThreadManager;
58 | uriFixup: nsIURIFixup;
59 | urlFormatter: nsIURLFormatter;
60 | uuid: nsIUUIDGenerator;
61 | vc: nsIVersionComparator;
62 | wm: nsIWindowMediator;
63 | ww: nsIWindowWatcher;
64 | xulStore: nsIXULStore;
65 | }
66 |
--------------------------------------------------------------------------------
/@types/gecko/tools/index.d.ts:
--------------------------------------------------------------------------------
1 | // don't check the imported files
2 | // @ts-nocheck
3 |
4 | /* This Source Code Form is subject to the terms of the Mozilla Public
5 | * License, v. 2.0. If a copy of the MPL was not distributed with this
6 | * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
7 |
8 | ///
9 | ///
10 |
11 | ///
12 | ///
13 | ///
14 | ///
15 | ///
16 | ///
17 | ///
18 |
19 | /// Platform specific XPCOM modules.
20 | ///
21 | ///
22 | ///
23 |
24 | /// Order of references matters here, for overriding type signatures.
25 | ///
26 |
27 | declare global {
28 | const Cc: nsXPCComponents_Classes;
29 | const Ci: nsIXPCComponents_Interfaces;
30 | const Components: nsIXPCComponents;
31 | const Cr: nsIXPCComponents_Results;
32 |
33 | // Resolve typed generic overloads before the generated ones.
34 | const Cu: nsXPCComponents_Utils & nsIXPCComponents_Utils;
35 |
36 | const Services: JSServices;
37 | const uneval: (any) => string;
38 | }
39 |
40 | export {};
41 |
--------------------------------------------------------------------------------
/@types/gecko/tools/lib.gecko.custom.d.ts:
--------------------------------------------------------------------------------
1 | // don't check the imported files
2 | // @ts-nocheck
3 |
4 | /**
5 | * Custom artisanal types, handcrafted especially for Gecko.
6 | */
7 |
8 | declare global {
9 | type DeclaredLazy = {
10 | [P in keyof T]: T[P] extends () => infer U
11 | ? U
12 | : T[P] extends keyof LazyModules
13 | ? Exports
14 | : T[P] extends { pref: string; default?: infer U }
15 | ? Widen
16 | : T[P] extends { service: string; iid?: infer U }
17 | ? nsQIResult
18 | : never;
19 | };
20 |
21 | type LazyDefinition = Record<
22 | string,
23 | | string
24 | | (() => any)
25 | | { service: string; iid: nsIID }
26 | | { pref: string; default?; onUpdate?; transform? }
27 | >;
28 | }
29 |
30 | type Exports = M extends keyof LazyModules
31 | ? IfKey
32 | : never;
33 | type IfKey = K extends keyof T ? T[K] : never;
34 |
35 | type LazyModules = import("./generated/lib.gecko.modules").LazyModules;
36 |
37 | type Widen = T extends boolean
38 | ? boolean
39 | : T extends number
40 | ? number
41 | : T extends string
42 | ? string
43 | : never;
44 |
45 | export {};
46 |
--------------------------------------------------------------------------------
/@types/gecko/tools/lib.gecko.xpidl.d.ts:
--------------------------------------------------------------------------------
1 | // don't check the imported files
2 | // @ts-nocheck
3 |
4 | /**
5 | * Gecko XPIDL base types.
6 | */
7 |
8 | /**
9 | * Generic IDs are created by most code which passes a nsID to js.
10 | * https://searchfox.org/mozilla-central/source/js/xpconnect/src/XPCJSID.cpp#24
11 | */
12 | interface nsID {
13 | readonly number: uuid;
14 | }
15 |
16 | /**
17 | * In addition to nsID, interface IIDs support instanceof type guards,
18 | * and expose constants defined on the class, including variants from enums.
19 | * https://searchfox.org/mozilla-central/source/js/xpconnect/src/XPCJSID.cpp#45
20 | */
21 | type nsJSIID = nsID &
22 | Constants &
23 | enums & {
24 | new (_: never): void;
25 | prototype: iface;
26 | };
27 |
28 | /** A union type of all known interface IIDs. */
29 | type nsIID = nsIXPCComponents_Interfaces[keyof nsIXPCComponents_Interfaces];
30 |
31 | /** A generic to resolve QueryInterface return type from a nsIID. */
32 | type nsQIResult = iid extends { prototype: infer U } ? U : never;
33 |
34 | /** Picks only const number properties from T. */
35 | type Constants = { [K in keyof T as IfConst]: T[K] };
36 |
37 | /** Resolves only for keys K whose corresponding type T is a narrow number. */
38 | type IfConst = T extends number ? (number extends T ? never : K) : never;
39 |
40 | /** u32 */
41 | type nsresult = u32;
42 |
43 | // Numeric typedefs, useful as a quick reference in method signatures.
44 | type double = number;
45 | type float = number;
46 | type i16 = number;
47 | type i32 = number;
48 | type i64 = number;
49 | type u16 = number;
50 | type u32 = number;
51 | type u64 = number;
52 | type u8 = number;
53 |
--------------------------------------------------------------------------------
/@types/index.d.ts:
--------------------------------------------------------------------------------
1 | ///
2 | ///
3 |
4 | ///
5 | ///
6 | ///
7 |
--------------------------------------------------------------------------------
/@types/numberInput.d.ts:
--------------------------------------------------------------------------------
1 | interface CustomEvent extends MouseEvent, KeyboardEvent {
2 | target: HTMLNumberInputElement;
3 | }
4 |
5 | interface HTMLNumberInputElement extends Omit {
6 | defaultValue: number | string;
7 | readonly editor: nsIEditor;
8 | min: number;
9 | max: number;
10 | value: number | string;
11 | oninput(e: CustomEvent): void;
12 | }
13 |
14 | declare namespace NumberInput {
15 | function init(delay?: boolean): void;
16 | function unload(): void;
17 | function changeExpr(event: CustomEvent): boolean;
18 | function inputExpr(event: CustomEvent): boolean;
19 | function handleEvent(event: CustomEvent): void;
20 | function updateAllSpinners(): void;
21 | function updateSpinnerDisabledState(item: HTMLNumberInputElement): void;
22 | }
23 |
24 | interface QuerySelectorMap {
25 | "input[type=number]": HTMLNumberInputElement;
26 | }
27 |
28 | interface XULPopupElement {
29 | openPopup(anchorElement?: Node | HTMLElement | null, options?: StringOrOpenPopupOptions, x?: number, y?: number, isContextMenu?: boolean, attributesOverride?: boolean, triggerEvent?: Event | null): void;
30 | }
31 |
32 | declare namespace Globals {
33 | function oninput(item: HTMLNumberInputElement): void;
34 | function onSelect(event: CustomEvent): void;
35 | function openPopup(button: HTMLButtonElement & {nextElementSibling: XULPopupElement}): void;
36 | }
37 |
38 | type NumberInput = typeof NumberInput;
39 |
--------------------------------------------------------------------------------
/addon/chrome.manifest:
--------------------------------------------------------------------------------
1 | content tabmixplus chrome/content/
2 | content tabmix-prefs defaults/preferences/
3 | content tabmix-resource modules/
4 |
5 | locale tabmixplus bg chrome/locale/bg-BG/
6 | locale tabmixplus ca chrome/locale/ca/
7 | locale tabmixplus cs chrome/locale/cs-CZ/
8 | locale tabmixplus da chrome/locale/da/
9 | locale tabmixplus de chrome/locale/de/
10 | locale tabmixplus el chrome/locale/el/
11 | locale tabmixplus en-US chrome/locale/en-US/
12 | locale tabmixplus es-ES chrome/locale/es-ES/
13 | locale tabmixplus et chrome/locale/et-EE/
14 | locale tabmixplus fa chrome/locale/fa-IR/
15 | locale tabmixplus fr chrome/locale/fr/
16 | locale tabmixplus he chrome/locale/he-IL/
17 | locale tabmixplus hr chrome/locale/hr-HR/
18 | locale tabmixplus hu chrome/locale/hu-HU/
19 | locale tabmixplus it chrome/locale/it/
20 | locale tabmixplus ja chrome/locale/ja/
21 | locale tabmixplus ko chrome/locale/ko-KR/
22 | locale tabmixplus nl chrome/locale/nl/
23 | locale tabmixplus pl chrome/locale/pl/
24 | locale tabmixplus pt-BR chrome/locale/pt-BR/
25 | locale tabmixplus pt-PT chrome/locale/pt-PT/
26 | locale tabmixplus ro chrome/locale/ro/
27 | locale tabmixplus ru chrome/locale/ru-RU/
28 | locale tabmixplus sk chrome/locale/sk-SK/
29 | locale tabmixplus sr chrome/locale/sr/
30 | locale tabmixplus sv-SE chrome/locale/sv-SE/
31 | locale tabmixplus tr chrome/locale/tr/
32 | locale tabmixplus uk chrome/locale/uk-UA/
33 | locale tabmixplus vi chrome/locale/vi/
34 | locale tabmixplus zh-CN chrome/locale/zh-CN/
35 | locale tabmixplus zh-TW chrome/locale/zh-TW/
36 |
37 | skin tabmixplus classic/1.0 chrome/skin/
38 |
39 | skin tabmix-version tabmixplus chrome/skin/app_version/91/ platformversion>=91
40 | skin tabmix-version tabmixplus chrome/skin/app_version/119/ platformversion>=119
41 | skin tabmix-os classic/1.0 chrome://tabmix-version/skin/win/ os=WINNT
42 | skin tabmix-os classic/1.0 chrome://tabmix-version/skin/mac/ os=Darwin
43 | skin tabmix-os classic/1.0 chrome://tabmix-version/skin/linux/ os=Linux
44 |
--------------------------------------------------------------------------------
/addon/chrome/content/overlay/autoReload.css:
--------------------------------------------------------------------------------
1 | @namespace html url("http://www.w3.org/1999/xhtml");
2 |
3 | html|fieldset {
4 | display: flex;
5 | justify-content: space-between;
6 | align-items: center;
7 | padding-block: 15px;
8 | margin-bottom: 10px;
9 | min-width: 235px;
10 | }
11 |
12 | .container {
13 | display: flex;
14 | align-items: center;
15 | }
16 |
17 | .container > label {
18 | margin-inline-end: 0;
19 | }
20 |
21 | .combined-element {
22 | background-color: var(--in-content-box-background);
23 | border: 1px solid var(--in-content-box-border-color);
24 | border-radius: var(--combined-element-border-radius);
25 | }
26 |
27 | .combined-element:focus-within {
28 | border-color: var(--in-content-focus-outline-color);
29 | outline: var(--combined-element-outline);
30 | }
31 |
32 | .select-button {
33 | background-color: var(--in-content-button-background);
34 | background-image: url("chrome://global/skin/icons/arrow-down.svg");
35 | background-repeat: no-repeat;
36 | background-size: 8px;
37 | background-position: right 3px center;
38 | width: 14px;
39 | appearance: none;
40 | -moz-context-properties: fill;
41 | fill: currentcolor;
42 | }
43 |
44 | .select-button:hover {
45 | background-color: var(--in-content-button-background-hover);
46 | color: var(--in-content-button-text-color-hover);
47 | border-color: transparent;
48 | }
49 |
50 | .select-button:hover:active {
51 | background-color: var(--in-content-button-background-active);
52 | }
53 |
54 | .select-menupopup {
55 | padding-top: 1px;
56 | }
57 |
58 | .select-menupopup menuitem {
59 | padding-inline: 10px 0;
60 |
61 | /* for Waterfox 6.5.0 */
62 | --menu-background-padding-default: 10px;
63 | --context-menu-mac-padding: 10px;
64 | }
65 |
66 | input[type="number"] {
67 | border: none;
68 | border-start-end-radius: 0;
69 | border-end-end-radius: 0;
70 | margin: 0;
71 | }
72 |
73 | input[type="number"]:focus {
74 | outline: none;
75 | }
76 |
77 | input[type="number"]::-moz-number-spin-box {
78 | border-inline-end: 1px solid var(--in-content-box-border-color);
79 | border-start-end-radius: 0;
80 | border-end-end-radius: 0;
81 | }
82 |
--------------------------------------------------------------------------------
/addon/chrome/content/overlay/autoReload_properties.css:
--------------------------------------------------------------------------------
1 | /* custom properties for autoReload.xhtml */
2 |
3 | :root {
4 | --in-content-box-background: rgb(255 255 255);
5 | --in-content-box-border-color: rgb(169 169 169);
6 | --in-content-focus-outline-color: rgb(10 132 255);
7 | --in-content-button-background: rgb(207 207 216 / 33%);
8 | --in-content-button-background-hover: rgb(229 241 251);
9 | --in-content-button-background-active: rgb(204 228 247);
10 | --in-content-button-text-color-hover: rgb(0 0 0);
11 | --combined-element-border-radius: 0;
12 | --combined-element-outline: none;
13 | }
14 |
--------------------------------------------------------------------------------
/addon/chrome/content/overlay/renameTab.xhtml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
7 | %miscDTD;
8 | ]>
9 |
10 |
13 |
14 |
17 |
18 |
19 |
20 |
21 |
22 |
23 |
24 |
27 |
28 |
29 |
30 |
31 |
32 |
33 |
34 |
35 |
36 |
38 |
39 |
40 |
41 |
44 |
45 |
46 |
49 |
51 |
52 |
53 |
54 |
55 |
--------------------------------------------------------------------------------
/addon/chrome/content/overlay/tsconfig.json:
--------------------------------------------------------------------------------
1 | {
2 | "extends": "../../../../config/base.tsconfig.json",
3 | "include": ["**/*.js", "**/*.sys.mjs"],
4 | "compilerOptions": {
5 | "types": ["index.d.ts", "autoReload.d.ts", "tabmix.d.ts"]
6 | }
7 | }
8 |
--------------------------------------------------------------------------------
/addon/chrome/content/overlay/zen_browser.css:
--------------------------------------------------------------------------------
1 | /* for zen browser */
2 |
3 | #tabbrowser-tabs[orient="vertical"][closebuttons="noclose"] {
4 | & #tabbrowser-arrowscrollbox .tabbrowser-tab {
5 | & .tab-close-button {
6 | display: none !important;
7 | }
8 | }
9 | }
10 |
11 | #tabbrowser-tabs[orient="vertical"][closebuttons="alltabs"] {
12 | & #tabbrowser-arrowscrollbox .tabbrowser-tab:not(:is([pinned], [protected])) {
13 | & .tab-close-button {
14 | --tab-inline-padding: 0 !important;
15 |
16 | display: block !important;
17 | margin-inline-end: 0 !important;
18 | }
19 | }
20 | }
21 |
22 | #tabbrowser-tabs[orient="vertical"][closebuttons="activetab"] {
23 | & #tabbrowser-arrowscrollbox .tabbrowser-tab:not(:is([pinned], [protected]))[selected="true"] {
24 | & .tab-close-button {
25 | --tab-inline-padding: 0 !important;
26 |
27 | display: block !important;
28 | margin-inline-end: 0 !important;
29 | }
30 | }
31 | }
32 |
33 | #tabbrowser-tabs[orient="vertical"][closebuttons-hover="notactivetab"] {
34 | & #tabbrowser-arrowscrollbox .tabbrowser-tab:not(:is([pinned], [protected], [selected="true"]))[showbutton="on"] {
35 | & .tab-close-button {
36 | --tab-inline-padding: 0 !important;
37 |
38 | display: block !important;
39 | margin-inline-end: 0 !important;
40 | }
41 | }
42 | }
43 |
44 | #tabbrowser-tabs[orient="vertical"][closebuttons-hover="alltabs"] {
45 | & #tabbrowser-arrowscrollbox .tabbrowser-tab:not(:is([pinned], [protected]))[showbutton="on"] {
46 | & .tab-close-button {
47 | --tab-inline-padding: 0 !important;
48 |
49 | display: block !important;
50 | margin-inline-end: 0 !important;
51 | }
52 | }
53 | }
54 |
--------------------------------------------------------------------------------
/addon/chrome/content/places/places.xhtml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
5 |
6 |
7 |
10 |
11 |
--------------------------------------------------------------------------------
/addon/chrome/content/preferences/checkbox_tmp-ce.js:
--------------------------------------------------------------------------------
1 | /* eslint no-var: 2, prefer-const: 2 */
2 | "use strict";
3 |
4 | // This is loaded into all XUL windows. Wrap in a block to prevent
5 | // leaking to window scope.
6 | {
7 | /** @type {CheckboxClass} */
8 | class MozCheckbox_tmp extends MozXULElement {
9 | static get inheritedAttributes() {
10 | return {".checkbox": "label,align,style,accesskey,crop,flex,disabled"};
11 | }
12 |
13 | connectedCallback() {
14 | if (this._initialized) {
15 | return;
16 | }
17 |
18 | this.textContent = "";
19 | this.appendChild(
20 | MozXULElement.parseXULToFragment(`
21 |
22 | `)
23 | );
24 |
25 | if (!this.hasAttribute("preference-editable")) {
26 | this.setAttribute("preference-editable", "true");
27 | }
28 |
29 | this.initializeAttributeInheritance();
30 | // XXX: Implement `this.inheritAttribute()` for the [inherits] attribute in the markup above!
31 |
32 | this._checkbox = this.getElementsByClassName("checkbox")[0];
33 |
34 | this._initialized = true;
35 | }
36 |
37 | /** @this {CheckboxClass} */
38 | set label(val) {
39 | this._checkbox.label = val;
40 | }
41 |
42 | /** @this {CheckboxClass} */
43 | get label() {
44 | return this._checkbox.label;
45 | }
46 |
47 | set value(val) {
48 | this.checked = val;
49 | }
50 |
51 | /** @this {CheckboxClass} */
52 | get value() {
53 | return this._checkbox.checked;
54 | }
55 |
56 | /** @this {CheckboxClass} */
57 | set checked(val) {
58 | this._checkbox.checked = val;
59 | }
60 |
61 | /** @this {CheckboxClass} */
62 | get checked() {
63 | return this._checkbox.checked;
64 | }
65 |
66 | /** @this {CheckboxClass} */
67 | set disabled(val) {
68 | this._checkbox.disabled = val;
69 | }
70 |
71 | /** @this {CheckboxClass} */
72 | get disabled() {
73 | return this._checkbox.disabled;
74 | }
75 | }
76 |
77 | customElements.define("checkbox_tmp", MozCheckbox_tmp);
78 | }
79 |
--------------------------------------------------------------------------------
/addon/chrome/content/preferences/incompatible.xhtml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
5 | %pref-tabmixDTD;
6 | ]>
7 |
8 |
10 |
11 |
12 |
13 |
14 |
15 |
16 |
17 |
18 |
19 |
20 |
21 |
22 | &incompatible.extensions;
23 |
24 |
25 |
27 |
28 |
29 |
30 |
31 |
32 |
33 |
34 |
35 |
--------------------------------------------------------------------------------
/addon/chrome/content/preferences/overlay/aboutaddons.xhtml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
5 |
6 |
7 |
8 |
9 |
--------------------------------------------------------------------------------
/addon/chrome/content/preferences/session.js:
--------------------------------------------------------------------------------
1 | /* exported gSessionPane */
2 | "use strict";
3 |
4 | /** @type {SessionPane} */
5 | var gSessionPane = {
6 | init() {
7 | gPrefWindow.initPane("paneSession");
8 | },
9 | };
10 |
--------------------------------------------------------------------------------
/addon/chrome/content/preferences/subdialogs/pref-appearance.js:
--------------------------------------------------------------------------------
1 | /* eslint no-var: 2, prefer-const: 2 */
2 | /* exported tabstyles */
3 | "use strict";
4 |
5 | /** @param {string} id @type {Document["getElementById"]} */
6 | this.$ = id => document.getElementById(id);
7 |
8 | const tabstyles = {
9 | pref: "appearance_tab",
10 | init() {
11 | $("stylestabs").selectedIndex =
12 | Tabmix.prefs.prefHasUserValue(this.pref) ? Tabmix.prefs.getIntPref(this.pref) : 0;
13 |
14 | window.addEventListener("dialogcancel", () => tabstyles.cancel());
15 | window.addEventListener("dialogaccept", () => tabstyles.save());
16 | window.addEventListener("dialogextra1", () => tabstyles.openHelp());
17 | window.addEventListener("dialogextra2", () => tabstyles.toggleRGB_visibility());
18 |
19 | const dialog = document.querySelector("dialog");
20 | if (!window.opener && !Tabmix.getTopWin()) {
21 | dialog.getButton("extra1").disabled = true;
22 | }
23 |
24 | const extra = dialog.getButton("extra2");
25 | extra.label = $("hide-RGB").value;
26 | extra.classList.add("text-link");
27 |
28 | gNumberInput.init(true);
29 | },
30 |
31 | save() {
32 | Tabmix.prefs.setIntPref(this.pref, $("stylestabs").selectedIndex);
33 | // store the pref immediately
34 | Services.prefs.savePrefFile(null);
35 | },
36 |
37 | cancel() {
38 | const panels = $("stylespanels").childNodes;
39 | for (const panel of panels) {
40 | panel?._ondialogcancel();
41 | }
42 | this.save();
43 | },
44 |
45 | openHelp() {
46 | const win = window.opener || Tabmix.getTopWin();
47 | if (win) {
48 | win.openHelp("display-tab#customize_styles");
49 | } else {
50 | const dialog = document.querySelector("dialog");
51 | dialog.getButton("extra1").disabled = true;
52 | }
53 | },
54 |
55 | toggleRGB_visibility() {
56 | const dialog = document.querySelector("dialog");
57 | const extra = dialog.getButton("extra2");
58 | const item = $("hide-RGB");
59 | const wasShow = dialog.getAttribute("hide-RGB") != "true";
60 | extra.label = item.value = item.getAttribute(wasShow ? "show" : "hide") ?? "";
61 | dialog.setAttribute("hide-RGB", wasShow);
62 | },
63 | };
64 |
--------------------------------------------------------------------------------
/addon/chrome/content/preferences/subdialogs/pref-filetype.xhtml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
8 | %dialogDTD;
9 |
10 | %filetypeDTD;
11 | ]>
12 |
13 |
21 |
47 |
48 |
--------------------------------------------------------------------------------
/addon/chrome/content/preferences/tsconfig.json:
--------------------------------------------------------------------------------
1 | {
2 | "extends": "../../../../config/base.tsconfig.json",
3 | "include": ["**/*.js", "**/*.sys.mjs"],
4 | "exclude": ["**/*~*.*", "**/*.local.*"],
5 | "compilerOptions": {
6 | "types": ["index.d.ts", "preferences.d.ts"]
7 | }
8 | }
9 |
--------------------------------------------------------------------------------
/addon/chrome/content/scripts/tsconfig.json:
--------------------------------------------------------------------------------
1 | {
2 | "extends": "../../../../config/base.tsconfig.json",
3 | "include": ["**/*.js", "**/*.sys.mjs"],
4 | "compilerOptions": {
5 | "types": ["content.d.ts", "index.d.ts"]
6 | }
7 | }
8 |
--------------------------------------------------------------------------------
/addon/chrome/content/tsconfig.json:
--------------------------------------------------------------------------------
1 | {
2 | "extends": "../../../config/base.tsconfig.json",
3 | "include": ["**/*.js", "**/*.sys.mjs"],
4 | "exclude": [
5 | "node_modules",
6 | "**/gecko/**/*.d.ts",
7 | "logs/**",
8 | "**/*~/*",
9 | "**/*~*.*",
10 | "**/*.local.*",
11 | // files with different scopes
12 | "**/preferences",
13 | "**/overlay",
14 | "**/scripts"
15 | ],
16 | "compilerOptions": {
17 | "types": ["index.d.ts", "general.d.ts", "addon.d.ts"]
18 | }
19 | }
20 |
--------------------------------------------------------------------------------
/addon/chrome/locale/bg-BG/misc.dtd:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
7 |
8 |
9 |
10 |
11 |
12 |
13 |
14 |
15 |
--------------------------------------------------------------------------------
/addon/chrome/locale/bg-BG/pref-appearance.dtd:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
7 |
8 |
9 |
10 |
11 |
12 |
13 |
14 |
15 |
16 |
17 |
18 |
19 |
20 |
--------------------------------------------------------------------------------
/addon/chrome/locale/bg-BG/pref-filetype.dtd:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
--------------------------------------------------------------------------------
/addon/chrome/locale/bg-BG/shortcuts.dtd:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
7 |
8 |
9 |
10 |
11 |
12 |
13 |
14 |
15 |
16 |
17 |
--------------------------------------------------------------------------------
/addon/chrome/locale/ca/misc.dtd:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
7 |
8 |
9 |
10 |
11 |
12 |
13 |
14 |
15 |
--------------------------------------------------------------------------------
/addon/chrome/locale/ca/pref-appearance.dtd:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
7 |
8 |
9 |
10 |
11 |
12 |
13 |
14 |
15 |
16 |
17 |
18 |
19 |
20 |
--------------------------------------------------------------------------------
/addon/chrome/locale/ca/pref-filetype.dtd:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
--------------------------------------------------------------------------------
/addon/chrome/locale/ca/shortcuts.dtd:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
7 |
8 |
9 |
10 |
11 |
12 |
13 |
14 |
15 |
16 |
17 |
--------------------------------------------------------------------------------
/addon/chrome/locale/cs-CZ/misc.dtd:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
7 |
8 |
9 |
10 |
11 |
12 |
13 |
14 |
15 |
--------------------------------------------------------------------------------
/addon/chrome/locale/cs-CZ/pref-appearance.dtd:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
7 |
8 |
9 |
10 |
11 |
12 |
13 |
14 |
15 |
16 |
17 |
18 |
19 |
20 |
--------------------------------------------------------------------------------
/addon/chrome/locale/cs-CZ/pref-filetype.dtd:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
--------------------------------------------------------------------------------
/addon/chrome/locale/cs-CZ/shortcuts.dtd:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
7 |
8 |
9 |
10 |
11 |
12 |
13 |
14 |
15 |
16 |
17 |
--------------------------------------------------------------------------------
/addon/chrome/locale/da/misc.dtd:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
7 |
8 |
9 |
10 |
11 |
12 |
13 |
14 |
15 |
--------------------------------------------------------------------------------
/addon/chrome/locale/da/pref-appearance.dtd:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
7 |
8 |
9 |
10 |
11 |
12 |
13 |
14 |
15 |
16 |
17 |
18 |
19 |
20 |
--------------------------------------------------------------------------------
/addon/chrome/locale/da/pref-filetype.dtd:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
--------------------------------------------------------------------------------
/addon/chrome/locale/da/shortcuts.dtd:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
7 |
8 |
9 |
10 |
11 |
12 |
13 |
14 |
15 |
16 |
17 |
--------------------------------------------------------------------------------
/addon/chrome/locale/de/misc.dtd:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
7 |
8 |
9 |
10 |
11 |
12 |
13 |
14 |
15 |
--------------------------------------------------------------------------------
/addon/chrome/locale/de/pref-appearance.dtd:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
7 |
8 |
9 |
10 |
11 |
12 |
13 |
14 |
15 |
16 |
17 |
18 |
19 |
20 |
--------------------------------------------------------------------------------
/addon/chrome/locale/de/pref-filetype.dtd:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
--------------------------------------------------------------------------------
/addon/chrome/locale/de/shortcuts.dtd:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
7 |
8 |
9 |
10 |
11 |
12 |
13 |
14 |
15 |
16 |
17 |
--------------------------------------------------------------------------------
/addon/chrome/locale/el/misc.dtd:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
7 |
8 |
9 |
10 |
11 |
12 |
13 |
14 |
15 |
--------------------------------------------------------------------------------
/addon/chrome/locale/el/pref-appearance.dtd:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
7 |
8 |
9 |
10 |
11 |
12 |
13 |
14 |
15 |
16 |
17 |
18 |
19 |
20 |
--------------------------------------------------------------------------------
/addon/chrome/locale/el/pref-filetype.dtd:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
--------------------------------------------------------------------------------
/addon/chrome/locale/el/shortcuts.dtd:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
7 |
8 |
9 |
10 |
11 |
12 |
13 |
14 |
15 |
16 |
17 |
--------------------------------------------------------------------------------
/addon/chrome/locale/en-US/misc.dtd:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
7 |
8 |
9 |
10 |
11 |
12 |
13 |
14 |
15 |
--------------------------------------------------------------------------------
/addon/chrome/locale/en-US/pref-appearance.dtd:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
7 |
8 |
9 |
10 |
11 |
12 |
13 |
14 |
15 |
16 |
17 |
18 |
19 |
20 |
--------------------------------------------------------------------------------
/addon/chrome/locale/en-US/pref-filetype.dtd:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
--------------------------------------------------------------------------------
/addon/chrome/locale/en-US/shortcuts.dtd:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
7 |
8 |
9 |
10 |
11 |
12 |
13 |
14 |
15 |
16 |
17 |
--------------------------------------------------------------------------------
/addon/chrome/locale/es-ES/misc.dtd:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
7 |
8 |
9 |
10 |
11 |
12 |
13 |
14 |
15 |
--------------------------------------------------------------------------------
/addon/chrome/locale/es-ES/pref-appearance.dtd:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
7 |
8 |
9 |
10 |
11 |
12 |
13 |
14 |
15 |
16 |
17 |
18 |
19 |
20 |
--------------------------------------------------------------------------------
/addon/chrome/locale/es-ES/pref-filetype.dtd:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
--------------------------------------------------------------------------------
/addon/chrome/locale/es-ES/shortcuts.dtd:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
7 |
8 |
9 |
10 |
11 |
12 |
13 |
14 |
15 |
16 |
17 |
--------------------------------------------------------------------------------
/addon/chrome/locale/et-EE/misc.dtd:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
7 |
8 |
9 |
10 |
11 |
12 |
13 |
14 |
15 |
--------------------------------------------------------------------------------
/addon/chrome/locale/et-EE/pref-appearance.dtd:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
7 |
8 |
9 |
10 |
11 |
12 |
13 |
14 |
15 |
16 |
17 |
18 |
19 |
20 |
--------------------------------------------------------------------------------
/addon/chrome/locale/et-EE/pref-filetype.dtd:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
--------------------------------------------------------------------------------
/addon/chrome/locale/et-EE/shortcuts.dtd:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
7 |
8 |
9 |
10 |
11 |
12 |
13 |
14 |
15 |
16 |
17 |
--------------------------------------------------------------------------------
/addon/chrome/locale/fa-IR/misc.dtd:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
7 |
8 |
9 |
10 |
11 |
12 |
13 |
14 |
15 |
--------------------------------------------------------------------------------
/addon/chrome/locale/fa-IR/pref-appearance.dtd:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
7 |
8 |
9 |
10 |
11 |
12 |
13 |
14 |
15 |
16 |
17 |
18 |
19 |
20 |
--------------------------------------------------------------------------------
/addon/chrome/locale/fa-IR/pref-filetype.dtd:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
--------------------------------------------------------------------------------
/addon/chrome/locale/fa-IR/shortcuts.dtd:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
7 |
8 |
9 |
10 |
11 |
12 |
13 |
14 |
15 |
16 |
17 |
--------------------------------------------------------------------------------
/addon/chrome/locale/fr/misc.dtd:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
7 |
8 |
9 |
10 |
11 |
12 |
13 |
14 |
15 |
--------------------------------------------------------------------------------
/addon/chrome/locale/fr/pref-appearance.dtd:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
7 |
8 |
9 |
10 |
11 |
12 |
13 |
14 |
15 |
16 |
17 |
18 |
19 |
20 |
--------------------------------------------------------------------------------
/addon/chrome/locale/fr/pref-filetype.dtd:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
--------------------------------------------------------------------------------
/addon/chrome/locale/fr/shortcuts.dtd:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
7 |
8 |
9 |
10 |
11 |
12 |
13 |
14 |
15 |
16 |
17 |
--------------------------------------------------------------------------------
/addon/chrome/locale/he-IL/misc.dtd:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
7 |
8 |
9 |
10 |
11 |
12 |
13 |
14 |
15 |
--------------------------------------------------------------------------------
/addon/chrome/locale/he-IL/pref-appearance.dtd:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
7 |
8 |
9 |
10 |
11 |
12 |
13 |
14 |
15 |
16 |
17 |
18 |
19 |
20 |
--------------------------------------------------------------------------------
/addon/chrome/locale/he-IL/pref-filetype.dtd:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
--------------------------------------------------------------------------------
/addon/chrome/locale/he-IL/shortcuts.dtd:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
7 |
8 |
9 |
10 |
11 |
12 |
13 |
14 |
15 |
16 |
17 |
--------------------------------------------------------------------------------
/addon/chrome/locale/hr-HR/misc.dtd:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
7 |
8 |
9 |
10 |
11 |
12 |
13 |
14 |
15 |
--------------------------------------------------------------------------------
/addon/chrome/locale/hr-HR/pref-appearance.dtd:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
7 |
8 |
9 |
10 |
11 |
12 |
13 |
14 |
15 |
16 |
17 |
18 |
19 |
20 |
--------------------------------------------------------------------------------
/addon/chrome/locale/hr-HR/pref-filetype.dtd:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
--------------------------------------------------------------------------------
/addon/chrome/locale/hr-HR/shortcuts.dtd:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
7 |
8 |
9 |
10 |
11 |
12 |
13 |
14 |
15 |
16 |
17 |
--------------------------------------------------------------------------------
/addon/chrome/locale/hu-HU/misc.dtd:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
7 |
8 |
9 |
10 |
11 |
12 |
13 |
14 |
15 |
--------------------------------------------------------------------------------
/addon/chrome/locale/hu-HU/pref-appearance.dtd:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
7 |
8 |
9 |
10 |
11 |
12 |
13 |
14 |
15 |
16 |
17 |
18 |
19 |
20 |
--------------------------------------------------------------------------------
/addon/chrome/locale/hu-HU/pref-filetype.dtd:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
--------------------------------------------------------------------------------
/addon/chrome/locale/hu-HU/shortcuts.dtd:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
7 |
8 |
9 |
10 |
11 |
12 |
13 |
14 |
15 |
16 |
17 |
--------------------------------------------------------------------------------
/addon/chrome/locale/it/misc.dtd:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
7 |
8 |
9 |
10 |
11 |
12 |
13 |
14 |
15 |
--------------------------------------------------------------------------------
/addon/chrome/locale/it/pref-appearance.dtd:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
7 |
8 |
9 |
10 |
11 |
12 |
13 |
14 |
15 |
16 |
17 |
18 |
19 |
20 |
--------------------------------------------------------------------------------
/addon/chrome/locale/it/pref-filetype.dtd:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
--------------------------------------------------------------------------------
/addon/chrome/locale/it/shortcuts.dtd:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
7 |
8 |
9 |
10 |
11 |
12 |
13 |
14 |
15 |
16 |
17 |
--------------------------------------------------------------------------------
/addon/chrome/locale/ja/misc.dtd:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
7 |
8 |
9 |
10 |
11 |
12 |
13 |
14 |
15 |
--------------------------------------------------------------------------------
/addon/chrome/locale/ja/pref-appearance.dtd:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
7 |
8 |
9 |
10 |
11 |
12 |
13 |
14 |
15 |
16 |
17 |
18 |
19 |
20 |
--------------------------------------------------------------------------------
/addon/chrome/locale/ja/pref-filetype.dtd:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
--------------------------------------------------------------------------------
/addon/chrome/locale/ja/shortcuts.dtd:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
7 |
8 |
9 |
10 |
11 |
12 |
13 |
14 |
15 |
16 |
17 |
--------------------------------------------------------------------------------
/addon/chrome/locale/ko-KR/misc.dtd:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
7 |
8 |
9 |
10 |
11 |
12 |
13 |
14 |
15 |
--------------------------------------------------------------------------------
/addon/chrome/locale/ko-KR/pref-appearance.dtd:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
7 |
8 |
9 |
10 |
11 |
12 |
13 |
14 |
15 |
16 |
17 |
18 |
19 |
20 |
--------------------------------------------------------------------------------
/addon/chrome/locale/ko-KR/pref-filetype.dtd:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
--------------------------------------------------------------------------------
/addon/chrome/locale/ko-KR/shortcuts.dtd:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
7 |
8 |
9 |
10 |
11 |
12 |
13 |
14 |
15 |
16 |
17 |
--------------------------------------------------------------------------------
/addon/chrome/locale/nl/misc.dtd:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
7 |
8 |
9 |
10 |
11 |
12 |
13 |
14 |
15 |
--------------------------------------------------------------------------------
/addon/chrome/locale/nl/pref-appearance.dtd:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
7 |
8 |
9 |
10 |
11 |
12 |
13 |
14 |
15 |
16 |
17 |
18 |
19 |
20 |
--------------------------------------------------------------------------------
/addon/chrome/locale/nl/pref-filetype.dtd:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
--------------------------------------------------------------------------------
/addon/chrome/locale/nl/shortcuts.dtd:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
7 |
8 |
9 |
10 |
11 |
12 |
13 |
14 |
15 |
16 |
17 |
--------------------------------------------------------------------------------
/addon/chrome/locale/pl/misc.dtd:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
7 |
8 |
9 |
10 |
11 |
12 |
13 |
14 |
15 |
--------------------------------------------------------------------------------
/addon/chrome/locale/pl/pref-appearance.dtd:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
7 |
8 |
9 |
10 |
11 |
12 |
13 |
14 |
15 |
16 |
17 |
18 |
19 |
20 |
--------------------------------------------------------------------------------
/addon/chrome/locale/pl/pref-filetype.dtd:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
--------------------------------------------------------------------------------
/addon/chrome/locale/pl/shortcuts.dtd:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
7 |
8 |
9 |
10 |
11 |
12 |
13 |
14 |
15 |
16 |
17 |
--------------------------------------------------------------------------------
/addon/chrome/locale/pt-BR/misc.dtd:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
7 |
8 |
9 |
10 |
11 |
12 |
13 |
14 |
15 |
--------------------------------------------------------------------------------
/addon/chrome/locale/pt-BR/pref-appearance.dtd:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
7 |
8 |
9 |
10 |
11 |
12 |
13 |
14 |
15 |
16 |
17 |
18 |
19 |
20 |
--------------------------------------------------------------------------------
/addon/chrome/locale/pt-BR/pref-filetype.dtd:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
--------------------------------------------------------------------------------
/addon/chrome/locale/pt-BR/shortcuts.dtd:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
7 |
8 |
9 |
10 |
11 |
12 |
13 |
14 |
15 |
16 |
17 |
--------------------------------------------------------------------------------
/addon/chrome/locale/pt-PT/misc.dtd:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
7 |
8 |
9 |
10 |
11 |
12 |
13 |
14 |
15 |
--------------------------------------------------------------------------------
/addon/chrome/locale/pt-PT/pref-appearance.dtd:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
7 |
8 |
9 |
10 |
11 |
12 |
13 |
14 |
15 |
16 |
17 |
18 |
19 |
20 |
--------------------------------------------------------------------------------
/addon/chrome/locale/pt-PT/pref-filetype.dtd:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
--------------------------------------------------------------------------------
/addon/chrome/locale/pt-PT/shortcuts.dtd:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
7 |
8 |
9 |
10 |
11 |
12 |
13 |
14 |
15 |
16 |
17 |
--------------------------------------------------------------------------------
/addon/chrome/locale/ro/misc.dtd:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
7 |
8 |
9 |
10 |
11 |
12 |
13 |
14 |
15 |
--------------------------------------------------------------------------------
/addon/chrome/locale/ro/pref-appearance.dtd:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
7 |
8 |
9 |
10 |
11 |
12 |
13 |
14 |
15 |
16 |
17 |
18 |
19 |
20 |
--------------------------------------------------------------------------------
/addon/chrome/locale/ro/pref-filetype.dtd:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
--------------------------------------------------------------------------------
/addon/chrome/locale/ro/shortcuts.dtd:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
7 |
8 |
9 |
10 |
11 |
12 |
13 |
14 |
15 |
16 |
17 |
--------------------------------------------------------------------------------
/addon/chrome/locale/ru-RU/misc.dtd:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
7 |
8 |
9 |
10 |
11 |
12 |
13 |
14 |
15 |
--------------------------------------------------------------------------------
/addon/chrome/locale/ru-RU/pref-appearance.dtd:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
7 |
8 |
9 |
10 |
11 |
12 |
13 |
14 |
15 |
16 |
17 |
18 |
19 |
20 |
--------------------------------------------------------------------------------
/addon/chrome/locale/ru-RU/pref-filetype.dtd:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
--------------------------------------------------------------------------------
/addon/chrome/locale/ru-RU/shortcuts.dtd:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
7 |
8 |
9 |
10 |
11 |
12 |
13 |
14 |
15 |
16 |
17 |
--------------------------------------------------------------------------------
/addon/chrome/locale/sk-SK/misc.dtd:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
7 |
8 |
9 |
10 |
11 |
12 |
13 |
14 |
15 |
--------------------------------------------------------------------------------
/addon/chrome/locale/sk-SK/pref-appearance.dtd:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
7 |
8 |
9 |
10 |
11 |
12 |
13 |
14 |
15 |
16 |
17 |
18 |
19 |
20 |
--------------------------------------------------------------------------------
/addon/chrome/locale/sk-SK/pref-filetype.dtd:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
--------------------------------------------------------------------------------
/addon/chrome/locale/sk-SK/shortcuts.dtd:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
7 |
8 |
9 |
10 |
11 |
12 |
13 |
14 |
15 |
16 |
17 |
--------------------------------------------------------------------------------
/addon/chrome/locale/sr/misc.dtd:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
7 |
8 |
9 |
10 |
11 |
12 |
13 |
14 |
15 |
--------------------------------------------------------------------------------
/addon/chrome/locale/sr/pref-appearance.dtd:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
7 |
8 |
9 |
10 |
11 |
12 |
13 |
14 |
15 |
16 |
17 |
18 |
19 |
20 |
--------------------------------------------------------------------------------
/addon/chrome/locale/sr/pref-filetype.dtd:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
--------------------------------------------------------------------------------
/addon/chrome/locale/sr/shortcuts.dtd:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
7 |
8 |
9 |
10 |
11 |
12 |
13 |
14 |
15 |
16 |
17 |
--------------------------------------------------------------------------------
/addon/chrome/locale/sv-SE/misc.dtd:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
7 |
8 |
9 |
10 |
11 |
12 |
13 |
14 |
15 |
--------------------------------------------------------------------------------
/addon/chrome/locale/sv-SE/pref-appearance.dtd:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
7 |
8 |
9 |
10 |
11 |
12 |
13 |
14 |
15 |
16 |
17 |
18 |
19 |
20 |
--------------------------------------------------------------------------------
/addon/chrome/locale/sv-SE/pref-filetype.dtd:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
--------------------------------------------------------------------------------
/addon/chrome/locale/sv-SE/shortcuts.dtd:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
7 |
8 |
9 |
10 |
11 |
12 |
13 |
14 |
15 |
16 |
17 |
--------------------------------------------------------------------------------
/addon/chrome/locale/tr/misc.dtd:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
7 |
8 |
9 |
10 |
11 |
12 |
13 |
14 |
15 |
--------------------------------------------------------------------------------
/addon/chrome/locale/tr/pref-appearance.dtd:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
7 |
8 |
9 |
10 |
11 |
12 |
13 |
14 |
15 |
16 |
17 |
18 |
19 |
20 |
--------------------------------------------------------------------------------
/addon/chrome/locale/tr/pref-filetype.dtd:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
--------------------------------------------------------------------------------
/addon/chrome/locale/tr/shortcuts.dtd:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
7 |
8 |
9 |
10 |
11 |
12 |
13 |
14 |
15 |
16 |
17 |
--------------------------------------------------------------------------------
/addon/chrome/locale/uk-UA/misc.dtd:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
7 |
8 |
9 |
10 |
11 |
12 |
13 |
14 |
15 |
--------------------------------------------------------------------------------
/addon/chrome/locale/uk-UA/pref-appearance.dtd:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
7 |
8 |
9 |
10 |
11 |
12 |
13 |
14 |
15 |
16 |
17 |
18 |
19 |
20 |
--------------------------------------------------------------------------------
/addon/chrome/locale/uk-UA/pref-filetype.dtd:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
--------------------------------------------------------------------------------
/addon/chrome/locale/uk-UA/shortcuts.dtd:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
7 |
8 |
9 |
10 |
11 |
12 |
13 |
14 |
15 |
16 |
17 |
--------------------------------------------------------------------------------
/addon/chrome/locale/vi/misc.dtd:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
7 |
8 |
9 |
10 |
11 |
12 |
13 |
14 |
15 |
--------------------------------------------------------------------------------
/addon/chrome/locale/vi/pref-appearance.dtd:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
7 |
8 |
9 |
10 |
11 |
12 |
13 |
14 |
15 |
16 |
17 |
18 |
19 |
20 |
--------------------------------------------------------------------------------
/addon/chrome/locale/vi/pref-filetype.dtd:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
--------------------------------------------------------------------------------
/addon/chrome/locale/vi/shortcuts.dtd:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
7 |
8 |
9 |
10 |
11 |
12 |
13 |
14 |
15 |
16 |
17 |
--------------------------------------------------------------------------------
/addon/chrome/locale/zh-CN/misc.dtd:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
7 |
8 |
9 |
10 |
11 |
12 |
13 |
14 |
15 |
--------------------------------------------------------------------------------
/addon/chrome/locale/zh-CN/pref-appearance.dtd:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
7 |
8 |
9 |
10 |
11 |
12 |
13 |
14 |
15 |
16 |
17 |
18 |
19 |
20 |
--------------------------------------------------------------------------------
/addon/chrome/locale/zh-CN/pref-filetype.dtd:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
--------------------------------------------------------------------------------
/addon/chrome/locale/zh-CN/shortcuts.dtd:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
7 |
8 |
9 |
10 |
11 |
12 |
13 |
14 |
15 |
16 |
17 |
--------------------------------------------------------------------------------
/addon/chrome/locale/zh-CN/tabmix.properties:
--------------------------------------------------------------------------------
1 | extensions.{dc572301-7619-498c-a57d-39143191b318}.description=加强标签页浏览功能。
2 | tmp.merge.warning.title=关闭窗口且不合并标签页
3 | tmp.merge.warning.message=该选择的标签页将和另一个窗口合并,同时关闭其它标签页和当前窗口。
4 | tmp.merge.warning.checkbox=关闭不会合并标签页的窗口时,始终警告您。
5 | tmp.merge.error=至少要有两个已打开的窗口才能合并
6 | tmp.merge.private=您无法合并隐私窗口和非隐私窗口。
7 | tmp.importPref.error1=该文件无效,无法导入。
8 | tmp.importPref.error2=导入设置失败。
9 | tmp.sessionempty=下一次您启动浏览器时,\'上一次的浏览进程\'将清空。
10 | droptoclose.label=拖放并关闭标签页
11 | flstOn.label=激活上一次选中的标签页
12 | flstOff.label=激活右边的标签页
13 | slideshowOn.label=标签页滚动已打开
14 | slideshowOff.label=标签页滚动已关闭
15 | undoclosetab.keepOpen.label=保持菜单打开
16 | undoclosetab.keepOpen.description=点击切换
17 | undoclosetab.clear.label=清空已关闭的标签页列表
18 | undoclosetab.clear.accesskey=C
19 | undoClosedWindows.clear.label=清空已关闭的窗口列表
20 | undoClosedWindows.clear.accesskey=C
21 | protectedtabs.closeWarning.1=您已选择关闭 %S 受保护标签页。您是否确定继续?
22 | protectedtabs.closeWarning.2=您已选择关闭 %S 受保护标签页。您是否确定继续?
23 | protectedtabs.closeWarning.3=您已选择关闭 %S 标签页,其中 %S 受保护。您是否确定继续?
24 | protectedtabs.closeWarning.5=关闭有已保护标签页的窗口时警告您
25 | window.closeWarning.2=关闭有多个标签页的窗口时警告您
26 | closeWindow.label=关闭窗口
27 | confirm_autoreloadPostData_title=警告!
28 | confirm_autoreloadPostData=您启用自动重新载入的页面包含 POSTDATA。n如果您启用自动重新载入,表单执行的任何操作(例如在线购买)将会被重复。nn您是否确定要启用自动重新载入?
29 | confirm_autoreloadPostData_remote=你尝试启用自动载入功能的页面包含 POSTDATA。\n如果你启用自动载入,任何表单要执行的操作(例如在线支付)都会丢失。\n\n你确定要启用自动载入功能吗?
30 | incompatible.title=Tab Mix Plus
31 | incompatible.msg0=下列扩展已被整合或与 Tab Mix Plus 不兼容。
32 | incompatible.msg1=您是否要禁用这些扩展?
33 | incompatible.msg2=不兼容的扩展
34 | incompatible.button0.label=禁用
35 | incompatible.button0.accesskey=D
36 | incompatible.button1.label=不禁用
37 | incompatible.button1.accesskey=O
38 | incompatible.button2.label=禁用并重新启动
39 | incompatible.button2.accesskey=E
40 | incompatible.chkbox.label=浏览器启动时显示该提示
41 | tabmixoption.error.title=Tabmix 错误
42 | tabmixoption.error.msg=您必须为浏览窗口启用 TabMix 选项
43 | # LOCALIZATION NOTE (rowsTooltip.rowscount):
44 | # Semicolon-separated list of plural forms. See:
45 | # http://developer.mozilla.org/en/docs/Localization_and_Plurals
46 | # #1 is the total number of rows
47 | # The singular form is not considered since this string is used only for
48 | # multiple rows.
49 | rowsTooltip.rowscount=第一行
50 | rowsTooltip.activetab=选定位于第1行的标签页
51 | bugReport.label=报告bug
52 |
--------------------------------------------------------------------------------
/addon/chrome/locale/zh-TW/misc.dtd:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
7 |
8 |
9 |
10 |
11 |
12 |
13 |
14 |
15 |
--------------------------------------------------------------------------------
/addon/chrome/locale/zh-TW/pref-appearance.dtd:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
7 |
8 |
9 |
10 |
11 |
12 |
13 |
14 |
15 |
16 |
17 |
18 |
19 |
20 |
--------------------------------------------------------------------------------
/addon/chrome/locale/zh-TW/pref-filetype.dtd:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
--------------------------------------------------------------------------------
/addon/chrome/locale/zh-TW/shortcuts.dtd:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
7 |
8 |
9 |
10 |
11 |
12 |
13 |
14 |
15 |
16 |
17 |
--------------------------------------------------------------------------------
/addon/chrome/locale/zh-TW/tabmix.properties:
--------------------------------------------------------------------------------
1 | extensions.{dc572301-7619-498c-a57d-39143191b318}.description=強化瀏覽器的分頁瀏覽功能
2 | tmp.merge.warning.title=即將關閉的視窗中仍有分頁
3 | tmp.merge.warning.message=目前視窗中已標記的分頁將被合併至其他視窗,而未標記的分頁將隨目前視窗被關閉。
4 | tmp.merge.warning.checkbox=關閉視窗時仍有未被合併的分頁則要警告我。
5 | tmp.merge.error=您至少需要開啟兩個以上的視窗才能進行合併視窗的動作
6 | tmp.merge.private=您無法將非隱私的視窗合併至隱私的視窗。
7 | tmp.importPref.error1=該檔案內容無效,無法匯入設定值。
8 | tmp.importPref.error2=匯入設定值失敗。
9 | tmp.sessionempty=選擇不儲存則「最後的瀏覽狀態」將在瀏覽器關閉時被清除!
10 | droptoclose.label=拖放分頁至此可關閉分頁
11 | flstOn.label=切換至最後選取的分頁 - 按 [F9] 切換設定
12 | flstOff.label=切換至右邊的分頁 - 按 [F9] 切換設定
13 | slideshowOn.label=已啟用自動輪換分頁 - 按 [F8] 停用此功能
14 | slideshowOff.label=已停用自動輪換分頁 - 按 [F8] 啟用此功能
15 | undoclosetab.keepOpen.label=保持選單開啟
16 | undoclosetab.keepOpen.description=點擊切換
17 | undoclosetab.clear.label=清除復原分頁列表
18 | undoclosetab.clear.accesskey=C
19 | undoClosedWindows.clear.label=清除復原視窗列表
20 | undoClosedWindows.clear.accesskey= C
21 | protectedtabs.closeWarning.1=您嘗試要關閉 %S 個被保護的分頁。確定要繼續嗎?
22 | protectedtabs.closeWarning.2=您嘗試要關閉 %S 個被保護的分頁。確定要繼續嗎?
23 | protectedtabs.closeWarning.3=您嘗試要關閉 %S 個分頁,其中 %S 個被保護。確定要繼續嗎?
24 | protectedtabs.closeWarning.5=嘗試關閉視窗時若有被保護的分頁則發出警告
25 | window.closeWarning.2=嘗試關閉視窗時若有多個分頁則發出警告
26 | closeWindow.label=關閉視窗
27 | confirm_autoreloadPostData_title=警告!
28 | confirm_autoreloadPostData=您嘗試要啟用自動更新的這個頁面中含有表單資訊(POSTDATA)。\n若您啟用頁面自動更新功能,則此頁面中的表單資訊(例如:線上訂購資訊)將會被重複發送出去。\n\n您確定要啟用頁面自動更新功能嗎?
29 | confirm_autoreloadPostData_remote=您嘗試要啟用自動更新的這個頁面中含有表單資訊(POSTDATA)。\n若您啟用頁面自動更新功能,則此頁面中的表單資訊(例如:線上訂購資訊)將會遺失。\n\n您確定要啟用頁面自動更新功能嗎?
30 | incompatible.title=Tab Mix Plus
31 | incompatible.msg0=偵測到下列這些擴充套件已整合或不相容於 Tab Mix Plus。
32 | incompatible.msg1=您是否要停用這些擴充套件?
33 | incompatible.msg2=不相容的擴充套件在您重新啟動瀏覽器後將被停用。
34 | incompatible.button0.label=停用
35 | incompatible.button0.accesskey=D
36 | incompatible.button1.label=不停用
37 | incompatible.button1.accesskey=O
38 | incompatible.button2.label=停用並重新啟動
39 | incompatible.button2.accesskey=E
40 | incompatible.chkbox.label=重新啟動瀏覽器時顯示此資訊
41 | tabmixoption.error.title=Tab Mix Plus 錯誤
42 | tabmixoption.error.msg=您必須有一個瀏覽器視窗才能使用 Tab Mix Plus 選項
43 | # LOCALIZATION NOTE (rowsTooltip.rowscount):
44 | # Semicolon-separated list of plural forms. See:
45 | # http://developer.mozilla.org/en/docs/Localization_and_Plurals
46 | # #1 is the total number of rows
47 | # The singular form is not considered since this string is used only for
48 | # multiple rows.
49 | rowsTooltip.rowscount=;#1 列
50 | rowsTooltip.activetab=將目前的分頁放在第 #1 列
51 | bugReport.label=回報問題
52 |
--------------------------------------------------------------------------------
/addon/chrome/skin/app_version/119/linux/browser.css:
--------------------------------------------------------------------------------
1 | /**
2 | Firefox version 119+
3 |
4 | Linux platform
5 |
6 | **/
7 |
8 | @import url("chrome://tabmixplus/skin/app_version/all/linux/browser.css");
9 | @import url("chrome://tabmixplus/skin/app_version/all/win/progress.css");
10 | @import url("chrome://tabmixplus/skin/app_version/119/linux/tabStyles.css");
11 | @import url("chrome://tabmixplus/skin/app_version/119/tabStyles.css");
12 |
--------------------------------------------------------------------------------
/addon/chrome/skin/app_version/119/linux/tabStyles.css:
--------------------------------------------------------------------------------
1 | /**
2 | Firefox version 119+
3 |
4 | Linux platform
5 |
6 | **/
7 |
8 | /*** Tab close button when user set background color ***/
9 | #TabsToolbar[brighttext] #tabbrowser-tabs[tabmix_otherStyle~="bg"] #tabbrowser-arrowscrollbox .tabbrowser-tab:not([visuallyselected], [tabmix_tabState], :hover) > .tab-close-button,
10 | #TabsToolbar[brighttext] #tabbrowser-tabs[tabmix_unloadedStyle~="bg"] #tabbrowser-arrowscrollbox .tabbrowser-tab:not([visuallyselected])[tabmix_tabState="unloaded"]:not(:hover) .tab-close-button,
11 | #TabsToolbar[brighttext] #tabbrowser-tabs[tabmix_unreadStyle~="bg"] #tabbrowser-arrowscrollbox .tabbrowser-tab:not([visuallyselected])[tabmix_tabState="unread"]:not(:hover) .tab-close-button {
12 | /* noinspection CssInvalidFunction */
13 | background-image: -moz-image-rect(url("chrome://global/skin/icons/close.svg"), 0, 16, 16, 0);
14 | }
15 |
--------------------------------------------------------------------------------
/addon/chrome/skin/app_version/119/mac/browser.css:
--------------------------------------------------------------------------------
1 | /**
2 | Firefox version 119+
3 |
4 | Mac platform
5 |
6 | **/
7 |
8 | @import url("chrome://tabmixplus/skin/app_version/all/mac/browser.css");
9 | @import url("chrome://tabmixplus/skin/app_version/all/mac/progress.css");
10 | @import url("chrome://tabmixplus/skin/app_version/119/mac/tabStyles.css");
11 | @import url("chrome://tabmixplus/skin/app_version/119/tabStyles.css");
12 |
--------------------------------------------------------------------------------
/addon/chrome/skin/app_version/119/mac/tabStyles.css:
--------------------------------------------------------------------------------
1 | /**
2 | Firefox version 119+
3 |
4 | Mac platform
5 |
6 | **/
7 |
8 | #tabbrowser-tabs[tabmix_currentStyle~="bg"] #tabbrowser-arrowscrollbox .tabbrowser-tab[visuallyselected] > .tab-stack > .tab-content,
9 | #tabbrowser-tabs[tabmix_otherStyle~="bg"] #tabbrowser-arrowscrollbox .tabbrowser-tab:not([visuallyselected], [tabmix_tabState]) > .tab-stack > .tab-content,
10 | #tabbrowser-tabs[tabmix_unloadedStyle~="bg"] #tabbrowser-arrowscrollbox .tabbrowser-tab:not([visuallyselected])[tabmix_tabState="unloaded"] > .tab-stack > .tab-content,
11 | #tabbrowser-tabs[tabmix_unreadStyle~="bg"] #tabbrowser-arrowscrollbox .tabbrowser-tab:not([visuallyselected])[tabmix_tabState="unread"] > .tab-stack > .tab-content {
12 | border-image: none !important;
13 | }
14 |
15 | /* tabmix color on tab - for inactive window */
16 | #tabbrowser-tabs[tabmix_currentStyle~="bg"] #tabbrowser-arrowscrollbox .tabbrowser-tab[visuallyselected] > .tab-stack > .tab-background >
17 | :-moz-any(.tab-background-start, .tab-background-middle, .tab-background-end):-moz-window-inactive,
18 | #tabbrowser-tabs[tabmix_unloadedStyle~="bg"] #tabbrowser-arrowscrollbox .tabbrowser-tab:not([visuallyselected])[tabmix_tabState="unloaded"] > .tab-stack > .tab-background >
19 | :-moz-any(.tab-background-start, .tab-background-middle, .tab-background-end):-moz-window-inactive,
20 | #tabbrowser-tabs[tabmix_unreadStyle~="bg"] #tabbrowser-arrowscrollbox .tabbrowser-tab:not([visuallyselected])[tabmix_tabState="unread"] > .tab-stack > .tab-background >
21 | :-moz-any(.tab-background-start, .tab-background-middle, .tab-background-end):-moz-window-inactive,
22 | #tabbrowser-tabs[tabmix_otherStyle~="bg"] #tabbrowser-arrowscrollbox .tabbrowser-tab:not([visuallyselected], [tabmix_tabState]) > .tab-stack > .tab-background >
23 | :-moz-any(.tab-background-start, .tab-background-middle, .tab-background-end):-moz-window-inactive {
24 | opacity: 0.5 !important;
25 | }
26 |
--------------------------------------------------------------------------------
/addon/chrome/skin/app_version/119/pref-appearance.css:
--------------------------------------------------------------------------------
1 | /**
2 | Firefox version 119+
3 |
4 | All platform
5 |
6 | **/
7 |
8 | /********** global styles for pref-appearance.css ********/
9 |
10 | @import url("chrome://global/skin/in-content/common.css");
11 | @import url("chrome://tabmixplus/skin/app_version/all/preferences-proton.css");
12 | @import url("chrome://tabmixplus/skin/app_version/all/numberinput.css");
13 |
14 | @namespace html url("http://www.w3.org/1999/xhtml");
15 |
16 | checkbox[anonid]:-moz-focusring > .checkbox-check {
17 | outline: none;
18 | }
19 |
20 | .reset-button-box button {
21 | margin-inline-start: -2px;
22 | }
23 |
24 | .dialog-button[dlgtype="extra2"] {
25 | background-color: transparent;
26 | margin-inline-start: 0;
27 | }
28 |
--------------------------------------------------------------------------------
/addon/chrome/skin/app_version/119/preferences.css:
--------------------------------------------------------------------------------
1 | /**
2 | Firefox version 119+
3 |
4 | All platform
5 |
6 | **/
7 |
8 | /********** preferences ********/
9 |
10 | @import url("chrome://global/skin/in-content/common.css");
11 | @import url("chrome://tabmixplus/skin/app_version/all/prefwindow.css");
12 | @import url("chrome://tabmixplus/skin/app_version/all/preferences.css");
13 | @import url("chrome://tabmixplus/skin/tabmix-preferences.css");
14 | @import url("chrome://tabmixplus/skin/app_version/all/preferences-proton.css");
15 | @import url("chrome://tabmixplus/skin/app_version/all/numberinput.css");
16 |
--------------------------------------------------------------------------------
/addon/chrome/skin/app_version/119/win/browser.css:
--------------------------------------------------------------------------------
1 | /**
2 | Firefox version 119+
3 |
4 | Windows platform
5 |
6 | **/
7 |
8 | @import url("chrome://tabmixplus/skin/app_version/all/win/browser.css");
9 | @import url("chrome://tabmixplus/skin/app_version/all/win/progress.css");
10 | @import url("chrome://tabmixplus/skin/app_version/119/tabStyles.css");
11 | @import url("chrome://tabmixplus/skin/app_version/119/win/tabStyles.css");
12 |
--------------------------------------------------------------------------------
/addon/chrome/skin/app_version/119/win/tabStyles.css:
--------------------------------------------------------------------------------
1 | /**
2 | Firefox version 119+
3 | Bug 1066531 replaced selected attribute with visuallyselected
4 |
5 | :::: use visuallyselected instead of selected ::::
6 |
7 | Windows platform
8 |
9 | **/
10 |
11 | /* Override Windows 10 rules */
12 | #tabbrowser-tabs[tabmix_currentStyle~="bg"] #tabbrowser-arrowscrollbox .tabbrowser-tab[visuallyselected] > .tab-stack > .tab-background > .tab-background-middle {
13 | background-size: auto 100%, auto 100%, auto 100%;
14 | background-clip: content-box;
15 | }
16 |
17 |
18 | #tabbrowser-tabs[tabmix-multibar="true"] #tabbrowser-arrowscrollbox > toolbarbutton {
19 | vertical-align: bottom;
20 | }
21 |
22 | #tabmix-bottom-toolbox > toolbox {
23 | appearance: none;
24 | border-top: none;
25 | background-color: transparent;
26 | }
27 |
28 | #TabsToolbar[tabbaronbottom]::before,
29 | #TabsToolbar[tabbaronbottom]::after {
30 | box-shadow: none !important;
31 | }
32 |
33 | #tabbrowser-tabs:not([treestyletab-mode="vertical"])
34 | #tabbrowser-arrowscrollbox .tabbrowser-tab > .tab-stack > .tab-progress-container > .tab-progress {
35 | margin: 2px;
36 | }
37 |
--------------------------------------------------------------------------------
/addon/chrome/skin/app_version/91/linux/browser.css:
--------------------------------------------------------------------------------
1 | /**
2 | Firefox version 91+
3 |
4 | Linux platform
5 |
6 | **/
7 |
8 | @import url("chrome://tabmixplus/skin/app_version/all/linux/browser.css");
9 | @import url("chrome://tabmixplus/skin/app_version/all/win/progress.css");
10 | @import url("chrome://tabmixplus/skin/app_version/91/linux/tabStyles.css");
11 | @import url("chrome://tabmixplus/skin/app_version/91/tabStyles.css");
12 |
--------------------------------------------------------------------------------
/addon/chrome/skin/app_version/91/linux/tabStyles.css:
--------------------------------------------------------------------------------
1 | /**
2 | Firefox version 78+
3 |
4 | Linux platform
5 |
6 | **/
7 |
8 | /*** Tab close button when user set background color ***/
9 | #TabsToolbar[brighttext] #tabbrowser-tabs[tabmix_otherStyle~="bg"] > #tabbrowser-arrowscrollbox > .tabbrowser-tab:not([visuallyselected="true"], [tabmix_tabState], :hover) > .tab-close-button,
10 | #TabsToolbar[brighttext] #tabbrowser-tabs[tabmix_unloadedStyle~="bg"] > #tabbrowser-arrowscrollbox > .tabbrowser-tab:not([visuallyselected="true"])[tabmix_tabState="unloaded"]:not(:hover) .tab-close-button,
11 | #TabsToolbar[brighttext] #tabbrowser-tabs[tabmix_unreadStyle~="bg"] > #tabbrowser-arrowscrollbox > .tabbrowser-tab:not([visuallyselected="true"])[tabmix_tabState="unread"]:not(:hover) .tab-close-button {
12 | /* noinspection CssInvalidFunction */
13 | background-image: -moz-image-rect(url("chrome://global/skin/icons/close.svg"), 0, 16, 16, 0);
14 | }
15 |
--------------------------------------------------------------------------------
/addon/chrome/skin/app_version/91/mac/browser.css:
--------------------------------------------------------------------------------
1 | /**
2 | Firefox version 91+
3 |
4 | Mac platform
5 |
6 | **/
7 |
8 | @import url("chrome://tabmixplus/skin/app_version/all/mac/browser.css");
9 | @import url("chrome://tabmixplus/skin/app_version/all/mac/progress.css");
10 | @import url("chrome://tabmixplus/skin/app_version/91/mac/tabStyles.css");
11 | @import url("chrome://tabmixplus/skin/app_version/91/tabStyles.css");
12 |
--------------------------------------------------------------------------------
/addon/chrome/skin/app_version/91/mac/tabStyles.css:
--------------------------------------------------------------------------------
1 | /**
2 | Firefox version 78+
3 |
4 | Mac platform
5 |
6 | **/
7 |
8 | #tabbrowser-tabs[tabmix_currentStyle~="bg"] > #tabbrowser-arrowscrollbox > .tabbrowser-tab[visuallyselected="true"] > .tab-stack > .tab-content,
9 | #tabbrowser-tabs[tabmix_otherStyle~="bg"] > #tabbrowser-arrowscrollbox > .tabbrowser-tab:not([visuallyselected="true"], [tabmix_tabState]) > .tab-stack > .tab-content,
10 | #tabbrowser-tabs[tabmix_unloadedStyle~="bg"] > #tabbrowser-arrowscrollbox > .tabbrowser-tab:not([visuallyselected="true"])[tabmix_tabState="unloaded"] > .tab-stack > .tab-content,
11 | #tabbrowser-tabs[tabmix_unreadStyle~="bg"] > #tabbrowser-arrowscrollbox > .tabbrowser-tab:not([visuallyselected="true"])[tabmix_tabState="unread"] > .tab-stack > .tab-content {
12 | border-image: none !important;
13 | }
14 |
15 | /* tabmix color on tab - for inactive window */
16 | #tabbrowser-tabs[tabmix_currentStyle~="bg"] > #tabbrowser-arrowscrollbox > .tabbrowser-tab[visuallyselected="true"] > .tab-stack > .tab-background >
17 | :-moz-any(.tab-background-start, .tab-background-middle, .tab-background-end):-moz-window-inactive,
18 | #tabbrowser-tabs[tabmix_unloadedStyle~="bg"] > #tabbrowser-arrowscrollbox > .tabbrowser-tab:not([visuallyselected="true"])[tabmix_tabState="unloaded"] > .tab-stack > .tab-background >
19 | :-moz-any(.tab-background-start, .tab-background-middle, .tab-background-end):-moz-window-inactive,
20 | #tabbrowser-tabs[tabmix_unreadStyle~="bg"] > #tabbrowser-arrowscrollbox > .tabbrowser-tab:not([visuallyselected="true"])[tabmix_tabState="unread"] > .tab-stack > .tab-background >
21 | :-moz-any(.tab-background-start, .tab-background-middle, .tab-background-end):-moz-window-inactive,
22 | #tabbrowser-tabs[tabmix_otherStyle~="bg"] > #tabbrowser-arrowscrollbox > .tabbrowser-tab:not([visuallyselected="true"], [tabmix_tabState]) > .tab-stack > .tab-background >
23 | :-moz-any(.tab-background-start, .tab-background-middle, .tab-background-end):-moz-window-inactive {
24 | opacity: 0.5 !important;
25 | }
26 |
--------------------------------------------------------------------------------
/addon/chrome/skin/app_version/91/pref-appearance.css:
--------------------------------------------------------------------------------
1 | /**
2 | Firefox version 91+
3 |
4 | All platform
5 |
6 | **/
7 |
8 | /********** global styles for pref-appearance.css ********/
9 |
10 | @import url("chrome://global/skin/in-content/common.css");
11 | @import url("chrome://tabmixplus/skin/app_version/all/preferences-proton.css");
12 | @import url("chrome://tabmixplus/skin/app_version/all/numberinput.css");
13 |
14 | @namespace html url("http://www.w3.org/1999/xhtml");
15 |
16 | checkbox[anonid]:-moz-focusring > .checkbox-check {
17 | outline: none;
18 | }
19 |
20 | .reset-button-box button {
21 | margin-inline-start: -2px;
22 | }
23 |
24 | .dialog-button[dlgtype="extra2"] {
25 | background-color: transparent;
26 | margin-inline-start: 0;
27 | }
28 |
--------------------------------------------------------------------------------
/addon/chrome/skin/app_version/91/preferences.css:
--------------------------------------------------------------------------------
1 | /**
2 | Firefox version 91+
3 |
4 | All platform
5 |
6 | **/
7 |
8 | /********** preferences ********/
9 |
10 | @import url("chrome://global/skin/in-content/common.css");
11 | @import url("chrome://tabmixplus/skin/app_version/all/prefwindow.css");
12 | @import url("chrome://tabmixplus/skin/app_version/all/preferences.css");
13 | @import url("chrome://tabmixplus/skin/tabmix-preferences.css");
14 | @import url("chrome://tabmixplus/skin/app_version/all/preferences-proton.css");
15 | @import url("chrome://tabmixplus/skin/app_version/all/numberinput.css");
16 |
--------------------------------------------------------------------------------
/addon/chrome/skin/app_version/91/win/browser.css:
--------------------------------------------------------------------------------
1 | /**
2 | Firefox version 91+
3 |
4 | Windows platform
5 |
6 | **/
7 |
8 | @import url("chrome://tabmixplus/skin/app_version/all/win/browser.css");
9 | @import url("chrome://tabmixplus/skin/app_version/all/win/progress.css");
10 | @import url("chrome://tabmixplus/skin/app_version/91/tabStyles.css");
11 | @import url("chrome://tabmixplus/skin/app_version/91/win/tabStyles.css");
12 |
--------------------------------------------------------------------------------
/addon/chrome/skin/app_version/91/win/tabStyles.css:
--------------------------------------------------------------------------------
1 | /**
2 | Firefox version 78+
3 | Bug 1066531 replaced selected attribute with visuallyselected
4 |
5 | :::: use visuallyselected instead of selected ::::
6 |
7 | Windows platform
8 |
9 | **/
10 |
11 | /* Override Windows 10 rules */
12 | #tabbrowser-tabs[tabmix_currentStyle~="bg"] > #tabbrowser-arrowscrollbox > .tabbrowser-tab[visuallyselected="true"] > .tab-stack > .tab-background > .tab-background-middle {
13 | background-size: auto 100%, auto 100%, auto 100%;
14 | background-clip: content-box;
15 | }
16 |
17 | #tabbrowser-tabs[tabmix-multibar="true"] #tabbrowser-arrowscrollbox > toolbarbutton {
18 | vertical-align: bottom;
19 | }
20 |
21 | #tabmix-bottom-toolbox > toolbox {
22 | appearance: none;
23 | border-top: none;
24 | background-color: transparent;
25 | }
26 |
27 | #TabsToolbar[tabbaronbottom]:not(:-moz-lwtheme) {
28 | appearance: none;
29 | }
30 |
31 | #TabsToolbar[tabbaronbottom]::before,
32 | #TabsToolbar[tabbaronbottom]::after {
33 | box-shadow: none !important;
34 | }
35 |
36 | #tabbrowser-tabs:not([treestyletab-mode="vertical"])
37 | > #tabbrowser-arrowscrollbox > .tabbrowser-tab > .tab-stack > .tab-progress-container > .tab-progress {
38 | margin: 2px;
39 | }
40 |
--------------------------------------------------------------------------------
/addon/chrome/skin/app_version/all/linux/browser.css:
--------------------------------------------------------------------------------
1 | /**
2 | Firefox all versions
3 |
4 | Linux platform
5 |
6 | **/
7 |
8 | /* :::: tabbar on bottom :::: */
9 | #TabsToolbar[tabbaronbottom] {
10 | background-image: none !important;
11 | }
12 |
13 | /*** Tabstrip close button Firefox 31+ ***/
14 | #tabmix-tabs-closebutton:not(:hover) {
15 | background-image: -moz-image-rect(url("chrome://global/skin/icons/close.svg"), 0, 64, 16, 48);
16 | }
17 |
18 | /* set on linux we need to set vertical align even if the button is hidden */
19 | #tabbrowser-tabs[tabmix-multibar] #tabbrowser-arrowscrollbox > toolbarbutton {
20 | vertical-align: bottom;
21 | }
22 |
--------------------------------------------------------------------------------
/addon/chrome/skin/app_version/all/mac/browser.css:
--------------------------------------------------------------------------------
1 | /**
2 | Firefox all versions
3 |
4 | Mac platform
5 |
6 | **/
7 |
8 | /* :::: tabbar on bottom ::::
9 | we leave the default background-image on mac
10 | #TabsToolbar[tabbaronbottom] {
11 | background-image: none !important;
12 | }
13 | */
14 |
15 | /* prevent tabbrowser-tabs height from increasing by 2px when the tabs are
16 | in display: block */
17 | #TabsToolbar[tabmix-show-newtabbutton="aftertabs"] #tabbrowser-tabs[tabmix-flowing="multibar"]
18 | #tabbrowser-arrowscrollbox > #tabs-newtab-button[command="cmd_newNavigatorTab"] .toolbarbutton-icon,
19 | #TabsToolbar[tabmix-show-newtabbutton="aftertabs"] #tabbrowser-tabs[tabmix-flowing="multibar"]
20 | #tabbrowser-arrowscrollbox #tabbrowser-arrowscrollbox-periphery > #tabs-newtab-button[command="cmd_newNavigatorTab"] .toolbarbutton-icon {
21 | margin: -2px 0;
22 | }
23 |
24 | #TabsToolbar[tabbaronbottom] #tabbrowser-tabs #tabbrowser-arrowscrollbox .tabbrowser-tab[selected="true"] {
25 | position: static !important;
26 | }
27 |
28 | #tabbrowser-tabs[tabmix-multibar="true"] #tabbrowser-arrowscrollbox > toolbarbutton {
29 | vertical-align: bottom;
30 | }
31 |
32 | /* for mac - look in pinstripe/browser/browser.css */
33 | #tabbrowser-tabs #tabbrowser-arrowscrollbox .tabbrowser-tab > * > .tab-progress-container > .tab-progress:not([selected="true"]),
34 | #tabbrowser-tabs #tabbrowser-arrowscrollbox .tabbrowser-tab:not(:hover) > * > * > .tab-icon > .tab-icon-image:not([selected="true"]),
35 | #tabbrowser-tabs #tabbrowser-arrowscrollbox .tabbrowser-tab:not(:hover) > * > * > .tab-icon > .tab-protect-icon:not([selected="true"]),
36 | #tabbrowser-tabs #tabbrowser-arrowscrollbox .tabbrowser-tab:not(:hover) > * > * > .tab-icon > .tab-lock-icon:not([selected="true"]),
37 | #tabbrowser-tabs #tabbrowser-arrowscrollbox .tabbrowser-tab:not(:hover) > * > * > .tab-icon > .tab-reload-icon:not([selected="true"]) {
38 | opacity: .8;
39 | }
40 |
--------------------------------------------------------------------------------
/addon/chrome/skin/app_version/all/mac/progress.css:
--------------------------------------------------------------------------------
1 | /**
2 | Firefox all versions
3 |
4 | Mac platform
5 |
6 | **/
7 |
8 | /* :::: progress bar on tabs :::: */
9 | .tab-progress {
10 | appearance: none;
11 | min-height: 0;
12 | height: 4px;
13 | }
14 |
15 | #tabbrowser-tabs[tabsontop="true"] .tab-progress {
16 | margin: 3px 2px;
17 | }
18 |
19 | #tabbrowser-tabs:not([tabsontop="true"]) .tab-progress {
20 | margin: 1px 2px;
21 | }
22 |
23 | .tab-progress > .progress-bar {
24 | appearance: none;
25 | border: 0;
26 | border-top: 1px solid rgb(0 0 0 / 40%);
27 | border-bottom: 1px solid rgb(0 0 0 / 30%);
28 | background-origin: border-box;
29 | background-color: Highlight;
30 | }
31 |
32 | .tab-progress > .progress-bar:-moz-window-inactive {
33 | opacity: 0.6 !important;
34 | }
35 |
--------------------------------------------------------------------------------
/addon/chrome/skin/app_version/all/preferences.css:
--------------------------------------------------------------------------------
1 | /**
2 | Firefox all versions
3 |
4 | All platform
5 |
6 | **/
7 |
8 | /* toolkit/content/xul.css */
9 |
10 | /********** preferences ********/
11 |
12 | prefwindow,
13 | prefwindow:root /* override :root from above */,
14 | prefpane {
15 | flex-direction: column;
16 | }
17 |
18 | prefwindow > .paneDeckContainer {
19 | overflow-x: hidden;
20 | }
21 |
22 | prefpane > .content-box {
23 | overflow: hidden;
24 | }
25 |
26 | prefwindow[type="child"] > .paneDeckContainer {
27 | overflow: clip;
28 | }
29 |
30 | prefwindow[type="child"] > prefpane > .content-box {
31 | flex: 1;
32 | overflow: clip;
33 | }
34 |
35 | preferences,
36 | preference {
37 | visibility: collapse;
38 | }
39 |
40 | radio[pane] .radio-check {
41 | display: none;
42 | }
43 |
44 | radio[pane] .radio-label-box {
45 | flex-direction: column;
46 | outline: none;
47 | margin-inline: 5px;
48 | margin-bottom: 2px;
49 | }
50 |
51 | radio[pane] .radio-icon {
52 | margin-inline-end: 0;
53 | }
54 |
55 | radio[pane] .radio-label {
56 | margin-top: 1px;
57 | }
58 |
59 | prefwindow[chromehidden~="toolbar"] .chromeclass-toolbar {
60 | display: none;
61 | }
62 |
63 | .button-menu-dropmarker {
64 | direction: rtl;
65 | appearance: auto !important;
66 | }
67 |
68 | .button-menu-dropmarker .button-icon {
69 | margin-left: 5px;
70 | }
71 |
72 | windowdragbox {
73 | width: 100%;
74 | }
75 |
76 | .font-bold {
77 | font-weight: bold;
78 | }
79 |
--------------------------------------------------------------------------------
/addon/chrome/skin/app_version/all/prefwindow.css:
--------------------------------------------------------------------------------
1 | /* ===== preferences.css =====================================================
2 | == Styles used by the XUL prefwindow element.
3 | ======================================================================= */
4 |
5 | @namespace html url("http://www.w3.org/1999/xhtml");
6 |
7 | /* ::::: dialog ::::: */
8 |
9 | prefwindow {
10 | padding: 0;
11 | }
12 |
13 | prefpane {
14 | padding-top: 8px;
15 | padding-bottom: 10px;
16 | padding-inline: 8px 10px;
17 | }
18 |
19 | prefwindow[type="child"] {
20 | padding-top: 8px;
21 | padding-bottom: 10px;
22 | padding-inline: 8px 10px;
23 | }
24 |
25 | prefwindow[type="child"] > prefpane {
26 | padding: 0;
27 | }
28 |
29 | .prefWindow-dlgbuttons {
30 | padding-bottom: 10px;
31 | padding-inline: 8px 10px;
32 | }
33 |
34 | prefwindow[type="child"] .prefWindow-dlgbuttons {
35 | padding: 0;
36 | }
37 |
38 | radio[pane] {
39 | appearance: none;
40 | margin: 0 1px;
41 | padding: 1px 3px;
42 | min-width: 4.5em;
43 | }
44 |
45 | .paneSelector {
46 | border-bottom: 2px groove ThreeDFace;
47 | margin: 0;
48 | padding-inline-start: 10px;
49 | background-color: -moz-Field;
50 | color: -moz-FieldText;
51 | }
52 |
53 | @media (-moz-platform: linux) {
54 | prefwindow radiogroup.paneSelector:focus-visible > radio[focused="true"] > .radio-label-box {
55 | outline: none;
56 | }
57 | }
58 |
59 | .paneButtonIcon {
60 | width: 32px;
61 | height: 32px;
62 | }
63 |
64 | radio[pane]:hover {
65 | background-color: #E0E8F6;
66 | color: var(--in-content-button-text-color-hover);
67 | appearance: none;
68 | }
69 |
70 | radio[pane][selected="true"] {
71 | background-color: #C1D2EE;
72 | color: var(--in-content-button-text-color-hover);
73 | appearance: none;
74 | }
75 |
--------------------------------------------------------------------------------
/addon/chrome/skin/app_version/all/themeStyles.css:
--------------------------------------------------------------------------------
1 | /**
2 | * Bug 1884792 - Remove chrome-only :-moz-lwtheme pseudo-class
3 | * since Firefox 126 use :root[lwtheme] or :root[lwtheme-image]
4 | *
5 | */
6 |
7 | /* set background based on rules for #navigator-toolbox
8 | from chrome\browser\content\browser\browser.css */
9 | :root[lwtheme] #tabmix-bottom-toolbox > toolbox {
10 | background-image: var(--lwt-additional-images);
11 | background-repeat: var(--lwt-background-tiling);
12 | background-position: var(--lwt-background-alignment);
13 | }
14 |
15 | :root[lwtheme] #tabmix-bottom-toolbox {
16 | background-color: var(--tabmix-bottom-toolbox-color, var(--lwt-accent-color));
17 | }
18 |
19 | :root[lwtheme-image] #tabmix-bottom-toolbox > toolbox {
20 | background-image: var(--lwt-header-image), var(--lwt-additional-images);
21 | background-repeat: no-repeat, var(--lwt-background-tiling);
22 | background-position: right top, var(--lwt-background-alignment);
23 | }
24 |
25 | :root[lwtheme] #tabmix-bottom-toolbox > toolbox:-moz-window-inactive {
26 | background-color: var(--tabmix-bottom-toolbox-color, var(--lwt-accent-color-inactive, var(--lwt-accent-color)));
27 | }
28 |
29 | @media (-moz-platform: windows) {
30 | :root:not([lwtheme]) #TabsToolbar[tabbaronbottom] {
31 | appearance: none;
32 | border-top: 1px solid rgb(10 31 51 / 35%);
33 | }
34 | }
35 |
36 | @media (-moz-platform: linux) {
37 | :root[lwtheme-brighttext] #tabmix-tabs-closebutton:not(:hover) {
38 | background-image: -moz-image-rect(url("chrome://global/skin/icons/close.svg"), 0, 80, 16, 64);
39 | }
40 |
41 | :root[lwtheme]:not([lwtheme-brighttext]) #tabmix-tabs-closebutton:not(:hover) {
42 | background-image: -moz-image-rect(url("chrome://global/skin/icons/close.svg"), 0, 96, 16, 80);
43 | }
44 | }
45 |
46 | @media (-moz-platform: macos) {
47 | /* for mac - look in pinstripe/browser/browser.css */
48 | :root[lwtheme] #tabbrowser-tabs #tabbrowser-arrowscrollbox .tabbrowser-tab:not(:hover) > * > * > .tab-label:not([selected="true"]),
49 | :root[lwtheme] #tabbrowser-tabs #tabbrowser-arrowscrollbox .tabbrowser-tab:not(:hover) > * > * > .tab-label-container > .tab-label:not([selected="true"]) {
50 | opacity: .8;
51 | }
52 | }
53 |
--------------------------------------------------------------------------------
/addon/chrome/skin/app_version/all/themeStyles_before_126.css:
--------------------------------------------------------------------------------
1 | /**
2 | * Bug 1884792 - Remove chrome-only :-moz-lwtheme pseudo-class
3 | * since Firefox 126 use :root[lwtheme] or :root[lwtheme-image]
4 | * this file is for Firefox version before 126
5 | */
6 |
7 | /* set background based on rules for #navigator-toolbox
8 | from chrome\browser\content\browser\browser.css */
9 | #tabmix-bottom-toolbox > toolbox:-moz-lwtheme {
10 | background-image: var(--lwt-additional-images);
11 | background-repeat: var(--lwt-background-tiling);
12 | background-position: var(--lwt-background-alignment);
13 | }
14 |
15 | #tabmix-bottom-toolbox:-moz-lwtheme {
16 | background-color: var(--lwt-accent-color);
17 | }
18 |
19 | :root[lwtheme-image] #tabmix-bottom-toolbox > toolbox {
20 | background-image: var(--lwt-header-image), var(--lwt-additional-images);
21 | background-repeat: no-repeat, var(--lwt-background-tiling);
22 | background-position: right top, var(--lwt-background-alignment);
23 | }
24 |
25 | #tabmix-bottom-toolbox > toolbox:-moz-window-inactive:-moz-lwtheme {
26 | background-color: var(--lwt-accent-color-inactive, var(--lwt-accent-color));
27 | }
28 |
29 | @media (-moz-platform: windows) {
30 | #TabsToolbar[tabbaronbottom]:not(:-moz-lwtheme) {
31 | appearance: none;
32 | border-top: 1px solid rgb(10 31 51 / 35%);
33 | }
34 | }
35 |
36 | @media (-moz-platform: linux) {
37 | :root[lwtheme-brighttext] #tabmix-tabs-closebutton:not(:hover) {
38 | background-image: -moz-image-rect(url("chrome://global/skin/icons/close.svg"), 0, 80, 16, 64);
39 | }
40 |
41 | :root:-moz-lwtheme:not([lwtheme-brighttext]) #tabmix-tabs-closebutton:not(:hover) {
42 | background-image: -moz-image-rect(url("chrome://global/skin/icons/close.svg"), 0, 96, 16, 80);
43 | }
44 | }
45 |
46 | @media (-moz-platform: macos) {
47 | /* for mac - look in pinstripe/browser/browser.css */
48 | #tabbrowser-tabs > #tabbrowser-arrowscrollbox .tabbrowser-tab:not(:hover) > * > * > .tab-label:not([selected="true"]):-moz-lwtheme,
49 | #tabbrowser-tabs > #tabbrowser-arrowscrollbox .tabbrowser-tab:not(:hover) > * > * > .tab-label-container > .tab-label:not([selected="true"]):-moz-lwtheme {
50 | opacity: .8;
51 | }
52 | }
53 |
--------------------------------------------------------------------------------
/addon/chrome/skin/app_version/all/win/browser.css:
--------------------------------------------------------------------------------
1 | /**
2 | Firefox all versions
3 |
4 | Windows platform
5 |
6 | to apply rule only to default them add #tabbrowser-tabs[classic40]
7 | **/
8 |
9 | /* :::: tabbar on bottom :::: */
10 | #TabsToolbar[tabbaronbottom] {
11 | background-image: none !important;
12 | }
13 |
--------------------------------------------------------------------------------
/addon/chrome/skin/app_version/all/win/progress.css:
--------------------------------------------------------------------------------
1 | /**
2 | Firefox all versions
3 |
4 | windows and Linux platform
5 |
6 | **/
7 |
8 | /* :::: progress bar on tabs :::: */
9 | .tab-progress {
10 | appearance: none;
11 | min-height: 0;
12 | height: 4px;
13 | border: 0;
14 | margin-top: -4px;
15 | background-color: transparent;
16 | }
17 |
18 | .tab-progress > .progress-bar {
19 | appearance: none;
20 | min-width: 3px;
21 | border-top: 1px solid rgb(100 100 100 / 10%);
22 | border-bottom: 1px solid rgb(0 0 0 / 20%);
23 | background-color: Highlight;
24 | }
25 |
--------------------------------------------------------------------------------
/addon/chrome/skin/arrow-up.svg:
--------------------------------------------------------------------------------
1 |
4 |
7 |
--------------------------------------------------------------------------------
/addon/chrome/skin/autoreload.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/onemen/TabMixPlus/ad116819882b2dc87b122eb6130f81cec33e182c/addon/chrome/skin/autoreload.png
--------------------------------------------------------------------------------
/addon/chrome/skin/disabled.svg:
--------------------------------------------------------------------------------
1 |
4 |
--------------------------------------------------------------------------------
/addon/chrome/skin/dropmarker-leftright.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/onemen/TabMixPlus/ad116819882b2dc87b122eb6130f81cec33e182c/addon/chrome/skin/dropmarker-leftright.png
--------------------------------------------------------------------------------
/addon/chrome/skin/general.css:
--------------------------------------------------------------------------------
1 | /**
2 | Firefox all versions
3 |
4 | ALL platforms
5 |
6 | **/
7 |
8 | /* for privateTab extensions */
9 | #TabsToolbar[privateTab-fixAfterTabsButtonsAccessibility]
10 | #tabbrowser-tabs[tabmix-flowing="multibar"][widthFitTitle="true"] #tabs-newtab-button {
11 | vertical-align: bottom;
12 | }
13 |
14 | /* :::: for tabs close button on TabsToolbar :::: */
15 | #tabmix-tabs-closebutton[tabmix-fill-opacity] {
16 | appearance: none;
17 | fill-opacity: 0;
18 | opacity: 0.8
19 | }
20 |
21 | #tabmix-tabs-closebutton.close-icon {
22 | width: unset;
23 | }
24 |
25 | #tabmix-tabs-closebutton:not([overflowedItem]):hover {
26 | background-color: transparent;
27 | }
28 |
29 | #widget-overflow-list #tabmix-tabs-closebutton.close-icon > .toolbarbutton-text {
30 | display: block;
31 | }
32 |
33 | /* :::: Space on tab bar :::: */
34 | #tabbrowser-arrowscrollbox[orient="horizontal"][tabmix-tabBarSpace] {
35 | -moz-margin-start: 0;
36 | -moz-margin-end: 0;
37 | -moz-padding-end: 15px;
38 | -moz-padding-start: 15px;
39 | }
40 |
41 | #tabbrowser-arrowscrollbox[orient="vertical"][tabmix-tabBarSpace] {
42 | padding-block: 15px;
43 | }
44 |
45 | #TabsToolbar[tabmix-tabBarSpace] .titlebar-spacer[type="pre-tabs"],
46 | #TabsToolbar[tabmix-tabBarSpace] .titlebar-spacer[type="post-tabs"] {
47 | width: 25px;
48 | }
49 |
50 | /* same width as history > Recently Closed Windows */
51 | .tabmix-subview {
52 | max-width: 32em !important;
53 | }
54 |
55 | .tabmix-subview menuseparator.subviewbutton {
56 | border-top: 1px solid var(--panel-separator-color);
57 | min-height: 0;
58 | padding: 0;
59 | }
60 |
61 | .context-open {
62 | outline: var(--focus-outline);
63 | outline-offset: var(--focus-outline-inset);
64 | }
65 |
66 | #tabbrowser-tabs[no-animation] .tabbrowser-tab:not([pinned]) {
67 | transition: none !important;
68 | }
69 |
70 | #tabbrowser-tabs[orient="horizontal"][tabmix-multibar]:not([widthFitTitle]) #tabbrowser-arrowscrollbox > .tabbrowser-tab[fadein]:not([pinned]),
71 | #tabbrowser-tabs[orient="horizontal"][tabmix-multibar]:not([widthFitTitle]) #tabbrowser-arrowscrollbox > tab-group:not([collapsed]) > .tabbrowser-tab[fadein]:not([pinned]) {
72 | max-width: var(--tabmix-tab-overflow-width, var(--tab-min-width)) !important;
73 | }
74 |
--------------------------------------------------------------------------------
/addon/chrome/skin/help.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/onemen/TabMixPlus/ad116819882b2dc87b122eb6130f81cec33e182c/addon/chrome/skin/help.png
--------------------------------------------------------------------------------
/addon/chrome/skin/icons/appearance.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/onemen/TabMixPlus/ad116819882b2dc87b122eb6130f81cec33e182c/addon/chrome/skin/icons/appearance.png
--------------------------------------------------------------------------------
/addon/chrome/skin/icons/closed-tabs-16x16-disabled.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/onemen/TabMixPlus/ad116819882b2dc87b122eb6130f81cec33e182c/addon/chrome/skin/icons/closed-tabs-16x16-disabled.png
--------------------------------------------------------------------------------
/addon/chrome/skin/icons/closed-tabs-16x16-hovered.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/onemen/TabMixPlus/ad116819882b2dc87b122eb6130f81cec33e182c/addon/chrome/skin/icons/closed-tabs-16x16-hovered.png
--------------------------------------------------------------------------------
/addon/chrome/skin/icons/closed-tabs-16x16.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/onemen/TabMixPlus/ad116819882b2dc87b122eb6130f81cec33e182c/addon/chrome/skin/icons/closed-tabs-16x16.png
--------------------------------------------------------------------------------
/addon/chrome/skin/icons/closed-tabs-24x24-disabled.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/onemen/TabMixPlus/ad116819882b2dc87b122eb6130f81cec33e182c/addon/chrome/skin/icons/closed-tabs-24x24-disabled.png
--------------------------------------------------------------------------------
/addon/chrome/skin/icons/closed-tabs-24x24-hovered.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/onemen/TabMixPlus/ad116819882b2dc87b122eb6130f81cec33e182c/addon/chrome/skin/icons/closed-tabs-24x24-hovered.png
--------------------------------------------------------------------------------
/addon/chrome/skin/icons/closed-tabs-24x24.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/onemen/TabMixPlus/ad116819882b2dc87b122eb6130f81cec33e182c/addon/chrome/skin/icons/closed-tabs-24x24.png
--------------------------------------------------------------------------------
/addon/chrome/skin/icons/closed-win-16x16-disabled.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/onemen/TabMixPlus/ad116819882b2dc87b122eb6130f81cec33e182c/addon/chrome/skin/icons/closed-win-16x16-disabled.png
--------------------------------------------------------------------------------
/addon/chrome/skin/icons/closed-win-16x16-hovered.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/onemen/TabMixPlus/ad116819882b2dc87b122eb6130f81cec33e182c/addon/chrome/skin/icons/closed-win-16x16-hovered.png
--------------------------------------------------------------------------------
/addon/chrome/skin/icons/closed-win-16x16.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/onemen/TabMixPlus/ad116819882b2dc87b122eb6130f81cec33e182c/addon/chrome/skin/icons/closed-win-16x16.png
--------------------------------------------------------------------------------
/addon/chrome/skin/icons/closed-win-24x24-disabled.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/onemen/TabMixPlus/ad116819882b2dc87b122eb6130f81cec33e182c/addon/chrome/skin/icons/closed-win-24x24-disabled.png
--------------------------------------------------------------------------------
/addon/chrome/skin/icons/closed-win-24x24-hovered.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/onemen/TabMixPlus/ad116819882b2dc87b122eb6130f81cec33e182c/addon/chrome/skin/icons/closed-win-24x24-hovered.png
--------------------------------------------------------------------------------
/addon/chrome/skin/icons/closed-win-24x24.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/onemen/TabMixPlus/ad116819882b2dc87b122eb6130f81cec33e182c/addon/chrome/skin/icons/closed-win-24x24.png
--------------------------------------------------------------------------------
/addon/chrome/skin/icons/events.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/onemen/TabMixPlus/ad116819882b2dc87b122eb6130f81cec33e182c/addon/chrome/skin/icons/events.png
--------------------------------------------------------------------------------
/addon/chrome/skin/icons/links.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/onemen/TabMixPlus/ad116819882b2dc87b122eb6130f81cec33e182c/addon/chrome/skin/icons/links.png
--------------------------------------------------------------------------------
/addon/chrome/skin/icons/menu.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/onemen/TabMixPlus/ad116819882b2dc87b122eb6130f81cec33e182c/addon/chrome/skin/icons/menu.png
--------------------------------------------------------------------------------
/addon/chrome/skin/icons/mouse.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/onemen/TabMixPlus/ad116819882b2dc87b122eb6130f81cec33e182c/addon/chrome/skin/icons/mouse.png
--------------------------------------------------------------------------------
/addon/chrome/skin/icons/session-manager-16x16-disabled.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/onemen/TabMixPlus/ad116819882b2dc87b122eb6130f81cec33e182c/addon/chrome/skin/icons/session-manager-16x16-disabled.png
--------------------------------------------------------------------------------
/addon/chrome/skin/icons/session-manager-16x16-hovered.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/onemen/TabMixPlus/ad116819882b2dc87b122eb6130f81cec33e182c/addon/chrome/skin/icons/session-manager-16x16-hovered.png
--------------------------------------------------------------------------------
/addon/chrome/skin/icons/session-manager-16x16.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/onemen/TabMixPlus/ad116819882b2dc87b122eb6130f81cec33e182c/addon/chrome/skin/icons/session-manager-16x16.png
--------------------------------------------------------------------------------
/addon/chrome/skin/icons/session-manager-24x24-disabled.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/onemen/TabMixPlus/ad116819882b2dc87b122eb6130f81cec33e182c/addon/chrome/skin/icons/session-manager-24x24-disabled.png
--------------------------------------------------------------------------------
/addon/chrome/skin/icons/session-manager-24x24-hovered.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/onemen/TabMixPlus/ad116819882b2dc87b122eb6130f81cec33e182c/addon/chrome/skin/icons/session-manager-24x24-hovered.png
--------------------------------------------------------------------------------
/addon/chrome/skin/icons/session-manager-24x24.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/onemen/TabMixPlus/ad116819882b2dc87b122eb6130f81cec33e182c/addon/chrome/skin/icons/session-manager-24x24.png
--------------------------------------------------------------------------------
/addon/chrome/skin/icons/tab-list-16x16-disabled.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/onemen/TabMixPlus/ad116819882b2dc87b122eb6130f81cec33e182c/addon/chrome/skin/icons/tab-list-16x16-disabled.png
--------------------------------------------------------------------------------
/addon/chrome/skin/icons/tab-list-16x16-hovered.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/onemen/TabMixPlus/ad116819882b2dc87b122eb6130f81cec33e182c/addon/chrome/skin/icons/tab-list-16x16-hovered.png
--------------------------------------------------------------------------------
/addon/chrome/skin/icons/tab-list-16x16.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/onemen/TabMixPlus/ad116819882b2dc87b122eb6130f81cec33e182c/addon/chrome/skin/icons/tab-list-16x16.png
--------------------------------------------------------------------------------
/addon/chrome/skin/icons/tab-list-24x24-disabled.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/onemen/TabMixPlus/ad116819882b2dc87b122eb6130f81cec33e182c/addon/chrome/skin/icons/tab-list-24x24-disabled.png
--------------------------------------------------------------------------------
/addon/chrome/skin/icons/tab-list-24x24-hovered.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/onemen/TabMixPlus/ad116819882b2dc87b122eb6130f81cec33e182c/addon/chrome/skin/icons/tab-list-24x24-hovered.png
--------------------------------------------------------------------------------
/addon/chrome/skin/icons/tab-list-24x24.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/onemen/TabMixPlus/ad116819882b2dc87b122eb6130f81cec33e182c/addon/chrome/skin/icons/tab-list-24x24.png
--------------------------------------------------------------------------------
/addon/chrome/skin/locked.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/onemen/TabMixPlus/ad116819882b2dc87b122eb6130f81cec33e182c/addon/chrome/skin/locked.png
--------------------------------------------------------------------------------
/addon/chrome/skin/newtab.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/onemen/TabMixPlus/ad116819882b2dc87b122eb6130f81cec33e182c/addon/chrome/skin/newtab.png
--------------------------------------------------------------------------------
/addon/chrome/skin/pin.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/onemen/TabMixPlus/ad116819882b2dc87b122eb6130f81cec33e182c/addon/chrome/skin/pin.png
--------------------------------------------------------------------------------
/addon/chrome/skin/pref-appearance.css:
--------------------------------------------------------------------------------
1 | /********** global styles for pref-appearance.css ********/
2 |
3 | @import url("chrome://tabmix-version/skin/pref-appearance.css");
4 |
--------------------------------------------------------------------------------
/addon/chrome/skin/preferences.css:
--------------------------------------------------------------------------------
1 | /********** preferences ********/
2 |
3 | @import url("chrome://tabmix-version/skin/preferences.css");
4 |
--------------------------------------------------------------------------------
/addon/chrome/skin/protected.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/onemen/TabMixPlus/ad116819882b2dc87b122eb6130f81cec33e182c/addon/chrome/skin/protected.png
--------------------------------------------------------------------------------
/addon/chrome/skin/question-16.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/onemen/TabMixPlus/ad116819882b2dc87b122eb6130f81cec33e182c/addon/chrome/skin/question-16.png
--------------------------------------------------------------------------------
/addon/chrome/skin/refresh.svg:
--------------------------------------------------------------------------------
1 |
4 |
--------------------------------------------------------------------------------
/addon/chrome/skin/renameTab.css:
--------------------------------------------------------------------------------
1 |
2 | #tabmixRenametab_icon {
3 | list-style-image: url("chrome://tabmixplus/skin/tmp.png");
4 | width: 48px;
5 | height: 48px;
6 | }
7 |
8 | #tabmixRenametab_title {
9 | font-size: 130%;
10 | }
11 |
12 | #tabmixRenametab_defaultField {
13 | cursor: default;
14 | background-color: -moz-dialog;
15 | color: GrayText;
16 | }
17 |
18 | #tabmixRenametab_panel > spacer {
19 | height: 5px;
20 | }
21 |
22 | #tabmixRenametab_panel:not([modified]) #tabmixRenametab_resetButton,
23 | #tabmixRenametab_panel:not([modified]) #tabmixRenametab_defaultRow {
24 | visibility: hidden;
25 | }
26 |
--------------------------------------------------------------------------------
/addon/chrome/skin/tmp.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/onemen/TabMixPlus/ad116819882b2dc87b122eb6130f81cec33e182c/addon/chrome/skin/tmp.png
--------------------------------------------------------------------------------
/addon/chrome/skin/tmpsmall.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/onemen/TabMixPlus/ad116819882b2dc87b122eb6130f81cec33e182c/addon/chrome/skin/tmpsmall.png
--------------------------------------------------------------------------------
/addon/icon.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/onemen/TabMixPlus/ad116819882b2dc87b122eb6130f81cec33e182c/addon/icon.png
--------------------------------------------------------------------------------
/addon/install.rdf:
--------------------------------------------------------------------------------
1 |
2 |
4 |
5 |
6 | {dc572301-7619-498c-a57d-39143191b318}
7 | Tab Mix Plus
8 | 10.0.0-unbundeled
9 | true
10 | 2
11 | true
12 | Tab browsing with an added boost.
13 | chrome://tabmixplus/skin/tmp.png
14 | https://onemen.github.io/tabmixplus-docs
15 | chrome://tabmixplus/content/preferences/preferences.xhtml
16 | 1
17 | ONEMEN (tabmix.onemen@gmail.com)
18 | ONEMEN
19 | https://raw.githubusercontent.com/onemen/TabMixPlus/main/config/updates.json
20 |
21 |
22 |
23 |
24 | {ec8030f7-c20a-464f-9b0e-13a3a9e97384}
25 | 115.0
26 | *
27 |
28 |
29 |
30 |
31 |
32 |
--------------------------------------------------------------------------------
/addon/modules/ContentSvc.sys.mjs:
--------------------------------------------------------------------------------
1 | /** @type {ContentSvcModule.Lazy} */ // @ts-ignore
2 | const lazy = {};
3 |
4 | ChromeUtils.defineESModuleGetters(lazy, {
5 | //
6 | isVersion: "chrome://tabmix-resource/content/BrowserVersion.sys.mjs",
7 | });
8 |
9 | /** @type {Partial} */
10 | export const ContentSvc = {
11 | aboutNewtab: "about:newtab",
12 |
13 | getString(aStringKey) {
14 | try {
15 | // @ts-ignore
16 | return this._strings.GetStringFromName(aStringKey);
17 | } catch (e) {
18 | dump("*** Failed to get string " + aStringKey + " in bundle: tabmix.properties\n");
19 | throw e;
20 | }
21 | },
22 |
23 | version(versionNo, updateChannel) {
24 | return lazy.isVersion.apply(null, [versionNo, updateChannel]);
25 | },
26 | };
27 |
28 | // Tabmix preference branch
29 | ChromeUtils.defineLazyGetter(ContentSvc, "prefBranch", () => {
30 | return Services.prefs.getBranch("extensions.tabmix.");
31 | });
32 | ChromeUtils.defineLazyGetter(ContentSvc, "_strings", () => {
33 | let properties = "chrome://tabmixplus/locale/tabmix.properties";
34 | return Services.strings.createBundle(properties);
35 | });
36 |
--------------------------------------------------------------------------------
/addon/modules/ContextMenu.sys.mjs:
--------------------------------------------------------------------------------
1 | /** @type {ContextMenuModule.Lazy} */ // @ts-ignore
2 | const lazy = {};
3 | ChromeUtils.defineESModuleGetters(lazy, {
4 | //
5 | TabmixUtils: "chrome://tabmix-resource/content/Utils.sys.mjs",
6 | });
7 |
8 | /** @type {TabmixContextMenu} */
9 | export const ContextMenu = {
10 | getSelectedLinks(content) {
11 | let doc = content.document;
12 | const NodeFilter = doc.defaultView.NodeFilter;
13 | // get focused window selection
14 | let selectionObject = lazy.TabmixUtils.focusedWindow(content).getSelection();
15 | if (selectionObject?.isCollapsed) {
16 | // nothing selected
17 | return new Map();
18 | }
19 |
20 | let filter = {
21 | acceptNode(/** @type {Node} n */ n) {
22 | if (n.nodeName == "A" || n.nodeName == "li") {
23 | return NodeFilter.FILTER_ACCEPT;
24 | }
25 | return NodeFilter.FILTER_SKIP;
26 | },
27 | };
28 |
29 | // do urlSecurityCheck for each link in the treeWalker....
30 | let secMan = Services.scriptSecurityManager;
31 |
32 | /** @param {string} url */
33 | let securityCheck = function (url) {
34 | if (!url) {
35 | return false;
36 | }
37 |
38 | if (!doc) {
39 | // just in case....
40 | return true;
41 | }
42 |
43 | try {
44 | secMan.checkLoadURIStrWithPrincipal(doc.nodePrincipal, url, secMan.STANDARD);
45 | } catch {
46 | return false;
47 | }
48 | return true;
49 | };
50 |
51 | let urls = new Map();
52 | let range = selectionObject?.getRangeAt(0).cloneContents();
53 | if (!range) {
54 | return urls;
55 | }
56 |
57 | /** @typedef {HTMLLinkElement & {firstChild: LinkNode}} LinkNode */
58 | /** @type {Omit & {nextNode(): LinkNode}} */ // @ts-ignore
59 | let treeWalker = doc.createTreeWalker(range, NodeFilter.SHOW_ELEMENT, filter);
60 | let nextEpisode = treeWalker.nextNode();
61 | while (nextEpisode !== null) {
62 | let target = nextEpisode;
63 | if (nextEpisode.nodeName == "li") {
64 | let node = nextEpisode.firstChild;
65 | target = node.nodeName == "p" ? node.firstChild : node;
66 | }
67 | let url = target.href;
68 | if (securityCheck(url)) {
69 | if (!urls.has(url)) {
70 | urls.set(url, target.getAttribute("data-usercontextid"));
71 | }
72 | }
73 | nextEpisode = treeWalker.nextNode();
74 | }
75 | return urls;
76 | },
77 | };
78 |
--------------------------------------------------------------------------------
/addon/modules/DocShellCapabilities.sys.mjs:
--------------------------------------------------------------------------------
1 | /** @type {DocShellCapabilitiesModule.Lazy} */ // @ts-ignore
2 | const lazy = {};
3 |
4 | ChromeUtils.defineESModuleGetters(lazy, {
5 | TabState: "resource:///modules/sessionstore/TabState.sys.mjs",
6 | TabStateCache: "resource:///modules/sessionstore/TabStateCache.sys.mjs",
7 | });
8 |
9 | /** @type {DocShellCapabilitiesModule.DocShellCapabilities} */
10 | export const DocShellCapabilities = {
11 | init() {
12 | //
13 | },
14 |
15 | update(browser, data) {
16 | // Update the persistent tab state cache
17 | lazy.TabStateCache.update(browser.permanentKey, {disallow: data.disallow || null});
18 | if (data.reload) {
19 | browser.reload();
20 | }
21 | },
22 |
23 | collect(tab) {
24 | let window = tab.ownerGlobal;
25 | if (window && window.__SSi) {
26 | let tabState = lazy.TabState.collect(tab);
27 | return tabState.disallow || "";
28 | }
29 |
30 | return "";
31 | },
32 |
33 | restore(tab, disallow, reload) {
34 | let browser = tab.linkedBrowser;
35 | if (tab.getAttribute("pending") == "true") {
36 | this.update(browser, {disallow, reload: false});
37 | return;
38 | }
39 |
40 | browser.messageManager.sendAsyncMessage("Tabmix:restorePermissions", {
41 | disallow,
42 | reload: reload || false,
43 | });
44 | },
45 |
46 | /** for tab context menu ** */
47 |
48 | onGet(nodes, tab) {
49 | let disallow = this.collect(tab);
50 | for (const element of nodes) {
51 | element.setAttribute("checked", !disallow.includes(element.value));
52 | }
53 | },
54 |
55 | onSet(tab, node) {
56 | const parentNodes = node.parentNode?.childNodes ?? [];
57 | const disallow = Array.from(parentNodes)
58 | .filter(element => element?.getAttribute("checked") !== "true")
59 | .map(element => element?.value);
60 | this.restore(tab, disallow.join(","), true);
61 | },
62 | };
63 |
--------------------------------------------------------------------------------
/addon/modules/DownloadLastDir.sys.mjs:
--------------------------------------------------------------------------------
1 | import {DownloadLastDir} from "resource://gre/modules/DownloadLastDir.sys.mjs";
2 |
3 | /** @type {DownloadLastDirModule.DownloadLastDir} */
4 | export const TabmixDownloadLastDir = {
5 | _initialized: false,
6 | init() {
7 | if (this._initialized) {
8 | return;
9 | }
10 |
11 | this._initialized = true;
12 |
13 | // original DownloadLastDir.sys.mjs query Ci.nsILoadContext on this.window,
14 | // it fails if we already closed the tab that initialized the download
15 | // with TypeError: can't access dead object
16 | /**
17 | * @type {TypedPropertyDescriptor &
18 | * ThisType}
19 | */
20 | let descriptor = {
21 | get() {
22 | if (this._window) {
23 | try {
24 | this._window.QueryInterface(Ci.nsIInterfaceRequestor);
25 | } catch {
26 | let win = Services.wm.getMostRecentWindow("navigator:browser");
27 | return win ? win.gBrowser.selectedTab.ownerGlobal : null;
28 | }
29 | }
30 | return this._window;
31 | },
32 | set(val) {
33 | this._window = val;
34 | return val;
35 | },
36 | configurable: true,
37 | enumerable: true,
38 | };
39 |
40 | let obj = DownloadLastDir.prototype;
41 | Object.defineProperty(obj, "window", descriptor);
42 | obj._window = null;
43 | },
44 | };
45 |
46 | TabmixDownloadLastDir.init();
47 |
--------------------------------------------------------------------------------
/addon/modules/NewTabURL.sys.mjs:
--------------------------------------------------------------------------------
1 | import {TabmixChromeUtils} from "chrome://tabmix-resource/content/ChromeUtils.sys.mjs";
2 |
3 | /** @type {NewTabURLModule.Lazy} */ // @ts-ignore
4 | const lazy = {};
5 |
6 | TabmixChromeUtils.defineLazyModuleGetters(lazy, {
7 | // AboutNewTab.sys.mjs exists since Firefox 116
8 | AboutNewTab: "resource:///modules/AboutNewTab.jsm",
9 | });
10 |
11 | const FIREFOX_PREF = "browser.#.url".replace("#", "newtab");
12 | const ABOUT_NEW_TAB = "about:#".replace("#", "newtab");
13 |
14 | // browser. newtab.url preference was removed by bug 1118285 (Firefox 41+)
15 | /** @type {NewTabURLModule.NewTabURL} */
16 | export const Tabmix_NewTabURL = {
17 | QueryInterface: ChromeUtils.generateQI(["nsIObserver", "nsISupportsWeakReference"]),
18 |
19 | init() {
20 | if (Services.prefs.prefHasUserValue(FIREFOX_PREF)) {
21 | this.updateNewTabURL();
22 | }
23 |
24 | // eslint-disable-next-line mozilla/balanced-observers
25 | Services.prefs.addObserver(FIREFOX_PREF, this, true);
26 | },
27 |
28 | observe(aSubject, aTopic, aData) {
29 | switch (aTopic) {
30 | case "nsPref:changed":
31 | if (aData == FIREFOX_PREF) {
32 | this.updateNewTabURL();
33 | }
34 |
35 | break;
36 | }
37 | },
38 |
39 | // for Firefox 44+
40 | updateNewTabURL() {
41 | let value = Services.prefs.getStringPref(FIREFOX_PREF);
42 | if (value == ABOUT_NEW_TAB) {
43 | lazy.AboutNewTab.resetNewTabURL();
44 | } else {
45 | try {
46 | Services.io.newURI(value);
47 | lazy.AboutNewTab.newTabURL = value;
48 | } catch {
49 | let {preferredURI} = Services.uriFixup.getFixupURIInfo(value);
50 | lazy.AboutNewTab.newTabURL = preferredURI.spec;
51 | }
52 | }
53 | },
54 | };
55 |
56 | Tabmix_NewTabURL.init();
57 |
--------------------------------------------------------------------------------
/addon/modules/bootstrap/PreferencesLoader.sys.mjs:
--------------------------------------------------------------------------------
1 | import {TabContextConfig} from "chrome://tabmix-resource/content/TabContextConfig.sys.mjs";
2 | import {Preferences} from "resource://gre/modules/Preferences.sys.mjs";
3 |
4 | /** load Tabmix preference to the default branch */
5 | export const PreferencesLoader = {
6 | _defaultPreferencesLoaded: false,
7 |
8 | loadDefaultPreferences() {
9 | if (this._defaultPreferencesLoaded) {
10 | return;
11 | }
12 | this._defaultPreferencesLoaded = true;
13 | const prefs = new Preferences({defaultBranch: true});
14 |
15 | /**
16 | * @param {string} prefName
17 | * @param {string | number | boolean} prefValue
18 | */
19 | const pref = function (prefName, prefValue) {
20 | const setPref = () => {
21 | try {
22 | prefs.set(prefName, prefValue);
23 | } catch (ex1) {
24 | console.log(prefName, prefValue, ex1);
25 | try {
26 | // current value is invalid or deleted by the user
27 | Services.prefs.clearUserPref(prefName);
28 | prefs.set(prefName, prefValue);
29 | } catch (ex2) {
30 | console.error(`Tabmix errored twice when trying to set ${prefName} default`);
31 | console.error("Tabmix Error", ex1);
32 | console.error("Tabmix Error", ex2);
33 | }
34 | }
35 | };
36 |
37 | switch (prefValue.constructor.name) {
38 | case "String":
39 | case "Number":
40 | case "Boolean":
41 | setPref();
42 | break;
43 | default:
44 | console.error(
45 | `Tabmix Error: can't set pref ${prefName} to value '${prefValue}'; ` +
46 | "it isn't a String, Number, or Boolean"
47 | );
48 | }
49 | };
50 |
51 | try {
52 | const path = "chrome://tabmix-prefs/content/tabmix.js";
53 | Services.scriptloader.loadSubScript(path, {pref});
54 | } catch (ex) {
55 | console.error("Tabmix Error:", ex);
56 | }
57 |
58 | // Initialize tab context menu preferences
59 | try {
60 | for (const [id, config] of Object.entries(TabContextConfig.prefList)) {
61 | const [name, defaultVisible = true] = config;
62 | const prefName = name || id.replace(/^context_|^tm-/, "");
63 | pref(`extensions.tabmix.${prefName}`, defaultVisible);
64 | }
65 | } catch (ex) {
66 | console.error("Tabmix Error:", ex);
67 | }
68 | },
69 | };
70 |
--------------------------------------------------------------------------------
/addon/modules/tsconfig.json:
--------------------------------------------------------------------------------
1 | {
2 | "extends": "../../config/base.tsconfig.json",
3 | "include": ["**/*.js", "**/*.sys.mjs"],
4 | "exclude": [],
5 | "compilerOptions": {
6 | "types": ["index.d.ts", "addon.d.ts"]
7 | }
8 | }
9 |
--------------------------------------------------------------------------------
/addon/tsconfig.json:
--------------------------------------------------------------------------------
1 | {
2 | "extends": "../config/base.tsconfig.json",
3 | "include": ["*.js"],
4 | "exclude": [
5 | "node_modules",
6 | "**/gecko/**/*.d.ts",
7 | "logs/**",
8 | "**/*~/*",
9 | "**/*~*.*",
10 | "**/*.local.*",
11 | // files with different scopes
12 | "chrome/**",
13 | "defaults/**",
14 | "modules/**"
15 | ],
16 | "compilerOptions": {
17 | "types": ["index.d.ts", "general.d.ts"]
18 | }
19 | }
20 |
--------------------------------------------------------------------------------
/config/.prettierignore:
--------------------------------------------------------------------------------
1 | # ignore imported types
2 | **/gecko/**/*.*
3 | .vscode
4 | logs
5 | *.css
6 | *.xhtml
7 |
--------------------------------------------------------------------------------
/config/.stylelintrc.json:
--------------------------------------------------------------------------------
1 | {
2 | "extends": ["stylelint-config-standard"],
3 | "rules": {
4 | "declaration-property-value-no-unknown": null,
5 | "media-query-no-invalid": null,
6 | "selector-id-pattern": null,
7 | "selector-class-pattern": null,
8 | "selector-type-no-unknown": [
9 | true,
10 | {
11 | "ignoreTypes": [
12 | "tabbrowser-tabs",
13 | "tabbrowser-tab",
14 | "tabmix-scrollbox",
15 | "checkbox",
16 | "checkbox_tmp",
17 | "colorbox",
18 | "description",
19 | "dialog",
20 | "groupbox",
21 | "hbox",
22 | "html|input",
23 | "html|fieldset",
24 | "html|legend",
25 | "menulist",
26 | "menuseparator",
27 | "prefpane",
28 | "prefwindow",
29 | "preference",
30 | "preferences",
31 | "radio",
32 | "radiogroup",
33 | "richlistbox",
34 | "separator",
35 | "shortcut",
36 | "tab",
37 | "tab-group",
38 | "tabbox",
39 | "tabpanel",
40 | "tabs",
41 | "tabpanels",
42 | "toolbarbutton",
43 | "toolbar",
44 | "toolbox",
45 | "vbox",
46 | "windowdragbox"
47 | ]
48 | }
49 | ]
50 | }
51 | }
52 |
--------------------------------------------------------------------------------
/config/base.tsconfig.json:
--------------------------------------------------------------------------------
1 | {
2 | "compilerOptions": {
3 | "typeRoots": ["../@types"],
4 | "target": "ES2023",
5 | "lib": ["DOM", "ES2023"],
6 | "module": "commonjs",
7 | "baseUrl": ".",
8 | "allowJs": true,
9 | "checkJs": true,
10 | "noEmit": true,
11 | "esModuleInterop": true,
12 | "forceConsistentCasingInFileNames": true,
13 |
14 | "allowUnreachableCode": false,
15 | "allowUnusedLabels": false,
16 | "alwaysStrict": true,
17 | // "noFallthroughCasesInSwitch": true, // we have lint rule for this
18 | "noImplicitAny": true,
19 | // "noImplicitOverride": true, // useless for our use case
20 | "noImplicitReturns": true,
21 | "noImplicitThis": true,
22 | "noPropertyAccessFromIndexSignature": true,
23 | "noUncheckedIndexedAccess": true,
24 | "noUnusedLocals": true,
25 | // "noUnusedParameters": true, // we have eslint rule for this
26 | "strict": true,
27 | "strictBindCallApply": true,
28 | "strictFunctionTypes": true,
29 | "useUnknownInCatchVariables": true,
30 |
31 | "strictNullChecks": true,
32 | "exactOptionalPropertyTypes": true,
33 | "strictPropertyInitialization": true
34 | }
35 | }
36 |
--------------------------------------------------------------------------------
/config/eslint-plugin-tabmix/index.js:
--------------------------------------------------------------------------------
1 | import importGlobals from "./import-globals.js";
2 | import lazyGetterNameMatch from "./lazy-getter-name-match.js";
3 | import validLazy from "./valid-lazy.js";
4 |
5 | export default {
6 | meta: {
7 | name: "eslint-plugin-tabmix",
8 | version: "1.2.0",
9 | },
10 | environments: {
11 | "extensions": {
12 | //
13 | TabView: false,
14 | },
15 | "extensions-js": {
16 | bgSaverPref: false,
17 | CHROMATABS: false,
18 | closeallOverlay: false,
19 | com: false,
20 | contentAreaDNDObserver: false,
21 | faviconize: false,
22 | FdUtils: false,
23 | FireGestures: false,
24 | foxTab: false,
25 | gFxWeaveGlue: false,
26 | IeTab2: false,
27 | Local_Install: false,
28 | mgBuiltInFunctions: false,
29 | MouseControl: false,
30 | objLinkify: false,
31 | PersonaController: false,
32 | rdrb: false,
33 | readPref: false,
34 | RSSTICKER: false,
35 | SecondSearchBrowser: false,
36 | SpeedDial: false,
37 | tileTabs: false,
38 | TreeStyleTabWindowHelper: false,
39 | TreeStyleTabBrowser: false,
40 | },
41 | "tabmix": {
42 | gTMPprefObserver: true,
43 | Tabmix: true,
44 | TabmixAllTabs: true,
45 | TabmixChromeUtils: true,
46 | TabmixContext: true,
47 | TabmixProgressListener: true,
48 | TabmixSvc: true,
49 | TabmixTabbar: true,
50 | TabmixTabClickOptions: true,
51 | TMP_BrowserOpenTab: true,
52 | TMP_ClosedTabs: true,
53 | TMP_eventListener: true,
54 | TMP_extensionsCompatibility: true,
55 | TMP_LastTab: true,
56 | TMP_Places: true,
57 | TMP_SessionStore: true,
58 | TMP_tabDNDObserver: true,
59 | TMP_undocloseTabButtonObserver: true,
60 |
61 | ZenWorkspaces: true,
62 | gZenVerticalTabsManager: true,
63 | },
64 | "preferences": {
65 | $: false,
66 | $Pref: false,
67 | $Pane: false,
68 | gAppearancePane: false,
69 | getFormattedKey: false,
70 | gMenuPane: false,
71 | gNumberInput: false,
72 | gPrefWindow: false,
73 | MozXULElement: false,
74 | RTL_UI: false,
75 | Services: false,
76 | Shortcuts: false,
77 | Tabmix: false,
78 | TabmixChromeUtils: true,
79 | TabmixSvc: false,
80 | },
81 | },
82 | rules: {
83 | "import-globals": importGlobals,
84 | "lazy-getter-name-match": lazyGetterNameMatch,
85 | "valid-lazy": validLazy,
86 | },
87 | };
88 |
--------------------------------------------------------------------------------
/config/eslint-plugin-tabmix/lazy-getter-name-match.js:
--------------------------------------------------------------------------------
1 | export default {
2 | meta: {
3 | type: "problem",
4 | docs: {
5 | description: "Ensure lazyGetter second argument matches the getter name",
6 | category: "Possible Errors",
7 | recommended: true,
8 | },
9 | fixable: "code",
10 | },
11 | create(context) {
12 | return {
13 | CallExpression(node) {
14 | const callee = node.callee;
15 |
16 | // Check if it's a lazyGetter call
17 | if (
18 | !["Property", "MemberExpression"].includes(callee.type) ||
19 | callee.property.name !== "lazyGetter"
20 | ) {
21 | return;
22 | }
23 |
24 | // Check if it's called on 'this' or 'Tabmix'
25 | if (callee.object.type !== "ThisExpression" && callee.object.name !== "Tabmix") {
26 | return;
27 | }
28 |
29 | // let currentNode = node.parent;
30 | // while (currentNode && !types.includes(currentNode.type)) {
31 | // currentNode = currentNode.parent;
32 | // }
33 | let currentNode = node.parent;
34 | while (currentNode && !["Property", "MethodDefinition"].includes(currentNode.type)) {
35 | currentNode = currentNode.parent;
36 | }
37 |
38 | if (!currentNode || currentNode.kind !== "get") {
39 | return;
40 | }
41 |
42 | const getterName = currentNode.key.name;
43 | const lazyGetterNameArg = node.arguments[1];
44 |
45 | if (lazyGetterNameArg.type !== "Literal" || lazyGetterNameArg.value !== getterName) {
46 | context.report({
47 | node: lazyGetterNameArg,
48 | message: `lazyGetter name argument "${lazyGetterNameArg.value}" should match getter name "${getterName}"`,
49 | fix(fixer) {
50 | return fixer.replaceText(lazyGetterNameArg, `"${getterName}"`);
51 | },
52 | });
53 | }
54 | },
55 | };
56 | },
57 | };
58 |
--------------------------------------------------------------------------------
/config/eslint-plugin-tabmix/package.json:
--------------------------------------------------------------------------------
1 | {
2 | "name": "eslint-plugin-tabmix",
3 | "version": "1.2.0",
4 | "description": "A collection of globals for Tab Mix Plus extension.",
5 | "type": "module",
6 | "main": "index.js",
7 | "scripts": {
8 | "test": "echo \"Error: no test specified\" && exit 1"
9 | },
10 | "keywords": [
11 | "eslint",
12 | "eslintplugin",
13 | "eslint-plugin",
14 | "tabmix",
15 | "firefox"
16 | ],
17 | "homepage": "https://onemen.github.io/tabmixplus-docs/",
18 | "author": "tabmix.onemen@gmail.com",
19 | "license": "MIT"
20 | }
21 |
--------------------------------------------------------------------------------
/config/eslint-plugin-tabmix/valid-lazy.js:
--------------------------------------------------------------------------------
1 | /* eslint-disable no-unused-vars */
2 |
3 | /**
4 | * append TabmixChromeUtils to eslint-plugin-mozilla valid-lazy rule items and
5 | * callExpressionMultiDefinitions lists
6 | */
7 |
8 | import MozillaHelpers from "eslint-plugin-mozilla/lib/helpers.js";
9 | import validLazy from "eslint-plugin-mozilla/lib/rules/valid-lazy.js";
10 |
11 | // used as closer in eval
12 | const helpers = MozillaHelpers;
13 |
14 | // @ts-expect-error - used as closer in eval
15 | const items = [
16 | "loader",
17 | "XPCOMUtils",
18 | "Integration",
19 | "TabmixChromeUtils",
20 | "ChromeUtils",
21 | "DevToolsUtils",
22 | "Object",
23 | "Reflect",
24 | ];
25 |
26 | // @ts-expect-error - used as closer in eval
27 | const callExpressionDefinitions = [
28 | /^loader\.lazyGetter\(lazy, "(\w+)"/,
29 | /^loader\.lazyServiceGetter\(lazy, "(\w+)"/,
30 | /^loader\.lazyRequireGetter\(lazy, "(\w+)"/,
31 | /^TabmixChromeUtils\.defineLazyGetter\(lazy, "(\w+)"/,
32 | /^Integration\.downloads\.defineESModuleGetter\(lazy, "(\w+)"/,
33 | /^ChromeUtils\.defineLazyGetter\(lazy, "(\w+)"/,
34 | /^XPCOMUtils\.defineLazyPreferenceGetter\(lazy, "(\w+)"/,
35 | /^XPCOMUtils\.defineLazyScriptGetter\(lazy, "(\w+)"/,
36 | /^XPCOMUtils\.defineLazyServiceGetter\(lazy, "(\w+)"/,
37 | /^XPCOMUtils\.defineConstant\(lazy, "(\w+)"/,
38 | /^DevToolsUtils\.defineLazyGetter\(lazy, "(\w+)"/,
39 | /^Object\.defineProperty\(lazy, "(\w+)"/,
40 | /^Reflect\.defineProperty\(lazy, "(\w+)"/,
41 | ];
42 |
43 | // @ts-expect-error - used as closer in eval
44 | const callExpressionMultiDefinitions = [
45 | "TabmixChromeUtils.defineLazyModuleGetters(lazy,",
46 | "ChromeUtils.defineESModuleGetters(lazy,",
47 | "XPCOMUtils.defineLazyServiceGetters(lazy,",
48 | "Object.defineProperties(lazy,",
49 | "loader.lazyRequireGetter(lazy,",
50 | ];
51 |
52 | // fix a bug in mozilla valid-lazy.js when the code is `let lazy`
53 | let createFunction = validLazy.create.toString().replace(/node\.init\./g, "node.init?.");
54 |
55 | if (!createFunction.startsWith("function")) {
56 | createFunction = "function " + createFunction;
57 | }
58 |
59 | export default {
60 | ...validLazy,
61 | create: eval("(" + createFunction + ")"),
62 | };
63 |
--------------------------------------------------------------------------------
/config/husky/commit-msg:
--------------------------------------------------------------------------------
1 | #!/bin/sh
2 |
3 | branch=$(git rev-parse --abbrev-ref HEAD)
4 | if [ "$branch" = "main" ]; then
5 | # Read commit message
6 | MSG=$(cat $1)
7 | FIRST_LINE=$(head -n1 $1)
8 |
9 | # Check pattern: keyword: message
10 | if ! echo "$FIRST_LINE" | grep -qE '^(feat|fix|docs|style|refactor|perf|test|build|ci|chore|revert)(\([a-z0-9-]+\))?: [a-z]'; then
11 | echo "Error: Invalid commit format. Your commit must follow this pattern:"
12 | echo " type(optional-scope): message"
13 | echo ""
14 | echo "Where:"
15 | echo "- type must be one of: feat, fix, docs, style, refactor, perf, test, build, ci, chore, revert"
16 | echo "- scope (if used) must be in parentheses"
17 | echo "- message must start with lowercase"
18 | echo ""
19 | echo "Examples:"
20 | echo " feat: add new feature"
21 | echo " fix(browser): resolve crash on startup"
22 | exit 1
23 | fi
24 |
25 | # Check length
26 | if [ ${#FIRST_LINE} -gt 110 ]; then
27 | echo "Error: First line of commit message is too long (${#FIRST_LINE} > 110)"
28 | exit 1
29 | fi
30 |
31 | echo "Commit message validation passed"
32 | fi
33 |
--------------------------------------------------------------------------------
/config/husky/commitlint.config.js:
--------------------------------------------------------------------------------
1 | export default {
2 | extends: ["@commitlint/config-conventional"],
3 | rules: {"header-max-length": [2, "always", 110]},
4 | };
5 |
--------------------------------------------------------------------------------
/config/husky/lint-staged.config.js:
--------------------------------------------------------------------------------
1 | /** @type {import("lint-staged").Config} */
2 | export default {
3 | "*": files => {
4 | const commands = [];
5 |
6 | // ESLint (Flat config handles file filtering)
7 | commands.push(
8 | `eslint --fix --format stylish --cache --cache-location config/.eslintcache --no-warn-ignored ${files.join(" ")}`
9 | );
10 |
11 | // stylelint only for addon/**/*.css
12 | const stylelintFiles = files.filter(f => /^addon\/.*\.css$/.test(f));
13 | if (stylelintFiles.length) {
14 | commands.push(
15 | `stylelint --fix --config config/.stylelintrc.json ${stylelintFiles.join(" ")}`
16 | );
17 | }
18 |
19 | return commands;
20 | },
21 | };
22 |
--------------------------------------------------------------------------------
/config/husky/pre-commit:
--------------------------------------------------------------------------------
1 | #!/bin/sh
2 |
3 | if (exec < /dev/tty) ; then
4 | exec >/dev/tty 2>&1;
5 | fi
6 |
7 | branch=$(git rev-parse --abbrev-ref HEAD)
8 | if [ "$branch" = "main" ]; then
9 | ./node_modules/.bin/lint-staged --concurrent true --no-stash --config ./config/husky/lint-staged.config.js
10 | fi
11 |
--------------------------------------------------------------------------------
/config/prettier.config.js:
--------------------------------------------------------------------------------
1 | /** @type {import("prettier").Config} */
2 | export default {
3 | arrowParens: "avoid",
4 | bracketSpacing: false,
5 | endOfLine: "lf",
6 | htmlWhitespaceSensitivity: "css",
7 | insertPragma: false,
8 | printWidth: 100,
9 | proseWrap: "always",
10 | quoteProps: "consistent",
11 | requirePragma: false,
12 | semi: true,
13 | singleQuote: false,
14 | tabWidth: 2,
15 | trailingComma: "es5",
16 | useTabs: false,
17 | experimentalTernaries: true,
18 | plugins: ["prettier-plugin-jsdoc"],
19 | jsdocCapitalizeDescription: false,
20 | jsdocPrintWidth: 80,
21 | overrides: [
22 | {
23 | files: "*.yaml",
24 | options: {
25 | semi: false,
26 | singleQuote: true,
27 | },
28 | },
29 | {
30 | files: "*.d.ts",
31 | options: {
32 | printWidth: 500,
33 | jsdocPrintWidth: 120,
34 | },
35 | },
36 | ],
37 | };
38 |
--------------------------------------------------------------------------------
/config/zen_updates.json:
--------------------------------------------------------------------------------
1 | {
2 | "addons": {
3 | "{dc572301-7619-498c-a57d-39143191b318}": {
4 | "updates": [
5 | {
6 | "version": "1.26.0",
7 | "update_link": "https://bitbucket.org/onemen/tabmixplus-for-firefox/downloads/tab_mix_plus-1.26.0a.xpi",
8 | "browser_specific_settings": {
9 | "gecko": {"strict_min_version": "1.0"}
10 | }
11 | },
12 | {
13 | "version": "1.27.0",
14 | "update_link": "https://bitbucket.org/onemen/tabmixplus-for-firefox/downloads/tab_mix_plus-1.27.0.xpi",
15 | "browser_specific_settings": {
16 | "gecko": {"strict_min_version": "1.0"}
17 | }
18 | },
19 | {
20 | "version": "1.28.0",
21 | "update_link": "https://bitbucket.org/onemen/tabmixplus-for-firefox/downloads/tab_mix_plus-1.28.0a.xpi",
22 | "browser_specific_settings": {
23 | "gecko": {"strict_min_version": "1.0"}
24 | }
25 | },
26 | {
27 | "version": "1.29.0",
28 | "update_link": "https://bitbucket.org/onemen/tabmixplus-for-firefox/downloads/tab_mix_plus-1.29.0.xpi",
29 | "browser_specific_settings": {
30 | "gecko": {"strict_min_version": "1.0"}
31 | }
32 | },
33 | {
34 | "version": "1.30.1",
35 | "update_link": "https://bitbucket.org/onemen/tabmixplus-for-firefox/downloads/tab_mix_plus-1.30.1.xpi",
36 | "browser_specific_settings": {
37 | "gecko": {"strict_min_version": "1.0"}
38 | }
39 | },
40 | {
41 | "version": "1.31.0",
42 | "update_link": "https://bitbucket.org/onemen/tabmixplus-for-firefox/downloads/tab_mix_plus-1.31.0.xpi",
43 | "browser_specific_settings": {
44 | "gecko": {"strict_min_version": "1.0"}
45 | }
46 | }
47 | ]
48 | }
49 | }
50 | }
51 |
--------------------------------------------------------------------------------
/package.json:
--------------------------------------------------------------------------------
1 | {
2 | "name": "tab-mix-plus",
3 | "version": "1.0.0",
4 | "description": "New Tab Mix Plus for modern Firefox",
5 | "type": "module",
6 | "scripts": {
7 | "lint": "eslint --format stylish --fix --cache --cache-location config/.eslintcache",
8 | "lint:test": "eslint --format stylish --cache --cache-location config/.eslintcache",
9 | "lint:clean": "eslint --format stylish",
10 | "prepare": "husky config/husky",
11 | "stylelint": "stylelint --fix --config config/.stylelintrc.json \"addon/**/*.css\"",
12 | "tsc:clean": "node config/typecheck.js",
13 | "typecheck": "tsc --build > tsc.local.txt"
14 | },
15 | "prettier": "./config/prettier.config.js",
16 | "repository": {
17 | "type": "git",
18 | "url": "git+https://github.com/onemen/TabMixPlus.git"
19 | },
20 | "keywords": [],
21 | "author": "tabmix.onemen@gmail.com",
22 | "license": "MPL",
23 | "bugs": {
24 | "url": "https://github.com/onemen/TabMixPlus/issues"
25 | },
26 | "homepage": "https://github.com/onemen/TabMixPlus#readme",
27 | "devDependencies": {
28 | "@eslint/js": "^9.24.0",
29 | "@stylistic/eslint-plugin": "^4.2.0",
30 | "@stylistic/eslint-plugin-js": "^4.2.0",
31 | "eslint": "^9.24.0",
32 | "eslint-config-prettier": "^10.1.1",
33 | "eslint-plugin-html": "^8.1.2",
34 | "eslint-plugin-mozilla": "^4.2.1",
35 | "eslint-plugin-prettier": "^5.2.6",
36 | "eslint-plugin-tabmix": "file:./config/eslint-plugin-tabmix",
37 | "globals": "^16.0.0",
38 | "husky": "^9.1.7",
39 | "lint-staged": "^15.5.0",
40 | "prettier": "^3.5.3",
41 | "prettier-plugin-jsdoc": "^1.3.2",
42 | "stylelint": "^16.18.0",
43 | "stylelint-config-standard": "^38.0.0",
44 | "typescript": "^5.8.3",
45 | "typescript-eslint": "^8.29.0"
46 | }
47 | }
48 |
--------------------------------------------------------------------------------
/tsconfig.json:
--------------------------------------------------------------------------------
1 | {
2 | "files": [],
3 | "compilerOptions": {
4 | "rootDir": ".",
5 | "baseUrl": "."
6 | },
7 | "references": [
8 | {"path": "./addon"},
9 | {"path": "./addon/modules"},
10 | {"path": "./addon/chrome/content"},
11 | {"path": "./addon/chrome/content/preferences"},
12 | {"path": "./addon/chrome/content/overlay"},
13 | {"path": "./addon/chrome/content/scripts"}
14 | ]
15 | }
16 |
--------------------------------------------------------------------------------