@feedmepos/mf-miniprogram-v2 0.2.8-dev.3 → 0.2.8-dev.5

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 (27) hide show
  1. package/dist/{App-h0NGA3Bx.js → App-CFKKclWT.js} +2 -2
  2. package/dist/{BrandFontPicker-sTKNoOX3.js → BrandFontPicker-VX2LAN2w.js} +1 -1
  3. package/dist/{BrandKitView-DpeuJ5Mj.js → BrandKitView-CB7kcVy2.js} +2 -2
  4. package/dist/{ControlPlaneView-7i6SXbEK.js → ControlPlaneView-DhAZbPoA.js} +11085 -10070
  5. package/dist/{EcosystemView-BUG7Dp_e.js → EcosystemView-hqiZRHIC.js} +5 -5
  6. package/dist/MobileProjectDialog-CZWx6IYl.js +430 -0
  7. package/dist/MobileProjectsView-BlQQvHCc.js +232 -0
  8. package/dist/{ModuleCenterView-DdExY27I.js → ModuleCenterView-CY8o1GJG.js} +1 -1
  9. package/dist/{ModuleDetailView-2ZG2PgWE.js → ModuleDetailView-BuZgg6e0.js} +1 -1
  10. package/dist/{PagesView-CNnihrLK.js → PagesView-3KDcHMIh.js} +1 -1
  11. package/dist/{PortalSettingsView-tEQ8--VB.js → PortalSettingsView-BVgkeXpL.js} +2 -2
  12. package/dist/StatusBadge.vue_vue_type_script_setup_true_lang-DMm_s9ua.js +41 -0
  13. package/dist/{TemplateCenterView-BjuZj_3I.js → TemplateCenterView-UQ03rcwn.js} +2 -2
  14. package/dist/{WorkspaceEntryView-aesHR5VT.js → WorkspaceEntryView-BMrZWby1.js} +1 -1
  15. package/dist/{adminAccess-Bud1ltTs.js → adminAccess-B8pYZwW9.js} +2 -2
  16. package/dist/app.js +11 -11
  17. package/dist/{controlPlane--Q2ulw38.js → controlPlane-DR5ykj4d.js} +8 -8
  18. package/dist/package.json +1 -1
  19. package/dist/{portalContext-CzdVaxBH.js → portalContext-BKjPuVfn.js} +2 -2
  20. package/dist/{routes-CJa85dEy.js → routes-i1Lpq1LK.js} +29 -25
  21. package/dist/style.css +1 -1
  22. package/dist/{useBrandKit-Cw3bBugv.js → useBrandKit-CKn1fm2o.js} +1 -1
  23. package/dist/{useModuleCatalog-n2zRBLFf.js → useModuleCatalog-u7EWW11V.js} +2 -2
  24. package/package.json +1 -1
  25. package/dist/AppTemplatePicker.vue_vue_type_script_setup_true_lang-BeNabALJ.js +0 -270
  26. package/dist/MobileProjectsView-DP_MBdDX.js +0 -400
  27. package/dist/StatusBadge.vue_vue_type_script_setup_true_lang-CMgQ0bd_.js +0 -30
