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.
Files changed (164) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +488 -0
  3. package/dist/RestaurantSiteRoutes.js +23 -0
  4. package/dist/admin/AdminActionMenu.js +29 -0
  5. package/dist/admin/AdminAuthPanel.js +53 -0
  6. package/dist/admin/AdminBackupsDialog.js +54 -0
  7. package/dist/admin/AdminDraftProvider.js +10 -0
  8. package/dist/admin/AdminGroupsPanel.js +68 -0
  9. package/dist/admin/AdminItemDrawer.js +264 -0
  10. package/dist/admin/AdminMenuCard.js +63 -0
  11. package/dist/admin/AdminMenuEditor.module.css.js +209 -0
  12. package/dist/admin/AdminMenuGroupTabs.js +43 -0
  13. package/dist/admin/AdminMenuIconPicker.js +39 -0
  14. package/dist/admin/AdminRoutes.js +13 -0
  15. package/dist/admin/AdminSectionEditor.js +104 -0
  16. package/dist/admin/AdminTestimonialsPanel.js +214 -0
  17. package/dist/admin/AdminTestimonialsPanel.module.css.js +29 -0
  18. package/dist/admin/adminDraftContext.js +5 -0
  19. package/dist/admin/adminEditorUtils.js +47 -0
  20. package/dist/admin/adminMenuCommands.js +83 -0
  21. package/dist/admin/useAdminDraft.js +14 -0
  22. package/dist/admin/useAdminMenuDraft.js +226 -0
  23. package/dist/cart/CartDrawer.js +87 -0
  24. package/dist/cart/CartDrawer.module.css.js +47 -0
  25. package/dist/cart/CartProvider.js +31 -0
  26. package/dist/cart/cartContext.js +5 -0
  27. package/dist/cart/cartOrder.js +34 -0
  28. package/dist/cart/cartReducer.js +57 -0
  29. package/dist/cart/useCart.js +10 -0
  30. package/dist/components/Brand.js +16 -0
  31. package/dist/components/Brand.module.css.js +15 -0
  32. package/dist/components/Footer.js +19 -0
  33. package/dist/components/Footer.module.css.js +11 -0
  34. package/dist/components/Header.js +34 -0
  35. package/dist/components/Header.module.css.js +19 -0
  36. package/dist/components/Hero.js +23 -0
  37. package/dist/components/Hero.module.css.js +15 -0
  38. package/dist/components/InstagramIcon.js +27 -0
  39. package/dist/components/LocationsSection.js +34 -0
  40. package/dist/components/LocationsSection.module.css.js +17 -0
  41. package/dist/components/Marquee.js +10 -0
  42. package/dist/components/Marquee.module.css.js +9 -0
  43. package/dist/components/OrderIcon.js +11 -0
  44. package/dist/components/RatingSection.js +32 -0
  45. package/dist/components/RatingSection.module.css.js +19 -0
  46. package/dist/components/TestimonialsSection.js +73 -0
  47. package/dist/components/TestimonialsSection.module.css.js +37 -0
  48. package/dist/components/WhatsAppIcon.js +13 -0
  49. package/dist/config/RestaurantKitProvider.js +26 -0
  50. package/dist/config/siteConfigContext.js +23 -0
  51. package/dist/config/useOrdering.js +12 -0
  52. package/dist/index.js +92 -0
  53. package/dist/menu/localMenuApi.js +43 -0
  54. package/dist/menu/menuApi.js +121 -0
  55. package/dist/menu/menuDraftStorage.js +35 -0
  56. package/dist/menu/menuIcons.js +24 -0
  57. package/dist/menu/menuMutations.js +99 -0
  58. package/dist/menu/menuOrdering.js +94 -0
  59. package/dist/menu/menuSchema.js +4 -0
  60. package/dist/menu/priceFormat.js +39 -0
  61. package/dist/menu/useMenuData.js +38 -0
  62. package/dist/menu/validateMenu.js +63 -0
  63. package/dist/menu-browser/MenuBrowser.js +54 -0
  64. package/dist/menu-browser/MenuBrowser.module.css.js +153 -0
  65. package/dist/menu-browser/MenuCard.js +106 -0
  66. package/dist/menu-browser/MenuCartDrawer.js +18 -0
  67. package/dist/menu-browser/MenuCategoryBlock.js +45 -0
  68. package/dist/menu-browser/MenuItemSheet.js +132 -0
  69. package/dist/menu-browser/MenuLightbox.js +33 -0
  70. package/dist/menu-browser/MenuRow.js +43 -0
  71. package/dist/menu-browser/MenuSection.js +10 -0
  72. package/dist/menu-browser/menuItemDisplay.js +19 -0
  73. package/dist/menu-browser/useMediaQuery.js +19 -0
  74. package/dist/menu-browser/useMenuBrowserState.js +82 -0
  75. package/dist/menu-browser/useParkedSheet.js +32 -0
  76. package/dist/pages/AdminMenuEditor.js +291 -0
  77. package/dist/pages/AdminPreview.js +43 -0
  78. package/dist/pages/AdminPreview.module.css.js +9 -0
  79. package/dist/pages/MenuSite.js +40 -0
  80. package/dist/restaurant-kit.css +1 -0
  81. package/dist/testimonials/downscaleImage.js +14 -0
  82. package/dist/testimonials/testimonialMutations.js +52 -0
  83. package/dist/types/RestaurantSiteRoutes.d.ts +11 -0
  84. package/dist/types/admin/AdminActionMenu.d.ts +20 -0
  85. package/dist/types/admin/AdminAuthPanel.d.ts +13 -0
  86. package/dist/types/admin/AdminBackupsDialog.d.ts +9 -0
  87. package/dist/types/admin/AdminDraftProvider.d.ts +12 -0
  88. package/dist/types/admin/AdminGroupsPanel.d.ts +14 -0
  89. package/dist/types/admin/AdminItemDrawer.d.ts +16 -0
  90. package/dist/types/admin/AdminMenuCard.d.ts +10 -0
  91. package/dist/types/admin/AdminMenuGroupTabs.d.ts +11 -0
  92. package/dist/types/admin/AdminMenuIconPicker.d.ts +8 -0
  93. package/dist/types/admin/AdminRoutes.d.ts +5 -0
  94. package/dist/types/admin/AdminSectionEditor.d.ts +20 -0
  95. package/dist/types/admin/AdminTestimonialsPanel.d.ts +7 -0
  96. package/dist/types/admin/adminDraftContext.d.ts +2 -0
  97. package/dist/types/admin/adminEditorUtils.d.ts +22 -0
  98. package/dist/types/admin/adminMenuCommands.d.ts +73 -0
  99. package/dist/types/admin/useAdminDraft.d.ts +5 -0
  100. package/dist/types/admin/useAdminMenuDraft.d.ts +41 -0
  101. package/dist/types/cart/CartDrawer.d.ts +7 -0
  102. package/dist/types/cart/CartProvider.d.ts +4 -0
  103. package/dist/types/cart/cartContext.d.ts +2 -0
  104. package/dist/types/cart/cartOrder.d.ts +9 -0
  105. package/dist/types/cart/cartReducer.d.ts +36 -0
  106. package/dist/types/cart/cartTypes.d.ts +37 -0
  107. package/dist/types/cart/useCart.d.ts +1 -0
  108. package/dist/types/components/Brand.d.ts +5 -0
  109. package/dist/types/components/Footer.d.ts +1 -0
  110. package/dist/types/components/Header.d.ts +1 -0
  111. package/dist/types/components/Hero.d.ts +1 -0
  112. package/dist/types/components/InstagramIcon.d.ts +6 -0
  113. package/dist/types/components/LocationsSection.d.ts +1 -0
  114. package/dist/types/components/Marquee.d.ts +1 -0
  115. package/dist/types/components/OrderIcon.d.ts +4 -0
  116. package/dist/types/components/RatingSection.d.ts +1 -0
  117. package/dist/types/components/TestimonialsSection.d.ts +2 -0
  118. package/dist/types/components/WhatsAppIcon.d.ts +5 -0
  119. package/dist/types/config/RestaurantKitProvider.d.ts +24 -0
  120. package/dist/types/config/siteConfigContext.d.ts +28 -0
  121. package/dist/types/config/siteTypes.d.ts +50 -0
  122. package/dist/types/config/useOrdering.d.ts +16 -0
  123. package/dist/types/index.d.ts +38 -0
  124. package/dist/types/menu/localMenuApi.d.ts +9 -0
  125. package/dist/types/menu/menuApi.d.ts +68 -0
  126. package/dist/types/menu/menuDraftStorage.d.ts +5 -0
  127. package/dist/types/menu/menuIcons.d.ts +7 -0
  128. package/dist/types/menu/menuMutations.d.ts +13 -0
  129. package/dist/types/menu/menuOrdering.d.ts +38 -0
  130. package/dist/types/menu/menuSchema.d.ts +68 -0
  131. package/dist/types/menu/priceFormat.d.ts +8 -0
  132. package/dist/types/menu/useMenuData.d.ts +12 -0
  133. package/dist/types/menu/validateMenu.d.ts +16 -0
  134. package/dist/types/menu-browser/MenuBrowser.d.ts +6 -0
  135. package/dist/types/menu-browser/MenuCard.d.ts +7 -0
  136. package/dist/types/menu-browser/MenuCartDrawer.d.ts +5 -0
  137. package/dist/types/menu-browser/MenuCategoryBlock.d.ts +11 -0
  138. package/dist/types/menu-browser/MenuItemSheet.d.ts +10 -0
  139. package/dist/types/menu-browser/MenuLightbox.d.ts +9 -0
  140. package/dist/types/menu-browser/MenuRow.d.ts +7 -0
  141. package/dist/types/menu-browser/MenuSection.d.ts +1 -0
  142. package/dist/types/menu-browser/menuItemDisplay.d.ts +5 -0
  143. package/dist/types/menu-browser/useMediaQuery.d.ts +1 -0
  144. package/dist/types/menu-browser/useMenuBrowserState.d.ts +17 -0
  145. package/dist/types/menu-browser/useParkedSheet.d.ts +13 -0
  146. package/dist/types/pages/AdminMenuEditor.d.ts +1 -0
  147. package/dist/types/pages/AdminPreview.d.ts +1 -0
  148. package/dist/types/pages/MenuSite.d.ts +6 -0
  149. package/dist/types/testimonials/downscaleImage.d.ts +6 -0
  150. package/dist/types/testimonials/testimonialMutations.d.ts +9 -0
  151. package/dist/types/utils.d.ts +1 -0
  152. package/dist/types/worker/auth.d.ts +97 -0
  153. package/dist/types/worker/http.d.ts +17 -0
  154. package/dist/types/worker/index.d.ts +16 -0
  155. package/dist/types/worker/menuStorage.d.ts +94 -0
  156. package/dist/utils.js +6 -0
  157. package/dist/worker/auth.js +183 -0
  158. package/dist/worker/http.js +65 -0
  159. package/dist/worker/menuStorage.js +95 -0
  160. package/dist/worker.js +131 -0
  161. package/package.json +105 -0
  162. package/scripts/bootstrap-site.mjs +125 -0
  163. package/scripts/hash-admin-password.mjs +11 -0
  164. 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
+ };