setPresetsModalOpen(true)}
- >
- Presets
+
+
setPresetsModalOpen(true)}
+ >
+ Presets
+
);
}
diff --git a/web/src/pages/Home/Home.scss b/web/src/pages/Home/Home.scss
index 121fa8212..9c6b5aa0f 100644
--- a/web/src/pages/Home/Home.scss
+++ b/web/src/pages/Home/Home.scss
@@ -2,7 +2,12 @@
.home-outer {
padding-top: 10px;
- padding-bottom: 10px;
+ @media (max-width: 435px) {
+ padding-bottom: 85px;
+ }
+ @media (min-width: 435px) {
+ padding-bottom: 10px;
+ }
display: flex;
flex-direction: column;
align-items: center;
@@ -69,6 +74,12 @@
}
.home-presets-container {
+ @media (max-width: 435px) {
+ position: fixed;
+ bottom: 65px;
+ }
+
+ z-index: 1; // Needed to ensure that scrolling marquees do not appear on top of the presets button
display: flex;
flex-direction: row;
diff --git a/web/src/pages/Player/Player.jsx b/web/src/pages/Player/Player.jsx
index 872ee214f..08c0d398c 100644
--- a/web/src/pages/Player/Player.jsx
+++ b/web/src/pages/Player/Player.jsx
@@ -62,8 +62,46 @@ const Player = () => {
// This is a bootleg XOR statement, only works if there is exactly one zone or exactly one group, no more than that and not both
const alone = ((usedGroups.length == 1) || (zonesLeft.length == 1)) && !((usedGroups.length > 0) && (zonesLeft.length > 0));
+ const mobile = window.matchMedia("(max-width: 435px)").matches
+
selectActiveSource();
+ function DropdownArrow() {
+ if(mobile){
+ if(expanded){
+ return(
+
+ )
+ } else {
+ return(
+
+ )
+ }
+ } else {
+ if(expanded){
+ return(
+
+ )
+ } else {
+ return(
+
+ )
+ }
+ }
+ }
+
return (
{streamsModalOpen && (
@@ -87,6 +125,7 @@ const Player = () => {
{
-
-
-
- {/* There are many sub-divs classed player-inner here because formatting was strange otherwise */}
-
-
-
-
-
-
+
+
+
{!alone && !is_streamer && zones.length > 0 && (
-
-
- setExpanded(!expanded)}>
- {expanded ? (
-
- ) : (
-
- )}
-
+
+
+
+ setExpanded(!expanded)}>
+
+
+
+
+ {/* When expanded, take up max height to prevent constant resizes as more dropdowns expand */}
+
+
+
)}
-
);
};
diff --git a/web/src/pages/Player/Player.scss b/web/src/pages/Player/Player.scss
index 0da4b71a0..e7a1d12af 100644
--- a/web/src/pages/Player/Player.scss
+++ b/web/src/pages/Player/Player.scss
@@ -33,7 +33,23 @@
border-radius: 2.5%;
}
-.player-volume-slider {
+.media-controls {
+ @media (max-width: 435px) {
+ position: fixed;
+ z-index: 0;
+ bottom: 129px
+ }
+}
+
+.player-volume-container {
+ @media (max-width: 435px) {
+ position: fixed;
+ bottom: 65px;
+ z-index: 1;
+ }
+}
+
+.player-volume-header {
display: flex;
flex-direction: row;
align-items: center;
@@ -41,6 +57,14 @@
width: 90vw;
}
+.player-volume-body {
+ display: flex;
+ align-items: center;
+ flex-direction: column;
+ max-height: calc(85vh - 120px);
+ overflow-y: auto;
+}
+
.player-volume-expand-button {
color: general.$controls-color;
}
@@ -52,3 +76,16 @@
@include general.header-font;
padding: 0.5rem;
}
+
+.control-gap {
+ // Dynamically size the gap so that the controls are always at the bottom of the screen when screen is scrolled to the top of the page
+ @media(min-height: 800px) {
+ height: 7.5vh
+ }
+ @media(min-height: 850px) {
+ height: 10vh
+ }
+ @media(min-height: 875px) {
+ height: 12.5vh
+ }
+}