restaurant-kit 0.1.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENSE +21 -0
- package/README.md +488 -0
- package/dist/RestaurantSiteRoutes.js +23 -0
- package/dist/admin/AdminActionMenu.js +29 -0
- package/dist/admin/AdminAuthPanel.js +53 -0
- package/dist/admin/AdminBackupsDialog.js +54 -0
- package/dist/admin/AdminDraftProvider.js +10 -0
- package/dist/admin/AdminGroupsPanel.js +68 -0
- package/dist/admin/AdminItemDrawer.js +264 -0
- package/dist/admin/AdminMenuCard.js +63 -0
- package/dist/admin/AdminMenuEditor.module.css.js +209 -0
- package/dist/admin/AdminMenuGroupTabs.js +43 -0
- package/dist/admin/AdminMenuIconPicker.js +39 -0
- package/dist/admin/AdminRoutes.js +13 -0
- package/dist/admin/AdminSectionEditor.js +104 -0
- package/dist/admin/AdminTestimonialsPanel.js +214 -0
- package/dist/admin/AdminTestimonialsPanel.module.css.js +29 -0
- package/dist/admin/adminDraftContext.js +5 -0
- package/dist/admin/adminEditorUtils.js +47 -0
- package/dist/admin/adminMenuCommands.js +83 -0
- package/dist/admin/useAdminDraft.js +14 -0
- package/dist/admin/useAdminMenuDraft.js +226 -0
- package/dist/cart/CartDrawer.js +87 -0
- package/dist/cart/CartDrawer.module.css.js +47 -0
- package/dist/cart/CartProvider.js +31 -0
- package/dist/cart/cartContext.js +5 -0
- package/dist/cart/cartOrder.js +34 -0
- package/dist/cart/cartReducer.js +57 -0
- package/dist/cart/useCart.js +10 -0
- package/dist/components/Brand.js +16 -0
- package/dist/components/Brand.module.css.js +15 -0
- package/dist/components/Footer.js +19 -0
- package/dist/components/Footer.module.css.js +11 -0
- package/dist/components/Header.js +34 -0
- package/dist/components/Header.module.css.js +19 -0
- package/dist/components/Hero.js +23 -0
- package/dist/components/Hero.module.css.js +15 -0
- package/dist/components/InstagramIcon.js +27 -0
- package/dist/components/LocationsSection.js +34 -0
- package/dist/components/LocationsSection.module.css.js +17 -0
- package/dist/components/Marquee.js +10 -0
- package/dist/components/Marquee.module.css.js +9 -0
- package/dist/components/OrderIcon.js +11 -0
- package/dist/components/RatingSection.js +32 -0
- package/dist/components/RatingSection.module.css.js +19 -0
- package/dist/components/TestimonialsSection.js +73 -0
- package/dist/components/TestimonialsSection.module.css.js +37 -0
- package/dist/components/WhatsAppIcon.js +13 -0
- package/dist/config/RestaurantKitProvider.js +26 -0
- package/dist/config/siteConfigContext.js +23 -0
- package/dist/config/useOrdering.js +12 -0
- package/dist/index.js +92 -0
- package/dist/menu/localMenuApi.js +43 -0
- package/dist/menu/menuApi.js +121 -0
- package/dist/menu/menuDraftStorage.js +35 -0
- package/dist/menu/menuIcons.js +24 -0
- package/dist/menu/menuMutations.js +99 -0
- package/dist/menu/menuOrdering.js +94 -0
- package/dist/menu/menuSchema.js +4 -0
- package/dist/menu/priceFormat.js +39 -0
- package/dist/menu/useMenuData.js +38 -0
- package/dist/menu/validateMenu.js +63 -0
- package/dist/menu-browser/MenuBrowser.js +54 -0
- package/dist/menu-browser/MenuBrowser.module.css.js +153 -0
- package/dist/menu-browser/MenuCard.js +106 -0
- package/dist/menu-browser/MenuCartDrawer.js +18 -0
- package/dist/menu-browser/MenuCategoryBlock.js +45 -0
- package/dist/menu-browser/MenuItemSheet.js +132 -0
- package/dist/menu-browser/MenuLightbox.js +33 -0
- package/dist/menu-browser/MenuRow.js +43 -0
- package/dist/menu-browser/MenuSection.js +10 -0
- package/dist/menu-browser/menuItemDisplay.js +19 -0
- package/dist/menu-browser/useMediaQuery.js +19 -0
- package/dist/menu-browser/useMenuBrowserState.js +82 -0
- package/dist/menu-browser/useParkedSheet.js +32 -0
- package/dist/pages/AdminMenuEditor.js +291 -0
- package/dist/pages/AdminPreview.js +43 -0
- package/dist/pages/AdminPreview.module.css.js +9 -0
- package/dist/pages/MenuSite.js +40 -0
- package/dist/restaurant-kit.css +1 -0
- package/dist/testimonials/downscaleImage.js +14 -0
- package/dist/testimonials/testimonialMutations.js +52 -0
- package/dist/types/RestaurantSiteRoutes.d.ts +11 -0
- package/dist/types/admin/AdminActionMenu.d.ts +20 -0
- package/dist/types/admin/AdminAuthPanel.d.ts +13 -0
- package/dist/types/admin/AdminBackupsDialog.d.ts +9 -0
- package/dist/types/admin/AdminDraftProvider.d.ts +12 -0
- package/dist/types/admin/AdminGroupsPanel.d.ts +14 -0
- package/dist/types/admin/AdminItemDrawer.d.ts +16 -0
- package/dist/types/admin/AdminMenuCard.d.ts +10 -0
- package/dist/types/admin/AdminMenuGroupTabs.d.ts +11 -0
- package/dist/types/admin/AdminMenuIconPicker.d.ts +8 -0
- package/dist/types/admin/AdminRoutes.d.ts +5 -0
- package/dist/types/admin/AdminSectionEditor.d.ts +20 -0
- package/dist/types/admin/AdminTestimonialsPanel.d.ts +7 -0
- package/dist/types/admin/adminDraftContext.d.ts +2 -0
- package/dist/types/admin/adminEditorUtils.d.ts +22 -0
- package/dist/types/admin/adminMenuCommands.d.ts +73 -0
- package/dist/types/admin/useAdminDraft.d.ts +5 -0
- package/dist/types/admin/useAdminMenuDraft.d.ts +41 -0
- package/dist/types/cart/CartDrawer.d.ts +7 -0
- package/dist/types/cart/CartProvider.d.ts +4 -0
- package/dist/types/cart/cartContext.d.ts +2 -0
- package/dist/types/cart/cartOrder.d.ts +9 -0
- package/dist/types/cart/cartReducer.d.ts +36 -0
- package/dist/types/cart/cartTypes.d.ts +37 -0
- package/dist/types/cart/useCart.d.ts +1 -0
- package/dist/types/components/Brand.d.ts +5 -0
- package/dist/types/components/Footer.d.ts +1 -0
- package/dist/types/components/Header.d.ts +1 -0
- package/dist/types/components/Hero.d.ts +1 -0
- package/dist/types/components/InstagramIcon.d.ts +6 -0
- package/dist/types/components/LocationsSection.d.ts +1 -0
- package/dist/types/components/Marquee.d.ts +1 -0
- package/dist/types/components/OrderIcon.d.ts +4 -0
- package/dist/types/components/RatingSection.d.ts +1 -0
- package/dist/types/components/TestimonialsSection.d.ts +2 -0
- package/dist/types/components/WhatsAppIcon.d.ts +5 -0
- package/dist/types/config/RestaurantKitProvider.d.ts +24 -0
- package/dist/types/config/siteConfigContext.d.ts +28 -0
- package/dist/types/config/siteTypes.d.ts +50 -0
- package/dist/types/config/useOrdering.d.ts +16 -0
- package/dist/types/index.d.ts +38 -0
- package/dist/types/menu/localMenuApi.d.ts +9 -0
- package/dist/types/menu/menuApi.d.ts +68 -0
- package/dist/types/menu/menuDraftStorage.d.ts +5 -0
- package/dist/types/menu/menuIcons.d.ts +7 -0
- package/dist/types/menu/menuMutations.d.ts +13 -0
- package/dist/types/menu/menuOrdering.d.ts +38 -0
- package/dist/types/menu/menuSchema.d.ts +68 -0
- package/dist/types/menu/priceFormat.d.ts +8 -0
- package/dist/types/menu/useMenuData.d.ts +12 -0
- package/dist/types/menu/validateMenu.d.ts +16 -0
- package/dist/types/menu-browser/MenuBrowser.d.ts +6 -0
- package/dist/types/menu-browser/MenuCard.d.ts +7 -0
- package/dist/types/menu-browser/MenuCartDrawer.d.ts +5 -0
- package/dist/types/menu-browser/MenuCategoryBlock.d.ts +11 -0
- package/dist/types/menu-browser/MenuItemSheet.d.ts +10 -0
- package/dist/types/menu-browser/MenuLightbox.d.ts +9 -0
- package/dist/types/menu-browser/MenuRow.d.ts +7 -0
- package/dist/types/menu-browser/MenuSection.d.ts +1 -0
- package/dist/types/menu-browser/menuItemDisplay.d.ts +5 -0
- package/dist/types/menu-browser/useMediaQuery.d.ts +1 -0
- package/dist/types/menu-browser/useMenuBrowserState.d.ts +17 -0
- package/dist/types/menu-browser/useParkedSheet.d.ts +13 -0
- package/dist/types/pages/AdminMenuEditor.d.ts +1 -0
- package/dist/types/pages/AdminPreview.d.ts +1 -0
- package/dist/types/pages/MenuSite.d.ts +6 -0
- package/dist/types/testimonials/downscaleImage.d.ts +6 -0
- package/dist/types/testimonials/testimonialMutations.d.ts +9 -0
- package/dist/types/utils.d.ts +1 -0
- package/dist/types/worker/auth.d.ts +97 -0
- package/dist/types/worker/http.d.ts +17 -0
- package/dist/types/worker/index.d.ts +16 -0
- package/dist/types/worker/menuStorage.d.ts +94 -0
- package/dist/utils.js +6 -0
- package/dist/worker/auth.js +183 -0
- package/dist/worker/http.js +65 -0
- package/dist/worker/menuStorage.js +95 -0
- package/dist/worker.js +131 -0
- package/package.json +105 -0
- package/scripts/bootstrap-site.mjs +125 -0
- package/scripts/hash-admin-password.mjs +11 -0
- package/scripts/lib/password.mjs +72 -0
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
import { jsx as i } from "react/jsx-runtime";
|
|
2
|
+
import { AdminDraftContext as m } from "./adminDraftContext.js";
|
|
3
|
+
import { useAdminMenuDraft as n } from "./useAdminMenuDraft.js";
|
|
4
|
+
function a({ children: r, options: t }) {
|
|
5
|
+
const o = n(t);
|
|
6
|
+
return /* @__PURE__ */ i(m.Provider, { value: o, children: r });
|
|
7
|
+
}
|
|
8
|
+
export {
|
|
9
|
+
a as AdminDraftProvider
|
|
10
|
+
};
|
|
@@ -0,0 +1,68 @@
|
|
|
1
|
+
import { jsxs as n, jsx as e } from "react/jsx-runtime";
|
|
2
|
+
import { RestrictToVerticalAxis as m } from "@dnd-kit/abstract/modifiers";
|
|
3
|
+
import { useSortable as h } from "@dnd-kit/react/sortable";
|
|
4
|
+
import * as l from "@radix-ui/react-popover";
|
|
5
|
+
import { Settings2 as b, Plus as f, GripVertical as P, Trash2 as N } from "lucide-react";
|
|
6
|
+
import { cx as v } from "../utils.js";
|
|
7
|
+
import { AdminMenuIconPicker as C } from "./AdminMenuIconPicker.js";
|
|
8
|
+
import r from "./AdminMenuEditor.module.css.js";
|
|
9
|
+
function R({ groups: s, onAddGroup: d, onDeleteGroup: u, onUpdateGroup: a }) {
|
|
10
|
+
return /* @__PURE__ */ n(l.Root, { children: [
|
|
11
|
+
/* @__PURE__ */ e(l.Trigger, { asChild: !0, children: /* @__PURE__ */ n("button", { className: r.secondaryButton, type: "button", children: [
|
|
12
|
+
/* @__PURE__ */ e(b, { "aria-hidden": "true" }),
|
|
13
|
+
"Manage groups"
|
|
14
|
+
] }) }),
|
|
15
|
+
/* @__PURE__ */ e(l.Portal, { children: /* @__PURE__ */ n(l.Content, { className: r.managePanel, align: "end", sideOffset: 8, collisionPadding: 12, children: [
|
|
16
|
+
/* @__PURE__ */ e("p", { className: r.managePanelTitle, children: "Menu groups · drag to reorder" }),
|
|
17
|
+
/* @__PURE__ */ e("div", { className: r.manageList, children: s.map((o, t) => /* @__PURE__ */ e(x, { row: o, sortableIndex: t, onDeleteGroup: u, onUpdateGroup: a }, o.group.id)) }),
|
|
18
|
+
/* @__PURE__ */ e("div", { className: r.managePanelFoot, children: /* @__PURE__ */ n("button", { className: r.secondaryButton, type: "button", onClick: d, children: [
|
|
19
|
+
/* @__PURE__ */ e(f, { "aria-hidden": "true" }),
|
|
20
|
+
"Add group"
|
|
21
|
+
] }) })
|
|
22
|
+
] }) })
|
|
23
|
+
] });
|
|
24
|
+
}
|
|
25
|
+
function x({ row: s, sortableIndex: d, onDeleteGroup: u, onUpdateGroup: a }) {
|
|
26
|
+
const { group: o, hasSections: t, itemCount: c } = s, { isDragging: p, ref: g } = h({
|
|
27
|
+
id: `group:${o.id}`,
|
|
28
|
+
index: d,
|
|
29
|
+
group: "menu-groups",
|
|
30
|
+
data: { kind: "group", id: o.id },
|
|
31
|
+
modifiers: [m],
|
|
32
|
+
transition: { idle: !0 }
|
|
33
|
+
});
|
|
34
|
+
return /* @__PURE__ */ n("div", { className: v(r.groupRow, p && r.dragging), ref: g, children: [
|
|
35
|
+
/* @__PURE__ */ e("span", { className: r.groupHandle, "aria-hidden": "true", children: /* @__PURE__ */ e(P, {}) }),
|
|
36
|
+
/* @__PURE__ */ e("div", { onPointerDown: (i) => i.stopPropagation(), children: /* @__PURE__ */ e(C, { label: `Choose ${o.label} icon`, value: o.icon, onChange: (i) => a(o.id, { icon: i }) }) }),
|
|
37
|
+
/* @__PURE__ */ e(
|
|
38
|
+
"input",
|
|
39
|
+
{
|
|
40
|
+
"aria-label": `${o.label} group name`,
|
|
41
|
+
value: o.label,
|
|
42
|
+
onChange: (i) => a(o.id, { label: i.target.value }),
|
|
43
|
+
onPointerDown: (i) => i.stopPropagation()
|
|
44
|
+
}
|
|
45
|
+
),
|
|
46
|
+
/* @__PURE__ */ n("span", { className: r.groupCount, children: [
|
|
47
|
+
c,
|
|
48
|
+
" item",
|
|
49
|
+
c === 1 ? "" : "s"
|
|
50
|
+
] }),
|
|
51
|
+
/* @__PURE__ */ e(
|
|
52
|
+
"button",
|
|
53
|
+
{
|
|
54
|
+
className: r.groupDelete,
|
|
55
|
+
type: "button",
|
|
56
|
+
disabled: t,
|
|
57
|
+
title: t ? "Move or delete this group's sections first" : `Delete ${o.label}`,
|
|
58
|
+
"aria-label": `Delete ${o.label}`,
|
|
59
|
+
onClick: () => u(o.id),
|
|
60
|
+
onPointerDown: (i) => i.stopPropagation(),
|
|
61
|
+
children: /* @__PURE__ */ e(N, { "aria-hidden": "true" })
|
|
62
|
+
}
|
|
63
|
+
)
|
|
64
|
+
] });
|
|
65
|
+
}
|
|
66
|
+
export {
|
|
67
|
+
R as AdminGroupsPanel
|
|
68
|
+
};
|
|
@@ -0,0 +1,264 @@
|
|
|
1
|
+
import { jsxs as a, jsx as e } from "react/jsx-runtime";
|
|
2
|
+
import { ImagePlus as P, Crop as W, Trash2 as E, Plus as V, X as z } from "lucide-react";
|
|
3
|
+
import { useState as b, useRef as X, useEffect as K } from "react";
|
|
4
|
+
import Y, { convertToPixelCrop as _, centerCrop as q, makeAspectCrop as J } from "react-image-crop";
|
|
5
|
+
import "react-image-crop/dist/ReactCrop.css";
|
|
6
|
+
import { sortByOrder as Q } from "../menu/menuOrdering.js";
|
|
7
|
+
import { formatPrice as U, priceInputValue as M, priceFromInput as D } from "../menu/priceFormat.js";
|
|
8
|
+
import r from "./AdminMenuEditor.module.css.js";
|
|
9
|
+
import { imageSrc as T } from "../menu-browser/menuItemDisplay.js";
|
|
10
|
+
function Z({ ingredients: l, onChange: i }) {
|
|
11
|
+
const [s, o] = b(""), m = (n) => {
|
|
12
|
+
const c = n.trim().replace(/,+$/, "").trim();
|
|
13
|
+
o(""), c && (l.some((d) => d.toLowerCase() === c.toLowerCase()) || i([...l, c]));
|
|
14
|
+
};
|
|
15
|
+
return /* @__PURE__ */ a("div", { className: r.fieldGroup, children: [
|
|
16
|
+
/* @__PURE__ */ e("label", { htmlFor: "item-removable-ingredients", children: "Removable ingredients" }),
|
|
17
|
+
/* @__PURE__ */ a("div", { className: r.chipBox, children: [
|
|
18
|
+
l.map((n) => /* @__PURE__ */ a("span", { className: r.chip, children: [
|
|
19
|
+
n,
|
|
20
|
+
/* @__PURE__ */ e("button", { type: "button", onClick: () => i(l.filter((c) => c !== n)), "aria-label": `Remove ${n}`, children: /* @__PURE__ */ e(z, { "aria-hidden": "true" }) })
|
|
21
|
+
] }, n)),
|
|
22
|
+
/* @__PURE__ */ e(
|
|
23
|
+
"input",
|
|
24
|
+
{
|
|
25
|
+
id: "item-removable-ingredients",
|
|
26
|
+
className: r.chipField,
|
|
27
|
+
value: s,
|
|
28
|
+
placeholder: l.length ? "Add another…" : "e.g. pickles, garlic sauce",
|
|
29
|
+
onChange: (n) => {
|
|
30
|
+
if (n.target.value.endsWith(",")) {
|
|
31
|
+
m(n.target.value);
|
|
32
|
+
return;
|
|
33
|
+
}
|
|
34
|
+
o(n.target.value);
|
|
35
|
+
},
|
|
36
|
+
onKeyDown: (n) => {
|
|
37
|
+
n.key === "Enter" && (n.preventDefault(), m(s));
|
|
38
|
+
},
|
|
39
|
+
onBlur: () => m(s)
|
|
40
|
+
}
|
|
41
|
+
)
|
|
42
|
+
] }),
|
|
43
|
+
/* @__PURE__ */ e("small", { children: "Customers can untick these when ordering. Press Enter or comma to add." })
|
|
44
|
+
] });
|
|
45
|
+
}
|
|
46
|
+
function j({ id: l, label: i, value: s, onChange: o }) {
|
|
47
|
+
const [m, n] = b(() => M(s).currency), c = M(s, m), d = (h) => {
|
|
48
|
+
o(D(h, c.currency));
|
|
49
|
+
}, g = (h) => {
|
|
50
|
+
n(h), o(D(c.amount, h));
|
|
51
|
+
};
|
|
52
|
+
return /* @__PURE__ */ a("div", { className: r.fieldGroup, children: [
|
|
53
|
+
/* @__PURE__ */ e("label", { htmlFor: l, children: i }),
|
|
54
|
+
/* @__PURE__ */ a("div", { className: r.priceField, children: [
|
|
55
|
+
/* @__PURE__ */ e("input", { id: l, inputMode: "decimal", value: c.amount, onChange: (h) => d(h.target.value), placeholder: "7.50" }),
|
|
56
|
+
/* @__PURE__ */ a("div", { className: r.currencyToggle, "aria-label": `${i} currency`, children: [
|
|
57
|
+
/* @__PURE__ */ e("button", { className: c.currency === "USD" ? r.selectedCurrency : "", type: "button", onClick: () => g("USD"), children: "USD" }),
|
|
58
|
+
/* @__PURE__ */ e("button", { className: c.currency === "LBP" ? r.selectedCurrency : "", type: "button", onClick: () => g("LBP"), children: "LBP" })
|
|
59
|
+
] })
|
|
60
|
+
] })
|
|
61
|
+
] });
|
|
62
|
+
}
|
|
63
|
+
const $ = 3 / 2;
|
|
64
|
+
function ee(l, i) {
|
|
65
|
+
return q(
|
|
66
|
+
J(
|
|
67
|
+
{
|
|
68
|
+
unit: "%",
|
|
69
|
+
width: 92
|
|
70
|
+
},
|
|
71
|
+
$,
|
|
72
|
+
l,
|
|
73
|
+
i
|
|
74
|
+
),
|
|
75
|
+
l,
|
|
76
|
+
i
|
|
77
|
+
);
|
|
78
|
+
}
|
|
79
|
+
function re(l) {
|
|
80
|
+
return new Promise((i, s) => {
|
|
81
|
+
l.toBlob((o) => {
|
|
82
|
+
o ? i(o) : s(new Error("Could not crop image."));
|
|
83
|
+
}, "image/jpeg", 0.92);
|
|
84
|
+
});
|
|
85
|
+
}
|
|
86
|
+
async function te(l, i, s) {
|
|
87
|
+
const o = document.createElement("canvas"), m = 1200, n = 800;
|
|
88
|
+
o.width = m, o.height = n;
|
|
89
|
+
const c = o.getContext("2d");
|
|
90
|
+
if (!c) throw new Error("Could not prepare image crop.");
|
|
91
|
+
const d = i.naturalWidth / i.width, g = i.naturalHeight / i.height, h = s.x * d, k = s.y * g, v = s.width * d, p = s.height * g;
|
|
92
|
+
c.drawImage(i, h, k, v, p, 0, 0, m, n);
|
|
93
|
+
const f = await re(o), F = l.name.replace(/\.[^.]+$/, "") || "menu-image";
|
|
94
|
+
return new File([f], `${F}-cropped.jpg`, { type: "image/jpeg" });
|
|
95
|
+
}
|
|
96
|
+
function pe({ isUploadingImage: l, item: i, onAddSize: s, onClose: o, onDelete: m, onRemoveImage: n, onRemoveSize: c, onUpdate: d, onUpdateSize: g, onUploadImage: h }) {
|
|
97
|
+
const k = !!i.image, v = `drawer-image-upload-${i.id}`, [p, f] = b(null), [F, N] = b(), [R, y] = b(null), [S, I] = b(!1), [w, C] = b(""), B = X(null);
|
|
98
|
+
K(() => () => {
|
|
99
|
+
p && URL.revokeObjectURL(p.url);
|
|
100
|
+
}, [p]);
|
|
101
|
+
const L = () => {
|
|
102
|
+
p && URL.revokeObjectURL(p.url), f(null), N(void 0), y(null), I(!1), C("");
|
|
103
|
+
}, x = (t) => {
|
|
104
|
+
p && URL.revokeObjectURL(p.url), f({ file: t, url: URL.createObjectURL(t) }), N(void 0), y(null), C("");
|
|
105
|
+
}, A = async () => {
|
|
106
|
+
if (i.image) {
|
|
107
|
+
C("");
|
|
108
|
+
try {
|
|
109
|
+
const t = await fetch(T(i.image));
|
|
110
|
+
if (!t.ok) throw new Error("Could not load image.");
|
|
111
|
+
const u = await t.blob(), G = new File([u], `${i.title || "menu-image"}.jpg`, { type: u.type || "image/jpeg" });
|
|
112
|
+
x(G);
|
|
113
|
+
} catch {
|
|
114
|
+
C("Could not open this image for cropping. Choose the source file again to crop it.");
|
|
115
|
+
}
|
|
116
|
+
}
|
|
117
|
+
}, O = async () => {
|
|
118
|
+
if (p) {
|
|
119
|
+
if (!B.current || !R?.width || !R.height) {
|
|
120
|
+
C("Choose a crop area before uploading.");
|
|
121
|
+
return;
|
|
122
|
+
}
|
|
123
|
+
I(!0);
|
|
124
|
+
try {
|
|
125
|
+
const t = await te(p.file, B.current, R);
|
|
126
|
+
h(t), L();
|
|
127
|
+
} catch {
|
|
128
|
+
C("Could not crop this image. Try another file."), I(!1);
|
|
129
|
+
}
|
|
130
|
+
}
|
|
131
|
+
}, H = (t) => {
|
|
132
|
+
const u = ee(t.width, t.height);
|
|
133
|
+
N(u), y(_(u, t.width, t.height));
|
|
134
|
+
};
|
|
135
|
+
return /* @__PURE__ */ a("aside", { className: r.editorDrawer, "aria-label": "Edit menu item details", children: [
|
|
136
|
+
/* @__PURE__ */ a("div", { className: r.drawerHeader, children: [
|
|
137
|
+
/* @__PURE__ */ a("div", { children: [
|
|
138
|
+
/* @__PURE__ */ e("p", { className: "micro-label", children: "Edit item" }),
|
|
139
|
+
/* @__PURE__ */ e("h2", { children: i.title })
|
|
140
|
+
] }),
|
|
141
|
+
/* @__PURE__ */ e("button", { className: r.iconButton, type: "button", onClick: o, "aria-label": "Close item editor", children: "x" })
|
|
142
|
+
] }),
|
|
143
|
+
/* @__PURE__ */ a("div", { className: r.drawerFields, children: [
|
|
144
|
+
/* @__PURE__ */ a("div", { className: r.drawerImageBlock, children: [
|
|
145
|
+
k ? /* @__PURE__ */ a("figure", { className: r.drawerMedia, children: [
|
|
146
|
+
/* @__PURE__ */ e("img", { src: T(i.image), alt: "" }),
|
|
147
|
+
/* @__PURE__ */ a("figcaption", { className: r.drawerImageOverlay, "aria-label": "Image actions", children: [
|
|
148
|
+
/* @__PURE__ */ a("label", { className: r.drawerImageTool, htmlFor: v, "aria-disabled": l, children: [
|
|
149
|
+
/* @__PURE__ */ e(P, { "aria-hidden": "true" }),
|
|
150
|
+
l ? "Uploading" : "Replace"
|
|
151
|
+
] }),
|
|
152
|
+
/* @__PURE__ */ a("button", { className: r.drawerImageTool, type: "button", onClick: () => {
|
|
153
|
+
A();
|
|
154
|
+
}, disabled: l, children: [
|
|
155
|
+
/* @__PURE__ */ e(W, { "aria-hidden": "true" }),
|
|
156
|
+
"Crop"
|
|
157
|
+
] }),
|
|
158
|
+
/* @__PURE__ */ a("button", { className: `${r.drawerImageTool} ${r.dangerImageTool}`, type: "button", onClick: n, disabled: l, children: [
|
|
159
|
+
/* @__PURE__ */ e(E, { "aria-hidden": "true" }),
|
|
160
|
+
"Remove"
|
|
161
|
+
] })
|
|
162
|
+
] })
|
|
163
|
+
] }) : /* @__PURE__ */ a("label", { className: r.drawerMediaEmpty, htmlFor: v, "aria-disabled": l, children: [
|
|
164
|
+
/* @__PURE__ */ e(P, { "aria-hidden": "true" }),
|
|
165
|
+
l ? "Uploading image" : "Choose & crop image"
|
|
166
|
+
] }),
|
|
167
|
+
/* @__PURE__ */ e(
|
|
168
|
+
"input",
|
|
169
|
+
{
|
|
170
|
+
className: r.fileInput,
|
|
171
|
+
id: v,
|
|
172
|
+
type: "file",
|
|
173
|
+
accept: "image/*",
|
|
174
|
+
disabled: l,
|
|
175
|
+
onChange: (t) => {
|
|
176
|
+
const u = t.target.files?.[0];
|
|
177
|
+
t.target.value = "", u && x(u);
|
|
178
|
+
}
|
|
179
|
+
}
|
|
180
|
+
),
|
|
181
|
+
w ? /* @__PURE__ */ e("p", { className: r.inlineError, children: w }) : null
|
|
182
|
+
] }),
|
|
183
|
+
/* @__PURE__ */ a("div", { className: r.fieldGroup, children: [
|
|
184
|
+
/* @__PURE__ */ e("label", { htmlFor: "item-title", children: "Name" }),
|
|
185
|
+
/* @__PURE__ */ e("input", { id: "item-title", value: i.title, onChange: (t) => d({ title: t.target.value }) })
|
|
186
|
+
] }),
|
|
187
|
+
/* @__PURE__ */ a("div", { className: r.fieldGroup, children: [
|
|
188
|
+
/* @__PURE__ */ e("label", { htmlFor: "item-description", children: "Description" }),
|
|
189
|
+
/* @__PURE__ */ e("textarea", { id: "item-description", className: r.drawerTextarea, value: i.description, onChange: (t) => d({ description: t.target.value }), placeholder: "Shown under the item name" })
|
|
190
|
+
] }),
|
|
191
|
+
/* @__PURE__ */ e(Z, { ingredients: i.removableIngredients ?? [], onChange: (t) => d({ removableIngredients: t.length ? t : void 0 }) }),
|
|
192
|
+
/* @__PURE__ */ a("div", { className: r.fieldGroup, children: [
|
|
193
|
+
/* @__PURE__ */ e("label", { htmlFor: "item-image", children: "Image path or URL" }),
|
|
194
|
+
/* @__PURE__ */ e("input", { id: "item-image", value: i.image, onChange: (t) => d({ image: t.target.value, imageKey: void 0 }), placeholder: "assets/menu/..." }),
|
|
195
|
+
/* @__PURE__ */ e("small", { children: "Optional. Manual paths are treated as external/static images." })
|
|
196
|
+
] }),
|
|
197
|
+
/* @__PURE__ */ a("div", { className: r.segmented, children: [
|
|
198
|
+
/* @__PURE__ */ e("button", { className: i.pricingMode === "single" ? r.selectedSegment : "", type: "button", onClick: () => d({ pricingMode: "single", sizes: [] }), children: "Single price" }),
|
|
199
|
+
/* @__PURE__ */ e("button", { className: i.pricingMode === "sizes" ? r.selectedSegment : "", type: "button", onClick: () => d({ pricingMode: "sizes" }), children: "Size prices" })
|
|
200
|
+
] }),
|
|
201
|
+
i.pricingMode === "single" ? /* @__PURE__ */ e(j, { id: "item-price", label: "Price", value: i.price, onChange: (t) => d({ price: t }) }) : /* @__PURE__ */ a("div", { className: r.sizeEditor, children: [
|
|
202
|
+
/* @__PURE__ */ a("div", { className: r.sizeHeader, children: [
|
|
203
|
+
/* @__PURE__ */ e("h3", { children: "Sizes" }),
|
|
204
|
+
/* @__PURE__ */ a("button", { type: "button", onClick: s, children: [
|
|
205
|
+
/* @__PURE__ */ e(V, { "aria-hidden": "true" }),
|
|
206
|
+
"Add size"
|
|
207
|
+
] })
|
|
208
|
+
] }),
|
|
209
|
+
Q(i.sizes).map((t) => /* @__PURE__ */ a("div", { className: r.sizeRow, children: [
|
|
210
|
+
/* @__PURE__ */ e("input", { "aria-label": "Size label", value: t.label, onChange: (u) => g(t.id, { label: u.target.value }) }),
|
|
211
|
+
/* @__PURE__ */ e(j, { id: `size-price-${t.id}`, label: "Size price", value: t.price, onChange: (u) => g(t.id, { price: u }) }),
|
|
212
|
+
/* @__PURE__ */ e("button", { type: "button", onClick: () => c(t.id), "aria-label": "Remove size", children: /* @__PURE__ */ e(E, { "aria-hidden": "true" }) })
|
|
213
|
+
] }, t.id))
|
|
214
|
+
] }),
|
|
215
|
+
/* @__PURE__ */ a("label", { className: r.checkboxLabel, children: [
|
|
216
|
+
/* @__PURE__ */ e("input", { type: "checkbox", checked: i.isVisible, onChange: (t) => d({ isVisible: t.target.checked }) }),
|
|
217
|
+
"Visible on public menu"
|
|
218
|
+
] }),
|
|
219
|
+
/* @__PURE__ */ a("div", { className: r.drawerPreview, children: [
|
|
220
|
+
/* @__PURE__ */ e("span", { children: "Customer price" }),
|
|
221
|
+
/* @__PURE__ */ e("strong", { children: i.pricingMode === "sizes" ? "Shown in size buttons" : U(i.price) || "M.P." })
|
|
222
|
+
] })
|
|
223
|
+
] }),
|
|
224
|
+
/* @__PURE__ */ a("div", { className: r.drawerActions, children: [
|
|
225
|
+
/* @__PURE__ */ a("button", { className: r.secondaryButton, type: "button", onClick: m, children: [
|
|
226
|
+
/* @__PURE__ */ e(E, { "aria-hidden": "true" }),
|
|
227
|
+
"Delete item"
|
|
228
|
+
] }),
|
|
229
|
+
/* @__PURE__ */ e("button", { className: r.primaryButton, type: "button", onClick: o, children: "Done" })
|
|
230
|
+
] }),
|
|
231
|
+
p ? /* @__PURE__ */ e("div", { className: r.cropModalBackdrop, role: "presentation", children: /* @__PURE__ */ a("div", { className: r.cropModal, role: "dialog", "aria-modal": "true", "aria-labelledby": "crop-menu-image-title", children: [
|
|
232
|
+
/* @__PURE__ */ a("div", { className: r.cropHeader, children: [
|
|
233
|
+
/* @__PURE__ */ a("div", { children: [
|
|
234
|
+
/* @__PURE__ */ e("p", { className: "micro-label", children: "Crop image" }),
|
|
235
|
+
/* @__PURE__ */ e("h3", { id: "crop-menu-image-title", children: "Frame the menu photo" })
|
|
236
|
+
] }),
|
|
237
|
+
/* @__PURE__ */ e("button", { className: r.iconButton, type: "button", onClick: L, "aria-label": "Close cropper", children: /* @__PURE__ */ e(z, { "aria-hidden": "true" }) })
|
|
238
|
+
] }),
|
|
239
|
+
/* @__PURE__ */ e("div", { className: r.cropStage, children: /* @__PURE__ */ e(
|
|
240
|
+
Y,
|
|
241
|
+
{
|
|
242
|
+
aspect: $,
|
|
243
|
+
crop: F,
|
|
244
|
+
keepSelection: !0,
|
|
245
|
+
minWidth: 160,
|
|
246
|
+
onChange: (t, u) => N(u),
|
|
247
|
+
onComplete: (t) => y(t),
|
|
248
|
+
ruleOfThirds: !0,
|
|
249
|
+
children: /* @__PURE__ */ e("img", { ref: B, src: p.url, alt: "", onLoad: (t) => H(t.currentTarget) })
|
|
250
|
+
}
|
|
251
|
+
) }),
|
|
252
|
+
w ? /* @__PURE__ */ e("p", { className: r.inlineError, children: w }) : null,
|
|
253
|
+
/* @__PURE__ */ a("div", { className: r.cropActions, children: [
|
|
254
|
+
/* @__PURE__ */ e("button", { className: r.secondaryButton, type: "button", onClick: L, children: "Cancel" }),
|
|
255
|
+
/* @__PURE__ */ e("button", { className: r.primaryButton, type: "button", onClick: () => {
|
|
256
|
+
O();
|
|
257
|
+
}, disabled: S || l, children: S || l ? "Uploading" : "Use cropped image" })
|
|
258
|
+
] })
|
|
259
|
+
] }) }) : null
|
|
260
|
+
] });
|
|
261
|
+
}
|
|
262
|
+
export {
|
|
263
|
+
pe as AdminItemDrawer
|
|
264
|
+
};
|
|
@@ -0,0 +1,63 @@
|
|
|
1
|
+
import { jsxs as d, jsx as e } from "react/jsx-runtime";
|
|
2
|
+
import { useSortable as f } from "@dnd-kit/react/sortable";
|
|
3
|
+
import { EyeOff as b, Loader2 as y, Pencil as N } from "lucide-react";
|
|
4
|
+
import { sortByOrder as B } from "../menu/menuOrdering.js";
|
|
5
|
+
import { cx as p } from "../utils.js";
|
|
6
|
+
import a from "./AdminMenuEditor.module.css.js";
|
|
7
|
+
import { imageSrc as I } from "../menu-browser/menuItemDisplay.js";
|
|
8
|
+
import { formatPrice as h } from "../menu/priceFormat.js";
|
|
9
|
+
function E({ index: m, isReordering: l, isUploadingImage: g, item: r, onEdit: n }) {
|
|
10
|
+
const c = !!r.image, s = B(r.sizes), o = r.pricingMode === "sizes" && s.length > 0, { isDragging: t, ref: u } = f({
|
|
11
|
+
id: `item:${r.id}`,
|
|
12
|
+
index: m,
|
|
13
|
+
group: `category:${r.categoryId}`,
|
|
14
|
+
data: { kind: "item", id: r.id, categoryId: r.categoryId },
|
|
15
|
+
disabled: !l,
|
|
16
|
+
transition: { idle: !0 }
|
|
17
|
+
});
|
|
18
|
+
return /* @__PURE__ */ d(
|
|
19
|
+
"article",
|
|
20
|
+
{
|
|
21
|
+
className: p(a.card, !c && a.noImageCard, l && a.reorderableCard, t && a.dragging, t && a.cardDragging),
|
|
22
|
+
ref: u,
|
|
23
|
+
tabIndex: l ? -1 : 0,
|
|
24
|
+
role: "button",
|
|
25
|
+
"aria-label": `Edit ${r.title}`,
|
|
26
|
+
onClick: () => {
|
|
27
|
+
l || n();
|
|
28
|
+
},
|
|
29
|
+
onKeyDown: (i) => {
|
|
30
|
+
l || (i.key === "Enter" || i.key === " ") && (i.preventDefault(), n());
|
|
31
|
+
},
|
|
32
|
+
children: [
|
|
33
|
+
r.isVisible ? null : /* @__PURE__ */ d("span", { className: p(a.cardBadge, a.hiddenBadge), children: [
|
|
34
|
+
/* @__PURE__ */ e(b, { "aria-hidden": "true" }),
|
|
35
|
+
"Hidden"
|
|
36
|
+
] }),
|
|
37
|
+
g ? /* @__PURE__ */ d("span", { className: a.cardBadge, children: [
|
|
38
|
+
/* @__PURE__ */ e(y, { "aria-hidden": "true", className: a.badgeSpinner }),
|
|
39
|
+
"Uploading"
|
|
40
|
+
] }) : null,
|
|
41
|
+
c ? /* @__PURE__ */ e("figure", { className: a.media, children: /* @__PURE__ */ e("img", { src: I(r.image), alt: "" }) }) : null,
|
|
42
|
+
/* @__PURE__ */ d("div", { className: a.cardBody, children: [
|
|
43
|
+
/* @__PURE__ */ d("header", { children: [
|
|
44
|
+
/* @__PURE__ */ e("h3", { children: r.title }),
|
|
45
|
+
o ? null : /* @__PURE__ */ e("span", { className: a.cardPrice, children: h(r.price) || "M.P." })
|
|
46
|
+
] }),
|
|
47
|
+
r.description ? /* @__PURE__ */ e("p", { children: r.description }) : null,
|
|
48
|
+
o ? /* @__PURE__ */ e("div", { className: a.variationTabs, "aria-label": `${r.title} prices`, children: s.map((i) => /* @__PURE__ */ d("div", { className: a.variationTab, children: [
|
|
49
|
+
/* @__PURE__ */ e("span", { children: i.label }),
|
|
50
|
+
/* @__PURE__ */ e("strong", { children: h(i.price) })
|
|
51
|
+
] }, i.id)) }) : null
|
|
52
|
+
] }),
|
|
53
|
+
l ? null : /* @__PURE__ */ e("span", { className: a.cardVeil, "aria-hidden": "true", children: /* @__PURE__ */ d("span", { className: a.editChip, children: [
|
|
54
|
+
/* @__PURE__ */ e(N, { "aria-hidden": "true" }),
|
|
55
|
+
"Edit item"
|
|
56
|
+
] }) })
|
|
57
|
+
]
|
|
58
|
+
}
|
|
59
|
+
);
|
|
60
|
+
}
|
|
61
|
+
export {
|
|
62
|
+
E as AdminMenuCard
|
|
63
|
+
};
|
|
@@ -0,0 +1,209 @@
|
|
|
1
|
+
const n = "_page_3n94h_1", e = "_header_3n94h_10", t = "_catalogActions_3n94h_20", o = "_drawerHeader_3n94h_21", a = "_syncStatus_3n94h_34", _ = "_headerActions_3n94h_42", r = "_authActions_3n94h_43", c = "_categoryTools_3n94h_44", i = "_drawerActions_3n94h_46", s = "_toolbarButtons_3n94h_47", d = "_primaryButton_3n94h_54", h = "_secondaryButton_3n94h_55", g = "_iconButton_3n94h_57", l = "_sizeHeader_3n94h_61", u = "_sizeRow_3n94h_62", p = "_menuEditor_3n94h_128", m = "_authPanel_3n94h_133", b = "_authForm_3n94h_166", w = "_authField_3n94h_173", k = "_controlStrip_3n94h_201", y = "_tabToolbar_3n94h_212", T = "_activeModeButton_3n94h_234", B = "_tabs_3n94h_239", P = "_tab_3n94h_212", I = "_editingTab_3n94h_265", S = "_activeTab_3n94h_269", v = "_dragging_3n94h_275", H = "_tabMain_3n94h_280", C = "_tabGlyph_3n94h_307", F = "_categoryHeading_3n94h_326", A = "_card_3n94h_45", D = "_fieldGroup_3n94h_330", E = "_catalog_3n94h_20", G = "_catalogButtons_3n94h_387", M = "_categoryBlock_3n94h_400", x = "_grid_3n94h_475", z = "_reorderableCard_3n94h_498", L = "_cardVeil_3n94h_502", O = "_editChip_3n94h_520", R = "_cardBadge_3n94h_538", f = "_hiddenBadge_3n94h_566", V = "_badgeSpinner_3n94h_570", j = "_cardDragging_3n94h_598", q = "_noImageCard_3n94h_609", J = "_media_3n94h_614", K = "_fileInput_3n94h_639", N = "_cardBody_3n94h_648", Q = "_cardPrice_3n94h_677", U = "_variationTabs_3n94h_702", W = "_variationTab_3n94h_702", X = "_emptyState_3n94h_745", Y = "_editorDrawer_3n94h_762", Z = "_drawerFields_3n94h_793", $ = "_drawerImageBlock_3n94h_801", nn = "_drawerMedia_3n94h_806", en = "_drawerMediaEmpty_3n94h_835", tn = "_drawerImageOverlay_3n94h_864", on = "_drawerImageTool_3n94h_889", an = "_dangerImageTool_3n94h_929", _n = "_inlineError_3n94h_944", rn = "_drawerTextarea_3n94h_952", cn = "_checkboxLabel_3n94h_977", sn = "_priceField_3n94h_1000", dn = "_currencyToggle_3n94h_1006", hn = "_selectedCurrency_3n94h_1032", gn = "_segmented_3n94h_1037", ln = "_selectedSegment_3n94h_1055", un = "_sizeEditor_3n94h_1060", pn = "_drawerPreview_3n94h_1104", mn = "_kebabButton_3n94h_1242", bn = "_menuContent_3n94h_1267", wn = "_menuItem_3n94h_1277", kn = "_menuItemDanger_3n94h_1307", yn = "_menuSeparator_3n94h_1315", Tn = "_sectionHiddenTag_3n94h_1321", Bn = "_reorderingGrid_3n94h_1338", Pn = "_managePanel_3n94h_1343", In = "_managePanelTitle_3n94h_1355", Sn = "_manageList_3n94h_1364", vn = "_groupRow_3n94h_1369", Hn = "_groupHandle_3n94h_1390", Cn = "_groupCount_3n94h_1421", Fn = "_groupDelete_3n94h_1431", An = "_managePanelFoot_3n94h_1460", Dn = "_iconPickerTrigger_3n94h_1471", En = "_iconPickerPanel_3n94h_1517", Gn = "_iconPickerTitle_3n94h_1527", Mn = "_iconPickerGrid_3n94h_1536", xn = "_iconPickerOption_3n94h_1542", zn = "_selectedIconPickerOption_3n94h_1569", Ln = "_cropHeader_3n94h_1601", On = "_cropActions_3n94h_1602", Rn = "_cropStage_3n94h_1617", fn = "_chipBox_3n94h_1671", Vn = "_chip_3n94h_1671", jn = "_chipField_3n94h_1727", qn = "_backupsDialog_3n94h_1743", Jn = "_backupsHeader_3n94h_1758", Kn = "_backupsList_3n94h_1780", Nn = "_backupRow_3n94h_1788", Qn = "_backupsEmpty_3n94h_1808", Un = "_viewSwitch_3n94h_1815", Wn = {
|
|
2
|
+
page: n,
|
|
3
|
+
header: e,
|
|
4
|
+
catalogActions: t,
|
|
5
|
+
drawerHeader: o,
|
|
6
|
+
syncStatus: a,
|
|
7
|
+
headerActions: _,
|
|
8
|
+
authActions: r,
|
|
9
|
+
categoryTools: c,
|
|
10
|
+
drawerActions: i,
|
|
11
|
+
toolbarButtons: s,
|
|
12
|
+
primaryButton: d,
|
|
13
|
+
secondaryButton: h,
|
|
14
|
+
iconButton: g,
|
|
15
|
+
sizeHeader: l,
|
|
16
|
+
sizeRow: u,
|
|
17
|
+
menuEditor: p,
|
|
18
|
+
authPanel: m,
|
|
19
|
+
authForm: b,
|
|
20
|
+
authField: w,
|
|
21
|
+
controlStrip: k,
|
|
22
|
+
tabToolbar: y,
|
|
23
|
+
activeModeButton: T,
|
|
24
|
+
tabs: B,
|
|
25
|
+
tab: P,
|
|
26
|
+
editingTab: I,
|
|
27
|
+
activeTab: S,
|
|
28
|
+
dragging: v,
|
|
29
|
+
tabMain: H,
|
|
30
|
+
tabGlyph: C,
|
|
31
|
+
categoryHeading: F,
|
|
32
|
+
card: A,
|
|
33
|
+
fieldGroup: D,
|
|
34
|
+
catalog: E,
|
|
35
|
+
catalogButtons: G,
|
|
36
|
+
categoryBlock: M,
|
|
37
|
+
grid: x,
|
|
38
|
+
reorderableCard: z,
|
|
39
|
+
cardVeil: L,
|
|
40
|
+
editChip: O,
|
|
41
|
+
cardBadge: R,
|
|
42
|
+
hiddenBadge: f,
|
|
43
|
+
badgeSpinner: V,
|
|
44
|
+
cardDragging: j,
|
|
45
|
+
noImageCard: q,
|
|
46
|
+
media: J,
|
|
47
|
+
fileInput: K,
|
|
48
|
+
cardBody: N,
|
|
49
|
+
cardPrice: Q,
|
|
50
|
+
variationTabs: U,
|
|
51
|
+
variationTab: W,
|
|
52
|
+
emptyState: X,
|
|
53
|
+
editorDrawer: Y,
|
|
54
|
+
drawerFields: Z,
|
|
55
|
+
drawerImageBlock: $,
|
|
56
|
+
drawerMedia: nn,
|
|
57
|
+
drawerMediaEmpty: en,
|
|
58
|
+
drawerImageOverlay: tn,
|
|
59
|
+
drawerImageTool: on,
|
|
60
|
+
dangerImageTool: an,
|
|
61
|
+
inlineError: _n,
|
|
62
|
+
drawerTextarea: rn,
|
|
63
|
+
checkboxLabel: cn,
|
|
64
|
+
priceField: sn,
|
|
65
|
+
currencyToggle: dn,
|
|
66
|
+
selectedCurrency: hn,
|
|
67
|
+
segmented: gn,
|
|
68
|
+
selectedSegment: ln,
|
|
69
|
+
sizeEditor: un,
|
|
70
|
+
drawerPreview: pn,
|
|
71
|
+
kebabButton: mn,
|
|
72
|
+
menuContent: bn,
|
|
73
|
+
menuItem: wn,
|
|
74
|
+
menuItemDanger: kn,
|
|
75
|
+
menuSeparator: yn,
|
|
76
|
+
sectionHiddenTag: Tn,
|
|
77
|
+
reorderingGrid: Bn,
|
|
78
|
+
managePanel: Pn,
|
|
79
|
+
managePanelTitle: In,
|
|
80
|
+
manageList: Sn,
|
|
81
|
+
groupRow: vn,
|
|
82
|
+
groupHandle: Hn,
|
|
83
|
+
groupCount: Cn,
|
|
84
|
+
groupDelete: Fn,
|
|
85
|
+
managePanelFoot: An,
|
|
86
|
+
iconPickerTrigger: Dn,
|
|
87
|
+
iconPickerPanel: En,
|
|
88
|
+
iconPickerTitle: Gn,
|
|
89
|
+
iconPickerGrid: Mn,
|
|
90
|
+
iconPickerOption: xn,
|
|
91
|
+
selectedIconPickerOption: zn,
|
|
92
|
+
cropHeader: Ln,
|
|
93
|
+
cropActions: On,
|
|
94
|
+
cropStage: Rn,
|
|
95
|
+
chipBox: fn,
|
|
96
|
+
chip: Vn,
|
|
97
|
+
chipField: jn,
|
|
98
|
+
backupsDialog: qn,
|
|
99
|
+
backupsHeader: Jn,
|
|
100
|
+
backupsList: Kn,
|
|
101
|
+
backupRow: Nn,
|
|
102
|
+
backupsEmpty: Qn,
|
|
103
|
+
viewSwitch: Un
|
|
104
|
+
};
|
|
105
|
+
export {
|
|
106
|
+
T as activeModeButton,
|
|
107
|
+
S as activeTab,
|
|
108
|
+
r as authActions,
|
|
109
|
+
w as authField,
|
|
110
|
+
b as authForm,
|
|
111
|
+
m as authPanel,
|
|
112
|
+
Nn as backupRow,
|
|
113
|
+
qn as backupsDialog,
|
|
114
|
+
Qn as backupsEmpty,
|
|
115
|
+
Jn as backupsHeader,
|
|
116
|
+
Kn as backupsList,
|
|
117
|
+
V as badgeSpinner,
|
|
118
|
+
A as card,
|
|
119
|
+
R as cardBadge,
|
|
120
|
+
N as cardBody,
|
|
121
|
+
j as cardDragging,
|
|
122
|
+
Q as cardPrice,
|
|
123
|
+
L as cardVeil,
|
|
124
|
+
E as catalog,
|
|
125
|
+
t as catalogActions,
|
|
126
|
+
G as catalogButtons,
|
|
127
|
+
M as categoryBlock,
|
|
128
|
+
F as categoryHeading,
|
|
129
|
+
c as categoryTools,
|
|
130
|
+
cn as checkboxLabel,
|
|
131
|
+
Vn as chip,
|
|
132
|
+
fn as chipBox,
|
|
133
|
+
jn as chipField,
|
|
134
|
+
k as controlStrip,
|
|
135
|
+
On as cropActions,
|
|
136
|
+
Ln as cropHeader,
|
|
137
|
+
Rn as cropStage,
|
|
138
|
+
dn as currencyToggle,
|
|
139
|
+
an as dangerImageTool,
|
|
140
|
+
Wn as default,
|
|
141
|
+
v as dragging,
|
|
142
|
+
i as drawerActions,
|
|
143
|
+
Z as drawerFields,
|
|
144
|
+
o as drawerHeader,
|
|
145
|
+
$ as drawerImageBlock,
|
|
146
|
+
tn as drawerImageOverlay,
|
|
147
|
+
on as drawerImageTool,
|
|
148
|
+
nn as drawerMedia,
|
|
149
|
+
en as drawerMediaEmpty,
|
|
150
|
+
pn as drawerPreview,
|
|
151
|
+
rn as drawerTextarea,
|
|
152
|
+
O as editChip,
|
|
153
|
+
I as editingTab,
|
|
154
|
+
Y as editorDrawer,
|
|
155
|
+
X as emptyState,
|
|
156
|
+
D as fieldGroup,
|
|
157
|
+
K as fileInput,
|
|
158
|
+
x as grid,
|
|
159
|
+
Cn as groupCount,
|
|
160
|
+
Fn as groupDelete,
|
|
161
|
+
Hn as groupHandle,
|
|
162
|
+
vn as groupRow,
|
|
163
|
+
e as header,
|
|
164
|
+
_ as headerActions,
|
|
165
|
+
f as hiddenBadge,
|
|
166
|
+
g as iconButton,
|
|
167
|
+
Mn as iconPickerGrid,
|
|
168
|
+
xn as iconPickerOption,
|
|
169
|
+
En as iconPickerPanel,
|
|
170
|
+
Gn as iconPickerTitle,
|
|
171
|
+
Dn as iconPickerTrigger,
|
|
172
|
+
_n as inlineError,
|
|
173
|
+
mn as kebabButton,
|
|
174
|
+
Sn as manageList,
|
|
175
|
+
Pn as managePanel,
|
|
176
|
+
An as managePanelFoot,
|
|
177
|
+
In as managePanelTitle,
|
|
178
|
+
J as media,
|
|
179
|
+
bn as menuContent,
|
|
180
|
+
p as menuEditor,
|
|
181
|
+
wn as menuItem,
|
|
182
|
+
kn as menuItemDanger,
|
|
183
|
+
yn as menuSeparator,
|
|
184
|
+
q as noImageCard,
|
|
185
|
+
n as page,
|
|
186
|
+
sn as priceField,
|
|
187
|
+
d as primaryButton,
|
|
188
|
+
z as reorderableCard,
|
|
189
|
+
Bn as reorderingGrid,
|
|
190
|
+
h as secondaryButton,
|
|
191
|
+
Tn as sectionHiddenTag,
|
|
192
|
+
gn as segmented,
|
|
193
|
+
hn as selectedCurrency,
|
|
194
|
+
zn as selectedIconPickerOption,
|
|
195
|
+
ln as selectedSegment,
|
|
196
|
+
un as sizeEditor,
|
|
197
|
+
l as sizeHeader,
|
|
198
|
+
u as sizeRow,
|
|
199
|
+
a as syncStatus,
|
|
200
|
+
P as tab,
|
|
201
|
+
C as tabGlyph,
|
|
202
|
+
H as tabMain,
|
|
203
|
+
y as tabToolbar,
|
|
204
|
+
B as tabs,
|
|
205
|
+
s as toolbarButtons,
|
|
206
|
+
W as variationTab,
|
|
207
|
+
U as variationTabs,
|
|
208
|
+
Un as viewSwitch
|
|
209
|
+
};
|
|
@@ -0,0 +1,43 @@
|
|
|
1
|
+
import { jsx as i, jsxs as b } from "react/jsx-runtime";
|
|
2
|
+
import { menuIcons as u } from "../menu/menuIcons.js";
|
|
3
|
+
import { cx as d } from "../utils.js";
|
|
4
|
+
import e from "./AdminMenuEditor.module.css.js";
|
|
5
|
+
function T({ activeGroupId: r, editingGroupId: o, groups: m, onSelectGroup: h, onSetEditingGroupId: n, onUpdateGroup: f }) {
|
|
6
|
+
return /* @__PURE__ */ i("div", { className: e.tabs, role: "tablist", "aria-label": "Menu groups", children: m.map((a) => {
|
|
7
|
+
const s = u[a.icon], l = a.id === r, c = a.id === "all";
|
|
8
|
+
return o === a.id ? /* @__PURE__ */ b("div", { className: d(e.tab, e.editingTab, l && e.activeTab), role: "tab", "aria-selected": l, children: [
|
|
9
|
+
/* @__PURE__ */ i(s, { "aria-hidden": "true", className: e.tabGlyph }),
|
|
10
|
+
/* @__PURE__ */ i(
|
|
11
|
+
"input",
|
|
12
|
+
{
|
|
13
|
+
"aria-label": `${a.label} tab label`,
|
|
14
|
+
autoFocus: !0,
|
|
15
|
+
value: a.label,
|
|
16
|
+
onChange: (t) => f(a.id, { label: t.target.value }),
|
|
17
|
+
onKeyDown: (t) => {
|
|
18
|
+
(t.key === "Enter" || t.key === "Escape") && n("");
|
|
19
|
+
}
|
|
20
|
+
}
|
|
21
|
+
)
|
|
22
|
+
] }, a.id) : /* @__PURE__ */ i("div", { className: d(e.tab, l && e.activeTab), role: "tab", "aria-selected": l, children: /* @__PURE__ */ b(
|
|
23
|
+
"button",
|
|
24
|
+
{
|
|
25
|
+
className: e.tabMain,
|
|
26
|
+
type: "button",
|
|
27
|
+
onClick: () => h(a.id),
|
|
28
|
+
onDoubleClick: () => {
|
|
29
|
+
c || n(a.id);
|
|
30
|
+
},
|
|
31
|
+
"aria-label": `Show ${a.label}`,
|
|
32
|
+
title: c ? void 0 : "Double-click to rename",
|
|
33
|
+
children: [
|
|
34
|
+
/* @__PURE__ */ i(s, { "aria-hidden": "true", className: e.tabGlyph }),
|
|
35
|
+
/* @__PURE__ */ i("span", { children: a.label })
|
|
36
|
+
]
|
|
37
|
+
}
|
|
38
|
+
) }, a.id);
|
|
39
|
+
}) });
|
|
40
|
+
}
|
|
41
|
+
export {
|
|
42
|
+
T as AdminMenuGroupTabs
|
|
43
|
+
};
|