@@ -0,0 +1,232 @@
1
+ import { defineComponent as L, ref as w, computed as C, h as o, withModifiers as j, onMounted as R, onScopeDispose as V, resolveComponent as S, openBlock as r, createElementBlock as n, createElementVNode as a, createTextVNode as I, toDisplayString as M, createCommentVNode as z, createBlock as q, createVNode as _, unref as h } from "vue";
2
+ import { useRoute as D, useRouter as A } from "vue-router";
3
+ import { components as T, useDialog as $ } from "@feedmepos/ui-library";
4
+ import { a as E } from "./routes-i1Lpq1LK.js";
5
+ import { c as O, e as U } from "./controlPlane-DR5ykj4d.js";
6
+ import { u as Y } from "./portalContext-BKjPuVfn.js";
7
+ import { w as d } from "./portalNavigation-L5VwKlps.js";
8
+ import { p as G, M as H } from "./MobileProjectDialog-CZWx6IYl.js";
9
+ import { _ as k } from "./StatusBadge.vue_vue_type_script_setup_true_lang-DMm_s9ua.js";
10
+ import { _ as J } from "./_plugin-vue_export-helper-CHgC5LLL.js";
11
+ const K = { class: "portal-page" }, Q = { class: "portal-page-inner" }, W = { class: "portal-page-heading" }, X = {
12
+ key: 0,
13
+ class: "mobile-projects__count"
14
+ }, Z = {
15
+ key: 0,
16
+ class: "portal-error",
17
+ role: "alert"
18
+ }, ee = {
19
+ key: 1,
20
+ role: "status"
21
+ }, te = {
22
+ key: 2,
23
+ class: "portal-empty"
24
+ }, oe = {
25
+ key: 3,
26
+ class: "rounded-2xl border border-portal-border-default bg-portal-bg-default",
27
+ "aria-label": "Mobile projects"
28
+ }, re = /* @__PURE__ */ L({
29
+ __name: "MobileProjectsView",
30
+ setup(ae) {
31
+ const { FmButton: m } = T, x = Y(), s = D(), i = A(), v = $(), l = w([]), p = w(!0), c = w(""), f = new AbortController();
32
+ async function g() {
33
+ p.value = !0, c.value = "";
34
+ try {
35
+ const t = await O(E.projects(x.businessId.value), {
36
+ signal: f.signal
37
+ });
38
+ l.value = t.projects;
39
+ } catch (t) {
40
+ f.signal.aborted || (c.value = U(t));
41
+ } finally {
42
+ p.value = !1;
43
+ }
44
+ }
45
+ function u(t) {
46
+ v.open({
47
+ title: t ? "Rename project" : "New Mobile project",
48
+ // MobileProjectDialog draws its own header (a step title, plus the
49
+ // template step's search box) and its own Cancel/Next/Back/Create
50
+ // buttons — FmDynamicDialog's default close icon is absolutely
51
+ // positioned in the dialog's own top-right corner regardless of what
52
+ // dialogComponent puts there, so left on it sits on top of the search
53
+ // box instead of a page area with room reserved for it (same fix as
54
+ // PreviewPanel.vue's openLibraryExpandDialog).
55
+ closeButton: !1,
56
+ dialogComponent: H,
57
+ dialogComponentProps: {
58
+ businessId: x.businessId.value,
59
+ projectId: t == null ? void 0 : t.projectId,
60
+ initialName: t == null ? void 0 : t.name,
61
+ onClose: () => v.close(),
62
+ onSaved: (e) => {
63
+ v.close(), t ? g() : i.push(d(e.projectId, "workspace", s.query, { setup: !0 }));
64
+ }
65
+ }
66
+ });
67
+ }
68
+ function N(t) {
69
+ return new Intl.DateTimeFormat(void 0, { dateStyle: "medium", timeStyle: "short" }).format(new Date(t));
70
+ }
71
+ const P = C(() => [
72
+ {
73
+ id: "project",
74
+ header: () => "Project",
75
+ cell: (t) => {
76
+ const e = t.row.original;
77
+ return o("div", { class: "flex min-w-0 flex-col gap-2" }, [
78
+ o("span", { class: "truncate fm-typo-en-body-md-600 text-portal-text-primary" }, e.name),
79
+ o(
80
+ "span",
81
+ { class: "fm-typo-en-body-sm-400 text-portal-text-muted", title: e.projectId },
82
+ `…${e.projectId.slice(-6)}`
83
+ )
84
+ ]);
85
+ }
86
+ },
87
+ {
88
+ id: "setup",
89
+ header: () => "Setup",
90
+ size: 130,
91
+ enableSorting: !1,
92
+ cell: (t) => o(
93
+ k,
94
+ { variant: t.row.original.provisioningStatus === "failed" ? "error" : "neutral", size: "sm" },
95
+ () => G(t.row.original.provisioningStatus)
96
+ )
97
+ },
98
+ {
99
+ id: "live",
100
+ header: () => "Live",
101
+ size: 200,
102
+ enableSorting: !1,
103
+ // Badges only. The muted sentence this replaces ("Unpublished release
104
+ // available") was the one thing in the row set in prose, and prose in a 200px
105
+ // column wraps — which is what made the cell look crowded. The state it
106
+ // carried is worth keeping, so it becomes a second tag rather than going away:
107
+ // it is the only place in this list that shows a merchant they have work built
108
+ // and waiting to go live.
109
+ //
110
+ // Nothing is rendered for a project with no pending release. That is the
111
+ // resting state of most rows, and a tag saying so would be back to filling the
112
+ // column with "nothing happened".
113
+ cell: (t) => {
114
+ const e = t.row.original;
115
+ return o("div", { class: "flex flex-wrap items-center gap-4" }, [
116
+ // "Live project" in a column headed Live said the word twice, and cost the
117
+ // width that made the line below it wrap.
118
+ o(
119
+ k,
120
+ { variant: e.isLive ? "success" : "neutral", size: "sm" },
121
+ () => e.isLive ? "Live" : "Not live"
122
+ ),
123
+ // `=== true` rather than truthiness: the field is optional in the contract,
124
+ // and an absent value means the state is unknown, not that it is false.
125
+ // This endpoint always sends a boolean, so that is a contract-level
126
+ // possibility rather than one a merchant meets.
127
+ e.hasUnpublishedRelease === !0 ? o(
128
+ k,
129
+ { variant: "warning", size: "sm", title: "A release is built and waiting to be published" },
130
+ () => "Unpublished"
131
+ ) : null
132
+ ]);
133
+ }
134
+ },
135
+ {
136
+ id: "updatedAt",
137
+ header: () => "Last edited",
138
+ size: 170,
139
+ enableSorting: !1,
140
+ cell: (t) => o("span", { class: "fm-typo-en-body-sm-400 text-portal-text-muted" }, N(t.row.original.updatedAt))
141
+ },
142
+ {
143
+ id: "actions",
144
+ header: () => "",
145
+ size: 340,
146
+ enableSorting: !1,
147
+ cell: (t) => {
148
+ const e = t.row.original;
149
+ return o("div", { class: "flex flex-wrap items-center justify-end gap-4" }, [
150
+ e.provisioningStatus === "ready" ? o(m, {
151
+ icon: "deployed_code",
152
+ variant: "tertiary",
153
+ title: "View releases",
154
+ onClick: j(
155
+ () => i.push(d(e.projectId, "releases", s.query)),
156
+ ["stop"]
157
+ )
158
+ }) : null,
159
+ o(m, {
160
+ label: "Rename",
161
+ variant: "tertiary",
162
+ onClick: j(() => u(e), ["stop"])
163
+ }),
164
+ o(m, {
165
+ label: e.provisioningStatus === "ready" ? "Open editor" : "Continue setup",
166
+ variant: "secondary",
167
+ onClick: j(
168
+ () => i.push(d(e.projectId, "workspace", s.query)),
169
+ ["stop"]
170
+ )
171
+ })
172
+ ]);
173
+ }
174
+ }
175
+ ]), B = C(() => !p.value && l.value.length > 0);
176
+ return R(() => {
177
+ if (g(), s.query.create === "1") {
178
+ const { create: t, ...e } = s.query;
179
+ i.replace({ query: e }), u();
180
+ }
181
+ }), V(() => f.abort()), (t, e) => {
182
+ const b = S("FmButton"), F = S("FmTable");
183
+ return r(), n("div", K, [
184
+ a("div", Q, [
185
+ a("header", W, [
186
+ a("div", null, [
187
+ e[4] || (e[4] = a("p", { class: "portal-eyebrow" }, "Mobile Ordering", -1)),
188
+ a("h1", null, [
189
+ e[3] || (e[3] = I("Projects ", -1)),
190
+ p.value ? z("", !0) : (r(), n("span", X, M(l.value.length), 1))
191
+ ])
192
+ ]),
193
+ B.value ? (r(), q(b, {
194
+ key: 0,
195
+ label: "New project",
196
+ icon: "add",
197
+ onClick: e[0] || (e[0] = (y) => u())
198
+ })) : z("", !0)
199
+ ]),
200
+ c.value ? (r(), n("p", Z, [
201
+ I(M(c.value) + " ", 1),
202
+ _(b, {
203
+ label: "Retry",
204
+ variant: "tertiary",
205
+ onClick: g
206
+ })
207
+ ])) : p.value ? (r(), n("p", ee, "Loading projects…")) : l.value.length ? (r(), n("section", oe, [
208
+ _(F, {
209
+ "column-defs": P.value,
210
+ "row-data": l.value,
211
+ "page-size": l.value.length,
212
+ "hide-footer": "",
213
+ "pin-header-row": "",
214
+ onRowClick: e[2] || (e[2] = (y) => h(i).push(h(d)(y.original.projectId, "workspace", h(s).query)))
215
+ }, null, 8, ["column-defs", "row-data", "page-size"])
216
+ ])) : (r(), n("section", te, [
217
+ e[5] || (e[5] = a("h2", null, "Your first Mobile project", -1)),
218
+ e[6] || (e[6] = a("p", null, "Create an app from a template to start editing.", -1)),
219
+ _(b, {
220
+ label: "New project",
221
+ icon: "add",
222
+ onClick: e[1] || (e[1] = (y) => u())
223
+ })
224
+ ]))
225
+ ])
226
+ ]);
227
+ };
228
+ }
229
+ }), fe = /* @__PURE__ */ J(re, [["__scopeId", "data-v-66c90eec"]]);
230
+ export {
231
+ fe as default
232
+ };
@@ -1,7 +1,7 @@
1
1
  import { defineComponent as N, openBlock as o, createElementBlock as l, createElementVNode as s, toDisplayString as u, createCommentVNode as q, ref as V, watch as R, computed as h, onMounted as z, resolveComponent as x, createVNode as v, unref as c, Fragment as C, renderList as $, normalizeClass as D, createBlock as k, withCtx as G } from "vue";
