Compare commits

...

8 Enmetoj

Author SHA1 Message Date
Jaidyn Ann 74735233b0 Add TabFS recommendation to README
Also folds lines to ~80 chars (excepting links).
2024-05-06 09:50:07 -05:00
Jaidyn Ann e721fcbc18 Bump version 2024-04-02 11:59:05 -05:00
Jaidyn Ann da847fc55c Also substitute referrer-URL into commands
… as the variable $REFERRER.
2024-03-12 17:55:16 -05:00
Jaidyn Ann d2a98a0870 Bump version 2024-03-09 13:44:09 -06:00
Jaidyn Ann d98d7013dd Add new screenshots 2024-03-09 13:43:09 -06:00
Jaidyn Ann 667116b1a5 Use SVG icon for the error-page 2024-03-09 13:42:35 -06:00
Jaidyn Ann 2a33fdaec1 Open settings-page in new tab, from toolbar button 2024-03-09 13:41:16 -06:00
Jaidyn Ann a10c4a9d21 Add a beautiful new icon, made by Tirifto
How charming; many thanks to him! :D
By <tirifto@posteo.cz>, GPLv3+.
2024-03-09 01:01:36 -06:00
22 changed files with 249 additions and 32 deletions

View File

@ -39,4 +39,4 @@ native-uninstall:
.PHONY: xpi .PHONY: xpi
xpi: xpi:
@rm -f shellfox.xpi && zip -r shellfox.xpi background.js manifest.json _locales html img/shellfox*.png @rm -f shellfox.xpi && zip -r shellfox.xpi background.js manifest.json _locales html img/shellfox*.png img/shellfox.svg

View File

@ -1,16 +1,19 @@
# ![](img/shellfox-38.png) Shellfox # ![](img/shellfox-32.png) Shellfox
[Shellfox](https://hak.xwx.moe/jadedctrl/shellfox) is a simple add-on for [Firefox](https://firefox.com) that allows you to run shell commands at the click of a button. [Shellfox](https://hak.xwx.moe/jadedctrl/shellfox) is a simple add-on for [Firefox](https://firefox.com) that allows you to run shell
commands at the click of a button.
<img alt="Screenshot of Shellfox." width=555px src="img/screenshot-youtube.png"> <img alt="Screenshot of Shellfox." width=555px src="img/screenshot-youtube.png">
## Installation ## Installation
Shellfox has two components: A Firefox extension, and a native script that the extension uses to run commands. Shellfox has two components: A Firefox extension, and a native script that the
extension uses to run commands.
You can install the Firefox extension from [Firefox Add-ons (AMO)](https://addons.mozilla.org/en-US/firefox/addon/shellfox). You can install the Firefox extension from [Firefox Add-ons (AMO)](https://addons.mozilla.org/en-US/firefox/addon/shellfox).
The native script has only been tested on GNU/Linux, though it is likely to work on BSDs, and potentially macOS. It can be installed like so: The native script has only been tested on GNU/Linux, though it is likely to work
on BSDs, and potentially macOS. It can be installed like so:
1. Download the repository: [master.zip](https://hak.xwx.moe/jadedctrl/shellfox/archive/master.zip) 1. Download the repository: [master.zip](https://hak.xwx.moe/jadedctrl/shellfox/archive/master.zip)
2. Extract the ZIP-archive; this will make a folder called `shellfox/`. 2. Extract the ZIP-archive; this will make a folder called `shellfox/`.
@ -31,7 +34,11 @@ $ sudo make native-install
## Related projects ## Related projects
This add-on was inspired by [Textern](https://github.com/jlebon/textern/), which allows you to edit text-boxes with an external editor like [Emacs](https://gnu.org/software/emacs). Its very useful, I highly recommend it! This add-on was inspired by [Textern](https://github.com/jlebon/textern/), which allows you to edit text-boxes
with an external editor like [Emacs](https://gnu.org/software/emacs). Its very useful, I highly recommend it!
If you like mixing web-browsing with shell, then youll probably also like
[TabFS](https://omar.website/tabfs/), a FUSE filesystem that exposes your browser tabs as files.
## Source code ## Source code

View File

@ -107,7 +107,7 @@
}, },
"optionsDescDownload": { "optionsDescDownload": {
"message": "Assign commands to be executed for certain URLs (by regex) when downloads are initiated or finished. In commands, $URL will be replaced with the downloads URL, and $FILE with the target file.", "message": "Assign commands to be executed for certain URLs (by regex) when downloads are initiated or finished. In commands, $FILE will be replaced with the target file, $URL will be replaced with the downloads URL, and $REFERRER with the referring URL.",
"description": "Description of options-page section for download commands." "description": "Description of options-page section for download commands."
}, },
@ -151,6 +151,11 @@
"description": "Name of button in options-page to save changes." "description": "Name of button in options-page to save changes."
}, },
"optionsPageTitle": {
"message": "Shellfox settings",
"description": "Title of the settings-page."
},
"errorPageTitle": { "errorPageTitle": {
"message": "Shellfox error", "message": "Shellfox error",
"description": "Title of the error-page." "description": "Title of the error-page."

View File

@ -107,7 +107,7 @@
}, },
"optionsDescDownload": { "optionsDescDownload": {
"message": "Agordi ordonojn kiuj ruliĝu dum komenciĝo aŭ finiĝo de elŝutado, laŭ URL (regulesprime). En ordonoj, «$URL» anstataŭiĝos per la elŝuta URL, kaj «$FILE» per la elŝuta dosiervojo.", "message": "Agordi ordonojn kiuj ruliĝu dum komenciĝo aŭ finiĝo de elŝutado, laŭ URL (regulesprime). En ordonoj, «$FILE» anstataŭiĝos per la elŝuta dosiervojo, «$URL» anstataŭiĝos per la elŝuta URL, kaj «$REFERRER» per la deelŝutita URL.",
"description": "Priskribo de agordo-parto por elŝutaj ordonoj." "description": "Priskribo de agordo-parto por elŝutaj ordonoj."
}, },
@ -151,6 +151,11 @@
"description": "Nomo de butono ĉe agordopaĝo por konservi ŝanĝojn." "description": "Nomo de butono ĉe agordopaĝo por konservi ŝanĝojn."
}, },
"optionsPageTitle": {
"message": "Ŝelvulpaj agordoj",
"description": "Titolo de agordo-paĝo."
},
"errorPageTitle": { "errorPageTitle": {
"message": "Ŝelvulpo eraris" "message": "Ŝelvulpo eraris"
}, },

