Compare commits

...

47 Commits

Author SHA1 Message Date
Ajay
e4c9afecbd bump version 2023-10-14 20:36:51 -04:00
Ajay
79e855a038 update translations 2023-10-14 20:36:45 -04:00
Ajay
09a3a4e6d4 Fix vote buttons in category pill missing not being centered 2023-10-14 20:32:48 -04:00
Ajay
e271f2cbcc Add gecko android to minimum version 2023-10-11 13:50:45 -04:00
Ajay
1cc4c18665 Fix video id not updating when changing videos on cytube and watchtogether 2023-10-08 20:22:45 -04:00
Ajay
e650b7183a bump version 2023-10-08 16:44:12 -04:00
Ajay
4eb097b422 update translations 2023-10-08 16:44:07 -04:00
Ajay
04a9f82bdc Rename hidden css class to sbhidden to fix compatibility with Piped
Fixes #1865
2023-10-08 16:38:40 -04:00
Ajay
39cfdc7b6c bump version 2023-10-01 13:57:51 -04:00
Ajay
a8701b02a1 update translations 2023-10-01 13:57:41 -04:00
Ajay
3f1ad528c3 Merge branch 'master' of https://github.com/ajayyy/SponsorBlock 2023-10-01 13:56:44 -04:00
Ajay
ae685baeef Fix tip ui broken for submissions 2023-10-01 13:56:34 -04:00
Ajay Ramachandran
d2ee67f3cf Merge pull request #1867 from ajayyy/ci/update_invidious_list
Update Invidious List
2023-09-30 20:57:53 -04:00
github-actions[bot]
d440a4d52a Update Invidious List 2023-10-01 00:21:32 +00:00
Ajay
7566b71ccd Properly hide dearrow button 2023-09-30 17:00:10 -04:00
Ajay
109b7ed5bc Don't show start button for highlight 2023-09-24 21:13:43 -04:00
Ajay
3eb853154f Remove unnecessary translation string 2023-09-24 19:01:41 -04:00
Ajay
ee3ce8aa46 Add seperate keybind for skip to highlight
Fixes #1187
2023-09-23 15:40:11 -04:00
Ajay
1557af5d2a update translations 2023-09-23 14:27:29 -04:00
Ajay
465e7065ca Update warning title 2023-09-23 13:46:12 -04:00
Ajay
a3f8419c49 update translations 2023-09-23 12:20:05 -04:00
Ajay
dde443ccec bump version 2023-09-23 12:18:32 -04:00
Ajay
01b1380b78 Update sponsorblock ui to tip 2023-09-23 12:17:46 -04:00
Ajay
c51b18465e Fix slightly different tv url format that appears on Firefox 2023-09-18 14:17:46 -04:00
Ajay
ad9888cf52 bump version 2023-09-17 17:31:36 -04:00
Ajay
7856791f90 update translations 2023-09-17 17:31:22 -04:00
Ajay
273ee63ec7 Prevent refreshes from triggering too often
Fixes #1838
2023-09-17 14:06:24 -04:00
Ajay
be36583aee Rename donate button 2023-09-17 13:11:52 -04:00
Ajay
433bbbf904 Remove popup css from content as iframes are used now
Fixes #1774
2023-09-17 12:46:25 -04:00
Ajay
6c2ee76198 Add start button to submission menu 2023-09-17 12:29:42 -04:00
Ajay
42f59898f3 Add end button for all segments 2023-09-17 12:12:00 -04:00
Ajay
8ab126f502 Highlight segment on hover 2023-09-17 12:06:33 -04:00
Ajay
4954abf9e3 Add extension icon default location on Firefox 2023-09-13 20:17:44 -04:00
Ajay
30a21d5ff5 Actually stop spacebar in chapters box from pausing video 2023-09-13 11:40:56 -04:00
Ajay
d1b2def47c bump version 2023-09-06 11:45:08 -04:00
Ajay Ramachandran
48cdabe2a5 Merge pull request #1534 from EthanBnntt/EthanBnntt-patch-1
Reduced execution time of hexToRgb function by ~70%
2023-09-05 01:28:23 -04:00
Ajay Ramachandran
bc2db0cf2c Merge branch 'master' into EthanBnntt-patch-1 2023-09-05 01:28:15 -04:00
Ajay Ramachandran
843ef37dcd Merge pull request #1814 from ajayyy/ci/update_invidious_list
Update Invidious List
2023-09-05 01:25:54 -04:00
Ajay
ed260a0667 Fix clicking a video from homepage on mobile YouTube
Fixes https://github.com/ajayyy/SponsorBlock/issues/1849
2023-09-05 01:19:50 -04:00
Ajay
2e131c2a95 Stop spacebar in chapters box from pausing video 2023-09-04 02:37:19 -04:00
Ajay
f5e884b6aa Merge branch 'master' of https://github.com/ajayyy/SponsorBlock 2023-09-03 21:29:02 -04:00
Ajay
a9929d0c93 Adjust dearrow message params 2023-09-03 21:29:00 -04:00
github-actions[bot]
3fb43d1c0e Update Invidious List 2023-09-01 00:19:28 +00:00
Ajay Ramachandran
a1b2855538 Merge pull request #1842 from ajayyy/ci/oss_attribution
Update OSS Attribution
2023-08-25 21:49:27 -04:00
github-actions[bot]
07236baed5 Update OSS Attribution 2023-08-26 01:30:48 +00:00
Ajay
f991435857 Switch back to upstream content-scripts-register-polyfill 2023-08-25 21:29:39 -04:00
Bennett
edaed61612 Reduced execution time of hexToRgb function by ~70%
Coded to use less regex.
On average, "indexOf" performs better than "parseInt."
2022-10-13 14:48:17 -04:00
30 changed files with 208 additions and 150 deletions

View File

@@ -1 +1 @@
["www.youtubekids.com","inv.bp.projectsegfau.lt","inv.tux.pizza","inv.zzls.xyz","invidious.0011.lt","invidious.lunar.icu","invidious.privacydev.net","invidious.tiekoetter.com","iv.ggtyler.dev","iv.melmac.space","vid.priv.au","vid.puffyan.us","yewtu.be","yt.artemislena.eu"] ["www.youtubekids.com","anontube.lvkaszus.pl","inv.bp.projectsegfau.lt","inv.makerlab.tech","inv.pistasjis.net","inv.tux.pizza","inv.zzls.xyz","invidious.asir.dev","invidious.flokinet.to","invidious.io.lol","invidious.lunar.icu","invidious.no-logs.com","invidious.privacydev.net","invidious.private.coffee","invidious.protokolla.fi","invidious.slipfox.xyz","invidious.tiekoetter.com","iv.ggtyler.dev","iv.melmac.space","iv.nboeck.de","onion.tube","vid.priv.au","vid.puffyan.us","yewtu.be","yt.artemislena.eu","yt.drgnz.club","yt.oelrichsgarcia.de"]

View File

