diff --git a/src/back/routes/common/fullscreen-menu/fullscreen-menu.css b/src/back/routes/common/fullscreen-menu/fullscreen-menu.css new file mode 100644 index 0000000..f8f2ada --- /dev/null +++ b/src/back/routes/common/fullscreen-menu/fullscreen-menu.css @@ -0,0 +1,57 @@ +.fullscreen-menu { + --fullscreen-menu-padding: 1rem; + --fullscreen-menu-height: 100vh; + --fulscreen-menu-inner-height: calc( + var(--fullscreen-menu-height) - 2 * var(--fullscreen-menu-padding) + ); + position: absolute; + background-color: white; + padding: var(--fullscreen-menu-padding); + padding-right: 0; /* for scrollbar to be close to the screen edge */ + height: var(--fullscreen-menu-height); + overflow: hidden; + width: 100vw; + left: 0; + top: 0; + border: 0; + box-sizing: border-box; + display: grid; + grid-template-rows: minmax(var(--fulscreen-menu-inner-height), 1fr); + grid-template-columns: 1fr; + + /* These need to be overwritten upon activating the dialog */ + opacity: 0; + visibility: hidden; + pointer-events: none; + transform: scale(0.9); + + transition: opacity 200ms, transform 200ms, visibility 0ms 200ms; + box-shadow: 1px 1px 11px #0000006e; +} + +.fullscreen-menu__content { + grid-row: 1/2; + grid-column: 1/2; + display: flex; +} + +.fullscreen-menu__panel-container { + display: grid; +} + +.fullscreen-menu__panel { + opacity: 0; + pointer-events: none; + visibility: hidden; + transform: translateX(50vw); + transition: opacity 200ms, transform 200ms, visibility 0ms 200ms; + + grid-row: 1/2; + grid-column: 1/2; + + max-height: calc(var(--fulscreen-menu-inner-height) - 3rem); + overflow-y: auto; + width: 100%; + padding-right: var(--fullscreen-menu-padding); + box-sizing: border-box; +} diff --git a/src/back/routes/common/fullscreen-menu/fullscreen-menu.tsx b/src/back/routes/common/fullscreen-menu/fullscreen-menu.tsx new file mode 100644 index 0000000..be7cd02 --- /dev/null +++ b/src/back/routes/common/fullscreen-menu/fullscreen-menu.tsx @@ -0,0 +1,107 @@ +/* eslint-disable @typescript-eslint/consistent-type-assertions */ +import type { FlatTemplatable } from "tempstream"; +import { TempstreamJSX } from "tempstream"; + +type Styles = { + menu_open: string; + menu_closed: string; + body_when_open: string; + body_when_closed: string; + panel_open: string; + panel_closed: string; +}; + +const default_styles: Styles = { + menu_open: `opacity: 1; visibility: visible; pointer-events: all; transform: scale(1); transition: opacity 200ms, transform 200ms, visibility 0ms 0ms;`, + menu_closed: "", + body_when_open: "overflow: hidden;", + body_when_closed: "", + panel_open: + "opacity: 1; transform: translateX(0); visibility: visible; pointer-events: all; transition: opacity 200ms, transform 200ms, visibility 0ms 0ms;", + panel_closed: "", +}; + +export function fullscreenMenu({ + id: menu_id, + panels, + default_panel, + styles = {}, + inner_wrapper = (menu_id, content) => ( +