View File

@ -17,6 +17,11 @@ function shellfoxFailed() {
port = undefined; port = undefined;
// Tell the user about the error… // Tell the user about the error…
openNewTab("/html/error.html?error=" + escape(error));
}
function openNewTab(url) {
browser.tabs.query({"active": true}).then((tabs) => { browser.tabs.query({"active": true}).then((tabs) => {
let openerTab = undefined; let openerTab = undefined;
if (tabs && tabs.length > 0) if (tabs && tabs.length > 0)
@ -24,7 +29,7 @@ function shellfoxFailed() {
browser.tabs.create({ browser.tabs.create({
"active": true, "active": true,
"url": "/html/error.html?error=" + escape(error), "url": url,
"openerTabId": openerTab "openerTabId": openerTab
}) })
}); });
@ -94,25 +99,27 @@ function getDownloadCommand(url, type) {
} }
// Execute the given command string, subsituting “$URL” with url and // Execute the given command string, subsituting “$URL” with url,
// “$FILE” with filepath. // “$FILE” with filepath, and “$REFERRER” with referrer.
function runCommand(command, url, filepath) { function runCommand(command, url, filepath, referrer) {
if (!port) if (!port)
initShellfoxProgram(); initShellfoxProgram();
if (command && port) if (command && port)
port.postMessage(command port.postMessage(command
.replaceAll("$URL", url) .replaceAll("$URL", url)
.replaceAll("${URL}", url) .replaceAll("${URL}", url)
.replaceAll("$REFERRER", referrer || "")
.replaceAll("${REFERRER}", referrer || "")
.replaceAll("$FILE", filepath) .replaceAll("$FILE", filepath)
.replaceAll("${FILE}", filepath)); .replaceAll("${FILE}", filepath));
} }
// Execute the shell command associated with the given URL, if any. // Execute the shell command associated with the given URL, if any.
function runUrlCommand(url) { function runUrlCommand(url, referrer) {
let commands = getUrlCommands(url); let commands = getUrlCommands(url);
if (commands) if (commands)
runCommand(commands[0], url); runCommand(commands[0], url, "", referrer);
} }
@ -259,19 +266,23 @@ browser.menus.onClicked.addListener((info, tab) => {
if (itemName == "run-page-command") if (itemName == "run-page-command")
runUrlCommand(tab.url); runUrlCommand(tab.url);
else if (itemName == "run-link-command" && info.linkUrl) else if (itemName == "run-link-command" && info.linkUrl)
runUrlCommand(info.linkUrl); runUrlCommand(info.linkUrl, tab.url);
else if (itemName.startsWith("run-")) { else if (itemName.startsWith("run-")) {
let command_i = itemName.split("-command-")[1]; let command_i = itemName.split("-command-")[1];
runCommand(savedArray("commands")[command_i][1], info.linkUrl || tab.url); runCommand(savedArray("commands")[command_i][1], info.linkUrl || tab.url, tab.url);
} }
}); });
browser.browserAction.onClicked.addListener(() => {
openNewTab("/html/options.html");
});
// When a download starts, run any applicable download commands. // When a download starts, run any applicable download commands.
browser.downloads.onCreated.addListener((downloadItem) => { browser.downloads.onCreated.addListener((downloadItem) => {
let command = getDownloadCommand(downloadItem.url, 0); let command = getDownloadCommand(downloadItem.url, 0);
if (command) if (command)
runCommand(command, downloadItem.url, downloadItem.filename); runCommand(command, downloadItem.url, downloadItem.filename, downloadItem.referrer);
}); });
@ -281,7 +292,8 @@ browser.downloads.onChanged.addListener((downloadDelta) => {
if (downloadDelta.state.current == "complete" && downloadItems.length > 0) { if (downloadDelta.state.current == "complete" && downloadItems.length > 0) {
let command = getDownloadCommand(downloadItems[0].url, 1); let command = getDownloadCommand(downloadItems[0].url, 1);
if (command) if (command)
runCommand(command, downloadItems[0].url, downloadItems[0].filename); runCommand(command, downloadItems[0].url,
downloadItems[0].filename, downloadItems[0].referrer);
} }
}) })
}); });

