Move page controls into main content

This commit is contained in:
Zeeshaun
2026-05-05 20:57:59 +00:00
parent ea325dea36
commit f17311919b
6 changed files with 109 additions and 37 deletions
+36 -16
View File
@@ -8,7 +8,6 @@ import {
resetMenu, resetMenu,
updateOrderStatus updateOrderStatus
} from "./api.js"; } from "./api.js";
import AppHeader from "./components/AppHeader.jsx";
import MenuPage from "./pages/MenuPage.jsx"; import MenuPage from "./pages/MenuPage.jsx";
import OrderPage from "./pages/OrderPage.jsx"; import OrderPage from "./pages/OrderPage.jsx";
import QueuePage from "./pages/QueuePage.jsx"; import QueuePage from "./pages/QueuePage.jsx";
@@ -169,23 +168,20 @@ export default function App() {
return ( return (
<div className="app-shell"> <div className="app-shell">
<AppHeader
adminUnlocked={adminUnlocked}
logoPressing={logoPressing}
onLogoPointerDown={startAdminPress}
onLogoPointerUp={cancelAdminPress}
onLogoPointerLeave={cancelAdminPress}
onLogoPointerCancel={cancelAdminPress}
onHideAdmin={() => {
setAdminUnlocked(false);
setView("order");
}}
view={view}
setView={setView}
/>
{view === "order" && ( {view === "order" && (
<OrderPage <OrderPage
adminUnlocked={adminUnlocked}
logoPressing={logoPressing}
onLogoPointerDown={startAdminPress}
onLogoPointerUp={cancelAdminPress}
onLogoPointerLeave={cancelAdminPress}
onLogoPointerCancel={cancelAdminPress}
onHideAdmin={() => {
setAdminUnlocked(false);
setView("order");
}}
view={view}
setView={setView}
menu={menu} menu={menu}
settings={settings} settings={settings}
selectedCategory={selectedCategory} selectedCategory={selectedCategory}
@@ -212,6 +208,18 @@ export default function App() {
{view === "queue" && ( {view === "queue" && (
<QueuePage <QueuePage
adminUnlocked={adminUnlocked}
logoPressing={logoPressing}
onLogoPointerDown={startAdminPress}
onLogoPointerUp={cancelAdminPress}
onLogoPointerLeave={cancelAdminPress}
onLogoPointerCancel={cancelAdminPress}
onHideAdmin={() => {
setAdminUnlocked(false);
setView("order");
}}
view={view}
setView={setView}
orders={orders} orders={orders}
updateOrderStatus={updateOrderStatus} updateOrderStatus={updateOrderStatus}
deleteOrder={deleteOrder} deleteOrder={deleteOrder}
@@ -222,6 +230,18 @@ export default function App() {
{view === "menu" && ( {view === "menu" && (
<MenuPage <MenuPage
adminUnlocked={adminUnlocked}
logoPressing={logoPressing}
onLogoPointerDown={startAdminPress}
onLogoPointerUp={cancelAdminPress}
onLogoPointerLeave={cancelAdminPress}
onLogoPointerCancel={cancelAdminPress}
onHideAdmin={() => {
setAdminUnlocked(false);
setView("order");
}}
view={view}
setView={setView}
menu={menu} menu={menu}
menuForm={menuForm} menuForm={menuForm}
setMenuForm={setMenuForm} setMenuForm={setMenuForm}
@@ -5,7 +5,7 @@ const tabLabels = {
menu: "Menu Admin" menu: "Menu Admin"
}; };
export default function AppHeader({ export default function PageBar({
adminUnlocked, adminUnlocked,
logoPressing, logoPressing,
onLogoPointerDown, onLogoPointerDown,
@@ -19,7 +19,7 @@ export default function AppHeader({
const visibleTabs = adminUnlocked ? ["queue", "menu"] : []; const visibleTabs = adminUnlocked ? ["queue", "menu"] : [];
return ( return (
<header className="topbar"> <div className="page-bar">
<button <button
className={`brand-mark ${logoPressing ? "is-pressing" : ""}`} className={`brand-mark ${logoPressing ? "is-pressing" : ""}`}
onPointerDown={onLogoPointerDown} onPointerDown={onLogoPointerDown}
@@ -47,6 +47,6 @@ export default function AppHeader({
</button> </button>
</nav> </nav>
)} )}
</header> </div>
); );
} }
+21
View File
@@ -1,7 +1,17 @@
import PageBar from "../components/PageBar.jsx";
import { formatCurrency } from "../lib/formatters.js"; import { formatCurrency } from "../lib/formatters.js";
import { initialBuilder } from "../lib/order.js"; import { initialBuilder } from "../lib/order.js";
export default function MenuPage({ export default function MenuPage({
adminUnlocked,
logoPressing,
onLogoPointerDown,
onLogoPointerUp,
onLogoPointerLeave,
onLogoPointerCancel,
onHideAdmin,
view,
setView,
menu, menu,
menuForm, menuForm,
setMenuForm, setMenuForm,
@@ -16,6 +26,17 @@ export default function MenuPage({
}) { }) {
return ( return (
<section className="menu-screen"> <section className="menu-screen">
<PageBar
adminUnlocked={adminUnlocked}
logoPressing={logoPressing}
onLogoPointerDown={onLogoPointerDown}
onLogoPointerUp={onLogoPointerUp}
onLogoPointerLeave={onLogoPointerLeave}
onLogoPointerCancel={onLogoPointerCancel}
onHideAdmin={onHideAdmin}
view={view}
setView={setView}
/>
<div className="panel"> <div className="panel">
<div className="panel-header"> <div className="panel-header">
<div> <div>
+21 -1
View File
@@ -2,6 +2,7 @@ import milkTeaBadge from "../../../assets/milk-tea-badge.png";
import fruitTeaBadge from "../../../assets/fruit-tea-badge-transparent.png"; import fruitTeaBadge from "../../../assets/fruit-tea-badge-transparent.png";
import slushBadge from "../../../assets/slush-badge.png"; import slushBadge from "../../../assets/slush-badge.png";
import OptionGroup from "../components/OptionGroup.jsx"; import OptionGroup from "../components/OptionGroup.jsx";
import PageBar from "../components/PageBar.jsx";
import { import {
categoryMonogram, categoryMonogram,
HERO_CATEGORIES, HERO_CATEGORIES,
@@ -18,6 +19,15 @@ const heroCategoryImages = {
}; };
export default function OrderPage({ export default function OrderPage({
adminUnlocked,
logoPressing,
onLogoPointerDown,
onLogoPointerUp,
onLogoPointerLeave,
onLogoPointerCancel,
onHideAdmin,
view,
setView,
menu, menu,
settings, settings,
selectedCategory, selectedCategory,
@@ -61,6 +71,17 @@ export default function OrderPage({
return ( return (
<section className={`screen order-screen ${orderMode === "premade" || showCart ? "is-single" : ""}`}> <section className={`screen order-screen ${orderMode === "premade" || showCart ? "is-single" : ""}`}>
<PageBar
adminUnlocked={adminUnlocked}
logoPressing={logoPressing}
onLogoPointerDown={onLogoPointerDown}
onLogoPointerUp={onLogoPointerUp}
onLogoPointerLeave={onLogoPointerLeave}
onLogoPointerCancel={onLogoPointerCancel}
onHideAdmin={onHideAdmin}
view={view}
setView={setView}
/>
{orderMode && ( {orderMode && (
<div className="order-toolbar"> <div className="order-toolbar">
<button className="text-btn" onClick={() => { <button className="text-btn" onClick={() => {
@@ -102,7 +123,6 @@ export default function OrderPage({
}} }}
> >
<img src={heroCategoryImages[category.asset]} alt="" /> <img src={heroCategoryImages[category.asset]} alt="" />
<span>{category.displayLabel}</span>
</button> </button>
))} ))}
</div> </div>
+21
View File
@@ -1,9 +1,19 @@
import PageBar from "../components/PageBar.jsx";
import SummaryCard from "../components/SummaryCard.jsx"; import SummaryCard from "../components/SummaryCard.jsx";
import { formatCurrency, formatTime, titleCase } from "../lib/formatters.js"; import { formatCurrency, formatTime, titleCase } from "../lib/formatters.js";
const queueStatuses = ["new", "making", "ready"]; const queueStatuses = ["new", "making", "ready"];
export default function QueuePage({ export default function QueuePage({
adminUnlocked,
logoPressing,
onLogoPointerDown,
onLogoPointerUp,
onLogoPointerLeave,
onLogoPointerCancel,
onHideAdmin,
view,
setView,
orders, orders,
updateOrderStatus, updateOrderStatus,
deleteOrder, deleteOrder,
@@ -12,6 +22,17 @@ export default function QueuePage({
}) { }) {
return ( return (
<section className="queue-screen"> <section className="queue-screen">
<PageBar
adminUnlocked={adminUnlocked}
logoPressing={logoPressing}
onLogoPointerDown={onLogoPointerDown}
onLogoPointerUp={onLogoPointerUp}
onLogoPointerLeave={onLogoPointerLeave}
onLogoPointerCancel={onLogoPointerCancel}
onHideAdmin={onHideAdmin}
view={view}
setView={setView}
/>
<div className="queue-summary"> <div className="queue-summary">
<SummaryCard label="Open orders" value={orders.filter((order) => order.status !== "completed").length} /> <SummaryCard label="Open orders" value={orders.filter((order) => order.status !== "completed").length} />
<SummaryCard label="New" value={orders.filter((order) => order.status === "new").length} /> <SummaryCard label="New" value={orders.filter((order) => order.status === "new").length} />
+7 -17
View File
@@ -60,28 +60,23 @@ button {
padding: 0.9rem 1rem 1rem; padding: 0.9rem 1rem 1rem;
} }
.topbar { .page-bar {
display: flex; display: flex;
justify-content: space-between; justify-content: space-between;
gap: 1rem; gap: 1rem;
align-items: center; align-items: center;
margin-bottom: 0.85rem; grid-column: 1 / -1;
padding: 0.85rem 1.05rem; margin-bottom: 0.2rem;
border: 1px solid rgba(16, 16, 16, 0.08);
border-radius: 30px;
background:
linear-gradient(135deg, rgba(255, 252, 247, 0.96), rgba(250, 239, 214, 0.94));
box-shadow: var(--shadow);
} }
.topbar h1, .page-bar h1,
.panel h2, .panel h2,
.panel h3 { .panel h3 {
margin: 0.2rem 0 0; margin: 0.2rem 0 0;
font-family: Georgia, "Times New Roman", serif; font-family: Georgia, "Times New Roman", serif;
} }
.topbar h1 { .page-bar h1 {
font-weight: 800; font-weight: 800;
} }
@@ -292,11 +287,6 @@ button {
object-fit: contain; object-fit: contain;
} }
.hero-category-btn span {
font-weight: 800;
letter-spacing: 0.02em;
}
.mode-grid { .mode-grid {
display: grid; display: grid;
grid-template-columns: repeat(3, minmax(0, 1fr)); grid-template-columns: repeat(3, minmax(0, 1fr));
@@ -643,7 +633,7 @@ select {
} }
@media (max-width: 980px) { @media (max-width: 980px) {
.topbar, .page-bar,
.screen, .screen,
.mode-hero, .mode-hero,
.hero-category-row, .hero-category-row,
@@ -654,7 +644,7 @@ select {
grid-template-columns: 1fr; grid-template-columns: 1fr;
} }
.topbar { .page-bar {
align-items: flex-start; align-items: flex-start;
flex-direction: column; flex-direction: column;
} }