Move page controls into main content
This commit is contained in:
+36
-16
@@ -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>
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
@@ -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>
|
||||||
|
|||||||
@@ -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>
|
||||||
|
|||||||
@@ -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
@@ -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;
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user