View File

@ -1,3 +1,11 @@
/* SPCSS theme by Susam Pal, under the MIT license /* SPCSS theme by Susam Pal, under the MIT license
* https://github.com/susam/spcss */ * https://github.com/susam/spcss */
body{color:#333;font-family:helvetica,arial,sans-serif;line-height:1.5;margin:0 auto;max-width:40em;padding:0 1em}h1,h2,h3,h4,h5,h6{margin:1.25em 0 .5em;line-height:1.2}a:link{color:#00e}a:visited{color:#518}a:focus,a:hover{color:#03f}a:active{color:#e00}h1 a:empty:before,h2 a:empty:before,h3 a:empty:before,h4 a:empty:before,h5 a:empty:before,h6 a:empty:before{content:"#"}h1 a:empty,h2 a:empty,h3 a:empty,h4 a:empty,h5 a:empty,h6 a:empty{visibility:hidden;padding-left:.25em}h1:hover a:empty,h2:hover a:empty,h3:hover a:empty,h4:hover a:empty,h5:hover a:empty,h6:hover a:empty{visibility:visible}img{max-width:100%}figure{margin:1em 0;text-align:center}figcaption{font-size:small}code,kbd,pre,samp{color:#009;font-family:monospace,monospace}pre kbd{color:#060}blockquote,pre{background:#eee;padding:.5em}pre{overflow:auto}blockquote{border-left:medium solid #ccc;margin:1em 0}blockquote :first-child{margin-top:0}blockquote :last-child{margin-bottom:0}table{border-collapse:collapse}td,th{border:thin solid #999;padding:.3em .4em;text-align:left}@media (prefers-color-scheme:dark){body{background:#111;color:#bbb}a:link{color:#9bf}a:visited{color:#caf}a:focus,a:hover{color:#9cf}a:active{color:#faa}code,kbd,pre,samp{color:#6cf}pre kbd{color:#9c6}blockquote,pre{background:#000}blockquote{border-color:#333}td,th{border-color:#666}} body{color:#333;font-family:helvetica,arial,sans-serif;line-height:1.5;margin:0 auto;max-width:40em;padding:0 1em}h1,h2,h3,h4,h5,h6{margin:1.25em 0 .5em;line-height:1.2}a:link{color:#00e}a:visited{color:#518}a:focus,a:hover{color:#03f}a:active{color:#e00}h1 a:empty:before,h2 a:empty:before,h3 a:empty:before,h4 a:empty:before,h5 a:empty:before,h6 a:empty:before{content:"#"}h1 a:empty,h2 a:empty,h3 a:empty,h4 a:empty,h5 a:empty,h6 a:empty{visibility:hidden;padding-left:.25em}h1:hover a:empty,h2:hover a:empty,h3:hover a:empty,h4:hover a:empty,h5:hover a:empty,h6:hover a:empty{visibility:visible}img{max-width:100%}figure{margin:1em 0;text-align:center}figcaption{font-size:small}code,kbd,pre,samp{color:#009;font-family:monospace,monospace}pre kbd{color:#060}blockquote,pre{background:#eee;padding:.5em}pre{overflow:auto}blockquote{border-left:medium solid #ccc;margin:1em 0}blockquote :first-child{margin-top:0}blockquote :last-child{margin-bottom:0}table{border-collapse:collapse}td,th{border:thin solid #999;padding:.3em .4em;text-align:left}@media (prefers-color-scheme:dark){body{background:#111;color:#bbb}a:link{color:#9bf}a:visited{color:#caf}a:focus,a:hover{color:#9cf}a:active{color:#faa}code,kbd,pre,samp{color:#6cf}pre kbd{color:#9c6}blockquote,pre{background:#000}blockquote{border-color:#333}td,th{border-color:#666}}
table {
width: 100%;
}
input {
width: 100%;
}

View File

@ -3,13 +3,13 @@
<head> <head>
<meta charset="utf8" /> <meta charset="utf8" />
<link href="error.css" rel="stylesheet" type="text/css"> <link href="error.css" rel="stylesheet" type="text/css">
<link rel="icon" type="image/png" href="../img/shellfox-38.png"> <link rel="icon" type="image/png" href="../img/shellfox-32.png">
<title id="errorPageTitle">Shellfox error</title> <title id="errorPageTitle">Shellfox error</title>
</head> </head>
<body> <body>
<span> <span>
<img style="display: inline; width: 3em;" src="../img/shellfox.png"> <img style="display: inline; width: 3em;" src="../img/shellfox.svg">
<h1 style="display: inline;" id="errorTitle">Shellfox failed to run command</h1> <h1 style="display: inline;" id="errorTitle">Shellfox failed to run command</h1>
</span> </span>

View File

@ -2,6 +2,8 @@
<html> <html>
<head> <head>
<meta charset="utf8"> <meta charset="utf8">
<link rel="icon" type="image/png" href="../img/shellfox-32.png">
<title>Shellfox settings</title>
</head> </head>
<body> <body>
<article> <article>
@ -19,7 +21,7 @@
<section> <section>
<h3 id="ruleTitle">URL/Page rules</h3> <h4 id="ruleTitle">URL/Page rules</h4>
<p id="ruleP">Associate the above commands with URLs, based on regex rules. When a URL is tied to a command, a button will appear in context-menus and the address bar to run said command.</p> <p id="ruleP">Associate the above commands with URLs, based on regex rules. When a URL is tied to a command, a button will appear in context-menus and the address bar to run said command.</p>
<table id="regexTable"> <table id="regexTable">
<tr> <tr>
@ -35,7 +37,7 @@
<article> <article>
<h3 id="downloadTitle">Download commands</h3> <h3 id="downloadTitle">Download commands</h3>
<p id="downloadP">Assign commands to be executed for certain URLs (by regex) when downloads are initiated or finished. In commands, $URL will be replaced with the downloads URL, and $FILE with the target file.</p> <p id="downloadP">Assign commands to be executed for certain URLs (by regex) when downloads are initiated or finished. In commands, $FILE will be replaced with the target file, $URL will be replaced with the downloads URL, and $REFERRER with the referring URL.</p>
<table id="downloadTable"> <table id="downloadTable">
<tr> <tr>
<th id="downloadTypeTh">On start/finish</th> <th id="downloadTypeTh">On start/finish</th>

View File

@ -239,6 +239,7 @@ function createCommandTr(name, command) {
// Replace the HTML elements text with the extensions translations. // Replace the HTML elements text with the extensions translations.
function i18nPage() { function i18nPage() {
document.getElementsByTagName("html")[0].setAttribute("lang", browser.i18n.getMessage("@@ui_locale")); document.getElementsByTagName("html")[0].setAttribute("lang", browser.i18n.getMessage("@@ui_locale"));
document.getElementsByTagName("title")[0].innerText = browser.i18n.getMessage("optionsPageTitle");
document.getElementById("commandTitle").innerText = browser.i18n.getMessage("optionsTitleShell"); document.getElementById("commandTitle").innerText = browser.i18n.getMessage("optionsTitleShell");
document.getElementById("commandP").innerText = browser.i18n.getMessage("optionsDescShell"); document.getElementById("commandP").innerText = browser.i18n.getMessage("optionsDescShell");
@ -280,3 +281,14 @@ populateCommandTable();
populateRegexTable(); populateRegexTable();
populateDownloadTable(); populateDownloadTable();
i18nPage(); i18nPage();
// Only add CSS if were not in the Firefox-embedded settings, but
// rather, in our own tab.
if (!(location.toString().includes("?in_ui"))) {
let cssElement = document.createElement("LINK");
cssElement.setAttribute("rel", "stylesheet");
cssElement.setAttribute("type", "text/css");
cssElement.setAttribute("href", "error.css");
document.getElementsByTagName("head")[0].appendChild(cssElement);
}

BIN
img/screenshot-settings.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 32 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 45 KiB

After

Width:  |  Height:  |  Size: 80 KiB

BIN
img/shellfox-16.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 1008 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.2 KiB

BIN
img/shellfox-32.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.1 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 3.9 KiB

BIN
img/shellfox-48.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.3 KiB

BIN
img/shellfox-512.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 11 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 34 KiB

164
img/shellfox.svg Normal file
View File

@ -0,0 +1,164 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<!-- Created with Inkscape (http://www.inkscape.org/) -->
<svg
width="128"
height="128"
viewBox="0 0 33.866666 33.866666"
version="1.1"
id="svg5"
inkscape:version="1.2.2 (b0a8486541, 2022-12-01)"
sodipodi:docname="shellfox.svg"
inkscape:export-filename="shellfox16.png"
inkscape:export-xdpi="12"
inkscape:export-ydpi="12"
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
xmlns="http://www.w3.org/2000/svg"
xmlns:svg="http://www.w3.org/2000/svg"
xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
xmlns:cc="http://creativecommons.org/ns#"
xmlns:dc="http://purl.org/dc/elements/1.1/">
<title
id="title2353">Shellfox logo</title>
<sodipodi:namedview
id="namedview7"
pagecolor="#505050"
bordercolor="#eeeeee"
borderopacity="1"
inkscape:showpageshadow="0"
inkscape:pageopacity="0"
inkscape:pagecheckerboard="0"
inkscape:deskcolor="#505050"
inkscape:document-units="px"
showgrid="false"
inkscape:zoom="1.0717735"
inkscape:cx="90.970716"
inkscape:cy="36.854803"
inkscape:window-width="1232"
inkscape:window-height="750"
inkscape:window-x="48"
inkscape:window-y="26"
inkscape:window-maximized="1"
inkscape:current-layer="g17473" />
<defs
id="defs2" />
<g
inkscape:label="Layer 1"
inkscape:groupmode="layer"
id="layer1">
<g
id="g2001"
transform="matrix(0,-1,-1,0,33.873882,33.984667)">
<g
id="g17466"
transform="matrix(1.0740477,-0.28784056,0.28779021,1.0742356,-5.9784989,1.1720718)"
style="stroke-width:0.899254">
<g
id="g17473"
transform="translate(0.1045793,0.49978971)">
<path
style="fill:#bad14b;fill-opacity:1;stroke:none;stroke-width:0.951707;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:8;stroke-dasharray:none;stop-color:#000000"
d="m 16.254746,5.7055183 c -0.436985,2.0988832 -1.125221,4.8860787 -1.214831,7.0168527 2.440283,0 4.64566,0.879919 6.240358,1.945865 1.832042,1.224594 3.644669,4.58705 3.64479,7.358522 2.08e-4,4.745436 -2.962706,7.557398 -6.371211,9.524901 -2.953238,1.704709 -6.642204,1.100374 -9.7925719,-0.204555 C 6.2534205,30.308318 4.2812779,28.03975 3.2424883,25.53189 1.7406468,21.906124 0.81032139,19.625197 3.2184677,14.326455 4.4390169,11.64083 6.1664543,9.8431253 9.3813261,7.984598 10.889949,7.1124584 14.289775,6.244048 16.254746,5.7055183 Z"
id="path1732"
sodipodi:nodetypes="ccsssssssc" />
<path
sodipodi:type="spiral"
style="fill:none;fill-opacity:1;fill-rule:evenodd;stroke:#dddb46;stroke-width:1.18483;stroke-linecap:round;stroke-linejoin:round;stroke-dasharray:none;stroke-opacity:1"
id="path18219"
sodipodi:cx="16.583284"
sodipodi:cy="16.401304"
sodipodi:expansion="1.7"
sodipodi:revolution="3.0022297"
sodipodi:radius="14.706082"
sodipodi:argument="-20.420353"
sodipodi:t0="0.17986631"
d="m 16.385328,17.172294 c -0.68848,0.149017 -1.224965,-0.524528 -1.274171,-1.148967 -0.09039,-1.147091 1.01171,-1.967918 2.07532,-1.971309 1.69284,-0.0054 2.856217,1.625353 2.785107,3.219251 -0.103566,2.321383 -2.354991,3.880312 -4.563967,3.708971 -3.028738,-0.234927 -5.032846,-3.193147 -4.737627,-6.097207 0.387468,-3.811494 4.134084,-6.307915 7.809435,-5.8667306 4.666744,0.56019 7.700631,5.1731876 7.092617,9.6929156 -0.752261,5.591989 -6.306629,9.206855 -11.741189,8.412132 C 7.245801,26.158385 3.0078416,19.5902 4.0083283,13.172615 4.9912458,6.8677265 10.50959,2.1740169 16.789293,1.6966649"
transform="matrix(0.80295813,-1.6331449e-4,-1.6331448e-4,0.80352387,1.6016955,8.25945)" />
<path
sodipodi:type="spiral"
style="fill:none;fill-opacity:1;fill-rule:evenodd;stroke:#48521d;stroke-width:0.951707;stroke-linecap:round;stroke-linejoin:round;stroke-dasharray:none;stroke-opacity:1"
id="path295"
sodipodi:cx="16.583284"
sodipodi:cy="16.401304"
sodipodi:expansion="1.4"
sodipodi:revolution="2.9825668"
sodipodi:radius="14.568163"
sodipodi:argument="-20.420353"
sodipodi:t0="0.18105213"
d="m 16.252163,17.690939 c -1.06038,0.149446 -1.842762,-0.881285 -1.865694,-1.853681 -0.03797,-1.610179 1.516623,-2.724971 3.025679,-2.664167 2.216358,0.0893 3.70518,2.242533 3.535703,4.348843 -0.231193,2.873332 -3.044444,4.770185 -5.800603,4.472366 -3.576208,-0.386429 -5.9107007,-3.912783 -5.468106,-7.365677 0.553872,-4.321026 4.840661,-7.1197567 9.032863,-6.5181433 5.104573,0.7325456 8.391887,5.8228223 7.618598,10.7935093 -0.921626,5.924198 -6.855093,9.72266 -12.640687,8.766245 C 6.9122385,26.549819 2.58152,19.736174 3.7315611,13.101544 4.7164692,7.4195733 9.366355,2.9677818 14.990728,1.9204502"
transform="translate(-1.543359,4.7539712)" />
<path
style="fill:#ff9f4d;fill-opacity:1;stroke:none;stroke-width:0.951707;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:8;stroke-dasharray:none;stroke-opacity:1;stop-color:#000000"
d="m 26.663198,14.408018 c -1.115202,1.692134 -2.284703,3.444457 -3.239777,4.959094 -1.063012,-1.387854 -0.902895,-4.942148 -0.794627,-7.692902"
id="path16679"
sodipodi:nodetypes="ccc" />
<path
id="path6415"
style="fill:#ff851a;fill-opacity:1;stroke:none;stroke-width:0.951707;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:8;stroke-dasharray:none;stroke-opacity:1;stop-color:#000000"
d="M 32.504193 11.143201 C 31.308041 11.175746 29.807982 11.676154 28.613058 11.612524 C 28.405182 12.503953 28.179798 13.05693 27.951761 13.561584 C 28.999345 16.111752 29.182665 16.786611 29.533521 18.275928 C 27.771683 17.345313 26.102114 16.400163 25.154009 15.340825 C 23.935738 15.669297 21.909536 15.931267 20.75397 16.134637 C 21.148309 15.052286 21.629024 13.485995 20.692427 13.144757 C 19.889028 12.581822 18.868029 12.075973 17.969021 12.394818 C 17.969021 12.394818 18.221999 13.973442 18.69162 14.786851 C 18.983713 15.292769 20.434946 16.309472 20.77055 17.229145 C 21.207355 18.426144 21.613041 20.728338 20.439702 21.037024 C 19.274381 21.343601 18.616479 18.850412 18.206077 18.139574 C 17.888659 17.589791 16.342707 16.363782 15.896042 15.590136 C 15.254729 14.479349 14.942034 12.860455 14.942034 12.860455 L 14.931605 12.091343 C 15.362997 10.904715 15.456811 8.7330645 16.19688 6.3960426 C 17.62136 6.3443884 19.638974 6.4363795 21.372825 7.0680882 C 22.196596 7.288817 22.987833 6.8712047 23.369206 5.4478991 C 24.832651 6.4733238 26.177229 7.4872529 27.23695 8.2064278 C 28.839919 8.6880672 30.90574 9.8871514 32.504193 11.143201 z " />
<path
style="fill:#ffc799;fill-opacity:1;stroke:#ffac66;stroke-width:0.475855;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:8;stroke-dasharray:none;stroke-opacity:1;stop-color:#000000"
d="m 17.968855,12.395007 c 0.406526,-0.944525 1.75783,-1.70828 2.725537,-1.760894 0.316578,0.772803 1.083363,1.733227 2.050292,2.243857 0.569779,-0.480961 1.135202,-0.968929 2.039582,-0.911789 -0.962099,2.172429 -1.226252,4.875481 -1.225152,7.186399 -0.848447,-0.855504 -0.950748,-2.424071 -1.04236,-3.339591 l -1.735987,0.270714 c 0.245255,-0.730852 0.578908,-1.963323 0.387159,-2.48343 -0.808783,-1.104745 -2.577997,-1.299397 -3.199071,-1.205266 z"
id="path1131"
sodipodi:nodetypes="ccccccccc" />
<path
style="fill:none;fill-opacity:1;stroke:#5c3009;stroke-width:0.951707;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:8;stroke-dasharray:none;stroke-opacity:1;stop-color:#000000"
d="m 25.521689,16.053711 c -0.571177,0.989208 -1.143194,1.798764 -2.098268,3.313401 -1.063012,-1.387854 -1.025242,-2.370647 -1.025285,-3.33711"
id="path1129"
sodipodi:nodetypes="ccc" />
<circle
style="fill:#141414;fill-opacity:1;stroke:none;stroke-width:0.951707;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:8;stroke-dasharray:none;stroke-opacity:1;stop-color:#000000"
id="path17459"
cx="-19.164043"
cy="-23.532482"
r="0.79374999"
transform="matrix(0,-1,-1,0,0,0)" />
<path
style="fill:#f27018;fill-opacity:1;stroke:none;stroke-width:2;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:8;stroke-dasharray:none;stroke-opacity:1;stop-color:#000000"
d="m 112.06175,9.4671151 c -1.23847,0.06299 -1.88603,3.4015639 -2.38396,4.2870049 -1.20596,2.52127 -2.31798,5.096933 -3.05554,7.797666 -0.29034,0.651141 -0.72481,1.29823 -0.4984,2.0524 0.5251,3.144954 0.16626,8.112957 -0.30869,11.266768 0.14873,1.386324 1.51886,1.728404 2.09082,0.661016 0.88603,-1.212751 2.82502,-4.771628 3.68417,-5.922524 0.23265,5.842093 -0.96291,11.682816 -3.21799,17.062946 -0.32169,0.904803 -2.23708,4.32006 -1.36818,5.144986 0.89988,0.732225 3.24013,-2.196653 3.85952,-2.942942 0.19237,-0.138615 0.80744,-0.949428 0.68725,-0.256948 -0.17817,4.90339 -1.15669,9.784013 -2.57033,14.474769 -0.28987,1.186306 -1.92284,4.607363 -1.96383,5.837918 0.17852,1.199787 2.43422,-0.473295 3.12813,-1.277816 0.85569,-0.751751 1.92117,-2.215666 2.63018,-3.095178 0.80555,0.634567 2.12421,3.196931 2.15852,2.042918 0.33322,-3.226361 0.86582,-9.432641 1.00938,-12.65854 0.58988,-2.300463 1.79542,-4.168313 4.03258,-4.924525 0.92821,-0.446426 2.16855,-0.280275 2.87199,-1.118227 0.43019,-0.929817 -0.32675,-1.839712 -0.5335,-2.7334 -1.75454,-4.799691 -2.98689,-9.644533 -4.65534,-14.462711 -0.34923,-6.324873 -2.53314,-12.448358 -4.59297,-18.419052 -0.21828,-0.555641 -0.38851,-2.8657189 -1.00381,-2.8165289 z"
id="path1073"
transform="matrix(0.06157479,-0.22980025,-0.22984045,-0.06158556,27.000473,37.204922)"
sodipodi:nodetypes="ccccccccccccccccccccccc" />
<path
style="fill:none;stroke:#f26100;stroke-width:0.475855;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:8;stroke-dasharray:none;stroke-opacity:1;stop-color:#000000"
d="m 28.613247,11.612626 c -1.136529,-0.587647 -2.364177,-1.001009 -3.872663,-0.877211 0.49937,-0.472286 1.558192,-0.7524604 2.350415,-0.9956628 -2.244337,-0.6595362 -3.763812,-0.415182 -6.152438,0.00666 L 22.779331,8.597794 C 21.291985,8.2262841 19.189933,8.1507158 17.377725,8.4624287 17.765704,8.0745081 18.47373,7.4929466 19.107067,7.3232959 17.760386,6.7712444 17.055483,6.8129636 16.052837,6.8266134"
id="path1002"
sodipodi:nodetypes="cccccccc" />
<path
style="fill:#ffc799;fill-opacity:1;stroke:#ffac66;stroke-width:0.475855;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:8;stroke-dasharray:none;stroke-opacity:1;stop-color:#000000"
d="m 21.020318,18.364116 c -0.97509,-0.210459 -1.313651,-0.453965 -1.959354,-0.710244 -0.824522,-0.327252 -2.554252,-2.474261 -4.158671,-4.926307 0,0 0.557388,2.308493 1.192333,3.285304 0.525737,0.808803 1.435815,1.293493 2.085362,2.006726 0.827854,0.909022 1.101723,3.166435 2.29852,2.884698 0.84285,-0.198415 0.961865,-1.78305 0.54181,-2.540177 z"
id="path1967"
sodipodi:nodetypes="cscsssc" />
<path
id="path946"
style="fill:none;fill-opacity:1;stroke:#5c3009;stroke-width:0.951707;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:8;stroke-dasharray:none;stroke-opacity:1;stop-color:#000000"
d="m 16.19688,6.3960426 c 1.42448,-0.051654 3.442094,0.040337 5.175945,0.6720456 0.823771,0.2207288 1.615008,-0.1968835 1.996381,-1.6201891 1.463445,1.0254247 2.808023,2.0393538 3.867744,2.7585287 1.602969,0.4816394 3.66879,1.6807236 5.267243,2.9367732 -1.196152,0.03255 -2.696211,0.532953 -3.891135,0.469323 -0.207876,0.891429 -0.43326,1.444406 -0.661297,1.94906 1.047584,2.550168 1.230904,3.225027 1.58176,4.714344 -1.761838,-0.930615 -3.431407,-1.875765 -4.379512,-2.935103 -1.218271,0.328472 -3.244473,0.590442 -4.400039,0.793812 0.394339,-1.082351 0.875054,-2.648642 -0.06154,-2.98988 -0.803399,-0.562935 -1.824398,-1.068784 -2.723406,-0.749939 0,0 0.252978,1.578624 0.722599,2.392033 0.292093,0.505918 1.743326,1.522621 2.07893,2.442294 0.436805,1.196999 0.842491,3.499193 -0.330848,3.807879 -1.165321,0.306577 -1.823223,-2.186612 -2.233625,-2.89745 -0.317418,-0.549783 -1.86337,-1.775792 -2.310035,-2.549438 -0.641313,-1.110787 -0.954008,-2.729681 -0.954008,-2.729681 l -0.01043,-0.769112"
sodipodi:nodetypes="ccccccccccccssssscc" />
<path
style="fill:none;stroke:#48521d;stroke-width:0.95171;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:8;stroke-dasharray:none;stroke-opacity:1;stop-color:#000000"
d="M 13.033444,6.763516 C 13.941699,6.5929965 15.260076,6.2705608 16.56856,5.5152598 14.275653,10.710992 15.615428,12.65534 14.132723,13.005516"
id="path1013"
sodipodi:nodetypes="ccc" />
</g>
</g>
</g>
</g>
<metadata
id="metadata2351">
<rdf:RDF>
<cc:Work
rdf:about="">
<dc:creator>
<cc:Agent>
<dc:title>Tirifto</dc:title>
</cc:Agent>
</dc:creator>
<dc:date>2024</dc:date>
<dc:title>Shellfox logo</dc:title>
<cc:license
rdf:resource="GNU General Public Later, version 3, or (at your option) any later version" />
</cc:Work>
</rdf:RDF>
</metadata>
</svg>

After

Width:  |  Height:  |  Size: 14 KiB

View File

@ -1,5 +1,2 @@
Beautiful shell photo by H. Zell, 2014. Under the CC-BY-SA 3.0. These charming icons were kindly made by Tirifto <tirifto@posteo.cz>!
https://commons.wikimedia.org/wiki/File:Cepaea_vindobonensis_-_Banding_variation.jpg They are, like Shellfox in its entirety, under the GPLv3+.
Ears from Pleroma-tan: pleroma-tan-smol.jpg, © 2019 shitposter.club. Under the CC-BY-SA 4.0.
https://git.pleroma.social/pleroma/pleroma/-/blob/develop/priv/static/images/pleroma-fox-tan.png

Binary file not shown.

View File

@ -1,17 +1,19 @@
{ {
"manifest_version": 2, "manifest_version": 2,
"name": "__MSG_extensionName__", "name": "__MSG_extensionName__",
"version": "0.12", "version": "0.14",
"description": "__MSG_extensionDescription__", "description": "__MSG_extensionDescription__",
"homepage_url": "https://hak.xwx.moe/jadedctrl/shellfox", "homepage_url": "https://hak.xwx.moe/jadedctrl/shellfox",
"author": "Jaidyn Ann",
"default_locale": "en", "default_locale": "en",
"icons": { "icons": {
"250": "img/shellfox.png", "512": "img/shellfox-512.png",
"38": "img/shellfox-38.png", "48": "img/shellfox-48.png",
"19": "img/shellfox-19.png" "32": "img/shellfox-32.png",
"16": "img/shellfox-16.png"
}, },
"page_action": { "page_action": {
@ -23,6 +25,9 @@
"default_title": "__MSG_pageActionName__" "default_title": "__MSG_pageActionName__"
}, },
"browser_action": {
},
"permissions": [ "permissions": [
"activeTab", "activeTab",
"downloads", "downloads",
@ -45,6 +50,6 @@
}, },
"options_ui": { "options_ui": {
"page": "html/options.html" "page": "html/options.html?in_ui"
} }
} }