@feedmepos/mf-miniprogram-v2 0.2.2-dev.1 → 0.2.2-dev.11

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 (33) hide show
  1. package/dist/App-agMiJ0tU.js +197 -0
  2. package/dist/AppTemplatePicker-C0lZyhK2.js +184 -0
  3. package/dist/BrandFontPicker-BFjp8k2W.js +241 -0
  4. package/dist/BrandKitView-DUbIT3c8.js +249 -0
  5. package/dist/{ControlPlaneView-DmhLvgWt.js → ControlPlaneView-BN9srEtl.js} +7850 -7509
  6. package/dist/EcosystemView-BgjtBJy_.js +186 -0
  7. package/dist/{LegacyWorkspaceEntry-7DvIosoj.js → LegacyWorkspaceEntry-opz_kWz9.js} +1 -1
  8. package/dist/MobileProjectsView-QbURgYLB.js +296 -0
  9. package/dist/{ModuleCenterView-Dqp-2hbL.js → ModuleCenterView-DyMr3iWV.js} +34 -34
  10. package/dist/{ModuleDetailView-cpQ_UfS9.js → ModuleDetailView-BeXK89Cs.js} +49 -49
  11. package/dist/{PagesView-CrVOYOT9.js → PagesView-CegMd6GC.js} +3 -3
  12. package/dist/{PlatformUnavailableView-Cdy-1zpi.js → PlatformUnavailableView-j0_2YBKm.js} +2 -2
  13. package/dist/PortalIcon-DO0VrIoY.js +28 -0
  14. package/dist/{PortalSettingsView-CkW-avwg.js → PortalSettingsView-Bqw8tMZb.js} +5 -5
  15. package/dist/WorkspaceEntryView-e2EUnq9A.js +21 -0
  16. package/dist/app.js +17 -11
  17. package/dist/{controlPlane-wUT1G_Gr.js → controlPlane-CoEgf9BA.js} +9 -9
  18. package/dist/{index-BDHUHtRw.js → index-D5qXvcfE.js} +24 -15
  19. package/dist/package.json +1 -1
  20. package/dist/{portalContext-CTVzkJV7.js → portalContext-C4HL_0kl.js} +2 -2
  21. package/dist/portalNavigation-DOF4Ah49.js +28 -0
  22. package/dist/{routes-L0ady_Wy.js → routes-Boz_WlNM.js} +1 -0
  23. package/dist/style.css +1 -1
  24. package/dist/useBrandKit-BlKlqpo2.js +1020 -0
  25. package/dist/{useModuleCatalog-CD5N246F.js → useModuleCatalog-DqECds3F.js} +3 -3
  26. package/package.json +1 -1
  27. package/dist/App-C-7evg9W.js +0 -216
  28. package/dist/BrandKitView-B8t8RkHr.js +0 -221
  29. package/dist/EcosystemView--S4hk_t4.js +0 -232
  30. package/dist/PortalIcon-D1RqQMzD.js +0 -19
  31. package/dist/WorkspaceEntryView-ZdXuMQoJ.js +0 -21
  32. package/dist/portalNavigation-DKCfwTH8.js +0 -28
  33. package/dist/useBrandKit-CpyR2j6m.js +0 -924
@@ -1,11 +1,11 @@
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 r, 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";
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-CD5N246F.js";
3
+ import { m as q, i as A, u as F, _ as w } from "./useModuleCatalog-DqECds3F.js";
4
4
  import { useDialog as V } from "@feedmepos/ui-library";
5
5
  import { _ as E } from "./_plugin-vue_export-helper-CHgC5LLL.js";