2
2
  import { useRoute as K, useRouter as O } from "vue-router";
3
3
  import { _ as B } from "./_plugin-vue_export-helper-CHgC5LLL.js";
4
- import { u as P, c as U, f as j, _ as b, t as H } from "./useModuleCatalog-n2zRBLFf.js";
4
+ import { u as P, c as U, f as j, _ as b, t as H } from "./useModuleCatalog-u7EWW11V.js";
5
5
  const J = { class: "card" }, Q = { class: "card__head" }, W = { class: "card__name fm-typo-en-body-md-600 text-portal-text-primary" }, X = { class: "card__version fm-typo-en-body-sm-400 text-portal-text-muted" }, Y = { class: "card__description fm-typo-en-body-sm-400 text-portal-text-muted" }, Z = { class: "card__tags" }, ee = { class: "card__tag card__tag--tier fm-typo-en-body-sm-600" }, te = {
6
6
  key: 0,
7
7
  class: "card__tag card__tag--slot fm-typo-en-body-sm-400"
@@ -1,6 +1,6 @@
1
1
  import { defineComponent as C, ref as M, computed as u, watch as T, resolveComponent as g, openBlock as n, createElementBlock as l, createElementVNode as e, toDisplayString as i, createCommentVNode as _, Fragment as I, renderList as S, createVNode as k, onMounted as B, unref as d, withCtx as L, createBlock as v } from "vue";
2
2
  import { useRoute as N, useRouter as P } from "vue-router";
3
- import { m as q, i as A, u as F, _ as w } from "./useModuleCatalog-n2zRBLFf.js";
3
+ import { m as q, i as A, u as F, _ as w } from "./useModuleCatalog-u7EWW11V.js";
4
4
  import { useDialog as V } from "@feedmepos/ui-library";
5
5
  import { _ as E } from "./_plugin-vue_export-helper-CHgC5LLL.js";
6
6
  const R = { class: "detail" }, j = { class: "detail__head" }, z = { class: "detail__name fm-typo-en-title-sm-600 text-portal-text-primary" }, K = { class: "detail__version fm-typo-en-body-md-400 text-portal-text-muted" }, O = {
@@ -1,6 +1,6 @@
1
1
  import { defineComponent as p, resolveComponent as i, openBlock as l, createElementBlock as m, createElementVNode as o, createVNode as r, unref as t, withCtx as u, createTextVNode as c } from "vue";
2
2
  import { useRoute as d } from "vue-router";
3
- import { u as g } from "./portalContext-CzdVaxBH.js";
3
+ import { u as g } from "./portalContext-BKjPuVfn.js";
4
4
  import { w as f } from "./portalNavigation-L5VwKlps.js";
5
5
  import { P as k } from "./PortalIcon-DO0VrIoY.js";
6
6
  const w = { class: "portal-page" }, y = { class: "portal-page-inner" }, b = { class: "portal-section portal-empty" }, E = /* @__PURE__ */ p({
@@ -1,9 +1,9 @@
1
1
  import { defineComponent as k, computed as p, ref as i, onMounted as P, onScopeDispose as S, resolveComponent as x, openBlock as o, createElementBlock as n, createElementVNode as s, toDisplayString as d, createCommentVNode as h, Fragment as I, createVNode as A, unref as M } from "vue";
2
2
  import { useRoute as N } from "vue-router";
3
3
  import { e as _, a as $ } from "./index-CIJWcl_6.js";
4
- import { m as B, e as E } from "./controlPlane--Q2ulw38.js";
4
+ import { m as B, e as E } from "./controlPlane-DR5ykj4d.js";
5
5
  import { useCoreStore as F } from "@feedmepos/mf-common";
6
- import { u as U } from "./portalContext-CzdVaxBH.js";
6
+ import { u as U } from "./portalContext-BKjPuVfn.js";
7
7
  import { b as V } from "./portalNavigation-L5VwKlps.js";
8
8
  import { _ as q } from "./_plugin-vue_export-helper-CHgC5LLL.js";
9
9
  const L = { class: "portal-page" }, R = { class: "portal-page-inner settings-page" }, T = { class: "portal-page-heading" }, D = ["href"], H = {
@@ -0,0 +1,41 @@
1
+ import { defineComponent as c, computed as m, openBlock as o, createElementBlock as r, normalizeClass as i, createElementVNode as x, createCommentVNode as d, renderSlot as f } from "vue";
2
+ const u = {
3
+ key: 0,
4
+ class: "flex h-[14px] w-[14px] shrink-0 items-center justify-center",
5
+ "aria-hidden": "true"
6
+ }, y = /* @__PURE__ */ c({
7
+ __name: "StatusBadge",
8
+ props: {
9
+ variant: { default: "neutral" },
10
+ size: { default: "md" },
11
+ dot: { type: Boolean }
12
+ },
13
+ setup(e) {
14
+ const n = e, s = {
15
+ success: "bg-fm-color-system-success-100 text-fm-color-typo-success",
16
+ warning: "bg-fm-color-system-warning-100 text-fm-color-typo-warning",
17
+ error: "bg-fm-color-system-error-100 text-fm-color-typo-error",
18
+ info: "bg-fm-color-system-info-100 text-fm-color-typo-info",
19
+ neutral: "bg-fm-color-neutral-gray-100 text-fm-color-typo-secondary",
20
+ // Figma `badge/bg/stone` on `badge/text/on-stone`: a resting state, cooler and
21
+ // lighter than neutral grey, so it recedes beside an Active row.
22
+ stone: "bg-portal-badge-stone-bg text-portal-badge-stone-text",
23
+ primary: "bg-fm-color-primary text-fm-color-typo-white"
24
+ }, a = {
25
+ xs: "rounded-[4px] px-[4px] py-[2px] text-[10px] leading-[14px] font-medium tracking-[0.2px]",
26
+ sm: "rounded-[4px] px-[6px] py-[4px] text-[12px] leading-[16px] font-medium tracking-[0.24px]",
27
+ md: "rounded-full px-8 py-2 leading-[16px]"
28
+ }, l = m(() => a[n.size]);
29
+ return (p, t) => (o(), r("span", {
30
+ class: i(["inline-flex shrink-0 items-center", [s[e.variant], l.value, e.dot ? "gap-[2px]" : "gap-4"]])
31
+ }, [
32
+ e.dot ? (o(), r("span", u, [...t[0] || (t[0] = [
33
+ x("span", { class: "h-[5.25px] w-[5.25px] rounded-full bg-current" }, null, -1)
34
+ ])])) : d("", !0),
35
+ f(p.$slots, "default")
36
+ ], 2));
37
+ }
38
+ });
39
+ export {
40
+ y as _
41
+ };
@@ -1,8 +1,8 @@
1
1
  import { defineComponent as B, ref as n, resolveComponent as A, openBlock as s, createBlock as S, withCtx as J, createElementVNode as a, toDisplayString as p, createVNode as u, createElementBlock as o, createCommentVNode as y, computed as X, Fragment as D, createTextVNode as x, onMounted as Y, renderList as G, normalizeClass as Z } from "vue";
2
- import { a as T } from "./routes-CJa85dEy.js";
2
+ import { a as T } from "./routes-i1Lpq1LK.js";
3
3
  import { useDialog as ee } from "@feedmepos/ui-library";
4
4
  import { useRouter as te } from "vue-router";
5
- import { c as F, e as I } from "./controlPlane--Q2ulw38.js";
5
+ import { c as F, e as I } from "./controlPlane-DR5ykj4d.js";
6
6
  import { _ as L } from "./_plugin-vue_export-helper-CHgC5LLL.js";
7
7
  import { w as ae } from "./portalNavigation-L5VwKlps.js";
8
8
  const le = {
@@ -1,6 +1,6 @@
1
1
  import { defineComponent as s, watchEffect as a, openBlock as n, createElementBlock as p } from "vue";
2
2
  import { useRoute as u, useRouter as i } from "vue-router";
3
- import { u as l } from "./portalContext-CzdVaxBH.js";
3
+ import { u as l } from "./portalContext-BKjPuVfn.js";
4
4
  import { w as m, a as f } from "./portalNavigation-L5VwKlps.js";
5
5
  const _ = {
6
6
  class: "portal-loading",
@@ -1,6 +1,6 @@
1
- import { a as u } from "./routes-CJa85dEy.js";
1
+ import { a as u } from "./routes-i1Lpq1LK.js";
2
2
  import { ref as o } from "vue";
3
- import { c as a } from "./controlPlane--Q2ulw38.js";
3
+ import { c as a } from "./controlPlane-DR5ykj4d.js";
4
4
  function l(e, t) {
5
5
  if (typeof window > "u") return t;
6
6
  try {
package/dist/app.js CHANGED
@@ -4,42 +4,42 @@ const o = [
4
4
  path: "/platforms/mobile",
5
5
  name: "miniprogram-v2-mobile-projects",
6
6
  meta: { title: "Mobile" },
7
- component: () => import("./MobileProjectsView-DP_MBdDX.js")
7
+ component: () => import("./MobileProjectsView-BlQQvHCc.js")
8
8
  },
9
9
  {
10
10
  path: "/",
11
11
  name: "miniprogram-v2-ecosystem",
12
12
  meta: { title: "Ecosystem" },
13
13
  beforeEnter: (e) => ["workspace", "releases", "sessions"].includes(String(e.query.view)) ? { name: "miniprogram-v2-control", query: e.query } : !0,
14
- component: () => import("./EcosystemView-BUG7Dp_e.js")
14
+ component: () => import("./EcosystemView-hqiZRHIC.js")
15
15
  },
16
16
  {
17
17
  path: "/workspace",
18
18
  name: "miniprogram-v2-control",
19
- component: () => import("./WorkspaceEntryView-aesHR5VT.js")
19
+ component: () => import("./WorkspaceEntryView-BMrZWby1.js")
20
20
  },
21
21
  {
22
22
  path: "/p/:projectId/:view(workspace|releases|sessions)?",
23
23
  name: "miniprogram-v2-project",
24
- component: () => import("./ControlPlaneView-7i6SXbEK.js")
24
+ component: () => import("./ControlPlaneView-DhAZbPoA.js")
25
25
  },
26
26
  {
27
27
  path: "/brand-kit",
28
28
  name: "miniprogram-v2-brand-kit",
29
29
  meta: { title: "Brand Kit" },
30
- component: () => import("./BrandKitView-DpeuJ5Mj.js")
30
+ component: () => import("./BrandKitView-CB7kcVy2.js")
31
31
  },
32
32
  {
33
33
  path: "/pages",
34
34
  name: "miniprogram-v2-pages",
35
35
  meta: { title: "Pages" },
36
- component: () => import("./PagesView-CNnihrLK.js")
36
+ component: () => import("./PagesView-3KDcHMIh.js")
37
37
  },
38
38
  {
39
39
  path: "/settings",
40
40
  name: "miniprogram-v2-settings",
41
41
  meta: { title: "Settings" },
42
- component: () => import("./PortalSettingsView-tEQ8--VB.js")
42
+ component: () => import("./PortalSettingsView-BVgkeXpL.js")
43
43
  },
44
44
  ...["tablet", "kiosk"].map((e) => ({
45
45
  path: `/platforms/${e}`,
@@ -53,7 +53,7 @@ const o = [
53
53
  path: "/modules",
54
54
  name: "miniprogram-v2-module-center",
55
55
  meta: { title: "Module library" },
56
- component: () => import("./ModuleCenterView-DdExY27I.js")
56
+ component: () => import("./ModuleCenterView-CY8o1GJG.js")
57
57
  },
58
58
  {
59
59
  // Keyed by the module's directory name, which is what the catalog, the
@@ -61,7 +61,7 @@ const o = [
61
61
  path: "/modules/:name",
62
62
  name: "miniprogram-v2-module-detail",
63
63
  meta: { title: "Module library" },
64
- component: () => import("./ModuleDetailView-2ZG2PgWE.js")
64
+ component: () => import("./ModuleDetailView-BuZgg6e0.js")
65
65
  },
66
66
  {
67
67
  // Internal-only: linked from the main nav (App.vue), but only once
@@ -72,13 +72,13 @@ const o = [
72
72
  path: "/internal/template-center",
73
73
  name: "miniprogram-v2-template-center",
74
74
  meta: { title: "Template library", requiresAdmin: !0 },
75
- component: () => import("./TemplateCenterView-BjuZj_3I.js")
75
+ component: () => import("./TemplateCenterView-UQ03rcwn.js")
76
76
  },
77
77
  {
78
78
  path: "/:pathMatch(.*)*",
79
79
  redirect: (e) => ({ name: "miniprogram-v2-ecosystem", query: e.query, params: {} })
80
80
  }
81
- ], r = {}, a = t(() => import("./App-h0NGA3Bx.js")), i = t(() => import("./LegacyWorkspaceEntry-lEMtmdIe.js"));
81
+ ], r = {}, a = t(() => import("./App-CFKKclWT.js")), i = t(() => import("./LegacyWorkspaceEntry-lEMtmdIe.js"));
82
82
  export {
83
83
  a as FmApp,
84
84
  i as MiniprogramWorkspace,
@@ -126,16 +126,16 @@ async function I(e, n = {}) {
126
126
  }
127
127
  export {
128
128
  T as C,
129
- $ as a,
130
- x as b,
129
+ x as a,
130
+ P as b,
131
131
  b as c,
132
- P as d,
132
+ y as d,
133
133
  F as e,
134
- y as f,
135
- I as g,
136
- E as h,
137
- u as i,
138
- C as j,
134
+ I as f,
135
+ E as g,
136
+ u as h,
137
+ C as i,
138
+ $ as j,
139
139
  D as k,
140
140
  k as l,
141
141
  i as m,
package/dist/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@feedmepos/mf-miniprogram-v2",
3
- "version": "0.2.8-dev.3",
3
+ "version": "0.2.8-dev.5",
4
4
  "type": "module",
5
5
  "publishConfig": {
6
6
  "access": "public",
@@ -1,6 +1,6 @@
1
- import { a as b } from "./routes-CJa85dEy.js";
1
+ import { a as b } from "./routes-i1Lpq1LK.js";
2
2
  import { useCoreStore as d } from "@feedmepos/mf-common";
3
- import { c as g, e as h } from "./controlPlane--Q2ulw38.js";
3
+ import { c as g, e as h } from "./controlPlane-DR5ykj4d.js";
4
4
  import { provide as y, computed as f, ref as c, watch as C, onScopeDispose as w, inject as x } from "vue";
5
5
  function P() {
6
6
  const e = d(), r = f(() => {
@@ -1,4 +1,4 @@
1
- const t = (e, s) => `/api/businesses/${e}/projects/${s}`, p = {
1
+ const t = (e, s) => `/api/businesses/${e}/projects/${s}`, i = {
2
2
  projects: (e) => `/api/businesses/${e}/projects`,
3
3
  portalContext: (e) => `/api/businesses/${e}/portal-context`,
4
4
  project: (e, s) => t(e, s),
@@ -6,40 +6,44 @@ const t = (e, s) => `/api/businesses/${e}/projects/${s}`, p = {
6
6
  refreshSlug: (e, s) => `${t(e, s)}/refresh-slug`,
7
7
  sessions: (e, s) => `${t(e, s)}/sessions`,
8
8
  session: (e, s, a) => `${t(e, s)}/sessions/${a}`,
9
- messages: (e, s, a) => `${p.session(e, s, a)}/messages`,
10
- startStatus: (e, s, a) => `${p.session(e, s, a)}/start-status`,
9
+ messages: (e, s, a) => `${i.session(e, s, a)}/messages`,
10
+ startStatus: (e, s, a) => `${i.session(e, s, a)}/start-status`,
11
11
  /** Server-side render of one library module, proxied to the session's own
12
12
  * sandbox — what the swap panel's candidate cards fetch instead of the
13
13
  * browser reaching the public preview host directly (see
14
14
  * BlockLibraryPanel.vue's `ModuleLibraryCard`). */
15
- libraryRender: (e, s, a) => `${p.session(e, s, a)}/library-render`,
16
- changes: (e, s, a, i = !1) => `${p.session(e, s, a)}/changes${i ? "?refresh=1" : ""}`,
17
- checkpoints: (e, s, a) => `${p.session(e, s, a)}/checkpoints`,
18
- aiBillingPreflight: (e, s, a) => `${p.session(e, s, a)}/ai-billing/preflight`,
19
- restoreCheckpoint: (e, s, a, i) => `${p.checkpoints(e, s, a)}/${i}/restore`,
20
- previewBridgeTicket: (e, s, a) => `${p.session(e, s, a)}/preview-bridge/ticket`,
21
- previewBridgeSocket: (e, s, a) => `${p.session(e, s, a)}/preview-bridge/socket`,
22
- uploads: (e, s, a, i = "") => `${p.session(e, s, a)}/uploads${i ? `?${i}` : ""}`,
23
- archive: (e, s, a) => `${p.session(e, s, a)}/archive`,
24
- commit: (e, s, a) => `${p.session(e, s, a)}/commit`,
25
- resume: (e, s, a) => `${p.session(e, s, a)}/resume`,
26
- restartPreview: (e, s, a) => `${p.session(e, s, a)}/restart-preview`,
27
- fork: (e, s, a) => `${p.session(e, s, a)}/fork`,
28
- flushEvents: (e, s, a) => `${p.session(e, s, a)}/events/flush`,
29
- revertTurn: (e, s, a) => `${p.session(e, s, a)}/turns/revert`,
30
- unrevertTurn: (e, s, a) => `${p.session(e, s, a)}/turns/unrevert`,
15
+ libraryRender: (e, s, a) => `${i.session(e, s, a)}/library-render`,
16
+ changes: (e, s, a, p = !1) => `${i.session(e, s, a)}/changes${p ? "?refresh=1" : ""}`,
17
+ checkpoints: (e, s, a) => `${i.session(e, s, a)}/checkpoints`,
18
+ aiBillingPreflight: (e, s, a) => `${i.session(e, s, a)}/ai-billing/preflight`,
19
+ restoreCheckpoint: (e, s, a, p) => `${i.checkpoints(e, s, a)}/${p}/restore`,
20
+ previewBridgeTicket: (e, s, a) => `${i.session(e, s, a)}/preview-bridge/ticket`,
21
+ previewBridgeSocket: (e, s, a) => `${i.session(e, s, a)}/preview-bridge/socket`,
22
+ uploads: (e, s, a, p = "") => `${i.session(e, s, a)}/uploads${p ? `?${p}` : ""}`,
23
+ archive: (e, s, a) => `${i.session(e, s, a)}/archive`,
24
+ commit: (e, s, a) => `${i.session(e, s, a)}/commit`,
25
+ resume: (e, s, a) => `${i.session(e, s, a)}/resume`,
26
+ restartPreview: (e, s, a) => `${i.session(e, s, a)}/restart-preview`,
27
+ fork: (e, s, a) => `${i.session(e, s, a)}/fork`,
28
+ flushEvents: (e, s, a) => `${i.session(e, s, a)}/events/flush`,
29
+ revertTurn: (e, s, a) => `${i.session(e, s, a)}/turns/revert`,
30
+ unrevertTurn: (e, s, a) => `${i.session(e, s, a)}/turns/unrevert`,
31
31
  releases: (e, s) => `${t(e, s)}/releases`,
32
32
  /** Internal-admin only. Extracts a new restaurant style out of a session's
33
33
  * verified checkpoint and, once confirmed, opens a PR against this repo. */
34
34
  publishAsTemplate: (e, s) => `${t(e, s)}/publish-as-template`,
35
- publishRelease: (e, s, a) => `${p.releases(e, s)}/${a}/publish`,
36
- releasePreviewUrl: (e, s, a) => `${p.releases(e, s)}/${a}/preview-url`,
35
+ publishRelease: (e, s, a) => `${i.releases(e, s)}/${a}/publish`,
36
+ releasePreviewUrl: (e, s, a) => `${i.releases(e, s)}/${a}/preview-url`,
37
+ /** Turns "set this release live once its build succeeds" on or off. */
38
+ releaseAutoPublish: (e, s, a) => `${i.releases(e, s)}/${a}/auto-publish`,
39
+ /** The merchant-readable "what changed since the last publish" for a release. */
40
+ releaseChanges: (e, s, a) => `${i.releases(e, s)}/${a}/changes`,
37
41
  rollbackToRelease: (e, s, a) => `${t(e, s)}/rollback-to-release/${a}`,
38
42
  rollbackToV1: (e, s) => `${t(e, s)}/rollback-to-v1`,
39
43
  start: (e, s, a) => {
40
- const i = new URLSearchParams();
41
- e && i.set("businessId", e), s && i.set("projectId", s), a && i.set("sessionId", a);
42
- const r = i.toString();
44
+ const p = new URLSearchParams();
45
+ e && p.set("businessId", e), s && p.set("projectId", s), a && p.set("sessionId", a);
46
+ const r = p.toString();
43
47
  return `/api/start${r ? `?${r}` : ""}`;
44
48
  },
45
49
  opencode: (e = "") => `/api/opencode${e ? `/${e.replace(/^\/+/, "")}` : ""}`,
@@ -102,5 +106,5 @@ const t = (e, s) => `/api/businesses/${e}/projects/${s}`, p = {
102
106
  appTemplateEditingProject: (e) => `/api/admin/app-templates/${e}/editing-project`
103
107
  };
104
108
  export {
105
- p as a
109
+ i as a
106
110
  };