@@ -2,6 +2,9 @@
"browser_specific_settings": { "browser_specific_settings": {
"gecko": { "gecko": {
"id": "sponsorBlocker@ajay.app" "id": "sponsorBlocker@ajay.app"
},
"gecko_android": {
"strict_min_version": "79.0"
} }
}, },
"background": { "background": {
@@ -9,5 +12,8 @@
}, },
"permissions": [ "permissions": [
"scripting" "scripting"
] ],
"browser_action": {
"default_area": "navbar"
}
} }

View File

@@ -1,7 +1,7 @@
{ {
"name": "__MSG_fullName__", "name": "__MSG_fullName__",
"short_name": "SponsorBlock", "short_name": "SponsorBlock",
"version": "5.4.18", "version": "5.4.24",
"default_locale": "en", "default_locale": "en",
"description": "__MSG_Description__", "description": "__MSG_Description__",
"homepage_url": "https://sponsor.ajay.app", "homepage_url": "https://sponsor.ajay.app",
@@ -17,9 +17,7 @@
], ],
"css": [ "css": [
"content.css", "content.css",
"shared.css", "shared.css"
"./libs/Source+Sans+Pro.css",
"popup.css"
] ]
}], }],
"web_accessible_resources": [ "web_accessible_resources": [

View File

@@ -62,7 +62,7 @@
"webext-content-scripts": { "webext-content-scripts": {
"ignore": false, "ignore": false,
"name": "webext-content-scripts", "name": "webext-content-scripts",
"version": "2.5.2", "version": "2.5.5",
"authors": "Federico Brigante <me@fregante.com> (https://fregante.com)", "authors": "Federico Brigante <me@fregante.com> (https://fregante.com)",
"url": "https://github.com/fregante/webext-content-scripts", "url": "https://github.com/fregante/webext-content-scripts",
"license": "MIT", "license": "MIT",
@@ -80,7 +80,7 @@
"webext-polyfill-kinda": { "webext-polyfill-kinda": {
"ignore": false, "ignore": false,
"name": "webext-polyfill-kinda", "name": "webext-polyfill-kinda",
"version": "1.0.0", "version": "1.0.2",
"authors": "Federico Brigante <me@fregante.com> (https://fregante.com)", "authors": "Federico Brigante <me@fregante.com> (https://fregante.com)",
"url": "https://github.com/fregante/webext-polyfill-kinda", "url": "https://github.com/fregante/webext-polyfill-kinda",
"license": "MIT", "license": "MIT",

96
package-lock.json generated
View File

@@ -27,7 +27,7 @@
], ],
"license": "LGPL-3.0-or-later", "license": "LGPL-3.0-or-later",
"dependencies": { "dependencies": {
"@ajayyy/content-scripts-register-polyfill": "^4.0.2-safari-fix", "content-scripts-register-polyfill": "^4.0.2",
"react": "^18.2.0", "react": "^18.2.0",
"react-dom": "^18.2.0" "react-dom": "^18.2.0"
}, },
@@ -65,34 +65,6 @@
"node": ">=16" "node": ">=16"
} }
}, },
"node_modules/@ajayyy/content-scripts-register-polyfill": {
"version": "4.0.2-safari-fix",
"resolved": "https://registry.npmjs.org/@ajayyy/content-scripts-register-polyfill/-/content-scripts-register-polyfill-4.0.2-safari-fix.tgz",
"integrity": "sha512-okyqlFmLUmOZQrkZ6ChUbfcNXadamlaIGqzb6fi5MRnzvr+myoG4sK+whxhCY9hPmU///dqMGtV8FVom8sJpHA==",
"dependencies": {
"@ajayyy/webext-content-scripts": "^2.5.4-safari-fix",
"webext-patterns": "^1.3.0",
"webext-polyfill-kinda": "^1.0.0"
},
"funding": {
"url": "https://github.com/sponsors/fregante"
}
},
"node_modules/@ajayyy/webext-content-scripts": {
"version": "2.5.4-safari-fix",
"resolved": "https://registry.npmjs.org/@ajayyy/webext-content-scripts/-/webext-content-scripts-2.5.4-safari-fix.tgz",
"integrity": "sha512-gn1PF4+dfld6whvmjjnYGvB26z9ja0SNIcgHVQl42Bh/lz89hviH8HWqi1p7XXN/p0BsOwJAx8jzqkmb2IAQvQ==",
"dependencies": {
"webext-patterns": "^1.3.0",
"webext-polyfill-kinda": "^1.0.2"
},
"engines": {
"node": ">=16"
},
"funding": {
"url": "https://github.com/sponsors/fregante"
}
},
"node_modules/@ampproject/remapping": { "node_modules/@ampproject/remapping": {
"version": "2.2.0", "version": "2.2.0",
"resolved": "https://registry.npmjs.org/@ampproject/remapping/-/remapping-2.2.0.tgz", "resolved": "https://registry.npmjs.org/@ampproject/remapping/-/remapping-2.2.0.tgz",
@@ -4282,6 +4254,19 @@
"url": "https://github.com/yeoman/configstore?sponsor=1" "url": "https://github.com/yeoman/configstore?sponsor=1"
} }
}, },
"node_modules/content-scripts-register-polyfill": {
"version": "4.0.2",
"resolved": "https://registry.npmjs.org/content-scripts-register-polyfill/-/content-scripts-register-polyfill-4.0.2.tgz",
"integrity": "sha512-8hDm+tu3BkxHZP7EUIIIo/495F6QNXF7cI9Lwr4PQaiohw2wWmi9k2SE4W4kNrAaLnFw6RZ2ev8EmrQb+sCoGQ==",
"dependencies": {
"webext-content-scripts": "^2.5.2",
"webext-patterns": "^1.3.0",
"webext-polyfill-kinda": "^1.0.0"
},
"funding": {
"url": "https://github.com/sponsors/fregante"
}
},
"node_modules/convert-source-map": { "node_modules/convert-source-map": {
"version": "1.8.0", "version": "1.8.0",
"resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-1.8.0.tgz", "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-1.8.0.tgz",
@@ -12975,6 +12960,21 @@
"node": ">= 8" "node": ">= 8"
} }
}, },
"node_modules/webext-content-scripts": {
"version": "2.5.5",
"resolved": "https://registry.npmjs.org/webext-content-scripts/-/webext-content-scripts-2.5.5.tgz",
"integrity": "sha512-CIq1LA/nHIXE43v8qlpqNPcbsSzGuQBkeykbqOWvKJ1Rx/q7zgdZsLgxwyoonWiQcJczslVmGWCfdBY04JwIyw==",
"dependencies": {
"webext-patterns": "^1.3.0",
"webext-polyfill-kinda": "^1.0.2"
},
"engines": {
"node": ">=16"
},
"funding": {
"url": "https://github.com/sponsors/fregante"
}
},
"node_modules/webext-patterns": { "node_modules/webext-patterns": {
"version": "1.3.0", "version": "1.3.0",
"resolved": "https://registry.npmjs.org/webext-patterns/-/webext-patterns-1.3.0.tgz", "resolved": "https://registry.npmjs.org/webext-patterns/-/webext-patterns-1.3.0.tgz",
@@ -13578,25 +13578,6 @@
} }
}, },
"dependencies": { "dependencies": {
"@ajayyy/content-scripts-register-polyfill": {
"version": "4.0.2-safari-fix",
"resolved": "https://registry.npmjs.org/@ajayyy/content-scripts-register-polyfill/-/content-scripts-register-polyfill-4.0.2-safari-fix.tgz",
"integrity": "sha512-okyqlFmLUmOZQrkZ6ChUbfcNXadamlaIGqzb6fi5MRnzvr+myoG4sK+whxhCY9hPmU///dqMGtV8FVom8sJpHA==",
"requires": {
"@ajayyy/webext-content-scripts": "^2.5.4-safari-fix",
"webext-patterns": "^1.3.0",
"webext-polyfill-kinda": "^1.0.0"
}
},
"@ajayyy/webext-content-scripts": {
"version": "2.5.4-safari-fix",
"resolved": "https://registry.npmjs.org/@ajayyy/webext-content-scripts/-/webext-content-scripts-2.5.4-safari-fix.tgz",
"integrity": "sha512-gn1PF4+dfld6whvmjjnYGvB26z9ja0SNIcgHVQl42Bh/lz89hviH8HWqi1p7XXN/p0BsOwJAx8jzqkmb2IAQvQ==",
"requires": {
"webext-patterns": "^1.3.0",
"webext-polyfill-kinda": "^1.0.2"
}
},
"@ampproject/remapping": { "@ampproject/remapping": {
"version": "2.2.0", "version": "2.2.0",
"resolved": "https://registry.npmjs.org/@ampproject/remapping/-/remapping-2.2.0.tgz", "resolved": "https://registry.npmjs.org/@ampproject/remapping/-/remapping-2.2.0.tgz",
@@ -16756,6 +16737,16 @@
"xdg-basedir": "^5.0.1" "xdg-basedir": "^5.0.1"
} }
}, },
"content-scripts-register-polyfill": {
"version": "4.0.2",
"resolved": "https://registry.npmjs.org/content-scripts-register-polyfill/-/content-scripts-register-polyfill-4.0.2.tgz",
"integrity": "sha512-8hDm+tu3BkxHZP7EUIIIo/495F6QNXF7cI9Lwr4PQaiohw2wWmi9k2SE4W4kNrAaLnFw6RZ2ev8EmrQb+sCoGQ==",
"requires": {
"webext-content-scripts": "v2.5.5",
"webext-patterns": "^1.3.0",
"webext-polyfill-kinda": "^1.0.0"
}
},
"convert-source-map": { "convert-source-map": {
"version": "1.8.0", "version": "1.8.0",
"resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-1.8.0.tgz", "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-1.8.0.tgz",
@@ -23107,6 +23098,15 @@
"integrity": "sha512-e0MO3wdXWKrLbL0DgGnUV7WHVuw9OUvL4hjgnPkIeEvESk74gAITi5G606JtZPp39cd8HA9VQzCIvA49LpPN5Q==", "integrity": "sha512-e0MO3wdXWKrLbL0DgGnUV7WHVuw9OUvL4hjgnPkIeEvESk74gAITi5G606JtZPp39cd8HA9VQzCIvA49LpPN5Q==",
"dev": true "dev": true
}, },
"webext-content-scripts": {
"version": "2.5.5",
"resolved": "https://registry.npmjs.org/webext-content-scripts/-/webext-content-scripts-2.5.5.tgz",
"integrity": "sha512-CIq1LA/nHIXE43v8qlpqNPcbsSzGuQBkeykbqOWvKJ1Rx/q7zgdZsLgxwyoonWiQcJczslVmGWCfdBY04JwIyw==",
"requires": {
"webext-patterns": "^1.3.0",
"webext-polyfill-kinda": "^1.0.2"
}
},
"webext-patterns": { "webext-patterns": {
"version": "1.3.0", "version": "1.3.0",
"resolved": "https://registry.npmjs.org/webext-patterns/-/webext-patterns-1.3.0.tgz", "resolved": "https://registry.npmjs.org/webext-patterns/-/webext-patterns-1.3.0.tgz",

View File

@@ -4,10 +4,15 @@
"description": "", "description": "",
"main": "background.js", "main": "background.js",
"dependencies": { "dependencies": {
"@ajayyy/content-scripts-register-polyfill": "^4.0.2-safari-fix", "content-scripts-register-polyfill": "^4.0.2",
"react": "^18.2.0", "react": "^18.2.0",
"react-dom": "^18.2.0" "react-dom": "^18.2.0"
}, },
"overrides": {
"content-scripts-register-polyfill": {
"webext-content-scripts": "v2.5.5"
}
},
"devDependencies": { "devDependencies": {
"@types/chrome": "^0.0.220", "@types/chrome": "^0.0.220",
"@types/firefox-webext-browser": "^111.0.0", "@types/firefox-webext-browser": "^111.0.0",

View File

@@ -7,7 +7,7 @@
--sb-dark-red-outline: rgb(130,0,0,0.9); --sb-dark-red-outline: rgb(130,0,0,0.9);
} }
.hidden { .sbhidden {
display: none; display: none;
} }
@@ -49,7 +49,13 @@ div:hover > #previewbar.sbNotInvidious {
} }
.previewbar.requiredSegment { .previewbar.requiredSegment {
transform: scaleY(3) transform: scaleY(3);
}
.previewbar.selectedSegment {
opacity: 1 !important;
z-index: 100;
transform: scaleY(1.5);
} }
/* Make sure settings are upfront */ /* Make sure settings are upfront */
@@ -145,7 +151,7 @@ div:hover > .sponsorBlockChapterBar {
vertical-align: top; vertical-align: top;
} }
.playerButton.hidden:not(.autoHiding) { .playerButton.sbhidden:not(.autoHiding) {
display: none !important; display: none !important;
} }
@@ -163,13 +169,13 @@ div:hover > .sponsorBlockChapterBar {
overflow: visible !important; overflow: visible !important;
} }
.autoHiding:not(.hidden) { .autoHiding:not(.sbhidden) {
transform: translateX(0%) scale(1); transform: translateX(0%) scale(1);
/* opacity is from YouTube page */ /* opacity is from YouTube page */
transition: transform 0.2s, width 0.2s, opacity .1s cubic-bezier(0.4,0.0,1,1) !important; transition: transform 0.2s, width 0.2s, opacity .1s cubic-bezier(0.4,0.0,1,1) !important;
} }
.autoHiding.hidden { .autoHiding.sbhidden {
transform: translateX(100%) scale(0); transform: translateX(100%) scale(0);
/* opacity is from YouTube page */ /* opacity is from YouTube page */
transition: transform 0.2s, width 0.2s, opacity .1s cubic-bezier(0.4,0.0,1,1) !important; transition: transform 0.2s, width 0.2s, opacity .1s cubic-bezier(0.4,0.0,1,1) !important;
@@ -177,7 +183,7 @@ div:hover > .sponsorBlockChapterBar {
width: 0px !important; width: 0px !important;
} }
.autoHiding.hidden.autoHideLeft { .autoHiding.sbhidden.autoHideLeft {
transform: translateX(-100%) scale(0); transform: translateX(-100%) scale(0);
} }
@@ -243,11 +249,6 @@ div:hover > .sponsorBlockChapterBar {
border-collapse: unset; border-collapse: unset;
} }
.sponsorSkipNoticeParent {
min-width: 350px;
max-width: 50%;
}
.sponsorSkipNotice { .sponsorSkipNotice {
width: 100%; width: 100%;
} }
@@ -271,7 +272,7 @@ div:hover > .sponsorBlockChapterBar {
max-width: calc(100% - 50px); max-width: calc(100% - 50px);
} }
.sponsorSkipNotice .hidden { .sponsorSkipNotice .sbhidden {
display: none; display: none;
} }
@@ -570,8 +571,8 @@ div:hover > .sponsorBlockChapterBar {
.sponsorTimeEditButton { .sponsorTimeEditButton {
text-decoration: underline; text-decoration: underline;
margin-left: 20px; margin-left: 13px;
margin-right: 20px; margin-right: 13px;
font-size: 13px; font-size: 13px;
@@ -690,7 +691,7 @@ input::-webkit-inner-spin-button {
color: white; color: white;
} }
.skipButtonControlBarContainer.hidden { .skipButtonControlBarContainer.sbhidden {
display: none !important; display: none !important;
} }

View File

@@ -257,7 +257,7 @@ input[type='number'] {
opacity: 0; opacity: 0;
} }
.hidden { .hidden, .sbhidden {
display: none !important; display: none !important;
} }

View File

@@ -65,7 +65,7 @@
</div> </div>
<div id="deArrowPromotion" class="promotion-container" class="hidden"> <div id="deArrowPromotion" class="promotion-container hidden">
<a class="dearrow-link" <a class="dearrow-link"
href="https://dearrow.ajay.app" href="https://dearrow.ajay.app"
target="_blank" target="_blank"
@@ -414,6 +414,11 @@
<div class="inline"></div> <div class="inline"></div>
</div> </div>
<div data-type="keybind-change" data-sync="skipToHighlightKeybind">
<label class="optionLabel">__MSG_skip_to_category__:</label>
<div class="inline"></div>
</div>
<div data-type="keybind-change" data-sync="startSponsorKeybind"> <div data-type="keybind-change" data-sync="startSponsorKeybind">
<label class="optionLabel">__MSG_setStartSponsorShortcut__:</label> <label class="optionLabel">__MSG_setStartSponsorShortcut__:</label>
<div class="inline"></div> <div class="inline"></div>

View File

@@ -164,7 +164,7 @@ SOFTWARE.
****************************** ******************************
webext-content-scripts webext-content-scripts
2.5.2 <https://github.com/fregante/webext-content-scripts> 2.5.5 <https://github.com/fregante/webext-content-scripts>
MIT License MIT License
Copyright (c) Federico Brigante <me@fregante.com> (https://fregante.com) Copyright (c) Federico Brigante <me@fregante.com> (https://fregante.com)
@@ -194,7 +194,7 @@ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLI
****************************** ******************************
webext-polyfill-kinda webext-polyfill-kinda
1.0.0 <https://github.com/fregante/webext-polyfill-kinda> 1.0.2 <https://github.com/fregante/webext-polyfill-kinda>
MIT License MIT License
Copyright (c) Federico Brigante <me@fregante.com> (https://fregante.com) Copyright (c) Federico Brigante <me@fregante.com> (https://fregante.com)

View File

@@ -19,7 +19,7 @@ body {
font-weight: bold; font-weight: bold;
} }
.hidden { .hidden, .sbhidden {
display: none !important; display: none !important;
} }

View File

@@ -27,7 +27,7 @@
position: relative; position: relative;
} }
#sponsorBlockPopupBody .hidden { #sponsorBlockPopupBody .hidden, #sponsorBlockPopupBody .sbhidden {
display: none !important; display: none !important;
} }
@@ -260,19 +260,6 @@
text-align: right; text-align: right;
} }
/*
* Buttons that appear under a segment on click
*/
.voteButton {
height: 20px;
padding: 0 5px;
cursor: pointer;
}
.voteButton:hover {
opacity: 0.8;
}
/* /*
* "Voted!" text that appears after voting on a segment * "Voted!" text that appears after voting on a segment
*/ */