6
- const R = { class: "detail" }, j = { class: "detail__head" }, z = { class: "detail__name fm-typo-en-title-sm-600 text-fm-color-typo-primary" }, K = { class: "detail__version fm-typo-en-body-md-400 text-fm-color-typo-tertiary" }, O = {
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 = {
7
7
  key: 0,
8
- class: "detail__description fm-typo-en-body-md-400 text-fm-color-typo-secondary"
8
+ class: "detail__description fm-typo-en-body-md-400 text-portal-text-muted"
9
9
  }, Y = { class: "detail__columns" }, G = { class: "detail__preview" }, H = {
10
10
  key: 0,
11
11
  class: "detail__note detail__note--error fm-typo-en-body-md-400"
@@ -21,7 +21,7 @@ const R = { class: "detail" }, j = { class: "detail__head" }, z = { class: "deta
21
21
  }, se = {
22
22
  key: 0,
23
23
  class: "detail__optional fm-typo-en-body-sm-400"
24
- }, le = { class: "detail__section" }, ae = ["value"], re = /* @__PURE__ */ C({
24
+ }, le = { class: "detail__section" }, ae = ["value"], ie = /* @__PURE__ */ C({
25
25
  __name: "ModuleDetail",
26
26
  props: {
27
27
  entry: {},
@@ -29,24 +29,24 @@ const R = { class: "detail" }, j = { class: "detail__head" }, z = { class: "deta
29
29
  previewError: {}
30
30
  },
31
31
  setup(o) {
32
- const i = o, f = V(), s = M(!1);
33
- let c;
34
- const m = u(() => q(i.entry)), y = u(
35
- () => i.previewDocument ? A(i.previewDocument, i.entry.name) : null
32
+ const r = o, b = V(), s = M(!1);
33
+ let m;
34
+ const c = u(() => q(r.entry)), p = u(
35
+ () => r.previewDocument ? A(r.previewDocument, r.entry.name) : null
36
36
  );
37
37
  T(
38
- () => i.entry.name,
38
+ () => r.entry.name,
39
39
  () => {
40
40
  s.value = !1;
41
41
  }
42
42
  );
43
43
  async function x() {
44
44
  try {
45
- await navigator.clipboard.writeText(m.value), s.value = !0, window.clearTimeout(c), c = window.setTimeout(() => {
45
+ await navigator.clipboard.writeText(c.value), s.value = !0, window.clearTimeout(m), m = window.setTimeout(() => {
46
46
  s.value = !1;
47
47
  }, 2e3);
48
48
  } catch (a) {
49
- f.open({
49
+ b.open({
50
50
  title: "Could not copy",
51
51
  message: `${a instanceof Error ? a.message : String(a)}. Select the text below and copy it manually.`,
52
52
  dismissAway: !0,
@@ -55,62 +55,62 @@ const R = { class: "detail" }, j = { class: "detail__head" }, z = { class: "deta
55
55
  }
56
56
  }
57
57
  return (a, t) => {
58
- var p, D, $;
59
- const b = g("FmButton");
58
+ var y, D, $;
59
+ const f = g("FmButton");
60
60
  return n(), l("div", R, [
61
61
  e("header", j, [
62
- e("h3", z, r(o.entry.name), 1),
63
- e("span", K, r(o.entry.version), 1),
64
- o.entry.description ? (n(), l("p", O, r(o.entry.description), 1)) : _("", !0)
62
+ e("h3", z, i(o.entry.name), 1),
63
+ e("span", K, i(o.entry.version), 1),
64
+ o.entry.description ? (n(), l("p", O, i(o.entry.description), 1)) : _("", !0)
65
65
  ]),
66
66
  e("div", Y, [
67
67
  e("section", G, [
68
- t[0] || (t[0] = e("h4", { class: "detail__label fm-typo-en-body-sm-600 text-fm-color-typo-tertiary" }, "Preview", -1)),
69
- o.previewError ? (n(), l("p", H, r(o.previewError), 1)) : y.value ? (n(), l("iframe", {
68
+ t[0] || (t[0] = e("h4", { class: "detail__label fm-typo-en-body-sm-600 text-portal-text-muted" }, "Preview", -1)),
69
+ o.previewError ? (n(), l("p", H, i(o.previewError), 1)) : p.value ? (n(), l("iframe", {
70
70
  key: o.entry.name,
71
71
  class: "detail__frame",
72
72
  title: "module preview",
73
73
  sandbox: "allow-scripts",
74
- srcdoc: y.value
74
+ srcdoc: p.value
75
75
  }, null, 8, Q)) : (n(), l("p", J, "Loading preview…")),
76
- t[1] || (t[1] = e("p", { class: "detail__hint fm-typo-en-body-sm-400 text-fm-color-typo-tertiary" }, " Stand-in brand colours. Your business's own palette applies in the workspace preview. ", -1))
76
+ t[1] || (t[1] = e("p", { class: "detail__hint fm-typo-en-body-sm-400 text-portal-text-muted" }, " Stand-in brand colours. Your business's own palette applies in the workspace preview. ", -1))
77
77
  ]),
78
78
  e("div", U, [
79
79
  e("section", W, [
80
- t[6] || (t[6] = e("h4", { class: "detail__label fm-typo-en-body-sm-600 text-fm-color-typo-tertiary" }, "Details", -1)),
80
+ t[6] || (t[6] = e("h4", { class: "detail__label fm-typo-en-body-sm-600 text-portal-text-muted" }, "Details", -1)),
81
81
  e("dl", X, [
82
82
  t[2] || (t[2] = e("dt", null, "Id", -1)),
83
- e("dd", null, r(o.entry.id), 1),
83
+ e("dd", null, i(o.entry.id), 1),
84
84
  t[3] || (t[3] = e("dt", null, "Slot", -1)),
85
- e("dd", null, r(o.entry.slot ?? "—"), 1),
85
+ e("dd", null, i(o.entry.slot ?? "—"), 1),
86
86
  t[4] || (t[4] = e("dt", null, "Data shape", -1)),
87
- e("dd", null, r(o.entry.dataShape ?? "—"), 1),
87
+ e("dd", null, i(o.entry.dataShape ?? "—"), 1),
88
88
  t[5] || (t[5] = e("dt", null, "Type", -1)),
89
- e("dd", null, r(o.entry.category), 1),
90
- (p = o.entry.labels) != null && p.length ? (n(), l("dt", Z, "Labels")) : _("", !0),
91
- (D = o.entry.labels) != null && D.length ? (n(), l("dd", ee, r(o.entry.labels.join(", ")), 1)) : _("", !0)
89
+ e("dd", null, i(o.entry.category), 1),
90
+ (y = o.entry.labels) != null && y.length ? (n(), l("dt", Z, "Labels")) : _("", !0),
91
+ (D = o.entry.labels) != null && D.length ? (n(), l("dd", ee, i(o.entry.labels.join(", ")), 1)) : _("", !0)
92
92
  ])
93
93
  ]),
94
94
  e("section", te, [
95
- t[7] || (t[7] = e("h4", { class: "detail__label fm-typo-en-body-sm-600 text-fm-color-typo-tertiary" }, "Props", -1)),
95
+ t[7] || (t[7] = e("h4", { class: "detail__label fm-typo-en-body-sm-600 text-portal-text-muted" }, "Props", -1)),
96
96
  ($ = o.entry.props) != null && $.length ? (n(), l("ul", ne, [
97
97
  (n(!0), l(I, null, S(o.entry.props, (h) => (n(), l("li", {
98
98
  key: h.name
99
99
  }, [
100
- e("code", null, r(h.name), 1),
100
+ e("code", null, i(h.name), 1),
101
101
  h.required ? _("", !0) : (n(), l("span", se, "optional"))
102
102
  ]))), 128))
103
103
  ])) : (n(), l("p", oe, " This module declares no props interface, so it can only be offered as a like-for-like swap. "))
104
104
  ]),
105
105
  e("section", le, [
106
- t[8] || (t[8] = e("h4", { class: "detail__label fm-typo-en-body-sm-600 text-fm-color-typo-tertiary" }, "Ask the agent for it", -1)),
107
- t[9] || (t[9] = e("p", { class: "detail__hint fm-typo-en-body-sm-400 text-fm-color-typo-tertiary" }, " Paste this into a workspace chat. The agent copies the module into your app's own code. ", -1)),
106
+ t[8] || (t[8] = e("h4", { class: "detail__label fm-typo-en-body-sm-600 text-portal-text-muted" }, "Ask the agent for it", -1)),
107
+ t[9] || (t[9] = e("p", { class: "detail__hint fm-typo-en-body-sm-400 text-portal-text-muted" }, " Paste this into a workspace chat. The agent copies the module into your app's own code. ", -1)),
108
108
  e("textarea", {
109
109
  class: "detail__prompt",
110
110
  readonly: "",
111
- value: m.value
111
+ value: c.value
112
112
  }, null, 8, ae),
113
- k(b, {
113
+ k(f, {
114
114
  class: "detail__copy",
115
115
  size: "md",
116
116
  variant: s.value ? "secondary" : "primary",
@@ -124,22 +124,22 @@ const R = { class: "detail" }, j = { class: "detail__head" }, z = { class: "deta
124
124
  ]);
125
125
  };
126
126
  }
127
- }), ie = /* @__PURE__ */ E(re, [["__scopeId", "data-v-ad739f79"]]), de = { class: "shell" }, ce = { class: "page" }, me = { class: "page__inner" }, ue = { class: "page__head" }, ye = {
127
+ }), re = /* @__PURE__ */ E(ie, [["__scopeId", "data-v-dc44acc5"]]), de = { class: "shell" }, me = { class: "page" }, ce = { class: "page__inner" }, ue = { class: "page__head" }, pe = {
128
128
  key: 0,
129
129
  class: "page__note fm-typo-en-body-md-400"
130
- }, pe = /* @__PURE__ */ C({
130
+ }, ye = /* @__PURE__ */ C({
131
131
  __name: "ModuleDetailView",
132
132
  setup(o) {
133
- const i = N(), f = P(), s = F(), c = u(() => String(i.params.name ?? "")), m = u(() => s.find(c.value)), y = u(() => s.entries.value === null);
133
+ const r = N(), b = P(), s = F(), m = u(() => String(r.params.name ?? "")), c = u(() => s.find(m.value)), p = u(() => s.entries.value === null);
134
134
  return B(() => s.load()), (x, a) => {
135
- const t = g("FmIcon"), b = g("RouterLink");
135
+ const t = g("FmIcon"), f = g("RouterLink");
136
136
  return n(), l("div", de, [
137
- e("div", ce, [
138
- e("div", me, [
137
+ e("div", me, [
138
+ e("div", ce, [
139
139
  e("header", ue, [
140
- k(b, {
140
+ k(f, {
141
141
  class: "page__back",
142
- to: { name: "miniprogram-v2-module-center", query: d(i).query }
142
+ to: { name: "miniprogram-v2-module-center", query: d(r).query }
143
143
  }, {
144
144
  default: L(() => [
145
145
  k(t, {
@@ -152,38 +152,38 @@ const R = { class: "detail" }, j = { class: "detail__head" }, z = { class: "deta
152
152
  _: 1
153
153
  }, 8, ["to"])
154
154
  ]),
155
- y.value ? (n(), l("p", ye, "Loading…")) : d(s).loadError.value ? (n(), v(w, {
155
+ p.value ? (n(), l("p", pe, "Loading…")) : d(s).loadError.value ? (n(), v(w, {
156
156
  key: 1,
157
157
  icon: "error_outline",
158
158
  tone: "error",
159
159
  title: "Could not load the module library",
160
160
  message: d(s).loadError.value,
161
161
  "action-label": "Try again",
162
- onAction: a[0] || (a[0] = (p) => d(s).load(!0))
162
+ onAction: a[0] || (a[0] = (y) => d(s).load(!0))
163
163
  }, null, 8, ["message"])) : d(s).unpublished.value ? (n(), v(w, {
164
164
  key: 2,
165
165
  icon: "widgets",
166
166
  title: "No module library has been published yet",
167
167
  message: "Nothing has been published for this page to show."
168
- })) : m.value ? (n(), v(ie, {
168
+ })) : c.value ? (n(), v(re, {
169
169
  key: 4,
170
- entry: m.value,
170
+ entry: c.value,
171
171
  "preview-document": d(s).previewDocument.value,
172
172
  "preview-error": d(s).previewError.value
173
173
  }, null, 8, ["entry", "preview-document", "preview-error"])) : (n(), v(w, {
174
174
  key: 3,
175
175
  icon: "search_off",
176
- title: `No module named “${c.value}”`,
176
+ title: `No module named “${m.value}”`,
177
177
  message: "It is not in the published library. It may have been renamed, withdrawn, or never published.",
178
178
  "action-label": "Back to the library",
179
- onAction: a[1] || (a[1] = (p) => d(f).push({ name: "miniprogram-v2-module-center", query: d(i).query }))
179
+ onAction: a[1] || (a[1] = (y) => d(b).push({ name: "miniprogram-v2-module-center", query: d(r).query }))
180
180
  }, null, 8, ["title"]))
181
181
  ])
182
182
  ])
183
183
  ]);
184
184
  };
185
185
  }
186
- }), we = /* @__PURE__ */ E(pe, [["__scopeId", "data-v-c0e81d59"]]);
186
+ }), we = /* @__PURE__ */ E(ye, [["__scopeId", "data-v-70b1bf30"]]);
187
187
  export {
188
188
  we as default
189
189
  };
@@ -1,8 +1,8 @@
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-CTVzkJV7.js";
4
- import { w as f } from "./portalNavigation-DKCfwTH8.js";
5
- import { P as k } from "./PortalIcon-D1RqQMzD.js";
3
+ import { u as g } from "./portalContext-C4HL_0kl.js";
4
+ import { w as f } from "./portalNavigation-DOF4Ah49.js";
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({
7
7
  __name: "PagesView",
8
8
  setup(v) {
@@ -1,7 +1,7 @@
1
1
  import { defineComponent as i, computed as p, resolveComponent as m, openBlock as c, createElementBlock as u, createElementVNode as e, toDisplayString as a, unref as n, createVNode as r, withCtx as d, createTextVNode as _ } from "vue";
2
2
  import { useRoute as g } from "vue-router";
3
- import { P as f } from "./PortalIcon-D1RqQMzD.js";
4
- import { p as k } from "./portalNavigation-DKCfwTH8.js";
3
+ import { P as f } from "./PortalIcon-DO0VrIoY.js";
4
+ import { p as k } from "./portalNavigation-DOF4Ah49.js";
5
5
  const y = { class: "portal-page" }, b = { class: "portal-page-inner" }, v = { class: "portal-page-heading" }, h = { class: "portal-section portal-empty" }, P = /* @__PURE__ */ i({
6
6
  __name: "PlatformUnavailableView",
7
7
  setup(x) {
@@ -0,0 +1,28 @@
1
+ import { defineComponent as l, openBlock as o, createElementBlock as t, createElementVNode as i, Fragment as c, renderList as n, normalizeStyle as d, normalizeClass as a } from "vue";
2
+ import { _ as C } from "./_plugin-vue_export-helper-CHgC5LLL.js";
3
+ const p = "data:image/svg+xml,%3csvg%20preserveAspectRatio='none'%20overflow='visible'%20style='display:%20block;'%20width='18'%20height='18'%20viewBox='0%200%2018%2018'%20fill='none'%20xmlns='http://www.w3.org/2000/svg'%3e%3cg%20id='Group%201197147779'%3e%3cpath%20id='Rectangle%2034624630'%20d='M4.5%200.75H6V17.25H4.5C2.42893%2017.25%200.75%2015.5711%200.75%2013.5V4.5C0.75%202.42893%202.42893%200.75%204.5%200.75Z'%20stroke='%236B6C70'%20stroke-width='1.5'%20stroke-linecap='round'%20stroke-linejoin='round'/%3e%3cpath%20id='Rectangle%2034624631'%20d='M13.5%200.75C15.571%200.750015%2017.25%202.42897%2017.25%204.5V13.5C17.25%2015.5711%2015.5711%2017.25%2013.5%2017.25H6V0.75H13.5Z'%20stroke='%236B6C70'%20stroke-width='1.5'%20stroke-linecap='round'%20stroke-linejoin='round'/%3e%3cpath%20id='Vector%20177'%20d='M13.5%206L9.64188%208.8059C9.5101%208.90175%209.5101%209.09825%209.64188%209.1941L13.5%2012'%20stroke='%236B6C70'%20stroke-width='1.5'%20stroke-linecap='round'%20stroke-linejoin='round'/%3e%3c/g%3e%3c/svg%3e", g = "data:image/svg+xml,%3csvg%20preserveAspectRatio='none'%20overflow='visible'%20style='display:%20block;'%20width='18'%20height='18'%20viewBox='0%200%2018%2018'%20fill='none'%20xmlns='http://www.w3.org/2000/svg'%3e%3cg%20id='Group%201197147825'%3e%3cpath%20id='Ellipse%201330'%20d='M9.00195%200.75C12.9283%200.75%2016.216%203.49224%2017.0498%207.16602C17.147%207.59434%2017.209%208.04273%2017.2354%208.49805C17.2893%209.42907%2016.4336%2010.25%2015.2197%2010.25H14.333C11.6195%2010.25%209.58394%2012.7328%2010.1162%2015.3936L10.1416%2015.5205C10.3386%2016.5059%209.72231%2017.25%209.00195%2017.25C4.44436%2017.25%200.75%2013.5562%200.75%209C0.75%204.44384%204.44436%200.750048%209.00195%200.75Z'%20stroke='%236B6C70'%20stroke-width='1.5'%20stroke-linecap='round'%20stroke-linejoin='round'/%3e%3ccircle%20id='Ellipse%201331'%20cx='5.25'%20cy='12.2495'%20r='1.25'%20fill='%236B6C70'/%3e%3ccircle%20id='Ellipse%201332'%20cx='4.25'%20cy='7.25'%20r='1.25'%20fill='%236B6C70'/%3e%3ccircle%20id='Ellipse%201333'%20cx='8.25'%20cy='4.25'%20r='1.25'%20fill='%236B6C70'/%3e%3ccircle%20id='Ellipse%201334'%20cx='13.25'%20cy='6.24951'%20r='1.25'%20fill='%236B6C70'/%3e%3c/g%3e%3c/svg%3e", k = "data:image/svg+xml,%3csvg%20preserveAspectRatio='none'%20overflow='visible'%20style='display:%20block;'%20width='24'%20height='24'%20viewBox='0%200%2024%2024'%20fill='none'%20xmlns='http://www.w3.org/2000/svg'%3e%3cg%20id='Format/folder'%3e%3cpath%20id='Vector'%20d='M2%208C2%207.46957%202.21071%206.96086%202.58579%206.58579C2.96086%206.21071%203.46957%206%204%206H9L11%208.5H20C20.5304%208.5%2021.0391%208.71071%2021.4142%209.08579C21.7893%209.46086%2022%209.96957%2022%2010.5V18C22%2018.5304%2021.7893%2019.0391%2021.4142%2019.4142C21.0391%2019.7893%2020.5304%2020%2020%2020H4C3.46957%2020%202.96086%2019.7893%202.58579%2019.4142C2.21071%2019.0391%202%2018.5304%202%2018V8Z'%20stroke='%236B6C70'%20stroke-width='1.25'%20stroke-linecap='round'%20stroke-linejoin='round'/%3e%3c/g%3e%3c/svg%3e", w = "data:image/svg+xml,%3csvg%20preserveAspectRatio='none'%20overflow='visible'%20style='display:%20block;'%20width='24'%20height='24'%20viewBox='0%200%2024%2024'%20fill='none'%20xmlns='http://www.w3.org/2000/svg'%3e%3cg%20id='Devices/mobile'%3e%3cpath%20id='Vector'%20d='M14.5%202H9.5C8.11929%202%207%203.11929%207%204.5V19.5C7%2020.8807%208.11929%2022%209.5%2022H14.5C15.8807%2022%2017%2020.8807%2017%2019.5V4.5C17%203.11929%2015.8807%202%2014.5%202Z'%20stroke='%236B6C70'%20stroke-width='1.5'%20stroke-linejoin='round'/%3e%3cpath%20id='Vector_2'%20d='M9.75%2019H14.25'%20stroke='%236B6C70'%20stroke-width='1.5'%20stroke-linecap='round'/%3e%3c/g%3e%3c/svg%3e", h = "data:image/svg+xml,%3csvg%20preserveAspectRatio='none'%20overflow='visible'%20style='display:%20block;'%20width='24'%20height='24'%20viewBox='0%200%2024%2024'%20fill='none'%20xmlns='http://www.w3.org/2000/svg'%3e%3cg%20id='Devices/tablet'%3e%3cpath%20id='Vector'%20d='M17%202H7C5.89543%202%205%202.89543%205%204V20C5%2021.1046%205.89543%2022%207%2022H17C18.1046%2022%2019%2021.1046%2019%2020V4C19%202.89543%2018.1046%202%2017%202Z'%20stroke='%236B6C70'%20stroke-width='1.5'%20stroke-linejoin='round'/%3e%3cpath%20id='Vector_2'%20d='M11.9996%2020.3996C12.4967%2020.3996%2012.8996%2019.9967%2012.8996%2019.4996C12.8996%2019.0026%2012.4967%2018.5996%2011.9996%2018.5996C11.5026%2018.5996%2011.0996%2019.0026%2011.0996%2019.4996C11.0996%2019.9967%2011.5026%2020.3996%2011.9996%2020.3996Z'%20fill='%236B6C70'/%3e%3c/g%3e%3c/svg%3e", v = "data:image/svg+xml,%3csvg%20preserveAspectRatio='none'%20overflow='visible'%20style='display:%20block;'%20width='24'%20height='24'%20viewBox='0%200%2024%2024'%20fill='none'%20xmlns='http://www.w3.org/2000/svg'%3e%3cg%20id='Devices/kiosk'%3e%3cpath%20id='Vector'%20d='M16%202H8C6.89543%202%206%202.89543%206%204V15C6%2016.1046%206.89543%2017%208%2017H16C17.1046%2017%2018%2016.1046%2018%2015V4C18%202.89543%2017.1046%202%2016%202Z'%20stroke='%236B6C70'%20stroke-width='1.5'%20stroke-linejoin='round'/%3e%3cpath%20id='Vector_2'%20d='M12%2017V21'%20stroke='%236B6C70'%20stroke-width='1.5'%20stroke-linecap='round'/%3e%3cpath%20id='Vector_3'%20d='M8%2021H16'%20stroke='%236B6C70'%20stroke-width='1.5'%20stroke-linecap='round'/%3e%3c/g%3e%3c/svg%3e", m = "data:image/svg+xml,%3csvg%20preserveAspectRatio='none'%20overflow='visible'%20style='display:%20block;'%20width='16.25'%20height='15'%20viewBox='0%200%2016.25%2015'%20fill='none'%20xmlns='http://www.w3.org/2000/svg'%3e%3cg%20id='Group%201197147545'%3e%3cpath%20id='Vector'%20d='M14.9213%209.40635C15.3272%209.30438%2015.6126%208.94183%2015.6152%208.52478L15.625%206.93007C15.6275%206.525%2015.3623%206.16651%2014.9732%206.04892L14.1005%205.7852C13.8798%205.7185%2013.6924%205.57154%2013.5755%205.37352L12.8573%204.15727C12.739%203.95681%2012.7017%203.71897%2012.753%203.4921L12.9621%202.56859C13.0506%202.17784%2012.8737%201.7752%2012.5254%201.57492L11.0869%200.7476C10.7376%200.546665%2010.2975%200.596351%2010.0021%200.870075L9.3115%201.51008C9.13962%201.66936%208.91304%201.75704%208.67829%201.7551L7.2638%201.74343C7.03325%201.74153%206.81184%201.65331%206.64356%201.49631L5.97804%200.875398C5.68116%200.598427%205.23678%200.548947%204.88585%200.753787L3.49363%201.56643C3.13075%201.77825%202.9585%202.20851%203.07698%202.61051C3.1228%202.76597%203.17048%202.92701%203.21292%203.06898C3.28703%203.3169%203.25766%203.58529%203.12806%203.80945L2.42614%205.02358C2.29837%205.24458%202.08426%205.40375%201.83578%205.46516C1.68469%205.5025%201.50914%205.54613%201.34035%205.58818C0.93629%205.68883%200.651389%206.04815%200.645934%206.46301L0.62508%208.04887C0.61974%208.45496%200.883759%208.81595%201.27343%208.93536L2.17309%209.21105C2.39202%209.27813%202.57789%209.42429%202.69423%209.62084L3.41482%2010.8382C3.53378%2011.0392%203.57117%2011.2779%203.51934%2011.5054L3.30791%2012.4336C3.21883%2012.8247%203.39575%2013.2279%203.74437%2013.4284L5.17704%2014.2524C5.52563%2014.4529%205.96465%2014.4039%206.26008%2014.1316L6.96142%2013.4851C7.13328%2013.3267%207.35938%2013.2396%207.59352%2013.2417L9.01023%2013.2545C9.2404%2013.2566%209.4614%2013.3446%209.62948%2013.5013L10.2936%2014.1203C10.591%2014.3976%2011.0363%2014.4465%2011.3872%2014.2406L12.7622%2013.4339C13.1297%2013.2183%2013.3034%2012.778%2013.1882%2012.3689C13.1406%2012.1999%2013.0926%2012.0281%2013.0523%2011.8833C12.9866%2011.6471%2013.0193%2011.3949%2013.1425%2011.1827L13.8525%209.96047C13.9767%209.74663%2014.1824%209.59192%2014.4229%209.53151L14.9213%209.40635Z'%20stroke='%236B6C70'%20stroke-width='1.25'%20stroke-linecap='round'%20stroke-linejoin='round'/%3e%3cpath%20id='Ellipse%201274'%20d='M8.19692%204.53055C9.88304%204.53055%2011.2457%205.89191%2011.2457%207.56571C11.2455%209.23933%209.88291%2010.5999%208.19692%2010.5999C6.51095%2010.5999%205.14829%209.23931%205.14809%207.56571C5.14809%205.89193%206.51082%204.53058%208.19692%204.53055Z'%20stroke='%236B6C70'%20stroke-width='1.25'%20stroke-linecap='round'%20stroke-linejoin='round'/%3e%3c/g%3e%3c/svg%3e", u = {
4
+ key: 0,
5
+ class: "portal-icon portal-icon-app",
6
+ "aria-hidden": "true"
7
+ }, x = { class: "portal-icon-dots" }, B = /* @__PURE__ */ l({
8
+ __name: "PortalIcon",
9
+ props: {
10
+ name: {}
11
+ },
12
+ setup(e) {
13
+ const s = { collapse: p, brand: g, pages: k, mobile: w, tablet: h, kiosk: v, settings: m };
14
+ return (f, L) => e.name === "ecosystem" ? (o(), t("span", u, [
15
+ i("span", x, [
16
+ (o(), t(c, null, n(9, (r) => i("span", { key: r })), 64))
17
+ ])
18
+ ])) : (o(), t("span", {
19
+ key: 1,
20
+ class: a(["portal-icon portal-icon-mask", `portal-icon-${e.name}`]),
21
+ style: d({ maskImage: `url(${JSON.stringify(s[e.name])})` }),
22
+ "aria-hidden": "true"
23
+ }, null, 6));
24
+ }
25
+ }), b = /* @__PURE__ */ C(B, [["__scopeId", "data-v-6d17c5ee"]]);
26
+ export {
27
+ b as P
28
+ };
@@ -1,10 +1,10 @@
1
1
  import { defineComponent as k, computed as p, ref as l, 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
- import { e as _, a as $ } from "./index-BDHUHtRw.js";
4
- import { l as B, e as E } from "./controlPlane-wUT1G_Gr.js";
3
+ import { e as _, a as $ } from "./index-D5qXvcfE.js";
4
+ import { l as B, e as E } from "./controlPlane-CoEgf9BA.js";
5
5
  import { useCoreStore as F } from "@feedmepos/mf-common";
6
- import { u as U } from "./portalContext-CTVzkJV7.js";
7
- import { l as V } from "./portalNavigation-DKCfwTH8.js";
6
+ import { u as U } from "./portalContext-C4HL_0kl.js";
7
+ import { l as V } from "./portalNavigation-DOF4Ah49.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 = {
10
10
  key: 0,
@@ -117,7 +117,7 @@ const L = { class: "portal-page" }, R = { class: "portal-page-inner settings-pag
117
117
  ]);
118
118
  };
119
119
  }
120
- }), ue = /* @__PURE__ */ q(X, [["__scopeId", "data-v-b72a2c99"]]);
120
+ }), ue = /* @__PURE__ */ q(X, [["__scopeId", "data-v-6c0e4447"]]);
121
121
  export {
122
122
  ue as default
123
123
  };
@@ -0,0 +1,21 @@
1
+ import { defineComponent as c, watchEffect as a, openBlock as n, createElementBlock as p } from "vue";
2
+ import { useRoute as i, useRouter as u } from "vue-router";
3
+ import { u as l } from "./portalContext-C4HL_0kl.js";
4
+ import { w as m, a as f } from "./portalNavigation-DOF4Ah49.js";
5
+ const _ = {
6
+ class: "portal-loading",
7
+ role: "status"
8
+ }, x = /* @__PURE__ */ c({
9
+ __name: "WorkspaceEntryView",
10
+ setup(w) {
11
+ const r = l(), e = i(), s = u();
12
+ return a(() => {
13
+ var t;
14
+ const o = (t = r.context.value) == null ? void 0 : t.projectId;
15
+ o && s.replace(m(o, e.query.view === "sessions" ? "sessions" : f(e.query.view), e.query));
16
+ }), (o, t) => (n(), p("p", _, "Opening your workspace…"));
17
+ }
18
+ });
19
+ export {
20
+ x as default
21
+ };
package/dist/app.js CHANGED
@@ -1,45 +1,51 @@
1
1
  import { defineAsyncComponent as t } from "vue";
2
2
  const o = [
3
+ {
4
+ path: "/platforms/mobile",
5
+ name: "miniprogram-v2-mobile-projects",
6
+ meta: { title: "Mobile" },
7
+ component: () => import("./MobileProjectsView-QbURgYLB.js")
8
+ },
3
9
  {
4
10
  path: "/",
5
11
  name: "miniprogram-v2-ecosystem",
6
12
  meta: { title: "Ecosystem" },
7
13
  beforeEnter: (e) => ["workspace", "releases", "sessions"].includes(String(e.query.view)) ? { name: "miniprogram-v2-control", query: e.query } : !0,
8
- component: () => import("./EcosystemView--S4hk_t4.js")
14
+ component: () => import("./EcosystemView-BgjtBJy_.js")
9
15
  },
10
16
  {
11
17
  path: "/workspace",
12
18
  name: "miniprogram-v2-control",
13
- component: () => import("./WorkspaceEntryView-ZdXuMQoJ.js")
19
+ component: () => import("./WorkspaceEntryView-e2EUnq9A.js")
14
20
  },
15
21
  {
16
22
  path: "/p/:projectId/:view(workspace|releases|sessions)?",
17
23
  name: "miniprogram-v2-project",
18
- component: () => import("./ControlPlaneView-DmhLvgWt.js")
24
+ component: () => import("./ControlPlaneView-BN9srEtl.js")
19
25
  },
20
26
  {
21
27
  path: "/brand-kit",
22
28
  name: "miniprogram-v2-brand-kit",
23
29
  meta: { title: "Brand Kit" },
24
- component: () => import("./BrandKitView-B8t8RkHr.js")
30
+ component: () => import("./BrandKitView-DUbIT3c8.js")
25
31
  },
26
32
  {
27
33
  path: "/pages",
28
34
  name: "miniprogram-v2-pages",
29
35
  meta: { title: "Pages" },
30
- component: () => import("./PagesView-CrVOYOT9.js")
36
+ component: () => import("./PagesView-CegMd6GC.js")
31
37
  },
32
38
  {
33
39
  path: "/settings",
34
40
  name: "miniprogram-v2-settings",
35
41
  meta: { title: "Settings" },
36
- component: () => import("./PortalSettingsView-CkW-avwg.js")
42
+ component: () => import("./PortalSettingsView-Bqw8tMZb.js")
37
43
  },
38
44
  ...["tablet", "kiosk"].map((e) => ({
39
45
  path: `/platforms/${e}`,
40
46
  name: `miniprogram-v2-${e}`,
41
47
  meta: { title: e === "tablet" ? "Tablet" : "Kiosk", kind: e },
42
- component: () => import("./PlatformUnavailableView-Cdy-1zpi.js")
48
+ component: () => import("./PlatformUnavailableView-j0_2YBKm.js")
43
49
  })),
44
50
  {
45
51
  // The shared component library, not this merchant's workspace — which is
@@ -47,7 +53,7 @@ const o = [
47
53
  path: "/modules",
48
54
  name: "miniprogram-v2-module-center",
49
55
  meta: { title: "Module library" },
50
- component: () => import("./ModuleCenterView-Dqp-2hbL.js")
56
+ component: () => import("./ModuleCenterView-DyMr3iWV.js")
51
57
  },
52
58
  {
53
59
  // Keyed by the module's directory name, which is what the catalog, the
@@ -55,16 +61,16 @@ const o = [
55
61
  path: "/modules/:name",
56
62
  name: "miniprogram-v2-module-detail",
57
63
  meta: { title: "Module library" },
58
- component: () => import("./ModuleDetailView-cpQ_UfS9.js")
64
+ component: () => import("./ModuleDetailView-BeXK89Cs.js")
59
65
  },
60
66
  {
61
67
  path: "/:pathMatch(.*)*",
62
68
  redirect: (e) => ({ name: "miniprogram-v2-ecosystem", query: e.query, params: {} })
63
69
  }
64
- ], r = {}, a = t(() => import("./App-C-7evg9W.js")), n = t(() => import("./LegacyWorkspaceEntry-7DvIosoj.js"));
70
+ ], r = {}, a = t(() => import("./App-agMiJ0tU.js")), i = t(() => import("./LegacyWorkspaceEntry-opz_kWz9.js"));
65
71
  export {
66
72
  a as FmApp,
67
- n as MiniprogramWorkspace,
73
+ i as MiniprogramWorkspace,
68
74
  r as i18nMessages,
69
75
  o as routes
70
76
  };
@@ -1,4 +1,4 @@
1
- import { a as f, e as d, D as m } from "./index-BDHUHtRw.js";
1
+ import { a as f, e as d, D as m } from "./index-D5qXvcfE.js";
2
2
  import { useCoreStore as a, FeedMeAuth as p } from "@feedmepos/mf-common";
3
3
  const h = [
4
4
  "AE",
@@ -126,15 +126,15 @@ async function I(e, n = {}) {
126
126
  }
127
127
  export {
128
128
  T as C,
129
- b as a,
130
- P as b,
131
- x as c,
132
- y as d,
129
+ $ as a,
130
+ x as b,
131
+ b as c,
132
+ P as d,
133
133
  F as e,
134
- E as f,
135
- u as g,
136
- C as h,
137
- $ as i,
134
+ y as f,
135
+ E as g,
136
+ u as h,
137
+ C as i,
138
138
  D as j,
139
139
  k,
140
140
  i as l,
@@ -1,4 +1,4 @@
1
- const a = "69cde0740c0106001ca83dff", i = {
1
+ const c = "69cde0740c0106001ca83dff", t = {
2
2
  dev: {
3
3
  env: "dev",
4
4
  liveDomain: "feedmedev.vip",
@@ -18,29 +18,38 @@ const a = "69cde0740c0106001ca83dff", i = {
18
18
  v1Origin: "https://brand.feedme.vip"
19
19
  }
20
20
  };
21
- function n(e) {
21
+ function o(e) {
22
22
  return e === "dev" || e === "prod";
23
23
  }
24
- function d(e) {
25
- if (!n(e))
24
+ function s(e) {
25
+ if (!o(e))
26
26
  throw new Error(`MINIPROGRAM_ENV must be 'dev' or 'prod', got ${JSON.stringify(e)}`);
27
- return i[e];
27
+ return t[e];
28
28
  }
29
- function m(e) {
29
+ function v(e) {
30
30
  const r = e.toLowerCase().replace(/^fmmf:/, "");
31
31
  return r === "prod" || r === "production" ? "prod" : "dev";
32
32
  }
33
- const o = /^[a-f0-9]{24}$/;
34
- function t(e) {
35
- return o.test(e);
33
+ const a = /^[a-f0-9]{24}$/;
34
+ function d(e) {
35
+ return a.test(e);
36
+ }
37
+ function f(e = crypto.randomUUID()) {
38
+ const r = m("prj", e, 24);
39
+ return r.length === 27 ? r : r.padEnd(27, "0");
36
40
  }
37
- function p(e) {
38
- if (!t(e)) throw new Error(`Invalid business id: ${e}`);
41
+ function g(e) {
42
+ if (!d(e)) throw new Error(`Invalid business id: ${e}`);
39
43
  return `prj${e}`;
40
44
  }
45
+ function m(e, r, n) {
46
+ const i = r.toLowerCase().replace(/[^a-z0-9]+/g, "-").replace(/^-+|-+$/g, "").replaceAll("-", "").slice(0, n);
47
+ return `${e}${i || Date.now().toString(36)}`;
48
+ }
41
49
  export {
42
- a as D,
43
- d as a,
44
- m as e,
45
- p as l
50
+ c as D,
51
+ s as a,
52
+ v as e,
53
+ g as l,
54
+ f as m
46
55
  };
package/dist/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@feedmepos/mf-miniprogram-v2",
3
- "version": "0.2.2-dev.1",
3
+ "version": "0.2.2-dev.11",
4
4
  "type": "module",
5
5
  "publishConfig": {
6
6
  "access": "public",
@@ -1,6 +1,6 @@
1
- import { a as b } from "./routes-L0ady_Wy.js";
1
+ import { a as b } from "./routes-Boz_WlNM.js";
2
2
  import { useCoreStore as d } from "@feedmepos/mf-common";
3
- import { a as g, e as h } from "./controlPlane-wUT1G_Gr.js";
3
+ import { c as g, e as h } from "./controlPlane-CoEgf9BA.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(() => {
@@ -0,0 +1,28 @@
1
+ function o(e) {
2
+ return e === "releases" ? "releases" : "workspace";
3
+ }
4
+ function t(e) {
5
+ const { view: s, ...r } = e;
6
+ return r;
7
+ }
8
+ function c(e, s, r) {
9
+ return {
10
+ name: "miniprogram-v2-project",
11
+ params: { projectId: e, view: s === "workspace" ? void 0 : s },
12
+ query: t(r)
13
+ };
14
+ }
15
+ function i(e, s = "settings") {
16
+ const r = new URLSearchParams();
17
+ for (const a of ["businessId", "country", "restaurantId"]) {
18
+ const n = e[a];
19
+ typeof n == "string" && r.set(a, n);
20
+ }
21
+ return `/brand/${s}${r.size ? `?${r}` : ""}`;
22
+ }
23
+ export {
24
+ o as a,
25
+ i as l,
26
+ t as p,
27
+ c as w
28
+ };
@@ -1,4 +1,5 @@
1
1
  const t = (e, s) => `/api/businesses/${e}/projects/${s}`, i = {
2
+ projects: (e) => `/api/businesses/${e}/projects`,
2
3
  portalContext: (e) => `/api/businesses/${e}/portal-context`,
3
4
  project: (e, s) => t(e, s),
4
5
  provision: (e, s) => `${t(e, s)}/provision`,