diff --git a/android/app/src/main/assets/public/index.html b/android/app/src/main/assets/public/index.html
index 9c74b543..20a24daa 100644
--- a/android/app/src/main/assets/public/index.html
+++ b/android/app/src/main/assets/public/index.html
@@ -55,51 +55,21 @@
- title.home
+
-
-
-
+
+
-
+
+
@@ -115,7 +85,7 @@
async function start() {
updateLoadingStatus("loading.loading");
try {
- switchRoomContent("title.splash", splashScreen, false, "", true);
+ gotoHome();
if (host != null)
{
await updateProtocolAndUrl(host);
diff --git a/android/app/src/main/assets/public/main.js b/android/app/src/main/assets/public/main.js
index a2384f8f..9bcb088d 100644
--- a/android/app/src/main/assets/public/main.js
+++ b/android/app/src/main/assets/public/main.js
@@ -29,9 +29,6 @@ try {
var loadingStatus = document.getElementById("loadingstatus");
- var collapseDmsBtn = document.getElementById("collapse-dms");
- var collapseGroupsBtn = document.getElementById("collapse-groups");
-
var addDmBtn = document.getElementById("add-dm-btn");
var addGroupBtn = document.getElementById("add-group-btn");
@@ -45,13 +42,14 @@ try {
var roomDetailsBar = document.getElementById("roomdetailsbar");
var roomContent = document.getElementsByTagName("roomcontent")[0];
- var roomsBar = document.getElementById("roomsbar");
+ var roomsBar = document.getElementsByTagName("roomcontent2")[0];
var sideBar = document.getElementsByTagName("sidebar")[0];
- var roomContentMain = document.getElementsByTagName("roomcontent2")[0];
+ var roomContentMain = document.getElementsByTagName("roomcontent2")[1];
var roomContentBar = roomContent.children[0];
+ var roomsTopBar = document.getElementsByTagName("roomtopbar")[0];
var roomTopBar = document.getElementsByTagName("roomtopbar")[1];
var sidebarProfile = document.getElementById("sidebar-profile");
@@ -685,11 +683,60 @@ function showFixedContextMenu(rect, html) {
fixedContextMenu.classList.add("show");
}
+async function switchRoomsBar(title, content) {
+ let roomsTopBarTransition = roomsTopBar.children.item(0);
+
+ roomsBar.style.transform = "scale(0.85)";
+ roomsBar.style.opacity = "0";
+
+ roomsTopBarTransition.style.transform = "scale(0.85)";
+ roomsTopBarTransition.style.opacity = "0";
+
+
+ await delay(200);
+
+ roomsTopBarTransition.innerHTML = processBlah(title);
+
+
+ let parser = new DOMParser();
+ let doc = parser.parseFromString(content, "text/html");
+
+ let blahTags = doc.getElementsByTagName("blah");
+ for (let i = 0; i < blahTags.length; i++) {
+ blahTags[i].innerHTML = processBlah(blahTags[i].innerHTML);
+ }
+ blahTags = doc.getElementsByClassName("blah");
+ for (let i = 0; i < blahTags.length; i++) {
+ blahTags[i].innerHTML = processBlah(blahTags[i].innerHTML);
+ }
+
+ let placeholders = doc.querySelectorAll("[placeholder]");
+ for (let i = 0; i < placeholders.length; i++) {
+ if (placeholders[i].placeholder.startsWith("{blah("))
+ {
+ let value = placeholders[i].placeholder.split("{blah(")[1].split(")}")[0];
+ placeholders[i].placeholder = processBlah(value);
+ }
+ }
+
+ roomsBar.innerHTML = doc.body.innerHTML;
+
+ roomsBar.style.transform = "";
+ roomsBar.style.opacity = "";
+
+ roomsTopBarTransition.style.transform = "";
+ roomsTopBarTransition.style.opacity = "";
+}
async function switchRoomContent(title, content, showRoomBar, icon = "", skipMobileSlide = false)
{
+ let roomsTopBarTransition = roomTopBar.children.item(0);
+
roomContentMain.style.transform = "scale(0.85)";
roomContentMain.style.opacity = "0";
+ roomsTopBarTransition.style.transform = "scale(0.85)";
+ roomsTopBarTransition.style.opacity = "0";
+
const rem = parseFloat(getComputedStyle(document.documentElement).fontSize);
if (window.innerWidth <= 52 * rem && !skipMobileSlide) {
if (title != "title.splash") //do not show splash on mobile
@@ -706,7 +753,7 @@ async function switchRoomContent(title, content, showRoomBar, icon = "", skipMob
let detailsBtnHtml = showRoomBar ? detailsBtn : '';
- roomTopBar.innerHTML = `${backBtnHtml}${icon}${processBlah(title)}${detailsBtnHtml}`;
+ roomsTopBarTransition.innerHTML = `${backBtnHtml}${icon}${processBlah(title)}${detailsBtnHtml}`;
roomDetailsBar.style.display = showRoomBar ? "flex" : "none";
let parser = new DOMParser();
@@ -735,25 +782,37 @@ async function switchRoomContent(title, content, showRoomBar, icon = "", skipMob
roomContentMain.style.transform = "";
roomContentMain.style.opacity = "";
+ roomsTopBarTransition.style.transform = "";
+ roomsTopBarTransition.style.opacity = "";
+
}
-collapseDmsBtn.addEventListener("click", () => {
+function clickCollapseDms()
+{
+ var collapseDmsBtn = document.getElementById("collapse-dms");
+
collapseDmsBtn.classList.toggle("collapsed");
-});
-collapseGroupsBtn.addEventListener("click", () => {
+}
+function clickCollapseGroups()
+{
+ var collapseGroupsBtn = document.getElementById("collapse-groups");
+
collapseGroupsBtn.classList.toggle("collapsed");
-});
-addDmBtn.addEventListener("click", async () => {
- switchRoomContent("title.create.dm", addDmScreen, false);
-});
-addGroupBtn.addEventListener("click", async () => {
+}
+function clickAddGroup()
+{
switchRoomContent("title.create.group", createGroupScreen, false);
-});
+}
+function clickAddDm()
+{
+ switchRoomContent("title.create.dm", addDmScreen, false);
+}
var indicatorBeforeFixedMenu;
sidebarAddButton.addEventListener("click", (e) => {
e.stopPropagation();
+ console.log("hi")
if (fixedContextMenu.classList.contains("show")) {
fixedContextMenu.classList.remove("show");
setActiveSidebarIndicator(indicatorBeforeFixedMenu);
@@ -768,7 +827,9 @@ document.addEventListener("click", (e) => {
if (fixedContextMenu.classList.contains("show")) {
if (!fixedContextMenu.contains(e.target)) {
fixedContextMenu.classList.remove("show");
- setActiveSidebarIndicator(indicatorBeforeFixedMenu);
+ if (!e.target.closest('sidebarelement')) {
+ setActiveSidebarIndicator(indicatorBeforeFixedMenu);
+ }
}
}
@@ -803,6 +864,7 @@ function gotoJoinSpace() {
function gotoHome() {
setActiveSidebarIndicator(sidebarHomeIndicator);
switchRoomContent("title.splash", splashScreen, false);
+ switchRoomsBar("title.home", homeRoomBar);
}
function setActiveSidebarIndicator(element, skipDisabling = false)
@@ -833,18 +895,70 @@ function mobileNavBack() {
function mobileNavDetails() {
mainScreen.classList.add('mobile-details');
}
+
+
let touchStartX = 0;
let touchEndX = 0;
let touchStartY = 0;
let touchEndY = 0;
+let touchMoved = false;
+
document.addEventListener('touchstart', e => {
touchStartX = e.changedTouches[0].screenX;
touchStartY = e.changedTouches[0].screenY;
-});
+ touchMoved = false;
+
+ activeTouchButton = e.target.closest('button, input');
+ if (activeTouchButton) {
+ activeTouchButton.classList.add('is-pressed');
+ }
+}, { passive: true });
+
+document.addEventListener('touchmove', e => {
+ if (!touchMoved) {
+ const rem = parseFloat(getComputedStyle(document.documentElement).fontSize);
+ let diffX = Math.abs(e.changedTouches[0].screenX - touchStartX);
+ let diffY = Math.abs(e.changedTouches[0].screenY - touchStartY);
+ if (diffX > rem || diffY > rem) {
+ touchMoved = true;
+
+ if (activeTouchButton) {
+ activeTouchButton.classList.remove('is-pressed');
+ activeTouchButton = null;
+ }
+ }
+ }
+}, { passive: true });
+
document.addEventListener('touchend', e => {
touchEndX = e.changedTouches[0].screenX;
touchEndY = e.changedTouches[0].screenY;
handleMobileSwipe();
+
+ if (activeTouchButton) {
+ activeTouchButton.classList.remove('is-pressed');
+
+ if (!touchMoved) {
+ if (e.cancelable) {
+ e.preventDefault();
+ }
+ activeTouchButton.click();
+ }
+ activeTouchButton = null;
+ }
+});
+
+document.addEventListener('touchcancel', () => {
+ if (activeTouchButton) {
+ activeTouchButton.classList.remove('is-pressed');
+ activeTouchButton = null;
+ }
+});
+
+document.addEventListener('contextmenu', e => {
+ if (e.target.closest('button')) {
+ e.preventDefault();
+ }
});
function handleMobileSwipe() {
const rem = parseFloat(getComputedStyle(document.documentElement).fontSize);
@@ -853,7 +967,7 @@ function handleMobileSwipe() {
let diffX = touchEndX - touchStartX;
let diffY = touchEndY - touchStartY;
- if (Math.abs(diffX) > Math.abs(diffY) && Math.abs(diffX) > 60) {
+ if (Math.abs(diffX) > Math.abs(diffY) && Math.abs(diffX) > 4 * rem) {
if (diffX > 0) {
mobileNavBack();
} else {
diff --git a/android/app/src/main/assets/public/screens.js b/android/app/src/main/assets/public/screens.js
index 33991c9d..4877030d 100644
--- a/android/app/src/main/assets/public/screens.js
+++ b/android/app/src/main/assets/public/screens.js
@@ -73,6 +73,45 @@ var joinSpaceScreen = `
`;
+//roombars
+var homeRoomBar = `
+
+
+
+`;
+
+
+
//context menus
var addSpaceMenu = `
diff --git a/android/app/src/main/assets/public/style.css b/android/app/src/main/assets/public/style.css
index a8c50f5e..cd45fafa 100644
--- a/android/app/src/main/assets/public/style.css
+++ b/android/app/src/main/assets/public/style.css
@@ -87,9 +87,13 @@ button, input {
transform: translateZ(0);
will-change: transform;
transform-origin: center center;
+
+ touch-action: manipulation;
+ -webkit-touch-callout: none;
}
input {
padding-left: calc(var(--button-margin) * 2);
+ -webkit-touch-callout: default;
}
@@ -143,9 +147,6 @@ indicator.active {
pointer-events: none !important;
}
-button:active, input:active {
- transform: var(--press-scale);
-}
roomcontent {
display: flex;
flex-direction: column;
@@ -348,13 +349,14 @@ herotitle {
color: var(--text-color);
}
}
-button:active, input:active {
+button:active, button.is-pressed, input:active, input.is-pressed {
background-color: rgba(255, 255, 255, 0.1);
+ transform: var(--press-scale);
}
-.submit-button:active {
+.submit-button:active, .submit-button.is-pressed {
background-color: rgba(255, 255, 255, 0.5);
}
-.add-action-button:active {
+.add-action-button:active, .add-action-button.is-pressed {
background-color: rgba(255, 255, 255, 0.1);
color: var(--text-color);
}
@@ -372,8 +374,9 @@ blah, inherit, .inherit {
all: inherit;
padding: 0;
margin: 0;
- display: inline;
+ display: flex;
opacity: 1;
+ border: none;
}
space{
margin-left: 0.4rem;
@@ -428,9 +431,9 @@ space{
color: var(--text-color);
cursor: pointer;
}
-.mobile-nav-btn:active {
+.mobile-nav-btn:active, .mobile-nav-btn.is-pressed {
background-color: rgba(255, 255, 255, 0.1);
- border-radius: 0.8rem;
+ transform: var(--press-scale);
}
.mobile-nav-btn.right {
margin-right: 0;
diff --git a/android/app/src/main/res/drawable-land-hdpi/splash.png b/android/app/src/main/res/drawable-land-hdpi/splash.png
index 920cc391..50a6435f 100644
Binary files a/android/app/src/main/res/drawable-land-hdpi/splash.png and b/android/app/src/main/res/drawable-land-hdpi/splash.png differ
diff --git a/android/app/src/main/res/drawable-land-ldpi/splash.png b/android/app/src/main/res/drawable-land-ldpi/splash.png
index 805a4b3e..54e4af9d 100644
Binary files a/android/app/src/main/res/drawable-land-ldpi/splash.png and b/android/app/src/main/res/drawable-land-ldpi/splash.png differ
diff --git a/android/app/src/main/res/drawable-land-mdpi/splash.png b/android/app/src/main/res/drawable-land-mdpi/splash.png
index dbdd8646..eca0b99c 100644
Binary files a/android/app/src/main/res/drawable-land-mdpi/splash.png and b/android/app/src/main/res/drawable-land-mdpi/splash.png differ
diff --git a/android/app/src/main/res/drawable-land-xhdpi/splash.png b/android/app/src/main/res/drawable-land-xhdpi/splash.png
index dfb9ec6a..e1072587 100644
Binary files a/android/app/src/main/res/drawable-land-xhdpi/splash.png and b/android/app/src/main/res/drawable-land-xhdpi/splash.png differ
diff --git a/android/app/src/main/res/drawable-land-xxhdpi/splash.png b/android/app/src/main/res/drawable-land-xxhdpi/splash.png
index 2dfe618a..aaf5bc95 100644
Binary files a/android/app/src/main/res/drawable-land-xxhdpi/splash.png and b/android/app/src/main/res/drawable-land-xxhdpi/splash.png differ
diff --git a/android/app/src/main/res/drawable-land-xxxhdpi/splash.png b/android/app/src/main/res/drawable-land-xxxhdpi/splash.png
index 78a9fdef..e150be33 100644
Binary files a/android/app/src/main/res/drawable-land-xxxhdpi/splash.png and b/android/app/src/main/res/drawable-land-xxxhdpi/splash.png differ
diff --git a/android/app/src/main/res/drawable-port-hdpi/splash.png b/android/app/src/main/res/drawable-port-hdpi/splash.png
index b964dcc3..68267ebb 100644
Binary files a/android/app/src/main/res/drawable-port-hdpi/splash.png and b/android/app/src/main/res/drawable-port-hdpi/splash.png differ
diff --git a/android/app/src/main/res/drawable-port-ldpi/splash.png b/android/app/src/main/res/drawable-port-ldpi/splash.png
index 4aa44fb4..bef8bdf6 100644
Binary files a/android/app/src/main/res/drawable-port-ldpi/splash.png and b/android/app/src/main/res/drawable-port-ldpi/splash.png differ
diff --git a/android/app/src/main/res/drawable-port-mdpi/splash.png b/android/app/src/main/res/drawable-port-mdpi/splash.png
index b49e524b..673b8101 100644
Binary files a/android/app/src/main/res/drawable-port-mdpi/splash.png and b/android/app/src/main/res/drawable-port-mdpi/splash.png differ
diff --git a/android/app/src/main/res/drawable-port-xhdpi/splash.png b/android/app/src/main/res/drawable-port-xhdpi/splash.png
index 0491da01..a57cfc2e 100644
Binary files a/android/app/src/main/res/drawable-port-xhdpi/splash.png and b/android/app/src/main/res/drawable-port-xhdpi/splash.png differ
diff --git a/android/app/src/main/res/drawable-port-xxhdpi/splash.png b/android/app/src/main/res/drawable-port-xxhdpi/splash.png
index ca049718..0bf73f4f 100644
Binary files a/android/app/src/main/res/drawable-port-xxhdpi/splash.png and b/android/app/src/main/res/drawable-port-xxhdpi/splash.png differ
diff --git a/android/app/src/main/res/drawable-port-xxxhdpi/splash.png b/android/app/src/main/res/drawable-port-xxxhdpi/splash.png
index 8b793ed1..c5529675 100644
Binary files a/android/app/src/main/res/drawable-port-xxxhdpi/splash.png and b/android/app/src/main/res/drawable-port-xxxhdpi/splash.png differ
diff --git a/android/app/src/main/res/drawable/splash.png b/android/app/src/main/res/drawable/splash.png
index b49e524b..673b8101 100644
Binary files a/android/app/src/main/res/drawable/splash.png and b/android/app/src/main/res/drawable/splash.png differ
diff --git a/assets/splash.svg b/assets/splash.svg
index 0686bf2a..d82b987d 100644
--- a/assets/splash.svg
+++ b/assets/splash.svg
@@ -1,4 +1,4 @@
-
- title.home
+
-
-
-
+
+
-
+
+
@@ -115,7 +85,7 @@
async function start() {
updateLoadingStatus("loading.loading");
try {
- switchRoomContent("title.splash", splashScreen, false, "", true);
+ gotoHome();
if (host != null)
{
await updateProtocolAndUrl(host);
diff --git a/webroot/main.js b/webroot/main.js
index a2384f8f..9bcb088d 100644
--- a/webroot/main.js
+++ b/webroot/main.js
@@ -29,9 +29,6 @@ try {
var loadingStatus = document.getElementById("loadingstatus");
- var collapseDmsBtn = document.getElementById("collapse-dms");
- var collapseGroupsBtn = document.getElementById("collapse-groups");
-
var addDmBtn = document.getElementById("add-dm-btn");
var addGroupBtn = document.getElementById("add-group-btn");
@@ -45,13 +42,14 @@ try {
var roomDetailsBar = document.getElementById("roomdetailsbar");
var roomContent = document.getElementsByTagName("roomcontent")[0];
- var roomsBar = document.getElementById("roomsbar");
+ var roomsBar = document.getElementsByTagName("roomcontent2")[0];
var sideBar = document.getElementsByTagName("sidebar")[0];
- var roomContentMain = document.getElementsByTagName("roomcontent2")[0];
+ var roomContentMain = document.getElementsByTagName("roomcontent2")[1];
var roomContentBar = roomContent.children[0];
+ var roomsTopBar = document.getElementsByTagName("roomtopbar")[0];
var roomTopBar = document.getElementsByTagName("roomtopbar")[1];
var sidebarProfile = document.getElementById("sidebar-profile");
@@ -685,11 +683,60 @@ function showFixedContextMenu(rect, html) {
fixedContextMenu.classList.add("show");
}
+async function switchRoomsBar(title, content) {
+ let roomsTopBarTransition = roomsTopBar.children.item(0);
+
+ roomsBar.style.transform = "scale(0.85)";
+ roomsBar.style.opacity = "0";
+
+ roomsTopBarTransition.style.transform = "scale(0.85)";
+ roomsTopBarTransition.style.opacity = "0";
+
+
+ await delay(200);
+
+ roomsTopBarTransition.innerHTML = processBlah(title);
+
+
+ let parser = new DOMParser();
+ let doc = parser.parseFromString(content, "text/html");
+
+ let blahTags = doc.getElementsByTagName("blah");
+ for (let i = 0; i < blahTags.length; i++) {
+ blahTags[i].innerHTML = processBlah(blahTags[i].innerHTML);
+ }
+ blahTags = doc.getElementsByClassName("blah");
+ for (let i = 0; i < blahTags.length; i++) {
+ blahTags[i].innerHTML = processBlah(blahTags[i].innerHTML);
+ }
+
+ let placeholders = doc.querySelectorAll("[placeholder]");
+ for (let i = 0; i < placeholders.length; i++) {
+ if (placeholders[i].placeholder.startsWith("{blah("))
+ {
+ let value = placeholders[i].placeholder.split("{blah(")[1].split(")}")[0];
+ placeholders[i].placeholder = processBlah(value);
+ }
+ }
+
+ roomsBar.innerHTML = doc.body.innerHTML;
+
+ roomsBar.style.transform = "";
+ roomsBar.style.opacity = "";
+
+ roomsTopBarTransition.style.transform = "";
+ roomsTopBarTransition.style.opacity = "";
+}
async function switchRoomContent(title, content, showRoomBar, icon = "", skipMobileSlide = false)
{
+ let roomsTopBarTransition = roomTopBar.children.item(0);
+
roomContentMain.style.transform = "scale(0.85)";
roomContentMain.style.opacity = "0";
+ roomsTopBarTransition.style.transform = "scale(0.85)";
+ roomsTopBarTransition.style.opacity = "0";
+
const rem = parseFloat(getComputedStyle(document.documentElement).fontSize);
if (window.innerWidth <= 52 * rem && !skipMobileSlide) {
if (title != "title.splash") //do not show splash on mobile
@@ -706,7 +753,7 @@ async function switchRoomContent(title, content, showRoomBar, icon = "", skipMob
let detailsBtnHtml = showRoomBar ? detailsBtn : '';
- roomTopBar.innerHTML = `${backBtnHtml}${icon}${processBlah(title)}${detailsBtnHtml}`;
+ roomsTopBarTransition.innerHTML = `${backBtnHtml}${icon}${processBlah(title)}${detailsBtnHtml}`;
roomDetailsBar.style.display = showRoomBar ? "flex" : "none";
let parser = new DOMParser();
@@ -735,25 +782,37 @@ async function switchRoomContent(title, content, showRoomBar, icon = "", skipMob
roomContentMain.style.transform = "";
roomContentMain.style.opacity = "";
+ roomsTopBarTransition.style.transform = "";
+ roomsTopBarTransition.style.opacity = "";
+
}
-collapseDmsBtn.addEventListener("click", () => {
+function clickCollapseDms()
+{
+ var collapseDmsBtn = document.getElementById("collapse-dms");
+
collapseDmsBtn.classList.toggle("collapsed");
-});
-collapseGroupsBtn.addEventListener("click", () => {
+}
+function clickCollapseGroups()
+{
+ var collapseGroupsBtn = document.getElementById("collapse-groups");
+
collapseGroupsBtn.classList.toggle("collapsed");
-});
-addDmBtn.addEventListener("click", async () => {
- switchRoomContent("title.create.dm", addDmScreen, false);
-});
-addGroupBtn.addEventListener("click", async () => {
+}
+function clickAddGroup()
+{
switchRoomContent("title.create.group", createGroupScreen, false);
-});
+}
+function clickAddDm()
+{
+ switchRoomContent("title.create.dm", addDmScreen, false);
+}
var indicatorBeforeFixedMenu;
sidebarAddButton.addEventListener("click", (e) => {
e.stopPropagation();
+ console.log("hi")
if (fixedContextMenu.classList.contains("show")) {
fixedContextMenu.classList.remove("show");
setActiveSidebarIndicator(indicatorBeforeFixedMenu);
@@ -768,7 +827,9 @@ document.addEventListener("click", (e) => {
if (fixedContextMenu.classList.contains("show")) {
if (!fixedContextMenu.contains(e.target)) {
fixedContextMenu.classList.remove("show");
- setActiveSidebarIndicator(indicatorBeforeFixedMenu);
+ if (!e.target.closest('sidebarelement')) {
+ setActiveSidebarIndicator(indicatorBeforeFixedMenu);
+ }
}
}
@@ -803,6 +864,7 @@ function gotoJoinSpace() {
function gotoHome() {
setActiveSidebarIndicator(sidebarHomeIndicator);
switchRoomContent("title.splash", splashScreen, false);
+ switchRoomsBar("title.home", homeRoomBar);
}
function setActiveSidebarIndicator(element, skipDisabling = false)
@@ -833,18 +895,70 @@ function mobileNavBack() {
function mobileNavDetails() {
mainScreen.classList.add('mobile-details');
}
+
+
let touchStartX = 0;
let touchEndX = 0;
let touchStartY = 0;
let touchEndY = 0;
+let touchMoved = false;
+
document.addEventListener('touchstart', e => {
touchStartX = e.changedTouches[0].screenX;
touchStartY = e.changedTouches[0].screenY;
-});
+ touchMoved = false;
+
+ activeTouchButton = e.target.closest('button, input');
+ if (activeTouchButton) {
+ activeTouchButton.classList.add('is-pressed');
+ }
+}, { passive: true });
+
+document.addEventListener('touchmove', e => {
+ if (!touchMoved) {
+ const rem = parseFloat(getComputedStyle(document.documentElement).fontSize);
+ let diffX = Math.abs(e.changedTouches[0].screenX - touchStartX);
+ let diffY = Math.abs(e.changedTouches[0].screenY - touchStartY);
+ if (diffX > rem || diffY > rem) {
+ touchMoved = true;
+
+ if (activeTouchButton) {
+ activeTouchButton.classList.remove('is-pressed');
+ activeTouchButton = null;
+ }
+ }
+ }
+}, { passive: true });
+
document.addEventListener('touchend', e => {
touchEndX = e.changedTouches[0].screenX;
touchEndY = e.changedTouches[0].screenY;
handleMobileSwipe();
+
+ if (activeTouchButton) {
+ activeTouchButton.classList.remove('is-pressed');
+
+ if (!touchMoved) {
+ if (e.cancelable) {
+ e.preventDefault();
+ }
+ activeTouchButton.click();
+ }
+ activeTouchButton = null;
+ }
+});
+
+document.addEventListener('touchcancel', () => {
+ if (activeTouchButton) {
+ activeTouchButton.classList.remove('is-pressed');
+ activeTouchButton = null;
+ }
+});
+
+document.addEventListener('contextmenu', e => {
+ if (e.target.closest('button')) {
+ e.preventDefault();
+ }
});
function handleMobileSwipe() {
const rem = parseFloat(getComputedStyle(document.documentElement).fontSize);
@@ -853,7 +967,7 @@ function handleMobileSwipe() {
let diffX = touchEndX - touchStartX;
let diffY = touchEndY - touchStartY;
- if (Math.abs(diffX) > Math.abs(diffY) && Math.abs(diffX) > 60) {
+ if (Math.abs(diffX) > Math.abs(diffY) && Math.abs(diffX) > 4 * rem) {
if (diffX > 0) {
mobileNavBack();
} else {
diff --git a/webroot/screens.js b/webroot/screens.js
index 33991c9d..4877030d 100644
--- a/webroot/screens.js
+++ b/webroot/screens.js
@@ -73,6 +73,45 @@ var joinSpaceScreen = `
`;
+//roombars
+var homeRoomBar = `
+
+
+
+`;
+
+
+
//context menus
var addSpaceMenu = `
diff --git a/webroot/style.css b/webroot/style.css
index a8c50f5e..cd45fafa 100644
--- a/webroot/style.css
+++ b/webroot/style.css
@@ -87,9 +87,13 @@ button, input {
transform: translateZ(0);
will-change: transform;
transform-origin: center center;
+
+ touch-action: manipulation;
+ -webkit-touch-callout: none;
}
input {
padding-left: calc(var(--button-margin) * 2);
+ -webkit-touch-callout: default;
}
@@ -143,9 +147,6 @@ indicator.active {
pointer-events: none !important;
}
-button:active, input:active {
- transform: var(--press-scale);
-}
roomcontent {
display: flex;
flex-direction: column;
@@ -348,13 +349,14 @@ herotitle {
color: var(--text-color);
}
}
-button:active, input:active {
+button:active, button.is-pressed, input:active, input.is-pressed {
background-color: rgba(255, 255, 255, 0.1);
+ transform: var(--press-scale);
}
-.submit-button:active {
+.submit-button:active, .submit-button.is-pressed {
background-color: rgba(255, 255, 255, 0.5);
}
-.add-action-button:active {
+.add-action-button:active, .add-action-button.is-pressed {
background-color: rgba(255, 255, 255, 0.1);
color: var(--text-color);
}
@@ -372,8 +374,9 @@ blah, inherit, .inherit {
all: inherit;
padding: 0;
margin: 0;
- display: inline;
+ display: flex;
opacity: 1;
+ border: none;
}
space{
margin-left: 0.4rem;
@@ -428,9 +431,9 @@ space{
color: var(--text-color);
cursor: pointer;
}
-.mobile-nav-btn:active {
+.mobile-nav-btn:active, .mobile-nav-btn.is-pressed {
background-color: rgba(255, 255, 255, 0.1);
- border-radius: 0.8rem;
+ transform: var(--press-scale);
}
.mobile-nav-btn.right {
margin-right: 0;