Compare commits

...

9 Commits

Author SHA1 Message Date
schlagmichdoch
59dca141b6 increase version to v1.6.0 2023-04-17 15:25:52 +02:00
schlagmichdoch
d0046e83cb remove openrelayproject from rtc_config 2023-04-17 15:24:31 +02:00
schlagmichdoch
2aeadb44e2 Merge pull request #68
Increase SEO
2023-04-17 15:21:04 +02:00
schlagmichdoch
7827a47d29 increase seo with recommendations from PageSpeed Insights 2023-04-17 15:19:54 +02:00
schlagmichdoch
4edc9c9b22 Merge pull request #95 from robvanoostenrijk/ghcr-multi-architecture
Build multi-architecture image
2023-04-16 15:35:22 +02:00
schlagmichdoch
398a69d7a0 Merge pull request #97 from schlagmichdoch/dependabot/npm_and_yarn/ua-parser-js-1.0.35
Bump ua-parser-js from 1.0.34 to 1.0.35
2023-04-07 18:07:43 +02:00
dependabot[bot]
dfe69cc873 Bump ua-parser-js from 1.0.34 to 1.0.35
Bumps [ua-parser-js](https://github.com/faisalman/ua-parser-js) from 1.0.34 to 1.0.35.
- [Release notes](https://github.com/faisalman/ua-parser-js/releases)
- [Changelog](https://github.com/faisalman/ua-parser-js/blob/master/changelog.md)
- [Commits](https://github.com/faisalman/ua-parser-js/compare/1.0.34...1.0.35)

---
updated-dependencies:
- dependency-name: ua-parser-js
  dependency-type: direct:production
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>
2023-04-03 05:05:12 +00:00
Rob van Oostenrijk
f5fde731b0 Build multi-architecture image
Build image output both for amd64 & arm64
2023-03-31 08:37:11 +04:00
schlagmichdoch
d6eee480b3 Add darkmode/lightmode/auto toggle to "Other changes" 2023-03-29 17:10:20 +02:00
16 changed files with 88 additions and 90 deletions

View File

@@ -28,6 +28,12 @@ jobs:
steps:
- name: Checkout repository
uses: actions/checkout@v3
- name: Setup qemu
uses: docker/setup-qemu-action@v2.1.0
- name: Setup Docker Buildx
uses: docker/setup-buildx-action@v2.5.0
- name: Log in to the Container registry
uses: docker/login-action@f054a8b539a109f9f41c372932f1ae047eff08c9
@@ -46,6 +52,7 @@ jobs:
uses: docker/build-push-action@ad44023a93711e3deb337508980b4b5e9bcdc5dc
with:
context: .
platforms: linux/amd64,linux/arm64
push: true
tags: ${{ steps.meta.outputs.tags }}
labels: ${{ steps.meta.outputs.labels }}

View File

@@ -57,9 +57,10 @@ Developed based on [Snapdrop](https://github.com/RobinLinus/snapdrop)
* Change your display name permanently to easily differentiate your devices
* [Paste files/text and choose the recipient afterwords ](https://github.com/RobinLinus/snapdrop/pull/534)
* [Prevent devices from sleeping on file transfer](https://github.com/RobinLinus/snapdrop/pull/413)
* Warn user before PairDrop is closed on file transfer
* Warn user before PairDrop is closed on file transfer
* Open PairDrop on multiple tabs simultaneously (Thanks [@willstott101](https://github.com/willstott101))
* [Video and Audio preview](https://github.com/RobinLinus/snapdrop/pull/455) (Thanks [@victorwads](https://github.com/victorwads))
* Switch theme back to auto/system after darkmode or lightmode is enabled
* Node-only implementation (Thanks [@Bellisario](https://github.com/Bellisario))
* Automatic restart on error (Thanks [@KaKi87](https://github.com/KaKi87))
* Lots of stability fixes (Thanks [@MWY001](https://github.com/MWY001) [@skiby7](https://github.com/skiby7) and [@willstott101](https://github.com/willstott101))

View File

@@ -63,14 +63,6 @@ const rtcConfig = process.env.RTC_CONFIG
"iceServers": [
{
"urls": "stun:stun.l.google.com:19302"
},
{
"urls": "stun:openrelay.metered.ca:80"
},
{
"urls": "turn:openrelay.metered.ca:443",
"username": "openrelayproject",
"credential": "openrelayproject"
}
]
};

18
package-lock.json generated
View File

@@ -1,17 +1,17 @@
{
"name": "pairdrop",
"version": "1.5.3",
"version": "1.6.0",
"lockfileVersion": 2,
"requires": true,
"packages": {
"": {
"name": "pairdrop",
"version": "1.5.3",
"version": "1.6.0",
"license": "ISC",
"dependencies": {
"express": "^4.18.2",
"express-rate-limit": "^6.7.0",
"ua-parser-js": "^1.0.34",
"ua-parser-js": "^1.0.35",
"unique-names-generator": "^4.3.0",
"ws": "^8.13.0"
},
@@ -583,9 +583,9 @@
}
},
"node_modules/ua-parser-js": {
"version": "1.0.34",
"resolved": "https://registry.npmjs.org/ua-parser-js/-/ua-parser-js-1.0.34.tgz",
"integrity": "sha512-K9mwJm/DaB6mRLZfw6q8IMXipcrmuT6yfhYmwhAkuh+81sChuYstYA+znlgaflUPaYUa3odxKPKGw6Vw/lANew==",
"version": "1.0.35",
"resolved": "https://registry.npmjs.org/ua-parser-js/-/ua-parser-js-1.0.35.tgz",
"integrity": "sha512-fKnGuqmTBnIE+/KXSzCn4db8RTigUzw1AN0DmdU6hJovUTbYJKyqj+8Mt1c4VfRDnOVJnENmfYkIPZ946UrSAA==",
"funding": [
{
"type": "opencollective",
@@ -1070,9 +1070,9 @@
}
},
"ua-parser-js": {
"version": "1.0.34",
"resolved": "https://registry.npmjs.org/ua-parser-js/-/ua-parser-js-1.0.34.tgz",
"integrity": "sha512-K9mwJm/DaB6mRLZfw6q8IMXipcrmuT6yfhYmwhAkuh+81sChuYstYA+znlgaflUPaYUa3odxKPKGw6Vw/lANew=="
"version": "1.0.35",
"resolved": "https://registry.npmjs.org/ua-parser-js/-/ua-parser-js-1.0.35.tgz",
"integrity": "sha512-fKnGuqmTBnIE+/KXSzCn4db8RTigUzw1AN0DmdU6hJovUTbYJKyqj+8Mt1c4VfRDnOVJnENmfYkIPZ946UrSAA=="
},
"unique-names-generator": {
"version": "4.7.1",

View File

@@ -1,6 +1,6 @@
{
"name": "pairdrop",
"version": "1.5.3",
"version": "1.6.0",
"description": "",
"main": "index.js",
"scripts": {
@@ -12,7 +12,7 @@
"dependencies": {
"express": "^4.18.2",
"express-rate-limit": "^6.7.0",
"ua-parser-js": "^1.0.34",
"ua-parser-js": "^1.0.35",
"unique-names-generator": "^4.3.0",
"ws": "^8.13.0"
},

View File

@@ -45,45 +45,45 @@
</svg>
</a>
<div id="theme-wrapper">
<a id="theme-auto" class="icon-button selected" title="Adapt to System" >
<div id="theme-auto" class="icon-button selected" title="Adapt to System" >
<svg class="icon">
<use xlink:href="#icon-theme-auto" />
</svg>
</a>
</div>
<div>
<a id="theme-light" class="icon-button" title="Always Light" >
<div id="theme-light" class="icon-button" title="Always Light" >
<svg class="icon">
<use xlink:href="#icon-theme-light" />
</svg>
</a>
<a id="theme-dark" class="icon-button" title="Always Dark" >
</div>
<div id="theme-dark" class="icon-button" title="Always Dark" >
<svg class="icon">
<use xlink:href="#icon-theme-dark" />
</svg>
</a>
</div>
</div>
</div>
<a id="notification" class="icon-button" title="Enable Notifications" hidden>
<div id="notification" class="icon-button" title="Enable Notifications" hidden>
<svg class="icon">
<use xlink:href="#notifications" />
</svg>
</a>
<a id="install" class="icon-button" title="Install PairDrop" hidden>
</div>
<div id="install" class="icon-button" title="Install PairDrop" hidden>
<svg class="icon">
<use xlink:href="#homescreen" />
</svg>
</a>
<a id="pair-device" class="icon-button" title="Pair Device" hidden>
</div>
<div id="pair-device" class="icon-button" title="Pair Device" hidden>
<svg class="icon">
<use xlink:href="#pair-device-icon" />
</svg>
</a>
<a id="clear-pair-devices" class="icon-button" title="Clear All Paired Devices" hidden>
</div>
<div id="clear-pair-devices" class="icon-button" title="Clear All Paired Devices" hidden>
<svg class="icon">
<use xlink:href="#clear-pair-devices-icon" />
</svg>
</a>
<a id="cancel-paste-mode" class="button" hidden>Done</a>
</div>
<div id="cancel-paste-mode" class="button" hidden>Done</div>
</header>
<!-- Center -->
<div id="center">
@@ -126,12 +126,12 @@
<div id="pair-instructions" class="font-subheading center text-center">Input this key on another device<br>or scan the QR-Code.</div>
<hr>
<div id="key-input-container">
<input type="tel" class="textarea center" maxlength="1" autocorrect="off" autocomplete="off" autocapitalize="none" spellcheck="false" autofocus contenteditable placeholder="" disabled>
<input type="tel" class="textarea center" maxlength="1" autocorrect="off" autocomplete="off" autocapitalize="none" spellcheck="false" contenteditable placeholder="" disabled>
<input type="tel" class="textarea center" maxlength="1" autocorrect="off" autocomplete="off" autocapitalize="none" spellcheck="false" contenteditable placeholder="" disabled>
<input type="tel" class="textarea center" maxlength="1" autocorrect="off" autocomplete="off" autocapitalize="none" spellcheck="false" contenteditable placeholder="" disabled>
<input type="tel" class="textarea center" maxlength="1" autocorrect="off" autocomplete="off" autocapitalize="none" spellcheck="false" contenteditable placeholder="" disabled>
<input type="tel" class="textarea center" maxlength="1" autocorrect="off" autocomplete="off" autocapitalize="none" spellcheck="false" contenteditable placeholder="" disabled>
<input type="tel" class="textarea center" aria-label="pair-key-1" maxlength="1" autocorrect="off" autocomplete="off" autocapitalize="none" spellcheck="false" autofocus contenteditable placeholder="" disabled>
<input type="tel" class="textarea center" aria-label="pair-key-2" maxlength="1" autocorrect="off" autocomplete="off" autocapitalize="none" spellcheck="false" contenteditable placeholder="" disabled>
<input type="tel" class="textarea center" aria-label="pair-key-3" maxlength="1" autocorrect="off" autocomplete="off" autocapitalize="none" spellcheck="false" contenteditable placeholder="" disabled>
<input type="tel" class="textarea center" aria-label="pair-key-4" maxlength="1" autocorrect="off" autocomplete="off" autocapitalize="none" spellcheck="false" contenteditable placeholder="" disabled>
<input type="tel" class="textarea center" aria-label="pair-key-5" maxlength="1" autocorrect="off" autocomplete="off" autocapitalize="none" spellcheck="false" contenteditable placeholder="" disabled>
<input type="tel" class="textarea center" aria-label="pair-key-6" maxlength="1" autocorrect="off" autocomplete="off" autocapitalize="none" spellcheck="false" contenteditable placeholder="" disabled>
</div>
<div class="font-subheading center text-center">Enter key from another device to continue.</div>
<div class="center row-reverse">
@@ -220,7 +220,7 @@
<span class="display-name"></span>
</div>
<div class="row-separator"></div>
<div id="text-input" class="textarea" role="textbox" autocapitalize="none" spellcheck="false" autofocus contenteditable></div>
<div id="text-input" title="Message" class="textarea" role="textbox" autocapitalize="none" spellcheck="false" autofocus contenteditable></div>
<div class="center row-reverse">
<button class="button" type="submit" title="STR + ENTER" disabled close>Send</button>
<button class="button" type="button" title="ESCAPE" close>Cancel</button>
@@ -365,11 +365,11 @@
</symbol>
</svg>
<!-- Scripts -->
<script src="scripts/util.js"></script>
<script src="scripts/theme.js"></script>
<script src="scripts/network.js"></script>
<script src="scripts/ui.js"></script>
<script src="scripts/theme.js" async></script>
<script src="scripts/qrcode.js" async></script>
<script src="scripts/util.js" async></script>
<script src="scripts/QRCode.min.js" async></script>
<script src="scripts/zip.min.js" async></script>
<script src="scripts/NoSleep.min.js" async></script>
<!-- Sounds -->

2
public/robots.txt Normal file
View File

@@ -0,0 +1,2 @@
User-agent: *
Disallow:

View File

@@ -1,4 +1,4 @@
const cacheVersion = 'v1.5.3';
const cacheVersion = 'v1.6.0';
const cacheTitle = `pairdrop-cache-${cacheVersion}`;
const urlsToCache = [
'index.html',

View File

@@ -96,7 +96,8 @@ header > div {
align-self: flex-start;
touch-action: manipulation;
}
header > div a {
header > div .icon-button {
height: 40px;
transition: all 300ms;
}
@@ -106,7 +107,7 @@ header > div > div {
flex-direction: column;
}
header > div:not(:hover) a:not(.selected) {
header > div:not(:hover) .icon-button:not(.selected) {
height: 0;
opacity: 0;
}
@@ -125,16 +126,16 @@ header > div:hover::before {
margin-bottom: 8px;
}
header > div:hover a.selected::before {
header > div:hover .icon-button.selected::before {
opacity: 0.1;
}
@media (pointer: coarse) {
header > div:hover a.selected:hover::before {
header > div:hover .icon-button.selected:hover::before {
opacity: 0.2;
}
header > div a:not(.selected) {
header > div .icon-button:not(.selected) {
height: 0;
opacity: 0;
pointer-events: none;

View File

@@ -45,45 +45,45 @@
</svg>
</a>
<div id="theme-wrapper">
<a id="theme-auto" class="icon-button selected" title="Adapt to System" >
<div id="theme-auto" class="icon-button selected" title="Adapt to System" >
<svg class="icon">
<use xlink:href="#icon-theme-auto" />
</svg>
</a>
</div>
<div>
<a id="theme-light" class="icon-button" title="Always Light" >
<div id="theme-light" class="icon-button" title="Always Light" >
<svg class="icon">
<use xlink:href="#icon-theme-light" />
</svg>
</a>
<a id="theme-dark" class="icon-button" title="Always Dark" >
</div>
<div id="theme-dark" class="icon-button" title="Always Dark" >
<svg class="icon">
<use xlink:href="#icon-theme-dark" />
</svg>
</a>
</div>
</div>
</div>
<a id="notification" class="icon-button" title="Enable Notifications" hidden>
<div id="notification" class="icon-button" title="Enable Notifications" hidden>
<svg class="icon">
<use xlink:href="#notifications" />
</svg>
</a>
<a id="install" class="icon-button" title="Install PairDrop" hidden>
</div>
<div id="install" class="icon-button" title="Install PairDrop" hidden>
<svg class="icon">
<use xlink:href="#homescreen" />
</svg>
</a>
<a id="pair-device" class="icon-button" title="Pair Device" hidden>
</div>
<div id="pair-device" class="icon-button" title="Pair Device" hidden>
<svg class="icon">
<use xlink:href="#pair-device-icon" />
</svg>
</a>
<a id="clear-pair-devices" class="icon-button" title="Clear All Paired Devices" hidden>
</div>
<div id="clear-pair-devices" class="icon-button" title="Clear All Paired Devices" hidden>
<svg class="icon">
<use xlink:href="#clear-pair-devices-icon" />
</svg>
</a>
<a id="cancel-paste-mode" class="button" hidden>Done</a>
</div>
<div id="cancel-paste-mode" class="button" hidden>Done</div>
</header>
<!-- Center -->
<div id="center">
@@ -129,12 +129,12 @@
<div id="pair-instructions" class="font-subheading center text-center">Input this key on another device<br>or scan the QR-Code.</div>
<hr>
<div id="key-input-container">
<input type="tel" class="textarea center" maxlength="1" autocorrect="off" autocomplete="off" autocapitalize="none" spellcheck="false" autofocus contenteditable placeholder="" disabled>
<input type="tel" class="textarea center" maxlength="1" autocorrect="off" autocomplete="off" autocapitalize="none" spellcheck="false" contenteditable placeholder="" disabled>
<input type="tel" class="textarea center" maxlength="1" autocorrect="off" autocomplete="off" autocapitalize="none" spellcheck="false" contenteditable placeholder="" disabled>
<input type="tel" class="textarea center" maxlength="1" autocorrect="off" autocomplete="off" autocapitalize="none" spellcheck="false" contenteditable placeholder="" disabled>
<input type="tel" class="textarea center" maxlength="1" autocorrect="off" autocomplete="off" autocapitalize="none" spellcheck="false" contenteditable placeholder="" disabled>
<input type="tel" class="textarea center" maxlength="1" autocorrect="off" autocomplete="off" autocapitalize="none" spellcheck="false" contenteditable placeholder="" disabled>
<input type="tel" class="textarea center" aria-label="pair-key-1" maxlength="1" autocorrect="off" autocomplete="off" autocapitalize="none" spellcheck="false" autofocus contenteditable placeholder="" disabled>
<input type="tel" class="textarea center" aria-label="pair-key-2" maxlength="1" autocorrect="off" autocomplete="off" autocapitalize="none" spellcheck="false" contenteditable placeholder="" disabled>
<input type="tel" class="textarea center" aria-label="pair-key-3" maxlength="1" autocorrect="off" autocomplete="off" autocapitalize="none" spellcheck="false" contenteditable placeholder="" disabled>
<input type="tel" class="textarea center" aria-label="pair-key-4" maxlength="1" autocorrect="off" autocomplete="off" autocapitalize="none" spellcheck="false" contenteditable placeholder="" disabled>
<input type="tel" class="textarea center" aria-label="pair-key-5" maxlength="1" autocorrect="off" autocomplete="off" autocapitalize="none" spellcheck="false" contenteditable placeholder="" disabled>
<input type="tel" class="textarea center" aria-label="pair-key-6" maxlength="1" autocorrect="off" autocomplete="off" autocapitalize="none" spellcheck="false" contenteditable placeholder="" disabled>
</div>
<div class="font-subheading center text-center">Enter key from another device to continue.</div>
<div class="center row-reverse">
@@ -223,7 +223,7 @@
<span class="display-name"></span>
</div>
<div class="row-separator"></div>
<div id="text-input" class="textarea" role="textbox" autocapitalize="none" spellcheck="false" autofocus contenteditable></div>
<div id="text-input" title="Message" class="textarea" role="textbox" autocapitalize="none" spellcheck="false" autofocus contenteditable></div>
<div class="center row-reverse">
<button class="button" type="submit" title="STR + ENTER" disabled close>Send</button>
<button class="button" type="button" title="ESCAPE" close>Cancel</button>
@@ -368,11 +368,11 @@
</symbol>
</svg>
<!-- Scripts -->
<script src="scripts/util.js"></script>
<script src="scripts/theme.js"></script>
<script src="scripts/network.js"></script>
<script src="scripts/ui.js"></script>
<script src="scripts/theme.js" async></script>
<script src="scripts/qrcode.js" async></script>
<script src="scripts/util.js" async></script>
<script src="scripts/QRCode.min.js" async></script>
<script src="scripts/zip.min.js" async></script>
<script src="scripts/NoSleep.min.js" async></script>
<!-- Sounds -->

View File

@@ -0,0 +1,2 @@
User-agent: *
Disallow:

View File

@@ -1,4 +1,4 @@
const cacheVersion = 'v1.5.3';
const cacheVersion = 'v1.6.0';
const cacheTitle = `pairdrop-included-ws-fallback-cache-${cacheVersion}`;
const urlsToCache = [
'index.html',

View File

@@ -97,7 +97,8 @@ header > div {
align-self: flex-start;
touch-action: manipulation;
}
header > div a {
header > div .icon-button {
height: 40px;
transition: all 300ms;
}
@@ -107,7 +108,7 @@ header > div > div {
flex-direction: column;
}
header > div:not(:hover) a:not(.selected) {
header > div:not(:hover) .icon-button:not(.selected) {
height: 0;
opacity: 0;
}
@@ -126,16 +127,16 @@ header > div:hover::before {
margin-bottom: 8px;
}
header > div:hover a.selected::before {
header > div:hover .icon-button.selected::before {
opacity: 0.1;
}
@media (pointer: coarse) {
header > div:hover a.selected:hover::before {
header > div:hover .icon-button.selected:hover::before {
opacity: 0.2;
}
header > div a:not(.selected) {
header > div .icon-button:not(.selected) {
height: 0;
opacity: 0;
pointer-events: none;

View File

@@ -3,14 +3,6 @@
"iceServers": [
{
"urls": "stun:stun.l.google.com:19302"
},
{
"urls": "stun:openrelay.metered.ca:80"
},
{
"urls": "turn:openrelay.metered.ca:443",
"username": "openrelayproject",
"credential": "openrelayproject"
}
]
}