summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--package-lock.json9
-rw-r--r--package.json3
-rwxr-xr-xtools/run2
-rw-r--r--ui/routes/(app)/+layout.svelte33
4 files changed, 44 insertions, 3 deletions
diff --git a/package-lock.json b/package-lock.json
index 335880f..a7aff66 100644
--- a/package-lock.json
+++ b/package-lock.json
@@ -10,7 +10,8 @@
"dependencies": {
"axios": "^1.7.7",
"dompurify": "^3.1.7",
- "marked": "^14.1.3"
+ "marked": "^14.1.3",
+ "tinygesture": "^3.0.0"
},
"devDependencies": {
"@skeletonlabs/skeleton": "^2.10.3",
@@ -4070,6 +4071,12 @@
"dev": true,
"license": "MIT"
},
+ "node_modules/tinygesture": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/tinygesture/-/tinygesture-3.0.0.tgz",
+ "integrity": "sha512-UawUggtPCHy+N65ULpR/i6VLH8AzB7jWVvTNoXRFTJNh+ub6lP/SJCxzV/Ua7sJbCt9U9I79wKkKk3wbjcLdbQ==",
+ "license": "Apache-2.0"
+ },
"node_modules/tinypool": {
"version": "1.0.1",
"resolved": "https://registry.npmjs.org/tinypool/-/tinypool-1.0.1.tgz",
diff --git a/package.json b/package.json
index 18a80f4..64b8453 100644
--- a/package.json
+++ b/package.json
@@ -42,6 +42,7 @@
"dependencies": {
"axios": "^1.7.7",
"dompurify": "^3.1.7",
- "marked": "^14.1.3"
+ "marked": "^14.1.3",
+ "tinygesture": "^3.0.0"
}
}
diff --git a/tools/run b/tools/run
index bbe0dbd..8c450cf 100755
--- a/tools/run
+++ b/tools/run
@@ -5,7 +5,7 @@
if [ -z ${PILCROW_DEV+x} ]; then
cargo run -- "$@"
else
- npm run dev & PIDS[0]=$!
+ npm run dev -- --host 192.168.68.57 & PIDS[0]=$!
cargo run -- "$@" & PIDS[1]=$!
trap "kill ${PIDS[*]}" SIGINT
diff --git a/ui/routes/(app)/+layout.svelte b/ui/routes/(app)/+layout.svelte
index 86bc330..406d85a 100644
--- a/ui/routes/(app)/+layout.svelte
+++ b/ui/routes/(app)/+layout.svelte
@@ -1,7 +1,9 @@
<script>
import { page } from '$app/stores';
import { goto } from '$app/navigation';
+ import { browser } from '$app/environment';
import { onMount, onDestroy, getContext } from 'svelte';
+ import TinyGesture from 'tinygesture';
import { boot, subscribeToEvents } from '$lib/apiServer';
import { currentUser, logins, channelsList, messages } from '$lib/store';
@@ -10,6 +12,7 @@
import CreateChannelForm from '$lib/components/CreateChannelForm.svelte';
let events = null;
+ let gesture = null;
let pageContext = getContext('page');
let { children } = $props();
@@ -26,6 +29,20 @@
messages.update((value) => value.setMessages(boot.messages));
}
+ function setUpGestures() {
+ if (!browser) {
+ // Meaningless if we're not in a browser, so...
+ return;
+ }
+ gesture = new TinyGesture(window);
+ gesture.on('swiperight', (event) => {
+ pageContext.showMenu = true;
+ });
+ gesture.on('swipeleft', (event) => {
+ pageContext.showMenu = false;
+ });
+ }
+
onMount(async () => {
let response = await boot();
switch (response.status) {
@@ -45,6 +62,8 @@
// TODO: display error.
break;
}
+ setUpGestures();
+
loading = false;
});
@@ -52,6 +71,9 @@
if (events !== null) {
events.close();
}
+ if (gesture !== null) {
+ gesture.destroy();
+ }
});
</script>
@@ -78,12 +100,23 @@
{/if}
<style>
+ /* Just some global CSS variables, don't mind them.
+ */
:root {
--app-bar-height: 68px;
--input-row-height: 2rem;
--interface-padding: 16px;
}
+ /* This should help minimize swipe-to-go-back behaviour, enabling our
+ * swipe-to-reveal-channel-menu behaviour. It won't work in all cases; in iOS
+ * Safari, when swiping from the screen edge, the OS gets th event and
+ * handles it before the browser does.
+ */
+ html, body {
+ overscroll-behavior-x: none;
+ }
+
#interface {
margin: unset;
display: grid;