View File

@@ -195,7 +195,7 @@
<a href="https://github.com/ajayyy/SponsorBlock" target="_blank" rel="noopener">GitHub</a> <a href="https://github.com/ajayyy/SponsorBlock" target="_blank" rel="noopener">GitHub</a>
<a href="https://discord.gg/SponsorBlock" target="_blank" rel="noopener">Discord</a> <a href="https://discord.gg/SponsorBlock" target="_blank" rel="noopener">Discord</a>
<a href="https://matrix.to/#/#sponsor:ajay.app?via=ajay.app&via=matrix.org&via=mozilla.org" target="_blank" rel="noopener">Matrix</a> <a href="https://matrix.to/#/#sponsor:ajay.app?via=ajay.app&via=matrix.org&via=mozilla.org" target="_blank" rel="noopener">Matrix</a>
<a href="https://sponsor.ajay.app/donate" target="_blank" rel="noopener" id="sbDonate">$</a> <a href="https://sponsor.ajay.app/donate" target="_blank" rel="noopener" id="sbDonate">__MSG_Donate__</a>
</footer> </footer>
<button id="showNoticeAgain" style="display: none">__MSG_showNotice__</button> <button id="showNoticeAgain" style="display: none">__MSG_showNotice__</button>

View File

@@ -14,7 +14,7 @@
} }
.sponsorSkipNoticeParent { .sponsorSkipNoticeParent {
min-width: 350px; min-width: 375px;
max-width: 50%; max-width: 50%;
} }
@@ -36,7 +36,7 @@
max-width: calc(100% - 50px); max-width: calc(100% - 50px);
} }
.sponsorSkipNotice .hidden { .sponsorSkipNotice .sbhidden {
display: none; display: none;
} }
@@ -216,4 +216,17 @@
display: flex; display: flex;
align-items: center; align-items: center;
}
/*
* Buttons that appear under a segment on click
*/
.voteButton {
height: 20px;
padding: 0 5px;
cursor: pointer;
}
.voteButton:hover {
opacity: 0.8;
} }

