Compare commits

...

752 commits

Author SHA1 Message Date
schlagmichdoch
31ec776fb3 Only handle requests with the same origin via the service worker 2025-02-25 18:19:38 +01:00
schlagmichdoch
4862ba3067 Increase version to v1.11.2
## Enhancements
- Speed up update process by skipping waiting and claiming currently open pages -> no need to close all tabs in order to get an update anymore
- Update Bluesky icon from square to butterfly
- Update node dependencies

## Fixes
- Prevent service-worker from responding with redirect (fixes #384)
- Fix: switch off twitter button via env var not possible (#388)
- Add missing files to paths that get cached upon sw installation

## Languages
- Translations updates from Hosted Weblate (Japanese)
2025-02-24 20:46:32 +01:00
schlagmichdoch
7639aca84c Update node dependencies 2025-02-24 20:45:12 +01:00
schlagmichdoch
8b8e5b7433
Merge pull request #385 from weblate/weblate-pairdrop-pairdrop-spa
Translations update from Hosted Weblate
2025-02-24 20:34:56 +01:00
Hosted Weblate
f6f3db2df9
Translated using Weblate (Japanese)
Currently translated at 100.0% (166 of 166 strings)

Translated using Weblate (Japanese)

Currently translated at 100.0% (166 of 166 strings)

Translated using Weblate (Japanese)

Currently translated at 100.0% (166 of 166 strings)

Translated using Weblate (Japanese)

Currently translated at 100.0% (166 of 166 strings)

Co-authored-by: Hosted Weblate <hosted@weblate.org>
Co-authored-by: maboroshin <maboroshin@users.noreply.hosted.weblate.org>
Co-authored-by: mottcha <89951503+mottcha@users.noreply.github.com>
Translate-URL: https://hosted.weblate.org/projects/pairdrop/pairdrop-spa/ja/
Translation: PairDrop/pairdrop-spa
2025-02-24 20:34:40 +01:00
Hosted Weblate
abd3a0c47c
Translated using Weblate (Bengali)
Currently translated at 17.4% (29 of 166 strings)

Co-authored-by: Hosted Weblate <hosted@weblate.org>
Co-authored-by: Saif Mahmud <saifmahmud366@gmail.com>
Translate-URL: https://hosted.weblate.org/projects/pairdrop/pairdrop-spa/bn/
Translation: PairDrop/pairdrop-spa
2025-02-24 20:34:40 +01:00
schlagmichdoch
89734e6954
Merge pull request #389 from schlagmichdoch/button-configs
Fix buttons on about page
2025-02-24 20:33:44 +01:00
schlagmichdoch
59bd9265bc
Merge pull request #390 from schlagmichdoch/fix-sw-updates
Fix service worker updates and speed up updates
2025-02-24 20:33:20 +01:00
schlagmichdoch
dbd6321fec Speed up update process by skipping waiting and claiming currently open pages -> no need to close all tabs in order to get an update anymore 2025-02-24 20:21:16 +01:00
schlagmichdoch
d18e290ad4 Add missing files to paths that get cached upon sw installation 2025-02-24 20:18:53 +01:00
schlagmichdoch
d7b68e214e Prevent fetch response and cache update if response is redirected 2025-02-24 20:17:54 +01:00
schlagmichdoch
148eb79ef0 Fix alphabetical sort in supportedLocales 2025-02-24 20:09:00 +01:00
schlagmichdoch
80615c533c Update Bluesky icon from square to butterfly 2025-02-23 19:20:50 +01:00
schlagmichdoch
b0b091c4f7 FIX: switch off twitter button via env var not possible (#388) 2025-02-23 19:13:44 +01:00
schlagmichdoch
c7b7badb3d Increase version to v1.11.1
## Fixes
- Fix PWA install button on chromium based browsers (#383) (Thanks @realchrislovett)
- Fix wrong file extension on chromium based browsers if mime type is not set (#355)

## Languages
- Translations updates from Hosted Weblate (Japanese)
2025-02-19 12:24:53 +01:00
schlagmichdoch
13e75f525d
Merge pull request #382 from weblate/weblate-pairdrop-pairdrop-spa
Translations update from Hosted Weblate
2025-02-19 12:19:46 +01:00
schlagmichdoch
b7c1893ac0
Merge pull request #381 from schlagmichdoch/fix-filename-wo-suffix
WIP:Fix chromium file extension if mime type is not set
2025-02-19 12:17:55 +01:00
Chris Lovett
341fa7fdf0
Restore desktop Chrome PWA button (#383)
* Restore desktop Chrome PWA button with start_url ./
2025-02-19 11:46:00 +01:00
Hosted Weblate
aa09da3076
Translated using Weblate (Japanese)
Currently translated at 100.0% (166 of 166 strings)

Co-authored-by: maboroshin <maboroshin@users.noreply.hosted.weblate.org>
Translate-URL: https://hosted.weblate.org/projects/pairdrop/pairdrop-spa/ja/
Translation: PairDrop/pairdrop-spa
2025-02-18 13:34:01 +01:00
schlagmichdoch
547038c9bc Fix file name display if no file extension is present 2025-02-17 19:32:54 +01:00
schlagmichdoch
a39d8cdc84 Fix chromium filename by defaulting mime to "application/octet-stream" 2025-02-17 19:20:17 +01:00
schlagmichdoch
b3c61f4baf Increase version to v1.11.0
## Enhancements
- Make PWA standalone (#264)
- Bring back background animation after performance optimization (#285)
- Add support for Safari 11-15 (#358)
- Update Twitter icon and URL to (X) (Thanks @realchrislovett)
- Update node dependencies

## Fixes
- Fix pasting of files on background to invoke share-mode and make it available on Firefox (#370)
- Fix padding issue on EditPairedDevicesDialog and Base64Dialog
- Fix hydration of URLs into links in received messages that have exclamation marks in path

## Languages
- Translations updates from Hosted Weblate (Basque, Norwegian Bokmål)
2025-02-17 13:50:15 +01:00
schlagmichdoch
ef61cc4dfe Update node dependencies 2025-02-17 13:33:07 +01:00
schlagmichdoch
fa992498fb Revert "Prevent background animation from being cut on devices with a notch"
This reverts commit 09e4e5d289.
2025-02-17 13:15:51 +01:00
schlagmichdoch
800d492da5 Fix animation color on older webkit/blink based browsers 2025-02-17 12:36:49 +01:00
schlagmichdoch
b8a973f037 Fix background animation size on 4k screens and decrease base opacity 2025-02-17 11:52:07 +01:00
schlagmichdoch
83549261f6
Merge pull request #369 from weblate/weblate-pairdrop-pairdrop-spa
Translations update from Hosted Weblate
2025-02-17 11:09:15 +01:00
Hosted Weblate
9f4309c866
Translated using Weblate (Norwegian Bokmål)
Currently translated at 100.0% (166 of 166 strings)

Co-authored-by: Hosted Weblate <hosted@weblate.org>
Co-authored-by: Tobbz <thetobbz@users.noreply.hosted.weblate.org>
Translate-URL: https://hosted.weblate.org/projects/pairdrop/pairdrop-spa/nb_NO/
Translation: PairDrop/pairdrop-spa
2025-02-17 11:08:40 +01:00
Hosted Weblate
43ce64d68a
Translated using Weblate (Bengali)
Currently translated at 1.2% (2 of 166 strings)

Added translation using Weblate (Bengali)

Co-authored-by: Hosted Weblate <hosted@weblate.org>
Co-authored-by: Saif Mahmud <saifmahmud366@gmail.com>
Translate-URL: https://hosted.weblate.org/projects/pairdrop/pairdrop-spa/bn/
Translation: PairDrop/pairdrop-spa
2025-02-17 11:08:39 +01:00
Hosted Weblate
61caa43ce9
Translated using Weblate (Basque)
Currently translated at 100.0% (166 of 166 strings)

Co-authored-by: Hosted Weblate <hosted@weblate.org>
Co-authored-by: xabirequejo <xabi.rn@gmail.com>
Translate-URL: https://hosted.weblate.org/projects/pairdrop/pairdrop-spa/eu/
Translation: PairDrop/pairdrop-spa
2025-02-17 11:08:38 +01:00
schlagmichdoch
0e574ae7fc
Merge pull request #378 from schlagmichdoch/bring_back_animation
Bring back optimized background animation
2025-02-17 11:06:29 +01:00
schlagmichdoch
3240921207 Merge branch 'master' into bring_back_animation 2025-02-17 11:04:58 +01:00
schlagmichdoch
3c7042da6d
Merge pull request #375 from schlagmichdoch/fix-bugs-1.11
Fix bugs for 1.11
2025-02-17 10:56:25 +01:00
schlagmichdoch
09e4e5d289 Prevent background animation from being cut on devices with a notch 2025-02-16 23:47:35 +01:00
schlagmichdoch
ec0012ecd1 Speed up animation slightly 2025-02-16 23:43:50 +01:00
schlagmichdoch
8eea54f8dd Make sure older webkit/blink based browsers are able to render opacity of circles 2025-02-16 23:43:50 +01:00
schlagmichdoch
ae68ede3f3 Put worker and libraries in subfolders 2025-02-16 23:43:50 +01:00
schlagmichdoch
16523843bd Use OffscreenCanvas on supported browsers to offload canvas drawing to a service worker thread 2025-02-16 23:43:41 +01:00
schlagmichdoch
829d63deda
Merge pull request #377 from realchrislovett/twit
Updated Twitter (X) icon and URL
2025-02-16 19:44:22 +01:00
schlagmichdoch
f0e7250617 Use time based approach to smoothen reduced framerate 2025-02-16 00:52:34 +01:00
schlagmichdoch
eca41f36c7
Merge pull request #374 from schlagmichdoch/pwa_standalone
Enable standalone mode for PWA
2025-02-15 00:00:15 +01:00
schlagmichdoch
1d0d3d0896
Merge pull request #376 from realchrislovett/patch-1
Remove bar at top of screen on iOS
2025-02-14 23:53:03 +01:00
schlagmichdoch
8a3c60d3a6 Bring back optimized background animation 2025-02-14 20:54:15 +01:00
schlagmichdoch
e2f0ca6e45 Fix links in messages cut if ! in path; make regex more readable 2025-02-14 19:13:39 +01:00
Chris Lovett
27a61d589b
Remove bar at top of screen on iOS
On iOS, when the app runs as a PWA without this line, there will be a bar at the top of the screen. Implementing this setting will make for a more seamless UI on iOS, as documented below.

https://developer.apple.com/library/archive/documentation/AppleApplications/Reference/SafariHTMLRef/Articles/MetaTags.html
2025-02-14 12:05:38 -05:00
Chris Lovett
02c95dde9d
Updated Twitter (X) icon and URL 2025-02-14 10:17:10 -05:00
schlagmichdoch
dabfe58124 Fix word-break of base64zip button on mobile 2025-02-14 15:47:17 +01:00
schlagmichdoch
82b329fea8 Fix padding of auto-accept instruction 2025-02-14 15:36:35 +01:00
schlagmichdoch
8a833cd69d Make PWA standalone 2025-02-13 20:07:38 +01:00
schlagmichdoch
629328c2f6 Use css instead of JS to detect offset on high viewports 2025-02-13 20:07:25 +01:00
schlagmichdoch
8826893a42
Merge pull request #372 from schlagmichdoch/fix-share-mode
Fix share-mode and enable pasting for Firefox users
2025-02-13 13:04:11 +01:00
schlagmichdoch
efc360e106 Remove text selection prevention to enable pasting for Firefox users 2025-02-13 12:54:17 +01:00
schlagmichdoch
351e7d42c9 Fix share mode by converting FileList to Array 2025-02-13 12:54:17 +01:00
schlagmichdoch
ec520248b8 Remove duplicate instruction 2025-02-13 12:54:17 +01:00
schlagmichdoch
94096aa13c
Merge pull request #349 from schlagmichdoch/fix-ios15.3
Add support for iOS <15.3
2025-02-13 12:02:14 +01:00
schlagmichdoch
f7fe303fa7 Fix background css for clients iOS < 13.1 2025-02-13 11:39:10 +01:00
schlagmichdoch
940da7948c Stop usage of public class fields in order to support Safari 13.1 2025-02-13 10:24:27 +01:00
schlagmichdoch
c52eeda3ff
Add BrowserStack to README.md 2025-02-12 00:35:24 +01:00
schlagmichdoch
44c0f3dbaa Check for BroadcastChannel availability before instantiating it 2025-02-11 16:02:24 +01:00
schlagmichdoch
659b53b5fa Increase version to v1.10.11
## Enhancements
- Prevent referrer in created links in message

## Fixes
- Prevent wrong `start_url` when installing PairDrop PWA from sub path (#329)
- Hotfix: Disable thumbnail creation for HEIC/HEIF files until PR #350 is merged (hotfix for #336)

## Languages
- New Language Bulgarian
- New Language Estonian
- New Language Basque
- New Language Persian
- New Language Norwegian Nynorsk
- New Language Slovak
- New Language Tamil
- New Language Hant Script
- New Language Korean
- Translations updates from Hosted Weblate (Indonesian, Arabic, Italian, Czech, Japanese, Ukrainian, Russian, German, Portuguese (Brazil))
2025-02-11 14:52:44 +01:00
schlagmichdoch
14bfc1948a Update node dependencies 2025-02-11 14:42:41 +01:00
schlagmichdoch
8f8708c5fb Fix loading of default/backup translations 2025-02-11 14:33:32 +01:00
schlagmichdoch
43c071b37f Enable Bulgarian, Estonian, Basque, Persian, Norwegian Nynorsk, Slovak, Tamil, Hant Script, and Korean translations 2025-02-11 12:14:58 +01:00
schlagmichdoch
bd9c7a4554 Add html lang and dir attributes to language buttons 2025-02-11 12:11:31 +01:00
schlagmichdoch
25f2bc2285 Merge branch 'master' into translate 2025-02-11 11:11:59 +01:00
schlagmichdoch
c4be62d2ec
Merge pull request #324 from weblate/weblate-pairdrop-pairdrop-spa
Translations update from Hosted Weblate
2025-02-11 11:11:43 +01:00
schlagmichdoch
a0f88ed492 Hotfix: Prevent converting HEIC images until PR #350 is fixed 2025-02-11 11:10:01 +01:00
Hosted Weblate
5f4b77bb8f
Translated using Weblate (Kabyle)
Currently translated at 17.4% (29 of 166 strings)

Added translation using Weblate (Kabyle)

Co-authored-by: ButterflyOfFire <boffire@users.noreply.hosted.weblate.org>
Co-authored-by: Hosted Weblate <hosted@weblate.org>
Translate-URL: https://hosted.weblate.org/projects/pairdrop/pairdrop-spa/kab/
Translation: PairDrop/pairdrop-spa
2025-02-08 10:02:39 +01:00
Hosted Weblate
e3e37a6b77
Translated using Weblate (Slovak)
Currently translated at 100.0% (166 of 166 strings)

Translated using Weblate (Slovak)

Currently translated at 95.1% (158 of 166 strings)

Translated using Weblate (Slovak)

Currently translated at 81.3% (135 of 166 strings)

Translated using Weblate (Slovak)

Currently translated at 18.6% (31 of 166 strings)

Added translation using Weblate (Slovak)

Co-authored-by: Hosted Weblate <hosted@weblate.org>
Co-authored-by: Kuko <kuko7@protonmail.ch>
Co-authored-by: Martin Sojka <msojka05@gmail.com>
Translate-URL: https://hosted.weblate.org/projects/pairdrop/pairdrop-spa/sk/
Translation: PairDrop/pairdrop-spa
2025-02-08 10:02:39 +01:00
Hosted Weblate
7067aceafe
Translated using Weblate (Korean)
Currently translated at 99.3% (165 of 166 strings)

Translated using Weblate (Korean)

Currently translated at 14.4% (24 of 166 strings)

Co-authored-by: Alanimdeo <alan@imdeo.kr>
Co-authored-by: Hosted Weblate <hosted@weblate.org>
Co-authored-by: Kim Tae Kyeong <kim@taekyeong.me>
Translate-URL: https://hosted.weblate.org/projects/pairdrop/pairdrop-spa/ko/
Translation: PairDrop/pairdrop-spa
2025-02-08 10:02:39 +01:00
Hosted Weblate
84b3c7d68b
Translated using Weblate (Finnish)
Currently translated at 9.6% (16 of 166 strings)

Co-authored-by: Hosted Weblate <hosted@weblate.org>
Co-authored-by: Jaakko Rantamäki <rantamaki@live.fi>
Translate-URL: https://hosted.weblate.org/projects/pairdrop/pairdrop-spa/fi/
Translation: PairDrop/pairdrop-spa
2025-02-08 10:02:39 +01:00
Hosted Weblate
25da925064
Translated using Weblate (Persian)
Currently translated at 100.0% (166 of 166 strings)

Translated using Weblate (Persian)

Currently translated at 21.0% (35 of 166 strings)

Added translation using Weblate (Persian)

Co-authored-by: Alireza Rashidi <alirezarashidigoorabi@gmail.com>
Co-authored-by: Hosted Weblate <hosted@weblate.org>
Co-authored-by: Mostafa Ahangarha <ahangarha@gmail.com>
Translate-URL: https://hosted.weblate.org/projects/pairdrop/pairdrop-spa/fa/
Translation: PairDrop/pairdrop-spa
2025-02-08 10:02:39 +01:00
Hosted Weblate
74dd692826
Translated using Weblate (Norwegian Nynorsk)
Currently translated at 100.0% (166 of 166 strings)

Added translation using Weblate (Norwegian Nynorsk)

Co-authored-by: Hosted Weblate <hosted@weblate.org>
Co-authored-by: Snubletunge <kjell.forde@live.no>
Translate-URL: https://hosted.weblate.org/projects/pairdrop/pairdrop-spa/nn/
Translation: PairDrop/pairdrop-spa
2025-02-08 10:02:39 +01:00
Hosted Weblate
bf8b248a05
Translated using Weblate (Indonesian)
Currently translated at 100.0% (166 of 166 strings)

Co-authored-by: Adrien N <adriennathaniel1999@gmail.com>
Co-authored-by: Hosted Weblate <hosted@weblate.org>
Translate-URL: https://hosted.weblate.org/projects/pairdrop/pairdrop-spa/id/
Translation: PairDrop/pairdrop-spa
2025-02-08 10:02:39 +01:00
Hosted Weblate
12180c4343
Translated using Weblate (Arabic)
Currently translated at 99.3% (165 of 166 strings)

Co-authored-by: ElAccWeblate <sishio@uf.edu.pl>
Co-authored-by: Hosted Weblate <hosted@weblate.org>
Translate-URL: https://hosted.weblate.org/projects/pairdrop/pairdrop-spa/ar/
Translation: PairDrop/pairdrop-spa
2025-02-08 10:02:39 +01:00
Hosted Weblate
eecdee7381
Translated using Weblate (Italian)
Currently translated at 100.0% (166 of 166 strings)

Co-authored-by: Hosted Weblate <hosted@weblate.org>
Co-authored-by: Ilbebino <tommasobellandi08@gmail.com>
Translate-URL: https://hosted.weblate.org/projects/pairdrop/pairdrop-spa/it/
Translation: PairDrop/pairdrop-spa
2025-02-08 10:02:39 +01:00
Hosted Weblate
dab259ca2b
Translated using Weblate (Czech)
Currently translated at 100.0% (166 of 166 strings)

Co-authored-by: Hosted Weblate <hosted@weblate.org>
Co-authored-by: Petr L <petrlev@users.noreply.hosted.weblate.org>
Translate-URL: https://hosted.weblate.org/projects/pairdrop/pairdrop-spa/cs/
Translation: PairDrop/pairdrop-spa
2025-02-08 10:02:39 +01:00
Hosted Weblate
182d72fade
Translated using Weblate (Japanese)
Currently translated at 100.0% (166 of 166 strings)

Co-authored-by: Hosted Weblate <hosted@weblate.org>
Co-authored-by: mottcha <89951503+mottcha@users.noreply.github.com>
Translate-URL: https://hosted.weblate.org/projects/pairdrop/pairdrop-spa/ja/
Translation: PairDrop/pairdrop-spa
2025-02-08 10:02:38 +01:00
Hosted Weblate
58585f7006
Translated using Weblate (Ukrainian)
Currently translated at 100.0% (166 of 166 strings)

Co-authored-by: Bezruchenko Simon <worcposj44@gmail.com>
Co-authored-by: Hosted Weblate <hosted@weblate.org>
Translate-URL: https://hosted.weblate.org/projects/pairdrop/pairdrop-spa/uk/
Translation: PairDrop/pairdrop-spa
2025-02-08 10:02:38 +01:00
Hosted Weblate
b97cd116a9
Translated using Weblate (Bulgarian)
Currently translated at 100.0% (166 of 166 strings)

Translated using Weblate (Bulgarian)

Currently translated at 17.4% (29 of 166 strings)

Added translation using Weblate (Bulgarian)

Co-authored-by: Emil Petrakiev <emilpetrakiev10.10@gmail.com>
Co-authored-by: Hosted Weblate <hosted@weblate.org>
Co-authored-by: psydex <psydex@duck.com>
Translate-URL: https://hosted.weblate.org/projects/pairdrop/pairdrop-spa/bg/
Translation: PairDrop/pairdrop-spa
2025-02-08 10:02:38 +01:00
Hosted Weblate
81b240bfc8
Translated using Weblate (Russian)
Currently translated at 100.0% (166 of 166 strings)

Translated using Weblate (Russian)

Currently translated at 98.7% (164 of 166 strings)

Translated using Weblate (Russian)

Currently translated at 97.5% (162 of 166 strings)

Co-authored-by: AL <mehov+weblate@msn.com>
Co-authored-by: Andrii Solianyk <asolianik2015@gmail.com>
Co-authored-by: Hosted Weblate <hosted@weblate.org>
Co-authored-by: sebulba <tapiset475@cpaurl.com>
Translate-URL: https://hosted.weblate.org/projects/pairdrop/pairdrop-spa/ru/
Translation: PairDrop/pairdrop-spa
2025-02-08 10:02:38 +01:00
Hosted Weblate
1b967e40d2
Translated using Weblate (Estonian)
Currently translated at 100.0% (166 of 166 strings)

Added translation using Weblate (Estonian)

Co-authored-by: Hosted Weblate <hosted@weblate.org>
Co-authored-by: Madis Otenurm <robotkoer@gmail.com>
Translate-URL: https://hosted.weblate.org/projects/pairdrop/pairdrop-spa/et/
Translation: PairDrop/pairdrop-spa
2025-02-08 10:02:38 +01:00
Hosted Weblate
f9a9287893
Translated using Weblate (Basque)
Currently translated at 100.0% (166 of 166 strings)

Added translation using Weblate (Basque)

Co-authored-by: Hosted Weblate <hosted@weblate.org>
Co-authored-by: xabirequejo <xabi.rn@gmail.com>
Translate-URL: https://hosted.weblate.org/projects/pairdrop/pairdrop-spa/eu/
Translation: PairDrop/pairdrop-spa
2025-02-08 10:02:38 +01:00
Hosted Weblate
7931f64148
Translated using Weblate (German)
Currently translated at 100.0% (166 of 166 strings)

Co-authored-by: Hosted Weblate <hosted@weblate.org>
Co-authored-by: schlagmichdoch <sonnig-02.hieven@icloud.com>
Translate-URL: https://hosted.weblate.org/projects/pairdrop/pairdrop-spa/de/
Translation: PairDrop/pairdrop-spa
2025-02-08 10:02:38 +01:00
Hosted Weblate
4a83ad57dd
Translated using Weblate (Portuguese (Brazil))
Currently translated at 100.0% (166 of 166 strings)

Co-authored-by: Hosted Weblate <hosted@weblate.org>
Co-authored-by: Willian John <villianjohns@gmail.com>
Translate-URL: https://hosted.weblate.org/projects/pairdrop/pairdrop-spa/pt_BR/
Translation: PairDrop/pairdrop-spa
2025-02-08 10:02:38 +01:00
Hosted Weblate
b73d7637a1
Translated using Weblate (Chinese (Traditional Han script, Hong Kong))
Currently translated at 100.0% (166 of 166 strings)

Co-authored-by: Arcoon <251958034@qq.com>
Co-authored-by: Hosted Weblate <hosted@weblate.org>
Translate-URL: https://hosted.weblate.org/projects/pairdrop/pairdrop-spa/zh_Hant_HK/
Translation: PairDrop/pairdrop-spa
2025-02-08 10:02:38 +01:00
Hosted Weblate
b9f436b940
Translated using Weblate (Tamil)
Currently translated at 100.0% (166 of 166 strings)

Added translation using Weblate (Tamil)

Co-authored-by: Hosted Weblate <hosted@weblate.org>
Co-authored-by: தமிழ்நேரம் <anishprabu.t@gmail.com>
Translate-URL: https://hosted.weblate.org/projects/pairdrop/pairdrop-spa/ta/
Translation: PairDrop/pairdrop-spa
2025-02-08 10:02:38 +01:00
Hosted Weblate
5cb15642c4
Translated using Weblate (Thai)
Currently translated at 48.7% (81 of 166 strings)

Translated using Weblate (Thai)

Currently translated at 42.1% (70 of 166 strings)

Added translation using Weblate (Thai)

Co-authored-by: Ekaphong Tangtrakul <ekaphong.ta@gmail.com>
Co-authored-by: Ekaphong Tangtrakul <ekaphong@users.noreply.hosted.weblate.org>
Co-authored-by: Hosted Weblate <hosted@weblate.org>
Co-authored-by: Nongpao <teera.auto.2548@gmail.com>
Translate-URL: https://hosted.weblate.org/projects/pairdrop/pairdrop-spa/th/
Translation: PairDrop/pairdrop-spa
2025-02-08 10:02:38 +01:00
schlagmichdoch
957ca39f90 Remove start_url and scope to prevent wrong URL when installing PWA (fixes #329) 2024-11-11 18:39:37 +01:00
schlagmichdoch
ce3d569880
Update README.md 2024-09-03 23:13:43 +02:00
schlagmichdoch
40379acc6c
Add rel="noreferrer" to created links in received messages 2024-08-31 00:55:18 +02:00
schlagmichdoch
ab67c5858d
FAQ: Update link whose certificate has expired 2024-08-22 14:29:10 +02:00
schlagmichdoch
b34b3f7b39
Fix and update apache config (fixes #312) 2024-08-17 21:02:20 +02:00
schlagmichdoch
3e502a76d0 Increase version to v1.10.10
## Enhancements
- Make displayName field more intuitive by hiding the placeholder when it is focussed (#319)

## Fixes
- Fixes substring error on server (#308)

## Languages
- New Language Czech
- New Language Ukrainian
- Translations update from Hosted Weblate (Indonesian)
2024-08-17 16:04:08 +02:00
schlagmichdoch
08af4670ee Enable Czech and Ukrainian translations 2024-08-17 15:58:46 +02:00
schlagmichdoch
a458c00213
Merge pull request #309 from weblate/weblate-pairdrop-pairdrop-spa
Translations update from Hosted Weblate
2024-08-16 16:06:46 +02:00
Hosted Weblate
2e088b8434
Translated using Weblate (Indonesian)
Currently translated at 100.0% (166 of 166 strings)

Co-authored-by: Hosted Weblate <hosted@weblate.org>
Co-authored-by: Ian Perdiansah <ianperdiansah05@gmail.com>
Translate-URL: https://hosted.weblate.org/projects/pairdrop/pairdrop-spa/id/
Translation: PairDrop/pairdrop-spa
2024-08-16 14:06:28 +00:00
Hosted Weblate
31e3b4304c
Translated using Weblate (Czech)
Currently translated at 100.0% (166 of 166 strings)

Co-authored-by: Hosted Weblate <hosted@weblate.org>
Co-authored-by: Ladislav Vlach <vlach.ladislav@gmail.com>
Translate-URL: https://hosted.weblate.org/projects/pairdrop/pairdrop-spa/cs/
Translation: PairDrop/pairdrop-spa
2024-08-16 14:06:28 +00:00
Hosted Weblate
d73e5666b9
Translated using Weblate (Ukrainian)
Currently translated at 100.0% (166 of 166 strings)

Added translation using Weblate (Ukrainian)

Co-authored-by: Bezruchenko Simon <worcposj44@gmail.com>
Co-authored-by: Hosted Weblate <hosted@weblate.org>
Translate-URL: https://hosted.weblate.org/projects/pairdrop/pairdrop-spa/uk/
Translation: PairDrop/pairdrop-spa
2024-08-16 14:06:27 +00:00
schlagmichdoch
96a055b7d0 Merge branch 'fix-displayname-firefox' 2024-08-16 16:03:35 +02:00
schlagmichdoch
703894e309 update dev nginx conf parameter http2 to new syntax 2024-08-16 16:03:25 +02:00
schlagmichdoch
13f7d36da0 Increase contrast between default badge and text 2024-08-07 20:52:10 +02:00
schlagmichdoch
1549ff48c9 Remove selection from text if displayname is blurred 2024-08-07 20:15:38 +02:00
schlagmichdoch
9f4d99c8db Prevent edited displayname from flickering on page load by changing loading order 2024-08-07 15:27:40 +02:00
schlagmichdoch
563c8dd8a8 Remove redundant placeholder which is added back when page is localized. 2024-08-07 15:27:40 +02:00
schlagmichdoch
43c346894d Make displayName field more intuitive by collapsing it when focussed and empty. (fixes #319) 2024-08-07 15:27:39 +02:00
schlagmichdoch
a68cd75b71
Merge pull request #316 from avadhesh18/patch-1 2024-07-28 16:17:19 +02:00
Avadhesh
e85a2e6293
Update README.md
Improved the summary because "List view" was confusing.
2024-07-28 11:55:47 +05:30
schlagmichdoch
794e6304fe
Merge pull request #314 from schlagmichdoch/reduce-docker-size
Switch Docker base image to reduce size
2024-07-17 15:41:25 +02:00
schlagmichdoch
f9b8b0fadf Fix dev environment variable FQDN missing and update docs 2024-07-17 15:37:39 +02:00
schlagmichdoch
10f648b7cd Reduce image size by switching to alpine and excluding folders from being copied into the image 2024-07-17 14:44:08 +02:00
schlagmichdoch
331c61fec8 Change docs to reflect that dev files are now included in master branch 2024-07-14 13:10:16 +02:00
schlagmichdoch
fa24e77d3b rename directory docker to dev 2024-07-14 13:10:09 +02:00
schlagmichdoch
6ca039910a fix dev docker and docs 2024-07-13 21:50:45 +02:00
schlagmichdoch
9f02f7b3ca add docker-compose-dev.yml and needed conf files 2024-07-13 21:50:45 +02:00
schlagmichdoch
04d65da779 Fix substring error if remoteAddress is undefined and replace deprecated request.connection with request.socket (fixes #308) 2024-07-13 21:50:44 +02:00
schlagmichdoch
e6f2c776dc
Remove duplicate Firewall section 2024-07-13 16:49:06 +02:00
schlagmichdoch
b0711de5b9 Increase version to v1.10.9
## Fixes
- Updated Node.js dependencies

## Languages
- New Language Belarusian
- New Language Danish
- New Language Hebrew
- Translations update from Hosted Weblate (French, Japanese, Turkish, Russian)
2024-07-01 18:56:51 +02:00
schlagmichdoch
d9a6ed4a47 Node.js dependencies updated 2024-07-01 18:52:36 +02:00
schlagmichdoch
5dd36da962 Enable Belarusian, Danish, and Hebrew translations 2024-07-01 18:47:26 +02:00
schlagmichdoch
8bc65ed622
Merge pull request #289 from weblate/weblate-pairdrop-pairdrop-spa
Translations update from Hosted Weblate
2024-07-01 18:35:14 +02:00
Hosted Weblate
5625cb0ca6
Translated using Weblate (Korean)
Currently translated at 13.2% (22 of 166 strings)

Added translation using Weblate (Korean)

Co-authored-by: Hosted Weblate <hosted@weblate.org>
Co-authored-by: 뉴윈연구소 <oswincount@gmail.com>
Translate-URL: https://hosted.weblate.org/projects/pairdrop/pairdrop-spa/ko/
Translation: PairDrop/pairdrop-spa
2024-07-01 18:33:01 +02:00
Hosted Weblate
74e5e2286f
Translated using Weblate (French)
Currently translated at 100.0% (166 of 166 strings)

Translated using Weblate (Czech)

Currently translated at 3.0% (5 of 166 strings)

Added translation using Weblate (Czech)

Translated using Weblate (Catalan)

Currently translated at 100.0% (166 of 166 strings)

Co-authored-by: Guillaume Dorce <polynux.dev@gmail.com>
Co-authored-by: Hosted Weblate <hosted@weblate.org>
Co-authored-by: Netleak <netleak@zendovo.eu>
Co-authored-by: gmassipg <gerardmassipgil@gmail.com>
Translate-URL: https://hosted.weblate.org/projects/pairdrop/pairdrop-spa/ca/
Translate-URL: https://hosted.weblate.org/projects/pairdrop/pairdrop-spa/cs/
Translate-URL: https://hosted.weblate.org/projects/pairdrop/pairdrop-spa/fr/
Translation: PairDrop/pairdrop-spa
2024-07-01 18:33:01 +02:00
Hosted Weblate
1a254765fe
Translated using Weblate (Hebrew)
Currently translated at 100.0% (166 of 166 strings)

Co-authored-by: Hosted Weblate <hosted@weblate.org>
Co-authored-by: Liraz Shalom <liraz747.sh@gmail.com>
Translate-URL: https://hosted.weblate.org/projects/pairdrop/pairdrop-spa/he/
Translation: PairDrop/pairdrop-spa
2024-07-01 18:33:01 +02:00
Hosted Weblate
27a698c762
Translated using Weblate (French)
Currently translated at 100.0% (166 of 166 strings)

Translated using Weblate (Czech)

Currently translated at 3.0% (5 of 166 strings)

Added translation using Weblate (Czech)

Translated using Weblate (Catalan)

Currently translated at 100.0% (166 of 166 strings)

Co-authored-by: Guillaume Dorce <polynux.dev@gmail.com>
Co-authored-by: Hosted Weblate <hosted@weblate.org>
Co-authored-by: Netleak <netleak@zendovo.eu>
Co-authored-by: gmassipg <gerardmassipgil@gmail.com>
Translate-URL: https://hosted.weblate.org/projects/pairdrop/pairdrop-spa/ca/
Translate-URL: https://hosted.weblate.org/projects/pairdrop/pairdrop-spa/cs/
Translate-URL: https://hosted.weblate.org/projects/pairdrop/pairdrop-spa/fr/
Translation: PairDrop/pairdrop-spa
2024-07-01 18:33:01 +02:00
Hosted Weblate
971917bc77
Translated using Weblate (French)
Currently translated at 100.0% (166 of 166 strings)

Translated using Weblate (Czech)

Currently translated at 3.0% (5 of 166 strings)

Added translation using Weblate (Czech)

Translated using Weblate (Catalan)

Currently translated at 100.0% (166 of 166 strings)

Co-authored-by: Guillaume Dorce <polynux.dev@gmail.com>
Co-authored-by: Hosted Weblate <hosted@weblate.org>
Co-authored-by: Netleak <netleak@zendovo.eu>
Co-authored-by: gmassipg <gerardmassipgil@gmail.com>
Translate-URL: https://hosted.weblate.org/projects/pairdrop/pairdrop-spa/ca/
Translate-URL: https://hosted.weblate.org/projects/pairdrop/pairdrop-spa/cs/
Translate-URL: https://hosted.weblate.org/projects/pairdrop/pairdrop-spa/fr/
Translation: PairDrop/pairdrop-spa
2024-07-01 18:33:01 +02:00
Hosted Weblate
1eefd4720f
Translated using Weblate (Japanese)
Currently translated at 100.0% (166 of 166 strings)

Translated using Weblate (Japanese)

Currently translated at 100.0% (166 of 166 strings)

Co-authored-by: Hosted Weblate <hosted@weblate.org>
Co-authored-by: mottcha <89951503+mottcha@users.noreply.github.com>
Translate-URL: https://hosted.weblate.org/projects/pairdrop/pairdrop-spa/ja/
Translation: PairDrop/pairdrop-spa
2024-07-01 18:33:01 +02:00
Hosted Weblate
ff92e606ff
Translated using Weblate (Belarusian)
Currently translated at 100.0% (166 of 166 strings)

Translated using Weblate (Belarusian)

Currently translated at 56.6% (94 of 166 strings)

Added translation using Weblate (Belarusian)

Co-authored-by: Hosted Weblate <hosted@weblate.org>
Co-authored-by: Troja <d.iwowi.b@gmail.com>
Translate-URL: https://hosted.weblate.org/projects/pairdrop/pairdrop-spa/be/
Translation: PairDrop/pairdrop-spa
2024-07-01 18:33:00 +02:00
Hosted Weblate
e53e4adcdf
Translated using Weblate (Russian)
Currently translated at 88.5% (147 of 166 strings)

Co-authored-by: Ed Asriyan <webslate.org@asriyan.me>
Co-authored-by: Hosted Weblate <hosted@weblate.org>
Translate-URL: https://hosted.weblate.org/projects/pairdrop/pairdrop-spa/ru/
Translation: PairDrop/pairdrop-spa
2024-07-01 18:33:00 +02:00
Hosted Weblate
fda19dc819
Translated using Weblate (Danish)
Currently translated at 99.3% (165 of 166 strings)

Added translation using Weblate (Danish)

Co-authored-by: Halfdan <gamerhalfdan@gmail.com>
Co-authored-by: Hosted Weblate <hosted@weblate.org>
Translate-URL: https://hosted.weblate.org/projects/pairdrop/pairdrop-spa/da/
Translation: PairDrop/pairdrop-spa
2024-07-01 18:33:00 +02:00
Hosted Weblate
78d9ba45d3
Translated using Weblate (Turkish)
Currently translated at 0.0% (0 of 166 strings)

Translated using Weblate (Turkish)

Currently translated at 82.5% (137 of 166 strings)

Co-authored-by: Enhar Ukalo <uenhar@gmail.com>
Co-authored-by: Hosted Weblate <hosted@weblate.org>
Translate-URL: https://hosted.weblate.org/projects/pairdrop/pairdrop-spa/tr/
Translation: PairDrop/pairdrop-spa
2024-07-01 18:33:00 +02:00
schlagmichdoch
488762bbce
Update faq.md
Co-authored-by: babstar99 <babstar99@users.noreply.github.com>
2024-04-18 22:26:27 +02:00
schlagmichdoch
80a5c0efdb Increase version to v1.10.8
## Fixes
- Received message empty when loaded from queue (#288)

## Languages
- New Language Hungarian
- New Language Polish
- New Language Traditional Chinese
- Translations update from Hosted Weblate (Portuguese (Brazil), Russian, Japanese, Arabic, Indonesian, Dutch, French)
2024-04-18 16:30:33 +02:00
schlagmichdoch
a9d1273b3c Install npm dependency patches via 'npm audit fix' 2024-04-18 16:22:36 +02:00
schlagmichdoch
c8484ab104 Enable Hungarian, Polish, and Traditional Chinese Translations 2024-04-18 16:16:36 +02:00
schlagmichdoch
05827b12ca Rename new Chinese translation files to match their browser language strings 2024-04-17 21:34:19 +02:00
schlagmichdoch
1256dcdcbd
Merge pull request #270 from weblate/weblate-pairdrop-pairdrop-spa
Translations update from Hosted Weblate
2024-04-17 21:30:57 +02:00
Hosted Weblate
5e79ef0d9f
Added translation using Weblate (Yue (Traditional))
Co-authored-by: Hosted Weblate <hosted@weblate.org>
Co-authored-by: hugoalh <hugoalh@users.noreply.hosted.weblate.org>
2024-04-17 20:56:08 +02:00
Hosted Weblate
add361c284
Translated using Weblate (Chinese (Traditional))
Currently translated at 100.0% (166 of 166 strings)

Added translation using Weblate (Chinese (Traditional))

Co-authored-by: Hosted Weblate <hosted@weblate.org>
Co-authored-by: hugoalh <hugoalh@users.noreply.hosted.weblate.org>
Translate-URL: https://hosted.weblate.org/projects/pairdrop/pairdrop-spa/zh_Hant/
Translation: PairDrop/pairdrop-spa
2024-04-17 20:56:08 +02:00
Hosted Weblate
fd0c32faad
Added translation using Weblate (Finnish)
Co-authored-by: Hosted Weblate <hosted@weblate.org>
Co-authored-by: Unknowwed <unknowwed202@gmail.com>
2024-04-17 20:56:08 +02:00
Hosted Weblate
f0cfb4833d
Translated using Weblate (French)
Currently translated at 98.7% (164 of 166 strings)

Co-authored-by: Hosted Weblate <hosted@weblate.org>
Co-authored-by: Thumuss <42680097+Thumuss@users.noreply.github.com>
Translate-URL: https://hosted.weblate.org/projects/pairdrop/pairdrop-spa/fr/
Translation: PairDrop/pairdrop-spa
2024-04-17 20:56:08 +02:00
Hosted Weblate
46b6b38ad5
Translated using Weblate (Dutch)
Currently translated at 100.0% (166 of 166 strings)

Translated using Weblate (Dutch)

Currently translated at 100.0% (166 of 166 strings)

Co-authored-by: Arne Cuperus <cuperusarne@gmail.com>
Co-authored-by: Hosted Weblate <hosted@weblate.org>
Co-authored-by: schlagmichdoch <sonnig-02.hieven@icloud.com>
Translate-URL: https://hosted.weblate.org/projects/pairdrop/pairdrop-spa/nl/
Translation: PairDrop/pairdrop-spa
2024-04-17 20:56:08 +02:00
Hosted Weblate
3cc2ab99b5
Translated using Weblate (Indonesian)
Currently translated at 93.9% (156 of 166 strings)

Co-authored-by: schlagmichdoch <sonnig-02.hieven@icloud.com>
Translate-URL: https://hosted.weblate.org/projects/pairdrop/pairdrop-spa/id/
Translation: PairDrop/pairdrop-spa
2024-04-17 20:56:08 +02:00
Hosted Weblate
61861df99e
Translated using Weblate (Arabic)
Currently translated at 83.7% (139 of 166 strings)

Co-authored-by: schlagmichdoch <sonnig-02.hieven@icloud.com>
Translate-URL: https://hosted.weblate.org/projects/pairdrop/pairdrop-spa/ar/
Translation: PairDrop/pairdrop-spa
2024-04-17 20:56:08 +02:00
Hosted Weblate
6330f09486
Translated using Weblate (Polish)
Currently translated at 100.0% (166 of 166 strings)

Added translation using Weblate (Polish)

Co-authored-by: Ash Mad <ash729@users.noreply.hosted.weblate.org>
Co-authored-by: Hosted Weblate <hosted@weblate.org>
Translate-URL: https://hosted.weblate.org/projects/pairdrop/pairdrop-spa/pl/
Translation: PairDrop/pairdrop-spa
2024-04-17 20:56:08 +02:00
Hosted Weblate
e07255398f
Added translation using Weblate (Hebrew)
Co-authored-by: Hosted Weblate <hosted@weblate.org>
Co-authored-by: schlagmichdoch <sonnig-02.hieven@icloud.com>
2024-04-17 20:56:08 +02:00
Hosted Weblate
cce97a6496
Translated using Weblate (Hungarian)
Currently translated at 100.0% (166 of 166 strings)

Translated using Weblate (Hungarian)

Currently translated at 100.0% (166 of 166 strings)

Translated using Weblate (Hungarian)

Currently translated at 47.5% (79 of 166 strings)

Added translation using Weblate (Hungarian)

Co-authored-by: Balázs Szeles <zutvas@gmail.com>
Co-authored-by: Hosted Weblate <hosted@weblate.org>
Translate-URL: https://hosted.weblate.org/projects/pairdrop/pairdrop-spa/hu/
Translation: PairDrop/pairdrop-spa
2024-04-17 20:56:08 +02:00
Hosted Weblate
9c98bc3e9b
Translated using Weblate (Japanese)
Currently translated at 98.1% (163 of 166 strings)

Co-authored-by: schlagmichdoch <sonnig-02.hieven@icloud.com>
Translate-URL: https://hosted.weblate.org/projects/pairdrop/pairdrop-spa/ja/
Translation: PairDrop/pairdrop-spa
2024-04-17 20:56:08 +02:00
Hosted Weblate
63717aae82
Translated using Weblate (Russian)
Currently translated at 87.3% (145 of 166 strings)

Translated using Weblate (Russian)

Currently translated at 87.3% (145 of 166 strings)

Co-authored-by: Drako 1 <caesarrulezzz@gmail.com>
Co-authored-by: Hosted Weblate <hosted@weblate.org>
Co-authored-by: schlagmichdoch <sonnig-02.hieven@icloud.com>
Translate-URL: https://hosted.weblate.org/projects/pairdrop/pairdrop-spa/ru/
Translation: PairDrop/pairdrop-spa
2024-04-17 20:56:08 +02:00
Hosted Weblate
08aa1e62a4
Translated using Weblate (Portuguese (Brazil))
Currently translated at 96.9% (161 of 166 strings)

Translated using Weblate (Portuguese (Brazil))

Currently translated at 96.9% (161 of 166 strings)

Co-authored-by: Hosted Weblate <hosted@weblate.org>
Co-authored-by: Richard Willian <eliteplayer000@gmail.com>
Co-authored-by: schlagmichdoch <sonnig-02.hieven@icloud.com>
Translate-URL: https://hosted.weblate.org/projects/pairdrop/pairdrop-spa/pt_BR/
Translation: PairDrop/pairdrop-spa
2024-04-17 20:56:08 +02:00
schlagmichdoch
828caa4226
Merge pull request #286 from codyandersan/patch-1
Removed duplicate feature in README.md
2024-04-17 20:43:02 +02:00
schlagmichdoch
35f47d9063 Fix inner text being cleared when viewing next received text from queue + prevent skipping of queue entry when timing is bad by checking for existing timeout
Co-authored-by: klmkyo <mail@mklimek.dev>
2024-04-17 20:38:33 +02:00
Cody Andersan
6ca37bd390
Update README.md
Removed duplicate feature.
2024-03-31 08:42:03 +05:30
schlagmichdoch
be46e7d4af Add some more info to the FAQ 2024-02-22 16:13:38 +01:00
schlagmichdoch
3c1bc9f82f
Update answer for saving images to the iOS gallery and add linebreaks for better readability 2024-02-18 01:15:52 +01:00
schlagmichdoch
892e84c834
Update Support paragraph (fixes #274) 2024-02-18 00:05:00 +01:00
schlagmichdoch
d6287c4cf0 Increase version to v1.10.7
## Enhancements
- Implemented drag and drop into text fields
- Tidy up code
- Translations update from Hosted Weblate (Italian)

## Fixes
- Received URLs with single letter subdomains not hydrated into links #258
- Button does not change color on hover (#262 + #263)
- On Windows Edge, PeerUI shows „preparing“ when file selector is cancelled (#257)
2024-02-09 03:53:53 +01:00
schlagmichdoch
c83e55b448
Merge pull request #253 from weblate/weblate-pairdrop-pairdrop-spa
Translations update from Hosted Weblate
2024-02-09 03:46:54 +01:00
Hosted Weblate
49160f9b02
Translated using Weblate (Italian)
Currently translated at 100.0% (166 of 166 strings)

Translated using Weblate (Italian)

Currently translated at 87.9% (146 of 166 strings)

Co-authored-by: Hosted Weblate <hosted@weblate.org>
Co-authored-by: Luca FiltroMan <FiltroMan@users.noreply.hosted.weblate.org>
Co-authored-by: Radosław Rudner <radek.rud112@gmail.com>
Translate-URL: https://hosted.weblate.org/projects/pairdrop/pairdrop-spa/it/
Translation: PairDrop/pairdrop-spa
2024-02-09 03:46:01 +01:00
schlagmichdoch
7be2830a08
Merge pull request #259 from schlagmichdoch/fix_url_hydration
Prepare next patch version
2024-02-09 03:44:41 +01:00
schlagmichdoch
1f3dd080a0 Fix canceling file selector on Windows Edge sometimes blocks UI (#257) 2024-02-09 03:41:41 +01:00
schlagmichdoch
5d709966af Fix button color change on hover (fixes #262) 2024-02-09 03:40:21 +01:00
schlagmichdoch
99b0c6ff01 Fix URL not replaced with link node (fixes #258), beautify text via regex without rendering it, and fix execution order 2024-02-01 14:25:38 +01:00
schlagmichdoch
76e08927de Enable drag and drop and pasting in text fields; Tidy up existing drag and drop code. 2024-02-01 14:25:38 +01:00
schlagmichdoch
9118b0ae06 Use default line-height for textareas 2024-02-01 14:25:38 +01:00
schlagmichdoch
b36105b1cf
Remove trailing back quote` from command in how-to.md
Fixes #256
2024-01-30 19:09:09 +01:00
schlagmichdoch
ad4f727d19
Merge pull request #212 from comradekingu/patch-2
README reworked
2024-01-30 19:05:00 +01:00
schlagmichdoch
3fa0873bc4 Increase version to v1.10.6
## Changes
- Fix loading error on older iOS and Mac versions
- Fix websocket-fallback info text position
- Translations update from Hosted Weblate (Turkish, Japanese, Indonesian)
2024-01-21 20:09:11 +01:00
schlagmichdoch
a03482bc7f Merge branch 'master' into translate 2024-01-21 20:01:09 +01:00
schlagmichdoch
40aa46fdd9
Merge pull request #245 from weblate/weblate-pairdrop-pairdrop-spa
Translations update from Hosted Weblate
2024-01-21 19:56:08 +01:00
Hosted Weblate
9003094e49
Translated using Weblate (Indonesian)
Currently translated at 93.9% (156 of 166 strings)

Co-authored-by: Hosted Weblate <hosted@weblate.org>
Co-authored-by: Reza Almanda <rezaalmanda27@gmail.com>
Translate-URL: https://hosted.weblate.org/projects/pairdrop/pairdrop-spa/id/
Translation: PairDrop/pairdrop-spa
2024-01-21 19:55:10 +01:00
Hosted Weblate
0459a361c3
Translated using Weblate (Japanese)
Currently translated at 98.1% (163 of 166 strings)

Co-authored-by: Hosted Weblate <hosted@weblate.org>
Co-authored-by: RintanBroadleaf <rintanbroadleaf@outlook.jp>
Translate-URL: https://hosted.weblate.org/projects/pairdrop/pairdrop-spa/ja/
Translation: PairDrop/pairdrop-spa
2024-01-21 19:55:10 +01:00
Hosted Weblate
10a669d7c6
Translated using Weblate (Turkish)
Currently translated at 100.0% (166 of 166 strings)

Co-authored-by: Oğuz Ersen <oguz@ersen.moe>
Translate-URL: https://hosted.weblate.org/projects/pairdrop/pairdrop-spa/tr/
Translation: PairDrop/pairdrop-spa
2024-01-21 19:55:10 +01:00
schlagmichdoch
3fbca72d74
Merge pull request #243 from schlagmichdoch/fix-regex-error
Fix Error Invalid Group Specifier Name on MacOS Safari and iOS Firefox on older MacOS/iOS
2024-01-21 19:53:57 +01:00
Allan Nordhøy
f048c4f1bd
GIF 2024-01-13 13:46:19 +00:00
Allan Nordhøy
6c1672ba25
Fixing conflicts, better 2024-01-13 13:44:44 +00:00
Allan Nordhøy
caf19bdb45
Merge branch 'master' into patch-2 2024-01-13 13:25:31 +00:00
Allan Nordhøy
5dcda58ce5
Structure and requested fixes 2024-01-13 13:18:06 +00:00
schlagmichdoch
59360fb047 Fix websocket-fallback info text not centered when line is broken 2024-01-12 01:43:08 +01:00
schlagmichdoch
2e15a018da Fix Error Invalid Group Specifier Name on Safari by removing REGEX lookbehind group construct (fixes #239) 2024-01-12 01:23:14 +01:00
schlagmichdoch
041261be2a Fix url argument case ?share_target 2024-01-06 16:15:30 +01:00
schlagmichdoch
f152645452 Increase version to v1.10.5
## Changes
- Fix Zip Release workflow
2024-01-06 15:41:39 +01:00
schlagmichdoch
a7f5d336c3 Fix Zip Release workflow: wrong upload path 2024-01-06 15:37:05 +01:00
schlagmichdoch
c9e4510f65 Increase version to v1.10.4
## Changes
- Use blue icons as favicons for better contrast (#235)
- Fix pairdrop-cli exit on error
- Enhancement: On release: Prevent nesting of pairdrop-cli folder inside pairdrop-cli.zip
- Enhance documentation for pairdrop-cli and sending from context menu (#236)
- Translations update from Hosted Weblate
2024-01-06 15:30:20 +01:00
schlagmichdoch
70f74923e6 Merge branch 'master' into translate 2024-01-06 15:23:21 +01:00
schlagmichdoch
6217042f12
Merge pull request #229 from weblate/weblate-pairdrop-pairdrop-spa
Translations update from Hosted Weblate
2024-01-06 15:22:42 +01:00
Hosted Weblate
4659ef2041
Translated using Weblate (Chinese (Simplified))
Currently translated at 100.0% (166 of 166 strings)

Co-authored-by: Eric <zxmegaxqug@hldrive.com>
Co-authored-by: Hosted Weblate <hosted@weblate.org>
Translate-URL: https://hosted.weblate.org/projects/pairdrop/pairdrop-spa/zh_Hans/
Translation: PairDrop/pairdrop-spa
2024-01-06 15:20:30 +01:00
Hosted Weblate
a21881b7ca
Translated using Weblate (Kannada)
Currently translated at 100.0% (166 of 166 strings)

Co-authored-by: Chethan <76928501+ch3thanhs@users.noreply.github.com>
Co-authored-by: Hosted Weblate <hosted@weblate.org>
Translate-URL: https://hosted.weblate.org/projects/pairdrop/pairdrop-spa/kn/
Translation: PairDrop/pairdrop-spa
2024-01-06 15:20:29 +01:00
Hosted Weblate
f589e9471e
Translated using Weblate (Indonesian)
Currently translated at 86.7% (144 of 166 strings)

Co-authored-by: Hosted Weblate <hosted@weblate.org>
Co-authored-by: schlagmichdoch <sonnig-02.hieven@icloud.com>
Translate-URL: https://hosted.weblate.org/projects/pairdrop/pairdrop-spa/id/
Translation: PairDrop/pairdrop-spa
2024-01-06 15:20:29 +01:00
Hosted Weblate
067117159a
Translated using Weblate (Arabic)
Currently translated at 83.7% (139 of 166 strings)

Co-authored-by: schlagmichdoch <sonnig-02.hieven@icloud.com>
Translate-URL: https://hosted.weblate.org/projects/pairdrop/pairdrop-spa/ar/
Translation: PairDrop/pairdrop-spa
2024-01-06 15:20:29 +01:00
Hosted Weblate
d901ca031a
Translated using Weblate (Italian)
Currently translated at 87.3% (145 of 166 strings)

Co-authored-by: schlagmichdoch <sonnig-02.hieven@icloud.com>
Translate-URL: https://hosted.weblate.org/projects/pairdrop/pairdrop-spa/it/
Translation: PairDrop/pairdrop-spa
2024-01-06 15:20:29 +01:00
Hosted Weblate
21fa6f07d8
Translated using Weblate (Romanian)
Currently translated at 100.0% (166 of 166 strings)

Co-authored-by: Alexandru-Ionut Chiuta <chiuta@gmail.com>
Co-authored-by: Hosted Weblate <hosted@weblate.org>
Translate-URL: https://hosted.weblate.org/projects/pairdrop/pairdrop-spa/ro/
Translation: PairDrop/pairdrop-spa
2024-01-06 15:20:29 +01:00
Hosted Weblate
f49b800f9e
Translated using Weblate (German)
Currently translated at 100.0% (166 of 166 strings)

Co-authored-by: Hosted Weblate <hosted@weblate.org>
Co-authored-by: schlagmichdoch <sonnig-02.hieven@icloud.com>
Translate-URL: https://hosted.weblate.org/projects/pairdrop/pairdrop-spa/de/
Translation: PairDrop/pairdrop-spa
2024-01-06 15:20:29 +01:00
schlagmichdoch
1a9fa8e60a Enhance the documentation for pairdrop-cli and add shell commands 2024-01-06 15:13:48 +01:00
schlagmichdoch
79cc8e5590 Release file pairdrop-cli.zip should only include contents of folder pairdrop-cli instead of the folder itself 2024-01-06 15:11:18 +01:00
schlagmichdoch
89addd6649 pairdrop-cli: Exit application if config file cannot be created on first run 2024-01-06 15:09:08 +01:00
schlagmichdoch
ff883fb994 Use blue icons as favicons too to prevent white logo on white background (fixes #235) 2024-01-04 17:41:20 +01:00
schlagmichdoch
ccb2170287 Increase version to v1.10.3 2024-01-03 17:18:04 +01:00
schlagmichdoch
3454eebf37 Merge branch 'fix-small-issues' 2024-01-03 17:15:20 +01:00
schlagmichdoch
b6203288bf
Merge pull request #234 from schlagmichdoch/dependabot/npm_and_yarn/ws-8.16.0
Bump ws from 8.15.0 to 8.16.0
2024-01-03 17:14:47 +01:00
schlagmichdoch
bea0fa5b9c Fix color of URLs on receive text dialog 2024-01-03 17:11:38 +01:00
schlagmichdoch
48090ec41c Fix x-paper width (fixed #233) 2024-01-03 16:54:43 +01:00
schlagmichdoch
229084fab3 Properly style indented text via css 2024-01-03 16:54:01 +01:00
schlagmichdoch
d58f380565 Prevent executing _onCopy() when text is selected on receive text dialog 2024-01-03 16:53:09 +01:00
schlagmichdoch
676c68b6e7 Clear text field when closing receive text dialog 2024-01-03 16:52:26 +01:00
schlagmichdoch
dd0dc21db5 Fix replacement of sent URLs with actual links (fixes #231) 2024-01-03 16:51:44 +01:00
dependabot[bot]
4e72339479
Bump ws from 8.15.0 to 8.16.0
Bumps [ws](https://github.com/websockets/ws) from 8.15.0 to 8.16.0.
- [Release notes](https://github.com/websockets/ws/releases)
- [Commits](https://github.com/websockets/ws/compare/8.15.0...8.16.0)

---
updated-dependencies:
- dependency-name: ws
  dependency-type: direct:production
  update-type: version-update:semver-minor
...

Signed-off-by: dependabot[bot] <support@github.com>
2024-01-01 04:45:23 +00:00
schlagmichdoch
c3e92d7d4c Increase version to v1.10.2 2023-12-15 23:54:20 +01:00
schlagmichdoch
b90924af68 Merge branch 'master' into translate 2023-12-15 23:51:11 +01:00
schlagmichdoch
4f80ab4401
Merge pull request #226 from schlagmichdoch/parallelize_asset_loading
Parallelize and speed up loading of deferred assets, refactor code, and fix `RTC_CONFIG` env var
2023-12-15 23:49:54 +01:00
schlagmichdoch
f299c90f47
Merge pull request #224 from weblate/weblate-pairdrop-pairdrop-spa
Translations update from Hosted Weblate
2023-12-15 23:47:25 +01:00
schlagmichdoch
6737dcacf7 Defer scripts and prevent deferred stylesheets from being render blocking 2023-12-15 23:40:30 +01:00
Hosted Weblate
5d39bf4a76
Translated using Weblate (Kannada)
Currently translated at 100.0% (161 of 161 strings)

Co-authored-by: Chethan <76928501+ch3thanhs@users.noreply.github.com>
Co-authored-by: Hosted Weblate <hosted@weblate.org>
Translate-URL: https://hosted.weblate.org/projects/pairdrop/pairdrop-spa/kn/
Translation: PairDrop/pairdrop-spa
2023-12-15 21:08:45 +00:00
Hosted Weblate
5c70c873ab
Translated using Weblate (Spanish)
Currently translated at 100.0% (166 of 166 strings)

Co-authored-by: gallegonovato <fran-carro@hotmail.es>
Translate-URL: https://hosted.weblate.org/projects/pairdrop/pairdrop-spa/es/
Translation: PairDrop/pairdrop-spa
2023-12-15 21:08:45 +00:00
Hosted Weblate
b336c75b72
Translated using Weblate (German)
Currently translated at 100.0% (166 of 166 strings)

Co-authored-by: Hosted Weblate <hosted@weblate.org>
Co-authored-by: schlagmichdoch <sonnig-02.hieven@icloud.com>
Translate-URL: https://hosted.weblate.org/projects/pairdrop/pairdrop-spa/de/
Translation: PairDrop/pairdrop-spa
2023-12-15 21:08:44 +00:00
Hosted Weblate
b3f5619f2d
Translated using Weblate (Turkish)
Currently translated at 100.0% (161 of 161 strings)

Co-authored-by: Hosted Weblate <hosted@weblate.org>
Co-authored-by: Æthereal <fr.izgi.kn@gmail.com>
Translate-URL: https://hosted.weblate.org/projects/pairdrop/pairdrop-spa/tr/
Translation: PairDrop/pairdrop-spa
2023-12-15 21:08:44 +00:00
schlagmichdoch
939ca3d35d Enable Kannada translation 2023-12-15 22:08:25 +01:00
schlagmichdoch
c2ee459231 Fix error if env var RTC_CONFIG=false (as in default docker-compose.yml and docs) 2023-12-15 21:22:33 +01:00
schlagmichdoch
c08b324d6a Refactor localization.js 2023-12-15 21:20:35 +01:00
schlagmichdoch
d3a623d352 Refactor for loops to specify imagesOnly to Array.prototype.every() 2023-12-15 21:19:56 +01:00
schlagmichdoch
d8f9532039 Parallelize asset loading 2023-12-15 19:39:26 +01:00
schlagmichdoch
9847feeb52
Fix SIGNALING_SERVER documentation 2023-12-13 18:50:33 +01:00
schlagmichdoch
ae75cdbc62 Increase version to v1.10.1 2023-12-13 18:15:09 +01:00
schlagmichdoch
e2299f1d0f Add documentation for the customizable about pairdrop buttons 2023-12-13 18:10:27 +01:00
schlagmichdoch
e06fa47c96 Implement customizable buttons via env vars (fixes #214) 2023-12-13 17:40:48 +01:00
schlagmichdoch
09451caf86 Fix missing English translation for the title of the header expand button 2023-12-13 17:38:19 +01:00
schlagmichdoch
16921cb855 Merge branch 'master' into translate 2023-12-13 17:33:09 +01:00
schlagmichdoch
9b8d824bfc Enable Catalan translation (fixes #217) 2023-12-13 17:33:02 +01:00
schlagmichdoch
211328c2f7 Add Brazilian Portuguese to file list to be cached in service-worker.js 2023-12-13 17:26:21 +01:00
schlagmichdoch
224e6f0db9
Merge pull request #222 from weblate/weblate-pairdrop-pairdrop-spa
Translations update from Hosted Weblate
2023-12-13 17:22:51 +01:00
Hosted Weblate
a3690994b8
Translated using Weblate (Catalan)
Currently translated at 100.0% (161 of 161 strings)

Co-authored-by: gmassipg <gerardmassipgil@gmail.com>
Translate-URL: https://hosted.weblate.org/projects/pairdrop/pairdrop-spa/ca/
Translation: PairDrop/pairdrop-spa
2023-12-13 17:22:09 +01:00
Hosted Weblate
866d8a0e16
Translated using Weblate (Portuguese (Brazil))
Currently translated at 100.0% (161 of 161 strings)

Co-authored-by: Marcelo Mendonçca Miranda <marcelommira@live.com>
Translate-URL: https://hosted.weblate.org/projects/pairdrop/pairdrop-spa/pt_BR/
Translation: PairDrop/pairdrop-spa
2023-12-13 17:22:09 +01:00
schlagmichdoch
132b2ffa65 Rename deferred style sheet 2023-12-13 17:21:21 +01:00
schlagmichdoch
b084a9b83b Preload font and add font-display: swap; to increase loading speed 2023-12-13 17:20:46 +01:00
schlagmichdoch
77f2866893 add write permission to workflow zip-release 2023-12-12 19:48:39 +01:00
schlagmichdoch
fbaa05de82 increase version to v1.10.0 2023-12-12 19:19:56 +01:00
schlagmichdoch
9844e28f72
Reduce size of screenshot and weblate status images on README.md 2023-12-12 19:16:44 +01:00
schlagmichdoch
1508a0ff33
Merge pull request #209 from schlagmichdoch/next
Release Next Version `v1.10.0`
2023-12-12 19:13:29 +01:00
schlagmichdoch
b187dedde3 Merge branch 'master' into next 2023-12-12 19:13:05 +01:00
schlagmichdoch
037dab1e46 Merge branch 'translate' into next 2023-12-12 19:10:12 +01:00
schlagmichdoch
be155c0f82
Merge pull request #218 from weblate/weblate-pairdrop-pairdrop-spa
Translations update from Hosted Weblate
2023-12-12 19:09:13 +01:00
Hosted Weblate
e202e0cfc2
Translated using Weblate (German)
Currently translated at 100.0% (161 of 161 strings)

Co-authored-by: schlagmichdoch <sonnig-02.hieven@icloud.com>
Translate-URL: https://hosted.weblate.org/projects/pairdrop/pairdrop-spa/de/
Translation: PairDrop/pairdrop-spa
2023-12-12 19:07:04 +01:00
gmassipg
d4b770cb0c Translated using Weblate (Catalan)
Currently translated at 12.4% (20 of 161 strings)

Translation: PairDrop/pairdrop-spa
Translate-URL: https://hosted.weblate.org/projects/pairdrop/pairdrop-spa/ca/
2023-12-12 16:18:59 +01:00
Eric
69388775a4 Translated using Weblate (Chinese (Simplified))
Currently translated at 100.0% (161 of 161 strings)

Translation: PairDrop/pairdrop-spa
Translate-URL: https://hosted.weblate.org/projects/pairdrop/pairdrop-spa/zh_Hans/
2023-12-12 16:18:59 +01:00
Hosted Weblate
637d11ab5c Added translation using Weblate (Catalan)
Co-authored-by: Hosted Weblate <hosted@weblate.org>
Co-authored-by: schlagmichdoch <sonnig-02.hieven@icloud.com>
2023-12-12 16:18:59 +01:00
Hosted Weblate
2ba828ce29 Translated using Weblate (English)
Currently translated at 100.0% (161 of 161 strings)

Co-authored-by: Hosted Weblate <hosted@weblate.org>
Co-authored-by: schlagmichdoch <sonnig-02.hieven@icloud.com>
Translate-URL: https://hosted.weblate.org/projects/pairdrop/pairdrop-spa/en/
Translation: PairDrop/pairdrop-spa
2023-12-12 16:18:59 +01:00
Hosted Weblate
caf9408164 Translated using Weblate (German)
Currently translated at 100.0% (161 of 161 strings)

Co-authored-by: Hosted Weblate <hosted@weblate.org>
Co-authored-by: schlagmichdoch <sonnig-02.hieven@icloud.com>
Translate-URL: https://hosted.weblate.org/projects/pairdrop/pairdrop-spa/de/
Translation: PairDrop/pairdrop-spa
2023-12-12 16:18:59 +01:00
Hosted Weblate
78017dbf87 Translated using Weblate (Turkish)
Currently translated at 100.0% (161 of 161 strings)

Co-authored-by: Æthereal <fr.izgi.kn@gmail.com>
Translate-URL: https://hosted.weblate.org/projects/pairdrop/pairdrop-spa/tr/
Translation: PairDrop/pairdrop-spa
2023-12-12 16:18:59 +01:00
schlagmichdoch
a94ff0845b Blur base64 fallback textarea when hiding the dialog 2023-12-12 14:19:41 +01:00
schlagmichdoch
73759be0a9 Fix thumbnail creation on iOS devices 2023-12-12 14:07:15 +01:00
schlagmichdoch
a5cc115fa6 - Fix theme-wrapper size on touch devices
- Make x-instructor shrinkable on small screens
- Evaluate x-Peers overflow when header expand button is clicked
- Refactor padding/margin classnames
2023-12-12 13:39:55 +01:00
schlagmichdoch
8c5d85bea5 Translated using Weblate (German)
Currently translated at 100.0% (149 of 149 strings)

Translation: PairDrop/pairdrop-spa
Translate-URL: https://hosted.weblate.org/projects/pairdrop/pairdrop-spa/de/
2023-12-12 12:30:06 +01:00
Æthereal
0d9a8a1620 Translated using Weblate (Turkish)
Currently translated at 100.0% (149 of 149 strings)

Translation: PairDrop/pairdrop-spa
Translate-URL: https://hosted.weblate.org/projects/pairdrop/pairdrop-spa/tr/
2023-12-12 12:30:06 +01:00
Chethan
0d57f06b7c Translated using Weblate (Kannada)
Currently translated at 100.0% (149 of 149 strings)

Translation: PairDrop/pairdrop-spa
Translate-URL: https://hosted.weblate.org/projects/pairdrop/pairdrop-spa/kn/
2023-12-12 12:30:06 +01:00
Chethan
3e1ca6a807 Translated using Weblate (Kannada)
Currently translated at 0.6% (1 of 149 strings)

Translation: PairDrop/pairdrop-spa
Translate-URL: https://hosted.weblate.org/projects/pairdrop/pairdrop-spa/kn/
2023-12-12 12:30:06 +01:00
schlagmichdoch
c17fd09a49 Added translation using Weblate (Kannada) 2023-12-12 12:30:06 +01:00
gallegonovato
c5ace9355f Translated using Weblate (Spanish)
Currently translated at 100.0% (149 of 149 strings)

Translation: PairDrop/pairdrop-spa
Translate-URL: https://hosted.weblate.org/projects/pairdrop/pairdrop-spa/es/
2023-12-12 12:30:06 +01:00
Eric
ec27043997 Translated using Weblate (Chinese (Simplified))
Currently translated at 100.0% (149 of 149 strings)

Translation: PairDrop/pairdrop-spa
Translate-URL: https://hosted.weblate.org/projects/pairdrop/pairdrop-spa/zh_Hans/
2023-12-12 12:30:06 +01:00
schlagmichdoch
64889e5b05 Translated using Weblate (German)
Currently translated at 100.0% (149 of 149 strings)

Translation: PairDrop/pairdrop-spa
Translate-URL: https://hosted.weblate.org/projects/pairdrop/pairdrop-spa/de/
2023-12-12 12:30:06 +01:00
schlagmichdoch
c5592185e8 Translated using Weblate (English)
Currently translated at 100.0% (149 of 149 strings)

Translation: PairDrop/pairdrop-spa
Translate-URL: https://hosted.weblate.org/projects/pairdrop/pairdrop-spa/en/
2023-12-12 12:30:06 +01:00
schlagmichdoch
10c02212e8 Translated using Weblate (Italian)
Currently translated at 100.0% (147 of 147 strings)

Translation: PairDrop/pairdrop-spa
Translate-URL: https://hosted.weblate.org/projects/pairdrop/pairdrop-spa/it/
2023-12-12 12:30:06 +01:00
schlagmichdoch
f1e4fde909 Translated using Weblate (French)
Currently translated at 99.3% (146 of 147 strings)

Translation: PairDrop/pairdrop-spa
Translate-URL: https://hosted.weblate.org/projects/pairdrop/pairdrop-spa/fr/
2023-12-12 12:30:06 +01:00
schlagmichdoch
5f56f3334c Translated using Weblate (Portuguese (Brazil))
Currently translated at 100.0% (147 of 147 strings)

Translation: PairDrop/pairdrop-spa
Translate-URL: https://hosted.weblate.org/projects/pairdrop/pairdrop-spa/pt_BR/
2023-12-12 12:30:06 +01:00
schlagmichdoch
135661d488 Translated using Weblate (Japanese)
Currently translated at 100.0% (147 of 147 strings)

Translation: PairDrop/pairdrop-spa
Translate-URL: https://hosted.weblate.org/projects/pairdrop/pairdrop-spa/ja/
2023-12-12 12:30:06 +01:00
schlagmichdoch
21590258a3 Translated using Weblate (Italian)
Currently translated at 100.0% (147 of 147 strings)

Translation: PairDrop/pairdrop-spa
Translate-URL: https://hosted.weblate.org/projects/pairdrop/pairdrop-spa/it/
2023-12-12 12:30:06 +01:00
schlagmichdoch
d5efe14649 Translated using Weblate (Spanish)
Currently translated at 100.0% (147 of 147 strings)

Translation: PairDrop/pairdrop-spa
Translate-URL: https://hosted.weblate.org/projects/pairdrop/pairdrop-spa/es/
2023-12-12 12:30:06 +01:00
schlagmichdoch
03cd684c63 Translated using Weblate (Dutch)
Currently translated at 95.9% (141 of 147 strings)

Translation: PairDrop/pairdrop-spa
Translate-URL: https://hosted.weblate.org/projects/pairdrop/pairdrop-spa/nl/
2023-12-12 12:30:06 +01:00
haeresis
4bf726a99d Translated using Weblate (French)
Currently translated at 99.3% (146 of 147 strings)

Translation: PairDrop/pairdrop-spa
Translate-URL: https://hosted.weblate.org/projects/pairdrop/pairdrop-spa/fr/
2023-12-12 12:30:06 +01:00
schlagmichdoch
12775ae6f9 Translated using Weblate (Arabic)
Currently translated at 95.9% (141 of 147 strings)

Translation: PairDrop/pairdrop-spa
Translate-URL: https://hosted.weblate.org/projects/pairdrop/pairdrop-spa/ar/
2023-12-12 12:30:06 +01:00
schlagmichdoch
2dadbcbbe1 Translated using Weblate (Indonesian)
Currently translated at 100.0% (147 of 147 strings)

Translation: PairDrop/pairdrop-spa
Translate-URL: https://hosted.weblate.org/projects/pairdrop/pairdrop-spa/id/
2023-12-12 12:30:06 +01:00
schlagmichdoch
96d47ab19d Translated using Weblate (Romanian)
Currently translated at 100.0% (147 of 147 strings)

Translation: PairDrop/pairdrop-spa
Translate-URL: https://hosted.weblate.org/projects/pairdrop/pairdrop-spa/ro/
2023-12-12 12:30:06 +01:00
schlagmichdoch
833ff4c68b Translated using Weblate (Turkish)
Currently translated at 100.0% (147 of 147 strings)

Translation: PairDrop/pairdrop-spa
Translate-URL: https://hosted.weblate.org/projects/pairdrop/pairdrop-spa/tr/
2023-12-12 12:30:06 +01:00
schlagmichdoch
3115c3fa74 Translated using Weblate (Norwegian Bokmål)
Currently translated at 68.7% (101 of 147 strings)

Translation: PairDrop/pairdrop-spa
Translate-URL: https://hosted.weblate.org/projects/pairdrop/pairdrop-spa/nb_NO/
2023-12-12 12:30:06 +01:00
schlagmichdoch
774c1ddb77 Translated using Weblate (Russian)
Currently translated at 100.0% (147 of 147 strings)

Translation: PairDrop/pairdrop-spa
Translate-URL: https://hosted.weblate.org/projects/pairdrop/pairdrop-spa/ru/
2023-12-12 12:30:06 +01:00
schlagmichdoch
87589e6ae3 Translated using Weblate (German)
Currently translated at 100.0% (147 of 147 strings)

Translation: PairDrop/pairdrop-spa
Translate-URL: https://hosted.weblate.org/projects/pairdrop/pairdrop-spa/de/
2023-12-12 12:30:06 +01:00
gallegonovato
a073746d70 Translated using Weblate (Spanish)
Currently translated at 99.3% (146 of 147 strings)

Translation: PairDrop/pairdrop-spa
Translate-URL: https://hosted.weblate.org/projects/pairdrop/pairdrop-spa/es/
2023-12-12 12:30:06 +01:00
haeresis
dd12f0cfde Translated using Weblate (French)
Currently translated at 98.6% (145 of 147 strings)

Translation: PairDrop/pairdrop-spa
Translate-URL: https://hosted.weblate.org/projects/pairdrop/pairdrop-spa/fr/
2023-12-12 12:30:06 +01:00
Eric
8c1a02b693 Translated using Weblate (Chinese (Simplified))
Currently translated at 100.0% (147 of 147 strings)

Translation: PairDrop/pairdrop-spa
Translate-URL: https://hosted.weblate.org/projects/pairdrop/pairdrop-spa/zh_Hans/
2023-12-12 12:30:06 +01:00
schlagmichdoch
a9f1bc3674 Translated using Weblate (German)
Currently translated at 87.0% (128 of 147 strings)

Translation: PairDrop/pairdrop-spa
Translate-URL: https://hosted.weblate.org/projects/pairdrop/pairdrop-spa/de/
2023-12-12 12:30:06 +01:00
schlagmichdoch
01037f6520 Translated using Weblate (English)
Currently translated at 100.0% (147 of 147 strings)

Translation: PairDrop/pairdrop-spa
Translate-URL: https://hosted.weblate.org/projects/pairdrop/pairdrop-spa/en/
2023-12-12 12:30:06 +01:00
Ammar Haddadi
86b6696de0 Translated using Weblate (Arabic)
Currently translated at 95.9% (141 of 147 strings)

Translation: PairDrop/pairdrop-spa
Translate-URL: https://hosted.weblate.org/projects/pairdrop/pairdrop-spa/ar/
2023-12-12 12:30:06 +01:00
schlagmichdoch
770fb8f1af Fix overflowing Brazilian Portuguese button and change style of current language button 2023-12-12 12:30:01 +01:00
schlagmichdoch
c67676219c
Merge pull request #191 from schlagmichdoch/dependabot/npm_and_yarn/ua-parser-js-1.0.37
Bump ua-parser-js from 1.0.36 to 1.0.37
2023-12-11 22:37:56 +01:00
dependabot[bot]
c14d1cd89b Bump ua-parser-js from 1.0.36 to 1.0.37
Bumps [ua-parser-js](https://github.com/faisalman/ua-parser-js) from 1.0.36 to 1.0.37.
- [Release notes](https://github.com/faisalman/ua-parser-js/releases)
- [Changelog](https://github.com/faisalman/ua-parser-js/blob/1.0.37/changelog.md)
- [Commits](https://github.com/faisalman/ua-parser-js/compare/1.0.36...1.0.37)

---
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-12-11 22:37:03 +01:00
schlagmichdoch
582b817ce6
Merge pull request #213 from schlagmichdoch/dependabot/npm_and_yarn/express-rate-limit-7.1.5
Bump express-rate-limit from 7.1.1 to 7.1.5
2023-12-11 22:33:56 +01:00
schlagmichdoch
cc9b9b6861
Merge pull request #216 from schlagmichdoch/dependabot/npm_and_yarn/ws-8.15.0
Bump ws from 8.14.2 to 8.15.0
2023-12-11 22:33:39 +01:00
schlagmichdoch
d5da647ea9 Apply merged changes to new Brazilian Portuguese language files 2023-12-11 22:07:16 +01:00
schlagmichdoch
da56a7b6bc Merge branch 'next' into translate 2023-12-11 20:10:38 +01:00
schlagmichdoch
1f1e029071 Recreate screenshots for manifest.json and recreate animation used in README.md 2023-12-11 20:00:34 +01:00
schlagmichdoch
dcdc9a5269
Merge pull request #208 from schlagmichdoch/enable-multiple-files-cli
Enable sending multiple files via cli
2023-12-11 19:13:49 +01:00
schlagmichdoch
8f9e3930a7 Add heic2any and NoSleep to technologies on README.md and add licences for these plus zip.js 2023-12-11 19:12:12 +01:00
schlagmichdoch
86d1aa3560 Implement thumbnail creation for heic images 2023-12-11 19:00:14 +01:00
dependabot[bot]
a130702692
Bump ws from 8.14.2 to 8.15.0
Bumps [ws](https://github.com/websockets/ws) from 8.14.2 to 8.15.0.
- [Release notes](https://github.com/websockets/ws/releases)
- [Commits](https://github.com/websockets/ws/compare/8.14.2...8.15.0)

---
updated-dependencies:
- dependency-name: ws
  dependency-type: direct:production
  update-type: version-update:semver-minor
...

Signed-off-by: dependabot[bot] <support@github.com>
2023-12-11 04:56:08 +00:00
schlagmichdoch
3238d582cc Conform svg symbol syntax 2023-12-10 19:41:19 +01:00
schlagmichdoch
bf6ac1f02c Refactor .share-panel to .shr-panel because of iOS Safari quirk 2023-12-10 19:41:10 +01:00
schlagmichdoch
2a97a8e5d9 Show placeholder when paired device is removed to prevent removing multiple devices 2023-12-09 19:13:35 +01:00
schlagmichdoch
b5535c7ace Make overflowing icons expandable via caret button and fix header btn opacity 2023-12-09 19:13:27 +01:00
schlagmichdoch
e7031cea90 Flex-wrap buttons on dialogs to prevent overflowing 2023-12-09 18:14:03 +01:00
schlagmichdoch
78b758b990 Implement the ability to initiate public room creation or device pairing via URL parameter (#207) 2023-12-08 13:57:19 +01:00
schlagmichdoch
5f77c785f9 PublicRoomDialog and PairDeviceDialog method names renamed 2023-12-08 13:57:19 +01:00
schlagmichdoch
10b658e2e9 Centralize evaluation of URL parameters to clean up code and remove redundancies, and streamline Base64Dialog class 2023-12-08 13:57:19 +01:00
schlagmichdoch
cb86ce0e39 Streamline client initiation by using await/async instead of .then and events 2023-12-08 13:57:19 +01:00
schlagmichdoch
25d6595a8f Use default translation if any placeholder is missing in the translation string 2023-12-08 13:57:19 +01:00
schlagmichdoch
29bede6109 Fix setTimeout syntax 2023-12-08 13:57:19 +01:00
schlagmichdoch
6a599ed318 Replace checkboxes with sliders to conform the style on all platforms 2023-12-08 13:57:19 +01:00
schlagmichdoch
f9a32c3e82 Fix QR-code color and make cursor a pointer for QR-codes 2023-12-08 13:57:19 +01:00
schlagmichdoch
2346c97118 Always show x-toast in light mode colors if any dialog is shown; Remove redundant color specification 2023-12-08 13:57:19 +01:00
schlagmichdoch
ae0cbec86e Fix wifi-tether in android icons do not have the correct size; Make favicons white 2023-12-08 13:57:19 +01:00
schlagmichdoch
69c8b91239 Revert some "airy" changes and rewrite style sheets to make dialogs centered but scrollable on small screens; Brighten public-room-color slightly 2023-12-08 13:57:19 +01:00
schlagmichdoch
a8242cecf7 Refactor URL arguments, localStorage and sessionStorage entries, and IndexedDB/PersistentStorage entries to snake_case. 2023-12-08 13:57:19 +01:00
schlagmichdoch
da8178d72e !fixup this if working 2023-12-08 13:57:12 +01:00
schlagmichdoch
0c2da78ed2 Refactor "paste mode" to "share mode"; Introduce a small clipboard panel instead of changing the xNoPeer instructions. This also enables the use of the header btns while sharing; Add possibility to change shared text before sending via a dialog; Add a setting that specifies whether that dialog should always be opened when sharing text 2023-12-08 03:48:43 +01:00
schlagmichdoch
7786499dcc Add workflow to create a new zip file from pairdrop-cli whenever a new version tag is pushed 2023-12-08 01:55:44 +01:00
schlagmichdoch
56a258a33f Increase repo security by pinning actions to a commit SHA. 2023-12-08 01:55:44 +01:00
schlagmichdoch
d6e1ddb265 Add documentation on how to set up and use pairdrop-cli and send files via the context menu 2023-12-08 01:55:38 +01:00
schlagmichdoch
eeb7dca884 Enable sending multiple files via cli and add files to use this via the send-to menu on Windows and Ubuntu (using Nautilus) 2023-12-08 01:55:11 +01:00
schlagmichdoch
4a5a2ceb67
Merge branch 'master' into patch-2 2023-12-04 21:16:41 +01:00
schlagmichdoch
b2f4582196
Make links and images on README.md relative 2023-12-04 21:12:13 +01:00
dependabot[bot]
5a9eaec1ec
Bump express-rate-limit from 7.1.1 to 7.1.5
Bumps [express-rate-limit](https://github.com/express-rate-limit/express-rate-limit) from 7.1.1 to 7.1.5.
- [Release notes](https://github.com/express-rate-limit/express-rate-limit/releases)
- [Commits](https://github.com/express-rate-limit/express-rate-limit/compare/v7.1.1...v7.1.5)

---
updated-dependencies:
- dependency-name: express-rate-limit
  dependency-type: direct:production
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>
2023-12-04 04:16:09 +00:00
Allan Nordhøy
214d557feb
README reworked 2023-11-30 01:20:28 +00:00
schlagmichdoch
62e198b5d3 Remove File Handling API (fixes #190) 2023-11-23 19:59:56 +01:00
schlagmichdoch
5a2ec9c670 Load initial translation as proper async call instead of using an event 2023-11-23 19:59:29 +01:00
schlagmichdoch
d78c138dad Merge branch 'next' into translate 2023-11-23 19:46:02 +01:00
schlagmichdoch
021c67bd77
Merge pull request #206 from schlagmichdoch/fix-send-text-dialog-cut-off
Make style more airy; Dark mode real black; Recreate Icons
2023-11-23 19:36:15 +01:00
schlagmichdoch
e37c31a784 Merge next into fix-send-text-dialog-cut-off 2023-11-23 19:16:29 +01:00
schlagmichdoch
4b90f3e2e8
Merge pull request #202 from schlagmichdoch/tidy_up_codebase
Refactor codebase, modularize server and decrease redundancies
2023-11-23 17:58:20 +01:00
schlagmichdoch
fa16341309 Merge branch 'next' into tidy_up_codebase 2023-11-23 17:57:40 +01:00
schlagmichdoch
73e38af896 Add avieshek to credits on README 2023-11-23 17:41:43 +01:00
schlagmichdoch
353a2606b6 Conform icons by making transparent icons cropped version of maskable icons (#201) 2023-11-23 17:41:43 +01:00
schlagmichdoch
4db8d09ac8 Change font to Open Sans (#200) 2023-11-23 17:41:42 +01:00
schlagmichdoch
80e34bd449 Recreate blue icons without drop shadow and gradient as background 2023-11-23 17:41:42 +01:00
schlagmichdoch
f27ecf1541 Remove connection-hash from UI for now 2023-11-23 17:41:42 +01:00
schlagmichdoch
713929d581 Change document title to "PairDrop | Transfer Files Cross-Platform. No Setup, No Signup." 2023-11-23 17:41:42 +01:00
schlagmichdoch
e99f841067 Change button and dialog style and add soft gradients to make it more "airy" and give it overall a more modern look; Make dark mode real black; Add overflow shadow to ReceiveText, SendText and EditPairedDevices Dialog 2023-11-23 17:41:16 +01:00
schlagmichdoch
9da6b14783
Merge pull request #204 from luyzfernando08/master
add Brazilian Portuguese translate
2023-11-21 02:22:58 +01:00
schlagmichdoch
f53832ead1 Increase text input font size to 16px to prevent automatic zooming on iOS devices; Remove spellcheck and autocapitalize prevention and change receive text style 2023-11-20 05:27:22 +01:00
Luiz Fernando
1e5bae6c21 add Brazilian Portuguese translate 2023-11-16 15:02:13 -03:00
schlagmichdoch
00e7394740 Reduce Scripts needed on start up to reduce critical requests aka speed up initial loading 2023-11-11 19:56:23 +01:00
schlagmichdoch
bdc8a6b111 Only start loading of deferred assets after UI is ready 2023-11-11 19:16:00 +01:00
schlagmichdoch
99332037bf Defer loading of all render-blocking resources until the UI has loaded 2023-11-09 04:45:46 +01:00
schlagmichdoch
778d49e84b prevent config from being cached but preserve offline capability 2023-11-09 01:02:54 +01:00
schlagmichdoch
9a2227c30f Enable Turkish translation 2023-11-09 01:02:52 +01:00
Mustafa Açık
4773a9470d Translated using Weblate (Turkish)
Currently translated at 100.0% (147 of 147 strings)

Translation: PairDrop/pairdrop-spa
Translate-URL: https://hosted.weblate.org/projects/pairdrop/pairdrop-spa/tr/
2023-11-09 01:02:14 +01:00
schlagmichdoch
175a0e397d prevent Apple devices from fetching non-existent image file GET "/apple-touch-icon-precomposed.png" 2023-11-09 01:02:14 +01:00
schlagmichdoch
cf55117a61 tidy up code and conform use of setAttribute/removeAttribute 2023-11-09 01:02:14 +01:00
schlagmichdoch
55d85ea7fb fix localization of html data attributes 2023-11-09 01:02:14 +01:00
schlagmichdoch
3439e7f6d4 Decrease redundancy by changing the way the websocket fallback is included; Adding new env var SIGNALING_SERVER to host client files but use another server for signaling. 2023-11-09 01:02:03 +01:00
schlagmichdoch
cb72edef20 Modularize server into multiple files 2023-11-09 01:00:07 +01:00
schlagmichdoch
d9270a5560 Try to beautify code by adding line breaks 2023-11-09 00:59:55 +01:00
schlagmichdoch
c068a2e329 Fix missing async in Notification class; Fix too many arguments for window.open function 2023-11-02 02:57:20 +01:00
schlagmichdoch
d388f7e3cd Partly replace _ => with () => globally to conform with Googles JavaScript style guide if no parameters are expected in arrow functions 2023-11-02 02:57:20 +01:00
schlagmichdoch
d84c7d1f84 Tidy up Javascript files 2023-11-01 21:56:25 +01:00
schlagmichdoch
cb8d6448f5 Delay loading of saved displayName until after the websocket is open to display "Loading…" until then 2023-11-01 21:56:25 +01:00
schlagmichdoch
ddeafd1b46 Merge branch 'translate' to add Turkish translation 2023-10-31 08:19:07 +01:00
schlagmichdoch
f8e7213501 Enable Turkish translation 2023-10-31 08:18:23 +01:00
schlagmichdoch
201d30c664 Add new translations to websocket fallback version 2023-10-31 08:12:53 +01:00
schlagmichdoch
dc1e1625f9
Merge pull request #193 from weblate/weblate-pairdrop-pairdrop-spa
Completed Turkish translation
2023-10-31 08:11:37 +01:00
Mustafa Açık
e24a044bf1
Translated using Weblate (Turkish)
Currently translated at 100.0% (147 of 147 strings)

Translation: PairDrop/pairdrop-spa
Translate-URL: https://hosted.weblate.org/projects/pairdrop/pairdrop-spa/tr/
2023-10-30 06:15:37 +01:00
schlagmichdoch
1c79290ad6 - add guide to documentation and example files to repository to run coturn alongside PairDrop via Docker Compose
- enable TURN over TLS
- modified the .gitignore to ignore files with user-data
- should fix #105
- partly cherry-picked from #106

Co-authored-by: xundeenergie <xundeenergie@users.noreply.github.com>
2023-10-28 04:46:02 +02:00
schlagmichdoch
750f54301d Conform the use of docker images by implementing the use of environment variables for all options available to Docker images and start node on docker run automatically. 2023-10-28 03:46:31 +02:00
schlagmichdoch
b4e74c2dd1 fix QR-code background color on light theme 2023-10-24 17:57:21 +02:00
schlagmichdoch
86e0d97afb increase version to v1.9.4 2023-10-23 19:46:20 +02:00
schlagmichdoch
433373bad1 Do not inverse QR-code colors on dark mode to fix readability with some readers and the native camera app on Android (fixes #187) 2023-10-23 19:39:33 +02:00
schlagmichdoch
9a7e621af6 fix ws-fallback. Variable that indicates WebRTC support was always false 2023-10-23 19:30:13 +02:00
schlagmichdoch
46f33f894b increase version to v1.9.3 2023-10-20 20:24:53 +02:00
schlagmichdoch
84986e4eef try the generalized version of a language code before resorting to the default language (es-US -> es) 2023-10-20 19:27:15 +02:00
schlagmichdoch
dd31f375a4 increase version to v1.9.2 2023-10-20 17:44:58 +02:00
schlagmichdoch
71603fb871 Merge new translations added via Weblate 2023-10-20 17:41:28 +02:00
schlagmichdoch
2a599f6448 Add new translations to websocket fallback version 2023-10-20 17:41:11 +02:00
schlagmichdoch
9be9398dfa
Merge pull request #179 from weblate/weblate-pairdrop-pairdrop-spa
Translations update from Hosted Weblate
2023-10-20 17:36:07 +02:00
schlagmichdoch
881170af06 add forceFetch variable to service-worker.js for development 2023-10-20 17:32:16 +02:00
schlagmichdoch
28c7fcd7a2 fix header not showing on snapdrop-android app 2023-10-20 17:25:15 +02:00
kek
1ca7a201ee
Translated using Weblate (Russian)
Currently translated at 100.0% (147 of 147 strings)

Translation: PairDrop/pairdrop-spa
Translate-URL: https://hosted.weblate.org/projects/pairdrop/pairdrop-spa/ru/
2023-10-18 04:00:40 +00:00
awashingmachine
80892fa6f0
Translated using Weblate (Italian)
Currently translated at 100.0% (147 of 147 strings)

Translation: PairDrop/pairdrop-spa
Translate-URL: https://hosted.weblate.org/projects/pairdrop/pairdrop-spa/it/
2023-10-16 08:02:06 +00:00
Ian Perdiansah
d1be04f6ec
Translated using Weblate (Indonesian)
Currently translated at 100.0% (147 of 147 strings)

Translation: PairDrop/pairdrop-spa
Translate-URL: https://hosted.weblate.org/projects/pairdrop/pairdrop-spa/id/
2023-10-16 08:02:05 +00:00
mere
b9d2ff7a2a
Translated using Weblate (Romanian)
Currently translated at 100.0% (147 of 147 strings)

Translation: PairDrop/pairdrop-spa
Translate-URL: https://hosted.weblate.org/projects/pairdrop/pairdrop-spa/ro/
2023-10-16 08:02:04 +00:00
schlagmichdoch
5b2bebcdee fix modes for preload link and fetching request do not match 2023-10-13 23:07:35 +02:00
schlagmichdoch
13d5c01935 increase version to v1.9.1 2023-10-13 18:49:19 +02:00
schlagmichdoch
787cd8dab5 Include header buttons installation and edit-paired-devices to evaluation before fading in header 2023-10-13 18:46:39 +02:00
schlagmichdoch
2131307fc6 Fix offline capability: Cache first -> fetch from network second. From now on, updates are only possible by increasing cacheVersion 2023-10-13 18:46:22 +02:00
RintanBroadleaf
0c2b9df8ee
Translated using Weblate (Japanese)
Currently translated at 100.0% (147 of 147 strings)

Translation: PairDrop/pairdrop-spa
Translate-URL: https://hosted.weblate.org/projects/pairdrop/pairdrop-spa/ja/
2023-10-13 18:01:23 +02:00
gallegonovato
1a8bcd1b19
Translated using Weblate (Spanish)
Currently translated at 100.0% (147 of 147 strings)

Translation: PairDrop/pairdrop-spa
Translate-URL: https://hosted.weblate.org/projects/pairdrop/pairdrop-spa/es/
2023-10-13 18:01:23 +02:00
Eric
00e919d132
Translated using Weblate (Chinese (Simplified))
Currently translated at 100.0% (147 of 147 strings)

Translation: PairDrop/pairdrop-spa
Translate-URL: https://hosted.weblate.org/projects/pairdrop/pairdrop-spa/zh_Hans/
2023-10-13 18:01:22 +02:00
schlagmichdoch
9eeb710deb
Translated using Weblate (German)
Currently translated at 100.0% (147 of 147 strings)

Translation: PairDrop/pairdrop-spa
Translate-URL: https://hosted.weblate.org/projects/pairdrop/pairdrop-spa/de/
2023-10-13 18:01:22 +02:00
schlagmichdoch
3506524041
Translated using Weblate (English)
Currently translated at 100.0% (147 of 147 strings)

Translation: PairDrop/pairdrop-spa
Translate-URL: https://hosted.weblate.org/projects/pairdrop/pairdrop-spa/en/
2023-10-13 18:01:22 +02:00
schlagmichdoch
8eb6e5bfab increase version to v1.9.0 2023-10-12 13:27:41 +02:00
schlagmichdoch
bb1468fa42 Implement click on QR-code to copy room or pair link (#174) 2023-10-12 13:20:58 +02:00
schlagmichdoch
a32b310bf0 add default English translation file as preload link 2023-10-12 04:27:59 +02:00
schlagmichdoch
ed2f1b0c61 Speed up initial load while still preventing css layout shift; Tidy up ui.js 2023-10-12 04:27:56 +02:00
schlagmichdoch
2578803a78 Fix header button margin on ltr languages 2023-10-12 03:42:48 +02:00
schlagmichdoch
e367ca9f78 Remove css nesting to support devices with iOS 16.4 and older and other browsers (https://caniuse.com/css-nesting) 2023-10-12 03:42:48 +02:00
schlagmichdoch
684fe7142d Make "Connecting..." toast persistent until connection is established 2023-10-12 03:42:48 +02:00
schlagmichdoch
4e00e5b358 Add notifications-permissions-error to translations 2023-10-12 01:53:31 +02:00
dependabot[bot]
ca8a5de47e Bump express-rate-limit from 7.1.0 to 7.1.1
Bumps [express-rate-limit](https://github.com/express-rate-limit/express-rate-limit) from 7.1.0 to 7.1.1.
- [Release notes](https://github.com/express-rate-limit/express-rate-limit/releases)
- [Changelog](https://github.com/express-rate-limit/express-rate-limit/blob/main/changelog.md)
- [Commits](https://github.com/express-rate-limit/express-rate-limit/compare/v7.1.0...v7.1.1)

---
updated-dependencies:
- dependency-name: express-rate-limit
  dependency-type: direct:production
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>
2023-10-11 23:31:18 +02:00
schlagmichdoch
ceec9c5f49 Revert incorrect changes when removing all strings from index.html 2023-10-11 23:31:18 +02:00
schlagmichdoch
81d85d0cc6 Add title of the send message text field to translations 2023-10-11 23:31:18 +02:00
schlagmichdoch
cd669b13d9 Fix display name not being editable on some older iOS devices (#163) 2023-10-11 23:31:18 +02:00
schlagmichdoch
38a80d2d34 Revert "fix textarea for sending messages is not editable on some iOS devices (#163)"
This reverts commit 1669fe7d75.
2023-10-11 23:31:18 +02:00
schlagmichdoch
d46f57d8ec Add translation files to PWA offline cache (#164) 2023-10-11 23:31:18 +02:00
schlagmichdoch
f75e6e85b2 Redraw background when language is changed 2023-10-11 23:31:18 +02:00
schlagmichdoch
7a299a5c98 Make Set Language Dialog properly scrollable on mobile devices by using the styling of Pair Device and Public Room Dialogs. 2023-10-11 23:28:56 +02:00
schlagmichdoch
4854c816a4 Enable Arabic, Dutch, Italian, Japanese and Spanish translations 2023-10-11 18:04:00 +02:00
schlagmichdoch
117a4d3eb9 adjustments to add right-to-left language 2023-10-11 18:04:00 +02:00
schlagmichdoch
8d0e560b1d Add new translations to websocket fallback version 2023-10-11 18:04:00 +02:00
schlagmichdoch
671081b86d Translated using Weblate (Japanese)
Currently translated at 100.0% (141 of 141 strings)

Translation: PairDrop/pairdrop-spa
Translate-URL: https://hosted.weblate.org/projects/pairdrop/pairdrop-spa/ja/
2023-10-11 18:04:00 +02:00
RintanBroadleaf
c677ac7ebe Translated using Weblate (Japanese)
Currently translated at 100.0% (141 of 141 strings)

Translation: PairDrop/pairdrop-spa
Translate-URL: https://hosted.weblate.org/projects/pairdrop/pairdrop-spa/ja/
2023-10-11 18:04:00 +02:00
awashingmachine
4722432209 Translated using Weblate (Italian)
Currently translated at 100.0% (141 of 141 strings)

Translation: PairDrop/pairdrop-spa
Translate-URL: https://hosted.weblate.org/projects/pairdrop/pairdrop-spa/it/
2023-10-11 18:04:00 +02:00
schlagmichdoch
3366fde1fe Added translation using Weblate (Japanese) 2023-10-11 18:04:00 +02:00
awashingmachine
72071c3780 Translated using Weblate (Italian)
Currently translated at 37.5% (53 of 141 strings)

Translation: PairDrop/pairdrop-spa
Translate-URL: https://hosted.weblate.org/projects/pairdrop/pairdrop-spa/it/
2023-10-11 18:04:00 +02:00
Éric Gaspar
b0265efa03 Translated using Weblate (French)
Currently translated at 100.0% (141 of 141 strings)

Translation: PairDrop/pairdrop-spa
Translate-URL: https://hosted.weblate.org/projects/pairdrop/pairdrop-spa/fr/
2023-10-11 18:04:00 +02:00
AkkoYK
97100ac051 Translated using Weblate (Chinese (Simplified))
Currently translated at 100.0% (141 of 141 strings)

Translation: PairDrop/pairdrop-spa
Translate-URL: https://hosted.weblate.org/projects/pairdrop/pairdrop-spa/zh_Hans/
2023-10-11 18:04:00 +02:00
schlagmichdoch
1cce04664e Added translation using Weblate (Italian) 2023-10-11 18:04:00 +02:00
Arne Cuperus
aadda018a1 Translated using Weblate (Dutch)
Currently translated at 100.0% (141 of 141 strings)

Translation: PairDrop/pairdrop-spa
Translate-URL: https://hosted.weblate.org/projects/pairdrop/pairdrop-spa/nl/
2023-10-11 18:04:00 +02:00
schlagmichdoch
32aa74c1c8 Translated using Weblate (Arabic)
Currently translated at 100.0% (141 of 141 strings)

Translation: PairDrop/pairdrop-spa
Translate-URL: https://hosted.weblate.org/projects/pairdrop/pairdrop-spa/ar/
2023-10-11 18:04:00 +02:00
Ian Perdiansah
414048e8a1 Translated using Weblate (Indonesian)
Currently translated at 100.0% (141 of 141 strings)

Translation: PairDrop/pairdrop-spa
Translate-URL: https://hosted.weblate.org/projects/pairdrop/pairdrop-spa/id/
2023-10-11 18:04:00 +02:00
schlagmichdoch
9d173d7a2c Translated using Weblate (Indonesian)
Currently translated at 100.0% (141 of 141 strings)

Translation: PairDrop/pairdrop-spa
Translate-URL: https://hosted.weblate.org/projects/pairdrop/pairdrop-spa/id/
2023-10-11 18:03:59 +02:00
schlagmichdoch
9c2a076f2b Translated using Weblate (Romanian)
Currently translated at 97.8% (138 of 141 strings)

Translation: PairDrop/pairdrop-spa
Translate-URL: https://hosted.weblate.org/projects/pairdrop/pairdrop-spa/ro/
2023-10-11 18:03:59 +02:00
kek
67f6580d70 Translated using Weblate (Russian)
Currently translated at 100.0% (141 of 141 strings)

Translation: PairDrop/pairdrop-spa
Translate-URL: https://hosted.weblate.org/projects/pairdrop/pairdrop-spa/ru/
2023-10-11 18:03:59 +02:00
schlagmichdoch
52e6ae9134 Translated using Weblate (German)
Currently translated at 100.0% (141 of 141 strings)

Translation: PairDrop/pairdrop-spa
Translate-URL: https://hosted.weblate.org/projects/pairdrop/pairdrop-spa/de/
2023-10-11 18:03:59 +02:00
Arne Cuperus
e9664bed76 Translated using Weblate (Dutch)
Currently translated at 100.0% (141 of 141 strings)

Translation: PairDrop/pairdrop-spa
Translate-URL: https://hosted.weblate.org/projects/pairdrop/pairdrop-spa/nl/
2023-10-11 18:03:59 +02:00
schlagmichdoch
5b408bc6a0 Translated using Weblate (Spanish)
Currently translated at 100.0% (141 of 141 strings)

Translation: PairDrop/pairdrop-spa
Translate-URL: https://hosted.weblate.org/projects/pairdrop/pairdrop-spa/es/
2023-10-11 18:03:59 +02:00
schlagmichdoch
b9476975dc Translated using Weblate (Dutch)
Currently translated at 94.3% (133 of 141 strings)

Translation: PairDrop/pairdrop-spa
Translate-URL: https://hosted.weblate.org/projects/pairdrop/pairdrop-spa/nl/
2023-10-11 18:03:59 +02:00
Arne Cuperus
efd0b6f34f Translated using Weblate (Dutch)
Currently translated at 94.3% (133 of 141 strings)

Translation: PairDrop/pairdrop-spa
Translate-URL: https://hosted.weblate.org/projects/pairdrop/pairdrop-spa/nl/
2023-10-11 18:03:59 +02:00
schlagmichdoch
866a1c4100 Translated using Weblate (French)
Currently translated at 100.0% (141 of 141 strings)

Translation: PairDrop/pairdrop-spa
Translate-URL: https://hosted.weblate.org/projects/pairdrop/pairdrop-spa/fr/
2023-10-11 18:03:59 +02:00
schlagmichdoch
a4b905ba14 Translated using Weblate (Chinese (Simplified))
Currently translated at 98.5% (139 of 141 strings)

Translation: PairDrop/pairdrop-spa
Translate-URL: https://hosted.weblate.org/projects/pairdrop/pairdrop-spa/zh_Hans/
2023-10-11 18:03:59 +02:00
schlagmichdoch
55258d0f93 Translated using Weblate (Russian)
Currently translated at 97.8% (138 of 141 strings)

Translation: PairDrop/pairdrop-spa
Translate-URL: https://hosted.weblate.org/projects/pairdrop/pairdrop-spa/ru/
2023-10-11 18:03:59 +02:00
schlagmichdoch
784c1e88db Translated using Weblate (German)
Currently translated at 100.0% (141 of 141 strings)

Translation: PairDrop/pairdrop-spa
Translate-URL: https://hosted.weblate.org/projects/pairdrop/pairdrop-spa/de/
2023-10-11 18:03:59 +02:00
schlagmichdoch
69d28ef158 Translated using Weblate (English)
Currently translated at 100.0% (141 of 141 strings)

Translation: PairDrop/pairdrop-spa
Translate-URL: https://hosted.weblate.org/projects/pairdrop/pairdrop-spa/en/
2023-10-11 18:03:59 +02:00
schlagmichdoch
22cf10da0a Translated using Weblate (Spanish)
Currently translated at 2.8% (4 of 141 strings)

Translation: PairDrop/pairdrop-spa
Translate-URL: https://hosted.weblate.org/projects/pairdrop/pairdrop-spa/es/
2023-10-11 18:03:59 +02:00
Arne Cuperus
31f1abe8a0 Translated using Weblate (Dutch)
Currently translated at 100.0% (141 of 141 strings)

Translation: PairDrop/pairdrop-spa
Translate-URL: https://hosted.weblate.org/projects/pairdrop/pairdrop-spa/nl/
2023-10-11 18:03:59 +02:00
schlagmichdoch
5e91bd84dc Translated using Weblate (French)
Currently translated at 100.0% (141 of 141 strings)

Translation: PairDrop/pairdrop-spa
Translate-URL: https://hosted.weblate.org/projects/pairdrop/pairdrop-spa/fr/
2023-10-11 18:03:59 +02:00
schlagmichdoch
aec3d358d5 Translated using Weblate (Arabic)
Currently translated at 97.8% (138 of 141 strings)

Translation: PairDrop/pairdrop-spa
Translate-URL: https://hosted.weblate.org/projects/pairdrop/pairdrop-spa/ar/
2023-10-11 18:03:59 +02:00
bsam bu salh
dc07b04b45 Translated using Weblate (Arabic)
Currently translated at 97.8% (138 of 141 strings)

Translation: PairDrop/pairdrop-spa
Translate-URL: https://hosted.weblate.org/projects/pairdrop/pairdrop-spa/ar/
2023-10-11 18:03:59 +02:00
schlagmichdoch
08e3055917 Translated using Weblate (Norwegian Bokmål)
Currently translated at 68.7% (97 of 141 strings)

Translation: PairDrop/pairdrop-spa
Translate-URL: https://hosted.weblate.org/projects/pairdrop/pairdrop-spa/nb_NO/
2023-10-11 18:03:59 +02:00
schlagmichdoch
88d6efc5da Translated using Weblate (German)
Currently translated at 100.0% (141 of 141 strings)

Translation: PairDrop/pairdrop-spa
Translate-URL: https://hosted.weblate.org/projects/pairdrop/pairdrop-spa/de/
2023-10-11 18:03:59 +02:00
schlagmichdoch
bfa4662079 Translated using Weblate (English)
Currently translated at 100.0% (141 of 141 strings)

Translation: PairDrop/pairdrop-spa
Translate-URL: https://hosted.weblate.org/projects/pairdrop/pairdrop-spa/en/
2023-10-11 18:03:59 +02:00
schlagmichdoch
b1252bd184 Added translation using Weblate (Spanish) 2023-10-11 18:03:59 +02:00
schlagmichdoch
bd5a2cd862 Added translation using Weblate (Dutch) 2023-10-11 18:03:59 +02:00
Mustafa Hamed Kathem
86b08cd93f Translated using Weblate (Arabic)
Currently translated at 99.2% (139 of 140 strings)

Translation: PairDrop/pairdrop-spa
Translate-URL: https://hosted.weblate.org/projects/pairdrop/pairdrop-spa/ar/
2023-10-11 18:03:59 +02:00
schlagmichdoch
1fc303dad2 Added translation using Weblate (Arabic) 2023-10-11 18:03:59 +02:00
schlagmichdoch
a2f2774ca0 remove all translated strings from index.html 2023-10-11 18:03:49 +02:00
schlagmichdoch
cffc2a834f increase version to v1.8.3 2023-10-09 20:53:12 +02:00
dependabot[bot]
9f8acd6b6a Bump express-rate-limit from 7.0.1 to 7.1.0
Bumps [express-rate-limit](https://github.com/express-rate-limit/express-rate-limit) from 7.0.1 to 7.1.0.
- [Release notes](https://github.com/express-rate-limit/express-rate-limit/releases)
- [Changelog](https://github.com/express-rate-limit/express-rate-limit/blob/main/changelog.md)
- [Commits](https://github.com/express-rate-limit/express-rate-limit/compare/v7.0.1...v7.1.0)

---
updated-dependencies:
- dependency-name: express-rate-limit
  dependency-type: direct:production
  update-type: version-update:semver-minor
...

Signed-off-by: dependabot[bot] <support@github.com>
2023-10-09 20:51:21 +02:00
dependabot[bot]
60c699f3b2 Bump ws from 8.14.1 to 8.14.2
Bumps [ws](https://github.com/websockets/ws) from 8.14.1 to 8.14.2.
- [Release notes](https://github.com/websockets/ws/releases)
- [Commits](https://github.com/websockets/ws/compare/8.14.1...8.14.2)

---
updated-dependencies:
- dependency-name: ws
  dependency-type: direct:production
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>
2023-10-09 20:50:58 +02:00
schlagmichdoch
1669fe7d75 fix textarea for sending messages is not editable on some iOS devices (#163) 2023-10-09 19:16:21 +02:00
schlagmichdoch
3c1ef57740 prevent Cumulative Layout Shift by fading in elements after initial translation is loaded 2023-10-06 02:57:46 +02:00
schlagmichdoch
faa2030f0b
Merge pull request #166 from jimmyGALLAND/fix_dialog_transfert_request_title
fix dialog transfert request title
2023-10-03 23:12:08 +02:00
schlagmichdoch
34c5392a66
Merge pull request #165 from jimmyGALLAND/translate_fr
add french translate
2023-10-03 18:51:40 +02:00
Jimmy GALLAND
d082a885c4 add french translate
Co-authored-by: schlagmichdoch <schlagmichdoch@users.noreply.github.com>
2023-10-01 17:14:39 +02:00
Jimmy GALLAND
fd89aca219 fix transfer request dialog title
Co-authored-by: schlagmichdoch <schlagmichdoch@users.noreply.github.com>
2023-10-01 16:56:13 +02:00
schlagmichdoch
82a46ebb84 increase version to v1.8.2 2023-09-24 22:30:32 +02:00
schlagmichdoch
d7e25dc2d4 Activate Romanian and Indonesian translations 2023-09-22 02:07:45 +02:00
schlagmichdoch
eeccf78fa6 Add new translations to websocket fallback version 2023-09-22 01:54:55 +02:00
schlagmichdoch
d8043bd4e5
Merge pull request #159 from weblate/weblate-pairdrop-pairdrop-spa
Translations update from Hosted Weblate
2023-09-22 01:52:20 +02:00
Ian Perdiansah
e6b10bc9cb
Translated using Weblate (Indonesian)
Currently translated at 100.0% (140 of 140 strings)

Translation: PairDrop/pairdrop-spa
Translate-URL: https://hosted.weblate.org/projects/pairdrop/pairdrop-spa/id/
2023-09-21 20:22:24 +02:00
mere
ab4ac5c217
Translated using Weblate (Romanian)
Currently translated at 100.0% (140 of 140 strings)

Translation: PairDrop/pairdrop-spa
Translate-URL: https://hosted.weblate.org/projects/pairdrop/pairdrop-spa/ro/
2023-09-21 20:22:23 +02:00
schlagmichdoch
c3c3e2685f
Added translation using Weblate (Indonesian) 2023-09-21 14:26:24 +02:00
mere
a120d7c1fc
Translated using Weblate (Romanian)
Currently translated at 100.0% (140 of 140 strings)

Translation: PairDrop/pairdrop-spa
Translate-URL: https://hosted.weblate.org/projects/pairdrop/pairdrop-spa/ro/
2023-09-20 21:22:52 +02:00
Jiacheng Hou
ce9748fd0e
Translated using Weblate (Chinese (Simplified))
Currently translated at 100.0% (140 of 140 strings)

Translation: PairDrop/pairdrop-spa
Translate-URL: https://hosted.weblate.org/projects/pairdrop/pairdrop-spa/zh_Hans/
2023-09-20 21:22:51 +02:00
kek
d4ff69d215
Translated using Weblate (Russian)
Currently translated at 100.0% (140 of 140 strings)

Translation: PairDrop/pairdrop-spa
Translate-URL: https://hosted.weblate.org/projects/pairdrop/pairdrop-spa/ru/
2023-09-20 21:22:51 +02:00
schlagmichdoch
fdf9457a0d
Translated using Weblate (German)
Currently translated at 100.0% (140 of 140 strings)

Translation: PairDrop/pairdrop-spa
Translate-URL: https://hosted.weblate.org/projects/pairdrop/pairdrop-spa/de/
2023-09-20 21:22:51 +02:00
schlagmichdoch
b537541788
Added translation using Weblate (Romanian) 2023-09-20 16:22:25 +02:00
kek
49254bcca9
Translated using Weblate (Russian)
Currently translated at 100.0% (139 of 139 strings)

Translation: PairDrop/pairdrop-spa
Translate-URL: https://hosted.weblate.org/projects/pairdrop/pairdrop-spa/ru/
2023-09-20 02:14:10 +02:00
schlagmichdoch
9a7ee95d2f Add missing strings form public room dialog to translation files - second try 2023-09-20 02:13:22 +02:00
schlagmichdoch
e0548102d3 increase version to v1.8.1 2023-09-19 18:05:54 +02:00
schlagmichdoch
d7626822fa Merge missing translations from branch 'translate' 2023-09-19 18:03:13 +02:00
schlagmichdoch
426b75f336 Add new translations to websocket fallback version 2023-09-19 18:02:13 +02:00
schlagmichdoch
f63aebbcb4 Translated using Weblate (German)
Currently translated at 100.0% (139 of 139 strings)

Translation: PairDrop/pairdrop-spa
Translate-URL: https://hosted.weblate.org/projects/pairdrop/pairdrop-spa/de/
2023-09-19 17:58:32 +02:00
schlagmichdoch
5e74f515a7 Translated using Weblate (English)
Currently translated at 100.0% (139 of 139 strings)

Translation: PairDrop/pairdrop-spa
Translate-URL: https://hosted.weblate.org/projects/pairdrop/pairdrop-spa/en/
2023-09-19 17:58:32 +02:00
schlagmichdoch
e807c3959a fix #157: catch EADDRINUSE to prevent endless restarts if the port is already in use 2023-09-19 17:53:21 +02:00
schlagmichdoch
d77ccdf233 fix TypeError 2023-09-19 17:50:16 +02:00
schlagmichdoch
d45c6b5bea increase margin for hr-note ("OR") on dialogs 2023-09-19 00:24:32 +02:00
schlagmichdoch
5625bf6f93 Add missing strings form public room dialog to translation files 2023-09-19 00:23:19 +02:00
schlagmichdoch
efec6eaa1a increase version to v1.8.0 2023-09-18 22:52:48 +02:00
schlagmichdoch
2abbfcea75 Fix spelling in German language files 2023-09-18 22:52:10 +02:00
schlagmichdoch
b7abc1d174
Merge pull request #146 from schlagmichdoch/dependabot/npm_and_yarn/ua-parser-js-1.0.36
Bump ua-parser-js from 1.0.35 to 1.0.36
2023-09-18 22:40:33 +02:00
dependabot[bot]
71d92bca71
Bump ua-parser-js from 1.0.35 to 1.0.36
Bumps [ua-parser-js](https://github.com/faisalman/ua-parser-js) from 1.0.35 to 1.0.36.
- [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/commits)

---
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-09-18 20:39:57 +00:00
schlagmichdoch
b4f9f9b048
Merge pull request #145 from schlagmichdoch/dependabot/npm_and_yarn/ws-8.14.1
Bump ws from 8.13.0 to 8.14.1
2023-09-18 22:39:06 +02:00
schlagmichdoch
6b98d84697
Merge pull request #155 from schlagmichdoch/dependabot/npm_and_yarn/express-rate-limit-7.0.1
Bump express-rate-limit from 6.9.0 to 7.0.1
2023-09-18 22:38:56 +02:00
schlagmichdoch
c305996799
Merge pull request #151 from schlagmichdoch/translate
Add two major features: Translation #35 & Temporary Public Room  #55
2023-09-18 22:38:24 +02:00
schlagmichdoch
684e43a352 prevent autofocus of dialog elements on mobile 2023-09-18 22:32:21 +02:00
schlagmichdoch
fc190dd121 fix discovery-wrapper 2023-09-18 22:13:30 +02:00
schlagmichdoch
6c07dc3678 Fix translation and design of base64dialog 2023-09-18 22:03:18 +02:00
schlagmichdoch
dbe3381e7d Fix concatenation of translated strings in paste mode 2023-09-18 21:27:56 +02:00
schlagmichdoch
0bae7c84bd Enable German translation 2023-09-18 21:27:48 +02:00
schlagmichdoch
ddd5c7df8c Remove deleted translation strings and-by and discovery-everyone from all translation files 2023-09-18 18:17:16 +02:00
schlagmichdoch
33a6a1b8dc Add new translations to websocket fallback version 2023-09-18 18:11:31 +02:00
schlagmichdoch
4c1de16eb6
Merge pull request #139 from weblate/weblate-pairdrop-pairdrop-spa
Translations update from Hosted Weblate
2023-09-18 18:08:32 +02:00
dependabot[bot]
00b95ed16a
Bump express-rate-limit from 6.9.0 to 7.0.1
Bumps [express-rate-limit](https://github.com/express-rate-limit/express-rate-limit) from 6.9.0 to 7.0.1.
- [Release notes](https://github.com/express-rate-limit/express-rate-limit/releases)
- [Changelog](https://github.com/express-rate-limit/express-rate-limit/blob/main/changelog.md)
- [Commits](https://github.com/express-rate-limit/express-rate-limit/compare/v6.9.0...v7.0.1)

---
updated-dependencies:
- dependency-name: express-rate-limit
  dependency-type: direct:production
  update-type: version-update:semver-major
...

Signed-off-by: dependabot[bot] <support@github.com>
2023-09-18 04:35:31 +00:00
AkkoYK
e7e3221e4c
Translated using Weblate (Chinese (Simplified))
Currently translated at 100.0% (136 of 136 strings)

Translation: PairDrop/pairdrop-spa
Translate-URL: https://hosted.weblate.org/projects/pairdrop/pairdrop-spa/zh_Hans/
2023-09-17 13:59:53 +00:00
kek
c7f4166f0b
Translated using Weblate (Russian)
Currently translated at 100.0% (136 of 136 strings)

Translation: PairDrop/pairdrop-spa
Translate-URL: https://hosted.weblate.org/projects/pairdrop/pairdrop-spa/ru/
2023-09-17 13:59:53 +00:00
schlagmichdoch
292a674482
Translated using Weblate (German)
Currently translated at 100.0% (136 of 136 strings)

Translation: PairDrop/pairdrop-spa
Translate-URL: https://hosted.weblate.org/projects/pairdrop/pairdrop-spa/de/
2023-09-17 13:59:52 +00:00
schlagmichdoch
95231d0507
Translated using Weblate (German)
Currently translated at 100.0% (136 of 136 strings)

Translation: PairDrop/pairdrop-spa
Translate-URL: https://hosted.weblate.org/projects/pairdrop/pairdrop-spa/de/
2023-09-15 12:39:40 +02:00
schlagmichdoch
c7263c0aa4
Translated using Weblate (Norwegian Bokmål)
Currently translated at 71.3% (97 of 136 strings)

Translation: PairDrop/pairdrop-spa
Translate-URL: https://hosted.weblate.org/projects/pairdrop/pairdrop-spa/nb_NO/
2023-09-15 12:39:40 +02:00
schlagmichdoch
09583ae6c8
Translated using Weblate (German)
Currently translated at 100.0% (136 of 136 strings)

Translation: PairDrop/pairdrop-spa
Translate-URL: https://hosted.weblate.org/projects/pairdrop/pairdrop-spa/de/
2023-09-15 12:39:40 +02:00
ann0see
b584b6adc1
Translated using Weblate (German)
Currently translated at 100.0% (136 of 136 strings)

Translation: PairDrop/pairdrop-spa
Translate-URL: https://hosted.weblate.org/projects/pairdrop/pairdrop-spa/de/
2023-09-15 12:39:40 +02:00
schlagmichdoch
3355351c98
Translated using Weblate (English)
Currently translated at 100.0% (136 of 136 strings)

Translation: PairDrop/pairdrop-spa
Translate-URL: https://hosted.weblate.org/projects/pairdrop/pairdrop-spa/en/
2023-09-15 12:39:40 +02:00
schlagmichdoch
3c7218e2d5
Translated using Weblate (Chinese (Simplified))
Currently translated at 83.7% (113 of 135 strings)

Translation: PairDrop/pairdrop-spa
Translate-URL: https://hosted.weblate.org/projects/pairdrop/pairdrop-spa/zh_Hans/
2023-09-15 12:39:40 +02:00
schlagmichdoch
8caec76ba0
Translated using Weblate (Norwegian Bokmål)
Currently translated at 69.6% (94 of 135 strings)

Translation: PairDrop/pairdrop-spa
Translate-URL: https://hosted.weblate.org/projects/pairdrop/pairdrop-spa/nb_NO/
2023-09-15 12:39:40 +02:00
schlagmichdoch
4ad54c6023
Translated using Weblate (Russian)
Currently translated at 83.7% (113 of 135 strings)

Translation: PairDrop/pairdrop-spa
Translate-URL: https://hosted.weblate.org/projects/pairdrop/pairdrop-spa/ru/
2023-09-15 12:39:40 +02:00
schlagmichdoch
0e9df8cc17
Translated using Weblate (German)
Currently translated at 85.9% (116 of 135 strings)

Translation: PairDrop/pairdrop-spa
Translate-URL: https://hosted.weblate.org/projects/pairdrop/pairdrop-spa/de/
2023-09-15 12:39:40 +02:00
schlagmichdoch
7e63994140
Translated using Weblate (English)
Currently translated at 100.0% (135 of 135 strings)

Translation: PairDrop/pairdrop-spa
Translate-URL: https://hosted.weblate.org/projects/pairdrop/pairdrop-spa/en/
2023-09-15 12:39:40 +02:00
ann0see
f92c7acdce
Translated using Weblate (German)
Currently translated at 98.4% (123 of 125 strings)

Translation: PairDrop/pairdrop-spa
Translate-URL: https://hosted.weblate.org/projects/pairdrop/pairdrop-spa/de/
2023-09-15 12:39:40 +02:00
schlagmichdoch
a51255b84a
Translated using Weblate (English)
Currently translated at 100.0% (125 of 125 strings)

Translation: PairDrop/pairdrop-spa
Translate-URL: https://hosted.weblate.org/projects/pairdrop/pairdrop-spa/en/
2023-09-15 12:39:40 +02:00
schlagmichdoch
2985bc0d08
Translated using Weblate (German)
Currently translated at 89.6% (112 of 125 strings)

Translation: PairDrop/pairdrop-spa
Translate-URL: https://hosted.weblate.org/projects/pairdrop/pairdrop-spa/de/
2023-09-15 12:39:40 +02:00
ann0see
e34556bc74
Translated using Weblate (German)
Currently translated at 89.6% (112 of 125 strings)

Translation: PairDrop/pairdrop-spa
Translate-URL: https://hosted.weblate.org/projects/pairdrop/pairdrop-spa/de/
2023-09-15 12:39:40 +02:00
kek
16fd866445
Translated using Weblate (Russian)
Currently translated at 100.0% (122 of 122 strings)

Translation: PairDrop/pairdrop-spa
Translate-URL: https://hosted.weblate.org/projects/pairdrop/pairdrop-spa/ru/
2023-09-15 12:39:40 +02:00
ann0see
df734a4fc7
Translated using Weblate (German)
Currently translated at 67.2% (82 of 122 strings)

Translation: PairDrop/pairdrop-spa
Translate-URL: https://hosted.weblate.org/projects/pairdrop/pairdrop-spa/de/
2023-09-15 12:39:40 +02:00
ann0see
e9b1c51530
Translated using Weblate (German)
Currently translated at 19.6% (24 of 122 strings)

Translation: PairDrop/pairdrop-spa
Translate-URL: https://hosted.weblate.org/projects/pairdrop/pairdrop-spa/de/
2023-09-15 12:39:40 +02:00
Ettore Atalan
c7357e7ecc
Translated using Weblate (German)
Currently translated at 1.6% (2 of 122 strings)

Translation: PairDrop/pairdrop-spa
Translate-URL: https://hosted.weblate.org/projects/pairdrop/pairdrop-spa/de/
2023-09-15 12:39:40 +02:00
schlagmichdoch
446035d704
Deleted translation using Weblate (Chinese (Simplified, Singapore)) 2023-09-15 12:39:40 +02:00
schlagmichdoch
6492f84c4e
Added translation using Weblate (Chinese (Simplified, Singapore)) 2023-09-15 12:39:40 +02:00
schlagmichdoch
3f1477f24a Fix public room badge not translating correctly when switching languages 2023-09-14 20:23:04 +02:00
schlagmichdoch
a314b2c275 remove no longer needed css var --footer-height; Fix overlaying of websocket fallback notification 2023-09-14 19:03:43 +02:00
schlagmichdoch
3faa173dde Make "Unpair" and "auto-accept" translatable on the Edit Paired Devices Dialog 2023-09-14 18:15:07 +02:00
schlagmichdoch
8b30940056 Add translation and temporary public rooms to README 2023-09-14 17:27:51 +02:00
schlagmichdoch
de49af3bca apply all changes to ws-fallback 2023-09-14 15:45:40 +02:00
schlagmichdoch
8d2584fa69 implement temporary public rooms, tidy up index.js, rework UI dialogs and change colors slightly 2023-09-14 15:44:28 +02:00
schlagmichdoch
bd7b3c6d28 show warning to user if navigator.clipboard.writeText fails 2023-09-13 18:33:17 +02:00
schlagmichdoch
c71bf456e3 fix "and 2 other files" div not cleared properly 2023-09-13 18:33:17 +02:00
schlagmichdoch
6679ef7529 fix keepAliveTimers not correctly cleared on reconnect 2023-09-13 18:33:17 +02:00
schlagmichdoch
02911804cb add default values to Localization.getTranslation function 2023-09-13 18:33:17 +02:00
schlagmichdoch
d689fe28e5 add English language names next to native language names to language select dialog 2023-09-13 18:32:57 +02:00
dependabot[bot]
1c946fc78e
Bump ws from 8.13.0 to 8.14.1
Bumps [ws](https://github.com/websockets/ws) from 8.13.0 to 8.14.1.
- [Release notes](https://github.com/websockets/ws/releases)
- [Commits](https://github.com/websockets/ws/compare/8.13.0...8.14.1)

---
updated-dependencies:
- dependency-name: ws
  dependency-type: direct:production
  update-type: version-update:semver-minor
...

Signed-off-by: dependabot[bot] <support@github.com>
2023-09-11 04:32:13 +00:00
schlagmichdoch
17afa18d84 add translation selector and fix translation of data-attributes 2023-08-30 14:57:40 +02:00
schlagmichdoch
4510ba5164
Merge pull request #140 from meichthys/patch-1
Add alternate TURN server option to config notes
2023-08-29 19:03:00 +02:00
MeIchthys
d738258869
Add alternate TURN server option
Added note about using an alternate TURN server like OpenRelay.
2023-08-29 09:10:05 -04:00
schlagmichdoch
19f56a8499 enable Norwegian, Russian, and Chinese 2023-08-29 02:33:54 +02:00
schlagmichdoch
abc06fcc21 fix translation fallback for sparely translated languages when complete categories are missing 2023-08-29 02:33:12 +02:00
schlagmichdoch
c2a746d69c fix html attribute translation 2023-08-29 02:30:01 +02:00
schlagmichdoch
72f0aff60e copy lang files to ws_fallback version 2023-08-29 01:49:32 +02:00
schlagmichdoch
161bd2be84 rename language files to map language codes properly 2023-08-29 01:49:09 +02:00
schlagmichdoch
c36c8dae59 Merge branch 'master' into translate 2023-08-28 15:05:11 +02:00
schlagmichdoch
22bf1be2b7
Add TLS requirement to host-your-own.md 2023-08-28 13:41:12 +02:00
schlagmichdoch
6db844565e
Merge pull request #123 from comradekingu/patch-1
Documentation language reworked
2023-08-28 13:29:56 +02:00
Allan Nordhøy
efeff84320
"HEALTHCHECK" 2023-08-11 18:59:26 +00:00
schlagmichdoch
e0210b0307
Rename enhancement to enhancement.md 2023-08-11 13:21:10 +02:00
schlagmichdoch
f95181c057
Create enhancement issue template 2023-08-11 13:20:38 +02:00
schlagmichdoch
69f1688dfe
Update bug-report.md 2023-08-11 13:11:51 +02:00
schlagmichdoch
43824d0de2 increase version to v1.7.7 2023-08-10 17:09:51 +02:00
schlagmichdoch
2efb531765
Merge pull request #138
Bump express-rate-limit from 6.8.0 to 6.9.0
2023-08-10 17:06:22 +02:00
schlagmichdoch
d9686a6706
Merge pull request #137 from Zhongbing-Chen/master
revise the command line tool
2023-08-10 16:31:48 +02:00
dependabot[bot]
395c3e00a4
Bump express-rate-limit from 6.8.0 to 6.9.0
Bumps [express-rate-limit](https://github.com/express-rate-limit/express-rate-limit) from 6.8.0 to 6.9.0.
- [Release notes](https://github.com/express-rate-limit/express-rate-limit/releases)
- [Changelog](https://github.com/express-rate-limit/express-rate-limit/blob/main/changelog.md)
- [Commits](https://github.com/express-rate-limit/express-rate-limit/compare/v6.8.0...v6.9.0)

---
updated-dependencies:
- dependency-name: express-rate-limit
  dependency-type: direct:production
  update-type: version-update:semver-minor
...

Signed-off-by: dependabot[bot] <support@github.com>
2023-08-07 04:24:11 +00:00
zhongbing
8869c3c27e revise the command line tool 2023-08-06 00:47:01 +08:00
schlagmichdoch
30a1c72a0c Add Weblate and a mention of translations to the README 2023-07-30 17:56:07 +02:00
schlagmichdoch
3c56427bf7
Merge pull request #126 from weblate/weblate-pairdrop-pairdrop-spa
Translations update from Hosted Weblate
2023-07-30 17:49:55 +02:00
schlagmichdoch
d252900055
Merge branch 'translate' into weblate-pairdrop-pairdrop-spa 2023-07-30 17:48:50 +02:00
schlagmichdoch
da5038a51a include translations for about buttons and implement translation fallback if used translation is not complete 2023-07-30 17:42:46 +02:00
Kyle
b319fbe156
Translated using Weblate (Turkish)
Currently translated at 12.2% (15 of 122 strings)

Translation: PairDrop/pairdrop-spa
Translate-URL: https://hosted.weblate.org/projects/pairdrop/pairdrop-spa/tr/
2023-07-27 12:04:03 +02:00
schlagmichdoch
b07b8316ff
Merge pull request #129 from schlagmichdoch/dependabot/npm_and_yarn/express-rate-limit-6.8.0
Bump express-rate-limit from 6.7.0 to 6.8.0
2023-07-25 18:58:11 +02:00
schlagmichdoch
714608ce97
Added translation using Weblate (Turkish) 2023-07-25 18:56:56 +02:00
Allan Nordhøy
471278f7b0
Translated using Weblate (Norwegian Bokmål)
Currently translated at 81.9% (100 of 122 strings)

Translation: PairDrop/pairdrop-spa
Translate-URL: https://hosted.weblate.org/projects/pairdrop/pairdrop-spa/nb_NO/
2023-07-24 18:07:00 +02:00
dependabot[bot]
445a295404
Bump express-rate-limit from 6.7.0 to 6.8.0
Bumps [express-rate-limit](https://github.com/express-rate-limit/express-rate-limit) from 6.7.0 to 6.8.0.
- [Release notes](https://github.com/express-rate-limit/express-rate-limit/releases)
- [Changelog](https://github.com/express-rate-limit/express-rate-limit/blob/main/changelog.md)
- [Commits](https://github.com/express-rate-limit/express-rate-limit/compare/v6.7.0...v6.8.0)

---
updated-dependencies:
- dependency-name: express-rate-limit
  dependency-type: direct:production
  update-type: version-update:semver-minor
...

Signed-off-by: dependabot[bot] <support@github.com>
2023-07-24 04:58:27 +00:00
伍建兴
6d7c13775f
Translated using Weblate (Chinese (Simplified))
Currently translated at 100.0% (122 of 122 strings)

Translation: PairDrop/pairdrop-spa
Translate-URL: https://hosted.weblate.org/projects/pairdrop/pairdrop-spa/zh_Hans/
2023-07-21 05:09:24 +02:00
schlagmichdoch
dccc17400c
Added translation using Weblate (Chinese (Simplified)) 2023-07-19 10:50:01 +02:00
Allan Nordhøy
6563ec98b3
Bold button scheme 2023-07-08 13:26:48 +00:00
Allan Nordhøy
17a12baa2a
technical-documentation reworked 2023-07-08 13:24:42 +00:00
Allan Nordhøy
913b60b712
how-to reworked 2023-07-08 13:17:35 +00:00
Allan Nordhøy
9424f704bf
host-your-own reworked 2023-07-08 13:14:07 +00:00
Allan Nordhøy
044d7aa20d
docker-swarm-usage reworked 2023-07-08 12:59:58 +00:00
Allan Nordhøy
9b71d93dd3
Translated using Weblate (Norwegian Bokmål)
Currently translated at 80.3% (98 of 122 strings)

Translation: PairDrop/pairdrop-spa
Translate-URL: https://hosted.weblate.org/projects/pairdrop/pairdrop-spa/nb_NO/
2023-07-08 02:29:41 +02:00
kek
65ec416646
Translated using Weblate (Russian)
Currently translated at 100.0% (122 of 122 strings)

Translation: PairDrop/pairdrop-spa
Translate-URL: https://hosted.weblate.org/projects/pairdrop/pairdrop-spa/ru/
2023-07-08 02:29:40 +02:00
Allan Nordhøy
99faa6bbfd
Translated using Weblate (English)
Currently translated at 100.0% (122 of 122 strings)

Translation: PairDrop/pairdrop-spa
Translate-URL: https://hosted.weblate.org/projects/pairdrop/pairdrop-spa/en/
2023-07-08 02:29:40 +02:00
Allan Nordhøy
525fd295b7
Added translation using Weblate (Norwegian Bokmål) 2023-07-07 16:08:09 +02:00
kek
410936dcd8
Translated using Weblate (Russian)
Currently translated at 100.0% (118 of 118 strings)

Translation: PairDrop/pairdrop-spa
Translate-URL: https://hosted.weblate.org/projects/pairdrop/pairdrop-spa/ru/
2023-07-07 15:18:54 +02:00
schlagmichdoch
1d333c850c
Added translation using Weblate (Russian) 2023-07-07 15:18:54 +02:00
schlagmichdoch
ebde466019
Added translation using Weblate (German) 2023-07-07 15:18:54 +02:00
schlagmichdoch
ba46befde4 include translations for about buttons and implement translation fallback if used translation is not complete 2023-07-07 15:17:42 +02:00
schlagmichdoch
f50d7438b6 implement localization 2023-07-06 21:34:21 +02:00
Allan Nordhøy
2d0ea9a2f1
Update FAQ reworked 2023-06-21 22:55:42 +00:00
schlagmichdoch
29b91cb17a increase version to v1.7.6 2023-06-01 01:51:51 +02:00
schlagmichdoch
26bf4d6dc3 ensure that otherPeers never receive peer-left after peer-joined on reconnect by leaving room before rejoining it 2023-06-01 01:49:07 +02:00
schlagmichdoch
f195c686e7 increase version to v1.7.5 2023-06-01 01:32:06 +02:00
schlagmichdoch
3505f161c6 strip 'NO-BREAK SPACE' (U+00A0) of received text as some browsers seem to add them when pasting text 2023-06-01 01:29:00 +02:00
schlagmichdoch
3e2368c0c9 stabilize connection on reconnect by terminating websocket only on timeout and not always when peer leaves its ip room 2023-06-01 01:26:53 +02:00
schlagmichdoch
d36cd3524c Fix clearBrowserHistory: url should not always be replaced by "/" as PairDrop might not always be hosted at domain root 2023-05-30 02:34:50 +02:00
schlagmichdoch
a3a8228327 increase version to v1.7.4 2023-05-26 20:37:38 +02:00
schlagmichdoch
520b772bc8 fix #112 and differentiate between textContent and innerText 2023-05-26 20:36:12 +02:00
schlagmichdoch
27bf0fa74f fix #113 2023-05-26 20:36:12 +02:00
schlagmichdoch
e9f3c39f38
Merge pull request #114 from fm-sys/patch-1
Add 'files-sent' event used by 'Snapdrop & PairDrop for Android' app to support vibrations
2023-05-26 20:35:54 +02:00
fm-sys
58b7f6bb7c
Add 'files-sent' event 2023-05-26 09:52:17 +02:00
schlagmichdoch
b5987cf017 increase version to v1.7.3 2023-05-23 02:45:29 +02:00
schlagmichdoch
4433e1c58f add version number to about page 2023-05-23 02:44:25 +02:00
schlagmichdoch
b106d90b64 Fix ReferenceError: ipv6_lcl is not defined 2023-05-23 02:43:17 +02:00
schlagmichdoch
c9e1c2504a
Merge pull request #110 from luckman212/luckman212-patch-1
Add new env var `IPV6_LOCALIZE` to enable auto discovery for IPv6 addresses
2023-05-23 01:53:23 +02:00
luckman212
32e909b8c2
fixes for https://github.com/schlagmichdoch/PairDrop/issues/69
(squashed, docs updated, IPV6_LOCALIZE input validation)
2023-05-19 12:18:20 -04:00
schlagmichdoch
a444be226f Fix canvas selector 2023-05-16 19:15:47 +02:00
schlagmichdoch
df778ba42c Speed up canvas by removing fade-in animation 2023-05-16 19:09:59 +02:00
schlagmichdoch
8a17b82fa4 Fix _textInputEmpty() for Chromium based browsers
Co-authored-by: luckman212 <1992842+luckman212@users.noreply.github.com>
2023-05-16 02:53:56 +02:00
schlagmichdoch
56eb29c91b increase version to v1.7.2 2023-05-16 02:35:03 +02:00
schlagmichdoch
6e4bda0adf Fix message sending via submit button.
Co-authored-by: luckman212 <1992842+luckman212@users.noreply.github.com>
2023-05-16 02:25:50 +02:00
Lopolin-LP
0baced640a
Fix About Background not filling up full viewport under certain circumstances (#109)
* Fix About Background Not filling up full viewport under certain circumstances

It is now based on vw/vh instead of px. It can also easily be adjusted, mostly. There is no way it will not fill up the viewport.

* add fix for about bg size to websocket fallback too and tidy up

---------

Co-authored-by: schlagmichdoch <schlagmichdoch@users.noreply.github.com>
2023-05-16 01:50:12 +02:00
schlagmichdoch
3c2e73fc0c fix position of about background circle 2023-05-12 04:59:44 +02:00
schlagmichdoch
c629d7cd88 increase version to v1.7.1 2023-05-12 01:41:10 +02:00
schlagmichdoch
ba20c72026 fix error on empty roomSecrets 2023-05-12 01:16:37 +02:00
schlagmichdoch
347f9b87c0 fix check whether peer is same browser 2023-05-12 01:16:37 +02:00
schlagmichdoch
ae9909f596 fix notification "Key null invalidated" on cancel device pairing 2023-05-11 19:56:47 +02:00
schlagmichdoch
26c1878bb9 increase version to v1.7.0 2023-05-11 19:23:39 +02:00
schlagmichdoch
de0afce4ea
Merge pull request #107 from schlagmichdoch/add_auto_accept
Add auto accept functionality via Edit Paired Devices Dialog + implement pair secret regeneration functionality
2023-05-11 19:21:26 +02:00
schlagmichdoch
2a837eb195 add 'visbilitychange' event support for older browsers 2023-05-10 21:59:45 +02:00
schlagmichdoch
fdf20cfdd9 save roomSecret and notify user that the pairing is successful only after the corresponding pairPeer has joined. 2023-05-10 21:59:45 +02:00
schlagmichdoch
7606fb398b Fix: notify user that "Selected peer left." only if dialog is shown. 2023-05-10 21:59:45 +02:00
schlagmichdoch
8d640be3a2 increase roomSecret length to 264 chars and implement roomSecret regeneration functionality 2023-05-10 21:59:45 +02:00
schlagmichdoch
241ea4f988 implement auto_accept (#91) and manual unpairing via new Edit Paired Devices Dialog and a BrowserTabsConnector 2023-05-10 21:59:43 +02:00
schlagmichdoch
0ac3c5a11f remove debugging logs 2023-05-04 17:39:40 +02:00
schlagmichdoch
f39bfedf98 use sha3-512 hash instead of cyrb53 to authenticate peerIds on reconnect 2023-05-04 17:34:33 +02:00
schlagmichdoch
fafdbcc829 increase version to v1.6.3 2023-04-27 19:17:41 +02:00
schlagmichdoch
b9806d4327
Merge pull request #70 from schlagmichdoch/add_ip_debugging_flag
Add debug mode to enable debugging auto discovery
2023-04-27 18:17:27 +02:00
schlagmichdoch
fb08bdaf36 add environment variable DEBUG_MODE to docs 2023-04-27 18:14:45 +02:00
schlagmichdoch
5a363e90dd add debug mode to enable debugging auto discovery 2023-04-24 17:00:03 +02:00
schlagmichdoch
8f4ce63a0c increase version to v1.6.2 2023-04-20 22:04:57 +02:00
schlagmichdoch
b42c8a0b1a remove background animation in favor of speed and efficiency 2023-04-20 22:02:00 +02:00
schlagmichdoch
4c7bdd3a0f move robots.txt into correct folder 2023-04-20 21:57:31 +02:00
schlagmichdoch
3f72fa1160 remove fade-in from description (LCP) on page load 2023-04-20 21:57:24 +02:00
schlagmichdoch
5c3f5ece7d increase seo by adding an aria-label and removing 'user-scalable=no' 2023-04-20 21:57:01 +02:00
schlagmichdoch
8de899f124 increase version to v1.6.1 2023-04-19 21:16:43 +02:00
schlagmichdoch
87097e9cd4 fix header btn shadow styling 2023-04-19 21:15:03 +02:00
schlagmichdoch
b2fc6415da include example files to run an own TURN server via coturn or via docker-compose 2023-04-19 17:38:14 +02:00
schlagmichdoch
2d8bbd5a79 Change docs to include the usage of our own TURN server instead of the TURN server of the Open Relay Project 2023-04-19 16:50:22 +02:00
schlagmichdoch
cae3bb7c7b
Add server costs to README.md 2023-04-18 13:06:21 +02:00
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
schlagmichdoch
f6ad85a744 increase version to v1.5.3 2023-03-29 16:24:24 +02:00
schlagmichdoch
d50480b2f8
Merge pull request #94 from schlagmichdoch/add_theme_menu
Add theme menu to toggle between auto, light and dark mode.
2023-03-29 16:22:42 +02:00
schlagmichdoch
ac1e88b6a0 Add possibility to reset theme to auto 2023-03-29 01:39:45 +02:00
schlagmichdoch
0fe36e132c
Remove the "under development" message from the share-menu section 2023-03-28 20:24:46 +02:00
schlagmichdoch
ab08091f5d increase version to v1.5.2 2023-03-28 20:00:05 +02:00
schlagmichdoch
19a78a5239
Merge pull request #72 from schlagmichdoch/fix_share_target
WIP: Fix share target API
2023-03-28 19:58:34 +02:00
schlagmichdoch
d0b2c81582 Tidy up code 2023-03-28 19:07:33 +02:00
Daniel Pham
10a0aaf896 Fix passed arguments for sharing text 2023-03-28 19:00:15 +02:00
Daniel Pham
34ebd60304 Update service worker
- files array now matches manifest files name
- fixed handling fetch redirect
2023-03-28 19:00:15 +02:00
schlagmichdoch
251df2fbff try to fix share target api 2023-03-28 19:00:05 +02:00
schlagmichdoch
1bb8a63eed increase version to v1.5.1 2023-03-27 02:31:56 +02:00
schlagmichdoch
7d581ca858
Merge pull request #92 from schlagmichdoch/optimize_animation
Optimize background animation to drastically reduce CPU/GPU resources
2023-03-27 02:19:19 +02:00
schlagmichdoch
dcc4e8b747 Optimize background animation drastically by using offscreen canvases to reuse frames. Rewrite animate function to prevent it from being called multiple times 2023-03-27 02:17:36 +02:00
schlagmichdoch
ce549adf22
Merge pull request #82 from kgncloud/patch-1
Add Healthcheck to Dockerfile
2023-03-25 04:09:46 +01:00
schlagmichdoch
bdb39a1d2c add docker-swarm-usage.md reference to host-your-own.md and tidy up docker-swarm-usage.md 2023-03-25 04:08:11 +01:00
schlagmichdoch
195dfd0bb3 Add https requirement for PWAs to faq.md 2023-03-25 03:37:15 +01:00
Kaindl Network
680ed81bd7
Create 2023-03-18 23:52:33 +00:00
schlagmichdoch
f120677393 increase version to v1.5.0 2023-03-14 15:52:15 +01:00
schlagmichdoch
3f85d266b3
Merge pull request #80 from schlagmichdoch/compatibility_snapdrop_android
PairDrop is finally compatible with snapdrop for android! 🎉
2023-03-14 15:49:12 +01:00
schlagmichdoch
01cd670afc Convert FAQ to collapsible sections and add back third-party apps 2023-03-14 15:43:40 +01:00
schlagmichdoch
3f0909637b fix full button width if only one button is shown 2023-03-14 15:12:31 +01:00
schlagmichdoch
1f97c12562 fix overflow of long device names for snapdrop-android 2023-03-14 15:12:31 +01:00
schlagmichdoch
17abc91c86 rename function and add event to achieve compatibility with snapdrop-android app 2023-03-14 15:12:23 +01:00
schlagmichdoch
4a0cd1f49a Update issue templates: Point out the FAQ 2023-03-14 11:48:57 +01:00
Kaindl Network
b7781e2bab
Add Healthcheck to Dockerfile 2023-03-13 20:38:36 +01:00
schlagmichdoch
4e0fb89720 replace javascript operators ?? and ?. to support older browsers (see #79) 2023-03-13 14:21:26 +01:00
schlagmichdoch
5a290718b6
Merge pull request #78 from schlagmichdoch/dependabot/npm_and_yarn/ws-8.13.0
Bump ws from 8.12.1 to 8.13.0
2023-03-13 11:35:30 +01:00
dependabot[bot]
6c6f288c3d
Bump ws from 8.12.1 to 8.13.0
Bumps [ws](https://github.com/websockets/ws) from 8.12.1 to 8.13.0.
- [Release notes](https://github.com/websockets/ws/releases)
- [Commits](https://github.com/websockets/ws/compare/8.12.1...8.13.0)

---
updated-dependencies:
- dependency-name: ws
  dependency-type: direct:production
  update-type: version-update:semver-minor
...

Signed-off-by: dependabot[bot] <support@github.com>
2023-03-13 05:17:56 +00:00
schlagmichdoch
fea15d3ee1 increase version to v1.4.5 2023-03-13 00:05:57 +01:00
schlagmichdoch
028752a809 fixes #76. 'File received' dialog not showing on iOS when big videos are sent. 2023-03-13 00:04:48 +01:00
schlagmichdoch
1093f4d246 log error onicecandidateerror 2023-03-10 22:21:19 +01:00
schlagmichdoch
7ddd600b0c fix display name hidden on Firefox for Android 2023-03-10 20:01:59 +01:00
schlagmichdoch
715356aafb
Fix AirDrop typo 2023-03-08 11:35:37 +01:00
schlagmichdoch
490e4db380
Add information about specifying TURN servers 2023-03-07 18:25:25 +01:00
schlagmichdoch
11a988e550 increase version to v1.4.4 2023-03-06 16:05:58 +01:00
schlagmichdoch
ff8f28660a prevent buttons from submitting form by adding type="button" 2023-03-06 16:03:34 +01:00
schlagmichdoch
5fc8e85f75 increase version to 1.4.3 2023-03-06 15:40:09 +01:00
schlagmichdoch
5eeaae01fe add connection hash to title of display-name of receive dialogs 2023-03-06 15:39:24 +01:00
schlagmichdoch
660e523263 prevent sending of displayName if RTCPeer is not connected 2023-03-06 15:33:22 +01:00
schlagmichdoch
cdfbc7a2df add missing removal of event listener to ws fallback ui.js 2023-03-06 15:32:58 +01:00
schlagmichdoch
c9dca7e083 fix download notification and add request notification 2023-03-06 15:32:42 +01:00
schlagmichdoch
79af04d95a increase version to v1.4.2 2023-03-06 12:31:44 +01:00
schlagmichdoch
954e9c7c3a
Merge pull request #65 from schlagmichdoch/pairdrop_cli_add_firefox_fallback
pairdrop-cli: add fallback if navigator.clipboard.readText() is not available
2023-03-06 12:25:54 +01:00
schlagmichdoch
c0d504f6a8 remove base64 event listeners manually on hide instead of once: true 2023-03-06 12:20:30 +01:00
schlagmichdoch
36e152dc7c add { once: true } to deactivate-paste-mode event listener 2023-03-06 11:59:56 +01:00
schlagmichdoch
fdf024f378 pairdrop-cli: add fallback if navigator.clipboard.readText() is not available 2023-03-06 11:56:17 +01:00
schlagmichdoch
9f2e4c5f8f fix displayName sometimes not exchanged on reload 2023-03-06 11:24:19 +01:00
schlagmichdoch
8e219914ec
Merge pull request #66 from schlagmichdoch/dependabot/npm_and_yarn/ua-parser-js-1.0.34
Bump ua-parser-js from 1.0.33 to 1.0.34
2023-03-06 10:53:35 +01:00
dependabot[bot]
d1273ef9cc
Bump ua-parser-js from 1.0.33 to 1.0.34
Bumps [ua-parser-js](https://github.com/faisalman/ua-parser-js) from 1.0.33 to 1.0.34.
- [Release notes](https://github.com/faisalman/ua-parser-js/releases)
- [Changelog](https://github.com/faisalman/ua-parser-js/blob/1.0.34/changelog.md)
- [Commits](https://github.com/faisalman/ua-parser-js/compare/1.0.33...1.0.34)

---
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-03-06 05:12:00 +00:00
schlagmichdoch
27ac7786d0 increase version to v1.4.1 2023-03-06 03:48:23 +01:00
schlagmichdoch
edf2ab5eb3 revert some changes to regain stability 2023-03-06 03:47:24 +01:00
schlagmichdoch
c3863a9dd3 increase version to v1.4.0 2023-03-06 02:19:41 +01:00
schlagmichdoch
5934e94761 edit some styling of the display-name edit field 2023-03-06 00:40:53 +01:00
schlagmichdoch
1bc23dc4b3 fix read rtcConfig.json must be parsed as JSON.. 2023-03-06 00:16:33 +01:00
schlagmichdoch
cc78b34d2e Revert making peerId ephemeral to prevent duplication of shown peers on reconnect. Implement peerIdHash to prevent rogue users from overtaking peerIds 2023-03-06 00:07:21 +01:00
schlagmichdoch
f34f5bd4b2 tidy up code, add tooltip to device name and change color and bg-color of device-name 2023-03-06 00:07:21 +01:00
schlagmichdoch
b2f6a75c99
Merge pull request #60 from ChaosExAnima/master
Updates CLI to work with OSX base64
2023-03-05 00:43:37 +01:00
Echo
82138c06f3
Updates CLI to work with OSX base64 2023-03-04 15:53:13 -05:00
schlagmichdoch
ee820ed6e0
Merge pull request #57 from schlagmichdoch/enable_renaming
New feature: You can now change your display name
2023-03-04 20:53:41 +01:00
schlagmichdoch
b7e7fd1b68 Merge branch 'master' into enable_renaming 2023-03-04 20:52:10 +01:00
schlagmichdoch
96ed0e53b1 apply styling to clarify that the display-name is editable 2023-03-04 20:50:52 +01:00
schlagmichdoch
77b76a3b8d reduce reconnect timers to 1s 2023-03-04 15:46:26 +01:00
schlagmichdoch
e37f9bd9fb fix display name offset in styles.css 2023-03-04 15:44:42 +01:00
schlagmichdoch
67a1b04da2 increase version to v1.3.0 2023-03-03 19:45:04 +01:00
schlagmichdoch
8b2eb67266 fix position of close btn on about page 2023-03-03 19:43:31 +01:00
schlagmichdoch
827b10219d
Merge pull request #58 from schlagmichdoch/define_turn_config_dynamically
STUN/TURN config can now be changed dynamically via environment variable 🎉
2023-03-03 19:42:52 +01:00
schlagmichdoch
e7ab5e26cc Add dynamic stun/turn config as new feature to README.md 2023-03-03 19:41:55 +01:00
schlagmichdoch
451173caac Add possibility to change the display name to the README.md 2023-03-03 19:10:24 +01:00
schlagmichdoch
8bcaa3f60f
Fix header hierarchy for dynamic stun/turn in docs 2023-03-03 18:28:49 +01:00
schlagmichdoch
c0a4224a59 merge master into branch 2023-03-03 18:01:24 +01:00
schlagmichdoch
460e8ec79c change cursor to clarify that the display name is editable 2023-03-03 17:43:03 +01:00
schlagmichdoch
002b31a113 merge master into branch 2023-03-03 17:40:10 +01:00
schlagmichdoch
1e35bab327 increase version to v1.2.2 2023-03-03 17:07:02 +01:00
schlagmichdoch
bb0493d071 Make user notifications and document titles more concise. 2023-03-03 17:03:10 +01:00
schlagmichdoch
bfb5aa8546 fix overwrite method _onMessage of class RTCPeer 2023-03-03 16:36:55 +01:00
schlagmichdoch
a9d7960a59 increase version to v1.2.1 2023-03-03 13:12:06 +01:00
schlagmichdoch
39ca5b2d21 ws-fallback: remove all WSPeers when server connection disconnects + fix onPeerLeft 2023-03-03 13:10:14 +01:00
schlagmichdoch
cf715b2872 stability on reconnect: prevent "peer-left" signal after "peer-joined" by leaving rooms first before reentering them, clear _keepAlive timeout before joining ip room and not manually terminating sockets 2023-03-03 13:10:14 +01:00
schlagmichdoch
bbb8c1b10f ws-fallback: prevent signaling from stopping on reconnect. Do not stop to signal until both devices have sent event "peer-connected" 2023-03-03 13:10:13 +01:00
schlagmichdoch
d6ef5887dd move logging of rtc message from class Peer class to overwritten method in class RTCPeer 2023-03-03 12:38:34 +01:00
schlagmichdoch
f9f1abef7a Replace all urls in received messages with links. Center the message if it does not include any whitespace. 2023-03-03 12:28:50 +01:00
schlagmichdoch
d244f5fa47 fix circles position on ios safari are shifted by url bar 2023-03-03 12:03:20 +01:00
schlagmichdoch
3a2d8c75f7 - restructure and unify dialogs to use less space on mobile and be clearer
- give user option both options "share" and "download" on mobile
- add fallback if zipper fails that downloads files individually
- fix dequeuing of message queue not possible if sending peer has left
2023-03-03 12:01:43 +01:00
schlagmichdoch
545cdc2459 Fix browser reloading when first message is sent by preventing event default on submit 2023-03-02 16:30:47 +01:00
schlagmichdoch
a1fdd81629 increase version to v1.2.0 2023-03-02 15:33:30 +01:00
schlagmichdoch
7220e85422 document/tab title: Show number of received messages and move '- PairDrop' to the end 2023-03-02 15:31:06 +01:00
schlagmichdoch
1eb53498b1 add localStorage fallback to fix renaming on private tabs and fix Firefox inserting linebreaks into edited divs 2023-03-02 15:06:22 +01:00
schlagmichdoch
de76da52fe merge master into branch 2023-03-01 21:55:50 +01:00
schlagmichdoch
d56ee87437 - Enable renaming of own display name permanently via UI
- Make peerId completely ephemeral
- Stabilize RTCConnection by closing connections cleanly
2023-03-01 21:38:36 +01:00
schlagmichdoch
a3b348d9b6 refactor all missing html ids to kebap-case 2023-03-01 21:38:13 +01:00
schlagmichdoch
4566528179 - restructure UI to use flexbox everywhere
- structure peers on desktop responsively
- make peer box scrollable when peers are overflowing + shadow
- add highlight badge to differentiate local peers into paired and not paired
- change websocket fallback warning and move to the bottom
2023-03-01 21:38:13 +01:00
schlagmichdoch
7b08973cef remove safari audio blop "hack" as it should not completely stop music that is playing in the background 2023-03-01 21:38:12 +01:00
schlagmichdoch
eda60a3d78
Merge pull request #52 from kylethedeveloper/docs
add docker-compose instructions to docs
2023-02-26 21:29:44 +01:00
schlagmichdoch
e96ca53aa4
Fix rate limit docs and set header hierarchy correctly 2023-02-26 21:28:17 +01:00
kylethedeveloper
11d6a8a372 Merge 'upstream/master' into docs 2023-02-26 01:40:59 -06:00
kylethedeveloper
75726ae5f4 resolve comments on documentation 2023-02-26 01:35:19 -06:00
kylethedeveloper
80dc36c00a merge commit 2023-02-26 01:34:37 -06:00
schlagmichdoch
765b4e65b1 Update GHCR docker docs 2023-02-25 17:32:19 +01:00
schlagmichdoch
e77f856515 increase version to v1.1.3 2023-02-25 17:03:44 +01:00
Xstar97TheNoob
0de92864eb fix IMAGE_NAME
Just tested this on my fork, works.
2023-02-25 17:02:19 +01:00
schlagmichdoch
8ecec5c1bf increase version to v1.1.2 2023-02-24 18:19:49 +01:00
schlagmichdoch
78cf0139b8
Merge pull request #47 from xstar97/patch-1
Fix(ghcr) update workflow variable to a static lowercase name
2023-02-24 18:12:01 +01:00
schlagmichdoch
591c76c15a fix dialog heights 2023-02-24 18:10:34 +01:00
schlagmichdoch
66359da2ca get rtcConfig dynamically from the server 2023-02-24 18:08:48 +01:00
schlagmichdoch
74b88c2e7d fix dialog heights 2023-02-24 16:53:13 +01:00
Xstar97TheNoob
2a3d1d4105
Fix variable to a static lowercase name 2023-02-24 10:40:30 -05:00
schlagmichdoch
5bff933b6e
Merge pull request #45 from xstar97/docs-fix
docs(ghcr) add deployment notes for ghcr
2023-02-24 16:23:19 +01:00
schlagmichdoch
0ba1bd7113 tidy up Docker deployment notes 2023-02-24 16:20:19 +01:00
schlagmichdoch
0eb13d9d1b increase QR-Code size as requested in #43 and fix overflow issues on iOS 2023-02-24 16:08:36 +01:00
schlagmichdoch
ad109d1724
Merge pull request #37 from xstar97/ghcr-build-wk
feat(ghcr.io)  build container on tagged commits to ghcr.io
2023-02-23 21:00:35 +01:00
Xstar97TheNoob
f9e214a1e5
docs(ghcr) add deployment notes for ghcr 2023-02-23 12:53:04 -05:00
kylethedeveloper
b6238b05ae add docker-compose instructions to docs 2023-02-21 22:42:41 -06:00
schlagmichdoch
36da8e3490 increase version to v1.1.0 2023-02-22 03:03:53 +01:00
schlagmichdoch
40c0735c90 touched UX to make receive dialogs more intuitive. closes #40 2023-02-22 03:01:06 +01:00
schlagmichdoch
12a2fc1b0a
Merge pull request #39 from schlagmichdoch/enable_sending_from_cli
Closes #34
2023-02-22 02:37:18 +01:00
schlagmichdoch
f8d49754d2 added pairdrop-cli to documentation 2023-02-22 02:23:18 +01:00
schlagmichdoch
3cb4e6d476 pairdrop-cli now working on windows via bash pairdrop or git bash 2023-02-22 02:22:33 +01:00
schlagmichdoch
8f0e465b8e pairdrop-cli: change domain via flag, move bash file to separate folder and add console logs to ui.js 2023-02-21 23:44:41 +01:00
schlagmichdoch
ce13348aeb
Merge pull request #36 from schlagmichdoch/dependabot/npm_and_yarn/ws-8.12.1
Bump ws from 8.12.0 to 8.12.1
2023-02-20 23:47:40 +01:00
schlagmichdoch
0f9bbf9bbb enable sending from cli by adding bash script 2023-02-20 17:42:02 +01:00
Xstar97TheNoob
0d8db3e309
add downcase to variable. 2023-02-20 09:36:24 -05:00
Xstar97TheNoob
c7647daff7
feat(ghcr.io) build container on tagged releases to ghcr.io 2023-02-20 09:25:57 -05:00
dependabot[bot]
46460dbe02
Bump ws from 8.12.0 to 8.12.1
Bumps [ws](https://github.com/websockets/ws) from 8.12.0 to 8.12.1.
- [Release notes](https://github.com/websockets/ws/releases)
- [Commits](https://github.com/websockets/ws/compare/8.12.0...8.12.1)

---
updated-dependencies:
- dependency-name: ws
  dependency-type: direct:production
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>
2023-02-20 05:18:44 +00:00
198 changed files with 17597 additions and 9791 deletions

View file

@ -1,5 +1,13 @@
node_modules
.github
.git*
*.md
.idea
dev
docs
licenses
node_modules
pairdrop-cli
*.md
*.yml
Dockerfile
rtc_config_example.json
turnserver_example.conf

View file

@ -1,8 +1,8 @@
---
name: Bug Report
about: Create a report to help us improve
title: 'Bug:/Enhancement:/Feature Request: '
labels: ''
about: Create a report to help us improve. Please check the FAQ first.
title: '[Bug] '
labels: 'bug'
assignees: ''
---
@ -34,12 +34,17 @@ If applicable, add screenshots to help explain your problem.
- Browser [e.g. stock browser, safari]
- Version [e.g. 22]
**Self-Hosted**
**Bug occurs on official PairDrop instance https://pairdrop.net/**
No | Yes
Version: v1.11.2
**Bug occurs on self-hosted PairDrop instance**
No | Yes
**Self-Hosted Setup**
Proxy: Nginx | Apache2
Deployment: docker run | docker-compose | npm run start:prod
Deployment: docker run | docker compose | npm run start:prod
Version: v1.11.2
**Additional context**
Add any other context about the problem here.

20
.github/ISSUE_TEMPLATE/enhancement.md vendored Normal file
View file

@ -0,0 +1,20 @@
---
name: Enhancement
about: Enhancements and feature requests are always welcome. See discussions regarding central topics.
title: '[Enhancement] '
labels: 'enhancement'
assignees: ''
---
**What problem is solved by the new feature**
What's the motivation for this topic
**Describe the feature**
A clear and concise description of what the new feature/enhancement is.
**Drafts**
Screenshots of Draw.io graph or drawn sketch.
**Additional context**
Add any other context here.

View file

@ -1,3 +1,14 @@
# This workflow uses actions that are not certified by GitHub.
# They are provided by a third-party and are governed by
# separate terms of service, privacy policy, and support
# documentation.
# GitHub recommends pinning actions to a commit SHA.
# To get a newer version, you will need to update the SHA.
# You can also reference a tag or branch, but the action may change without warning.
# Build a Docker image whenever it is pushed to master
name: Docker Image CI
on:
@ -13,6 +24,6 @@ jobs:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v3
- uses: actions/checkout@b4ffde65f46336ab88eb53be808477a3936bae11 # v4.1.1
- name: Build the Docker image
run: docker build --pull . -f Dockerfile -t pairdrop

60
.github/workflows/github-image.yml vendored Normal file
View file

@ -0,0 +1,60 @@
# This workflow uses actions that are not certified by GitHub.
# They are provided by a third-party and are governed by
# separate terms of service, privacy policy, and support
# documentation.
# GitHub recommends pinning actions to a commit SHA.
# To get a newer version, you will need to update the SHA.
# You can also reference a tag or branch, but the action may change without warning.
# Create a Docker image and push it to ghcr.io whenever a new version tag is pushed
name: GHCR Image CI
on:
push:
tags:
- "v*.*.*"
env:
REGISTRY: ghcr.io
IMAGE_NAME: ${{ github.repository }}
jobs:
build-and-push-image:
runs-on: ubuntu-latest
permissions:
contents: read
packages: write
steps:
- name: Checkout repository
uses: actions/checkout@b4ffde65f46336ab88eb53be808477a3936bae11 # v4.1.1
- name: Setup qemu
uses: docker/setup-qemu-action@68827325e0b33c7199eb31dd4e31fbe9023e06e3 # v3.0.0
- name: Setup Docker Buildx
uses: docker/setup-buildx-action@f95db51fddba0c2d1ec667646a06c2ce06100226 # v3.0.0
- name: Log in to the Container registry
uses: docker/login-action@343f7c4344506bcbf9b4de18042ae17996df046d # v3.0.0
with:
registry: ${{ env.REGISTRY }}
username: ${{ github.actor }}
password: ${{ secrets.GITHUB_TOKEN }}
- name: Extract metadata (tags, labels) for Docker
id: meta
uses: docker/metadata-action@31cebacef4805868f9ce9a0cb03ee36c32df2ac4 # v5.3.0
with:
images: ${{ env.REGISTRY }}/${{ env.IMAGE_NAME }}
- name: Build and push Docker image
uses: docker/build-push-action@4a13e500e55cf31b7a5d59a38ab2040ab0f42f56 # v5.1.0
with:
context: .
platforms: linux/amd64,linux/arm64
push: true
tags: ${{ steps.meta.outputs.tags }}
labels: ${{ steps.meta.outputs.labels }}

36
.github/workflows/zip-release.yml vendored Normal file
View file

@ -0,0 +1,36 @@
# This workflow uses actions that are not certified by GitHub.
# They are provided by a third-party and are governed by
# separate terms of service, privacy policy, and support
# documentation.
# GitHub recommends pinning actions to a commit SHA.
# To get a newer version, you will need to update the SHA.
# You can also reference a tag or branch, but the action may change without warning.
# Create a new zip file from pairdrop-cli whenever a new version tag is pushed
name: Zip Release
on:
push:
tags:
- "v*.*.*"
jobs:
build:
runs-on: ubuntu-latest
permissions:
contents: write
steps:
- uses: actions/checkout@master
- name: Archive Release
uses: thedoctor0/zip-release@b57d897cb5d60cb78b51a507f63fa184cfe35554 # v0.7.6
with:
filename: 'pairdrop-cli.zip'
directory: 'pairdrop-cli'
exclusions: '*.git* /*node_modules/* .editorconfig'
- name: Upload Release
uses: ncipollo/release-action@6c75be85e571768fa31b40abf38de58ba0397db5 # v1.13.0
with:
artifacts: "pairdrop-cli/pairdrop-cli.zip"
token: ${{ secrets.GITHUB_TOKEN }}

6
.gitignore vendored
View file

@ -1,5 +1,7 @@
node_modules
.DS_Store
fqdn.env
/docker/certs
/dev/certs
qrcode-svg/
turnserver.conf
rtc_config.json
ssl/

View file

@ -1,11 +1,21 @@
FROM node:lts-alpine
FROM alpine:latest
WORKDIR /home/node/app
COPY package*.json ./
RUN npm ci
RUN apk add --no-cache nodejs npm
RUN NODE_ENV="production" npm ci --omit=dev
# Directories and files excluded via .dockerignore
COPY . .
# environment settings
ENV NODE_ENV="production"
EXPOSE 3000
HEALTHCHECK --interval=30s --timeout=10s --start-period=5s --retries=3 \
CMD wget --quiet --tries=1 --spider http://localhost:3000 || exit 1
ENTRYPOINT ["npm", "start"]

171
README.md
View file

@ -1,103 +1,134 @@
<div align="center">
<a href="https://github.com/schlagmichdoch/PairDrop">
<img src="https://raw.githubusercontent.com/schlagmichdoch/PairDrop/master/public/images/android-chrome-512x512.png" alt="Logo" width="150" height="150">
<img src="public/images/android-chrome-512x512.png" alt="Logo" width="150" height="150">
</a>
<h1>PairDrop</h1>
# _Send it_, with [PairDrop](https://pairdrop.net)
<p>
Local file sharing in your browser. Inspired by Apple's Airdrop.
Local file sharing <a href="https://pairdrop.net"><strong>in your web browser</strong></a>.
<br>
Inspired by Apple's AirDrop.
<br>
Fork of Snapdrop.
<br>
<br>
<a href="https://github.com/schlagmichdoch/PairDrop/issues">Report a bug</a>
<br />
<a href="https://pairdrop.net"><strong>Explore »</strong></a>
<br />
<br />
<a href="https://github.com/schlagmichdoch/PairDrop/issues">Report Bug</a>
·
<a href="https://github.com/schlagmichdoch/PairDrop/issues">Request Feature</a>
<a href="https://github.com/schlagmichdoch/PairDrop/issues">Request feature</a>
</p>
</div>
<br>
## Features
[PairDrop](https://pairdrop.net) is a sublime alternative to AirDrop that works on all platforms.
File sharing on your local network that works on all platforms.
Send images, documents or text via peer to peer connection to devices in the same local network/Wi-Fi or to paired devices.
As it is web based, it runs on all devices.
- A multi-platform AirDrop-like solution that works.
- Send images, documents or text via peer-to-peer connection to devices on the same local network.
- Internet transfers
- Join temporary public rooms to transfer files easily over the Internet.
- Web-app
- Works on all devices with a modern web-browser.
Send a file from your phone to your laptop?
<br>Share photos in original quality with friends using Android and iOS?
<br>Share private files peer-to-peer between Linux systems?
You want to quickly send a file from your phone to your laptop?
<br>You want to share photos in original quality with friends that use a mixture of Android and iOS?
<br>You want to share private files peer to peer between Linux systems?
<br>AirDrop is unreliable again?
<br>_Send it with PairDrop!_
<img src="docs/pairdrop_screenshot_mobile.gif" alt="Screenshot GIF showing PairDrop in use" style="width: 300px">
Developed based on [Snapdrop](https://github.com/RobinLinus/snapdrop)
## Differences to the [Snapdrop](https://github.com/RobinLinus/snapdrop) it is based on
<details><summary>View all differences</summary>
## Differences to Snapdrop
### Device Pairing
* Pair devices via 6-digit code or QR-Code
* Pair devices outside your local network or in complex network environment (public Wi-Fi, company network, Apple Private Relay, VPN etc.).
### Paired Devices and Public Rooms — Internet Transfer
* Transfer files over the Internet between paired devices or by entering temporary public rooms.
* Connect to devices in complex network environments (public Wi-Fi, company network, iCloud Private Relay, VPN, etc.).
* Connect to devices on your mobile hotspot.
* Paired devices will always find each other via shared secrets even after reopening the browser or the Progressive Web App
* You will always discover devices on your local network. Paired devices are shown additionally.
* Paired devices outside your local network that are behind a NAT are connected automatically via [Open Relay: Free WebRTC TURN Server](https://www.metered.ca/tools/openrelay/)
* Devices outside of your local network that are behind a NAT are auto-connected via the PairDrop TURN server.
* Devices from the local network, in the same public room, or previously paired are shown.
### [Improved UI for sending/receiving files](https://github.com/RobinLinus/snapdrop/issues/560)
* Files are transferred only after a request is accepted first. On transfer completion they are downloaded automatically if possible.
* Multiple files are downloaded as ZIP file
* On iOS and Android the devices share menu is opened instead of downloading the files
* Multiple files are transferred at once with an overall progress indicator
#### Persistent Device Pairing
### Share Files Directly From Share / Context Menu
* [Share files directly from context menu on Windows](/docs/how-to.md#share-files-directly-from-context-menu-on-windows)
* [Share directly from share menu on iOS](/docs/how-to.md#share-directly-from-share-menu-on-ios)
* [Share directly from share menu on Android](/docs/how-to.md#share-directly-from-share-menu-on-android)
Always connect to known devices
* Pair devices via a 6-digit code or a QR-Code.
* Paired devices always find each other via shared secrets independently of their local network.
* Pairing is persistent. You find your devices even after reopening PairDrop.
* You can edit and unpair devices easily.
### Other changes
* [Paste Mode](https://github.com/RobinLinus/snapdrop/pull/534)
#### Temporary Public Rooms
Connect to others in complex network situations, or over the Internet.
* Enter a public room via a 5-letter code or a QR-code.
* Enter a public room to temporarily connect to devices outside your local network.
* All devices in the same public room see each other.
* Public rooms are temporary. Closing PairDrop leaves all rooms.
### [Improved UI for Sending/Receiving Files](https://github.com/RobinLinus/snapdrop/issues/560)
* Files are transferred after a request is accepted. Files are auto-downloaded upon completing a transfer, if possible.
* Multiple files are downloaded as a ZIP file
* Download, share or save to gallery via the "Share" menu on Android and iOS.
* Multiple files are transferred at once with an overall progress indicator.
### Send Files or Text Directly From Share Menu, Context Menu or CLI
* [Send files directly from context menu on Ubuntu (using Nautilus)](docs/how-to.md#send-multiple-files-and-directories-directly-from-context-menu-on-ubuntu-using-nautilus)
* [Send files directly from the context menu on Windows](docs/how-to.md#send-files-directly-from-context-menu-on-windows)
* [Send directly from the "Share" menu on iOS](docs/how-to.md#send-directly-from-share-menu-on-ios)
* [Send directly from the "Share" menu on Android](docs/how-to.md#send-directly-from-share-menu-on-android)
* [Send directly via the command-line interface](docs/how-to.md#send-directly-via-command-line-interface)
### Other Changes
* Change your display name to easily differentiate your devices.
* [Paste files/text and choose the recipient afterwards ](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))
* [Video and audio preview](https://github.com/RobinLinus/snapdrop/pull/455) (Thanks [@victorwads](https://github.com/victorwads))
* Switch theme back to auto/system after dark or light mode is on
* Node-only implementation (Thanks [@Bellisario](https://github.com/Bellisario))
* Automatic restart on error (Thanks [@KaKi87](https://github.com/KaKi87))
* Auto-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))
* To host PairDrop on your local network (e.g. on Raspberry Pi): [All peers connected with private IPs are discoverable by each other](https://github.com/RobinLinus/snapdrop/pull/558)
* When hosting PairDrop yourself, you can [set your own STUN/TURN servers](docs/host-your-own.md#specify-stunturn-servers)
* Translations.
## Screenshots
<div align="center">
</details>
![Pairdrop Preview](/docs/pairdrop_screenshot_mobile.gif)
</div>
## PairDrop is built with the following awesome technologies:
* Vanilla HTML5 / ES6 / CSS3 frontend
* [WebRTC](http://webrtc.org/) / [WebSockets](http://www.websocket.org/)
* [NodeJS](https://nodejs.org/en/) backend
* [Progressive Web App](https://wikipedia.org/wiki/Progressive_Web_App)
* [IndexedDB API](https://developer.mozilla.org/en-US/docs/Web/API/IndexedDB_API)
* [zip.js](https://gildas-lormeau.github.io/zip.js/)
Have any questions? Read our [FAQ](/docs/faq.md).
You can [host your own instance with Docker](/docs/host-your-own.md).
## Support the Community
PairDrop is free and always will be. Still, we have to pay for the domain.
To contribute and support me:<br>
<a href="https://www.buymeacoffee.com/pairdrop" target="_blank">
<img src="https://cdn.buymeacoffee.com/buttons/v2/default-yellow.png" alt="Buy Me A Coffee" style="height: 60px !important;width: 217px !important;" >
## Translate PairDrop on [Hosted Weblate](https://hosted.weblate.org/engage/pairdrop/)
<a href="https://hosted.weblate.org/engage/pairdrop/">
<img src="https://hosted.weblate.org/widget/pairdrop/horizontal-blue.svg" alt="Translation status" style="width: 300px" />
</a>
Thanks a lot for supporting free and open software!
## Built with the following awesome technologies:
* Vanilla HTML5 / JS ES6 / CSS 3 frontend
* [WebRTC](http://webrtc.org/) / WebSockets
* [Node.js](https://nodejs.org/en/) backend
* [Progressive web app (PWA)](https://en.wikipedia.org/wiki/Progressive_web_app) unified functionality
* [IndexedDB API](https://developer.mozilla.org/en-US/docs/Web/API/IndexedDB_API) storage handling
* [zip.js](https://gildas-lormeau.github.io/zip.js/) library
* [cyrb53](https://github.com/bryc/code/blob/master/jshash/experimental/cyrb53.js) super-fast hash function
* [NoSleep](https://github.com/richtr/NoSleep.js) display sleep, add wake lock ([MIT](licenses/MIT-NoSleep))
* [heic2any](https://github.com/alexcorvi/heic2any) HEIC/HEIF to PNG/GIF/JPEG ([MIT](licenses/MIT-heic2any))
* [Weblate](https://weblate.org/) web-based localization tool
* [BrowserStack](https://www.browserstack.com/) This project is tested with BrowserStack
To support the original Snapdrop and its creator go to [his GitHub page](https://github.com/RobinLinus/snapdrop).
[FAQ](docs/faq.md)
## How to contribute
[Host your own instance with Docker or Node.js](docs/host-your-own.md).
## Support
<a href="https://www.buymeacoffee.com/pairdrop" target="_blank">
<img src="https://cdn.buymeacoffee.com/buttons/v2/default-blue.png" alt="Buy me a coffee" style="height: 60px !important;width: 217px !important;" >
</a>
<br />
<br />
PairDrop is libre, and always will be. \
If you find it useful and want to support free and open-source software, please consider donating using the button above. \
I footed the bill for the domain and the server, and you can help create and maintain great software by supporting me. \
Thank you very much for your contribution!
## Contributing
Feel free to [open an issue](https://github.com/schlagmichdoch/pairdrop/issues/new/choose) or a
[pull request](https://github.com/schlagmichdoch/pairdrop/pulls) but follow
[Contributing Guidelines](/CONTRIBUTING.md).
[pull request](https://github.com/schlagmichdoch/pairdrop/pulls), following the
[Contributing Guidelines](CONTRIBUTING.md).

View file

@ -0,0 +1,3 @@
FROM nginx:alpine
RUN apk add --no-cache openssl

42
dev/nginx/default.conf Normal file
View file

@ -0,0 +1,42 @@
server {
listen 80;
expires epoch;
location / {
proxy_connect_timeout 300;
proxy_pass http://pairdrop:3000;
proxy_set_header Connection "upgrade";
proxy_set_header Upgrade $http_upgrade;
}
location /ca.crt {
alias /etc/ssl/certs/pairdropCA.crt;
}
# To allow POST on static pages
error_page 405 =200 $uri;
}
server {
listen 443 ssl;
http2 on;
ssl_certificate /etc/ssl/certs/pairdrop-dev.crt;
ssl_certificate_key /etc/ssl/certs/pairdrop-dev.key;
expires epoch;
location / {
proxy_connect_timeout 300;
proxy_pass http://pairdrop:3000;
proxy_set_header Connection "upgrade";
proxy_set_header Upgrade $http_upgrade;
}
location /ca.crt {
alias /etc/ssl/certs/pairdropCA.crt;
}
# To allow POST on static pages
error_page 405 =200 $uri;
}

9
dev/openssl/create.sh Normal file
View file

@ -0,0 +1,9 @@
#!/bin/sh
cnf_dir='/mnt/openssl/'
certs_dir='/etc/ssl/certs/'
openssl req -config ${cnf_dir}pairdropCA.cnf -new -x509 -days 1 -keyout ${certs_dir}pairdropCA.key -out ${certs_dir}pairdropCA.crt
openssl req -config ${cnf_dir}pairdropCert.cnf -new -out /tmp/pairdrop-dev.csr -keyout ${certs_dir}pairdrop-dev.key
openssl x509 -req -in /tmp/pairdrop-dev.csr -CA ${certs_dir}pairdropCA.crt -CAkey ${certs_dir}pairdropCA.key -CAcreateserial -extensions req_ext -extfile ${cnf_dir}pairdropCert.cnf -sha512 -days 1 -out ${certs_dir}pairdrop-dev.crt
exec "$@"

View file

@ -0,0 +1,26 @@
[ req ]
default_bits = 2048
default_md = sha256
default_days = 1
encrypt_key = no
distinguished_name = subject
x509_extensions = x509_ext
string_mask = utf8only
prompt = no
[ subject ]
organizationName = PairDrop
OU = CA
commonName = pairdrop-CA
[ x509_ext ]
subjectKeyIdentifier = hash
authorityKeyIdentifier = keyid:always,issuer
# You only need digitalSignature below. *If* you don't allow
# RSA Key transport (i.e., you use ephemeral cipher suites), then
# omit keyEncipherment because that's key transport.
basicConstraints = critical, CA:TRUE, pathlen:0
keyUsage = critical, digitalSignature, keyEncipherment, cRLSign, keyCertSign

View file

@ -0,0 +1,29 @@
[ req ]
default_bits = 2048
default_md = sha256
default_days = 1
encrypt_key = no
distinguished_name = subject
req_extensions = req_ext
string_mask = utf8only
prompt = no
[ subject ]
organizationName = PairDrop
OU = Development
# Use a friendly name here because it's presented to the user. The server's DNS
# names are placed in Subject Alternate Names. Plus, DNS names here is deprecated
# by both IETF and CA/Browser Forums. If you place a DNS name here, then you
# must include the DNS name in the SAN too (otherwise, Chrome and others that
# strictly follow the CA/Browser Baseline Requirements will fail).
commonName = ${ENV::FQDN}
[ req_ext ]
subjectKeyIdentifier = hash
basicConstraints = CA:FALSE
keyUsage = digitalSignature, keyEncipherment
subjectAltName = DNS:${ENV::FQDN}
nsComment = "OpenSSL Generated Certificate"
extendedKeyUsage = serverAuth

31
docker-compose-coturn.yml Normal file
View file

@ -0,0 +1,31 @@
version: "3"
services:
pairdrop:
image: "lscr.io/linuxserver/pairdrop:latest"
container_name: pairdrop
restart: unless-stopped
volumes:
- ./rtc_config.json:/home/node/app/rtc_config.json
environment:
- PUID=1000 # UID to run the application as
- PGID=1000 # GID to run the application as
- WS_FALLBACK=false # Set to true to enable websocket fallback if the peer to peer WebRTC connection is not available to the client.
- RATE_LIMIT=false # Set to true to limit clients to 1000 requests per 5 min.
- RTC_CONFIG=/home/node/app/rtc_config.json # Set to the path of a file that specifies the STUN/TURN servers.
- DEBUG_MODE=false # Set to true to debug container and peer connections.
- TZ=Etc/UTC # Time Zone
ports:
- "127.0.0.1:3000:3000" # Web UI. Change the port number before the last colon e.g. `127.0.0.1:9000:3000`
coturn_server:
image: "coturn/coturn"
restart: unless-stopped
volumes:
- ./turnserver.conf:/etc/coturn/turnserver.conf
- ./ssl/:/etc/coturn/ssl/
ports:
- "3478:3478"
- "3478:3478/udp"
- "5349:5349"
- "5349:5349/udp"
- "10000-20000:10000-20000/udp"
# see guide at docs/host-your-own.md#coturn-and-pairdrop-via-docker-compose

34
docker-compose-dev.yml Normal file
View file

@ -0,0 +1,34 @@
version: "3"
services:
pairdrop:
build: .
container_name: pairdrop
restart: unless-stopped
environment:
- PUID=1000 # UID to run the application as
- PGID=1000 # GID to run the application as
- WS_FALLBACK=false # Set to true to enable websocket fallback if the peer to peer WebRTC connection is not available to the client.
- RATE_LIMIT=false # Set to true to limit clients to 1000 requests per 5 min.
- RTC_CONFIG=false # Set to the path of a file that specifies the STUN/TURN servers.
- DEBUG_MODE=false # Set to true to debug container and peer connections.
- TZ=Etc/UTC # Time Zone
ports:
- "127.0.0.1:3000:3000" # Web UI. Change the port number before the last colon e.g. `127.0.0.1:9000:3000`
nginx:
build:
context: dev/
dockerfile: nginx-with-openssl.Dockerfile
image: "nginx-with-openssl"
volumes:
- ./public:/usr/share/nginx/html
- ./dev/certs:/etc/ssl/certs
- ./dev/openssl:/mnt/openssl
- ./dev/nginx/default.conf:/etc/nginx/conf.d/default.conf
ports:
- "8080:80"
- "8443:443"
environment:
- FQDN=localhost
entrypoint: /mnt/openssl/create.sh
command: ["nginx", "-g", "daemon off;"]
restart: unless-stopped

View file

@ -1,12 +1,16 @@
version: "3"
services:
node:
image: "node:lts-alpine"
user: "node"
working_dir: /home/node/app
volumes:
- ./:/home/node/app
command: ash -c "npm i && npm run start:prod"
pairdrop:
image: "lscr.io/linuxserver/pairdrop:latest"
container_name: pairdrop
restart: unless-stopped
environment:
- PUID=1000 # UID to run the application as
- PGID=1000 # GID to run the application as
- WS_FALLBACK=false # Set to true to enable websocket fallback if the peer to peer WebRTC connection is not available to the client.
- RATE_LIMIT=false # Set to true to limit clients to 1000 requests per 5 min.
- RTC_CONFIG=false # Set to the path of a file that specifies the STUN/TURN servers.
- DEBUG_MODE=false # Set to true to debug container and peer connections.
- TZ=Etc/UTC # Time Zone
ports:
- "3000:3000"
- "127.0.0.1:3000:3000" # Web UI. Change the port number before the last colon e.g. `127.0.0.1:9000:3000`

View file

@ -0,0 +1,47 @@
# Docker Swarm Usage
## Healthcheck
The [Docker Image](../Dockerfile) includes a health check with the following options:
```
--interval=30s
```
> Specifies the time interval to run the health check. \
> In this case, the health check is performed every 30 seconds.
<br>
```
--timeout=10s
```
> Specifies the amount of time to wait for a response from the \"HEALTHCHECK\" command. \
> If the response does not arrive within 10 seconds, the health check fails.
<br>
```
--start-period=5s
```
> Specifies the amount of time to wait before starting the health check process. \
> In this case, the health check process will begin 5 seconds after the container is started.
<br>
```
--retries=3
```
> Specifies the number of times Docker should retry the health check \
> before considering the container to be unhealthy.
<br>
The CMD instruction is used to define the command that will be run as part of the health check. \
In this case, the command is `wget --quiet --tries=1 --spider http://localhost:3000/ || exit 1`. \
This command will attempt to connect to `http://localhost:3000/` \
and if it fails it will exit with a status code of `1`. \
If this command returns a status code other than `0`, the health check fails.
Overall, this \"HEALTHCHECK\" instruction is defining a health check process \
that runs every 30 seconds, and waits up to 10 seconds for a response, \
begins 5 seconds after the container is started, and retries up to 3 times. \
The health check attempts to connect to http://localhost:3000/ \
and will considers the container unhealthy if unable to connect.

View file

@ -1,85 +1,275 @@
# Frequently Asked Questions
### Instructions / Discussions
* [Video Instructions](https://www.youtube.com/watch?v=4XN02GkcHUM) (Big thanks to [TheiTeckHq](https://www.youtube.com/channel/UC_DUzWMb8gZZnAbISQjmAfQ))
* [idownloadblog](http://www.idownloadblog.com/2015/12/29/snapdrop/)
* [thenextweb](http://thenextweb.com/insider/2015/12/27/snapdrop-is-a-handy-web-based-replacement-for-apples-fiddly-airdrop-file-transfer-tool/)
* [winboard](http://www.winboard.org/artikel-ratgeber/6253-dateien-vom-desktop-pc-mit-anderen-plattformen-teilen-mit-snapdrop.html)
* [免費資源網路社群](https://free.com.tw/snapdrop/)
* [Hackernews](https://news.ycombinator.com/front?day=2020-12-24)
* [Reddit](https://www.reddit.com/r/Android/comments/et4qny/snapdrop_is_a_free_open_source_cross_platform/)
* [Producthunt](https://www.producthunt.com/posts/snapdrop)
<details>
<summary style="font-size:1.25em;margin-top: 24px; margin-bottom: 16px; font-weight: var(--base-text-weight-semibold, 600); line-height: 1.25;">
Help! I can't install the PWA!
</summary>
### Help! I can't install the PWA!
if you are using a Chromium-based browser (Chrome, Edge, Brave, etc.), you can easily install PairDrop PWA on your desktop
by clicking the install-button in the top-right corner while on [pairdrop.net](https://pairdrop.net).
<br>
<img src="pwa-install.png" alt="Example on how to install a pwa with Edge">
Here is a good guide on how to install PWAs on different platforms: \
https://www.cdc.gov/niosh/mining/content/hearingloss/installPWA.html
**Chromium-based browser on Desktop (Chrome, Edge, Vivaldi, Brave, etc.)** \
Easily install PairDrop PWA on your desktop by clicking the install-button in the top-right corner while on [pairdrop.net](https://pairdrop.net).
<img width="400" src="pwa-install.png" alt="Example on how to install a pwa with Edge">
**Desktop Firefox** \
On Firefox, PWAs are installable via [this browser extensions](https://addons.mozilla.org/de/firefox/addon/pwas-for-firefox/)
### Are there any shortcuts?
Sure!
**Android** \
PWAs are installable only by using Google Chrome or Samsung Browser:
1. Visit [pairdrop.net](https://pairdrop.net)
2. Click _Install_ on the installation pop-up or use the three-dot-menu and click on _Add to Home screen_
3. Click _Add_ on the pop-up
**iOS** \
PWAs are installable only by using Safari:
1. Visit [pairdrop.net](https://pairdrop.net)
2. Click on the share icon
3. Click _Add to Home Screen_
4. Click _Add_ in the top right corner
<br>
**Self-Hosted Instance?** \
To be able to install the PWA from a self-hosted instance, the connection needs to be [established through HTTPS](https://developer.mozilla.org/en-US/docs/Web/Progressive_web_apps/Installable_PWAs).
See [this host your own section](https://github.com/schlagmichdoch/PairDrop/blob/master/docs/host-your-own.md#testing-pwa-related-features) for more info.
<br>
</details>
<details>
<summary style="font-size:1.25em;margin-top: 24px; margin-bottom: 16px; font-weight: var(--base-text-weight-semibold, 600); line-height: 1.25;">
Shortcuts?
</summary>
<br>
Available shortcuts:
- Send a message with `CTRL + ENTER`
- Close all send and pair dialogs by pressing `Escape`.
- Copy a received message to clipboard with `CTRL/⌘ + C`.
- Accept file transfer request with `Enter` and decline with `Escape`.
- Close all "Send" and "Pair" dialogs by pressing `Esc`.
- Copy a received message to the clipboard with `CTRL/⌘ + C`.
- Accept file-transfer requests with `Enter` and decline with `Esc`.
<br>
### When I receive images on iOS I cannot add them directly to the gallery?
Apparently, iOS does not allow images shared from a website to be saved to the gallery directly.
It simply does not offer the option for images shared from a website.
</details>
iOS Shortcuts to the win:
<details>
<summary style="font-size:1.25em;margin-top: 24px; margin-bottom: 16px; font-weight: var(--base-text-weight-semibold, 600); line-height: 1.25;">
How to save images directly to the gallery on iOS?
</summary>
<br>
~~Apparently, iOS does not allow images shared from a website to be saved to the gallery directly.~~
~~It simply does not offer that option for images shared from a website.~~
~~iOS Shortcuts saves the day:~~ \
I created a simple iOS shortcut that takes your photos and saves them to your gallery:
https://routinehub.co/shortcut/13988/
### Is it possible to share files directly from the context / share menu?
Yes it finally is!
* [Share files directly from context menu on Windows](/docs/how-to.md#share-files-directly-from-context-menu-on-windows)
* [Share directly from share menu on iOS](/docs/how-to.md#share-directly-from-share-menu-on-ios)
* [Share directly from share menu on Android](/docs/how-to.md#share-directly-from-share-menu-on-android)
Update: \
Apparently, this was only a bug that is fixed in recent iOS version (https://github.com/WebKit/WebKit/pull/13111). \
If you use an older affected iOS version this might still be of use. \
Luckily, you can now simply use `Save Image`/`Save X Images` 🎉
### What about the connection? Is it a P2P-connection directly from device to device or is there any third-party-server?
It uses a P2P connection if WebRTC is supported by the browser. WebRTC needs a Signaling Server, but it is only used to establish a connection and is not involved in the file transfer.
<br>
If your devices are paired and behind a NAT, the public TURN Server from [Open Relay](https://www.metered.ca/tools/openrelay/) is used to route your files and messages.
</details>
### What about privacy? Will files be saved on third-party-servers?
None of your files are ever sent to any server. Files are sent only between peers. PairDrop doesn't even use a database. If you are curious have a look [at the Server](https://github.com/schlagmichdoch/pairdrop/blob/master/index.js).
WebRTC encrypts the files on transit.
<details>
<summary style="font-size:1.25em;margin-top: 24px; margin-bottom: 16px; font-weight: var(--base-text-weight-semibold, 600); line-height: 1.25;">
Is it possible to send files or text directly from the "Context" or "Share" menu?
</summary>
If your devices are paired and behind a NAT, the public TURN Server from [Open Relay](https://www.metered.ca/tools/openrelay/) is used to route your files and messages.
<br>
### What about security? Are my files encrypted while being sent between the computers?
Yes. Your files are sent using WebRTC, which encrypts them on transit. To ensure the connection is secure and there is no MITM, compare the security number shown under the device name on both devices. The security number is different for every connection.
Yes, it finally is.
* [Send files directly from the "Context" menu on Windows](/docs/how-to.md#send-files-directly-from-context-menu-on-windows)
* [Send directly from the "Share" menu on iOS](/docs/how-to.md#send-directly-from-share-menu-on-ios)
* [Send directly from the "Share" menu on Android](/docs/how-to.md#send-directly-from-share-menu-on-android)
### Transferring many files with paired devices takes too long
Naturally, if traffic needs to be routed through the turn server transfer speed decreases.
As a workaround you can open a hotspot on one of your devices to bridge the connection which makes transfers much faster.
<br>
</details>
<details>
<summary style="font-size:1.25em;margin-top: 24px; margin-bottom: 16px; font-weight: var(--base-text-weight-semibold, 600); line-height: 1.25;">
Is it possible to send files or text directly via CLI?
</summary>
<br>
Yes.
* [Send directly from a command-line interface](/docs/how-to.md#send-directly-via-command-line-interface)
<br>
</details>
<details>
<summary style="font-size:1.25em;margin-top: 24px; margin-bottom: 16px; font-weight: var(--base-text-weight-semibold, 600); line-height: 1.25;">
Are there any third-party Apps?
</summary>
<br>
These third-party apps are compatible with PairDrop:
1. [Snapdrop Android App](https://github.com/fm-sys/snapdrop-android)
2. [Snapdrop for Firefox (Addon)](https://github.com/ueen/SnapdropFirefoxAddon)
3. Feel free to make one :)
<br>
</details>
<details>
<summary style="font-size:1.25em;margin-top: 24px; margin-bottom: 16px; font-weight: var(--base-text-weight-semibold, 600); line-height: 1.25;">
What about the connection? Is it a P2P connection directly from device to device or is there any third-party-server?
</summary>
<br>
It uses a WebRTC peer-to-peer connection.
WebRTC needs a signaling server that is only used to establish a connection.
The server is not involved in the file transfer.
If the devices are on the same network,
none of your files are ever sent to any server.
If your devices are paired and behind a NAT,
the PairDrop TURN Server is used to route your files and messages.
See the [Technical Documentation](technical-documentation.md#encryption-webrtc-stun-and-turn)
to learn more about STUN, TURN and WebRTC.
If you host your own instance
and want to support devices that do not support WebRTC,
you can [start the PairDrop instance with an activated WebSocket fallback](https://github.com/schlagmichdoch/PairDrop/blob/master/docs/host-your-own.md#websocket-fallback-for-vpn).
<br>
</details>
<details>
<summary style="font-size:1.25em;margin-top: 24px; margin-bottom: 16px; font-weight: var(--base-text-weight-semibold, 600); line-height: 1.25;">
What about privacy? Will files be saved on third-party servers?
</summary>
<br>
Files are sent directly between peers.
PairDrop doesn't even use a database.
If curious, study [the signaling server](https://github.com/schlagmichdoch/PairDrop/blob/master/server/ws-server.js).
WebRTC encrypts the files in transit.
If the devices are on the same network,
none of your files are ever sent to any server.
If your devices are paired and behind a NAT,
the PairDrop TURN Server is used to route your files and messages.
See the [Technical Documentation](technical-documentation.md#encryption-webrtc-stun-and-turn)
to learn more about STUN, TURN and WebRTC.
<br>
</details>
<details>
<summary style="font-size:1.25em;margin-top: 24px; margin-bottom: 16px; font-weight: var(--base-text-weight-semibold, 600); line-height: 1.25;">
What about security? Are my files encrypted while sent between the computers?
</summary>
<br>
Yes. Your files are sent using WebRTC, encrypting them in transit.
Still you have to trust the PairDrop server. To ensure the connection is secure and there is no [MITM](https://en.m.wikipedia.org/wiki/Man-in-the-middle_attack) there is a plan to make PairDrop
zero trust by encrypting the signaling and implementing a verification process. See [issue #180](https://github.com/schlagmichdoch/PairDrop/issues/180) to keep updated.
<br>
</details>
<details>
<summary style="font-size:1.25em;margin-top: 24px; margin-bottom: 16px; font-weight: var(--base-text-weight-semibold, 600); line-height: 1.25;">
Transferring many files with paired devices takes too long
</summary>
<br>
Naturally, if traffic needs to be routed through the TURN server
because your devices are behind different NATs, transfer speed decreases.
You can open a hotspot on one of your devices to bridge the connection,
which omits the need of the TURN server.
- [How to open a hotspot on Windows](https://support.microsoft.com/en-us/windows/use-your-windows-pc-as-a-mobile-hotspot-c89b0fad-72d5-41e8-f7ea-406ad9036b85#WindowsVersion=Windows_11)
- [How to open a hotspot on Mac](https://support.apple.com/guide/mac-help/share-internet-connection-mac-network-users-mchlp1540/mac)
- [How to open a hotspot on macOS](https://support.apple.com/guide/mac-help/share-internet-connection-mac-network-users-mchlp1540/mac)
- [Library to open a hotspot on Linux](https://github.com/lakinduakash/linux-wifi-hotspot)
You can also use mobile hotspots on phones to do that.
Then, all data should be sent directly between devices and your data plan should not be charged.
Then, all data should be sent directly between devices and not use your data plan.
### Why don't you implement feature xyz?
Snapdrop and PairDrop are a study in radical simplicity. The user interface is insanely simple. Features are chosen very carefully because complexity grows quadratically since every feature potentially interferes with each other feature. We focus very narrowly on a single use case: instant file transfer.
We are not trying to optimize for some edge-cases. We are optimizing the user flow of the average users. Don't be sad if we decline your feature request for the sake of simplicity.
<br>
If you want to learn more about simplicity you can read [Insanely Simple: The Obsession that Drives Apple's Success](https://www.amazon.com/Insanely-Simple-Ken-Segall-audiobook/dp/B007Z9686O) or [Thinking, Fast and Slow](https://www.amazon.com/Thinking-Fast-Slow-Daniel-Kahneman/dp/0374533555).
</details>
<details>
<summary style="font-size:1.25em;margin-top: 24px; margin-bottom: 16px; font-weight: var(--base-text-weight-semibold, 600); line-height: 1.25;">
Why don't you implement feature xyz?
</summary>
### Snapdrop and PairDrop are awesome! How can I support them?
* [Buy me a cover to support open source software](https://www.buymeacoffee.com/pairdrop)
<br>
Snapdrop and PairDrop are a study in radical simplicity.
The user interface is insanely simple.
Features are chosen very carefully because complexity grows quadratically
since every feature potentially interferes with each other feature.
We focus very narrowly on a single use case: instant file transfer.
Not facilitating optimal edge-cases means better flow for average users.
Don't be sad. We may decline your feature request for the sake of simplicity.
Read *Insanely Simple: The Obsession that Drives Apple's Success*,
and/or *Thinking, Fast and Slow* to learn more.
<br>
</details>
<details>
<summary style="font-size:1.25em;margin-top: 24px; margin-bottom: 16px; font-weight: var(--base-text-weight-semibold, 600); line-height: 1.25;">
PairDrop is awesome. How can I support it?
</summary>
<br>
* [Buy me a coffee](https://www.buymeacoffee.com/pairdrop) to pay for the domain and the server, and support libre software.
* [File bugs, give feedback, submit suggestions](https://github.com/schlagmichdoch/pairdrop/issues)
* Share PairDrop on social media.
* Fix bugs and make a pull request.
* Do security analysis and suggestions
* Fix bugs and create a pull request.
* Do some security analysis and make suggestions.
* Participate in [active discussions](https://github.com/schlagmichdoch/PairDrop/discussions)
<br>
### How does it work?
[See here for Information about the Technical Implementation](/docs/technical-documentation.md)
</details>
<details>
<summary style="font-size:1.25em;margin-top: 24px; margin-bottom: 16px; font-weight: var(--base-text-weight-semibold, 600); line-height: 1.25;">
How does it work?
</summary>
<br>
[See here for info about the technical implementation](/docs/technical-documentation.md)
<br>
</details>
[< Back](/README.md)

View file

@ -1,66 +1,159 @@
# Deployment Notes
## TURN server for Internet Transfer
Beware that you have to host your own TURN server to enable transfers between different networks.
Follow [this guide](https://gabrieltanner.org/blog/turn-server/) to either install coturn directly on your system (Step 1)
or deploy it via Docker (Step 5).
You can use the `docker-compose-coturn.yml` in this repository. See [Coturn and PairDrop via Docker Compose](#coturn-and-pairdrop-via-docker-compose).
Alternatively, use a free, pre-configured TURN server like [OpenRelay](https://www.metered.ca/tools/openrelay/)
<br>
## PairDrop via HTTPS
On some browsers PairDrop must be served over TLS in order for some features to work properly.
These may include:
- Copying an incoming message via the 'copy' button
- Installing PairDrop as PWA
- Persistent pairing of devices
- Changing of the display name
- Notifications
Naturally, this is also recommended to increase security.
<br>
## Deployment with Docker
The easiest way to get PairDrop up and running is by using Docker.
## Deployment with Docker from Docker Hub
### Docker Image from Docker Hub
```bash
docker run -d --restart=unless-stopped --name=pairdrop -p 127.0.0.1:3000:3000 lscr.io/linuxserver/pairdrop
```
> You must use a server proxy to set the X-Forwarded-For to prevent all clients from discovering each other (See [#HTTP-Server](#http-server)).
>
> To prevent bypassing the proxy and reach the docker container directly, `127.0.0.1` is specified in the run command.
> This image is hosted by [linuxserver.io](https://linuxserver.io). For more information visit https://hub.docker.com/r/linuxserver/pairdrop
### Options / Flags
Set options by using the following flags in the `docker run` command:
#### Port
```
-p 127.0.0.1:8080:3000
```
> Specify the port used by the docker image
> - 3000 -> `-p 127.0.0.1:3000:3000`
> - 8080 -> `-p 127.0.0.1:8080:3000`
#### Rate limiting requests
```
-e RATE_LIMIT=true
```
> Limits clients to 100 requests per 5 min
#### Websocket Fallback (for VPN)
```
-e WS_FALLBACK=true
```
> Provides PairDrop to clients with an included websocket fallback if the peer to peer WebRTC connection is not available to the client.
>
> This is not used on the official https://pairdrop.net, but you can activate it on your self-hosted instance.
> This is especially useful if you connect to your instance via a VPN as most VPN services block WebRTC completely in order to hide your real IP address ([read more](https://privacysavvy.com/security/safe-browsing/disable-webrtc-chrome-firefox-safari-opera-edge/)).
>
> **Warning:** All traffic sent between devices using this fallback is routed through the server and therefor not peer to peer!
> Beware that the traffic routed via this fallback is readable by the server. Only ever use this on instances you can trust.
> Additionally, beware that all traffic using this fallback debits the servers data plan.
<br>
## Deployment with Docker with self-built image
### Build the image
### Docker Image from GitHub Container Registry (ghcr.io)
```bash
docker run -d --restart=unless-stopped --name=pairdrop -p 127.0.0.1:3000:3000 ghcr.io/schlagmichdoch/pairdrop
```
<br>
### Docker Image self-built
#### Build the image
```bash
docker build --pull . -f Dockerfile -t pairdrop
```
> A GitHub action is set up to do this step automatically.
> A GitHub action is set up to do this step automatically at the release of new versions.
>
> `--pull` ensures always the latest node image is used.
### Run the image
```bash
docker run -d --restart=unless-stopped --name=pairdrop -p 127.0.0.1:3000:3000 -it pairdrop npm run start:prod
```
> You must use a server proxy to set the X-Forwarded-For to prevent all clients from discovering each other (See [#HTTP-Server](#http-server)).
>
> To prevent bypassing the proxy and reach the docker container directly, `127.0.0.1` is specified in the run command.
>
> To specify options replace `npm run start:prod` according to [the documentation above.](#options--flags)
#### Run the image
## Deployment with node
```bash
docker run -d --restart=unless-stopped --name=pairdrop -p 127.0.0.1:3000:3000 -it pairdrop
```
> You must use a server proxy to set the `X-Forwarded-For` header
> to prevent all clients from discovering each other (See [#HTTP-Server](#http-server)).
>
> To prevent bypassing the proxy by reaching the docker container directly,
> `127.0.0.1` is specified in the run command.
<br>
### Flags
Set options by using the following flags in the `docker run` command:
#### Port
```bash
-p 127.0.0.1:8080:3000
```
> Specify the port used by the docker image
>
> - 3000 -> `-p 127.0.0.1:3000:3000`
> - 8080 -> `-p 127.0.0.1:8080:3000`
#### Set Environment Variables via Docker
Environment Variables are set directly in the `docker run` command: \
e.g. `docker run -p 127.0.0.1:3000:3000 -it pairdrop -e DEBUG_MODE="true"`
Overview of available Environment Variables are found [here](#environment-variables).
Example:
```bash
docker run -d \
--name=pairdrop \
--restart=unless-stopped \
-p 127.0.0.1:3000:3000 \
-e PUID=1000 \
-e PGID=1000 \
-e WS_SERVER=false \
-e WS_FALLBACK=false \
-e RTC_CONFIG=false \
-e RATE_LIMIT=false \
-e DEBUG_MODE=false \
-e TZ=Etc/UTC \
lscr.io/linuxserver/pairdrop
```
<br>
## Deployment with Docker Compose
Here's an example docker compose file:
```yaml
version: "3"
services:
pairdrop:
image: "lscr.io/linuxserver/pairdrop:latest"
container_name: pairdrop
restart: unless-stopped
environment:
- PUID=1000 # UID to run the application as
- PGID=1000 # GID to run the application as
- WS_FALLBACK=false # Set to true to enable websocket fallback if the peer to peer WebRTC connection is not available to the client.
- RATE_LIMIT=false # Set to true to limit clients to 1000 requests per 5 min.
- RTC_CONFIG=false # Set to the path of a file that specifies the STUN/TURN servers.
- DEBUG_MODE=false # Set to true to debug container and peer connections.
- TZ=Etc/UTC # Time Zone
ports:
- "127.0.0.1:3000:3000" # Web UI
```
Run the compose file with `docker compose up -d`.
> You must use a server proxy to set the `X-Forwarded-For` header
> to prevent all clients from discovering each other (See [#HTTP-Server](#http-server)).
>
> To prevent bypassing the proxy by reaching the Docker container
> directly, `127.0.0.1` is specified in the `ports` argument.
<br>
## Deployment with Node.js
Clone this repository and enter the folder
```bash
git clone https://github.com/schlagmichdoch/PairDrop.git && cd PairDrop
@ -74,90 +167,318 @@ npm install
Start the server with:
```bash
node index.js
```
or
```bash
npm start
```
> Remember to check your IP Address using your OS command to see where you can access the server.
> By default, the node server listens on port 3000.
<br>
### Environment variables
#### Port
On Unix based systems
```bash
PORT=3010 npm start
```
On Windows
```bash
$env:PORT=3010; npm start
```
> Specify the port PairDrop is running on. (Default: 3000)
### Options / Flags
These are some flags only reasonable when deploying via Node.js
#### Port
```bash
PORT=3000
```
> Default: `3000`
>
> Environment variable to specify the port used by the Node.js server \
> e.g. `PORT=3010 npm start`
#### Local Run
```bash
npm start -- --localhost-only
```
> Only allow connections from localhost.
>
> You must use a server proxy to set the X-Forwarded-For to prevent all clients from discovering each other (See [#HTTP-Server](#http-server)).
>
> Use this when deploying PairDrop with node to prevent bypassing the proxy and reach the docker container directly.
> You must use a server proxy to set the `X-Forwarded-For` header
> to prevent all clients from discovering each other (See [#HTTP-Server](#http-server)).
>
> Use this when deploying PairDrop with node to prevent
> bypassing the reverse proxy by reaching the Node.js server directly.
#### Automatic restart on error
```bash
npm start -- --auto-restart
npm start -- --auto-restart
```
> Restarts server automatically on error
<br>
#### Rate limiting requests
```bash
npm start -- --rate-limit
```
> Limits clients to 100 requests per 5 min
<br>
#### Websocket Fallback (for VPN)
```bash
npm start -- --include-ws-fallback
```
> Provides PairDrop to clients with an included websocket fallback if the peer to peer WebRTC connection is not available to the client.
>
> This is not used on the official https://pairdrop.net, but you can activate it on your self-hosted instance.
> This is especially useful if you connect to your instance via a VPN as most VPN services block WebRTC completely in order to hide your real IP address ([read more](https://privacysavvy.com/security/safe-browsing/disable-webrtc-chrome-firefox-safari-opera-edge/)).
>
> **Warning:** All traffic sent between devices using this fallback is routed through the server and therefor not peer to peer!
> Beware that the traffic routed via this fallback is readable by the server. Only ever use this on instances you can trust.
> Additionally, beware that all traffic using this fallback debits the servers data plan.
<br>
#### Production (autostart and rate-limit)
```bash
npm run start:prod
```
#### Production (autostart, rate-limit, localhost-only and websocket fallback for VPN)
> shortcut for `RATE_LIMIT=5 npm start -- --auto-restart`
#### Production (autostart, rate-limit, localhost-only)
```bash
npm run start:prod -- --localhost-only --include-ws-fallback
npm run start:prod -- --localhost-only
```
> To prevent connections to the node server from bypassing the proxy server you should always use "--localhost-only" on production.
> To prevent connections to the node server from bypassing \
> the proxy server you should always use "--localhost-only" on production.
#### Set Environment Variables via Node.js
To specify environment variables set them in the run command in front of `npm start`.
The syntax is different on Unix and Windows.
On Unix based systems
```bash
PORT=3000 RTC_CONFIG="rtc_config.json" npm start
```
On Windows
```bash
$env:PORT=3000 RTC_CONFIG="rtc_config.json"; npm start
```
Overview of available Environment Variables are found [here](#environment-variables).
<br>
## Environment Variables
### Debug Mode
```bash
DEBUG_MODE="true"
```
> Default: `false`
>
> Logs the used environment variables for debugging.
>
> Prints debugging information about the connecting peers IP addresses.
>
> This is quite useful to check whether the [#HTTP-Server](#http-server)
> is configured correctly, so the auto-discovery feature works correctly.
> Otherwise, all clients discover each other mutually, independently of their network status.
>
> If this flag is set to `"true"` each peer that connects to the PairDrop server will produce a log to STDOUT like this:
>
> ```
> ----DEBUGGING-PEER-IP-START----
> remoteAddress: ::ffff:172.17.0.1
> x-forwarded-for: 19.117.63.126
> cf-connecting-ip: undefined
> PairDrop uses: 19.117.63.126
> IP is private: false
> if IP is private, '127.0.0.1' is used instead
> ----DEBUGGING-PEER-IP-END----
> ```
>
> If the IP address "PairDrop uses" matches the public IP address of the client device, everything is set up correctly. \
> To find out the public IP address of the client device visit https://whatsmyip.com/.
>
> To preserve your clients' privacy: \
> **Never use this environment variable in production!**
<br>
### Rate limiting requests
```bash
RATE_LIMIT=1
```
> Default: `false`
>
> Limits clients to 1000 requests per 5 min
>
> "If you are behind a proxy/load balancer (usually the case with most hosting services, e.g. Heroku, Bluemix, AWS ELB,
> Render, Nginx, Cloudflare, Akamai, Fastly, Firebase Hosting, Rackspace LB, Riverbed Stingray, etc.), the IP address of
> the request might be the IP of the load balancer/reverse proxy (making the rate limiter effectively a global one and
> blocking all requests once the limit is reached) or undefined."
> (See: https://express-rate-limit.mintlify.app/guides/troubleshooting-proxy-issues)
>
> To find the correct number to use for this setting:
>
> 1. Start PairDrop with `DEBUG_MODE=True` and `RATE_LIMIT=1`
> 2. Make a `get` request to `/ip` of the PairDrop instance (e.g. `https://pairdrop-example.net/ip`)
> 3. Check if the IP address returned in the response matches your public IP address (find out by visiting e.g. https://whatsmyip.com/)
> 4. You have found the correct number if the IP addresses match. If not, then increase `RATE_LIMIT` by one and redo 1. - 4.
>
> e.g. on Render you must use RATE_LIMIT=5
<br>
### IPv6 Localization
```bash
IPV6_LOCALIZE=4
```
> Default: `false`
>
> To enable Peer Auto-Discovery among IPv6 peers, you can specify a reduced number of segments \
> of the client IPv6 address to be evaluated as the peer's IP. \
> This can be especially useful when using Cloudflare as a proxy.
>
> The flag must be set to an **integer** between `1` and `7`. \
> The number represents the number of IPv6 [hextets](https://en.wikipedia.org/wiki/IPv6#Address_representation) \
> to match the client IP against. The most common value would be `4`, \
> which will group peers within the same `/64` subnet.
<br>
### Websocket Fallback (for VPN)
```bash
WS_FALLBACK=true
```
> Default: `false`
>
> Provides PairDrop to clients with an included websocket fallback \
> if the peer to peer WebRTC connection is not available to the client.
>
> This is not used on the official https://pairdrop.net website,
> but you can activate it on your self-hosted instance.\
> This is especially useful if you connect to your instance via a VPN (as most VPN services block WebRTC completely in
> order to hide your real IP address). ([Read more here](https://privacysavvy.com/security/safe-browsing/disable-webrtc-chrome-firefox-safari-opera-edge/)).
>
> **Warning:** \
> All traffic sent between devices using this fallback
> is routed through the server and therefor not peer to peer!
>
> Beware that the traffic routed via this fallback is readable by the server. \
> Only ever use this on instances you can trust.
>
> Additionally, beware that all traffic using this fallback debits the servers data plan.
<br>
### Specify STUN/TURN Servers
```bash
RTC_CONFIG="rtc_config.json"
```
> Default: `false`
>
> Specify the STUN/TURN servers PairDrop clients use by setting \
> `RTC_CONFIG` to a JSON file including the configuration. \
> You can use `rtc_config_example.json` as a starting point.
>
> To host your own TURN server you can follow this guide: https://gabrieltanner.org/blog/turn-server/
> Alternatively, use a free, pre-configured TURN server like [OpenRelay](<[url](https://www.metered.ca/tools/openrelay/)>)
>
> Default configuration:
>
> ```json
> {
> "sdpSemantics": "unified-plan",
> "iceServers": [
> {
> "urls": "stun:stun.l.google.com:19302"
> }
> ]
> }
> ```
<br>
You can host an instance that uses another signaling server
This can be useful if you don't want to trust the client files that are hosted on another instance but still want to connect to devices that use https://pairdrop.net.
### Specify Signaling Server
```bash
SIGNALING_SERVER="pairdrop.net"
```
> Default: `false`
>
> By default, clients connecting to your instance use the signaling server of your instance to connect to other devices.
>
> By using `SIGNALING_SERVER`, you can host an instance that uses another signaling server.
>
> This can be useful if you want to ensure the integrity of the client files and don't want to trust the client files that are hosted on another PairDrop instance but still want to connect to devices that use the other instance.
> E.g. host your own client files under *pairdrop.your-domain.com* but use the official signaling server under *pairdrop.net*
> This way devices connecting to *pairdrop.your-domain.com* and *pairdrop.net* can discover each other.
>
> Beware that the version of your PairDrop server must be compatible with the version of the signaling server.
>
> `SIGNALING_SERVER` must be a valid url without the protocol prefix.
> Examples of valid values: `pairdrop.net`, `pairdrop.your-domain.com:3000`, `your-domain.com/pairdrop`
<br>
### Customizable buttons for the _About PairDrop_ page
```bash
DONATION_BUTTON_ACTIVE=true
DONATION_BUTTON_LINK="https://www.buymeacoffee.com/pairdrop"
DONATION_BUTTON_TITLE="Buy me a coffee"
TWITTER_BUTTON_ACTIVE=true
TWITTER_BUTTON_LINK="https://twitter.com/account"
TWITTER_BUTTON_TITLE="Find me on Twitter"
MASTODON_BUTTON_ACTIVE=true
MASTODON_BUTTON_LINK="https://mastodon.social/account"
MASTODON_BUTTON_TITLE="Find me on Mastodon"
BLUESKY_BUTTON_ACTIVE=true
BLUESKY_BUTTON_LINK="https://bsky.app/profile/account"
BLUESKY_BUTTON_TITLE="Find me on Bluesky"
CUSTOM_BUTTON_ACTIVE=true
CUSTOM_BUTTON_LINK="https://your-custom-social-network.net/account"
CUSTOM_BUTTON_TITLE="Find me on this custom social network"
PRIVACYPOLICY_BUTTON_ACTIVE=true
PRIVACYPOLICY_BUTTON_LINK="https://link-to-your-privacy-policy.net"
PRIVACYPOLICY_BUTTON_TITLE="Open our privacy policy"
```
> Default: unset
>
> By default, clients will show the default button configuration: GitHub, BuyMeACoffee, Twitter, and FAQ on GitHub.
>
> The GitHub and FAQ on GitHub buttons are essential, so they are always shown.
>
> The other buttons can be customized:
>
> * `*_BUTTON_ACTIVE`: set this to `true` to show a natively hidden button or to `false` to hide a normally shown button
> * `*_BUTTON_LINK`: set this to any URL to overwrite the href attribute of the button
> * `*_BUTTON_TITLE`: set this to overwrite the hover title of the button. This will prevent the title from being translated.
<br>
## Healthcheck
> The Docker Image hosted on `ghcr.io` and the self-built Docker Image include a healthcheck.
>
> Read more about [Docker Swarm Usage](docker-swarm-usage.md#docker-swarm-usage).
<br>
## HTTP-Server
When running PairDrop, the `X-Forwarded-For` header has to be set by a proxy. Otherwise, all clients will be mutually visible.
When running PairDrop, the `X-Forwarded-For` header has to be set by a proxy. \
Otherwise, all clients will be mutually visible.
To check if your setup is configured correctly [use the environment variable `DEBUG_MODE="true"`](#debug-mode).
### Using nginx
#### Allow http and https requests
```
server {
listen 80;
@ -191,6 +512,7 @@ server {
```
#### Automatic http to https redirect:
```
server {
listen 80;
@ -219,100 +541,169 @@ server {
}
```
<br>
### Using Apache
install modules `proxy`, `proxy_http`, `mod_proxy_wstunnel`
```shell
```bash
a2enmod proxy
```
```shell
```bash
a2enmod proxy_http
```
```shell
a2enmod proxy_wstunnel
```
<br>
Create a new configuration file under `/etc/apache2/sites-available` (on debian)
Create a new configuration file under `/etc/apache2/sites-available` (on Debian)
**pairdrop.conf**
#### Allow http and https requests
```
<VirtualHost *:80>
ProxyPass / http://127.0.0.1:3000/
RewriteEngine on
RewriteCond %{HTTP:Upgrade} websocket [NC]
RewriteCond %{HTTP:Connection} upgrade [NC]
RewriteRule ^/?(.*) "ws://127.0.0.1:3000/$1" [P,L]
#### Allow HTTP and HTTPS requests
```apacheconf
<VirtualHost *:80>
ProxyPass / http://127.0.0.1:3000/ upgrade=websocket
</VirtualHost>
<VirtualHost *:443>
ProxyPass / https://127.0.0.1:3000/
RewriteEngine on
RewriteCond %{HTTP:Upgrade} websocket [NC]
RewriteCond %{HTTP:Connection} upgrade [NC]
RewriteRule ^/?(.*) "wws://127.0.0.1:3000/$1" [P,L]
<VirtualHost *:443>
ProxyPass / https://127.0.0.1:3000/ upgrade=websocket
</VirtualHost>
```
#### Automatic http to https redirect:
```
<VirtualHost *:80>
Redirect permanent / https://127.0.0.1:3000/
#### Automatic HTTP to HTTPS redirect:
```apacheconf
<VirtualHost *:80>
Redirect permanent / https://127.0.0.1:3000/
</VirtualHost>
<VirtualHost *:443>
ProxyPass / https://127.0.0.1:3000/
RewriteEngine on
RewriteCond %{HTTP:Upgrade} websocket [NC]
RewriteCond %{HTTP:Connection} upgrade [NC]
RewriteRule ^/?(.*) "wws://127.0.0.1:3000/$1" [P,L]
<VirtualHost *:443>
ProxyPass / http://127.0.0.1:3000/ upgrade=websocket
</VirtualHost>
```
Activate the new virtual host and reload apache:
```shell
Activate the new virtual host and reload Apache:
```bash
a2ensite pairdrop
```
```shell
```bash
service apache2 reload
```
# Local Development
## Install
All files needed for developing are available on the branch `dev`.
<br>
First, [Install docker with docker-compose.](https://docs.docker.com/compose/install/)
## Coturn and PairDrop via Docker Compose
Then, clone the repository and run docker-compose:
```shell
git clone https://github.com/schlagmichdoch/PairDrop.git
cd PairDrop
git checkout dev
docker-compose up -d
```
Now point your browser to `http://localhost:8080`.
- To restart the containers run `docker-compose restart`.
- To stop the containers run `docker-compose stop`.
- To debug the NodeJS server run `docker logs pairdrop_node_1`.
### Setup container
To run coturn and PairDrop at once by using the `docker-compose-coturn.yml` with TURN over TLS enabled
you need to follow these steps:
1. Generate or retrieve certificates for your `<DOMAIN>` (e.g. letsencrypt / certbot)
2. Create `./ssl` folder: `mkdir ssl`
3. Copy your ssl-certificates and the privkey to `./ssl`
4. Restrict access to `./ssl`: `chown -R nobody:nogroup ./ssl`
5. Create a dh-params file: `openssl dhparam -out ./ssl/dhparams.pem 4096`
6. Copy `rtc_config_example.json` to `rtc_config.json`
7. Copy `turnserver_example.conf` to `turnserver.conf`
8. Change `<DOMAIN>` in both files to the domain where your PairDrop instance is running
9. Change `username` and `password` in `turnserver.conf` and `rtc-config.json`
10. To start the container including coturn run: \
`docker compose -f docker-compose-coturn.yml up -d`
<br>
## Testing PWA related features
PWAs require that the app is served under a correctly set up and trusted TLS endpoint.
#### Setup container
To restart the container including coturn run: \
`docker compose -f docker-compose-coturn.yml restart`
The nginx container creates a CA certificate and a website certificate for you. To correctly set the common name of the certificate, you need to change the FQDN environment variable in `docker/fqdn.env` to the fully qualified domain name of your workstation.
<br>
If you want to test PWA features, you need to trust the CA of the certificate for your local deployment. For your convenience, you can download the crt file from `http://<Your FQDN>:8080/ca.crt`. Install that certificate to the trust store of your operating system.
- On Windows, make sure to install it to the `Trusted Root Certification Authorities` store.
- On MacOS, double click the installed CA certificate in `Keychain Access`, expand `Trust`, and select `Always Trust` for SSL.
- Firefox uses its own trust store. To install the CA, point Firefox at `http://<Your FQDN>:8080/ca.crt`. When prompted, select `Trust this CA to identify websites` and click OK.
- When using Chrome, you need to restart Chrome so it reloads the trust store (`chrome://restart`). Additionally, after installing a new cert, you need to clear the Storage (DevTools -> Application -> Clear storage -> Clear site data).
#### Setup container
To stop the container including coturn run: \
`docker compose -f docker-compose-coturn.yml stop`
<br>
### Firewall
To run PairDrop including its own coturn-server you need to punch holes in the firewall. These ports must be opened additionally:
- 3478 tcp/udp
- 5349 tcp/udp
- 10000:20000 tcp/udp
<br>
## Local Development
### Install
All files needed for developing are available in the folder `./dev`.
For convenience, there is also a docker compose file for developing:
#### Developing with docker compose
First, [Install docker with docker compose.](https://docs.docker.com/compose/install/)
Then, clone the repository and run docker compose:
```bash
git clone https://github.com/schlagmichdoch/PairDrop.git && cd PairDrop
```
```bash
docker compose -f docker-compose-dev.yml up --no-deps --build
```
Now point your web browser to `http://localhost:8080`.
- To debug the Node.js server, run `docker logs pairdrop`.
- After changes to the code you have to rerun the `docker compose` command
<br>
#### Testing PWA related features
PWAs requires the app to be served under a correctly set up and trusted TLS endpoint.
The NGINX container creates a CA certificate and a website certificate for you.
To correctly set the common name of the certificate,
you need to change the FQDN environment variable in `docker-compose-dev.yml`
to the fully qualified domain name of your workstation. (Default: localhost)
If you want to test PWA features, you need to trust the CA of the certificate for your local deployment. \
For your convenience, you can download the crt file from `http://<Your FQDN>:8080/ca.crt`. \
Install that certificate to the trust store of your operating system. \
##### Windows
- Make sure to install it to the `Trusted Root Certification Authorities` store.
##### macOS
- Double-click the installed CA certificate in `Keychain Access`,
- expand `Trust`, and select `Always Trust` for SSL.
##### Firefox
Firefox uses its own trust store. To install the CA:
- point Firefox at `http://<Your FQDN>:8080/ca.crt` (Default: `http://localhost:8080/ca.crt`)
- When prompted, select `Trust this CA to identify websites` and click _OK_.
Alternatively:
1. Download `ca.crt` from `http://<Your FQDN>:8080/ca.crt` (Default: `http://localhost:8080/ca.crt`)
2. Go to `about:preferences#privacy` scroll down to `Security` and `Certificates` and click `View Certificates`
3. Import the downloaded certificate file (step 1)
##### Chrome
- When using Chrome, you need to restart Chrome so it reloads the trust store (`chrome://restart`).
- Additionally, after installing a new cert, you need to clear the Storage (DevTools → Application → Clear storage → Clear site data).
##### Google Chrome
- To skip the installation of the certificate, you can also open `chrome://flags/#unsafely-treat-insecure-origin-as-secure`
- The feature `Insecure origins treated as secure` must be enabled and the list must include your PairDrop test instance. E.g.: `http://127.0.0.1:3000,https://127.0.0.1:8443`
Please note that the certificates (CA and webserver cert) expire after a day.
Also, whenever you restart the nginx docker, container new certificates are created.
Also, whenever you restart the NGINX Docker container new certificates are created.
The site is served on `https://<Your FQDN>:8443`.
The site is served on `https://<Your FQDN>:8443` (Default: `https://localhost:8443`).
[< Back](/README.md)

View file

@ -1,41 +1,142 @@
# How-To
## Share files directly from context menu on Windows
### Registering to open files with PairDrop
The [File Handling API](https://learn.microsoft.com/en-us/microsoft-edge/progressive-web-apps-chromium/how-to/handle-files) is implemented
This is still experimental and must be enabled via a flag **before** the PWA is installed to Windows.
1. [Enabled feature in Edge](https://learn.microsoft.com/en-us/microsoft-edge/progressive-web-apps-chromium/how-to/handle-files#enable-the-file-handling-api)
2. Install PairDrop by visiting https://pairdrop.net/ with the Edge browser and install it as described [here](faq.md#help--i-cant-install-the-pwa-).
3. You are done! You can now send most files one at a time via PairDrop:
_context menu > Open with > PairDrop_
[//]: # (Todo: add screenshots)
### Sending multiple files to PairDrop
Outstandingly, it is also possible to send multiple files to PairDrop via the context menu by adding PairDrop to the `Send to` menu:
1. [Register PairDrop as file handler](#registering-to-open-files-with-pairdrop)
2. Hit Windows Key+R, type: `shell:programs` and hit Enter.
3. Copy the PairDrop shortcut from the directory
4. Hit Windows Key+R, type: `shell:sendto` and hit Enter.
5. Paste the copied shortcut into the directory
6. You are done! You can now send multiple files (but no directories) directly via PairDrop:
_context menu > Send to > PairDrop_
[//]: # (Todo: add screenshots)
## Share directly from share menu on iOS
I created an iOS shortcut to send images, files, folder, URLs or text directly from the share-menu
## Send directly from share menu on iOS
I created an iOS shortcut to send images, files, folder, URLs \
or text directly from the share-menu
https://routinehub.co/shortcut/13990/
[//]: # (Todo: add doku with screenshots)
[//]: # (Todo: Add screenshots)
<br>
## Share directly from share menu on Android
The [Web Share Target API](https://developer.mozilla.org/en-US/docs/Web/Manifest/share_target) is implemented but not yet tested.
When the PWA is installed, it should register itself to the share-menu of the device automatically.
## Send directly from share menu on Android
The [Web Share Target API](https://developer.mozilla.org/en-US/docs/Web/Manifest/share_target) is implemented.
Please test this feature and create an issue if it does not work.
When the PWA is installed, it will register itself to the share-menu of the device automatically.
<br>
## Send directly via command-line interface
Send files or text with PairDrop via command-line interface. \
This opens PairDrop in the default browser where you can choose the receiver.
### Usage
```bash
pairdrop -h
```
```
Send files or text with PairDrop via command-line interface.
Current domain: https://pairdrop-dev.onrender.com/
Usage:
Open PairDrop: pairdrop
Send files: pairdrop file1/directory1 (file2/directory2 file3/directory3 ...)
Send text: pairdrop -t "text"
Specify domain: pairdrop -d "https://pairdrop.net/"
Show this help text: pairdrop (-h|--help)
This pairdrop-cli version was released alongside v1.10.4
```
<br>
### Setup
#### Linux / Mac
1. Download the latest _pairdrop-cli.zip_ from the [releases page](https://github.com/schlagmichdoch/PairDrop/releases)
```shell
wget "https://github.com/schlagmichdoch/PairDrop/releases/download/v1.11.2/pairdrop-cli.zip"
```
or
```shell
curl -LO "https://github.com/schlagmichdoch/PairDrop/releases/download/v1.11.2/pairdrop-cli.zip"
```
2. Unzip the archive to a folder of your choice e.g. `/usr/share/pairdrop-cli/`
```shell
sudo unzip pairdrop-cli.zip -d /usr/share/pairdrop-cli/
```
3. Copy the file _.pairdrop-cli-config.example_ to _.pairdrop-cli-config_
```shell
sudo cp /usr/share/pairdrop-cli/.pairdrop-cli-config.example /usr/share/pairdrop-cli/.pairdrop-cli-config
```
4. Make the bash file _pairdrop_ executable
```shell
sudo chmod +x /usr/share/pairdrop-cli/pairdrop
```
5. Add a symlink to /usr/local/bin/ to include _pairdrop_ to _PATH_
```shell
sudo ln -s /usr/share/pairdrop-cli/pairdrop /usr/local/bin/pairdrop
```
<br>
#### Windows
1. Download the latest _pairdrop-cli.zip_ from the [releases page](https://github.com/schlagmichdoch/PairDrop/releases)
2. Put file in a preferred folder e.g. `C:\Program Files\pairdrop-cli`
3. Inside this folder, copy the file _.pairdrop-cli-config.example_ to _.pairdrop-cli-config_
4. Search for and open `Edit environment variables for your account`
5. Click `Environment Variables…`
6. Under _System Variables_ select `Path` and click _Edit..._
7. Click _New_, insert the preferred folder (`C:\Program Files\pairdrop-cli`), click *OK* until all windows are closed
8. Reopen Command prompt window
**Requirements**
As Windows cannot execute bash scripts natively, you need to install [Git Bash](https://gitforwindows.org/).
Then, you can also use pairdrop-cli from the default Windows Command Prompt
by using the shell file instead of the bash file which then itself executes
_pairdrop-cli_ (the bash file) via the Git Bash.
```shell
pairdrop.sh -h
```
<br>
## Send multiple files and directories directly from context menu on Windows
### Registering to open files with PairDrop
It is possible to send multiple files with PairDrop via the context menu by adding pairdrop-cli to Windows `Send to` menu:
1. Download the latest _pairdrop-cli.zip_ from the [releases page](https://github.com/schlagmichdoch/PairDrop/releases)
2. Unzip the archive to a folder of your choice e.g. `C:\Program Files\pairdrop-cli\`
3. Inside this folder, copy the file _.pairdrop-cli-config.example_ to _.pairdrop-cli-config_
4. Copy the shortcut _send with PairDrop.lnk_
5. Hit Windows Key+R, type: `shell:sendto` and hit Enter.
6. Paste the copied shortcut into the directory
7. Open the properties window of the shortcut and edit the link field to point to _send-with-pairdrop.ps1_ located in the folder you used in step 2: \
`"C:\Program Files\PowerShell\7\pwsh.exe" -File "C:\Program Files\pairdrop-cli\send-with-pairdrop.ps1"`
8. You are done! You can now send multiple files and directories directly via PairDrop:
_context menu_ > _Send to_ > _PairDrop_
##### Requirements
As Windows cannot execute bash scripts natively, you need to install [Git Bash](https://gitforwindows.org/).
<br>
## Send multiple files and directories directly from context menu on Ubuntu using Nautilus
### Registering to open files with PairDrop
It is possible to send multiple files with PairDrop via the context menu by adding pairdrop-cli to Nautilus `Scripts` menu:
1. Register _pairdrop_ as executable via [guide above](#linux).
2. Copy the shell file _send-with-pairdrop_ to `~/.local/share/nautilus/scripts/` to include it in the context menu
```shell
cp /usr/share/pairdrop-cli/send-with-pairdrop ~/.local/share/nautilus/scripts/
```
3. Make the shell file _send-with-pairdrop_ executable
```shell
chmod +x ~/.local/share/nautilus/scripts/send-with-pairdrop
```
4. You are done! You can now send multiple files and directories directly via PairDrop:
_context menu_ > _Scripts_ > _send-with-pairdrop_
<br>
## File Handling API
The [File Handling API](https://learn.microsoft.com/en-us/microsoft-edge/progressive-web-apps-chromium/how-to/handle-files)
was implemented, but it was removed as default file associations were overwritten ([#17](https://github.com/schlagmichdoch/PairDrop/issues/17),
[#116](https://github.com/schlagmichdoch/PairDrop/issues/116) [#190](https://github.com/schlagmichdoch/PairDrop/issues/190))
and it only worked with explicitly specified file types and couldn't handle directories at all.
[< Back](/README.md)

Binary file not shown.

Before

Width:  |  Height:  |  Size: 326 KiB

After

Width:  |  Height:  |  Size: 1.5 MiB

Before After
Before After

View file

@ -3,48 +3,80 @@
Encryption is mandatory for WebRTC connections and completely done by the browser itself.
When the peers are first connecting, a channel is created by exchanging their signaling information.
This signaling information includes some sort of public key and is specific to the clients ip address.
That is what the STUN Server is used for: it simply returns your public IP address as you only know your local ip address
When the peers are first connecting, \
a channel is created by exchanging their signaling info. \
This signaling information includes some sort of public key \
and is specific to the clients IP address. \
That is what the STUN Server is used for: \
it simply returns your public IP address \
as you only know your local ip address \
if behind a NAT (router).
The transfer of the signaling information is done by the PairDrop / Snapdrop server using secure websockets.
After that the channel itself is completely peer-2-peer and all information can only be decrypted by the receiver.
When the two peers are on the same network or when they are not behind any NAT system (which they are always for classic
Snapdrop and for not paired users on PairDrop) the files are send directly peer to peer.
The transfer of the signaling info is done by the \
PairDrop / Snapdrop server using secure websockets. \
After that the channel itself is completely peer-to-peer \
and all info can only be decrypted by the receiver. \
When the two peers are on the same network \
or when they are not behind any NAT system \
(which they are always for classic \
Snapdrop and for not paired users on PairDrop) \
the files are send directly peer-to-peer.
When a user is behind a NAT (behind a router) the contents are channeled through a TURN server.
But again, the contents send via the channel can only be decrypted by the receiver. So a rogue TURN server could only
see that there is a connection, but not what is sent. Obviously, connections which are channeled through a TURN server
are not as fast as peer to peer.
When a user is behind a NAT (behind a router) \
the contents are channeled through a TURN server. \
But again, the contents send via the channel \
can only be decrypted by the receiver. \
So a rogue TURN server could only \
see that there is a connection, but not what is sent. \
Obviously, connections which are channeled through a TURN server \
are not as fast as peer-to-peer.
The selection whether a TURN server is needed or not is also done automatically by the browser.
It simply iterated through the configured RTC iceServers and checks what works. Only if the STUN server is not sufficient,
The selection whether a TURN server is needed \
or not is also done automatically by the web browser. \
It simply iterated through the configured \
RTC iceServers and checks what works. \
Only if the STUN server is not sufficient, \
the TURN server is used.
![img](https://www.wowza.com/wp-content/uploads/WeRTC-Encryption-Diagrams-01.jpg)
_Diagram created by wowza.com_
Good thing: if your device has an IPv6 address it is uniquely reachable by that address. As I understand it, when both devices are using IPv6 addresses there is no need for a TURN server in any scenario.
Good thing: if your device has an IPv6 address \
it is uniquely reachable by that address. \
As I understand it, when both devices are using \
IPv6 addresses there is no need for a TURN server in any scenario.
To learn more take a look at https://www.wowza.com/blog/webrtc-encryption-and-security which gives a good insight into stun, turn and webrtc
Learn more by reading https://www.wowza.com/blog/webrtc-encryption-and-security \
which gives a good insight into STUN, TURN and WebRTC.
## Device Pairing
The pairing functionality uses the [IndexedDB API](https://developer.mozilla.org/en-US/docs/Web/API/IndexedDB_API).
It works by creating long secrets that are served by the server to the initiating and requesting pair peer,
when the inserted key is correct. These long secrets are then saved to an indexedDB database in the browser.
IndexedDB is somewhat the successor of localStorage as saved data is shared between all tabs.
It goes one step further by making the data persistent and available offline if implemented to a PWA.
It works by creating long secrets that are served \
by the server to the initiating and requesting pair peer, \
when the inserted key is correct. \
These long secrets are then saved to an \
indexedDB database in the web browser. \
IndexedDB is somewhat the successor of localStorage \
as saved data is shared between all tabs. \
It goes one step further by making the data persistent \
and available offline if implemented to a PWA.
All secrets a client has saved to its database are send to the PairDrop server. Peers with a common secret are discoverable
to each other analog to peers with the same ip-address are discoverable to each other.
All secrets a client has saved to its database \
are sent to the PairDrop server. \
Peers with a common secret are discoverable \
to each other analog to peers with the same \
IP address are discoverable by each other.
What I really like about this approach, and the reason why I implemented it, is that devices on the same network are always
visible regardless whether any devices are paired or not. The main user flow is never obstructed. Paired devices are simply
shown additionally. This makes it in my idea better than the idea of using a room system as [discussed here](https://github.com/RobinLinus/snapdrop/pull/214).
What I really like about this approach (and the reason I implemented it) \
is that devices on the same network are always \
visible regardless whether any devices are paired or not. \
The main user flow is never obstructed. \
Paired devices are simply shown additionally. \
This makes it in my idea better than the idea of \
using a room system as [discussed here](https://github.com/RobinLinus/snapdrop/pull/214).
[< Back](/README.md)

615
index.js
View file

@ -1,615 +0,0 @@
const process = require('process')
const crypto = require('crypto')
const {spawn} = require('child_process')
// Handle SIGINT
process.on('SIGINT', () => {
console.info("SIGINT Received, exiting...")
process.exit(0)
})
// Handle SIGTERM
process.on('SIGTERM', () => {
console.info("SIGTERM Received, exiting...")
process.exit(0)
})
// Handle APP ERRORS
process.on('uncaughtException', (error, origin) => {
console.log('----- Uncaught exception -----')
console.log(error)
console.log('----- Exception origin -----')
console.log(origin)
})
process.on('unhandledRejection', (reason, promise) => {
console.log('----- Unhandled Rejection at -----')
console.log(promise)
console.log('----- Reason -----')
console.log(reason)
})
if (process.argv.includes('--auto-restart')) {
process.on(
'uncaughtException',
() => {
process.once(
'exit',
() => spawn(
process.argv.shift(),
process.argv,
{
cwd: process.cwd(),
detached: true,
stdio: 'inherit'
}
)
);
process.exit();
}
);
}
const express = require('express');
const RateLimit = require('express-rate-limit');
const http = require('http');
const app = express();
if (process.argv.includes('--rate-limit')) {
const limiter = RateLimit({
windowMs: 5 * 60 * 1000, // 5 minutes
max: 1000, // Limit each IP to 1000 requests per `window` (here, per 5 minutes)
message: 'Too many requests from this IP Address, please try again after 5 minutes.',
standardHeaders: true, // Return rate limit info in the `RateLimit-*` headers
legacyHeaders: false, // Disable the `X-RateLimit-*` headers
})
app.use(limiter);
// ensure correct client ip and not the ip of the reverse proxy is used for rate limiting on render.com
// see https://github.com/express-rate-limit/express-rate-limit#troubleshooting-proxy-issues
app.set('trust proxy', 5);
}
if (process.argv.includes('--include-ws-fallback')) {
app.use(express.static('public_included_ws_fallback'));
} else {
app.use(express.static('public'));
}
app.use(function(req, res) {
res.redirect('/');
});
app.get('/', (req, res) => {
res.sendFile('index.html');
});
const server = http.createServer(app);
const port = process.env.PORT || 3000;
if (process.argv.includes('--localhost-only')) {
server.listen(port, '127.0.0.1');
} else {
server.listen(port);
}
const parser = require('ua-parser-js');
const { uniqueNamesGenerator, animals, colors } = require('unique-names-generator');
class PairDropServer {
constructor() {
const WebSocket = require('ws');
this._wss = new WebSocket.Server({ server });
this._wss.on('connection', (socket, request) => this._onConnection(new Peer(socket, request)));
this._rooms = {};
this._roomSecrets = {};
console.log('PairDrop is running on port', port);
}
_onConnection(peer) {
this._joinRoom(peer);
peer.socket.on('message', message => this._onMessage(peer, message));
peer.socket.onerror = e => console.error(e);
this._keepAlive(peer);
// send displayName
this._send(peer, {
type: 'display-name',
message: {
displayName: peer.name.displayName,
deviceName: peer.name.deviceName,
peerId: peer.id
}
});
}
_onMessage(sender, message) {
// Try to parse message
try {
message = JSON.parse(message);
} catch (e) {
return; // TODO: handle malformed JSON
}
switch (message.type) {
case 'disconnect':
this._onDisconnect(sender);
break;
case 'pong':
sender.lastBeat = Date.now();
break;
case 'room-secrets':
this._onRoomSecrets(sender, message);
break;
case 'room-secret-deleted':
this._onRoomSecretDeleted(sender, message);
break;
case 'room-secrets-cleared':
this._onRoomSecretsCleared(sender, message);
break;
case 'pair-device-initiate':
this._onPairDeviceInitiate(sender);
break;
case 'pair-device-join':
this._onPairDeviceJoin(sender, message);
break;
case 'pair-device-cancel':
this._onPairDeviceCancel(sender);
break;
case 'resend-peers':
this._notifyPeers(sender);
break;
case 'signal':
default:
this._signalAndRelay(sender, message);
}
}
_signalAndRelay(sender, message) {
const room = message.roomType === 'ip' ? sender.ip : message.roomSecret;
// relay message to recipient
if (message.to && Peer.isValidUuid(message.to) && this._rooms[room]) {
const recipient = this._rooms[room][message.to];
delete message.to;
// add sender
message.sender = {
id: sender.id,
rtcSupported: sender.rtcSupported
};
this._send(recipient, message);
}
}
_onDisconnect(sender) {
this._leaveRoom(sender, 'ip', '', true);
this._leaveAllSecretRooms(sender, true);
this._removeRoomKey(sender.roomKey);
sender.roomKey = null;
}
_onRoomSecrets(sender, message) {
const roomSecrets = message.roomSecrets.filter(roomSecret => {
return /^[\x00-\x7F]{64}$/.test(roomSecret);
})
this._joinSecretRooms(sender, roomSecrets);
}
_onRoomSecretDeleted(sender, message) {
this._deleteSecretRoom(sender, message.roomSecret)
}
_onRoomSecretsCleared(sender, message) {
for (let i = 0; i<message.roomSecrets.length; i++) {
this._deleteSecretRoom(sender, message.roomSecrets[i]);
}
}
_deleteSecretRoom(sender, roomSecret) {
const room = this._rooms[roomSecret];
if (room) {
for (const peerId in room) {
const peer = room[peerId];
this._leaveRoom(peer, 'secret', roomSecret);
this._send(peer, {
type: 'secret-room-deleted',
roomSecret: roomSecret,
});
}
}
this._notifyPeers(sender);
}
getRandomString(length) {
let string = "";
while (string.length < length) {
let arr = new Uint16Array(length);
crypto.webcrypto.getRandomValues(arr);
arr = Array.apply([], arr); /* turn into non-typed array */
arr = arr.map(function (r) {
return r % 128
})
arr = arr.filter(function (r) {
/* strip non-printables: if we transform into desirable range we have a propability bias, so I suppose we better skip this character */
return r === 45 || r >= 47 && r <= 57 || r >= 64 && r <= 90 || r >= 97 && r <= 122;
});
string += String.fromCharCode.apply(String, arr);
}
return string.substring(0, length)
}
_onPairDeviceInitiate(sender) {
let roomSecret = this.getRandomString(64);
let roomKey = this._createRoomKey(sender, roomSecret);
if (sender.roomKey) this._removeRoomKey(sender.roomKey);
sender.roomKey = roomKey;
this._send(sender, {
type: 'pair-device-initiated',
roomSecret: roomSecret,
roomKey: roomKey
});
this._joinRoom(sender, 'secret', roomSecret);
}
_onPairDeviceJoin(sender, message) {
if (sender.roomKeyRate >= 10) {
this._send(sender, { type: 'pair-device-join-key-rate-limit' });
return;
}
sender.roomKeyRate += 1;
setTimeout(_ => sender.roomKeyRate -= 1, 10000);
if (!this._roomSecrets[message.roomKey] || sender.id === this._roomSecrets[message.roomKey].creator.id) {
this._send(sender, { type: 'pair-device-join-key-invalid' });
return;
}
const roomSecret = this._roomSecrets[message.roomKey].roomSecret;
const creator = this._roomSecrets[message.roomKey].creator;
this._removeRoomKey(message.roomKey);
this._send(sender, {
type: 'pair-device-joined',
roomSecret: roomSecret,
peerId: creator.id
});
this._send(creator, {
type: 'pair-device-joined',
roomSecret: roomSecret,
peerId: sender.id
});
this._joinRoom(sender, 'secret', roomSecret);
this._removeRoomKey(sender.roomKey);
}
_onPairDeviceCancel(sender) {
if (sender.roomKey) {
this._send(sender, {
type: 'pair-device-canceled',
roomKey: sender.roomKey,
});
this._removeRoomKey(sender.roomKey);
}
}
_createRoomKey(creator, roomSecret) {
let roomKey;
do {
// get randomInt until keyRoom not occupied
roomKey = crypto.randomInt(1000000, 1999999).toString().substring(1); // include numbers with leading 0s
} while (roomKey in this._roomSecrets)
this._roomSecrets[roomKey] = {
roomSecret: roomSecret,
creator: creator
}
return roomKey;
}
_removeRoomKey(roomKey) {
if (roomKey in this._roomSecrets) {
this._roomSecrets[roomKey].creator.roomKey = null
delete this._roomSecrets[roomKey];
}
}
_joinRoom(peer, roomType = 'ip', roomSecret = '') {
const room = roomType === 'ip' ? peer.ip : roomSecret;
// if room doesn't exist, create it
if (!this._rooms[room]) {
this._rooms[room] = {};
}
this._notifyPeers(peer, roomType, roomSecret);
// add peer to room
this._rooms[room][peer.id] = peer;
// add secret to peer
if (roomType === 'secret') {
peer.addRoomSecret(roomSecret);
}
}
_leaveRoom(peer, roomType = 'ip', roomSecret = '', disconnect = false) {
const room = roomType === 'ip' ? peer.ip : roomSecret;
if (!this._rooms[room] || !this._rooms[room][peer.id]) return;
this._cancelKeepAlive(this._rooms[room][peer.id]);
// delete the peer
delete this._rooms[room][peer.id];
if (roomType === 'ip') {
peer.socket.terminate();
}
//if room is empty, delete the room
if (!Object.keys(this._rooms[room]).length) {
delete this._rooms[room];
} else {
// notify all other peers
for (const otherPeerId in this._rooms[room]) {
const otherPeer = this._rooms[room][otherPeerId];
this._send(otherPeer, {
type: 'peer-left',
peerId: peer.id,
roomType: roomType,
roomSecret: roomSecret,
disconnect: disconnect
});
}
}
//remove secret from peer
if (roomType === 'secret') {
peer.removeRoomSecret(roomSecret);
}
}
_notifyPeers(peer, roomType = 'ip', roomSecret = '') {
const room = roomType === 'ip' ? peer.ip : roomSecret;
if (!this._rooms[room]) return;
// notify all other peers
for (const otherPeerId in this._rooms[room]) {
if (otherPeerId === peer.id) continue;
const otherPeer = this._rooms[room][otherPeerId];
this._send(otherPeer, {
type: 'peer-joined',
peer: peer.getInfo(),
roomType: roomType,
roomSecret: roomSecret
});
}
// notify peer about the other peers
const otherPeers = [];
for (const otherPeerId in this._rooms[room]) {
if (otherPeerId === peer.id) continue;
otherPeers.push(this._rooms[room][otherPeerId].getInfo());
}
this._send(peer, {
type: 'peers',
peers: otherPeers,
roomType: roomType,
roomSecret: roomSecret
});
}
_joinSecretRooms(peer, roomSecrets) {
for (let i=0; i<roomSecrets.length; i++) {
this._joinRoom(peer, 'secret', roomSecrets[i])
}
}
_leaveAllSecretRooms(peer, disconnect = false) {
for (let i=0; i<peer.roomSecrets.length; i++) {
this._leaveRoom(peer, 'secret', peer.roomSecrets[i], disconnect);
}
}
_send(peer, message) {
if (!peer) return;
if (this._wss.readyState !== this._wss.OPEN) return;
message = JSON.stringify(message);
peer.socket.send(message);
}
_keepAlive(peer) {
this._cancelKeepAlive(peer);
let timeout = 500;
if (!peer.lastBeat) {
peer.lastBeat = Date.now();
}
if (Date.now() - peer.lastBeat > 2 * timeout) {
this._leaveRoom(peer);
this._leaveAllSecretRooms(peer);
return;
}
this._send(peer, { type: 'ping' });
peer.timerId = setTimeout(() => this._keepAlive(peer), timeout);
}
_cancelKeepAlive(peer) {
if (peer && peer.timerId) {
clearTimeout(peer.timerId);
}
}
}
class Peer {
constructor(socket, request) {
// set socket
this.socket = socket;
// set remote ip
this._setIP(request);
// set peer id
this._setPeerId(request)
// is WebRTC supported ?
this.rtcSupported = request.url.indexOf('webrtc') > -1;
// set name
this._setName(request);
// for keepalive
this.timerId = 0;
this.lastBeat = Date.now();
this.roomSecrets = [];
this.roomKey = null;
this.roomKeyRate = 0;
}
_setIP(request) {
if (request.headers['cf-connecting-ip']) {
this.ip = request.headers['cf-connecting-ip'].split(/\s*,\s*/)[0];
} else if (request.headers['x-forwarded-for']) {
this.ip = request.headers['x-forwarded-for'].split(/\s*,\s*/)[0];
} else {
this.ip = request.connection.remoteAddress;
}
// remove the prefix used for IPv4-translated addresses
if (this.ip.substring(0,7) === "::ffff:")
this.ip = this.ip.substring(7);
// IPv4 and IPv6 use different values to refer to localhost
// put all peers on the same network as the server into the same room as well
if (this.ip === '::1' || this.ipIsPrivate(this.ip)) {
this.ip = '127.0.0.1';
}
}
ipIsPrivate(ip) {
// if ip is IPv4
if (!ip.includes(":")) {
// 10.0.0.0 - 10.255.255.255 || 172.16.0.0 - 172.31.255.255 || 192.168.0.0 - 192.168.255.255
return /^(10)\.(.*)\.(.*)\.(.*)$/.test(ip) || /^(172)\.(1[6-9]|2[0-9]|3[0-1])\.(.*)\.(.*)$/.test(ip) || /^(192)\.(168)\.(.*)\.(.*)$/.test(ip)
}
// else: ip is IPv6
const firstWord = ip.split(":").find(el => !!el); //get first not empty word
// The original IPv6 Site Local addresses (fec0::/10) are deprecated. Range: fec0 - feff
if (/^fe[c-f][0-f]$/.test(firstWord))
return true;
// These days Unique Local Addresses (ULA) are used in place of Site Local.
// Range: fc00 - fcff
else if (/^fc[0-f]{2}$/.test(firstWord))
return true;
// Range: fd00 - fcff
else if (/^fd[0-f]{2}$/.test(firstWord))
return true;
// Link local addresses (prefixed with fe80) are not routable
else if (firstWord === "fe80")
return true;
// Discard Prefix
else if (firstWord === "100")
return true;
// Any other IP address is not Unique Local Address (ULA)
return false;
}
_setPeerId(request) {
let peer_id = new URL(request.url, "http://server").searchParams.get("peer_id");
if (peer_id && Peer.isValidUuid(peer_id)) {
this.id = peer_id;
} else {
this.id = crypto.randomUUID();
}
}
toString() {
return `<Peer id=${this.id} ip=${this.ip} rtcSupported=${this.rtcSupported}>`
}
_setName(req) {
let ua = parser(req.headers['user-agent']);
let deviceName = '';
if (ua.os && ua.os.name) {
deviceName = ua.os.name.replace('Mac OS', 'Mac') + ' ';
}
if (ua.device.model) {
deviceName += ua.device.model;
} else {
deviceName += ua.browser.name;
}
if(!deviceName)
deviceName = 'Unknown Device';
const displayName = uniqueNamesGenerator({
length: 2,
separator: ' ',
dictionaries: [colors, animals],
style: 'capital',
seed: this.id.hashCode()
})
this.name = {
model: ua.device.model,
os: ua.os.name,
browser: ua.browser.name,
type: ua.device.type,
deviceName,
displayName
};
}
getInfo() {
return {
id: this.id,
name: this.name,
rtcSupported: this.rtcSupported
}
}
static isValidUuid(uuid) {
return /^([0-9]|[a-f]){8}-(([0-9]|[a-f]){4}-){3}([0-9]|[a-f]){12}$/.test(uuid);
}
addRoomSecret(roomSecret) {
if (!(roomSecret in this.roomSecrets)) {
this.roomSecrets.push(roomSecret);
}
}
removeRoomSecret(roomSecret) {
if (roomSecret in this.roomSecrets) {
delete this.roomSecrets[roomSecret];
}
}
}
Object.defineProperty(String.prototype, 'hashCode', {
value: function() {
var hash = 0, i, chr;
for (i = 0; i < this.length; i++) {
chr = this.charCodeAt(i);
hash = ((hash << 5) - hash) + chr;
hash |= 0; // Convert to 32bit integer
}
return hash;
}
});
new PairDropServer();

View file

@ -0,0 +1,28 @@
BSD 3-Clause License
Copyright (c) 2023, Gildas Lormeau
Redistribution and use in source and binary forms, with or without
modification, are permitted provided that the following conditions are met:
1. Redistributions of source code must retain the above copyright notice, this
list of conditions and the following disclaimer.
2. Redistributions in binary form must reproduce the above copyright notice,
this list of conditions and the following disclaimer in the documentation
and/or other materials provided with the distribution.
3. Neither the name of the copyright holder nor the names of its
contributors may be used to endorse or promote products derived from
this software without specific prior written permission.
THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE
FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.

22
licenses/MIT-NoSleep Normal file
View file

@ -0,0 +1,22 @@
The MIT License (MIT)
Copyright (c) Rich Tibbett
Permission is hereby granted, free of charge, to any person obtaining
a copy of this software and associated documentation files (the
"Software"), to deal in the Software without restriction, including
without limitation the rights to use, copy, modify, merge, publish,
distribute, sublicense, and/or sell copies of the Software, and to
permit persons to whom the Software is furnished to do so, subject to
the following conditions:
The above copyright notice and this permission notice shall be
included in all copies or substantial portions of the Software.
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.

22
licenses/MIT-heic2any Normal file
View file

@ -0,0 +1,22 @@
MIT License
Copyright (c) 2020 Alex Corvi
Permission is hereby granted, free of charge, to any person obtaining
a copy of this software and associated documentation files (the
"Software"), to deal in the Software without restriction, including
without limitation the rights to use, copy, modify, merge, publish,
distribute, sublicense, and/or sell copies of the Software, and to
permit persons to whom the Software is furnished to do so, subject to
the following conditions:
The above copyright notice and this permission notice shall be
included in all copies or substantial portions of the Software.
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.

848
package-lock.json generated

File diff suppressed because it is too large Load diff

View file

@ -1,20 +1,21 @@
{
"name": "pairdrop",
"version": "1.0.0",
"version": "1.11.2",
"type": "module",
"description": "",
"main": "index.js",
"main": "server/index.js",
"scripts": {
"start": "node index.js",
"start:prod": "node index.js --rate-limit --auto-restart"
"start": "node server/index.js",
"start:prod": "node server/index.js --rate-limit --auto-restart"
},
"author": "",
"license": "ISC",
"dependencies": {
"express": "^4.18.2",
"express-rate-limit": "^6.7.0",
"ua-parser-js": "^1.0.33",
"express-rate-limit": "^7.1.5",
"ua-parser-js": "^1.0.37",
"unique-names-generator": "^4.3.0",
"ws": "^8.12.0"
"ws": "^8.16.0"
},
"engines": {
"node": ">=15"

1
pairdrop-cli/.gitignore vendored Normal file
View file

@ -0,0 +1 @@
.pairdrop-cli-config

View file

@ -0,0 +1 @@
DOMAIN=https://pairdrop.net/

382
pairdrop-cli/pairdrop Normal file
View file

@ -0,0 +1,382 @@
#!/bin/bash
set -e
# PairDrop version when this file was last changed
version="v1.10.4"
############################################################
# Help #
############################################################
help()
{
# Display Help
echo "Send files or text with PairDrop via command-line interface."
echo "Current domain: ${DOMAIN}"
echo
echo "Usage:"
echo -e "Open PairDrop:\t\t$(basename "$0")"
echo -e "Send files:\t\t$(basename "$0") file1/directory1 (file2/directory2 file3/directory3 ...)"
echo -e "Send text:\t\t$(basename "$0") -t \"text\""
echo -e "Specify domain:\t\t$(basename "$0") -d \"https://pairdrop.net/\""
echo -e "Show this help text:\t$(basename "$0") (-h|--help)"
echo
echo "This pairdrop-cli version was released alongside ${version}"
}
openPairDrop()
{
url="$DOMAIN"
if [[ -n $params ]];then
url="${url}?${params}"
fi
if [[ -n $hash ]];then
url="${url}#${hash}"
fi
echo "PairDrop is opening at $DOMAIN"
if [[ $OS == "Windows" ]];then
start "$url"
elif [[ $OS == "Mac" ]];then
open "$url"
elif [[ $OS == "WSL" || $OS == "WSL2" ]];then
powershell.exe /c "Start-Process ${url}"
else
xdg-open "$url" > /dev/null 2>&1
fi
exit
}
setOs()
{
unameOut=$(uname -a)
case "${unameOut}" in
*Microsoft*) OS="WSL";; #must be first since Windows subsystem for linux will have Linux in the name too
*microsoft*) OS="WSL2";; #WARNING: My v2 uses ubuntu 20.4 at the moment slightly different name may not always work
Linux*) OS="Linux";;
Darwin*) OS="Mac";;
CYGWIN*) OS="Cygwin";;
MINGW*) OS="Windows";;
*Msys) OS="Windows";;
*) OS="UNKNOWN:${unameOut}"
esac
}
specifyDomain()
{
[[ ! $1 = http* ]] || [[ ! $1 = */ ]] && echo "Incorrect format. Specify domain like https://pairdrop.net/" && exit
echo "DOMAIN=${1}" > "$config_path"
echo -e "Domain is now set to:\n$1\n"
}
sendText()
{
params="base64text=hash"
hash=$(echo -n "${OPTARG}" | base64)
if [[ $(echo -n "$hash" | wc -m) -gt 32600 ]];then
params="base64text=paste"
if [[ $OS == "Windows" || $OS == "WSL" || $OS == "WSL2" ]];then
echo -n "$hash" | clip.exe
elif [[ $OS == "Mac" ]];then
echo -n "$hash" | pbcopy
else
(echo -n "$hash" | xclip) || echo "You need to install xclip for sending bigger files from cli"
fi
hash=
fi
openPairDrop
exit
}
escapePSPath()
{
local path=$1
# escape '[' and ']' with grave accent (`) character
pathPS=${path//[/\`[}
pathPS=${pathPS//]/\`]}
# escape single quote (') with another single quote (')
pathPS=${pathPS//\'/\'\'}
# Convert GitHub bash path "/i/path" to Windows path "I:/path"
if [[ $pathPS == /* ]]; then
# Remove preceding slash
pathPS="${pathPS#/}"
# Convert drive letter to uppercase
driveLetter=$(echo "${pathPS::1}" | tr '[:lower:]' '[:upper:]')
# Put together absolute path as used in Windows
pathPS="${driveLetter}:${pathPS:1}"
fi
echo "$pathPS"
}
sendFiles()
{
params="base64zip=hash"
workingDir="$(pwd)"
tmpDir="/tmp/pairdrop-cli-temp/"
tmpDirPS="\$env:TEMP/pairdrop-cli-temp/"
index=0
directoryBaseNamesUnix=()
directoryPathsUnix=()
filePathsUnix=()
directoryCount=0
fileCount=0
pathsPS=""
#create tmp folder if it does not exist already
if [[ ! -d "$tmpDir" ]]; then
mkdir "$tmpDir"
fi
for arg in "$@"; do
echo "$arg"
[[ ! -e "$arg" ]] && echo "The given path $arg does not exist." && exit
# Remove trailing slash from directory
arg="${arg%/}"
# get absolute path and basename of file/directory
absolutePath=$(realpath "$arg")
baseName=$(basename "$absolutePath")
directoryPath=$(dirname "$absolutePath")
if [[ -d $absolutePath ]]; then
# is directory
((directoryCount+=1))
# add basename and directory path to arrays
directoryBaseNamesUnix+=("$baseName")
directoryPathsUnix+=("$directoryPath")
else
# is file
((fileCount+=1))
absolutePathUnix=$absolutePath
# append new path and separate paths with space
filePathsUnix+=("$absolutePathUnix")
fi
# Prepare paths for PowerShell on Windows
if [[ $OS == "Windows" ]];then
absolutePathPS=$(escapePSPath "$absolutePath")
# append new path and separate paths with commas
pathsPS+="'${absolutePathPS}', "
fi
# set fileNames on first loop
if [[ $index == 0 ]]; then
baseNameU=${baseName// /_}
# Prevent baseNameU being empty for hidden files by removing the preceding dot
if [[ $baseNameU == .* ]]; then
baseNameU=${baseNameU#.*}
fi
# only use trunk of basename "document.txt" -> "document"
baseNameTrunk=${baseNameU%.*}
# remove all special characters
zipName=${baseNameTrunk//[^a-zA-Z0-9_]/}
zipToSendAbs="${tmpDir}${zipName}_pairdrop.zip"
wrapperZipAbs="${tmpDir}${zipName}_pairdrop_wrapper.zip"
if [[ $OS == "Windows" ]];then
zipToSendAbsPS="${tmpDirPS}${zipName}_pairdrop.zip"
wrapperZipAbsPS="${tmpDirPS}${zipName}_pairdrop_wrapper.zip"
fi
fi
((index+=1)) # somehow ((index++)) stops the script
done
# Prepare paths for PowerShell on Windows
if [[ $OS == "Windows" ]];then
# remove trailing comma
pathsPS=${pathsPS%??}
fi
echo "Preparing ${fileCount} files and ${directoryCount} directories..."
# if arguments include files only -> zip files once so files it is unzipped by sending browser
# if arguments include directories -> wrap first zip in a second wrapper zip so that after unzip by sending browser a zip file is sent to receiver
#
# Preferred zip structure:
# pairdrop "d1/d2/d3/f1" "../../d4/d5/d6/f2" "d7/" "../d8/" "f5"
# zip structure: pairdrop.zip
# |-f1
# |-f2
# |-d7/
# |-d8/
# |-f5
# -> truncate (relative) paths but keep directories
[[ -e "$zipToSendAbs" ]] && echo "Cannot overwrite $zipToSendAbs. Please remove first." && exit
if [[ $OS == "Windows" ]];then
# Powershell does preferred zip structure natively
powershell.exe -Command "Compress-Archive -Path ${pathsPS} -DestinationPath ${zipToSendAbsPS}"
else
# Workaround needed to create preferred zip structure on unix systems
# Create zip file with all single files by junking the path
if [[ $fileCount != 0 ]]; then
zip -q -b /tmp/ -j -0 -r "$zipToSendAbs" "${filePathsUnix[@]}"
fi
# Add directories recursively to zip file
index=0
while [[ $index < $directoryCount ]]; do
# workaround to keep directory name but junk the rest of the paths
# cd to path above directory
cd "${directoryPathsUnix[index]}"
# add directory to zip without junking the path
zip -q -b /tmp/ -0 -u -r "$zipToSendAbs" "${directoryBaseNamesUnix[index]}"
# cd back to working directory
cd "$workingDir"
((index+=1)) # somehow ((index++)) stops the script
done
fi
# If directories are included send as zip
# -> Create additional zip wrapper which will be unzipped by the sending browser
if [[ "$directoryCount" != 0 ]]; then
echo "Bundle as ZIP file..."
# Prevent filename from being absolute zip path by "cd"ing to directory before zipping
zipToSendDirectory=$(dirname "$zipToSendAbs")
zipToSendBaseName=$(basename "$zipToSendAbs")
cd "$zipToSendDirectory"
[[ -e "$wrapperZipAbs" ]] && echo "Cannot overwrite $wrapperZipAbs. Please remove first." && exit
if [[ $OS == "Windows" ]];then
powershell.exe -Command "Compress-Archive -Path ${zipToSendBaseName} -DestinationPath ${wrapperZipAbsPS} -CompressionLevel Optimal"
else
zip -q -b /tmp/ -0 "$wrapperZipAbs" "$zipToSendBaseName"
fi
cd "$workingDir"
# remove inner zip file and set wrapper as zipToSend (do not differentiate between OS as this is done via Git Bash on Windows)
rm "$zipToSendAbs"
zipToSendAbs=$wrapperZipAbs
fi
# base64 encode zip file
if [[ $OS == "Mac" ]];then
hash=$(base64 -i "$zipToSendAbs")
else
hash=$(base64 -w 0 "$zipToSendAbs")
fi
# remove zip file (do not differentiate between OS as this is done via Git Bash on Windows)
rm "$zipToSendAbs"
if [[ $(echo -n "$hash" | wc -m) -gt 1000 ]];then
params="base64zip=paste"
# Copy $hash to clipboard
if [[ $OS == "Windows" || $OS == "WSL" || $OS == "WSL2" ]];then
echo -n "$hash" | clip.exe
elif [[ $OS == "Mac" ]];then
echo -n "$hash" | pbcopy
elif [ -n "$WAYLAND_DISPLAY" ]; then
# Wayland
if ! command -v wl-copy &> /dev/null; then
echo -e "You need to install 'wl-copy' to send bigger filePathsUnix from cli"
echo "Try: sudo apt install wl-clipboard"
exit 1
fi
# Workaround to prevent use of Pipe which has a max letter limit
echo -n "$hash" > /tmp/pairdrop-cli-temp/pairdrop_hash_temp
wl-copy < /tmp/pairdrop-cli-temp/pairdrop_hash_temp
rm /tmp/pairdrop-cli-temp/pairdrop_hash_temp
else
# X11
if ! command -v xclip &> /dev/null; then
echo -e "You need to install 'xclip' to send bigger filePathsUnix from cli"
echo "Try: sudo apt install xclip"
exit 1
fi
echo -n "$hash" | xclip -sel c
fi
hash=
fi
openPairDrop
exit
}
############################################################
############################################################
# Main program #
############################################################
############################################################
script_path="$( cd -- "$(dirname "$0")" >/dev/null 2>&1 ; pwd -P )"
pushd . > '/dev/null';
script_path="${BASH_SOURCE[0]:-$0}";
while [ -h "$script_path" ];
do
cd "$( dirname -- "$script_path"; )";
script_path="$( readlink -f -- "$script_path"; )";
done
cd "$( dirname -- "$script_path"; )" > '/dev/null';
script_path="$( pwd; )";
popd > '/dev/null';
config_path="${script_path}/.pairdrop-cli-config"
# If config file does not exist, try to create it. If it fails log error message and exit
[ ! -f "$config_path" ] &&
specifyDomain "https://pairdrop.net/" &&
[ ! -f "$config_path" ] &&
echo "Could not create config file. Add 'DOMAIN=https://pairdrop.net/' to a file called .pairdrop-cli-config in the same file as this 'pairdrop' bash file (${script_path})" &&
exit
# Read config variables
export "$(grep -v '^#' "$config_path" | xargs)"
setOs
############################################################
# Process the input options. Add options as needed. #
############################################################
# Get the options
# open PairDrop if no options are given
[[ $# -eq 0 ]] && openPairDrop && exit
# display help and exit if first argument is "--help" or more than 2 arguments are given
[ "$1" == "--help" ] && help && exit
while getopts "d:ht:*" option; do
case $option in
d) # specify domain - show help and exit if too many arguments
[[ $# -gt 2 ]] && help && exit
specifyDomain "$2"
exit;;
t) # Send text - show help and exit if too many arguments
[[ $# -gt 2 ]] && help && exit
sendText
exit;;
h | ?) # display help and exit
help
exit;;
esac
done
# Send file(s)
sendFiles "$@"

6
pairdrop-cli/pairdrop.sh Normal file
View file

@ -0,0 +1,6 @@
#!/bin/bash
parent_path=$( cd "$(dirname "${BASH_SOURCE[0]}")" || exit ; pwd -P )
cd "$parent_path" || exit
./pairdrop "$@"

Binary file not shown.

View file

@ -0,0 +1,17 @@
#!/bin/bash
# Initialize an array
lines=()
# Read each line into the array
while IFS= read -r line; do
lines+=("$line")
done <<< "$NAUTILUS_SCRIPT_SELECTED_FILE_PATHS"
# Get the length of the array
length=${#lines[@]}
# Remove the last entry
unset 'lines[length-1]'
pairdrop "${lines[@]}"

View file

@ -0,0 +1,3 @@
$scriptDir = Split-Path -Parent $MyInvocation.MyCommand.Path
& "$scriptDir\pairdrop.sh" $args

View file

@ -0,0 +1,93 @@
Copyright 2020 The Open Sans Project Authors (https://github.com/googlefonts/opensans)
This Font Software is licensed under the SIL Open Font License, Version 1.1.
This license is copied below, and is also available with a FAQ at:
http://scripts.sil.org/OFL
-----------------------------------------------------------
SIL OPEN FONT LICENSE Version 1.1 - 26 February 2007
-----------------------------------------------------------
PREAMBLE
The goals of the Open Font License (OFL) are to stimulate worldwide
development of collaborative font projects, to support the font creation
efforts of academic and linguistic communities, and to provide a free and
open framework in which fonts may be shared and improved in partnership
with others.
The OFL allows the licensed fonts to be used, studied, modified and
redistributed freely as long as they are not sold by themselves. The
fonts, including any derivative works, can be bundled, embedded,
redistributed and/or sold with any software provided that any reserved
names are not used by derivative works. The fonts and derivatives,
however, cannot be released under any other type of license. The
requirement for fonts to remain under this license does not apply
to any document created using the fonts or their derivatives.
DEFINITIONS
"Font Software" refers to the set of files released by the Copyright
Holder(s) under this license and clearly marked as such. This may
include source files, build scripts and documentation.
"Reserved Font Name" refers to any names specified as such after the
copyright statement(s).
"Original Version" refers to the collection of Font Software components as
distributed by the Copyright Holder(s).
"Modified Version" refers to any derivative made by adding to, deleting,
or substituting -- in part or in whole -- any of the components of the
Original Version, by changing formats or by porting the Font Software to a
new environment.
"Author" refers to any designer, engineer, programmer, technical
writer or other person who contributed to the Font Software.
PERMISSION & CONDITIONS
Permission is hereby granted, free of charge, to any person obtaining
a copy of the Font Software, to use, study, copy, merge, embed, modify,
redistribute, and sell modified and unmodified copies of the Font
Software, subject to the following conditions:
1) Neither the Font Software nor any of its individual components,
in Original or Modified Versions, may be sold by itself.
2) Original or Modified Versions of the Font Software may be bundled,
redistributed and/or sold with any software, provided that each copy
contains the above copyright notice and this license. These can be
included either as stand-alone text files, human-readable headers or
in the appropriate machine-readable metadata fields within text or
binary files as long as those fields can be easily viewed by the user.
3) No Modified Version of the Font Software may use the Reserved Font
Name(s) unless explicit written permission is granted by the corresponding
Copyright Holder. This restriction only applies to the primary font name as
presented to the users.
4) The name(s) of the Copyright Holder(s) or the Author(s) of the Font
Software shall not be used to promote, endorse or advertise any
Modified Version, except to acknowledge the contribution(s) of the
Copyright Holder(s) and the Author(s) or with their explicit written
permission.
5) The Font Software, modified or unmodified, in part or in whole,
must be distributed entirely under this license, and must not be
distributed under any other license. The requirement for fonts to
remain under this license does not apply to any document created
using the Font Software.
TERMINATION
This license becomes null and void if any of the above conditions are
not met.
DISCLAIMER
THE FONT SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO ANY WARRANTIES OF
MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT
OF COPYRIGHT, PATENT, TRADEMARK, OR OTHER RIGHT. IN NO EVENT SHALL THE
COPYRIGHT HOLDER BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,
INCLUDING ANY GENERAL, SPECIAL, INDIRECT, INCIDENTAL, OR CONSEQUENTIAL
DAMAGES, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
FROM, OUT OF THE USE OR INABILITY TO USE THE FONT SOFTWARE OR FROM
OTHER DEALINGS IN THE FONT SOFTWARE.

View file

@ -0,0 +1,100 @@
Open Sans Variable Font
=======================
This download contains Open Sans as both variable fonts and static fonts.
Open Sans is a variable font with these axes:
wdth
wght
This means all the styles are contained in these files:
OpenSans-VariableFont_wdth,wght.ttf
OpenSans-Italic-VariableFont_wdth,wght.ttf
If your app fully supports variable fonts, you can now pick intermediate styles
that arent available as static fonts. Not all apps support variable fonts, and
in those cases you can use the static font files for Open Sans:
static/OpenSans_Condensed-Light.ttf
static/OpenSans_Condensed-Regular.ttf
static/OpenSans_Condensed-Medium.ttf
static/OpenSans_Condensed-SemiBold.ttf
static/OpenSans_Condensed-Bold.ttf
static/OpenSans_Condensed-ExtraBold.ttf
static/OpenSans_SemiCondensed-Light.ttf
static/OpenSans_SemiCondensed-Regular.ttf
static/OpenSans_SemiCondensed-Medium.ttf
static/OpenSans_SemiCondensed-SemiBold.ttf
static/OpenSans_SemiCondensed-Bold.ttf
static/OpenSans_SemiCondensed-ExtraBold.ttf
static/OpenSans-Light.ttf
static/OpenSans-Regular.ttf
static/OpenSans-Medium.ttf
static/OpenSans-SemiBold.ttf
static/OpenSans-Bold.ttf
static/OpenSans-ExtraBold.ttf
static/OpenSans_Condensed-LightItalic.ttf
static/OpenSans_Condensed-Italic.ttf
static/OpenSans_Condensed-MediumItalic.ttf
static/OpenSans_Condensed-SemiBoldItalic.ttf
static/OpenSans_Condensed-BoldItalic.ttf
static/OpenSans_Condensed-ExtraBoldItalic.ttf
static/OpenSans_SemiCondensed-LightItalic.ttf
static/OpenSans_SemiCondensed-Italic.ttf
static/OpenSans_SemiCondensed-MediumItalic.ttf
static/OpenSans_SemiCondensed-SemiBoldItalic.ttf
static/OpenSans_SemiCondensed-BoldItalic.ttf
static/OpenSans_SemiCondensed-ExtraBoldItalic.ttf
static/OpenSans-LightItalic.ttf
static/OpenSans-Italic.ttf
static/OpenSans-MediumItalic.ttf
static/OpenSans-SemiBoldItalic.ttf
static/OpenSans-BoldItalic.ttf
static/OpenSans-ExtraBoldItalic.ttf
Get started
-----------
1. Install the font files you want to use
2. Use your app's font picker to view the font family and all the
available styles
Learn more about variable fonts
-------------------------------
https://developers.google.com/web/fundamentals/design-and-ux/typography/variable-fonts
https://variablefonts.typenetwork.com
https://medium.com/variable-fonts
In desktop apps
https://theblog.adobe.com/can-variable-fonts-illustrator-cc
https://helpx.adobe.com/nz/photoshop/using/fonts.html#variable_fonts
Online
https://developers.google.com/fonts/docs/getting_started
https://developer.mozilla.org/en-US/docs/Web/CSS/CSS_Fonts/Variable_Fonts_Guide
https://developer.microsoft.com/en-us/microsoft-edge/testdrive/demos/variable-fonts
Installing fonts
MacOS: https://support.apple.com/en-us/HT201749
Linux: https://www.google.com/search?q=how+to+install+a+font+on+gnu%2Blinux
Windows: https://support.microsoft.com/en-us/help/314960/how-to-install-or-remove-a-font-in-windows
Android Apps
https://developers.google.com/fonts/docs/android
https://developer.android.com/guide/topics/ui/look-and-feel/downloadable-fonts
License
-------
Please read the full license text (OFL.txt) to understand the permissions,
restrictions and requirements for usage, redistribution, and modification.
You can use them in your products & projects print or digital,
commercial or otherwise.
This isn't legal advice, please consider consulting a lawyer and see the full
license for all details.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Before

Width:  |  Height:  |  Size: 8.3 KiB

After

Width:  |  Height:  |  Size: 22 KiB

Before After
Before After

Binary file not shown.

Before

Width:  |  Height:  |  Size: 16 KiB

After

Width:  |  Height:  |  Size: 23 KiB

Before After
Before After

Binary file not shown.

Before

Width:  |  Height:  |  Size: 30 KiB

After

Width:  |  Height:  |  Size: 60 KiB

Before After
Before After

Binary file not shown.

Before

Width:  |  Height:  |  Size: 52 KiB

After

Width:  |  Height:  |  Size: 62 KiB

Before After
Before After

Binary file not shown.

Before

Width:  |  Height:  |  Size: 13 KiB

After

Width:  |  Height:  |  Size: 20 KiB

Before After
Before After

Binary file not shown.

Before

Width:  |  Height:  |  Size: 7 KiB

After

Width:  |  Height:  |  Size: 12 KiB

Before After
Before After

Binary file not shown.

Before

Width:  |  Height:  |  Size: 7 KiB

After

Width:  |  Height:  |  Size: 12 KiB

Before After
Before After

Binary file not shown.

Before

Width:  |  Height:  |  Size: 33 KiB

After

Width:  |  Height:  |  Size: 60 KiB

Before After
Before After

Binary file not shown.

Before

Width:  |  Height:  |  Size: 10 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 52 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 25 KiB

After

Width:  |  Height:  |  Size: 27 KiB

Before After
Before After

Binary file not shown.

Before

Width:  |  Height:  |  Size: 31 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 3.5 KiB

After

Width:  |  Height:  |  Size: 8.9 KiB

Before After
Before After

Binary file not shown.

Before

Width:  |  Height:  |  Size: 232 KiB

After

Width:  |  Height:  |  Size: 269 KiB

Before After
Before After

Binary file not shown.

Before

Width:  |  Height:  |  Size: 232 KiB

After

Width:  |  Height:  |  Size: 271 KiB

Before After
Before After

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1 MiB

After

Width:  |  Height:  |  Size: 1.4 MiB

Before After
Before After

Binary file not shown.

Before

Width:  |  Height:  |  Size: 232 KiB

After

Width:  |  Height:  |  Size: 271 KiB

Before After
Before After

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.7 MiB

After

Width:  |  Height:  |  Size: 2.5 MiB

Before After
Before After

Binary file not shown.

Before

Width:  |  Height:  |  Size: 180 KiB

After

Width:  |  Height:  |  Size: 190 KiB

Before After
Before After

Binary file not shown.

Before

Width:  |  Height:  |  Size: 201 KiB

After

Width:  |  Height:  |  Size: 231 KiB

Before After
Before After

Binary file not shown.

After

Width:  |  Height:  |  Size: 221 KiB

View file

@ -5,17 +5,18 @@
<meta charset="utf-8">
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
<!-- Web App Config -->
<title>PairDrop</title>
<meta name="viewport" content="width=device-width, initial-scale=1.0, user-scalable=no">
<title>PairDrop | Transfer Files Cross-Platform. No Setup, No Signup.</title>
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<meta name="theme-color" content="#3367d6">
<meta name="color-scheme" content="dark light">
<meta name="apple-mobile-web-app-capable" content="no">
<meta name="apple-mobile-web-app-capable" content="yes">
<meta name="apple-mobile-web-app-status-bar-style" content="black-translucent">
<meta name="apple-mobile-web-app-title" content="PairDrop">
<meta name="application-name" content="PairDrop">
<!-- Descriptions -->
<meta name="description" content="Instantly share images, videos, PDFs, and links with people nearby. Peer2Peer and Open Source. No Setup, No Signup.">
<meta name="keywords" content="File, Transfer, Share, Peer2Peer">
<meta name="author" content="RobinLinus">
<meta name="author" content="schlagmichdoch">
<meta property="og:title" content="PairDrop">
<meta property="og:type" content="article">
<meta property="og:url" content="https://pairdrop.net/">
@ -28,305 +29,806 @@
<link rel="icon" sizes="96x96" href="images/favicon-96x96.png">
<link rel="shortcut icon" href="images/favicon-96x96.png">
<link rel="apple-touch-icon" href="images/apple-touch-icon.png">
<link rel="apple-touch-icon-precomposed" href="images/apple-touch-icon.png">
<meta name="msapplication-TileImage" content="images/mstile-150x150.png">
<link rel="fluid-icon" type="image/png" href="images/android-chrome-192x192.png">
<meta name="twitter:image" content="images/logo_transparent_512x512.png">
<meta property="og:image" content="images/logo_transparent_512x512.png">
<!-- Resources -->
<link rel="stylesheet" type="text/css" href="styles.css">
<link rel="preload" href="lang/en.json" as="fetch">
<link rel="preload" href="fonts/OpenSans/static/OpenSans-Medium.ttf" as="font" type="font/ttf" crossorigin>
<link rel="stylesheet" type="text/css" href="styles/styles-main.css">
<link rel="manifest" href="manifest.json">
</head>
<body translate="no">
<header class="row-reverse">
<a href="#about" class="icon-button" title="About PairDrop">
<header class="row-reverse wrap opacity-0">
<a href="#about" class="icon-button" data-i18n-key="header.about" data-i18n-attrs="title aria-label">
<svg class="icon">
<use xlink:href="#info-outline" />
<use xlink:href="#info-outline"></use>
</svg>
</a>
<a id="theme" class="icon-button" title="Switch Darkmode/Lightmode" >
<div id="language-selector" class="icon-button" data-i18n-key="header.language-selector" data-i18n-attrs="title">
<svg class="icon">
<use xlink:href="#icon-theme" />
<use xlink:href="#icon-language-selector"></use>
</svg>
</a>
<a id="notification" class="icon-button" title="Enable Notifications" hidden>
</div>
<div id="theme-wrapper">
<div id="theme-auto" class="icon-button selected" data-i18n-key="header.theme-auto" data-i18n-attrs="title">
<svg class="icon">
<use xlink:href="#icon-theme-auto"></use>
</svg>
</div>
<div>
<div id="theme-light" class="icon-button" data-i18n-key="header.theme-light" data-i18n-attrs="title">
<svg class="icon">
<use xlink:href="#icon-theme-light"></use>
</svg>
</div>
<div id="theme-dark" class="icon-button" data-i18n-key="header.theme-dark" data-i18n-attrs="title">
<svg class="icon">
<use xlink:href="#icon-theme-dark"></use>
</svg>
</div>
</div>
</div>
<div id="notification" class="icon-button" data-i18n-key="header.notification" data-i18n-attrs="title" hidden>
<svg class="icon">
<use xlink:href="#notifications" />
<use xlink:href="#notifications"></use>
</svg>
</a>
<a id="install" class="icon-button" title="Install PairDrop" hidden>
</div>
<div id="install" class="icon-button" data-i18n-key="header.install" data-i18n-attrs="title" hidden>
<svg class="icon">
<use xlink:href="#homescreen" />
<use xlink:href="#homescreen"></use>
</svg>
</a>
<a id="pair-device" class="icon-button" title="Pair Device" >
</div>
<div id="pair-device" class="icon-button" data-i18n-key="header.pair-device" data-i18n-attrs="title">
<svg class="icon">
<use xlink:href="#pair-device-icon" />
<use xlink:href="#pair-device-icon"></use>
</svg>
</a>
<a id="clear-pair-devices" class="icon-button" title="Clear All Paired Devices" hidden>
</div>
<div id="edit-paired-devices" class="icon-button" data-i18n-key="header.edit-paired-devices" data-i18n-attrs="title" hidden>
<svg class="icon">
<use xlink:href="#clear-pair-devices-icon" />
<use xlink:href="#edit-pair-devices-icon"></use>
</svg>
</a>
</div>
<div id="join-public-room" class="icon-button" data-i18n-key="header.join-public-room" data-i18n-attrs="title">
<svg class="icon">
<use xlink:href="#public-room-icon"></use>
</svg>
</div>
<div id="expand" class="icon-button" data-i18n-key="header.expand" data-i18n-attrs="title" hidden>
<svg class="icon">
<use xlink:href="#caret"></use>
</svg>
</div>
</header>
<a id="cancelPasteModeBtn" class="button" close hidden>Done</a>
<!-- Peers -->
<x-peers class="center"></x-peers>
<x-no-peers>
<h2>Open PairDrop on other devices to send files</h2>
<div>Pair devices to be discoverable on other networks</div>
</x-no-peers>
<x-instructions desktop="Click to send files or right click to send a message" mobile="Tap to send files or long tap to send a message">
<p id="pasteFilename"></p>
</x-instructions>
<!-- Center -->
<div id="center" class="opacity-0">
<!-- Peers -->
<x-peers class="center grow-5"></x-peers>
<x-no-peers class="center grow fade-in no-animation-on-load" data-i18n-key="instructions.no-peers" data-i18n-attrs="data-drop-bg">
<h2 data-i18n-key="instructions.no-peers-title" data-i18n-attrs="text"></h2>
<div data-i18n-key="instructions.no-peers-subtitle" data-i18n-attrs="text"></div>
</x-no-peers>
<x-instructions class="grow fade-in" data-i18n-key="instructions.x-instructions" data-i18n-attrs="desktop mobile data-drop-peer data-drop-bg"></x-instructions>
<div class="shr-panel panel column" hidden>
<div class="row">
<div class="thumb center">
<div class="text-thumb row" hidden>
<svg>
<use xlink:href="#font"></use>
</svg>
<svg>
<use xlink:href="#i-cursor"></use>
</svg>
</div>
<div class="file-thumb" hidden>
<svg>
<use xlink:href="#file"></use>
</svg>
</div>
<div class="image-thumb" hidden></div>
</div>
<div class="share-descriptor column p-1">
<span class="descriptor-item"></span>
<span class="descriptor-other" hidden></span>
</div>
</div>
<div class="center btn-row wrap">
<div class="cancel-btn btn btn-small btn-rounded btn-dark text-white" data-i18n-key="header.cancel-share-mode" data-i18n-attrs="text"></div>
<div class="edit-btn btn btn-small btn-rounded btn-dark text-white" data-i18n-key="header.edit-share-mode" data-i18n-attrs="text" hidden></div>
</div>
</div>
<div id="websocket-fallback" class="text-center" hidden>
<span data-i18n-key="footer.traffic" data-i18n-attrs="text"></span>
<span data-i18n-key="footer.routed" data-i18n-attrs="text"></span>
<span data-i18n-key="footer.webrtc" data-i18n-attrs="text"></span>
</div>
</div>
<!-- Footer -->
<footer class="column">
<footer class="column opacity-0">
<svg class="icon logo">
<use xlink:href="#wifi-tethering" />
<defs>
<linearGradient id="primaryGradient" gradientTransform="rotate(90)">
<stop offset="0%" class="start-color" />
<stop offset="100%" class="stop-color" />
</linearGradient>
</defs>
<use xlink:href="#wifi-tethering" style="fill: url(#primaryGradient);"></use>
</svg>
<div id="displayName" placeholder="&nbsp;"></div>
<div class="font-body2">
You can be discovered by everyone <span id="on-this-network">on&nbsp;this&nbsp;network</span>
<span id="and-by-paired-devices" hidden> and&nbsp;by&nbsp;<span id="paired-devices">paired&nbsp;devices</span></span>
<div class="column">
<div class="known-as-wrapper">
<span data-i18n-key="footer.known-as" data-i18n-attrs="text"></span>
<div id="display-name" class="badge" data-i18n-key="footer.display-name" data-i18n-attrs="data-placeholder title" autocorrect="off" autocomplete="off" autocapitalize="none" spellcheck="false" contenteditable></div>
<svg class="icon edit-pen">
<use xlink:href="#edit-pen-icon"></use>
</svg>
</div>
<div class="discovery-wrapper panel border row">
<div class="row center">
<span data-i18n-key="footer.discovery" data-i18n-attrs="text"></span>
</div>
<div class="row center wrap">
<span class="badge badge-room-ip" data-i18n-key="footer.on-this-network" data-i18n-attrs="text title"></span>
<span class="badge badge-room-secret pointer" data-i18n-key="footer.paired-devices" data-i18n-attrs="text title" hidden></span>
<span class="badge badge-room-public-id pointer" data-i18n-key="footer.public-room-devices" data-i18n-attrs="title" hidden>in room IAIAI</span>
</div>
</div>
</div>
</footer>
<!-- Language Select Dialog -->
<x-dialog id="language-select-dialog">
<x-background class="full center">
<x-paper shadow="2">
<div class="row center p-2">
<h2 class="dialog-title" data-i18n-key="dialogs.language-selector-title" data-i18n-attrs="text"></h2>
</div>
<div class="language-buttons p2">
<button class="btn fw wrap">
<span data-i18n-key="dialogs.system-language" data-i18n-attrs="text"></span>
</button>
<button class="btn fw wrap" value="ar">
<span lang="ar" dir="rtl">العربية</span>
<span>&nbsp;&nbsp;-&nbsp;&nbsp;</span>
<span>(Arabic)</span>
</button>
<button class="btn fw wrap" value="be">
<span lang="be">беларуская</span>
<span>&nbsp;&nbsp;-&nbsp;&nbsp;</span>
<span>(Belarusian)</span>
</button>
<button class="btn fw wrap" value="nb">
<span lang="nb">Bokmål</span>
<span>&nbsp;&nbsp;-&nbsp;&nbsp;</span>
<span>(Norwegian Bokmål)</span>
</button>
<button class="btn fw wrap" value="bg">
<span lang="bg">български</span>
<span>&nbsp;&nbsp;-&nbsp;&nbsp;</span>
<span>(Bulgarian)</span>
</button>
<button class="btn fw wrap" value="ca">
<span lang="ca">Català</span>
<span>&nbsp;&nbsp;-&nbsp;&nbsp;</span>
<span>(Catalan)</span>
</button>
<button class="btn fw wrap" value="cs">
<span lang="cs">Čeština</span>
<span>&nbsp;&nbsp;-&nbsp;&nbsp;</span>
<span>(Czech)</span>
</button>
<button class="btn fw wrap" value="da">
<span lang="da">Dansk</span>
<span>&nbsp;&nbsp;-&nbsp;&nbsp;</span>
<span>(Danish)</span>
</button>
<button class="btn fw wrap" value="de">
<span lang="de">Deutsch</span>
<span>&nbsp;&nbsp;-&nbsp;&nbsp;</span>
<span>(German)</span>
</button>
<button class="btn fw wrap" value="en">
<span lang="en">English</span>
</button>
<button class="btn fw wrap" value="es">
<span lang="es">Español</span>
<span>&nbsp;&nbsp;-&nbsp;&nbsp;</span>
<span>(Spanish)</span>
</button>
<button class="btn fw wrap" value="et">
<span lang="et">Eesti</span>
<span>&nbsp;&nbsp;-&nbsp;&nbsp;</span>
<span>(Estonian)</span>
</button>
<button class="btn fw wrap" value="eu">
<span lang="eu">Euskara</span>
<span>&nbsp;&nbsp;-&nbsp;&nbsp;</span>
<span>(Basque)</span>
</button>
<button class="btn fw wrap" value="fa">
<span lang="fa" dir="rtl">فارسی</span>
<span>&nbsp;&nbsp;-&nbsp;&nbsp;</span>
<span>(Persian)</span>
</button>
<button class="btn fw wrap" value="fr">
<span lang="fr">Français</span>
<span>&nbsp;&nbsp;-&nbsp;&nbsp;</span>
<span>(French)</span>
</button>
<button class="btn fw wrap" value="id">
<span lang="id">Bahasa Indonesia</span>
<span>&nbsp;&nbsp;-&nbsp;&nbsp;</span>
<span>(Indonesian)</span>
</button>
<button class="btn fw wrap" value="it">
<span lang="it">Italiano</span>
<span>&nbsp;&nbsp;-&nbsp;&nbsp;</span>
<span>(Italian)</span>
</button>
<button class="btn fw wrap" value="he">
<span lang="he" dir="rtl">עִבְרִית</span>
<span>&nbsp;&nbsp;-&nbsp;&nbsp;</span>
<span>(Hebrew)</span>
</button>
<button class="btn fw wrap" value="kn">
<span lang="kn">ಕನ್ನಡ</span>
<span>&nbsp;&nbsp;-&nbsp;&nbsp;</span>
<span>(Kannada)</span>
</button>
<button class="btn fw wrap" value="hu">
<span lang="hu">Magyar</span>
<span>&nbsp;&nbsp;-&nbsp;&nbsp;</span>
<span>(Hungarian)</span>
</button>
<button class="btn fw wrap" value="nl">
<span lang="nl">Nederlands</span>
<span>&nbsp;&nbsp;-&nbsp;&nbsp;</span>
<span>(Dutch)</span>
</button>
<button class="btn fw wrap" value="nn">
<span lang="nn">Norsk</span>
<span>&nbsp;&nbsp;-&nbsp;&nbsp;</span>
<span>(Norwegian Nynorsk)</span>
</button>
<button class="btn fw wrap" value="pl">
<span lang="pl">Polski</span>
<span>&nbsp;&nbsp;-&nbsp;&nbsp;</span>
<span>(Polish)</span>
</button>
<button class="btn fw wrap" value="pt-BR">
<span lang="pt-BR">Português do Brasil</span>
<span>&nbsp;&nbsp;-&nbsp;&nbsp;</span>
<span>(Brazilian Portuguese)</span>
</button>
<button class="btn fw wrap" value="ro">
<span lang="ro">Română</span>
<span>&nbsp;&nbsp;-&nbsp;&nbsp;</span>
<span>(Romanian)</span>
</button>
<button class="btn fw wrap" value="ru">
<span lang="ru">Русский язык</span>
<span>&nbsp;&nbsp;-&nbsp;&nbsp;</span>
<span>(Russian)</span>
</button>
<button class="btn fw wrap" value="sk">
<span lang="sk">Slovenčina</span>
<span>&nbsp;&nbsp;-&nbsp;&nbsp;</span>
<span>(Slovak)</span>
</button>
<button class="btn fw wrap" value="ta">
<span lang="ta">தமிழ்</span>
<span>&nbsp;&nbsp;-&nbsp;&nbsp;</span>
<span>(Tamil)</span>
</button>
<button class="btn fw wrap" value="tr">
<span lang="tr">Türkçe</span>
<span>&nbsp;&nbsp;-&nbsp;&nbsp;</span>
<span>(Turkish)</span>
</button>
<button class="btn fw wrap" value="uk">
<span lang="uk">Українська</span>
<span>&nbsp;&nbsp;-&nbsp;&nbsp;</span>
<span>(Ukrainian)</span>
</button>
<button class="btn fw wrap" value="zh-CN">
<span lang="zh-CN">汉语</span>
<span>&nbsp;&nbsp;-&nbsp;&nbsp;</span>
<span>(Simplified Chinese)</span>
</button>
<button class="btn fw wrap" value="zh-HK">
<span lang="zh-HK">中文</span>
<span>&nbsp;&nbsp;-&nbsp;&nbsp;</span>
<span>(Hant Script)</span>
</button>
<button class="btn fw wrap" value="zh-TW">
<span lang="zh-TW">漢語</span>
<span>&nbsp;&nbsp;-&nbsp;&nbsp;</span>
<span>(Traditional Chinese)</span>
</button>
<button class="btn fw wrap" value="ja">
<span lang="ja">日本語</span>
<span>&nbsp;&nbsp;-&nbsp;&nbsp;</span>
<span>(Japanese)</span>
</button>
<button class="btn fw wrap" value="ko">
<span lang="ko">한국어</span>
<span>&nbsp;&nbsp;-&nbsp;&nbsp;</span>
<span>(Korean)</span>
</button>
</div>
<div class="center row-reverse btn-row wrap">
<button class="btn btn-rounded btn-grey" type="button" data-i18n-key="dialogs.close" data-i18n-attrs="text" close></button>
</div>
</x-paper>
</x-background>
</x-dialog>
<!-- Pair Device Dialog -->
<x-dialog id="pairDeviceDialog">
<x-dialog id="pair-device-dialog">
<form action="#">
<x-background class="full center text-center">
<x-paper shadow="2">
<h2 class="center">Pair Devices</h2>
<div class="center" id="roomKeyQrCode"></div>
<h1 class="center" id="roomKey">000 000</h1>
<div id="pairInstructions" class="font-subheading center text-center">Input this key on another device<br>or scan the QR-Code.</div>
<hr>
<div id="keyInputContainer">
<input type="tel" id="char0" class="textarea center" maxlength="1" autocorrect="off" autocomplete="off" autocapitalize="none" spellcheck="false" autofocus contenteditable placeholder="" disabled>
<input type="tel" id="char1" class="textarea center" maxlength="1" autocorrect="off" autocomplete="off" autocapitalize="none" spellcheck="false" contenteditable placeholder="" disabled>
<input type="tel" id="char2" class="textarea center" maxlength="1" autocorrect="off" autocomplete="off" autocapitalize="none" spellcheck="false" contenteditable placeholder="" disabled>
<input type="tel" id="char3" class="textarea center" maxlength="1" autocorrect="off" autocomplete="off" autocapitalize="none" spellcheck="false" contenteditable placeholder="" disabled>
<input type="tel" id="char4" class="textarea center" maxlength="1" autocorrect="off" autocomplete="off" autocapitalize="none" spellcheck="false" contenteditable placeholder="" disabled>
<input type="tel" id="char5" class="textarea center" maxlength="1" autocorrect="off" autocomplete="off" autocapitalize="none" spellcheck="false" contenteditable placeholder="" disabled>
<div class="row center p-2">
<h2 class="dialog-title" data-i18n-key="dialogs.pair-devices-title" data-i18n-attrs="text"></h2>
</div>
<div class="font-subheading center text-center">Enter key from another device to continue.</div>
<div class="row-reverse space-between">
<button class="button" type="submit" disabled>Pair</button>
<div class="separator"></div>
<a class="button" close>Cancel</a>
<div class="row center p-2">
<div class="column">
<div class="center key-qr-code pointer" data-i18n-key="dialogs.pair-devices-qr-code" data-i18n-attrs="title"></div>
<h1 class="center key" dir="ltr">000 000</h1>
<p class="center text-center key-instructions">
<span class="font-subheading" data-i18n-key="dialogs.input-key-on-this-device" data-i18n-attrs="text"></span>
<span class="font-subheading" data-i18n-key="dialogs.scan-qr-code" data-i18n-attrs="text"></span>
</p>
</div>
</div>
<div class="hr-note">
<hr>
<div>
<span data-i18n-key="dialogs.hr-or" data-i18n-attrs="text"></span>
</div>
</div>
<div class="row center p-2">
<div class="column fw">
<div class="input-key-container six-chars" dir="ltr">
<input type="tel" class="textarea center" aria-label="pair-key-char-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-char-2" maxlength="1" autocorrect="off" autocomplete="off" autocapitalize="none" spellcheck="false" contenteditable placeholder disabled>
<input type="tel" class="textarea center" aria-label="pair-key-char-3" maxlength="1" autocorrect="off" autocomplete="off" autocapitalize="none" spellcheck="false" contenteditable placeholder disabled>
<input type="tel" class="textarea center" aria-label="pair-key-char-4" maxlength="1" autocorrect="off" autocomplete="off" autocapitalize="none" spellcheck="false" contenteditable placeholder disabled>
<input type="tel" class="textarea center" aria-label="pair-key-char-5" maxlength="1" autocorrect="off" autocomplete="off" autocapitalize="none" spellcheck="false" contenteditable placeholder disabled>
<input type="tel" class="textarea center" aria-label="pair-key-char-6" maxlength="1" autocorrect="off" autocomplete="off" autocapitalize="none" spellcheck="false" contenteditable placeholder disabled>
</div>
<p class="font-subheading center text-center" data-i18n-key="dialogs.enter-key-from-another-device" data-i18n-attrs="text"></p>
</div>
</div>
<div class="btn-row row-reverse wrap">
<button class="btn btn-rounded btn-grey" type="submit" data-i18n-key="dialogs.pair" data-i18n-attrs="text" disabled></button>
<button class="btn btn-rounded btn-grey" type="button" data-i18n-key="dialogs.cancel" data-i18n-attrs="text" close></button>
</div>
</x-paper>
</x-background>
</form>
</x-dialog>
<!-- Clear Devices Dialog -->
<x-dialog id="clearDevicesDialog">
<!-- Edit Paired Devices Dialog -->
<x-dialog id="edit-paired-devices-dialog">
<form action="#">
<x-background class="full center text-center">
<x-paper shadow="2">
<h2 class="center">Unpair Devices</h2>
<div class="font-subheading center text-center">Are you sure to unpair all devices?</div>
<div class="row-reverse space-between">
<button class="button" type="submit">Unpair Devices</button>
<a class="button" close>Cancel</a>
<div class="row center p-2">
<h2 class="dialog-title" data-i18n-key="dialogs.edit-paired-devices-title" data-i18n-attrs="text"></h2>
</div>
<div class="paired-devices-wrapper" data-i18n-key="dialogs.paired-devices-wrapper" data-i18n-attrs="data-empty"></div>
<div class="row center p-2">
<div class="font-subheading">
<span data-i18n-key="dialogs.auto-accept-instructions-1" data-i18n-attrs="text"></span>
<u data-i18n-key="dialogs.auto-accept" data-i18n-attrs="text"></u>
<span data-i18n-key="dialogs.auto-accept-instructions-2" data-i18n-attrs="text"></span>
</div>
</div>
<div class="center row-reverse btn-row wrap">
<button class="btn btn-rounded btn-grey" type="button" data-i18n-key="dialogs.close" data-i18n-attrs="text" close></button>
</div>
</x-paper>
</x-background>
</form>
</x-dialog>
<!-- Public Room Dialog -->
<x-dialog id="public-room-dialog">
<form action="#">
<x-background class="full center text-center">
<x-paper shadow="2">
<div class="row center p-2">
<h2 class="dialog-title" data-i18n-key="dialogs.temporary-public-room-title" data-i18n-attrs="text"></h2>
</div>
<div class="row center p-2">
<div class="column">
<div class="center key-qr-code pointer" data-i18n-key="dialogs.public-room-qr-code" data-i18n-attrs="title"></div>
<h1 class="center key" dir="ltr"></h1>
<p class="center text-center key-instructions">
<span class="font-subheading" data-i18n-key="dialogs.input-room-id-on-another-device" data-i18n-attrs="text"></span>
<span class="font-subheading" data-i18n-key="dialogs.scan-qr-code" data-i18n-attrs="text"></span>
</p>
</div>
</div>
<div class="hr-note">
<hr>
<div>
<span data-i18n-key="dialogs.hr-or" data-i18n-attrs="text"></span>
</div>
</div>
<div class="row center p-2">
<div class="column fw">
<div class="input-key-container" dir="ltr">
<input type="text" class="textarea center" aria-label="room-id-char-1" maxlength="1" autocorrect="off" autocomplete="off" autocapitalize="none" spellcheck="false" autofocus contenteditable placeholder disabled>
<input type="text" class="textarea center" aria-label="room-id-char-2" maxlength="1" autocorrect="off" autocomplete="off" autocapitalize="none" spellcheck="false" contenteditable placeholder disabled>
<input type="text" class="textarea center" aria-label="room-id-char-3" maxlength="1" autocorrect="off" autocomplete="off" autocapitalize="none" spellcheck="false" contenteditable placeholder disabled>
<input type="text" class="textarea center" aria-label="room-id-char-4" maxlength="1" autocorrect="off" autocomplete="off" autocapitalize="none" spellcheck="false" contenteditable placeholder disabled>
<input type="text" class="textarea center" aria-label="room-id-char-5" maxlength="1" autocorrect="off" autocomplete="off" autocapitalize="none" spellcheck="false" contenteditable placeholder disabled>
</div>
<p class="font-subheading center text-center" data-i18n-key="dialogs.enter-room-id-from-another-device" data-i18n-attrs="text"></p>
</div>
</div>
<div class="center row-reverse btn-row wrap">
<div class="row-reverse wrap grow-2">
<button class="btn btn-rounded btn-grey" type="submit" data-i18n-key="dialogs.join" data-i18n-attrs="text" disabled></button>
<button class="btn btn-rounded btn-grey leave-room" type="button" data-i18n-key="dialogs.leave" data-i18n-attrs="text"></button>
</div>
<button class="btn btn-rounded btn-grey" type="button" data-i18n-key="dialogs.close" data-i18n-attrs="text" close></button>
</div>
</x-paper>
</x-background>
</form>
</x-dialog>
<!-- Receive Request Dialog -->
<x-dialog id="receiveRequestDialog">
<x-dialog id="receive-request-dialog">
<x-background class="full center">
<x-paper shadow="2">
<h2 class="center">PairDrop</h2>
<div class="text-center file-description">
<div>
<span id="requestingPeerDisplayName"></span>
<span>would like to share</span>
</div>
<div class="row" id="fileName">
<span id="fileStem"></span>
<span id="fileExtension"></span>
</div>
<div class="row">
<span id="fileOther"></span>
<div class="row center p-2">
<h2 class="dialog-title"></h2>
</div>
<div class="row center p-2">
<div class="column center file-description">
<div>
<span class="display-name badge"></span>
<span data-i18n-key="dialogs.would-like-to-share" data-i18n-attrs="text"></span>
</div>
<div class="row file-name">
<span class="file-stem"></span>
<span class="file-extension"></span>
</div>
<div class="row file-other">
</div>
<div class="row font-body2 file-size"></div>
</div>
</div>
<div class="font-body2 text-center file-size"></div>
<div class="center file-preview"></div>
<div class="row-reverse space-between">
<button class="button" id="acceptRequest" title="ENTER" autofocus>Accept</button>
<div class="separator"></div>
<button class="button" id="declineRequest" title="ESCAPE">Decline</button>
<div class="row-reverse center btn-row wrap">
<button id="accept-request" class="btn btn-rounded btn-grey" title="ENTER" data-i18n-key="dialogs.accept" data-i18n-attrs="text" autofocus disabled></button>
<button id="decline-request" class="btn btn-rounded btn-grey" title="ESCAPE" data-i18n-key="dialogs.decline" data-i18n-attrs="text"></button>
</div>
</x-paper>
</x-background>
</x-dialog>
<!-- Receive File Dialog -->
<x-dialog id="receiveFileDialog">
<x-dialog id="receive-file-dialog">
<x-background class="full center">
<x-paper shadow="2">
<h2 class="center" id="receiveTitle"></h2>
<div class="text-center file-description"></div>
<div class="font-body2 text-center file-size"></div>
<div class="row center p-2">
<h2 class="dialog-title"></h2>
</div>
<div class="row center p-2">
<div class="column center file-description">
<div>
<span class="display-name badge"></span>
<span data-i18n-key="dialogs.has-sent" data-i18n-attrs="text"></span>
</div>
<div class="row file-name">
<span class="file-stem"></span>
<span class="file-extension"></span>
</div>
<div class="row file-other">
</div>
<div class="row font-body2 file-size"></div>
</div>
</div>
<div class="center file-preview"></div>
<div class="row-reverse space-between">
<a class="button" id="shareOrDownload" autofocus></a>
<div class="separator"></div>
<button class="button" close>Close</button>
<div class="row-reverse center btn-row wrap">
<button id="share-btn" class="btn btn-rounded btn-grey" data-i18n-key="dialogs.share" data-i18n-attrs="text" hidden></button>
<button id="download-btn" class="btn btn-rounded btn-grey" data-i18n-key="dialogs.download" data-i18n-attrs="text" autofocus disabled></button>
<button class="btn btn-rounded btn-grey" data-i18n-key="dialogs.close" data-i18n-attrs="text" close></button>
</div>
</x-paper>
</x-background>
</x-dialog>
<!-- Send Text Dialog -->
<x-dialog id="sendTextDialog">
<x-dialog id="send-text-dialog">
<form action="#">
<x-background class="full center">
<x-paper shadow="2">
<h2>PairDrop - Send a Message</h2>
<div id="textInput" class="textarea" role="textbox" placeholder="Send a message" autocapitalize="none" spellcheck="false" autofocus contenteditable></div>
<div class="row-reverse">
<button class="button" type="submit" title="STR + ENTER" disabled close>Send</button>
<div class="separator"></div>
<a class="button" title="ESCAPE" close>Cancel</a>
<div class="row center p-2">
<h2 class="dialog-title" data-i18n-key="dialogs.send-message-title" data-i18n-attrs="text"></h2>
</div>
<div class="row center p-2 display-name-wrapper">
<div class="column">
<div class="text-center">
<span data-i18n-key="dialogs.send-message-to" data-i18n-attrs="text"></span>
<span class="display-name badge"></span>
</div>
</div>
</div>
<div class="row p-2">
<div class="column fw">
<div class="fw textarea" role="textbox" data-i18n-key="dialogs.message" data-i18n-attrs="title placeholder" autofocus contenteditable></div>
</div>
</div>
<div class="btn-row row-reverse wrap">
<button class="btn btn-rounded btn-grey" type="submit" title="CTRL/⌘ + ENTER" data-i18n-key="dialogs.send" data-i18n-attrs="text" disabled></button>
<button class="btn btn-rounded btn-grey" type="button" title="ESCAPE" data-i18n-key="dialogs.cancel" data-i18n-attrs="text" close></button>
</div>
</x-paper>
</x-background>
</form>
</x-dialog>
<!-- Receive Text Dialog -->
<x-dialog id="receiveTextDialog">
<x-dialog id="receive-text-dialog">
<x-background class="full center">
<x-paper shadow="2">
<h2>PairDrop - Message Received</h2>
<div id="receiveTextDescriptionContainer">
<span id="receiveTextPeerDisplayName"></span>
<span>sent the following message:</span>
<div class="row center p-2">
<h2 class="dialog-title" class="text-center" data-i18n-key="dialogs.receive-text-title" data-i18n-attrs="text"></h2>
</div>
<div class="row-separator"></div>
<div id="text"></div>
<div class="row-reverse">
<button class="button" id="copy" title="CTRL/⌘ + C">Copy</button>
<div class="separator"></div>
<button class="button" id="close" title="ESCAPE">Close</button>
<div class="row center p-2 display-name-wrapper">
<div class="text-center">
<span class="display-name badge"></span>
<span data-i18n-key="dialogs.has-sent" data-i18n-attrs="text"></span>
</div>
</div>
<div class="row center p-2">
<div class="column fw">
<div id="text" class="textarea"></div>
</div>
</div>
<div class="row-reverse center btn-row wrap">
<button id="copy" class="btn btn-rounded btn-grey" title="CTRL/⌘ + C" data-i18n-key="dialogs.copy" data-i18n-attrs="text"></button>
<button id="close" class="btn btn-rounded btn-grey" title="ESCAPE" data-i18n-key="dialogs.close" data-i18n-attrs="text"></button>
</div>
</x-paper>
</x-background>
</x-dialog>
<!-- base64ZipDialog Dialog -->
<x-dialog id="base64ZipDialog">
<!-- Share Text Dialog -->
<x-dialog id="share-text-dialog">
<x-background class="full center">
<x-paper shadow="2">
<button class="button center" id="base64ZipPasteBtn" title="Paste">Tap here to paste files</button>
<button class="button center" close>Close</button>
<div class="row center p-2">
<h2 class="dialog-title" data-i18n-key="dialogs.share-text-title" data-i18n-attrs="text"></h2>
</div>
<div class="row center p-2 pb-0">
<div class="column">
<div class="text-center">
<span data-i18n-key="dialogs.share-text-subtitle" data-i18n-attrs="text"></span>
</div>
</div>
</div>
<div class="row p-2">
<div class="column fw">
<div class="fw textarea" role="textbox" data-i18n-key="dialogs.message" data-i18n-attrs="title placeholder" contenteditable></div>
</div>
</div>
<div class="row p-2 center">
<span class="mx-1" data-i18n-key="dialogs.share-text-checkbox" data-i18n-attrs="text"></span>
<label class="pointer switch mx-1">
<input type="checkbox">
<div class="slider round"></div>
</label>
</div>
<div class="btn-row row-reverse wrap">
<button class="btn btn-rounded btn-grey" type="submit" title="CTRL/⌘ + ENTER" data-i18n-key="dialogs.approve" data-i18n-attrs="text" autofocus disabled></button>
</div>
</x-paper>
</x-background>
</x-dialog>
<!-- base64 Paste Dialog -->
<x-dialog id="base64-paste-dialog">
<x-background class="full center">
<x-paper shadow="2">
<div class="row center p-2">
<h2 class="dialog-title"></h2>
</div>
<div class="row p-2">
<button class="btn btn-rounded btn-grey center" id="base64-paste-btn" title="Paste"></button>
<div class="textarea" title="CMD/⌘ + V" contenteditable hidden></div>
</div>
<div class="row-reverse center btn-row wrap">
<button class="btn btn-rounded btn-grey" data-i18n-key="dialogs.close" data-i18n-attrs="text" close></button>
</div>
</x-paper>
</x-background>
</x-dialog>
<!-- Toast -->
<div class="toast-container full center">
<x-toast class="row" shadow="1" id="toast"></x-toast>
<x-toast id="toast" shadow="1">
<span class="center text-center"></span>
<div class="icon-button" data-i18n-key="dialogs.close-toast" data-i18n-attrs="title">
<svg class="icon">
<use xlink:href="#close-icon"></use>
</svg>
</div>
</x-toast>
</div>
<!-- About Page -->
<x-about id="about" class="full center column">
<section class="center column fade-in">
<header class="row-reverse">
<a href="#" class="close icon-button">
<svg class="icon">
<use xlink:href="#close-icon" />
</svg>
</a>
</header>
<header class="row-reverse">
<a href="#" class="close icon-button" data-i18n-key="about.close-about" data-i18n-attrs="aria-label">
<svg class="icon">
<use xlink:href="#close-icon"></use>
</svg>
</a>
</header>
<section class="center column">
<svg class="icon logo">
<use xlink:href="#wifi-tethering" />
<use xlink:href="#wifi-tethering"></use>
</svg>
<h1>PairDrop</h1>
<div class="font-subheading">The easiest way to transfer files across devices</div>
<div class="title-wrapper" dir="ltr">
<h1>PairDrop</h1>
<div class="font-subheading">v1.11.2</div>
</div>
<div class="font-subheading" data-i18n-key="about.claim" data-i18n-attrs="text"></div>
<div class="row">
<a class="icon-button" target="_blank" href="https://github.com/schlagmichdoch/pairdrop" title="PairDrop on Github" rel="noreferrer">
<a class="icon-button" target="_blank" href="https://github.com/schlagmichdoch/pairdrop" rel="noreferrer" data-i18n-key="about.github" data-i18n-attrs="title">
<svg class="icon">
<use xlink:href="#github" />
<use xlink:href="#github"></use>
</svg>
</a>
<a class="icon-button" target="_blank" href="https://www.buymeacoffee.com/pairdrop" title="Buy me a coffee!" rel="noreferrer">
<a class="icon-button" id="donation-btn" target="_blank" href="https://www.buymeacoffee.com/pairdrop" rel="noreferrer" data-i18n-key="about.buy-me-a-coffee" data-i18n-attrs="title">
<svg class="icon">
<use xlink:href="#monetarization" />
<use xlink:href="#donation"></use>
</svg>
</a>
<a class="icon-button" target="_blank" href="https://twitter.com/intent/tweet?text=https%3A%2F%2Fpairdrop.net%20by%20https%3A%2F%2Fgithub.com%2Fschlagmichdoch%2F&" title="Tweet about PairDrop" rel="noreferrer">
<a class="icon-button" id="x-twitter-btn" target="_blank" href="https://x.com/intent/tweet?text=https%3A%2F%2Fpairdrop.net%20by%20https%3A%2F%2Fgithub.com%2Fschlagmichdoch%2F&amp;" rel="noreferrer" data-i18n-key="about.tweet" data-i18n-attrs="title">
<svg class="icon">
<use xlink:href="#twitter" />
<use xlink:href="#x-twitter"></use>
</svg>
</a>
<a class="icon-button" target="_blank" href="https://github.com/schlagmichdoch/pairdrop/blob/master/docs/faq.md" title="Frequently asked questions" rel="noreferrer">
<a class="icon-button" id="mastodon-btn" target="_blank" rel="noreferrer" data-i18n-key="about.mastodon" data-i18n-attrs="title" hidden>
<svg class="icon">
<use xlink:href="#help-outline" />
<use xlink:href="#mastodon"></use>
</svg>
</a>
<a class="icon-button" id="bluesky-btn" target="_blank" rel="noreferrer" data-i18n-key="about.bluesky" data-i18n-attrs="title" hidden>
<svg class="icon">
<use xlink:href="#bluesky"></use>
</svg>
</a>
<a class="icon-button" id="custom-btn" target="_blank" rel="noreferrer" data-i18n-key="about.custom" data-i18n-attrs="title" hidden>
<svg class="icon">
<use xlink:href="#custom"></use>
</svg>
</a>
<a class="icon-button" id="privacypolicy-btn" target="_blank" rel="noreferrer" data-i18n-key="about.privacypolicy" data-i18n-attrs="title" hidden>
<svg class="icon">
<use xlink:href="#privacypolicy"></use>
</svg>
</a>
<a class="icon-button" target="_blank" href="https://github.com/schlagmichdoch/pairdrop/blob/master/docs/faq.md" rel="noreferrer" data-i18n-key="about.faq" data-i18n-attrs="title">
<svg class="icon">
<use xlink:href="#help-outline"></use>
</svg>
</a>
</div>
</section>
<x-background></x-background>
</x-about>
<canvas class="circles opacity-0"></canvas>
<!-- SVG Icon Library -->
<svg style="display: none;">
<symbol id=wifi-tethering viewBox="0 0 24 24">
<symbol id="wifi-tethering" viewBox="0 0 24 24">
<path d="M12 11c-1.1 0-2 .9-2 2s.9 2 2 2 2-.9 2-2-.9-2-2-2zm6 2c0-3.31-2.69-6-6-6s-6 2.69-6 6c0 2.22 1.21 4.15 3 5.19l1-1.74c-1.19-.7-2-1.97-2-3.45 0-2.21 1.79-4 4-4s4 1.79 4 4c0 1.48-.81 2.75-2 3.45l1 1.74c1.79-1.04 3-2.97 3-5.19zM12 3C6.48 3 2 7.48 2 13c0 3.7 2.01 6.92 4.99 8.65l1-1.73C5.61 18.53 4 15.96 4 13c0-4.42 3.58-8 8-8s8 3.58 8 8c0 2.96-1.61 5.53-4 6.92l1 1.73c2.99-1.73 5-4.95 5-8.65 0-5.52-4.48-10-10-10z"></path>
</symbol>
<symbol id=desktop-mac viewBox="0 0 24 24">
<symbol id="desktop-mac" viewBox="0 0 24 24">
<path d="M21 2H3c-1.1 0-2 .9-2 2v12c0 1.1.9 2 2 2h7l-2 3v1h8v-1l-2-3h7c1.1 0 2-.9 2-2V4c0-1.1-.9-2-2-2zm0 12H3V4h18v10z"></path>
</symbol>
<symbol id=phone-iphone viewBox="0 0 24 24">
<symbol id="phone-iphone" viewBox="0 0 24 24">
<path d="M15.5 1h-8C6.12 1 5 2.12 5 3.5v17C5 21.88 6.12 23 7.5 23h8c1.38 0 2.5-1.12 2.5-2.5v-17C18 2.12 16.88 1 15.5 1zm-4 21c-.83 0-1.5-.67-1.5-1.5s.67-1.5 1.5-1.5 1.5.67 1.5 1.5-.67 1.5-1.5 1.5zm4.5-4H7V4h9v14z"></path>
</symbol>
<symbol id=tablet-mac viewBox="0 0 24 24">
<symbol id="tablet-mac" viewBox="0 0 24 24">
<path d="M18.5 0h-14C3.12 0 2 1.12 2 2.5v19C2 22.88 3.12 24 4.5 24h14c1.38 0 2.5-1.12 2.5-2.5v-19C21 1.12 19.88 0 18.5 0zm-7 23c-.83 0-1.5-.67-1.5-1.5s.67-1.5 1.5-1.5 1.5.67 1.5 1.5-.67 1.5-1.5 1.5zm7.5-4H4V3h15v16z"></path>
</symbol>
<symbol id=info-outline viewBox="0 0 24 24">
<symbol id="info-outline" viewBox="0 0 24 24">
<path d="M11 17h2v-6h-2v6zm1-15C6.48 2 2 6.48 2 12s4.48 10 10 10 10-4.48 10-10S17.52 2 12 2zm0 18c-4.41 0-8-3.59-8-8s3.59-8 8-8 8 3.59 8 8-3.59 8-8 8zM11 9h2V7h-2v2z"></path>
</symbol>
<symbol id=close-icon viewBox="0 0 24 24">
<symbol id="close-icon" viewBox="0 0 24 24">
<path d="M19 6.41L17.59 5 12 10.59 6.41 5 5 6.41 10.59 12 5 17.59 6.41 19 12 13.41 17.59 19 19 17.59 13.41 12z"></path>
</symbol>
<symbol id=help-outline viewBox="0 0 24 24">
<symbol id="help-outline" viewBox="0 0 24 24">
<path d="M11 18h2v-2h-2v2zm1-16C6.48 2 2 6.48 2 12s4.48 10 10 10 10-4.48 10-10S17.52 2 12 2zm0 18c-4.41 0-8-3.59-8-8s3.59-8 8-8 8 3.59 8 8-3.59 8-8 8zm0-14c-2.21 0-4 1.79-4 4h2c0-1.1.9-2 2-2s2 .9 2 2c0 2-3 1.75-3 5h2c0-2.25 3-2.5 3-5 0-2.21-1.79-4-4-4z"></path>
</symbol>
<symbol id="twitter">
<path d="M23.954 4.569c-.885.389-1.83.654-2.825.775 1.014-.611 1.794-1.574 2.163-2.723-.951.555-2.005.959-3.127 1.184-.896-.959-2.173-1.559-3.591-1.559-2.717 0-4.92 2.203-4.92 4.917 0 .39.045.765.127 1.124C7.691 8.094 4.066 6.13 1.64 3.161c-.427.722-.666 1.561-.666 2.475 0 1.71.87 3.213 2.188 4.096-.807-.026-1.566-.248-2.228-.616v.061c0 2.385 1.693 4.374 3.946 4.827-.413.111-.849.171-1.296.171-.314 0-.615-.03-.916-.086.631 1.953 2.445 3.377 4.604 3.417-1.68 1.319-3.809 2.105-6.102 2.105-.39 0-.779-.023-1.17-.067 2.189 1.394 4.768 2.209 7.557 2.209 9.054 0 13.999-7.496 13.999-13.986 0-.209 0-.42-.015-.63.961-.689 1.8-1.56 2.46-2.548l-.047-.02z" />
<symbol id="x-twitter">
<path d="M17.996,2.219l3.265,0l-7.13,8.148l8.388,11.088l-6.566,0l-5.147,-6.723l-5.882,6.723l-3.269,0l7.625,-8.716l-8.041,-10.52l6.733,0l4.647,6.146l5.377,-6.146Zm-1.146,17.285l1.808,-0l-11.671,-15.435l-1.942,0l11.805,15.435Z"></path>
</symbol>
<symbol id="github">
<path d="M12 .297c-6.63 0-12 5.373-12 12 0 5.303 3.438 9.8 8.205 11.385.6.113.82-.258.82-.577 0-.285-.01-1.04-.015-2.04-3.338.724-4.042-1.61-4.042-1.61C4.422 18.07 3.633 17.7 3.633 17.7c-1.087-.744.084-.729.084-.729 1.205.084 1.838 1.236 1.838 1.236 1.07 1.835 2.809 1.305 3.495.998.108-.776.417-1.305.76-1.605-2.665-.3-5.466-1.332-5.466-5.93 0-1.31.465-2.38 1.235-3.22-.135-.303-.54-1.523.105-3.176 0 0 1.005-.322 3.3 1.23.96-.267 1.98-.399 3-.405 1.02.006 2.04.138 3 .405 2.28-1.552 3.285-1.23 3.285-1.23.645 1.653.24 2.873.12 3.176.765.84 1.23 1.91 1.23 3.22 0 4.61-2.805 5.625-5.475 5.92.42.36.81 1.096.81 2.22 0 1.606-.015 2.896-.015 3.286 0 .315.21.69.825.57C20.565 22.092 24 17.592 24 12.297c0-6.627-5.373-12-12-12" />
<path d="M12 .297c-6.63 0-12 5.373-12 12 0 5.303 3.438 9.8 8.205 11.385.6.113.82-.258.82-.577 0-.285-.01-1.04-.015-2.04-3.338.724-4.042-1.61-4.042-1.61C4.422 18.07 3.633 17.7 3.633 17.7c-1.087-.744.084-.729.084-.729 1.205.084 1.838 1.236 1.838 1.236 1.07 1.835 2.809 1.305 3.495.998.108-.776.417-1.305.76-1.605-2.665-.3-5.466-1.332-5.466-5.93 0-1.31.465-2.38 1.235-3.22-.135-.303-.54-1.523.105-3.176 0 0 1.005-.322 3.3 1.23.96-.267 1.98-.399 3-.405 1.02.006 2.04.138 3 .405 2.28-1.552 3.285-1.23 3.285-1.23.645 1.653.24 2.873.12 3.176.765.84 1.23 1.91 1.23 3.22 0 4.61-2.805 5.625-5.475 5.92.42.36.81 1.096.81 2.22 0 1.606-.015 2.896-.015 3.286 0 .315.21.69.825.57C20.565 22.092 24 17.592 24 12.297c0-6.627-5.373-12-12-12"></path>
</symbol>
<symbol id="notifications">
<path d="M12 22c1.1 0 2-.9 2-2h-4c0 1.1.89 2 2 2zm6-6v-5c0-3.07-1.64-5.64-4.5-6.32V4c0-.83-.67-1.5-1.5-1.5s-1.5.67-1.5 1.5v.68C7.63 5.36 6 7.92 6 11v5l-2 2v1h16v-1l-2-2z"></path>
</symbol>
<g id="notifications">
<path d="M12 22c1.1 0 2-.9 2-2h-4c0 1.1.89 2 2 2zm6-6v-5c0-3.07-1.64-5.64-4.5-6.32V4c0-.83-.67-1.5-1.5-1.5s-1.5.67-1.5 1.5v.68C7.63 5.36 6 7.92 6 11v5l-2 2v1h16v-1l-2-2z" />
</g>
<symbol id="homescreen">
<path fill="none" d="M0 0h24v24H0V0z" />
<path d="M18 1.01L8 1c-1.1 0-2 .9-2 2v3h2V5h10v14H8v-1H6v3c0 1.1.9 2 2 2h10c1.1 0 2-.9 2-2V3c0-1.1-.9-1.99-2-1.99zM10 15h2V8H5v2h3.59L3 15.59 4.41 17 10 11.41z" />
<path fill="none" d="M0 0h24v24H0V0z" />
<path fill="none" d="M0 0h24v24H0V0z"></path>
<path d="M18 1.01L8 1c-1.1 0-2 .9-2 2v3h2V5h10v14H8v-1H6v3c0 1.1.9 2 2 2h10c1.1 0 2-.9 2-2V3c0-1.1-.9-1.99-2-1.99zM10 15h2V8H5v2h3.59L3 15.59 4.41 17 10 11.41z"></path>
<path fill="none" d="M0 0h24v24H0V0z"></path>
</symbol>
<symbol id="monetarization">
<path d="M0 0h24v24H0z" fill="none" />
<path d="M12 2C6.48 2 2 6.48 2 12s4.48 10 10 10 10-4.48 10-10S17.52 2 12 2zm1.41 16.09V20h-2.67v-1.93c-1.71-.36-3.16-1.46-3.27-3.4h1.96c.1 1.05.82 1.87 2.65 1.87 1.96 0 2.4-.98 2.4-1.59 0-.83-.44-1.61-2.67-2.14-2.48-.6-4.18-1.62-4.18-3.67 0-1.72 1.39-2.84 3.11-3.21V4h2.67v1.95c1.86.45 2.79 1.86 2.85 3.39H14.3c-.05-1.11-.64-1.87-2.22-1.87-1.5 0-2.4.68-2.4 1.64 0 .84.65 1.39 2.67 1.91s4.18 1.39 4.18 3.91c-.01 1.83-1.38 2.83-3.12 3.16z" />
<symbol id="donation">
<path d="M0 0h24v24H0z" fill="none"></path>
<path d="M12 2C6.48 2 2 6.48 2 12s4.48 10 10 10 10-4.48 10-10S17.52 2 12 2zm1.41 16.09V20h-2.67v-1.93c-1.71-.36-3.16-1.46-3.27-3.4h1.96c.1 1.05.82 1.87 2.65 1.87 1.96 0 2.4-.98 2.4-1.59 0-.83-.44-1.61-2.67-2.14-2.48-.6-4.18-1.62-4.18-3.67 0-1.72 1.39-2.84 3.11-3.21V4h2.67v1.95c1.86.45 2.79 1.86 2.85 3.39H14.3c-.05-1.11-.64-1.87-2.22-1.87-1.5 0-2.4.68-2.4 1.64 0 .84.65 1.39 2.67 1.91s4.18 1.39 4.18 3.91c-.01 1.83-1.38 2.83-3.12 3.16z"></path>
</symbol>
<symbol id="icon-theme" viewBox="0 0 24 24">
<rect fill="none" height="24" width="24"/><path d="M12,3c-4.97,0-9,4.03-9,9s4.03,9,9,9s9-4.03,9-9c0-0.46-0.04-0.92-0.1-1.36c-0.98,1.37-2.58,2.26-4.4,2.26 c-2.98,0-5.4-2.42-5.4-5.4c0-1.81,0.89-3.42,2.26-4.4C12.92,3.04,12.46,3,12,3L12,3z"/>
<symbol id="icon-theme-auto" viewBox="-54 -54 620 620">
<!--! Font Awesome Pro 6.4.0 by @fontawesome - https://fontawesome.com License - https://fontawesome.com/license (Commercial License) Copyright 2023 Fonticons, Inc. -->
<path d="M448 256c0-106-86-192-192-192V448c106 0 192-86 192-192zM0 256a256 256 0 1 1 512 0A256 256 0 1 1 0 256z"></path>
</symbol>
<symbol id="icon-theme-light" viewBox="-54 -54 620 620">
<!--! Font Awesome Pro 6.4.0 by @fontawesome - https://fontawesome.com License - https://fontawesome.com/license (Commercial License) Copyright 2023 Fonticons, Inc. -->
<path d="M361.5 1.2c5 2.1 8.6 6.6 9.6 11.9L391 121l107.9 19.8c5.3 1 9.8 4.6 11.9 9.6s1.5 10.7-1.6 15.2L446.9 256l62.3 90.3c3.1 4.5 3.7 10.2 1.6 15.2s-6.6 8.6-11.9 9.6L391 391 371.1 498.9c-1 5.3-4.6 9.8-9.6 11.9s-10.7 1.5-15.2-1.6L256 446.9l-90.3 62.3c-4.5 3.1-10.2 3.7-15.2 1.6s-8.6-6.6-9.6-11.9L121 391 13.1 371.1c-5.3-1-9.8-4.6-11.9-9.6s-1.5-10.7 1.6-15.2L65.1 256 2.8 165.7c-3.1-4.5-3.7-10.2-1.6-15.2s6.6-8.6 11.9-9.6L121 121 140.9 13.1c1-5.3 4.6-9.8 9.6-11.9s10.7-1.5 15.2 1.6L256 65.1 346.3 2.8c4.5-3.1 10.2-3.7 15.2-1.6zM160 256a96 96 0 1 1 192 0 96 96 0 1 1 -192 0zm224 0a128 128 0 1 0 -256 0 128 128 0 1 0 256 0z"></path>
</symbol>
<symbol id="icon-theme-dark" viewBox="0 0 24 24">
<rect fill="none" height="24" width="24"></rect><path d="M12,3c-4.97,0-9,4.03-9,9s4.03,9,9,9s9-4.03,9-9c0-0.46-0.04-0.92-0.1-1.36c-0.98,1.37-2.58,2.26-4.4,2.26 c-2.98,0-5.4-2.42-5.4-5.4c0-1.81,0.89-3.42,2.26-4.4C12.92,3.04,12.46,3,12,3L12,3z"></path>
</symbol>
<symbol id="pair-device-icon" viewBox="0 0 640 512">
<!--! Font Awesome Pro 6.2.1 by @fontawesome - https://fontawesome.com License - https://fontawesome.com/license (Commercial License) Copyright 2022 Fonticons, Inc. -->
<path d="M579.8 267.7c56.5-56.5 56.5-148 0-204.5c-50-50-128.8-56.5-186.3-15.4l-1.6 1.1c-14.4 10.3-17.7 30.3-7.4 44.6s30.3 17.7 44.6 7.4l1.6-1.1c32.1-22.9 76-19.3 103.8 8.6c31.5 31.5 31.5 82.5 0 114L422.3 334.8c-31.5 31.5-82.5 31.5-114 0c-27.9-27.9-31.5-71.8-8.6-103.8l1.1-1.6c10.3-14.4 6.9-34.4-7.4-44.6s-34.4-6.9-44.6 7.4l-1.1 1.6C206.5 251.2 213 330 263 380c56.5 56.5 148 56.5 204.5 0L579.8 267.7zM60.2 244.3c-56.5 56.5-56.5 148 0 204.5c50 50 128.8 56.5 186.3 15.4l1.6-1.1c14.4-10.3 17.7-30.3 7.4-44.6s-30.3-17.7-44.6-7.4l-1.6 1.1c-32.1 22.9-76 19.3-103.8-8.6C74 372 74 321 105.5 289.5L217.7 177.2c31.5-31.5 82.5-31.5 114 0c27.9 27.9 31.5 71.8 8.6 103.9l-1.1 1.6c-10.3 14.4-6.9 34.4 7.4 44.6s34.4 6.9 44.6-7.4l1.1-1.6C433.5 260.8 427 182 377 132c-56.5-56.5-148-56.5-204.5 0L60.2 244.3z"/>
<path d="M579.8 267.7c56.5-56.5 56.5-148 0-204.5c-50-50-128.8-56.5-186.3-15.4l-1.6 1.1c-14.4 10.3-17.7 30.3-7.4 44.6s30.3 17.7 44.6 7.4l1.6-1.1c32.1-22.9 76-19.3 103.8 8.6c31.5 31.5 31.5 82.5 0 114L422.3 334.8c-31.5 31.5-82.5 31.5-114 0c-27.9-27.9-31.5-71.8-8.6-103.8l1.1-1.6c10.3-14.4 6.9-34.4-7.4-44.6s-34.4-6.9-44.6 7.4l-1.1 1.6C206.5 251.2 213 330 263 380c56.5 56.5 148 56.5 204.5 0L579.8 267.7zM60.2 244.3c-56.5 56.5-56.5 148 0 204.5c50 50 128.8 56.5 186.3 15.4l1.6-1.1c14.4-10.3 17.7-30.3 7.4-44.6s-30.3-17.7-44.6-7.4l-1.6 1.1c-32.1 22.9-76 19.3-103.8-8.6C74 372 74 321 105.5 289.5L217.7 177.2c31.5-31.5 82.5-31.5 114 0c27.9 27.9 31.5 71.8 8.6 103.9l-1.1 1.6c-10.3 14.4-6.9 34.4 7.4 44.6s34.4 6.9 44.6-7.4l1.1-1.6C433.5 260.8 427 182 377 132c-56.5-56.5-148-56.5-204.5 0L60.2 244.3z"></path>
</symbol>
<symbol id="clear-pair-devices-icon" viewBox="0 0 640 512">
<!--! Font Awesome Pro 6.2.1 by @fontawesome - https://fontawesome.com License - https://fontawesome.com/license (Commercial License) Copyright 2022 Fonticons, Inc. -->
<path d="M38.8 5.1C28.4-3.1 13.3-1.2 5.1 9.2S-1.2 34.7 9.2 42.9l592 464c10.4 8.2 25.5 6.3 33.7-4.1s6.3-25.5-4.1-33.7L489.3 358.2l90.5-90.5c56.5-56.5 56.5-148 0-204.5c-50-50-128.8-56.5-186.3-15.4l-1.6 1.1c-14.4 10.3-17.7 30.3-7.4 44.6s30.3 17.7 44.6 7.4l1.6-1.1c32.1-22.9 76-19.3 103.8 8.6c31.5 31.5 31.5 82.5 0 114l-96 96-31.9-25C430.9 239.6 420.1 175.1 377 132c-52.2-52.3-134.5-56.2-191.3-11.7L38.8 5.1zM239 162c30.1-14.9 67.7-9.9 92.8 15.3c20 20 27.5 48.3 21.7 74.5L239 162zM406.6 416.4L220.9 270c-2.1 39.8 12.2 80.1 42.2 110c38.9 38.9 94.4 51 143.6 36.3zm-290-228.5L60.2 244.3c-56.5 56.5-56.5 148 0 204.5c50 50 128.8 56.5 186.3 15.4l1.6-1.1c14.4-10.3 17.7-30.3 7.4-44.6s-30.3-17.7-44.6-7.4l-1.6 1.1c-32.1 22.9-76 19.3-103.8-8.6C74 372 74 321 105.5 289.5l61.8-61.8-50.6-39.9z"/>
<symbol id="edit-pair-devices-icon" viewBox="-159 25 640 512">
<!--! Font Awesome Pro 6.4.0 by @fontawesome - https://fontawesome.com License - https://fontawesome.com/license (Commercial License) Copyright 2023 Fonticons, Inc. -->
<!--! edited by @schlagmichdoch -->
<path d="M218,155.4c-56.5-56.5-148-56.5-204.5,0L-98.8,267.7c-56.5,56.5-56.5,148,0,204.5c50,50,128.8,56.5,186.3,15.4l1.6-1.1 c14.4-10.3,17.7-30.3,7.4-44.6s-30.3-17.7-44.6-7.4l-1.6,1.1c-32.1,22.9-76,19.3-103.8-8.6c-31.5-31.6-31.5-82.6,0-114.1L58.7,200.6 c31.5-31.5,82.5-31.5,114,0c15.8,15.8,23.8,36.7,23.6,57.6c7.9-8.3,18.9-13,30.6-13c4.5,0,8.9,0.7,13.2,2l17.4,5.5 c0.9-0.5,1.8-1,2.7-1.5C258.7,216.2,244.4,181.8,218,155.4z M420.8,86.6c-50-50-128.8-56.5-186.3-15.4l-1.6,1.1 c-14.4,10.3-17.7,30.3-7.4,44.6s30.3,17.7,44.6,7.4l1.6-1.1c32.1-22.9,76-19.3,103.8,8.6c25.8,25.8,30.5,64.7,14,95.2 c0.7,2,1.3,4,1.8,6.1l3.9,17.9c1.1,0.6,2.1,1.2,3.2,1.8l17.4-5.5c4.3-1.4,8.7-2,13.1-2c7.3,0,14.3,1.8,20.5,5.2 C474.7,196.8,465.1,130.9,420.8,86.6z M140.7,254.4l1.1-1.6c10.3-14.4,6.9-34.4-7.4-44.6s-34.4-6.9-44.6,7.4l-1.1,1.6 C47.5,274.6,54,353.4,104,403.4c18.7,18.7,41.2,31.2,65,37.5c-1.4-3.1-2.6-6.2-3.8-9.3c-6-16.4-1.5-34.6,11.6-46.4l7.2-6.6 c-12.7-3.6-24.7-10.5-34.8-20.5C121.4,330.3,117.8,286.4,140.7,254.4z"></path>
<path d="M458.9,407.4l-24.3-22.1c0.6-4.7,1-9.4,1-14.2s-0.3-9.6-1-14.2l24.3-22.1c3.9-3.5,5.4-8.9,3.6-13.8v-0.1 c-2.5-6.7-5.4-13.1-8.9-19.2l-2.6-4.5c-3.7-6.2-7.8-12-12.4-17.5c-3.3-4-8.8-5.4-13.7-3.8l-31.2,9.9c-7.5-5.8-15.8-10.6-24.7-14.2 l-7-32c-1.1-5.1-5-9.1-10.2-10c-7.7-1.3-15.7-2-23.8-2s-16.1,0.7-23.8,2c-5.2,0.9-9.1,4.9-10.2,10l-7,32 c-8.9,3.7-17.2,8.5-24.7,14.2l-31.2-9.9c-4.9-1.6-10.4-0.2-13.7,3.8c-4.5,5.5-8.7,11.3-12.4,17.5l-2.6,4.5 c-3.4,6.2-6.4,12.6-8.9,19.2c-1.8,4.9-0.3,10.3,3.6,13.8l24.3,22.1c-0.6,4.7-1,9.4-1,14.2s0.3,9.6,1,14.3L197,407.5 c-3.9,3.5-5.4,8.9-3.6,13.8c2.5,6.7,5.4,13.1,8.9,19.2l2.6,4.5c3.7,6.2,7.8,12,12.4,17.5c3.3,4,8.8,5.4,13.7,3.8l31.2-10 c7.5,5.8,15.8,10.6,24.7,14.2l7,32c1.1,5.1,5,9.1,10.2,10c7.7,1.3,15.7,2,23.8,2c8.1,0,16.1-0.7,23.8-2c5.2-0.8,9.1-4.9,10.2-10 l7-32c8.9-3.6,17.2-8.5,24.7-14.2l31.2,9.9c4.9,1.6,10.4,0.2,13.7-3.8c4.5-5.5,8.7-11.3,12.4-17.5l2.6-4.5 c3.4-6.2,6.4-12.6,8.9-19.2C464.2,416.3,462.7,410.9,458.9,407.4z M328,415.9c-24.8,0-44.9-20.1-44.9-44.8 c0-24.8,20.1-44.8,44.9-44.8s44.8,20.1,44.8,44.8C372.8,395.9,352.7,415.9,328,415.9z"></path>
</symbol>
<symbol id="edit-pen-icon" viewBox="0 0 512 512">
<!--! Font Awesome Pro 6.3.0 by @fontawesome - https://fontawesome.com License - https://fontawesome.com/license (Commercial License) Copyright 2023 Fonticons, Inc. -->
<path d="M362.7 19.3L314.3 67.7 444.3 197.7l48.4-48.4c25-25 25-65.5 0-90.5L453.3 19.3c-25-25-65.5-25-90.5 0zm-71 71L58.6 323.5c-10.4 10.4-18 23.3-22.2 37.4L1 481.2C-1.5 489.7 .8 498.8 7 505s15.3 8.5 23.7 6.1l120.3-35.4c14.1-4.2 27-11.8 37.4-22.2L421.7 220.3 291.7 90.3z"></path>
</symbol>
<symbol id="public-room-icon" viewBox="0 0 640 512">
<!--! Font Awesome Pro 6.4.0 by @fontawesome - https://fontawesome.com License - https://fontawesome.com/license (Commercial License) Copyright 2023 Fonticons, Inc. -->
<path d="M0 24C0 10.7 10.7 0 24 0H616c13.3 0 24 10.7 24 24s-10.7 24-24 24H24C10.7 48 0 37.3 0 24zM0 488c0-13.3 10.7-24 24-24H616c13.3 0 24 10.7 24 24s-10.7 24-24 24H24c-13.3 0-24-10.7-24-24zM83.2 160a64 64 0 1 1 128 0 64 64 0 1 1 -128 0zM32 320c0-35.3 28.7-64 64-64h96c12.2 0 23.7 3.4 33.4 9.4c-37.2 15.1-65.6 47.2-75.8 86.6H64c-17.7 0-32-14.3-32-32zm461.6 32c-10.3-40.1-39.6-72.6-77.7-87.4c9.4-5.5 20.4-8.6 32.1-8.6h96c35.3 0 64 28.7 64 64c0 17.7-14.3 32-32 32H493.6zM391.2 290.4c32.1 7.4 58.1 30.9 68.9 61.6c3.5 10 5.5 20.8 5.5 32c0 17.7-14.3 32-32 32h-224c-17.7 0-32-14.3-32-32c0-11.2 1.9-22 5.5-32c10.5-29.7 35.3-52.8 66.1-60.9c7.8-2.1 16-3.1 24.5-3.1h96c7.4 0 14.7 .8 21.6 2.4zm44-130.4a64 64 0 1 1 128 0 64 64 0 1 1 -128 0zM321.6 96a80 80 0 1 1 0 160 80 80 0 1 1 0-160z"></path>
</symbol>
<symbol id="icon-language-selector" viewBox="0 0 640 512">
<!--! Font Awesome Free 6.4.2 by @fontawesome - https://fontawesome.com License - https://fontawesome.com/license (Commercial License) Copyright 2023 Fonticons, Inc. -->
<path d="M0 128C0 92.7 28.7 64 64 64H256h48 16H576c35.3 0 64 28.7 64 64V384c0 35.3-28.7 64-64 64H320 304 256 64c-35.3 0-64-28.7-64-64V128zm320 0V384H576V128H320zM178.3 175.9c-3.2-7.2-10.4-11.9-18.3-11.9s-15.1 4.7-18.3 11.9l-64 144c-4.5 10.1 .1 21.9 10.2 26.4s21.9-.1 26.4-10.2l8.9-20.1h73.6l8.9 20.1c4.5 10.1 16.3 14.6 26.4 10.2s14.6-16.3 10.2-26.4l-64-144zM160 233.2L179 276H141l19-42.8zM448 164c11 0 20 9 20 20v4h44 16c11 0 20 9 20 20s-9 20-20 20h-2l-1.6 4.5c-8.9 24.4-22.4 46.6-39.6 65.4c.9 .6 1.8 1.1 2.7 1.6l18.9 11.3c9.5 5.7 12.5 18 6.9 27.4s-18 12.5-27.4 6.9l-18.9-11.3c-4.5-2.7-8.8-5.5-13.1-8.5c-10.6 7.5-21.9 14-34 19.4l-3.6 1.6c-10.1 4.5-21.9-.1-26.4-10.2s.1-21.9 10.2-26.4l3.6-1.6c6.4-2.9 12.6-6.1 18.5-9.8l-12.2-12.2c-7.8-7.8-7.8-20.5 0-28.3s20.5-7.8 28.3 0l14.6 14.6 .5 .5c12.4-13.1 22.5-28.3 29.8-45H448 376c-11 0-20-9-20-20s9-20 20-20h52v-4c0-11 9-20 20-20z"></path>
</symbol>
<symbol id="i-cursor" viewBox="-180 0 640 512">
<!--!Font Awesome Free 6.5.1 by @fontawesome - https://fontawesome.com License - https://fontawesome.com/license/free Copyright 2023 Fonticons, Inc.-->
<path d="M.1 29.3C-1.4 47 11.7 62.4 29.3 63.9l8 .7C70.5 67.3 96 95 96 128.3V224H64c-17.7 0-32 14.3-32 32s14.3 32 32 32H96v95.7c0 33.3-25.5 61-58.7 63.8l-8 .7C11.7 449.6-1.4 465 .1 482.7s16.9 30.7 34.5 29.2l8-.7c34.1-2.8 64.2-18.9 85.4-42.9c21.2 24 51.2 40.1 85.4 42.9l8 .7c17.6 1.5 33.1-11.6 34.5-29.2s-11.6-33.1-29.2-34.5l-8-.7C185.5 444.7 160 417 160 383.7V288h32c17.7 0 32-14.3 32-32s-14.3-32-32-32H160V128.3c0-33.3 25.5-61 58.7-63.8l8-.7c17.6-1.5 30.7-16.9 29.2-34.5S239-1.4 221.3 .1l-8 .7C179.2 3.6 149.2 19.7 128 43.7c-21.2-24-51.2-40-85.4-42.9l-8-.7C17-1.4 1.6 11.7 .1 29.3z"></path>
</symbol>
<symbol id="font" viewBox="-100 0 640 512">
<!--!Font Awesome Free 6.5.1 by @fontawesome - https://fontawesome.com License - https://fontawesome.com/license/free Copyright 2023 Fonticons, Inc.-->
<path d="M254 52.8C249.3 40.3 237.3 32 224 32s-25.3 8.3-30 20.8L57.8 416H32c-17.7 0-32 14.3-32 32s14.3 32 32 32h96c17.7 0 32-14.3 32-32s-14.3-32-32-32h-1.8l18-48H303.8l18 48H320c-17.7 0-32 14.3-32 32s14.3 32 32 32h96c17.7 0 32-14.3 32-32s-14.3-32-32-32H390.2L254 52.8zM279.8 304H168.2L224 155.1 279.8 304z"></path>
</symbol>
<symbol id="file" viewBox="-130 0 650 530">
<!--!Font Awesome Free 6.5.1 by @fontawesome - https://fontawesome.com License - https://fontawesome.com/license/free Copyright 2023 Fonticons, Inc.-->
<path d="M320 464c8.8 0 16-7.2 16-16V160H256c-17.7 0-32-14.3-32-32V48H64c-8.8 0-16 7.2-16 16V448c0 8.8 7.2 16 16 16H320zM0 64C0 28.7 28.7 0 64 0H229.5c17 0 33.3 6.7 45.3 18.7l90.5 90.5c12 12 18.7 28.3 18.7 45.3V448c0 35.3-28.7 64-64 64H64c-35.3 0-64-28.7-64-64V64z"></path>
</symbol>
<symbol id="caret" viewBox="0 0 320 512">
<!--!Font Awesome Free 6.5.1 by @fontawesome - https://fontawesome.com License - https://fontawesome.com/license/free Copyright 2023 Fonticons, Inc.-->
<path d="M137.4 374.6c12.5 12.5 32.8 12.5 45.3 0l128-128c9.2-9.2 11.9-22.9 6.9-34.9s-16.6-19.8-29.6-19.8L32 192c-12.9 0-24.6 7.8-29.6 19.8s-2.2 25.7 6.9 34.9l128 128z"></path>
</symbol>
<symbol id="mastodon" viewBox="0 0 448 512">
<!--!Font Awesome Free 6.5.1 by @fontawesome - https://fontawesome.com License - https://fontawesome.com/license/free Copyright 2023 Fonticons, Inc.-->
<path d="M433 179.1c0-97.2-63.7-125.7-63.7-125.7-62.5-28.7-228.6-28.4-290.5 0 0 0-63.7 28.5-63.7 125.7 0 115.7-6.6 259.4 105.6 289.1 40.5 10.7 75.3 13 103.3 11.4 50.8-2.8 79.3-18.1 79.3-18.1l-1.7-36.9s-36.3 11.4-77.1 10.1c-40.4-1.4-83-4.4-89.6-54a102.5 102.5 0 0 1 -.9-13.9c85.6 20.9 158.7 9.1 178.8 6.7 56.1-6.7 105-41.3 111.2-72.9 9.8-49.8 9-121.5 9-121.5zm-75.1 125.2h-46.6v-114.2c0-49.7-64-51.6-64 6.9v62.5h-46.3V197c0-58.5-64-56.6-64-6.9v114.2H90.2c0-122.1-5.2-147.9 18.4-175 25.9-28.9 79.8-30.8 103.8 6.1l11.6 19.5 11.6-19.5c24.1-37.1 78.1-34.8 103.8-6.1 23.7 27.3 18.4 53 18.4 175z"></path>
</symbol>
<symbol id="bluesky" viewBox="0 0 512 512">
<!--!Font Awesome Free 6.7.2 by @fontawesome - https://fontawesome.com License - https://fontawesome.com/license/free Copyright 2025 Fonticons, Inc.-->
<path d="M111.8 62.2C170.2 105.9 233 194.7 256 242.4c23-47.6 85.8-136.4 144.2-180.2c42.1-31.6 110.3-56 110.3 21.8c0 15.5-8.9 130.5-14.1 149.2C478.2 298 412 314.6 353.1 304.5c102.9 17.5 129.1 75.5 72.5 133.5c-107.4 110.2-154.3-27.6-166.3-62.9l0 0c-1.7-4.9-2.6-7.8-3.3-7.8s-1.6 3-3.3 7.8l0 0c-12 35.3-59 173.1-166.3 62.9c-56.5-58-30.4-116 72.5-133.5C100 314.6 33.8 298 15.7 233.1C10.4 214.4 1.5 99.4 1.5 83.9c0-77.8 68.2-53.4 110.3-21.8z"/>
</symbol>
<symbol id="custom" viewBox="0 0 512 512">
<!--!Font Awesome Free 6.5.1 by @fontawesome - https://fontawesome.com License - https://fontawesome.com/license/free Copyright 2023 Fonticons, Inc.-->
<path d="M418.4 157.9c35.3-8.3 61.6-40 61.6-77.9c0-44.2-35.8-80-80-80c-43.4 0-78.7 34.5-80 77.5L136.2 151.1C121.7 136.8 101.9 128 80 128c-44.2 0-80 35.8-80 80s35.8 80 80 80c12.2 0 23.8-2.7 34.1-7.6L259.7 407.8c-2.4 7.6-3.7 15.8-3.7 24.2c0 44.2 35.8 80 80 80s80-35.8 80-80c0-27.7-14-52.1-35.4-66.4l37.8-207.7zM156.3 232.2c2.2-6.9 3.5-14.2 3.7-21.7l183.8-73.5c3.6 3.5 7.4 6.7 11.6 9.5L317.6 354.1c-5.5 1.3-10.8 3.1-15.8 5.5L156.3 232.2z"></path>
</symbol>
<symbol id="privacypolicy" viewBox="0 0 512 512">
<!--!Font Awesome Free 6.5.1 by @fontawesome - https://fontawesome.com License - https://fontawesome.com/license/free Copyright 2023 Fonticons, Inc.-->
<path d="M256 0c4.6 0 9.2 1 13.4 2.9L457.7 82.8c22 9.3 38.4 31 38.3 57.2c-.5 99.2-41.3 280.7-213.6 363.2c-16.7 8-36.1 8-52.8 0C57.3 420.7 16.5 239.2 16 140c-.1-26.2 16.3-47.9 38.3-57.2L242.7 2.9C246.8 1 251.4 0 256 0zm0 66.8V444.8C394 378 431.1 230.1 432 141.4L256 66.8l0 0z"></path>
</symbol>
</svg>
<!-- Scripts -->
<script src="scripts/util.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/zip.min.js" async></script>
<script src="scripts/NoSleep.min.js" async></script>
<script src="scripts/localization.js" defer></script>
<script src="scripts/persistent-storage.js" defer></script>
<script src="scripts/ui-main.js" defer></script>
<script src="scripts/main.js" defer></script>
<!-- Sounds -->
<audio id="blop" autobuffer="true">
<source src="sounds/blop.mp3" type="audio/mpeg">
@ -340,3 +842,4 @@
</x-noscript>
</noscript>
</body>
</html>

184
public/lang/ar.json Normal file
View file

@ -0,0 +1,184 @@
{
"footer": {
"webrtc": "إذا لم يكن WebRTC متاحًا.",
"public-room-devices_title": "يمكن اكتشافك بواسطة الأجهزة الموجودة في هذه الغرفة العامة المستقلة عن الشبكة.",
"display-name_data-placeholder": "تحميل …",
"display-name_title": "قم بتحرير اسم جهازك بشكل دائم",
"traffic": "حركة المرور هي",
"paired-devices_title": "يمكن اكتشافك بواسطة الأجهزة المقترنة في جميع الأوقات بشكل مستقل عن الشبكة.",
"public-room-devices": "في الغرفة {{roomId}}",
"paired-devices": "بواسطة الأجهزة المقترنة",
"on-this-network": "على هذه الشبكة",
"routed": "توجيهّا من خلال الخادم",
"discovery": "يمكنك اكتشافك:",
"on-this-network_title": "يمكن للجميع اكتشافك على هذه الشبكة.",
"known-as": "‌أنت معروف بأنك:"
},
"notifications": {
"request-title": "يرغب {{name}} في نقل {{count}} {{descriptor}}",
"unfinished-transfers-warning": "هناك تحويلات غير مكتملة. هل أنت متأكد أنك تريد إغلاق PairDrop؟",
"message-received": "تم استلام الرسالة بواسطة {{name}} - انقر للفتح",
"rate-limit-join-key": "تم الوصول إلى الحد الأقصى. انتظر 10 ثوان وحاول مرة أخرى.",
"connecting": "يتصل …",
"pairing-key-invalidated": "المفتاح {{key}} خاطئ",
"pairing-key-invalid": "مُفتاح خاطئ",
"connected": "متصل",
"pairing-not-persistent": "الأجهزة المقترنة ليست ثابتة",
"text-content-incorrect": "محتوى النص غير صحيح",
"message-transfer-completed": "اكتمل نقل الرسالة",
"file-transfer-completed": "اكتمل نقل الملف",
"file-content-incorrect": "محتوى الملف غير صحيح",
"files-incorrect": "الملفات غير صحيحة",
"selected-peer-left": "مُحَدد الاجهزة المقترنة",
"link-received": "تم استلام الرابط بواسطة {{name}} - انقر للفتح",
"online": "لقد عدت متصلاً بالإنترنت",
"public-room-left": "الخروج من الغرفة العامة {{publicRoomId}}",
"copied-text": "نُسِخَ النص إلى الحافظة",
"display-name-random-again": "يتم إنشاء اسم العرض بشكل عشوائي مرة أخرى",
"display-name-changed-permanently": "يتم تغيير اسم العرض بشكل دائم",
"copied-to-clipboard-error": "النسخ غير ممكن. انسخ يدويًا.",
"pairing-success": "الأجهزة المقترنة",
"clipboard-content-incorrect": "محتوى الحافظة غير صحيح",
"display-name-changed-temporarily": "تم تغيير اسم العرض لهذه الجلسة فقط",
"copied-to-clipboard": "تم النسخ إلى الحافظة",
"offline": "انت غير متصل",
"pairing-tabs-error": "من المستحيل إقران علامتي تبويب متصفح الويب",
"public-room-id-invalid": "معرف الغرفة غير صالح",
"click-to-download": "إضغط للتحميل",
"pairing-cleared": "جميع الأجهزة غير مقترنة",
"notifications-enabled": "تم تمكين الإشعارات",
"online-requirement-pairing": "يجب أن تكون متصلاً بالإنترنت لإقران الأجهزة",
"ios-memory-limit": "لا يمكن إرسال ملفات إلى iOS إلا بحجم يصل إلى 200 ميجابايت مرة واحدة",
"online-requirement-public-room": "يجب أن تكون متصلاً بالإنترنت لإنشاء غرفة عامة",
"copied-text-error": "فشلت الكتابة من الحافظة. انسخ يدويًا!",
"download-successful": "تم تحميل {{descriptor}}",
"click-to-show": "اضغط للعرض",
"pair-url-copied-to-clipboard": "تم نسخ رابط اقتران هذا الجهاز إلى الحافظة",
"room-url-copied-to-clipboard": "تم نسخ رابط هذه الغرفة العامة إلى الحافظة",
"notifications-permissions-error": "لم يتم منح إذن الإشعارات حيث أن المستخدم أغلق نافذة السماح عدة مرات. يمكن إعادة تعيين هذا في معلومات الصفحة التي يمكن فتحها بالضغط على رمز القفل بجانب شريط عنوان صفحة الإنترنت."
},
"header": {
"cancel-share-mode": "تمّ",
"theme-auto_title": "تغيير المظهر تلقائيا من النظام",
"install_title": "تثبيت PairDrop",
"theme-dark_title": "إستخدم دائما المظهر المظلم",
"pair-device_title": "قم بإقران أجهزتك بشكل دائم",
"join-public-room_title": "انضم إلى الغرفة العامة مؤقتًا",
"notification_title": "تفعيل الإشعارات",
"edit-paired-devices_title": "عدل الأجهزة المقترنة",
"language-selector_title": "إختر اللغة",
"about_title": "حول PairDrop",
"about_aria-label": "افتح حول PairDrop",
"theme-light_title": "إستخدم دائماً المظهر الفاتح",
"edit-share-mode": "عدل",
"expand_title": "Expand header button row"
},
"instructions": {
"x-instructions_mobile": "انقر لإرسال الملفات أو انقر لفترة طويلة لإرسال رسالة",
"x-instructions-share-mode_desktop": "انقر للإرسال {{descriptor}}",
"activate-share-mode-and-other-files-plural": "و{{count}} ملفات أخرى",
"x-instructions-share-mode_mobile": "انقر للإرسال {{descriptor}}",
"activate-share-mode-base": "افتح PairDrop على الأجهزة الأخرى للإرسال",
"no-peers-subtitle": "قم بإقران الأجهزة أو ادخل إلى غرفة عامة لتتمكن من أن تكتشف على الشبكات الأخرى",
"activate-share-mode-shared-text": "النص المشترك",
"x-instructions_desktop": "انقر لإرسال الملفات أو انقر بزر الفأرة الأيمن لإرسال رسالة",
"no-peers-title": "افتح PairDrop على الأجهزة الأخرى لإرسال الملفات",
"x-instructions_data-drop-bg": "حرر لتحديد المستلم",
"no-peers_data-drop-bg": "حرر لتحديد المستلم",
"x-instructions_data-drop-peer": "قم بالتحرير لإرسالها إلى القرين",
"activate-share-mode-and-other-file": "وملف واحد آخر",
"activate-share-mode-shared-files-plural": "{{count}} ملفات مشاركة",
"activate-share-mode-shared-file": "الملف المُشارك",
"webrtc-requirement": "لتستعمل بيردروب هنا، يجب أن يكون WebRTC مفعلًا!"
},
"peer-ui": {
"processing": "مُعالجة …",
"click-to-send-share-mode": "انقر للإرسال {{descriptor}}",
"click-to-send": "انقر لإرسال الملفات أو انقر بزر الماوس الأيمن لإرسال رسالة",
"waiting": "يُرجى الإنتظار…",
"connection-hash": "للتحقق من أمان التشفير الشامل، قم بمقارنة رقم الأمان هذا على كلا الجهازين",
"preparing": "يقترن…",
"transferring": "جارٍ النقل…"
},
"dialogs": {
"base64-paste-to-send": "الصق هنا للمشاركة {{type}}",
"auto-accept-instructions-2": "لقبول جميع الملفات المرسلة من هذا الجهاز تلقائيًا.",
"receive-text-title": "تلقيت رسالة",
"edit-paired-devices-title": "تحرير الأجهزة المقترنة",
"cancel": "إلغاء",
"auto-accept-instructions-1": "تفعيل",
"pair-devices-title": "إقران الأجهزة بشكل دائم",
"download": "تحميل",
"title-file": "ملف",
"base64-processing": "مُعالجة…",
"decline": "رفض",
"receive-title": "تم استلام {{descriptor}}",
"leave": "مُغادرة",
"join": "انضمام",
"title-image-plural": "صور",
"send": "ارسال",
"base64-tap-to-paste": "انقر هنا للمشاركة {{type}}",
"base64-text": "نص",
"copy": "نسخ",
"file-other-description-image": "وصورة واحدة أخرى",
"temporary-public-room-title": "غرفة عامة مؤقتة",
"base64-files": "ملفات",
"has-sent": "ارسلت:",
"file-other-description-file": "وملف واحد آخر",
"close": "إغلاق",
"system-language": "لغة النظام",
"unpair": "إلغاء الإقتران",
"title-image": "صورة",
"file-other-description-file-plural": "و{{count}} ملفات أخرى",
"would-like-to-share": "ترغب في المشاركة",
"send-message-to": "أرسال رسالة إلى:",
"language-selector-title": "إختر اللُغة",
"pair": "إقتران",
"hr-or": "او",
"scan-qr-code": "أو مسح رمز الاستجابة السريعة.",
"input-key-on-this-device": "أدخل هذا المفتاح على جهاز آخر",
"download-again": "تحميل مرة أخرى",
"accept": "قبول",
"paired-devices-wrapper_data-empty": "لا توجد أجهزة مقترنة.",
"enter-key-from-another-device": "أدخل المفتاح من جهاز آخر هنا.",
"share": "مُشاركة",
"auto-accept": "قبول تلقائي",
"title-file-plural": "ملفات",
"send-message-title": "إرسال رسالة",
"input-room-id-on-another-device": "‌أدخل معرف الغرفة هذا على جهاز آخر",
"file-other-description-image-plural": "و{{count}} صور أخرى",
"enter-room-id-from-another-device": "أدخل معرف الغرفة من جهاز آخر للانضمام إلى الغرفة.",
"share-text-title": "شارك رسالة نصية",
"paired-device-removed": "تمت إزالة الجهاز المقترن.",
"message_title": "أدخل رسالة لإرسالها",
"message_placeholder": "النص",
"base64-title-files": "شارك ملفات",
"base64-title-text": "شارك نصًا",
"public-room-qr-code_title": "اضغط لنسخ رابط الغرفة العامة",
"approve": "قبول",
"share-text-subtitle": "عدل الرسالة قبل الإرسال:",
"share-text-checkbox": "أظهر هذه الرسالة دائمًا عند مشاركة النصوص",
"close-toast_title": "أغلق الإشعار",
"pair-devices-qr-code_title": "اضغط لنسخ رابط اقتران هذا الجهاز"
},
"about": {
"claim": "أسهل طريقة لنقل الملفات عبر الأجهزة",
"tweet_title": "غرّد حول PairDrop",
"close-about_aria-label": "إغلاق حول PairDrop",
"buy-me-a-coffee_title": "اشتري لي القهوة!",
"github_title": "PairDrop على جيت هاب",
"faq_title": "أسئلة متكررة",
"mastodon_title": "اكتب عن بيردروب على ماستادون",
"bluesky_title": "تابعنا على بلوسكاي",
"custom_title": "تابعنا",
"privacypolicy_title": "افتح سياسة الخصوصية الخاصة بنا"
},
"document-titles": {
"file-transfer-requested": "طلب نقل الملف",
"message-received-plural": "{{count}} الرسائل المستلمة",
"message-received": "تم إرسال الرسالة",
"file-received": "تم استلام الملف",
"file-received-plural": "{{count}} الملفات المستلمة",
"image-transfer-requested": "طُلب نقل الصور المطلوبة"
}
}

184
public/lang/be.json Normal file
View file

@ -0,0 +1,184 @@
{
"header": {
"about_aria-label": "Адкрыйце Аб PairDrop",
"about_title": "Аб PairDrop",
"theme-auto_title": "Аўтаматычная адаптацыя тэмы да сістэмы",
"theme-light_title": "Заўсёды выкарыстоўваць светлую тэму",
"theme-dark_title": "Заўсёды выкарыстоўваць цёмную тэму",
"notification_title": "Уключыць апавяшчэнні",
"edit-paired-devices_title": "Рэдагаваць злучаныя прылады",
"join-public-room_title": "Часова далучыцца да публічнага пакоя",
"cancel-share-mode": "Адмяніць",
"language-selector_title": "Задаць мову",
"install_title": "Усталяваць PairDrop",
"pair-device_title": "Злучыце свае прылады назаўжды",
"edit-share-mode": "Рэдагаваць",
"expand_title": "Разгарнуць радок кнопак"
},
"instructions": {
"no-peers_data-drop-bg": "Адпусціце, каб выбраць атрымальніка",
"no-peers-title": "Адкрыйце PairDrop на іншых прыладах, каб адправіць файлы",
"x-instructions_data-drop-peer": "Адпусціце, каб адправіць вузлу",
"x-instructions_data-drop-bg": "Адпусціце, каб выбраць атрымальніка",
"x-instructions-share-mode_mobile": "Дакраніцеся, каб адправіць {{descriptor}}",
"activate-share-mode-and-other-file": "і 1 іньшы файл",
"activate-share-mode-and-other-files-plural": "і {{count}} іньшых файла(ў)",
"activate-share-mode-shared-text": "агульны тэкст",
"activate-share-mode-shared-files-plural": "{{count}} агульных файлаў",
"webrtc-requirement": "Каб выкарыстоўваць гэты асобнік Pair Drop, WebRTC павінен быць уключаны!",
"no-peers-subtitle": "Злучыце прылады або ўвайдзіце ў публічны пакой, каб вас маглі выявіць з іншых сетак",
"x-instructions_mobile": "Дакраніцеся, каб адправіць файлы, або доўга трымайце, каб адправіць паведамленне",
"x-instructions-share-mode_desktop": "Націсніце, каб адправіць {{descriptor}}",
"x-instructions_desktop": "Націсніце, каб адправіць файлы, або націсніце правай кнопкай мышы, каб адправіць паведамленне",
"activate-share-mode-base": "Адкрыйце PairDrop на іншых прыладах, каб адправіць",
"activate-share-mode-shared-file": "агульны файл"
},
"footer": {
"known-as": "Вы вядомыя як:",
"display-name_data-placeholder": "Загрузка…",
"discovery": "Вас могуць выявіць:",
"on-this-network_title": "Вас можа знайсці кожны ў гэтай сетцы.",
"paired-devices": "з дапамогай злучаных прылад",
"public-room-devices_title": "Вас могуць выявіць прылады ў гэтай публічнай пакоі незалежна ад сеткі.",
"traffic": "Рух",
"display-name_title": "Зменіце назву сваёй прылады назаўжды",
"on-this-network": "у гэтай сетцы",
"paired-devices_title": "Злучаныя прылады заўсёды могуць вас выявіць незалежна ад сеткі.",
"public-room-devices": "у пакоі {{roomId}}",
"webrtc": ", калі WebRTC недаступны.",
"routed": "накіроўваецца праз сервер"
},
"dialogs": {
"hr-or": "АБО",
"cancel": "Адмяніць",
"pair": "Злучыць",
"unpair": "Разлучыць",
"paired-devices-wrapper_data-empty": "Няма злучаных прылад.",
"auto-accept": "аўтаматычнае прыняцце",
"close": "Закрыць",
"join": "Далучыцца",
"leave": "Пакінуць",
"decline": "Адмовіць",
"share": "Падзяліцца",
"copy": "Капіяваць",
"title-image": "Малюнак",
"system-language": "Мова сістэмы",
"public-room-qr-code_title": "Націсніце, каб скапіяваць спасылку на публічны пакой",
"title-file": "Файл",
"title-file-plural": "Файлы",
"message_placeholder": "Тэкст",
"language-selector-title": "Задаць мову",
"send-message-title": "Адправіць паведамленне",
"scan-qr-code": "або сканаваць QR-код.",
"enter-room-id-from-another-device": "Увядзіце ID пакоя з іншай прылады, каб далучыцца да пакоя.",
"edit-paired-devices-title": "Рэдагаваць злучаныя прылады",
"auto-accept-instructions-1": "Актываваць",
"auto-accept-instructions-2": ", каб аўтаматычна прымаць усе файлы, адпраўленыя з гэтай прылады.",
"accept": "Прыняць",
"download": "Спампаваць",
"download-again": "Спампаваць яшчэ раз",
"pair-devices-qr-code_title": "Націсніце, каб скапіраваць спасылку для спалучэння гэтай прылады",
"approve": "сцвердзіць",
"pair-devices-title": "Пастаяннае злучэнне прылад",
"enter-key-from-another-device": "Увядзіце тут ключ з іншай прылады.",
"temporary-public-room-title": "Часовы публічны пакой",
"input-room-id-on-another-device": "Увядзіце гэты ID пакоя на іншай прыладзе",
"paired-device-removed": "Злучаная прылада была выдалена.",
"would-like-to-share": "хацеў бы падзяліцца",
"send-message-to": "Каму:",
"message_title": "Устаўце паведамленне для адпраўкі",
"has-sent": "адправіў:",
"base64-processing": "Апрацоўка…",
"send": "Адправіць",
"base64-title-text": "Падзяліцца тэкстам",
"base64-title-files": "Падзяліцца файламі",
"base64-tap-to-paste": "Дакраніцеся тут, каб падзяліцца {{type}}",
"file-other-description-image": "і 1 іньшы малюнак",
"file-other-description-image-plural": "і {{count}} іншых малюнкаў",
"file-other-description-file-plural": "і {{count}} іншых файлаў",
"title-image-plural": "Малюнкі",
"share-text-subtitle": "Рэдагаваць паведамленне перад адпраўкай:",
"share-text-title": "Падзяліцца тэкставым паведамленнем",
"close-toast_title": "Закрыць апавяшчэнне",
"receive-text-title": "Паведамленне атрымана",
"input-key-on-this-device": "Увядзіце гэты ключ на іншай прыладзе",
"base64-files": "файлы",
"base64-text": "тэкст",
"base64-paste-to-send": "Устаўце сюды буфер абмену, каб падзяліцца {{type}}",
"file-other-description-file": "і 1 іньшы файл",
"receive-title": "{{descriptor}} атрымана",
"share-text-checkbox": "Заўсёды паказваць гэта дыялогавае акно пры абагульванні тэксту"
},
"about": {
"buy-me-a-coffee_title": "Купіць мне кавы!",
"mastodon_title": "Напішыце пра PairDrop на Mastodon",
"tweet_title": "Твіт пра PairDrop",
"github_title": "PairDrop на GitHub",
"custom_title": "Сачыце за намі",
"bluesky_title": "Сачыце за намі на BlueSky",
"faq_title": "Часта задаюць пытанні",
"close-about_aria-label": "Закрыць Аб PairDrop",
"claim": "Самы просты спосаб перадачы файлаў паміж прыладамі",
"privacypolicy_title": "Адкрыйце нашу палітыку прыватнасці"
},
"notifications": {
"link-received": "Спасылка атрымана {{name}} - Націсніце, каб адкрыць",
"message-received": "Паведамленне атрымана {{name}} - Націсніце, каб скапіяваць",
"click-to-download": "Націсніце, каб спампаваць",
"click-to-show": "Націсніце, каб паказаць",
"copied-text-error": "Памылка запісу ў буфер абмену. Скапіруйце ўручную!",
"online": "Вы зноў у сетцы",
"online-requirement-public-room": "Вы павінны быць падлучаныя да сеткі, каб стварыць агульны пакой",
"connecting": "Падключэнне…",
"public-room-id-invalid": "Несапраўдны ID пакоя",
"notifications-permissions-error": "Дазвол на апавяшчэнні быў заблакіраваны, бо карыстальнік некалькі разоў адхіляў запыт на дазвол. Гэта можна скінуць у меню \"Аб старонцы\", доступ да якой можна атрымаць, націснуўшы на значок замка побач з радком URL.",
"request-title": "{{name}} хоча перадаць {{count}} {{descriptor}}",
"copied-text": "Тэкст скапіраваны ў буфер абмену",
"offline": "Вы па-за сеткай",
"connected": "Падключана",
"online-requirement-pairing": "Вы павінны быць падлучаныя да сеткі для спалучэння прылад",
"pairing-key-invalidated": "Ключ {{key}} несапраўдны",
"display-name-random-again": "Адлюстраванае імя зноў згенеравалася выпадковым чынам",
"download-successful": "{{descriptor}} спампавана",
"pairing-tabs-error": "Злучэнне дзвюх укладак вэб-браўзера немагчыма",
"display-name-changed-permanently": "Адлюстроўванае імя было зменена назаўжды",
"pairing-cleared": "Усе прылады раз'яднаны",
"room-url-copied-to-clipboard": "Спасылка на публічны пакой скапіравана ў буфер абмену",
"public-room-left": "Пакінуць публічны пакой {{publicRoomId}}",
"text-content-incorrect": "Змест тэксту няправільны",
"clipboard-content-incorrect": "Змест буфера абмену няправільны",
"notifications-enabled": "Апавяшчэнні ўключаны",
"files-incorrect": "Няправільныя файлы",
"file-transfer-completed": "Перадача файла завершана",
"selected-peer-left": "Выбраны вузел выйшаў",
"copied-to-clipboard": "Скапіравана ў буфер абмену",
"pair-url-copied-to-clipboard": "Спасылка для злучэння гэтай прылады скапіравана ў буфер абмену",
"pairing-success": "Злучаныя прылады",
"copied-to-clipboard-error": "Капіраванне немагчымае. Скапіруйце ўручную.",
"file-content-incorrect": "Змест файла няправільны",
"pairing-not-persistent": "Злучаныя прылады не з'яўляюцца пастаяннымі",
"pairing-key-invalid": "Несапраўдны ключ",
"display-name-changed-temporarily": "Адлюстраванае імя зменена толькі для гэтага сеансу",
"ios-memory-limit": "Адначасовая адпраўка файлаў на iOS магчымая толькі да 200 МБ",
"message-transfer-completed": "Перадача паведамлення завершана",
"unfinished-transfers-warning": "Ёсць незавершаныя перадачы. Вы ўпэўнены, што хочаце закрыць PairDrop?",
"rate-limit-join-key": "Ліміт хуткасці дасягнуты. Пачакайце 10 секунд і паўтарыце спробу."
},
"peer-ui": {
"preparing": "Падрыхтоўка…",
"waiting": "Чаканне…",
"transferring": "Перадача…",
"processing": "Апрацоўка…",
"click-to-send-share-mode": "Націсніце, каб адправіць {{descriptor}}",
"connection-hash": "Каб праверыць бяспеку скразнога шыфравання, параўнайце гэты нумар бяспекі на абедзвюх прыладах",
"click-to-send": "Націсніце, каб адправіць файлы, або націсніце правай кнопкай мышы, каб адправіць паведамленне"
},
"document-titles": {
"file-received": "Файл атрыманы",
"image-transfer-requested": "Запытана перадача малюнкаў",
"message-received": "Паведамленне атрымана",
"message-received-plural": "Атрымана {{count}} паведамленняў",
"file-received-plural": "Атрымана {{count}} файлаў",
"file-transfer-requested": "Запытана перадача файла"
}
}

Some files were not shown because too many files have changed in this diff Show more