Introduce tabbed modal layout

dev
gravel 1 year ago
parent e287070f8c
commit b05e822c4b
Signed by: gravel
GPG Key ID: C0538F3C906B308F

@ -417,17 +417,28 @@ footer nav a {
#details-modal { #details-modal {
padding: 0; padding: 0;
width: 80vw; width: 80vw;
max-height: 80vh; --modal-height: calc(80vh - 4em);
height: var(var(--modal-height));
color: var(--primary-color); color: var(--primary-color);
background-color: var(--secondary-color); background-color: var(--secondary-color);
--icon-size: 4rem; --icon-size: 4rem;
} }
#details-modal-contents { #details-modal-contents {
display: flex;
flex-direction: column;
box-sizing: border-box;
}
#details-modal-flow {
display: flex; display: flex;
flex-direction: column; flex-direction: column;
padding: 3em; padding: 3em;
height: var(--modal-height);
overflow: auto;
box-sizing: border-box; box-sizing: border-box;
justify-content: space-between;
gap: 1em;
} }
#details-modal-close { #details-modal-close {
@ -449,11 +460,16 @@ footer nav a {
font-style: italic; font-style: italic;
} }
#details-modal-pane { #details-modal-panes {
display: flex; display: flex;
flex-direction: row; flex-direction: row;
} }
#details-modal-panes, .details-modal-pane {
/* Jank overlap with actions when overflows */
/* height: 100%; */
}
#details-modal-start { #details-modal-start {
display: flex; display: flex;
flex-direction: column; flex-direction: column;
@ -518,11 +534,6 @@ footer nav a {
filter: blur(3px); filter: blur(3px);
} }
#details-modal-start #details-modal-description {
max-height: 50vh;
overflow: auto;
}
#details-modal-start #details-modal-description-inner:empty::after { #details-modal-start #details-modal-description-inner:empty::after {
content: "No description"; content: "No description";
font-style: italic; font-style: italic;
@ -535,8 +546,8 @@ footer nav a {
#details-modal-end #details-modal-qr-code { #details-modal-end #details-modal-qr-code {
aspect-ratio: 1; aspect-ratio: 1;
width: 20em; width: 15em;
height: 20em; height: 15em;
margin: 1em; margin: 1em;
} }
@ -544,6 +555,15 @@ footer nav a {
text-align: center; text-align: center;
} }
#details-modal-actions {
display: flex;
width: 100%;
flex-direction: row;
flex-wrap: wrap;
gap: .5em;
row-gap: .5em;
}
#details-modal .themed-button { #details-modal .themed-button {
color: var(--primary-color); color: var(--primary-color);
background-color: var(--secondary-color); background-color: var(--secondary-color);
@ -629,24 +649,7 @@ footer nav a {
} }
} }
@media (max-width: 950px) { @media (max-height: 1100px) {
#details-modal-pane {
flex-direction: column;
}
#details-modal-end {
align-items: start;
}
#details-modal #details-modal-qr-code {
width: 12.5em;
height: 12.5em;
}
#details-modal-qr-code-label-name {
display: inline;
}
#details-modal-language, #details-modal-users, #details-modal-created { #details-modal-language, #details-modal-users, #details-modal-created {
display: inline-block; display: inline-block;
text-align: center; text-align: center;
@ -662,6 +665,42 @@ footer nav a {
} }
} }
@media (max-width: 1000px) {
#details-modal-pane-selection {
display: inline-flex;
flex-direction: row;
}
#details-modal-panes[data-pane="0"] > .details-modal-pane:not([data-pane="0"]),
#details-modal-panes[data-pane="1"] > .details-modal-pane:not([data-pane="1"]) {
display: none;
}
#details-modal-panes[data-pane="0"] ~ #details-modal-actions .details-modal-pane-button[data-pane="0"],
#details-modal-panes[data-pane="1"] ~ #details-modal-actions .details-modal-pane-button[data-pane="1"] {
display:none
}
#details-modal-panes {
flex-direction: column;
align-items: stretch;
flex-grow: 500;
}
#details-modal-panes > gap {
display: none;
}
#details-modal #details-modal-qr-code {
width: 30vh;
height: 30vh;
}
#details-modal-qr-code-label-name {
display: inline;
}
}
@media (max-width: 500px) { @media (max-width: 500px) {
:root { :root {
/* ! For when descriptions don't wrap and 100vw doesn't work. */ /* ! For when descriptions don't wrap and 100vw doesn't work. */

@ -135,6 +135,8 @@ function displayQRModal(communityID) {
dom.details_modal_qr_code().src = communityQRCodeURL(communityID); dom.details_modal_qr_code().src = communityQRCodeURL(communityID);
document.getElementById('details-modal-panes').setAttribute('data-pane', 0);
modal.showModal(); modal.showModal();
} }
@ -181,6 +183,16 @@ function addQRModalHandlers() {
} }
}); });
for (const button of document.querySelectorAll('.details-modal-pane-button')) {
button.addEventListener(
'click',
function () {
const targetPane = this.getAttribute('data-pane');
document.getElementById('details-modal-panes')?.setAttribute('data-pane', targetPane);
}
)
}
document.querySelector('#details-modal-copy-button').addEventListener( document.querySelector('#details-modal-copy-button').addEventListener(
'click', 'click',
function () { function () {

@ -1,7 +1,6 @@
<?php <?php
require_once "$PROJECT_ROOT/php/utils/room-invites.php"; require_once "$PROJECT_ROOT/php/utils/room-invites.php";
?> ?>
<dialog id="details-modal"> <dialog id="details-modal">
<div id="details-modal-contents"> <div id="details-modal-contents">
<div id="details-modal-close"> <div id="details-modal-close">
@ -10,8 +9,9 @@
<div id="details-modal-close-hint"> <div id="details-modal-close-hint">
(Esc to close.) (Esc to close.)
</div> </div>
<div id="details-modal-pane"> <div id="details-modal-flow">
<div id="details-modal-start"> <div id="details-modal-panes" data-pane="0">
<div id="details-modal-start" class="details-modal-pane" data-pane="0">
<div id="details-modal-title"> <div id="details-modal-title">
<div <div
id="details-modal-community-icon-wrapper" id="details-modal-community-icon-wrapper"
@ -33,11 +33,10 @@
<p id="details-modal-description"> <p id="details-modal-description">
<span id="details-modal-description-inner" data-hydrate-with="description"></span> <span id="details-modal-description-inner" data-hydrate-with="description"></span>
</p> </p>
<gap></gap>
<div id="details-modal-room-info">
<p id="details-modal-room-tags"> <p id="details-modal-room-tags">
</p> </p>
<gap></gap>
<div id="details-modal-room-info">
<p id="details-modal-language"> <p id="details-modal-language">
Language: <span Language: <span
id="details-modal-language-flag" id="details-modal-language-flag"
@ -63,7 +62,7 @@
</div> </div>
</div> </div>
<gap></gap> <gap></gap>
<div id="details-modal-end"> <div id="details-modal-end" class="details-modal-pane" data-pane="1">
<img <img
src="" src=""
id="details-modal-qr-code" id="details-modal-qr-code"
@ -79,8 +78,7 @@
</div> </div>
</div> </div>
</div> </div>
<gap></gap> <div id="details-modal-actions">
<p>
<button <button
id="details-modal-copy-button" id="details-modal-copy-button"
class="themed-button" class="themed-button"
@ -89,7 +87,6 @@
> >
Copy join link Copy join link
</button> </button>
<button <button
id="details-modal-copy-staff-id" id="details-modal-copy-staff-id"
class="themed-button" class="themed-button"
@ -98,14 +95,28 @@
> >
Copy mod ping Copy mod ping
</button> </button>
<button <button
id="details-modal-copy-room-id" id="details-modal-copy-room-id"
class="themed-button" class="themed-button"
data-hydrate-with="identifier:data-identifier" data-hydrate-with="identifier:data-identifier"
title="Copy this room's identifier to uniquely identify this room to the sessioncommunities.online team" title="Copy this room's identifier to uniquely identify this room to the sessioncommunities.online team"
>Copy Community ID</button> >Copy Community ID</button>
</p> <gap></gap>
<div id="details-modal-pane-selection" class="hidden">
<button
class="details-modal-pane-button
themed-button"
data-pane="0"
class="themed-button"
>Back</button>
<button
class="details-modal-pane-button
themed-button"
data-pane="1"
class="themed-button"
>Show QR Code</button>
</div>
</div>
</div>
</div> </div>
</dialog> </dialog>

Loading…
Cancel
Save