View File

@@ -2,7 +2,7 @@ import * as CompileConfig from "../config.json";
import Config from "./config"; import Config from "./config";
import { Registration } from "./types"; import { Registration } from "./types";
import "@ajayyy/content-scripts-register-polyfill"; import "content-scripts-register-polyfill";
import { sendRealRequestToCustomServer, setupBackgroundRequestProxy } from "../maze-utils/src/background-request-proxy"; import { sendRealRequestToCustomServer, setupBackgroundRequestProxy } from "../maze-utils/src/background-request-proxy";
import { setupTabUpdates } from "../maze-utils/src/tab-updates"; import { setupTabUpdates } from "../maze-utils/src/tab-updates";
import { generateUserID } from "../maze-utils/src/setup"; import { generateUserID } from "../maze-utils/src/setup";

View File

@@ -44,7 +44,7 @@ class ChapterVoteComponent extends React.Component<ChapterVoteProps, ChapterVote
<> <>
{/* Upvote Button */} {/* Upvote Button */}
<button id={"sponsorTimesDownvoteButtonsContainerUpvoteChapter"} <button id={"sponsorTimesDownvoteButtonsContainerUpvoteChapter"}
className={"playerButton sbPlayerUpvote ytp-button " + (!this.state.show ? "hidden" : "")} className={"playerButton sbPlayerUpvote ytp-button " + (!this.state.show ? "sbhidden" : "")}
draggable="false" draggable="false"
title={chrome.i18n.getMessage("upvoteButtonInfo")} title={chrome.i18n.getMessage("upvoteButtonInfo")}
onClick={(e) => this.vote(e, 1)}> onClick={(e) => this.vote(e, 1)}>
@@ -55,7 +55,7 @@ class ChapterVoteComponent extends React.Component<ChapterVoteProps, ChapterVote
{/* Downvote Button */} {/* Downvote Button */}
<button id={"sponsorTimesDownvoteButtonsContainerDownvoteChapter"} <button id={"sponsorTimesDownvoteButtonsContainerDownvoteChapter"}
className={"playerButton sbPlayerDownvote ytp-button " + (!this.state.show ? "hidden" : "")} className={"playerButton sbPlayerDownvote ytp-button " + (!this.state.show ? "sbhidden" : "")}
draggable="false" draggable="false"
title={chrome.i18n.getMessage("reportButtonInfo")} title={chrome.i18n.getMessage("reportButtonInfo")}
onClick={(e) => { onClick={(e) => {

View File

@@ -196,21 +196,21 @@ class NoticeComponent extends React.Component<NoticeProps, NoticeState> {
<span <span
id={"skipNoticeTimerText" + this.idSuffix} id={"skipNoticeTimerText" + this.idSuffix}
key="skipNoticeTimerText" key="skipNoticeTimerText"
className={this.state.countdownMode !== CountdownMode.Timer ? "hidden" : ""} > className={this.state.countdownMode !== CountdownMode.Timer ? "sbhidden" : ""} >
{chrome.i18n.getMessage("NoticeTimeAfterSkip").replace("{seconds}", this.state.countdownTime.toString())} {chrome.i18n.getMessage("NoticeTimeAfterSkip").replace("{seconds}", this.state.countdownTime.toString())}
</span> </span>
),( ),(
<img <img
id={"skipNoticeTimerPaused" + this.idSuffix} id={"skipNoticeTimerPaused" + this.idSuffix}
key="skipNoticeTimerPaused" key="skipNoticeTimerPaused"
className={this.state.countdownMode !== CountdownMode.Paused ? "hidden" : ""} className={this.state.countdownMode !== CountdownMode.Paused ? "sbhidden" : ""}
src={chrome.runtime.getURL("icons/pause.svg")} src={chrome.runtime.getURL("icons/pause.svg")}
alt={chrome.i18n.getMessage("paused")} /> alt={chrome.i18n.getMessage("paused")} />
),( ),(
<img <img
id={"skipNoticeTimerStopped" + this.idSuffix} id={"skipNoticeTimerStopped" + this.idSuffix}
key="skipNoticeTimerStopped" key="skipNoticeTimerStopped"
className={this.state.countdownMode !== CountdownMode.Stopped ? "hidden" : ""} className={this.state.countdownMode !== CountdownMode.Stopped ? "sbhidden" : ""}
src={chrome.runtime.getURL("icons/stop.svg")} src={chrome.runtime.getURL("icons/stop.svg")}
alt={chrome.i18n.getMessage("manualPaused")} /> alt={chrome.i18n.getMessage("manualPaused")} />
)]; )];

View File

@@ -128,6 +128,14 @@ class SponsorTimeEditComponent extends React.Component<SponsorTimeEditProps, Spo
style={timeDisplayStyle} style={timeDisplayStyle}
className="sponsorTimeDisplay"> className="sponsorTimeDisplay">
{sponsorTime.actionType !== ActionType.Poi ? (
<span id={"startButton" + this.idSuffix}
className="sponsorNowButton"
onClick={() => this.setTimeTo(0, 0)}>
{chrome.i18n.getMessage("bracketStart")}
</span>
): ""}
<span id={"nowButton0" + this.idSuffix} <span id={"nowButton0" + this.idSuffix}
className="sponsorNowButton" className="sponsorNowButton"
onClick={() => this.setTimeToNow(0)}> onClick={() => this.setTimeToNow(0)}>
@@ -138,6 +146,8 @@ class SponsorTimeEditComponent extends React.Component<SponsorTimeEditProps, Spo
type="text" type="text"
style={{color: "inherit", backgroundColor: "inherit"}} style={{color: "inherit", backgroundColor: "inherit"}}
value={this.state.sponsorTimeEdits[0]} value={this.state.sponsorTimeEdits[0]}
onKeyDown={(e) => e.stopPropagation()}
onKeyUp={(e) => e.stopPropagation()}
onChange={(e) => this.handleOnChange(0, e, sponsorTime, e.target.value)} onChange={(e) => this.handleOnChange(0, e, sponsorTime, e.target.value)}
onWheel={(e) => this.changeTimesWhenScrolling(0, e, sponsorTime)}> onWheel={(e) => this.changeTimesWhenScrolling(0, e, sponsorTime)}>
</input> </input>
@@ -153,6 +163,8 @@ class SponsorTimeEditComponent extends React.Component<SponsorTimeEditProps, Spo
type="text" type="text"
style={{color: "inherit", backgroundColor: "inherit"}} style={{color: "inherit", backgroundColor: "inherit"}}
value={this.state.sponsorTimeEdits[1]} value={this.state.sponsorTimeEdits[1]}
onKeyDown={(e) => e.stopPropagation()}
onKeyUp={(e) => e.stopPropagation()}
onChange={(e) => this.handleOnChange(1, e, sponsorTime, e.target.value)} onChange={(e) => this.handleOnChange(1, e, sponsorTime, e.target.value)}
onWheel={(e) => this.changeTimesWhenScrolling(1, e, sponsorTime)}> onWheel={(e) => this.changeTimesWhenScrolling(1, e, sponsorTime)}>
</input> </input>
@@ -238,6 +250,8 @@ class SponsorTimeEditComponent extends React.Component<SponsorTimeEditProps, Spo
ref={this.descriptionOptionRef} ref={this.descriptionOptionRef}
type="text" type="text"
value={this.state.description} value={this.state.description}
onKeyDown={(e) => e.stopPropagation()}
onKeyUp={(e) => e.stopPropagation()}
onContextMenu={(e) => e.stopPropagation()} onContextMenu={(e) => e.stopPropagation()}
onChange={(e) => this.descriptionUpdate(e.target.value)} onChange={(e) => this.descriptionUpdate(e.target.value)}
onFocus={() => this.setState({chapterNameSelectorOpen: true})}> onFocus={() => this.setState({chapterNameSelectorOpen: true})}>
@@ -282,11 +296,10 @@ class SponsorTimeEditComponent extends React.Component<SponsorTimeEditProps, Spo
</span> </span>
): ""} ): ""}
{(!isNaN(segment[1]) && ![ActionType.Poi, ActionType.Full].includes(sponsorTime.actionType)) {(!isNaN(segment[1]) && ![ActionType.Poi, ActionType.Full].includes(sponsorTime.actionType)) ? (
&& sponsorTime.actionType === ActionType.Chapter ? (
<span id={"sponsorTimePreviewButton" + this.idSuffix} <span id={"sponsorTimePreviewButton" + this.idSuffix}
className="sponsorTimeEditButton" className="sponsorTimeEditButton"
onClick={(e) => this.previewTime(e.ctrlKey, e.shiftKey)}> onClick={(e) => this.previewTime(e.ctrlKey, e.shiftKey, true)}>
{chrome.i18n.getMessage("End")} {chrome.i18n.getMessage("End")}
</span> </span>
): ""} ): ""}
@@ -624,7 +637,7 @@ class SponsorTimeEditComponent extends React.Component<SponsorTimeEditProps, Spo
: CompileConfig.categorySupport[category]?.[0] ?? ActionType.Skip : CompileConfig.categorySupport[category]?.[0] ?? ActionType.Skip
} }
previewTime(ctrlPressed = false, shiftPressed = false): void { previewTime(ctrlPressed = false, shiftPressed = false, skipToEndTime = false): void {
const sponsorTimes = this.props.contentContainer().sponsorTimesSubmitting; const sponsorTimes = this.props.contentContainer().sponsorTimesSubmitting;
const index = this.props.index; const index = this.props.index;
let seekTime = 2; let seekTime = 2;
@@ -633,13 +646,11 @@ class SponsorTimeEditComponent extends React.Component<SponsorTimeEditProps, Spo
const startTime = sponsorTimes[index].segment[0]; const startTime = sponsorTimes[index].segment[0];
const endTime = sponsorTimes[index].segment[1]; const endTime = sponsorTimes[index].segment[1];
const isChapter = sponsorTimes[index].actionType === ActionType.Chapter;
// If segment starts at 0:00, start playback at the end of the segment // If segment starts at 0:00, start playback at the end of the segment
const skipToEndTime = startTime === 0 || isChapter; const skipTime = (startTime === 0 || skipToEndTime) ? endTime : (startTime - (seekTime * this.props.contentContainer().v.playbackRate));
const skipTime = skipToEndTime ? endTime : (startTime - (seekTime * this.props.contentContainer().v.playbackRate));
this.props.contentContainer().previewTime(skipTime, !isChapter); this.props.contentContainer().previewTime(skipTime, !skipToEndTime);
} }
inspectTime(): void { inspectTime(): void {

View File

@@ -86,6 +86,7 @@ interface SBConfig {
}; };
skipKeybind: Keybind; skipKeybind: Keybind;
skipToHighlightKeybind: Keybind;
startSponsorKeybind: Keybind; startSponsorKeybind: Keybind;
submitKeybind: Keybind; submitKeybind: Keybind;
nextChapterKeybind: Keybind; nextChapterKeybind: Keybind;
@@ -328,6 +329,7 @@ const syncDefaults = {
* TODO: Find a way to skip having to update these checks. Maybe storing keybinds in a Map? * TODO: Find a way to skip having to update these checks. Maybe storing keybinds in a Map?
*/ */
skipKeybind: { key: "Enter" }, skipKeybind: { key: "Enter" },
skipToHighlightKeybind: { key: "Enter", ctrl: true },
startSponsorKeybind: { key: ";" }, startSponsorKeybind: { key: ";" },
submitKeybind: { key: "'" }, submitKeybind: { key: "'" },
nextChapterKeybind: { key: "ArrowRight", ctrl: true }, nextChapterKeybind: { key: "ArrowRight", ctrl: true },

View File

@@ -63,7 +63,7 @@ utils.wait(() => Config.isReady(), 5000, 10).then(() => {
&& Config.config.showDeArrowPromotion && Config.config.showDeArrowPromotion
&& Config.config.showUpsells && Config.config.showUpsells
&& Config.config.showNewFeaturePopups && Config.config.showNewFeaturePopups
&& (Config.config.skipCount > 100 || !Config.config.trackViewCount) && (Config.config.skipCount > 30 || !Config.config.trackViewCount)
&& Math.random() < 0.05) { && Math.random() < 0.05) {
if (!await isDeArrowInstalled()) { if (!await isDeArrowInstalled()) {
@@ -110,6 +110,7 @@ const skipNotices: SkipNotice[] = [];
let activeSkipKeybindElement: ToggleSkippable = null; let activeSkipKeybindElement: ToggleSkippable = null;
let retryFetchTimeout: NodeJS.Timeout = null; let retryFetchTimeout: NodeJS.Timeout = null;
let shownSegmentFailedToFetchWarning = false; let shownSegmentFailedToFetchWarning = false;
let selectedSegment: SegmentUUID | null = null;
// JSON video info // JSON video info
let videoInfo: VideoInfo = null; let videoInfo: VideoInfo = null;
@@ -300,6 +301,10 @@ function messageListener(request: Message, sender: unknown, sendResponse: (respo
case "reskip": case "reskip":
reskipSponsorTime(sponsorTimes.find((segment) => segment.UUID === request.UUID), true); reskipSponsorTime(sponsorTimes.find((segment) => segment.UUID === request.UUID), true);
break; break;
case "selectSegment":
selectedSegment = request.UUID;
updatePreviewBar();
break;
case "submitVote": case "submitVote":
vote(request.type, request.UUID).then((response) => sendResponse(response)); vote(request.type, request.UUID).then((response) => sendResponse(response));
return true; return true;
@@ -1369,7 +1374,8 @@ function updatePreviewBar(): void {
showLarger: segment.actionType === ActionType.Poi, showLarger: segment.actionType === ActionType.Poi,
description: segment.description, description: segment.description,
source: segment.source, source: segment.source,
requiredSegment: requiredSegment && (segment.UUID === requiredSegment || segment.UUID.startsWith(requiredSegment)) requiredSegment: requiredSegment && (segment.UUID === requiredSegment || segment.UUID.startsWith(requiredSegment)),
selectedSegment: selectedSegment && segment.UUID === selectedSegment
}); });
}); });
} }
@@ -2121,7 +2127,7 @@ async function vote(type: number, UUID: SegmentUUID, category?: Category, skipNo
//success (treat rate limits as a success) //success (treat rate limits as a success)
skipNotice.afterVote.bind(skipNotice)(utils.getSponsorTimeFromUUID(sponsorTimes, UUID), type, category); skipNotice.afterVote.bind(skipNotice)(utils.getSponsorTimeFromUUID(sponsorTimes, UUID), type, category);
} else if (response.successType == -1) { } else if (response.successType == -1) {
if (response.statusCode === 403 && response.responseText.startsWith("Vote rejected due to a warning from a moderator.")) { if (response.statusCode === 403 && response.responseText.startsWith("Vote rejected due to a tip from a moderator.")) {
openWarningDialog(skipNoticeContentContainer); openWarningDialog(skipNoticeContentContainer);
} else { } else {
skipNotice.setNoticeInfoMessage.bind(skipNotice)(getErrorMessage(response.statusCode, response.responseText)) skipNotice.setNoticeInfoMessage.bind(skipNotice)(getErrorMessage(response.statusCode, response.responseText))
@@ -2311,7 +2317,7 @@ async function sendSubmitMessage() {
playerButtons.submit.button.style.animation = "unset"; playerButtons.submit.button.style.animation = "unset";
playerButtons.submit.image.src = chrome.extension.getURL("icons/PlayerUploadFailedIconSponsorBlocker.svg"); playerButtons.submit.image.src = chrome.extension.getURL("icons/PlayerUploadFailedIconSponsorBlocker.svg");
if (response.status === 403 && response.responseText.startsWith("Submission rejected due to a warning from a moderator.")) { if (response.status === 403 && response.responseText.startsWith("Submission rejected due to a tip from a moderator.")) {
openWarningDialog(skipNoticeContentContainer); openWarningDialog(skipNoticeContentContainer);
} else { } else {
alert(getErrorMessage(response.status, response.responseText)); alert(getErrorMessage(response.status, response.responseText));
@@ -2426,14 +2432,23 @@ function hotkeyListener(e: KeyboardEvent): void {
}; };
const skipKey = Config.config.skipKeybind; const skipKey = Config.config.skipKeybind;
const skipToHighlightKey = Config.config.skipToHighlightKeybind;
const startSponsorKey = Config.config.startSponsorKeybind; const startSponsorKey = Config.config.startSponsorKeybind;
const submitKey = Config.config.submitKeybind; const submitKey = Config.config.submitKeybind;
const nextChapterKey = Config.config.nextChapterKeybind; const nextChapterKey = Config.config.nextChapterKeybind;
const previousChapterKey = Config.config.previousChapterKeybind; const previousChapterKey = Config.config.previousChapterKeybind;
if (keybindEquals(key, skipKey)) { if (keybindEquals(key, skipKey)) {
if (activeSkipKeybindElement) if (activeSkipKeybindElement) {
activeSkipKeybindElement.toggleSkip.call(activeSkipKeybindElement); activeSkipKeybindElement.toggleSkip.call(activeSkipKeybindElement);
}
return;
} else if (keybindEquals(key, skipToHighlightKey)) {
if (skipButtonControlBar) {
skipButtonControlBar.toggleSkip.call(skipButtonControlBar);
}
return; return;
} else if (keybindEquals(key, startSponsorKey)) { } else if (keybindEquals(key, startSponsorKey)) {
startOrEndTimingNewSegment(); startOrEndTimingNewSegment();

View File

@@ -27,6 +27,7 @@ export interface PreviewBarSegment {
description: string; description: string;
source: SponsorSourceType; source: SponsorSourceType;
requiredSegment?: boolean; requiredSegment?: boolean;
selectedSegment?: boolean;
} }
interface ChapterGroup extends SegmentContainer { interface ChapterGroup extends SegmentContainer {
@@ -332,6 +333,7 @@ class PreviewBar {
const bar = document.createElement('li'); const bar = document.createElement('li');
bar.classList.add('previewbar'); bar.classList.add('previewbar');
if (barSegment.requiredSegment) bar.classList.add("requiredSegment"); if (barSegment.requiredSegment) bar.classList.add("requiredSegment");
if (barSegment.selectedSegment) bar.classList.add("selectedSegment");
bar.innerHTML = showLarger ? '&nbsp;&nbsp;' : '&nbsp;'; bar.innerHTML = showLarger ? '&nbsp;&nbsp;' : '&nbsp;';
const fullCategoryName = (unsubmitted ? 'preview-' : '') + category; const fullCategoryName = (unsubmitted ? 'preview-' : '') + category;

View File

@@ -41,7 +41,7 @@ export class SkipButtonControlBar {
this.container = document.createElement("div"); this.container = document.createElement("div");
this.container.classList.add("skipButtonControlBarContainer"); this.container.classList.add("skipButtonControlBarContainer");
this.container.classList.add("hidden"); this.container.classList.add("sbhidden");
if (this.onMobileYouTube) this.container.classList.add("mobile"); if (this.onMobileYouTube) this.container.classList.add("mobile");
this.skipIcon = document.createElement("img"); this.skipIcon = document.createElement("img");
@@ -103,7 +103,7 @@ export class SkipButtonControlBar {
this.refreshText(); this.refreshText();
this.container?.classList?.remove("textDisabled"); this.container?.classList?.remove("textDisabled");
this.textContainer?.classList?.remove("hidden"); this.textContainer?.classList?.remove("sbhidden");
AnimationUtils.disableAutoHideAnimation(this.skipIcon); AnimationUtils.disableAutoHideAnimation(this.skipIcon);
this.startTimer(); this.startTimer();
@@ -111,8 +111,8 @@ export class SkipButtonControlBar {
refreshText(): void { refreshText(): void {
if (this.segment) { if (this.segment) {
this.chapterText?.classList?.add("hidden"); this.chapterText?.classList?.add("sbhidden");
this.container.classList.remove("hidden"); this.container.classList.remove("sbhidden");
this.textContainer.innerText = this.getTitle(); this.textContainer.innerText = this.getTitle();
this.skipIcon.setAttribute("title", this.getTitle()); this.skipIcon.setAttribute("title", this.getTitle());
} }
@@ -134,10 +134,10 @@ export class SkipButtonControlBar {
} }
disable(): void { disable(): void {
this.container.classList.add("hidden"); this.container.classList.add("sbhidden");
this.chapterText?.classList?.remove("hidden"); this.chapterText?.classList?.remove("sbhidden");
this.getChapterPrefix()?.classList?.remove("hidden"); this.getChapterPrefix()?.classList?.remove("sbhidden");
this.enabled = false; this.enabled = false;
} }
@@ -147,8 +147,10 @@ export class SkipButtonControlBar {
} }
toggleSkip(): void { toggleSkip(): void {
this.skip(this.segment); if (this.segment && this.enabled) {
this.disableText(); this.skip(this.segment);
this.disableText();
}
} }
disableText(): void { disableText(): void {
@@ -158,10 +160,10 @@ export class SkipButtonControlBar {
} }
this.container.classList.add("textDisabled"); this.container.classList.add("textDisabled");
this.textContainer?.classList?.add("hidden"); this.textContainer?.classList?.add("sbhidden");
this.chapterText?.classList?.remove("hidden"); this.chapterText?.classList?.remove("sbhidden");
this.getChapterPrefix()?.classList?.add("hidden"); this.getChapterPrefix()?.classList?.add("sbhidden");
AnimationUtils.enableAutoHideAnimation(this.skipIcon); AnimationUtils.enableAutoHideAnimation(this.skipIcon);
if (this.onMobileYouTube) { if (this.onMobileYouTube) {
@@ -182,7 +184,7 @@ export class SkipButtonControlBar {
} }
private getTitle(): string { private getTitle(): string {
return getSkippingText([this.segment], false) + (this.showKeybindHint ? " (" + keybindToString(Config.config.skipKeybind) + ")" : ""); return getSkippingText([this.segment], false) + (this.showKeybindHint ? " (" + keybindToString(Config.config.skipToHighlightKeybind) + ")" : "");
} }
private getChapterPrefix(): HTMLElement { private getChapterPrefix(): HTMLElement {

View File

@@ -31,7 +31,7 @@ interface IsInfoFoundMessage {
} }
interface SkipMessage { interface SkipMessage {
message: "unskip" | "reskip"; message: "unskip" | "reskip" | "selectSegment";
UUID: SegmentUUID; UUID: SegmentUUID;
} }

View File

@@ -85,6 +85,9 @@ async function init() {
}); });
} }
const skipToHighlightKeybind = document.querySelector(`[data-sync="skipToHighlightKeybind"] .optionLabel`) as HTMLElement;
skipToHighlightKeybind.innerText = `${chrome.i18n.getMessage("skip_to_category").replace("{0}", chrome.i18n.getMessage("category_poi_highlight")).replace("?", "")}:`;
// Set all of the toggle options to the correct option // Set all of the toggle options to the correct option
const optionsContainer = document.getElementById("options"); const optionsContainer = document.getElementById("options");
const optionsElements = optionsContainer.querySelectorAll("*"); const optionsElements = optionsContainer.querySelectorAll("*");

View File

@@ -687,6 +687,8 @@ async function runThePopup(messageListener?: MessageListener): Promise<void> {
: chrome.i18n.getMessage("skipSegment"); : chrome.i18n.getMessage("skipSegment");
skipButton.addEventListener("click", () => skipSegment(actionType, UUID, skipButton)); skipButton.addEventListener("click", () => skipSegment(actionType, UUID, skipButton));
votingButtons.addEventListener("dblclick", () => skipSegment(actionType, UUID)); votingButtons.addEventListener("dblclick", () => skipSegment(actionType, UUID));
votingButtons.addEventListener("dblclick", () => skipSegment(actionType, UUID));
votingButtons.addEventListener("mouseenter", () => selectSegment(UUID));
//add thumbs up, thumbs down and uuid copy buttons to the container //add thumbs up, thumbs down and uuid copy buttons to the container
voteButtonsContainer.appendChild(upvoteButton); voteButtonsContainer.appendChild(upvoteButton);
@@ -718,6 +720,8 @@ async function runThePopup(messageListener?: MessageListener): Promise<void> {
container.appendChild(votingButtons); container.appendChild(votingButtons);
} }
container.addEventListener("mouseleave", () => selectSegment(null));
} }
function submitTimes() { function submitTimes() {
@@ -968,6 +972,13 @@ async function runThePopup(messageListener?: MessageListener): Promise<void> {
} }
} }
function selectSegment(UUID: SegmentUUID | null): void {
sendTabMessage({
message: "selectSegment",
UUID: UUID
});
}
/** /**
* Should skipping be disabled (visuals stay) * Should skipping be disabled (visuals stay)
*/ */

View File

@@ -27,7 +27,7 @@ function applyLoadingAnimation(element: HTMLElement, time: number, callback?: ()
function setupCustomHideAnimation(element: Element, container: Element, enabled = true, rightSlide = true): { hide: () => void; show: () => void } { function setupCustomHideAnimation(element: Element, container: Element, enabled = true, rightSlide = true): { hide: () => void; show: () => void } {
if (enabled) element.classList.add("autoHiding"); if (enabled) element.classList.add("autoHiding");
element.classList.add("hidden"); element.classList.add("sbhidden");
element.classList.add("animationDone"); element.classList.add("animationDone");
if (!rightSlide) element.classList.add("autoHideLeft"); if (!rightSlide) element.classList.add("autoHideLeft");
@@ -37,7 +37,7 @@ function setupCustomHideAnimation(element: Element, container: Element, enabled
hide: () => { hide: () => {
mouseEntered = false; mouseEntered = false;
if (element.classList.contains("autoHiding")) { if (element.classList.contains("autoHiding")) {
element.classList.add("hidden"); element.classList.add("sbhidden");
} }
}, },
show: () => { show: () => {
@@ -46,7 +46,7 @@ function setupCustomHideAnimation(element: Element, container: Element, enabled
// Wait for next event loop // Wait for next event loop
setTimeout(() => { setTimeout(() => {
if (mouseEntered) element.classList.remove("hidden") if (mouseEntered) element.classList.remove("sbhidden")
}, 10); }, 10);
} }
}; };
@@ -61,12 +61,12 @@ function setupAutoHideAnimation(element: Element, container: Element, enabled =
function enableAutoHideAnimation(element: Element): void { function enableAutoHideAnimation(element: Element): void {
element.classList.add("autoHiding"); element.classList.add("autoHiding");
element.classList.add("hidden"); element.classList.add("sbhidden");
} }
function disableAutoHideAnimation(element: Element): void { function disableAutoHideAnimation(element: Element): void {
element.classList.remove("autoHiding"); element.classList.remove("autoHiding");
element.classList.remove("hidden"); element.classList.remove("sbhidden");
} }
export const AnimationUtils = { export const AnimationUtils = {

View File

@@ -4,20 +4,17 @@ function getLuminance(color: string): number {
return Math.sqrt(0.299 * (r * r) + 0.587 * (g * g) + 0.114 * (b * b)); return Math.sqrt(0.299 * (r * r) + 0.587 * (g * g) + 0.114 * (b * b));
} }
/* From https://stackoverflow.com/a/5624139 */ /* Converts hex color to rgb color */
function hexToRgb(hex: string): {r: number; g: number; b: number} { const hexChars = "0123456789abcdef";
// Expand shorthand form (e.g. "03F") to full form (e.g. "0033FF") function hexToRgb(hex: string): { r: number; g: number; b: number } | null {
const shorthandRegex = /^#?([a-f\d])([a-f\d])([a-f\d])$/i; if (hex.length == 4)
hex = hex.replace(shorthandRegex, function(m, r, g, b) { hex = "#" + hex[1] + hex[1] + hex[2] + hex[2] + hex[3] + hex[3];
return r + r + g + g + b + b; return /^#?([a-f\d]{2})([a-f\d]{2})([a-f\d]{2})$/i.exec(hex)
}); ? {
r: hexChars.indexOf(hex[1]) * 16 + hexChars.indexOf(hex[2]),
const result = /^#?([a-f\d]{2})([a-f\d]{2})([a-f\d]{2})$/i.exec(hex); g: hexChars.indexOf(hex[3]) * 16 + hexChars.indexOf(hex[4]),
return result ? { b: hexChars.indexOf(hex[5]) * 16 + hexChars.indexOf(hex[6]),
r: parseInt(result[1], 16), }: null;
g: parseInt(result[2], 16),
b: parseInt(result[3], 16)
} : null;
} }
/** /**
@@ -31,4 +28,4 @@ function indexesOf<T>(array: T[], value: T): number[] {
export const GenericUtils = { export const GenericUtils = {
getLuminance, getLuminance,
indexesOf indexesOf
} }

View File

@@ -26,7 +26,7 @@ export async function openWarningDialog(contentContainer: ContentContainer): Pro
let notice: GenericNotice = null; let notice: GenericNotice = null;
const options: NoticeOptions = { const options: NoticeOptions = {
title: chrome.i18n.getMessage("warningTitle"), title: chrome.i18n.getMessage("deArrowMessageRecieved"),
textBoxes: [{ textBoxes: [{
text: chrome.i18n.getMessage("warningChatInfo"), text: chrome.i18n.getMessage("warningChatInfo"),
icon: null icon: null