@commercetools-demo/puck-page-manager 0.5.0 → 0.5.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/index.js CHANGED
@@ -35,11 +35,37 @@ __export(index_exports, {
35
35
  module.exports = __toCommonJS(index_exports);
36
36
 
37
37
  // src/PageManager.tsx
38
- var import_react = require("react");
38
+ var import_react2 = require("react");
39
39
  var import_react_router_dom = require("react-router-dom");
40
40
  var import_puck_api = require("@commercetools-demo/puck-api");
41
41
  var import_puck_editor = require("@commercetools-demo/puck-editor");
42
42
  var import_puck_renderer = require("@commercetools-demo/puck-renderer");
43
+
44
+ // src/EnsureIntlProvider.tsx
45
+ var import_react = require("react");
46
+ var import_react_intl = require("react-intl");
47
+ var import_jsx_runtime = require("react/jsx-runtime");
48
+ var EnsureIntlProvider = ({ children }) => {
49
+ const intl = (0, import_react.useContext)(import_react_intl.IntlContext);
50
+ if (intl) {
51
+ return /* @__PURE__ */ (0, import_jsx_runtime.jsx)(import_jsx_runtime.Fragment, { children });
52
+ }
53
+ return /* @__PURE__ */ (0, import_jsx_runtime.jsx)(
54
+ import_react_intl.IntlProvider,
55
+ {
56
+ locale: "en",
57
+ defaultLocale: "en",
58
+ messages: {},
59
+ onError: (err) => {
60
+ if (err.code === import_react_intl.ReactIntlErrorCode.MISSING_TRANSLATION) return;
61
+ console.error(err);
62
+ },
63
+ children
64
+ }
65
+ );
66
+ };
67
+
68
+ // src/PageManager.tsx
43
69
  var import_data_table = __toESM(require("@commercetools-uikit/data-table"));
44
70
  var import_primary_button = __toESM(require("@commercetools-uikit/primary-button"));
45
71
  var import_secondary_button = __toESM(require("@commercetools-uikit/secondary-button"));
@@ -51,14 +77,14 @@ var import_loading_spinner = __toESM(require("@commercetools-uikit/loading-spinn
51
77
  var import_text_input = __toESM(require("@commercetools-uikit/text-input"));
52
78
  var import_label = __toESM(require("@commercetools-uikit/label"));
53
79
  var import_icons = require("@commercetools-uikit/icons");
54
- var import_jsx_runtime = require("react/jsx-runtime");
80
+ var import_jsx_runtime2 = require("react/jsx-runtime");
55
81
  var DEFAULT_CONFIG = {
56
82
  ...import_puck_editor.defaultPuckConfig,
57
83
  components: { ...import_puck_editor.defaultPuckConfig.components }
58
84
  };
59
85
  var StatusBadge = ({ variant }) => {
60
86
  const styles = variant === "published" ? { background: "var(--color-success-95)", color: "var(--color-success-40)", border: "1px solid var(--color-success-85)" } : variant === "draft" ? { background: "var(--color-warning-95)", color: "var(--color-warning-40)", border: "1px solid var(--color-warning-85)" } : { background: "var(--color-neutral-95)", color: "var(--color-neutral-50)", border: "1px solid var(--color-neutral-85)" };
61
- return /* @__PURE__ */ (0, import_jsx_runtime.jsx)(
87
+ return /* @__PURE__ */ (0, import_jsx_runtime2.jsx)(
62
88
  "span",
63
89
  {
64
90
  style: {
@@ -98,12 +124,12 @@ var COLUMNS = [
98
124
  var PageList = ({ backButton }) => {
99
125
  const history = (0, import_react_router_dom.useHistory)();
100
126
  const { pages, loading, error, createPage, deletePage, refresh } = (0, import_puck_api.usePuckPages)();
101
- const [creating, setCreating] = (0, import_react.useState)(false);
102
- const [newName, setNewName] = (0, import_react.useState)("");
103
- const [newSlug, setNewSlug] = (0, import_react.useState)("");
104
- const [formError, setFormError] = (0, import_react.useState)("");
105
- const [submitting, setSubmitting] = (0, import_react.useState)(false);
106
- const [deleting, setDeleting] = (0, import_react.useState)(null);
127
+ const [creating, setCreating] = (0, import_react2.useState)(false);
128
+ const [newName, setNewName] = (0, import_react2.useState)("");
129
+ const [newSlug, setNewSlug] = (0, import_react2.useState)("");
130
+ const [formError, setFormError] = (0, import_react2.useState)("");
131
+ const [submitting, setSubmitting] = (0, import_react2.useState)(false);
132
+ const [deleting, setDeleting] = (0, import_react2.useState)(null);
107
133
  const handleCreate = async () => {
108
134
  if (!newName.trim()) {
109
135
  setFormError("Name is required");
@@ -142,36 +168,36 @@ var PageList = ({ backButton }) => {
142
168
  }
143
169
  };
144
170
  if (loading) {
145
- return /* @__PURE__ */ (0, import_jsx_runtime.jsx)("div", { style: { padding: "64px", display: "flex", justifyContent: "center" }, children: /* @__PURE__ */ (0, import_jsx_runtime.jsx)(import_loading_spinner.default, {}) });
171
+ return /* @__PURE__ */ (0, import_jsx_runtime2.jsx)("div", { style: { padding: "64px", display: "flex", justifyContent: "center" }, children: /* @__PURE__ */ (0, import_jsx_runtime2.jsx)(import_loading_spinner.default, {}) });
146
172
  }
147
173
  if (error) {
148
- return /* @__PURE__ */ (0, import_jsx_runtime.jsx)("div", { style: { padding: "32px" }, children: /* @__PURE__ */ (0, import_jsx_runtime.jsxs)(import_text.default.Body, { tone: "negative", children: [
174
+ return /* @__PURE__ */ (0, import_jsx_runtime2.jsx)("div", { style: { padding: "32px" }, children: /* @__PURE__ */ (0, import_jsx_runtime2.jsxs)(import_text.default.Body, { tone: "negative", children: [
149
175
  "Error: ",
150
176
  error
151
177
  ] }) });
152
178
  }
153
179
  const rows = pages.map((p) => ({ ...p, id: p.key }));
154
- return /* @__PURE__ */ (0, import_jsx_runtime.jsx)("div", { style: { maxWidth: "1200px", margin: "0 auto", padding: "32px 24px" }, children: /* @__PURE__ */ (0, import_jsx_runtime.jsxs)(import_spacings.default.Stack, { scale: "l", children: [
155
- /* @__PURE__ */ (0, import_jsx_runtime.jsxs)(import_spacings.default.Inline, { justifyContent: "space-between", alignItems: "center", children: [
156
- /* @__PURE__ */ (0, import_jsx_runtime.jsxs)(import_spacings.default.Inline, { scale: "m", alignItems: "center", children: [
180
+ return /* @__PURE__ */ (0, import_jsx_runtime2.jsx)("div", { style: { maxWidth: "1200px", margin: "0 auto", padding: "32px 24px" }, children: /* @__PURE__ */ (0, import_jsx_runtime2.jsxs)(import_spacings.default.Stack, { scale: "l", children: [
181
+ /* @__PURE__ */ (0, import_jsx_runtime2.jsxs)(import_spacings.default.Inline, { justifyContent: "space-between", alignItems: "center", children: [
182
+ /* @__PURE__ */ (0, import_jsx_runtime2.jsxs)(import_spacings.default.Inline, { scale: "m", alignItems: "center", children: [
157
183
  backButton,
158
- /* @__PURE__ */ (0, import_jsx_runtime.jsx)(import_text.default.Headline, { as: "h1", children: "Puck Pages" })
184
+ /* @__PURE__ */ (0, import_jsx_runtime2.jsx)(import_text.default.Headline, { as: "h1", children: "Puck Pages" })
159
185
  ] }),
160
- /* @__PURE__ */ (0, import_jsx_runtime.jsx)(
186
+ /* @__PURE__ */ (0, import_jsx_runtime2.jsx)(
161
187
  import_primary_button.default,
162
188
  {
163
189
  label: "New Page",
164
- iconLeft: /* @__PURE__ */ (0, import_jsx_runtime.jsx)(import_icons.PlusThinIcon, {}),
190
+ iconLeft: /* @__PURE__ */ (0, import_jsx_runtime2.jsx)(import_icons.PlusThinIcon, {}),
165
191
  onClick: () => setCreating(true)
166
192
  }
167
193
  )
168
194
  ] }),
169
- creating && /* @__PURE__ */ (0, import_jsx_runtime.jsx)(import_card.default, { insetScale: "l", children: /* @__PURE__ */ (0, import_jsx_runtime.jsxs)(import_spacings.default.Stack, { scale: "m", children: [
170
- /* @__PURE__ */ (0, import_jsx_runtime.jsx)(import_text.default.Subheadline, { as: "h4", isBold: true, children: "Create New Page" }),
171
- /* @__PURE__ */ (0, import_jsx_runtime.jsxs)(import_spacings.default.Inline, { scale: "m", children: [
172
- /* @__PURE__ */ (0, import_jsx_runtime.jsx)("div", { style: { flex: 1 }, children: /* @__PURE__ */ (0, import_jsx_runtime.jsxs)(import_spacings.default.Stack, { scale: "xs", children: [
173
- /* @__PURE__ */ (0, import_jsx_runtime.jsx)(import_label.default, { htmlFor: "new-page-name", children: "Name *" }),
174
- /* @__PURE__ */ (0, import_jsx_runtime.jsx)(
195
+ creating && /* @__PURE__ */ (0, import_jsx_runtime2.jsx)(import_card.default, { insetScale: "l", children: /* @__PURE__ */ (0, import_jsx_runtime2.jsxs)(import_spacings.default.Stack, { scale: "m", children: [
196
+ /* @__PURE__ */ (0, import_jsx_runtime2.jsx)(import_text.default.Subheadline, { as: "h4", isBold: true, children: "Create New Page" }),
197
+ /* @__PURE__ */ (0, import_jsx_runtime2.jsxs)(import_spacings.default.Inline, { scale: "m", children: [
198
+ /* @__PURE__ */ (0, import_jsx_runtime2.jsx)("div", { style: { flex: 1 }, children: /* @__PURE__ */ (0, import_jsx_runtime2.jsxs)(import_spacings.default.Stack, { scale: "xs", children: [
199
+ /* @__PURE__ */ (0, import_jsx_runtime2.jsx)(import_label.default, { htmlFor: "new-page-name", children: "Name *" }),
200
+ /* @__PURE__ */ (0, import_jsx_runtime2.jsx)(
175
201
  import_text_input.default,
176
202
  {
177
203
  id: "new-page-name",
@@ -181,9 +207,9 @@ var PageList = ({ backButton }) => {
181
207
  }
182
208
  )
183
209
  ] }) }),
184
- /* @__PURE__ */ (0, import_jsx_runtime.jsx)("div", { style: { flex: 1 }, children: /* @__PURE__ */ (0, import_jsx_runtime.jsxs)(import_spacings.default.Stack, { scale: "xs", children: [
185
- /* @__PURE__ */ (0, import_jsx_runtime.jsx)(import_label.default, { htmlFor: "new-page-slug", children: "Slug *" }),
186
- /* @__PURE__ */ (0, import_jsx_runtime.jsx)(
210
+ /* @__PURE__ */ (0, import_jsx_runtime2.jsx)("div", { style: { flex: 1 }, children: /* @__PURE__ */ (0, import_jsx_runtime2.jsxs)(import_spacings.default.Stack, { scale: "xs", children: [
211
+ /* @__PURE__ */ (0, import_jsx_runtime2.jsx)(import_label.default, { htmlFor: "new-page-slug", children: "Slug *" }),
212
+ /* @__PURE__ */ (0, import_jsx_runtime2.jsx)(
187
213
  import_text_input.default,
188
214
  {
189
215
  id: "new-page-slug",
@@ -194,9 +220,9 @@ var PageList = ({ backButton }) => {
194
220
  )
195
221
  ] }) })
196
222
  ] }),
197
- formError && /* @__PURE__ */ (0, import_jsx_runtime.jsx)(import_text.default.Body, { tone: "negative", children: formError }),
198
- /* @__PURE__ */ (0, import_jsx_runtime.jsxs)(import_spacings.default.Inline, { scale: "s", children: [
199
- /* @__PURE__ */ (0, import_jsx_runtime.jsx)(
223
+ formError && /* @__PURE__ */ (0, import_jsx_runtime2.jsx)(import_text.default.Body, { tone: "negative", children: formError }),
224
+ /* @__PURE__ */ (0, import_jsx_runtime2.jsxs)(import_spacings.default.Inline, { scale: "s", children: [
225
+ /* @__PURE__ */ (0, import_jsx_runtime2.jsx)(
200
226
  import_primary_button.default,
201
227
  {
202
228
  label: submitting ? "Creating\u2026" : "Create",
@@ -204,7 +230,7 @@ var PageList = ({ backButton }) => {
204
230
  isDisabled: submitting
205
231
  }
206
232
  ),
207
- /* @__PURE__ */ (0, import_jsx_runtime.jsx)(
233
+ /* @__PURE__ */ (0, import_jsx_runtime2.jsx)(
208
234
  import_secondary_button.default,
209
235
  {
210
236
  label: "Cancel",
@@ -216,17 +242,17 @@ var PageList = ({ backButton }) => {
216
242
  )
217
243
  ] })
218
244
  ] }) }),
219
- pages.length === 0 && !creating ? /* @__PURE__ */ (0, import_jsx_runtime.jsxs)(import_spacings.default.Stack, { scale: "m", alignItems: "center", children: [
220
- /* @__PURE__ */ (0, import_jsx_runtime.jsx)(import_text.default.Body, { tone: "secondary", children: "No pages yet." }),
221
- /* @__PURE__ */ (0, import_jsx_runtime.jsx)(
245
+ pages.length === 0 && !creating ? /* @__PURE__ */ (0, import_jsx_runtime2.jsxs)(import_spacings.default.Stack, { scale: "m", alignItems: "center", children: [
246
+ /* @__PURE__ */ (0, import_jsx_runtime2.jsx)(import_text.default.Body, { tone: "secondary", children: "No pages yet." }),
247
+ /* @__PURE__ */ (0, import_jsx_runtime2.jsx)(
222
248
  import_primary_button.default,
223
249
  {
224
250
  label: "Create first page",
225
- iconLeft: /* @__PURE__ */ (0, import_jsx_runtime.jsx)(import_icons.PlusThinIcon, {}),
251
+ iconLeft: /* @__PURE__ */ (0, import_jsx_runtime2.jsx)(import_icons.PlusThinIcon, {}),
226
252
  onClick: () => setCreating(true)
227
253
  }
228
254
  )
229
- ] }) : pages.length > 0 ? /* @__PURE__ */ (0, import_jsx_runtime.jsx)(
255
+ ] }) : pages.length > 0 ? /* @__PURE__ */ (0, import_jsx_runtime2.jsx)(
230
256
  import_data_table.default,
231
257
  {
232
258
  columns: COLUMNS,
@@ -234,12 +260,12 @@ var PageList = ({ backButton }) => {
234
260
  itemRenderer: (row, column) => {
235
261
  switch (column.key) {
236
262
  case "name":
237
- return /* @__PURE__ */ (0, import_jsx_runtime.jsxs)(import_spacings.default.Stack, { scale: "xs", children: [
238
- /* @__PURE__ */ (0, import_jsx_runtime.jsx)(import_text.default.Body, { isBold: true, children: row.value.name }),
239
- /* @__PURE__ */ (0, import_jsx_runtime.jsx)(import_text.default.Detail, { tone: "secondary", children: row.key })
263
+ return /* @__PURE__ */ (0, import_jsx_runtime2.jsxs)(import_spacings.default.Stack, { scale: "xs", children: [
264
+ /* @__PURE__ */ (0, import_jsx_runtime2.jsx)(import_text.default.Body, { isBold: true, children: row.value.name }),
265
+ /* @__PURE__ */ (0, import_jsx_runtime2.jsx)(import_text.default.Detail, { tone: "secondary", children: row.key })
240
266
  ] });
241
267
  case "slug":
242
- return /* @__PURE__ */ (0, import_jsx_runtime.jsx)(
268
+ return /* @__PURE__ */ (0, import_jsx_runtime2.jsx)(
243
269
  "code",
244
270
  {
245
271
  style: {
@@ -253,16 +279,16 @@ var PageList = ({ backButton }) => {
253
279
  }
254
280
  );
255
281
  case "status":
256
- return /* @__PURE__ */ (0, import_jsx_runtime.jsxs)("span", { children: [
257
- row.states.draft && /* @__PURE__ */ (0, import_jsx_runtime.jsx)(StatusBadge, { variant: "draft" }),
258
- row.states.published && /* @__PURE__ */ (0, import_jsx_runtime.jsx)(StatusBadge, { variant: "published" }),
259
- !row.states.draft && !row.states.published && /* @__PURE__ */ (0, import_jsx_runtime.jsx)(StatusBadge, { variant: "none" })
282
+ return /* @__PURE__ */ (0, import_jsx_runtime2.jsxs)("span", { children: [
283
+ row.states.draft && /* @__PURE__ */ (0, import_jsx_runtime2.jsx)(StatusBadge, { variant: "draft" }),
284
+ row.states.published && /* @__PURE__ */ (0, import_jsx_runtime2.jsx)(StatusBadge, { variant: "published" }),
285
+ !row.states.draft && !row.states.published && /* @__PURE__ */ (0, import_jsx_runtime2.jsx)(StatusBadge, { variant: "none" })
260
286
  ] });
261
287
  case "updatedAt":
262
- return /* @__PURE__ */ (0, import_jsx_runtime.jsx)(import_text.default.Body, { tone: "secondary", children: new Date(row.value.updatedAt).toLocaleString() });
288
+ return /* @__PURE__ */ (0, import_jsx_runtime2.jsx)(import_text.default.Body, { tone: "secondary", children: new Date(row.value.updatedAt).toLocaleString() });
263
289
  case "actions":
264
- return /* @__PURE__ */ (0, import_jsx_runtime.jsxs)("div", { style: { display: "flex", alignItems: "center", gap: "8px" }, children: [
265
- /* @__PURE__ */ (0, import_jsx_runtime.jsx)(
290
+ return /* @__PURE__ */ (0, import_jsx_runtime2.jsxs)("div", { style: { display: "flex", alignItems: "center", gap: "8px" }, children: [
291
+ /* @__PURE__ */ (0, import_jsx_runtime2.jsx)(
266
292
  import_primary_button.default,
267
293
  {
268
294
  label: "Edit",
@@ -270,7 +296,7 @@ var PageList = ({ backButton }) => {
270
296
  onClick: () => history.push(`/${row.key}/edit`, { pageName: row.value.name })
271
297
  }
272
298
  ),
273
- /* @__PURE__ */ (0, import_jsx_runtime.jsx)(
299
+ /* @__PURE__ */ (0, import_jsx_runtime2.jsx)(
274
300
  import_secondary_button.default,
275
301
  {
276
302
  label: "Preview",
@@ -278,7 +304,7 @@ var PageList = ({ backButton }) => {
278
304
  onClick: () => history.push(`/${row.key}/preview`, { pageName: row.value.name })
279
305
  }
280
306
  ),
281
- /* @__PURE__ */ (0, import_jsx_runtime.jsx)(
307
+ /* @__PURE__ */ (0, import_jsx_runtime2.jsx)(
282
308
  import_flat_button.default,
283
309
  {
284
310
  tone: "critical",
@@ -302,23 +328,23 @@ var PageEditorRoute = ({ config, backButton }) => {
302
328
  const location = (0, import_react_router_dom.useLocation)();
303
329
  const { baseURL, projectKey, businessUnitKey, jwtToken } = (0, import_puck_api.usePuckApiContext)();
304
330
  const pageName = location.state?.pageName ?? pageKey ?? "Page";
305
- return /* @__PURE__ */ (0, import_jsx_runtime.jsxs)("div", { style: { display: "flex", flexDirection: "column", height: "100%" }, children: [
306
- /* @__PURE__ */ (0, import_jsx_runtime.jsxs)("div", { style: NAV_BAR_STYLE, children: [
331
+ return /* @__PURE__ */ (0, import_jsx_runtime2.jsxs)("div", { style: { display: "flex", flexDirection: "column", height: "100%" }, children: [
332
+ /* @__PURE__ */ (0, import_jsx_runtime2.jsxs)("div", { style: NAV_BAR_STYLE, children: [
307
333
  backButton,
308
- backButton && /* @__PURE__ */ (0, import_jsx_runtime.jsx)(import_text.default.Body, { tone: "secondary", children: "/" }),
309
- /* @__PURE__ */ (0, import_jsx_runtime.jsx)(
334
+ backButton && /* @__PURE__ */ (0, import_jsx_runtime2.jsx)(import_text.default.Body, { tone: "secondary", children: "/" }),
335
+ /* @__PURE__ */ (0, import_jsx_runtime2.jsx)(
310
336
  import_flat_button.default,
311
337
  {
312
338
  label: "Pages",
313
- icon: /* @__PURE__ */ (0, import_jsx_runtime.jsx)(import_icons.AngleLeftIcon, {}),
339
+ icon: /* @__PURE__ */ (0, import_jsx_runtime2.jsx)(import_icons.AngleLeftIcon, {}),
314
340
  iconPosition: "left",
315
341
  onClick: () => history.push("/")
316
342
  }
317
343
  ),
318
- /* @__PURE__ */ (0, import_jsx_runtime.jsx)(import_text.default.Body, { tone: "secondary", children: "/" }),
319
- /* @__PURE__ */ (0, import_jsx_runtime.jsx)(import_text.default.Body, { isBold: true, children: pageName })
344
+ /* @__PURE__ */ (0, import_jsx_runtime2.jsx)(import_text.default.Body, { tone: "secondary", children: "/" }),
345
+ /* @__PURE__ */ (0, import_jsx_runtime2.jsx)(import_text.default.Body, { isBold: true, children: pageName })
320
346
  ] }),
321
- /* @__PURE__ */ (0, import_jsx_runtime.jsx)("div", { style: { flex: 1, overflow: "hidden" }, children: /* @__PURE__ */ (0, import_jsx_runtime.jsx)(
347
+ /* @__PURE__ */ (0, import_jsx_runtime2.jsx)("div", { style: { flex: 1, overflow: "hidden" }, children: /* @__PURE__ */ (0, import_jsx_runtime2.jsx)(
322
348
  import_puck_editor.PuckEditor,
323
349
  {
324
350
  baseURL,
@@ -339,22 +365,22 @@ var PagePreviewRoute = ({ config, backButton }) => {
339
365
  const history = (0, import_react_router_dom.useHistory)();
340
366
  const location = (0, import_react_router_dom.useLocation)();
341
367
  const pageName = location.state?.pageName ?? pageKey ?? "Page";
342
- return /* @__PURE__ */ (0, import_jsx_runtime.jsxs)("div", { children: [
343
- /* @__PURE__ */ (0, import_jsx_runtime.jsxs)("div", { style: NAV_BAR_STYLE, children: [
368
+ return /* @__PURE__ */ (0, import_jsx_runtime2.jsxs)("div", { children: [
369
+ /* @__PURE__ */ (0, import_jsx_runtime2.jsxs)("div", { style: NAV_BAR_STYLE, children: [
344
370
  backButton,
345
- backButton && /* @__PURE__ */ (0, import_jsx_runtime.jsx)(import_text.default.Body, { tone: "secondary", children: "/" }),
346
- /* @__PURE__ */ (0, import_jsx_runtime.jsx)(
371
+ backButton && /* @__PURE__ */ (0, import_jsx_runtime2.jsx)(import_text.default.Body, { tone: "secondary", children: "/" }),
372
+ /* @__PURE__ */ (0, import_jsx_runtime2.jsx)(
347
373
  import_flat_button.default,
348
374
  {
349
375
  label: "Pages",
350
- icon: /* @__PURE__ */ (0, import_jsx_runtime.jsx)(import_icons.AngleLeftIcon, {}),
376
+ icon: /* @__PURE__ */ (0, import_jsx_runtime2.jsx)(import_icons.AngleLeftIcon, {}),
351
377
  iconPosition: "left",
352
378
  onClick: () => history.push("/")
353
379
  }
354
380
  ),
355
- /* @__PURE__ */ (0, import_jsx_runtime.jsx)(import_text.default.Body, { tone: "secondary", children: "/" }),
356
- /* @__PURE__ */ (0, import_jsx_runtime.jsx)(import_text.default.Body, { isBold: true, children: pageName }),
357
- /* @__PURE__ */ (0, import_jsx_runtime.jsx)(
381
+ /* @__PURE__ */ (0, import_jsx_runtime2.jsx)(import_text.default.Body, { tone: "secondary", children: "/" }),
382
+ /* @__PURE__ */ (0, import_jsx_runtime2.jsx)(import_text.default.Body, { isBold: true, children: pageName }),
383
+ /* @__PURE__ */ (0, import_jsx_runtime2.jsx)(
358
384
  "span",
359
385
  {
360
386
  style: {
@@ -372,23 +398,23 @@ var PagePreviewRoute = ({ config, backButton }) => {
372
398
  }
373
399
  )
374
400
  ] }),
375
- /* @__PURE__ */ (0, import_jsx_runtime.jsx)(import_puck_renderer.PuckRenderer, { pageKey, mode: "preview", config })
401
+ /* @__PURE__ */ (0, import_jsx_runtime2.jsx)(import_puck_renderer.PuckRenderer, { pageKey, mode: "preview", config })
376
402
  ] });
377
403
  };
378
- var PageManagerInner = ({ config, backButton }) => /* @__PURE__ */ (0, import_jsx_runtime.jsxs)(import_react_router_dom.Switch, { children: [
379
- /* @__PURE__ */ (0, import_jsx_runtime.jsx)(import_react_router_dom.Route, { exact: true, path: "/", render: () => /* @__PURE__ */ (0, import_jsx_runtime.jsx)(PageList, { backButton }) }),
380
- /* @__PURE__ */ (0, import_jsx_runtime.jsx)(
404
+ var PageManagerInner = ({ config, backButton }) => /* @__PURE__ */ (0, import_jsx_runtime2.jsxs)(import_react_router_dom.Switch, { children: [
405
+ /* @__PURE__ */ (0, import_jsx_runtime2.jsx)(import_react_router_dom.Route, { exact: true, path: "/", render: () => /* @__PURE__ */ (0, import_jsx_runtime2.jsx)(PageList, { backButton }) }),
406
+ /* @__PURE__ */ (0, import_jsx_runtime2.jsx)(
381
407
  import_react_router_dom.Route,
382
408
  {
383
409
  path: "/:pageKey/edit",
384
- render: () => /* @__PURE__ */ (0, import_jsx_runtime.jsx)(PageEditorRoute, { config, backButton })
410
+ render: () => /* @__PURE__ */ (0, import_jsx_runtime2.jsx)(PageEditorRoute, { config, backButton })
385
411
  }
386
412
  ),
387
- /* @__PURE__ */ (0, import_jsx_runtime.jsx)(
413
+ /* @__PURE__ */ (0, import_jsx_runtime2.jsx)(
388
414
  import_react_router_dom.Route,
389
415
  {
390
416
  path: "/:pageKey/preview",
391
- render: () => /* @__PURE__ */ (0, import_jsx_runtime.jsx)(PagePreviewRoute, { config, backButton })
417
+ render: () => /* @__PURE__ */ (0, import_jsx_runtime2.jsx)(PagePreviewRoute, { config, backButton })
392
418
  }
393
419
  )
394
420
  ] });
@@ -400,16 +426,16 @@ var PageManager = ({
400
426
  jwtToken,
401
427
  config = DEFAULT_CONFIG,
402
428
  backButton
403
- }) => /* @__PURE__ */ (0, import_jsx_runtime.jsx)(
429
+ }) => /* @__PURE__ */ (0, import_jsx_runtime2.jsx)(EnsureIntlProvider, { children: /* @__PURE__ */ (0, import_jsx_runtime2.jsx)(
404
430
  import_puck_api.PuckApiProvider,
405
431
  {
406
432
  baseURL,
407
433
  projectKey,
408
434
  businessUnitKey,
409
435
  jwtToken,
410
- children: /* @__PURE__ */ (0, import_jsx_runtime.jsx)(import_react_router_dom.BrowserRouter, { basename: parentUrl, children: /* @__PURE__ */ (0, import_jsx_runtime.jsx)(PageManagerInner, { config, backButton }) })
436
+ children: /* @__PURE__ */ (0, import_jsx_runtime2.jsx)(import_react_router_dom.BrowserRouter, { basename: parentUrl, children: /* @__PURE__ */ (0, import_jsx_runtime2.jsx)(PageManagerInner, { config, backButton }) })
411
437
  }
412
- );
438
+ ) });
413
439
  // Annotate the CommonJS export names for ESM import in node:
414
440
  0 && (module.exports = {
415
441
  PageManager
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/index.ts","../src/PageManager.tsx"],"sourcesContent":["export { PageManager } from './PageManager';\nexport type { PageManagerProps } from './PageManager';\n","import React, { useState, type ReactNode } from 'react';\nimport {\n BrowserRouter,\n Switch,\n Route,\n useHistory,\n useParams,\n useLocation,\n} from 'react-router-dom';\nimport {\n PuckApiProvider,\n usePuckPages,\n usePuckApiContext,\n} from '@commercetools-demo/puck-api';\nimport { PuckEditor, defaultPuckConfig } from '@commercetools-demo/puck-editor';\nimport { PuckRenderer } from '@commercetools-demo/puck-renderer';\n\nconst DEFAULT_CONFIG: Config = {\n ...defaultPuckConfig,\n components: { ...defaultPuckConfig.components },\n};\nimport type { Config } from '@measured/puck';\nimport type { CreatePuckPageInput, PuckPageListItem } from '@commercetools-demo/puck-types';\nimport DataTable from '@commercetools-uikit/data-table';\nimport PrimaryButton from '@commercetools-uikit/primary-button';\nimport SecondaryButton from '@commercetools-uikit/secondary-button';\nimport FlatButton from '@commercetools-uikit/flat-button';\nimport Card from '@commercetools-uikit/card';\nimport Spacings from '@commercetools-uikit/spacings';\nimport Text from '@commercetools-uikit/text';\nimport LoadingSpinner from '@commercetools-uikit/loading-spinner';\nimport TextInput from '@commercetools-uikit/text-input';\nimport Label from '@commercetools-uikit/label';\nimport { PlusThinIcon, AngleLeftIcon } from '@commercetools-uikit/icons';\n\n// ---------------------------------------------------------------------------\n// Status badge\n// ---------------------------------------------------------------------------\n\nconst StatusBadge: React.FC<{ variant: 'draft' | 'published' | 'none' }> = ({ variant }) => {\n const styles: React.CSSProperties =\n variant === 'published'\n ? { background: 'var(--color-success-95)', color: 'var(--color-success-40)', border: '1px solid var(--color-success-85)' }\n : variant === 'draft'\n ? { background: 'var(--color-warning-95)', color: 'var(--color-warning-40)', border: '1px solid var(--color-warning-85)' }\n : { background: 'var(--color-neutral-95)', color: 'var(--color-neutral-50)', border: '1px solid var(--color-neutral-85)' };\n return (\n <span\n style={{\n ...styles,\n display: 'inline-flex',\n alignItems: 'center',\n padding: '2px 8px',\n borderRadius: 'var(--border-radius-20)',\n fontSize: 'var(--font-size-10)',\n fontWeight: 'var(--font-weight-600)',\n marginRight: '4px',\n whiteSpace: 'nowrap',\n }}\n >\n {variant === 'published' ? 'Published' : variant === 'draft' ? 'Draft' : 'No state'}\n </span>\n );\n};\n\n// ---------------------------------------------------------------------------\n// Shared nav bar style\n// ---------------------------------------------------------------------------\n\nconst NAV_BAR_STYLE: React.CSSProperties = {\n position: 'sticky',\n top: 0,\n display: 'flex',\n alignItems: 'center',\n gap: '12px',\n padding: '8px 16px',\n background: 'var(--color-surface, #fff)',\n borderBottom: '1px solid var(--color-neutral-90)',\n zIndex: 200,\n flexShrink: 0,\n};\n\n// ---------------------------------------------------------------------------\n// Table columns\n// ---------------------------------------------------------------------------\n\ntype PageRow = PuckPageListItem & { id: string };\n\nconst COLUMNS = [\n { key: 'name', label: 'Name' },\n { key: 'slug', label: 'Slug' },\n { key: 'status', label: 'Status' },\n { key: 'updatedAt', label: 'Updated' },\n { key: 'actions', label: 'Actions', shouldIgnoreRowClick: true },\n];\n\n// ---------------------------------------------------------------------------\n// PageList route\n// ---------------------------------------------------------------------------\n\ninterface PageListProps {\n backButton?: ReactNode;\n}\n\nconst PageList: React.FC<PageListProps> = ({ backButton }) => {\n const history = useHistory();\n const { pages, loading, error, createPage, deletePage, refresh } = usePuckPages();\n\n const [creating, setCreating] = useState(false);\n const [newName, setNewName] = useState('');\n const [newSlug, setNewSlug] = useState('');\n const [formError, setFormError] = useState('');\n const [submitting, setSubmitting] = useState(false);\n const [deleting, setDeleting] = useState<string | null>(null);\n\n const handleCreate = async () => {\n if (!newName.trim()) { setFormError('Name is required'); return; }\n if (!newSlug.trim()) { setFormError('Slug is required'); return; }\n setFormError('');\n setSubmitting(true);\n try {\n const input: CreatePuckPageInput = {\n name: newName.trim(),\n slug: newSlug.trim().startsWith('/') ? newSlug.trim() : `/${newSlug.trim()}`,\n };\n const created = await createPage(input);\n setCreating(false);\n setNewName('');\n setNewSlug('');\n history.push(`/${created.key}/edit`, { pageName: created.value.name });\n } catch (err) {\n setFormError((err as Error).message);\n } finally {\n setSubmitting(false);\n }\n };\n\n const handleDelete = async (page: PuckPageListItem) => {\n if (!confirm(`Delete \"${page.value.name}\"? This cannot be undone.`)) return;\n setDeleting(page.key);\n try {\n await deletePage(page.key);\n await refresh();\n } finally {\n setDeleting(null);\n }\n };\n\n if (loading) {\n return (\n <div style={{ padding: '64px', display: 'flex', justifyContent: 'center' }}>\n <LoadingSpinner />\n </div>\n );\n }\n\n if (error) {\n return (\n <div style={{ padding: '32px' }}>\n <Text.Body tone=\"negative\">Error: {error}</Text.Body>\n </div>\n );\n }\n\n const rows: PageRow[] = pages.map((p: PuckPageListItem) => ({ ...p, id: p.key }));\n\n return (\n <div style={{ maxWidth: '1200px', margin: '0 auto', padding: '32px 24px' }}>\n <Spacings.Stack scale=\"l\">\n <Spacings.Inline justifyContent=\"space-between\" alignItems=\"center\">\n <Spacings.Inline scale=\"m\" alignItems=\"center\">\n {backButton}\n <Text.Headline as=\"h1\">Puck Pages</Text.Headline>\n </Spacings.Inline>\n <PrimaryButton\n label=\"New Page\"\n iconLeft={<PlusThinIcon />}\n onClick={() => setCreating(true)}\n />\n </Spacings.Inline>\n\n {creating && (\n <Card insetScale=\"l\">\n <Spacings.Stack scale=\"m\">\n <Text.Subheadline as=\"h4\" isBold>Create New Page</Text.Subheadline>\n <Spacings.Inline scale=\"m\">\n <div style={{ flex: 1 }}>\n <Spacings.Stack scale=\"xs\">\n <Label htmlFor=\"new-page-name\">Name *</Label>\n <TextInput\n id=\"new-page-name\"\n value={newName}\n onChange={(e) => setNewName(e.target.value)}\n placeholder=\"Home Page\"\n />\n </Spacings.Stack>\n </div>\n <div style={{ flex: 1 }}>\n <Spacings.Stack scale=\"xs\">\n <Label htmlFor=\"new-page-slug\">Slug *</Label>\n <TextInput\n id=\"new-page-slug\"\n value={newSlug}\n onChange={(e) => setNewSlug(e.target.value)}\n placeholder=\"/home\"\n />\n </Spacings.Stack>\n </div>\n </Spacings.Inline>\n {formError && <Text.Body tone=\"negative\">{formError}</Text.Body>}\n <Spacings.Inline scale=\"s\">\n <PrimaryButton\n label={submitting ? 'Creating…' : 'Create'}\n onClick={() => void handleCreate()}\n isDisabled={submitting}\n />\n <SecondaryButton\n label=\"Cancel\"\n onClick={() => { setCreating(false); setFormError(''); }}\n />\n </Spacings.Inline>\n </Spacings.Stack>\n </Card>\n )}\n\n {pages.length === 0 && !creating ? (\n <Spacings.Stack scale=\"m\" alignItems=\"center\">\n <Text.Body tone=\"secondary\">No pages yet.</Text.Body>\n <PrimaryButton\n label=\"Create first page\"\n iconLeft={<PlusThinIcon />}\n onClick={() => setCreating(true)}\n />\n </Spacings.Stack>\n ) : pages.length > 0 ? (\n <DataTable\n columns={COLUMNS}\n rows={rows}\n itemRenderer={(row: PageRow, column) => {\n switch (column.key) {\n case 'name':\n return (\n <Spacings.Stack scale=\"xs\">\n <Text.Body isBold>{row.value.name}</Text.Body>\n <Text.Detail tone=\"secondary\">{row.key}</Text.Detail>\n </Spacings.Stack>\n );\n case 'slug':\n return (\n <code\n style={{\n background: 'var(--color-neutral-95)',\n padding: '2px 6px',\n borderRadius: 'var(--border-radius-4)',\n fontSize: 'var(--font-size-10)',\n fontFamily: 'monospace',\n }}\n >\n {row.value.slug}\n </code>\n );\n case 'status':\n return (\n <span>\n {row.states.draft && <StatusBadge variant=\"draft\" />}\n {row.states.published && <StatusBadge variant=\"published\" />}\n {!row.states.draft && !row.states.published && <StatusBadge variant=\"none\" />}\n </span>\n );\n case 'updatedAt':\n return (\n <Text.Body tone=\"secondary\">\n {new Date(row.value.updatedAt).toLocaleString()}\n </Text.Body>\n );\n case 'actions':\n return (\n <div style={{ display: 'flex', alignItems: 'center', gap: '8px' }}>\n <PrimaryButton\n label=\"Edit\"\n size=\"20\"\n onClick={() =>\n history.push(`/${row.key}/edit`, { pageName: row.value.name })\n }\n />\n <SecondaryButton\n label=\"Preview\"\n size=\"20\"\n onClick={() =>\n history.push(`/${row.key}/preview`, { pageName: row.value.name })\n }\n />\n <FlatButton\n tone=\"critical\"\n label={deleting === row.key ? '…' : 'Delete'}\n isDisabled={deleting === row.key}\n onClick={() => void handleDelete(row)}\n />\n </div>\n );\n default:\n return null;\n }\n }}\n />\n ) : null}\n </Spacings.Stack>\n </div>\n );\n};\n\n// ---------------------------------------------------------------------------\n// PageEditorRoute\n// ---------------------------------------------------------------------------\n\ninterface RouteProps {\n config: Config;\n backButton?: ReactNode;\n}\n\nconst PageEditorRoute: React.FC<RouteProps> = ({ config, backButton }) => {\n const { pageKey } = useParams<{ pageKey: string }>();\n const history = useHistory();\n const location = useLocation();\n const { baseURL, projectKey, businessUnitKey, jwtToken } = usePuckApiContext();\n const pageName =\n (location.state as { pageName?: string } | null)?.pageName ?? pageKey ?? 'Page';\n\n return (\n <div style={{ display: 'flex', flexDirection: 'column', height: '100%' }}>\n <div style={NAV_BAR_STYLE}>\n {backButton}\n {backButton && <Text.Body tone=\"secondary\">/</Text.Body>}\n <FlatButton\n label=\"Pages\"\n icon={<AngleLeftIcon />}\n iconPosition=\"left\"\n onClick={() => history.push('/')}\n />\n <Text.Body tone=\"secondary\">/</Text.Body>\n <Text.Body isBold>{pageName}</Text.Body>\n </div>\n <div style={{ flex: 1, overflow: 'hidden' }}>\n <PuckEditor\n baseURL={baseURL}\n projectKey={projectKey}\n businessUnitKey={businessUnitKey}\n jwtToken={jwtToken ?? ''}\n pageKey={pageKey!}\n config={config}\n onError={(err: Error) => { console.error('[PageManager] editor error:', err); }}\n />\n </div>\n </div>\n );\n};\n\n// ---------------------------------------------------------------------------\n// PagePreviewRoute\n// ---------------------------------------------------------------------------\n\nconst PagePreviewRoute: React.FC<RouteProps> = ({ config, backButton }) => {\n const { pageKey } = useParams<{ pageKey: string }>();\n const history = useHistory();\n const location = useLocation();\n const pageName =\n (location.state as { pageName?: string } | null)?.pageName ?? pageKey ?? 'Page';\n\n return (\n <div>\n <div style={NAV_BAR_STYLE}>\n {backButton}\n {backButton && <Text.Body tone=\"secondary\">/</Text.Body>}\n <FlatButton\n label=\"Pages\"\n icon={<AngleLeftIcon />}\n iconPosition=\"left\"\n onClick={() => history.push('/')}\n />\n <Text.Body tone=\"secondary\">/</Text.Body>\n <Text.Body isBold>{pageName}</Text.Body>\n <span\n style={{\n background: 'var(--color-primary-95)',\n color: 'var(--color-primary-25)',\n border: '1px solid var(--color-primary-85)',\n display: 'inline-flex',\n alignItems: 'center',\n padding: '2px 10px',\n borderRadius: 'var(--border-radius-20)',\n fontSize: 'var(--font-size-10)',\n fontWeight: 'var(--font-weight-600)',\n }}\n >\n Preview\n </span>\n </div>\n <PuckRenderer pageKey={pageKey} mode=\"preview\" config={config} />\n </div>\n );\n};\n\n// ---------------------------------------------------------------------------\n// Inner router component\n// ---------------------------------------------------------------------------\n\ninterface PageManagerInnerProps {\n config: Config;\n backButton?: ReactNode;\n}\n\nconst PageManagerInner: React.FC<PageManagerInnerProps> = ({ config, backButton }) => (\n <Switch>\n <Route exact path=\"/\" render={() => <PageList backButton={backButton} />} />\n <Route\n path=\"/:pageKey/edit\"\n render={() => <PageEditorRoute config={config} backButton={backButton} />}\n />\n <Route\n path=\"/:pageKey/preview\"\n render={() => <PagePreviewRoute config={config} backButton={backButton} />}\n />\n </Switch>\n);\n\n// ---------------------------------------------------------------------------\n// Public component\n// ---------------------------------------------------------------------------\n\nexport interface PageManagerProps {\n /** URL path where this manager is mounted, e.g. \"/pages\" — used as router basename */\n parentUrl: string;\n baseURL: string;\n projectKey: string;\n businessUnitKey: string;\n jwtToken: string;\n /** Puck component config — passed to editor and preview. Defaults to defaultPuckConfig. */\n config?: Config;\n /** Optional element rendered before the breadcrumb in editor/preview headers */\n backButton?: ReactNode;\n}\n\nexport const PageManager: React.FC<PageManagerProps> = ({\n parentUrl,\n baseURL,\n projectKey,\n businessUnitKey,\n jwtToken,\n config = DEFAULT_CONFIG,\n backButton,\n}) => (\n <PuckApiProvider\n baseURL={baseURL}\n projectKey={projectKey}\n businessUnitKey={businessUnitKey}\n jwtToken={jwtToken}\n >\n <BrowserRouter basename={parentUrl}>\n <PageManagerInner config={config} backButton={backButton} />\n </BrowserRouter>\n </PuckApiProvider>\n);\n"],"mappings":"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","names":["LoadingSpinner","Text","Spacings","PrimaryButton","Card","Label","TextInput","SecondaryButton","DataTable","FlatButton"]}
1
+ {"version":3,"sources":["../src/index.ts","../src/PageManager.tsx","../src/EnsureIntlProvider.tsx"],"sourcesContent":["export { PageManager } from './PageManager';\nexport type { PageManagerProps } from './PageManager';\n","import React, { useState, type ReactNode } from 'react';\nimport {\n BrowserRouter,\n Switch,\n Route,\n useHistory,\n useParams,\n useLocation,\n} from 'react-router-dom';\nimport {\n PuckApiProvider,\n usePuckPages,\n usePuckApiContext,\n} from '@commercetools-demo/puck-api';\nimport { PuckEditor, defaultPuckConfig } from '@commercetools-demo/puck-editor';\nimport { PuckRenderer } from '@commercetools-demo/puck-renderer';\nimport { EnsureIntlProvider } from './EnsureIntlProvider';\n\nconst DEFAULT_CONFIG: Config = {\n ...defaultPuckConfig,\n components: { ...defaultPuckConfig.components },\n};\nimport type { Config } from '@measured/puck';\nimport type { CreatePuckPageInput, PuckPageListItem } from '@commercetools-demo/puck-types';\nimport DataTable from '@commercetools-uikit/data-table';\nimport PrimaryButton from '@commercetools-uikit/primary-button';\nimport SecondaryButton from '@commercetools-uikit/secondary-button';\nimport FlatButton from '@commercetools-uikit/flat-button';\nimport Card from '@commercetools-uikit/card';\nimport Spacings from '@commercetools-uikit/spacings';\nimport Text from '@commercetools-uikit/text';\nimport LoadingSpinner from '@commercetools-uikit/loading-spinner';\nimport TextInput from '@commercetools-uikit/text-input';\nimport Label from '@commercetools-uikit/label';\nimport { PlusThinIcon, AngleLeftIcon } from '@commercetools-uikit/icons';\n\n// ---------------------------------------------------------------------------\n// Status badge\n// ---------------------------------------------------------------------------\n\nconst StatusBadge: React.FC<{ variant: 'draft' | 'published' | 'none' }> = ({ variant }) => {\n const styles: React.CSSProperties =\n variant === 'published'\n ? { background: 'var(--color-success-95)', color: 'var(--color-success-40)', border: '1px solid var(--color-success-85)' }\n : variant === 'draft'\n ? { background: 'var(--color-warning-95)', color: 'var(--color-warning-40)', border: '1px solid var(--color-warning-85)' }\n : { background: 'var(--color-neutral-95)', color: 'var(--color-neutral-50)', border: '1px solid var(--color-neutral-85)' };\n return (\n <span\n style={{\n ...styles,\n display: 'inline-flex',\n alignItems: 'center',\n padding: '2px 8px',\n borderRadius: 'var(--border-radius-20)',\n fontSize: 'var(--font-size-10)',\n fontWeight: 'var(--font-weight-600)',\n marginRight: '4px',\n whiteSpace: 'nowrap',\n }}\n >\n {variant === 'published' ? 'Published' : variant === 'draft' ? 'Draft' : 'No state'}\n </span>\n );\n};\n\n// ---------------------------------------------------------------------------\n// Shared nav bar style\n// ---------------------------------------------------------------------------\n\nconst NAV_BAR_STYLE: React.CSSProperties = {\n position: 'sticky',\n top: 0,\n display: 'flex',\n alignItems: 'center',\n gap: '12px',\n padding: '8px 16px',\n background: 'var(--color-surface, #fff)',\n borderBottom: '1px solid var(--color-neutral-90)',\n zIndex: 200,\n flexShrink: 0,\n};\n\n// ---------------------------------------------------------------------------\n// Table columns\n// ---------------------------------------------------------------------------\n\ntype PageRow = PuckPageListItem & { id: string };\n\nconst COLUMNS = [\n { key: 'name', label: 'Name' },\n { key: 'slug', label: 'Slug' },\n { key: 'status', label: 'Status' },\n { key: 'updatedAt', label: 'Updated' },\n { key: 'actions', label: 'Actions', shouldIgnoreRowClick: true },\n];\n\n// ---------------------------------------------------------------------------\n// PageList route\n// ---------------------------------------------------------------------------\n\ninterface PageListProps {\n backButton?: ReactNode;\n}\n\nconst PageList: React.FC<PageListProps> = ({ backButton }) => {\n const history = useHistory();\n const { pages, loading, error, createPage, deletePage, refresh } = usePuckPages();\n\n const [creating, setCreating] = useState(false);\n const [newName, setNewName] = useState('');\n const [newSlug, setNewSlug] = useState('');\n const [formError, setFormError] = useState('');\n const [submitting, setSubmitting] = useState(false);\n const [deleting, setDeleting] = useState<string | null>(null);\n\n const handleCreate = async () => {\n if (!newName.trim()) { setFormError('Name is required'); return; }\n if (!newSlug.trim()) { setFormError('Slug is required'); return; }\n setFormError('');\n setSubmitting(true);\n try {\n const input: CreatePuckPageInput = {\n name: newName.trim(),\n slug: newSlug.trim().startsWith('/') ? newSlug.trim() : `/${newSlug.trim()}`,\n };\n const created = await createPage(input);\n setCreating(false);\n setNewName('');\n setNewSlug('');\n history.push(`/${created.key}/edit`, { pageName: created.value.name });\n } catch (err) {\n setFormError((err as Error).message);\n } finally {\n setSubmitting(false);\n }\n };\n\n const handleDelete = async (page: PuckPageListItem) => {\n if (!confirm(`Delete \"${page.value.name}\"? This cannot be undone.`)) return;\n setDeleting(page.key);\n try {\n await deletePage(page.key);\n await refresh();\n } finally {\n setDeleting(null);\n }\n };\n\n if (loading) {\n return (\n <div style={{ padding: '64px', display: 'flex', justifyContent: 'center' }}>\n <LoadingSpinner />\n </div>\n );\n }\n\n if (error) {\n return (\n <div style={{ padding: '32px' }}>\n <Text.Body tone=\"negative\">Error: {error}</Text.Body>\n </div>\n );\n }\n\n const rows: PageRow[] = pages.map((p: PuckPageListItem) => ({ ...p, id: p.key }));\n\n return (\n <div style={{ maxWidth: '1200px', margin: '0 auto', padding: '32px 24px' }}>\n <Spacings.Stack scale=\"l\">\n <Spacings.Inline justifyContent=\"space-between\" alignItems=\"center\">\n <Spacings.Inline scale=\"m\" alignItems=\"center\">\n {backButton}\n <Text.Headline as=\"h1\">Puck Pages</Text.Headline>\n </Spacings.Inline>\n <PrimaryButton\n label=\"New Page\"\n iconLeft={<PlusThinIcon />}\n onClick={() => setCreating(true)}\n />\n </Spacings.Inline>\n\n {creating && (\n <Card insetScale=\"l\">\n <Spacings.Stack scale=\"m\">\n <Text.Subheadline as=\"h4\" isBold>Create New Page</Text.Subheadline>\n <Spacings.Inline scale=\"m\">\n <div style={{ flex: 1 }}>\n <Spacings.Stack scale=\"xs\">\n <Label htmlFor=\"new-page-name\">Name *</Label>\n <TextInput\n id=\"new-page-name\"\n value={newName}\n onChange={(e) => setNewName(e.target.value)}\n placeholder=\"Home Page\"\n />\n </Spacings.Stack>\n </div>\n <div style={{ flex: 1 }}>\n <Spacings.Stack scale=\"xs\">\n <Label htmlFor=\"new-page-slug\">Slug *</Label>\n <TextInput\n id=\"new-page-slug\"\n value={newSlug}\n onChange={(e) => setNewSlug(e.target.value)}\n placeholder=\"/home\"\n />\n </Spacings.Stack>\n </div>\n </Spacings.Inline>\n {formError && <Text.Body tone=\"negative\">{formError}</Text.Body>}\n <Spacings.Inline scale=\"s\">\n <PrimaryButton\n label={submitting ? 'Creating…' : 'Create'}\n onClick={() => void handleCreate()}\n isDisabled={submitting}\n />\n <SecondaryButton\n label=\"Cancel\"\n onClick={() => { setCreating(false); setFormError(''); }}\n />\n </Spacings.Inline>\n </Spacings.Stack>\n </Card>\n )}\n\n {pages.length === 0 && !creating ? (\n <Spacings.Stack scale=\"m\" alignItems=\"center\">\n <Text.Body tone=\"secondary\">No pages yet.</Text.Body>\n <PrimaryButton\n label=\"Create first page\"\n iconLeft={<PlusThinIcon />}\n onClick={() => setCreating(true)}\n />\n </Spacings.Stack>\n ) : pages.length > 0 ? (\n <DataTable\n columns={COLUMNS}\n rows={rows}\n itemRenderer={(row: PageRow, column) => {\n switch (column.key) {\n case 'name':\n return (\n <Spacings.Stack scale=\"xs\">\n <Text.Body isBold>{row.value.name}</Text.Body>\n <Text.Detail tone=\"secondary\">{row.key}</Text.Detail>\n </Spacings.Stack>\n );\n case 'slug':\n return (\n <code\n style={{\n background: 'var(--color-neutral-95)',\n padding: '2px 6px',\n borderRadius: 'var(--border-radius-4)',\n fontSize: 'var(--font-size-10)',\n fontFamily: 'monospace',\n }}\n >\n {row.value.slug}\n </code>\n );\n case 'status':\n return (\n <span>\n {row.states.draft && <StatusBadge variant=\"draft\" />}\n {row.states.published && <StatusBadge variant=\"published\" />}\n {!row.states.draft && !row.states.published && <StatusBadge variant=\"none\" />}\n </span>\n );\n case 'updatedAt':\n return (\n <Text.Body tone=\"secondary\">\n {new Date(row.value.updatedAt).toLocaleString()}\n </Text.Body>\n );\n case 'actions':\n return (\n <div style={{ display: 'flex', alignItems: 'center', gap: '8px' }}>\n <PrimaryButton\n label=\"Edit\"\n size=\"20\"\n onClick={() =>\n history.push(`/${row.key}/edit`, { pageName: row.value.name })\n }\n />\n <SecondaryButton\n label=\"Preview\"\n size=\"20\"\n onClick={() =>\n history.push(`/${row.key}/preview`, { pageName: row.value.name })\n }\n />\n <FlatButton\n tone=\"critical\"\n label={deleting === row.key ? '…' : 'Delete'}\n isDisabled={deleting === row.key}\n onClick={() => void handleDelete(row)}\n />\n </div>\n );\n default:\n return null;\n }\n }}\n />\n ) : null}\n </Spacings.Stack>\n </div>\n );\n};\n\n// ---------------------------------------------------------------------------\n// PageEditorRoute\n// ---------------------------------------------------------------------------\n\ninterface RouteProps {\n config: Config;\n backButton?: ReactNode;\n}\n\nconst PageEditorRoute: React.FC<RouteProps> = ({ config, backButton }) => {\n const { pageKey } = useParams<{ pageKey: string }>();\n const history = useHistory();\n const location = useLocation();\n const { baseURL, projectKey, businessUnitKey, jwtToken } = usePuckApiContext();\n const pageName =\n (location.state as { pageName?: string } | null)?.pageName ?? pageKey ?? 'Page';\n\n return (\n <div style={{ display: 'flex', flexDirection: 'column', height: '100%' }}>\n <div style={NAV_BAR_STYLE}>\n {backButton}\n {backButton && <Text.Body tone=\"secondary\">/</Text.Body>}\n <FlatButton\n label=\"Pages\"\n icon={<AngleLeftIcon />}\n iconPosition=\"left\"\n onClick={() => history.push('/')}\n />\n <Text.Body tone=\"secondary\">/</Text.Body>\n <Text.Body isBold>{pageName}</Text.Body>\n </div>\n <div style={{ flex: 1, overflow: 'hidden' }}>\n <PuckEditor\n baseURL={baseURL}\n projectKey={projectKey}\n businessUnitKey={businessUnitKey}\n jwtToken={jwtToken ?? ''}\n pageKey={pageKey!}\n config={config}\n onError={(err: Error) => { console.error('[PageManager] editor error:', err); }}\n />\n </div>\n </div>\n );\n};\n\n// ---------------------------------------------------------------------------\n// PagePreviewRoute\n// ---------------------------------------------------------------------------\n\nconst PagePreviewRoute: React.FC<RouteProps> = ({ config, backButton }) => {\n const { pageKey } = useParams<{ pageKey: string }>();\n const history = useHistory();\n const location = useLocation();\n const pageName =\n (location.state as { pageName?: string } | null)?.pageName ?? pageKey ?? 'Page';\n\n return (\n <div>\n <div style={NAV_BAR_STYLE}>\n {backButton}\n {backButton && <Text.Body tone=\"secondary\">/</Text.Body>}\n <FlatButton\n label=\"Pages\"\n icon={<AngleLeftIcon />}\n iconPosition=\"left\"\n onClick={() => history.push('/')}\n />\n <Text.Body tone=\"secondary\">/</Text.Body>\n <Text.Body isBold>{pageName}</Text.Body>\n <span\n style={{\n background: 'var(--color-primary-95)',\n color: 'var(--color-primary-25)',\n border: '1px solid var(--color-primary-85)',\n display: 'inline-flex',\n alignItems: 'center',\n padding: '2px 10px',\n borderRadius: 'var(--border-radius-20)',\n fontSize: 'var(--font-size-10)',\n fontWeight: 'var(--font-weight-600)',\n }}\n >\n Preview\n </span>\n </div>\n <PuckRenderer pageKey={pageKey} mode=\"preview\" config={config} />\n </div>\n );\n};\n\n// ---------------------------------------------------------------------------\n// Inner router component\n// ---------------------------------------------------------------------------\n\ninterface PageManagerInnerProps {\n config: Config;\n backButton?: ReactNode;\n}\n\nconst PageManagerInner: React.FC<PageManagerInnerProps> = ({ config, backButton }) => (\n <Switch>\n <Route exact path=\"/\" render={() => <PageList backButton={backButton} />} />\n <Route\n path=\"/:pageKey/edit\"\n render={() => <PageEditorRoute config={config} backButton={backButton} />}\n />\n <Route\n path=\"/:pageKey/preview\"\n render={() => <PagePreviewRoute config={config} backButton={backButton} />}\n />\n </Switch>\n);\n\n// ---------------------------------------------------------------------------\n// Public component\n// ---------------------------------------------------------------------------\n\nexport interface PageManagerProps {\n /** URL path where this manager is mounted, e.g. \"/pages\" — used as router basename */\n parentUrl: string;\n baseURL: string;\n projectKey: string;\n businessUnitKey: string;\n jwtToken: string;\n /** Puck component config — passed to editor and preview. Defaults to defaultPuckConfig. */\n config?: Config;\n /** Optional element rendered before the breadcrumb in editor/preview headers */\n backButton?: ReactNode;\n}\n\nexport const PageManager: React.FC<PageManagerProps> = ({\n parentUrl,\n baseURL,\n projectKey,\n businessUnitKey,\n jwtToken,\n config = DEFAULT_CONFIG,\n backButton,\n}) => (\n <EnsureIntlProvider>\n <PuckApiProvider\n baseURL={baseURL}\n projectKey={projectKey}\n businessUnitKey={businessUnitKey}\n jwtToken={jwtToken}\n >\n <BrowserRouter basename={parentUrl}>\n <PageManagerInner config={config} backButton={backButton} />\n </BrowserRouter>\n </PuckApiProvider>\n </EnsureIntlProvider>\n);\n","import React, { useContext, type PropsWithChildren } from 'react';\nimport { IntlContext, IntlProvider, ReactIntlErrorCode } from 'react-intl';\n\n/**\n * Ensures a react-intl context exists for the commercetools UIKit components\n * rendered by this package.\n *\n * UIKit components (DataTable, Text, buttons, …) call react-intl internally and\n * require an `<IntlProvider>` in the ancestry. If the host already provides one\n * (e.g. the Merchant Center ApplicationShell, or a storefront that set up\n * react-intl), it is reused as-is. Otherwise a minimal English provider is\n * mounted so the package also works standalone.\n *\n * Detection mirrors react-intl's own `useIntl`: `IntlContext` defaults to `null`\n * when no provider is present.\n */\nexport const EnsureIntlProvider: React.FC<PropsWithChildren> = ({ children }) => {\n const intl = useContext(IntlContext);\n\n if (intl) {\n return <>{children}</>;\n }\n\n return (\n <IntlProvider\n locale=\"en\"\n defaultLocale=\"en\"\n messages={{}}\n onError={(err) => {\n // UIKit ships `defaultMessage`s, so a missing-translation against an\n // empty catalog is expected and would otherwise flood the console.\n if (err.code === ReactIntlErrorCode.MISSING_TRANSLATION) return;\n // eslint-disable-next-line no-console\n console.error(err);\n }}\n >\n {children}\n </IntlProvider>\n );\n};\n"],"mappings":"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","names":["import_react","import_jsx_runtime","LoadingSpinner","Text","Spacings","PrimaryButton","Card","Label","TextInput","SecondaryButton","DataTable","FlatButton"]}
package/dist/index.mjs CHANGED
@@ -15,6 +15,32 @@ import {
15
15
  } from "@commercetools-demo/puck-api";
16
16
  import { PuckEditor, defaultPuckConfig } from "@commercetools-demo/puck-editor";
17
17
  import { PuckRenderer } from "@commercetools-demo/puck-renderer";
18
+
19
+ // src/EnsureIntlProvider.tsx
20
+ import { useContext } from "react";
21
+ import { IntlContext, IntlProvider, ReactIntlErrorCode } from "react-intl";
22
+ import { Fragment, jsx } from "react/jsx-runtime";
23
+ var EnsureIntlProvider = ({ children }) => {
24
+ const intl = useContext(IntlContext);
25
+ if (intl) {
26
+ return /* @__PURE__ */ jsx(Fragment, { children });
27
+ }
28
+ return /* @__PURE__ */ jsx(
29
+ IntlProvider,
30
+ {
31
+ locale: "en",
32
+ defaultLocale: "en",
33
+ messages: {},
34
+ onError: (err) => {
35
+ if (err.code === ReactIntlErrorCode.MISSING_TRANSLATION) return;
36
+ console.error(err);
37
+ },
38
+ children
39
+ }
40
+ );
41
+ };
42
+
43
+ // src/PageManager.tsx
18
44
  import DataTable from "@commercetools-uikit/data-table";
19
45
  import PrimaryButton from "@commercetools-uikit/primary-button";
20
46
  import SecondaryButton from "@commercetools-uikit/secondary-button";
@@ -26,14 +52,14 @@ import LoadingSpinner from "@commercetools-uikit/loading-spinner";
26
52
  import TextInput from "@commercetools-uikit/text-input";
27
53
  import Label from "@commercetools-uikit/label";
28
54
  import { PlusThinIcon, AngleLeftIcon } from "@commercetools-uikit/icons";
29
- import { jsx, jsxs } from "react/jsx-runtime";
55
+ import { jsx as jsx2, jsxs } from "react/jsx-runtime";
30
56
  var DEFAULT_CONFIG = {
31
57
  ...defaultPuckConfig,
32
58
  components: { ...defaultPuckConfig.components }
33
59
  };
34
60
  var StatusBadge = ({ variant }) => {
35
61
  const styles = variant === "published" ? { background: "var(--color-success-95)", color: "var(--color-success-40)", border: "1px solid var(--color-success-85)" } : variant === "draft" ? { background: "var(--color-warning-95)", color: "var(--color-warning-40)", border: "1px solid var(--color-warning-85)" } : { background: "var(--color-neutral-95)", color: "var(--color-neutral-50)", border: "1px solid var(--color-neutral-85)" };
36
- return /* @__PURE__ */ jsx(
62
+ return /* @__PURE__ */ jsx2(
37
63
  "span",
38
64
  {
39
65
  style: {
@@ -117,36 +143,36 @@ var PageList = ({ backButton }) => {
117
143
  }
118
144
  };
119
145
  if (loading) {
120
- return /* @__PURE__ */ jsx("div", { style: { padding: "64px", display: "flex", justifyContent: "center" }, children: /* @__PURE__ */ jsx(LoadingSpinner, {}) });
146
+ return /* @__PURE__ */ jsx2("div", { style: { padding: "64px", display: "flex", justifyContent: "center" }, children: /* @__PURE__ */ jsx2(LoadingSpinner, {}) });
121
147
  }
122
148
  if (error) {
123
- return /* @__PURE__ */ jsx("div", { style: { padding: "32px" }, children: /* @__PURE__ */ jsxs(Text.Body, { tone: "negative", children: [
149
+ return /* @__PURE__ */ jsx2("div", { style: { padding: "32px" }, children: /* @__PURE__ */ jsxs(Text.Body, { tone: "negative", children: [
124
150
  "Error: ",
125
151
  error
126
152
  ] }) });
127
153
  }
128
154
  const rows = pages.map((p) => ({ ...p, id: p.key }));
129
- return /* @__PURE__ */ jsx("div", { style: { maxWidth: "1200px", margin: "0 auto", padding: "32px 24px" }, children: /* @__PURE__ */ jsxs(Spacings.Stack, { scale: "l", children: [
155
+ return /* @__PURE__ */ jsx2("div", { style: { maxWidth: "1200px", margin: "0 auto", padding: "32px 24px" }, children: /* @__PURE__ */ jsxs(Spacings.Stack, { scale: "l", children: [
130
156
  /* @__PURE__ */ jsxs(Spacings.Inline, { justifyContent: "space-between", alignItems: "center", children: [
131
157
  /* @__PURE__ */ jsxs(Spacings.Inline, { scale: "m", alignItems: "center", children: [
132
158
  backButton,
133
- /* @__PURE__ */ jsx(Text.Headline, { as: "h1", children: "Puck Pages" })
159
+ /* @__PURE__ */ jsx2(Text.Headline, { as: "h1", children: "Puck Pages" })
134
160
  ] }),
135
- /* @__PURE__ */ jsx(
161
+ /* @__PURE__ */ jsx2(
136
162
  PrimaryButton,
137
163
  {
138
164
  label: "New Page",
139
- iconLeft: /* @__PURE__ */ jsx(PlusThinIcon, {}),
165
+ iconLeft: /* @__PURE__ */ jsx2(PlusThinIcon, {}),
140
166
  onClick: () => setCreating(true)
141
167
  }
142
168
  )
143
169
  ] }),
144
- creating && /* @__PURE__ */ jsx(Card, { insetScale: "l", children: /* @__PURE__ */ jsxs(Spacings.Stack, { scale: "m", children: [
145
- /* @__PURE__ */ jsx(Text.Subheadline, { as: "h4", isBold: true, children: "Create New Page" }),
170
+ creating && /* @__PURE__ */ jsx2(Card, { insetScale: "l", children: /* @__PURE__ */ jsxs(Spacings.Stack, { scale: "m", children: [
171
+ /* @__PURE__ */ jsx2(Text.Subheadline, { as: "h4", isBold: true, children: "Create New Page" }),
146
172
  /* @__PURE__ */ jsxs(Spacings.Inline, { scale: "m", children: [
147
- /* @__PURE__ */ jsx("div", { style: { flex: 1 }, children: /* @__PURE__ */ jsxs(Spacings.Stack, { scale: "xs", children: [
148
- /* @__PURE__ */ jsx(Label, { htmlFor: "new-page-name", children: "Name *" }),
149
- /* @__PURE__ */ jsx(
173
+ /* @__PURE__ */ jsx2("div", { style: { flex: 1 }, children: /* @__PURE__ */ jsxs(Spacings.Stack, { scale: "xs", children: [
174
+ /* @__PURE__ */ jsx2(Label, { htmlFor: "new-page-name", children: "Name *" }),
175
+ /* @__PURE__ */ jsx2(
150
176
  TextInput,
151
177
  {
152
178
  id: "new-page-name",
@@ -156,9 +182,9 @@ var PageList = ({ backButton }) => {
156
182
  }
157
183
  )
158
184
  ] }) }),
159
- /* @__PURE__ */ jsx("div", { style: { flex: 1 }, children: /* @__PURE__ */ jsxs(Spacings.Stack, { scale: "xs", children: [
160
- /* @__PURE__ */ jsx(Label, { htmlFor: "new-page-slug", children: "Slug *" }),
161
- /* @__PURE__ */ jsx(
185
+ /* @__PURE__ */ jsx2("div", { style: { flex: 1 }, children: /* @__PURE__ */ jsxs(Spacings.Stack, { scale: "xs", children: [
186
+ /* @__PURE__ */ jsx2(Label, { htmlFor: "new-page-slug", children: "Slug *" }),
187
+ /* @__PURE__ */ jsx2(
162
188
  TextInput,
163
189
  {
164
190
  id: "new-page-slug",
@@ -169,9 +195,9 @@ var PageList = ({ backButton }) => {
169
195
  )
170
196
  ] }) })
171
197
  ] }),
172
- formError && /* @__PURE__ */ jsx(Text.Body, { tone: "negative", children: formError }),
198
+ formError && /* @__PURE__ */ jsx2(Text.Body, { tone: "negative", children: formError }),
173
199
  /* @__PURE__ */ jsxs(Spacings.Inline, { scale: "s", children: [
174
- /* @__PURE__ */ jsx(
200
+ /* @__PURE__ */ jsx2(
175
201
  PrimaryButton,
176
202
  {
177
203
  label: submitting ? "Creating\u2026" : "Create",
@@ -179,7 +205,7 @@ var PageList = ({ backButton }) => {
179
205
  isDisabled: submitting
180
206
  }
181
207
  ),
182
- /* @__PURE__ */ jsx(
208
+ /* @__PURE__ */ jsx2(
183
209
  SecondaryButton,
184
210
  {
185
211
  label: "Cancel",
@@ -192,16 +218,16 @@ var PageList = ({ backButton }) => {
192
218
  ] })
193
219
  ] }) }),
194
220
  pages.length === 0 && !creating ? /* @__PURE__ */ jsxs(Spacings.Stack, { scale: "m", alignItems: "center", children: [
195
- /* @__PURE__ */ jsx(Text.Body, { tone: "secondary", children: "No pages yet." }),
196
- /* @__PURE__ */ jsx(
221
+ /* @__PURE__ */ jsx2(Text.Body, { tone: "secondary", children: "No pages yet." }),
222
+ /* @__PURE__ */ jsx2(
197
223
  PrimaryButton,
198
224
  {
199
225
  label: "Create first page",
200
- iconLeft: /* @__PURE__ */ jsx(PlusThinIcon, {}),
226
+ iconLeft: /* @__PURE__ */ jsx2(PlusThinIcon, {}),
201
227
  onClick: () => setCreating(true)
202
228
  }
203
229
  )
204
- ] }) : pages.length > 0 ? /* @__PURE__ */ jsx(
230
+ ] }) : pages.length > 0 ? /* @__PURE__ */ jsx2(
205
231
  DataTable,
206
232
  {
207
233
  columns: COLUMNS,
@@ -210,11 +236,11 @@ var PageList = ({ backButton }) => {
210
236
  switch (column.key) {
211
237
  case "name":
212
238
  return /* @__PURE__ */ jsxs(Spacings.Stack, { scale: "xs", children: [
213
- /* @__PURE__ */ jsx(Text.Body, { isBold: true, children: row.value.name }),
214
- /* @__PURE__ */ jsx(Text.Detail, { tone: "secondary", children: row.key })
239
+ /* @__PURE__ */ jsx2(Text.Body, { isBold: true, children: row.value.name }),
240
+ /* @__PURE__ */ jsx2(Text.Detail, { tone: "secondary", children: row.key })
215
241
  ] });
216
242
  case "slug":
217
- return /* @__PURE__ */ jsx(
243
+ return /* @__PURE__ */ jsx2(
218
244
  "code",
219
245
  {
220
246
  style: {
@@ -229,15 +255,15 @@ var PageList = ({ backButton }) => {
229
255
  );
230
256
  case "status":
231
257
  return /* @__PURE__ */ jsxs("span", { children: [
232
- row.states.draft && /* @__PURE__ */ jsx(StatusBadge, { variant: "draft" }),
233
- row.states.published && /* @__PURE__ */ jsx(StatusBadge, { variant: "published" }),
234
- !row.states.draft && !row.states.published && /* @__PURE__ */ jsx(StatusBadge, { variant: "none" })
258
+ row.states.draft && /* @__PURE__ */ jsx2(StatusBadge, { variant: "draft" }),
259
+ row.states.published && /* @__PURE__ */ jsx2(StatusBadge, { variant: "published" }),
260
+ !row.states.draft && !row.states.published && /* @__PURE__ */ jsx2(StatusBadge, { variant: "none" })
235
261
  ] });
236
262
  case "updatedAt":
237
- return /* @__PURE__ */ jsx(Text.Body, { tone: "secondary", children: new Date(row.value.updatedAt).toLocaleString() });
263
+ return /* @__PURE__ */ jsx2(Text.Body, { tone: "secondary", children: new Date(row.value.updatedAt).toLocaleString() });
238
264
  case "actions":
239
265
  return /* @__PURE__ */ jsxs("div", { style: { display: "flex", alignItems: "center", gap: "8px" }, children: [
240
- /* @__PURE__ */ jsx(
266
+ /* @__PURE__ */ jsx2(
241
267
  PrimaryButton,
242
268
  {
243
269
  label: "Edit",
@@ -245,7 +271,7 @@ var PageList = ({ backButton }) => {
245
271
  onClick: () => history.push(`/${row.key}/edit`, { pageName: row.value.name })
246
272
  }
247
273
  ),
248
- /* @__PURE__ */ jsx(
274
+ /* @__PURE__ */ jsx2(
249
275
  SecondaryButton,
250
276
  {
251
277
  label: "Preview",
@@ -253,7 +279,7 @@ var PageList = ({ backButton }) => {
253
279
  onClick: () => history.push(`/${row.key}/preview`, { pageName: row.value.name })
254
280
  }
255
281
  ),
256
- /* @__PURE__ */ jsx(
282
+ /* @__PURE__ */ jsx2(
257
283
  FlatButton,
258
284
  {
259
285
  tone: "critical",
@@ -280,20 +306,20 @@ var PageEditorRoute = ({ config, backButton }) => {
280
306
  return /* @__PURE__ */ jsxs("div", { style: { display: "flex", flexDirection: "column", height: "100%" }, children: [
281
307
  /* @__PURE__ */ jsxs("div", { style: NAV_BAR_STYLE, children: [
282
308
  backButton,
283
- backButton && /* @__PURE__ */ jsx(Text.Body, { tone: "secondary", children: "/" }),
284
- /* @__PURE__ */ jsx(
309
+ backButton && /* @__PURE__ */ jsx2(Text.Body, { tone: "secondary", children: "/" }),
310
+ /* @__PURE__ */ jsx2(
285
311
  FlatButton,
286
312
  {
287
313
  label: "Pages",
288
- icon: /* @__PURE__ */ jsx(AngleLeftIcon, {}),
314
+ icon: /* @__PURE__ */ jsx2(AngleLeftIcon, {}),
289
315
  iconPosition: "left",
290
316
  onClick: () => history.push("/")
291
317
  }
292
318
  ),
293
- /* @__PURE__ */ jsx(Text.Body, { tone: "secondary", children: "/" }),
294
- /* @__PURE__ */ jsx(Text.Body, { isBold: true, children: pageName })
319
+ /* @__PURE__ */ jsx2(Text.Body, { tone: "secondary", children: "/" }),
320
+ /* @__PURE__ */ jsx2(Text.Body, { isBold: true, children: pageName })
295
321
  ] }),
296
- /* @__PURE__ */ jsx("div", { style: { flex: 1, overflow: "hidden" }, children: /* @__PURE__ */ jsx(
322
+ /* @__PURE__ */ jsx2("div", { style: { flex: 1, overflow: "hidden" }, children: /* @__PURE__ */ jsx2(
297
323
  PuckEditor,
298
324
  {
299
325
  baseURL,
@@ -317,19 +343,19 @@ var PagePreviewRoute = ({ config, backButton }) => {
317
343
  return /* @__PURE__ */ jsxs("div", { children: [
318
344
  /* @__PURE__ */ jsxs("div", { style: NAV_BAR_STYLE, children: [
319
345
  backButton,
320
- backButton && /* @__PURE__ */ jsx(Text.Body, { tone: "secondary", children: "/" }),
321
- /* @__PURE__ */ jsx(
346
+ backButton && /* @__PURE__ */ jsx2(Text.Body, { tone: "secondary", children: "/" }),
347
+ /* @__PURE__ */ jsx2(
322
348
  FlatButton,
323
349
  {
324
350
  label: "Pages",
325
- icon: /* @__PURE__ */ jsx(AngleLeftIcon, {}),
351
+ icon: /* @__PURE__ */ jsx2(AngleLeftIcon, {}),
326
352
  iconPosition: "left",
327
353
  onClick: () => history.push("/")
328
354
  }
329
355
  ),
330
- /* @__PURE__ */ jsx(Text.Body, { tone: "secondary", children: "/" }),
331
- /* @__PURE__ */ jsx(Text.Body, { isBold: true, children: pageName }),
332
- /* @__PURE__ */ jsx(
356
+ /* @__PURE__ */ jsx2(Text.Body, { tone: "secondary", children: "/" }),
357
+ /* @__PURE__ */ jsx2(Text.Body, { isBold: true, children: pageName }),
358
+ /* @__PURE__ */ jsx2(
333
359
  "span",
334
360
  {
335
361
  style: {
@@ -347,23 +373,23 @@ var PagePreviewRoute = ({ config, backButton }) => {
347
373
  }
348
374
  )
349
375
  ] }),
350
- /* @__PURE__ */ jsx(PuckRenderer, { pageKey, mode: "preview", config })
376
+ /* @__PURE__ */ jsx2(PuckRenderer, { pageKey, mode: "preview", config })
351
377
  ] });
352
378
  };
353
379
  var PageManagerInner = ({ config, backButton }) => /* @__PURE__ */ jsxs(Switch, { children: [
354
- /* @__PURE__ */ jsx(Route, { exact: true, path: "/", render: () => /* @__PURE__ */ jsx(PageList, { backButton }) }),
355
- /* @__PURE__ */ jsx(
380
+ /* @__PURE__ */ jsx2(Route, { exact: true, path: "/", render: () => /* @__PURE__ */ jsx2(PageList, { backButton }) }),
381
+ /* @__PURE__ */ jsx2(
356
382
  Route,
357
383
  {
358
384
  path: "/:pageKey/edit",
359
- render: () => /* @__PURE__ */ jsx(PageEditorRoute, { config, backButton })
385
+ render: () => /* @__PURE__ */ jsx2(PageEditorRoute, { config, backButton })
360
386
  }
361
387
  ),
362
- /* @__PURE__ */ jsx(
388
+ /* @__PURE__ */ jsx2(
363
389
  Route,
364
390
  {
365
391
  path: "/:pageKey/preview",
366
- render: () => /* @__PURE__ */ jsx(PagePreviewRoute, { config, backButton })
392
+ render: () => /* @__PURE__ */ jsx2(PagePreviewRoute, { config, backButton })
367
393
  }
368
394
  )
369
395
  ] });
@@ -375,16 +401,16 @@ var PageManager = ({
375
401
  jwtToken,
376
402
  config = DEFAULT_CONFIG,
377
403
  backButton
378
- }) => /* @__PURE__ */ jsx(
404
+ }) => /* @__PURE__ */ jsx2(EnsureIntlProvider, { children: /* @__PURE__ */ jsx2(
379
405
  PuckApiProvider,
380
406
  {
381
407
  baseURL,
382
408
  projectKey,
383
409
  businessUnitKey,
384
410
  jwtToken,
385
- children: /* @__PURE__ */ jsx(BrowserRouter, { basename: parentUrl, children: /* @__PURE__ */ jsx(PageManagerInner, { config, backButton }) })
411
+ children: /* @__PURE__ */ jsx2(BrowserRouter, { basename: parentUrl, children: /* @__PURE__ */ jsx2(PageManagerInner, { config, backButton }) })
386
412
  }
387
- );
413
+ ) });
388
414
  export {
389
415
  PageManager
390
416
  };
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/PageManager.tsx"],"sourcesContent":["import React, { useState, type ReactNode } from 'react';\nimport {\n BrowserRouter,\n Switch,\n Route,\n useHistory,\n useParams,\n useLocation,\n} from 'react-router-dom';\nimport {\n PuckApiProvider,\n usePuckPages,\n usePuckApiContext,\n} from '@commercetools-demo/puck-api';\nimport { PuckEditor, defaultPuckConfig } from '@commercetools-demo/puck-editor';\nimport { PuckRenderer } from '@commercetools-demo/puck-renderer';\n\nconst DEFAULT_CONFIG: Config = {\n ...defaultPuckConfig,\n components: { ...defaultPuckConfig.components },\n};\nimport type { Config } from '@measured/puck';\nimport type { CreatePuckPageInput, PuckPageListItem } from '@commercetools-demo/puck-types';\nimport DataTable from '@commercetools-uikit/data-table';\nimport PrimaryButton from '@commercetools-uikit/primary-button';\nimport SecondaryButton from '@commercetools-uikit/secondary-button';\nimport FlatButton from '@commercetools-uikit/flat-button';\nimport Card from '@commercetools-uikit/card';\nimport Spacings from '@commercetools-uikit/spacings';\nimport Text from '@commercetools-uikit/text';\nimport LoadingSpinner from '@commercetools-uikit/loading-spinner';\nimport TextInput from '@commercetools-uikit/text-input';\nimport Label from '@commercetools-uikit/label';\nimport { PlusThinIcon, AngleLeftIcon } from '@commercetools-uikit/icons';\n\n// ---------------------------------------------------------------------------\n// Status badge\n// ---------------------------------------------------------------------------\n\nconst StatusBadge: React.FC<{ variant: 'draft' | 'published' | 'none' }> = ({ variant }) => {\n const styles: React.CSSProperties =\n variant === 'published'\n ? { background: 'var(--color-success-95)', color: 'var(--color-success-40)', border: '1px solid var(--color-success-85)' }\n : variant === 'draft'\n ? { background: 'var(--color-warning-95)', color: 'var(--color-warning-40)', border: '1px solid var(--color-warning-85)' }\n : { background: 'var(--color-neutral-95)', color: 'var(--color-neutral-50)', border: '1px solid var(--color-neutral-85)' };\n return (\n <span\n style={{\n ...styles,\n display: 'inline-flex',\n alignItems: 'center',\n padding: '2px 8px',\n borderRadius: 'var(--border-radius-20)',\n fontSize: 'var(--font-size-10)',\n fontWeight: 'var(--font-weight-600)',\n marginRight: '4px',\n whiteSpace: 'nowrap',\n }}\n >\n {variant === 'published' ? 'Published' : variant === 'draft' ? 'Draft' : 'No state'}\n </span>\n );\n};\n\n// ---------------------------------------------------------------------------\n// Shared nav bar style\n// ---------------------------------------------------------------------------\n\nconst NAV_BAR_STYLE: React.CSSProperties = {\n position: 'sticky',\n top: 0,\n display: 'flex',\n alignItems: 'center',\n gap: '12px',\n padding: '8px 16px',\n background: 'var(--color-surface, #fff)',\n borderBottom: '1px solid var(--color-neutral-90)',\n zIndex: 200,\n flexShrink: 0,\n};\n\n// ---------------------------------------------------------------------------\n// Table columns\n// ---------------------------------------------------------------------------\n\ntype PageRow = PuckPageListItem & { id: string };\n\nconst COLUMNS = [\n { key: 'name', label: 'Name' },\n { key: 'slug', label: 'Slug' },\n { key: 'status', label: 'Status' },\n { key: 'updatedAt', label: 'Updated' },\n { key: 'actions', label: 'Actions', shouldIgnoreRowClick: true },\n];\n\n// ---------------------------------------------------------------------------\n// PageList route\n// ---------------------------------------------------------------------------\n\ninterface PageListProps {\n backButton?: ReactNode;\n}\n\nconst PageList: React.FC<PageListProps> = ({ backButton }) => {\n const history = useHistory();\n const { pages, loading, error, createPage, deletePage, refresh } = usePuckPages();\n\n const [creating, setCreating] = useState(false);\n const [newName, setNewName] = useState('');\n const [newSlug, setNewSlug] = useState('');\n const [formError, setFormError] = useState('');\n const [submitting, setSubmitting] = useState(false);\n const [deleting, setDeleting] = useState<string | null>(null);\n\n const handleCreate = async () => {\n if (!newName.trim()) { setFormError('Name is required'); return; }\n if (!newSlug.trim()) { setFormError('Slug is required'); return; }\n setFormError('');\n setSubmitting(true);\n try {\n const input: CreatePuckPageInput = {\n name: newName.trim(),\n slug: newSlug.trim().startsWith('/') ? newSlug.trim() : `/${newSlug.trim()}`,\n };\n const created = await createPage(input);\n setCreating(false);\n setNewName('');\n setNewSlug('');\n history.push(`/${created.key}/edit`, { pageName: created.value.name });\n } catch (err) {\n setFormError((err as Error).message);\n } finally {\n setSubmitting(false);\n }\n };\n\n const handleDelete = async (page: PuckPageListItem) => {\n if (!confirm(`Delete \"${page.value.name}\"? This cannot be undone.`)) return;\n setDeleting(page.key);\n try {\n await deletePage(page.key);\n await refresh();\n } finally {\n setDeleting(null);\n }\n };\n\n if (loading) {\n return (\n <div style={{ padding: '64px', display: 'flex', justifyContent: 'center' }}>\n <LoadingSpinner />\n </div>\n );\n }\n\n if (error) {\n return (\n <div style={{ padding: '32px' }}>\n <Text.Body tone=\"negative\">Error: {error}</Text.Body>\n </div>\n );\n }\n\n const rows: PageRow[] = pages.map((p: PuckPageListItem) => ({ ...p, id: p.key }));\n\n return (\n <div style={{ maxWidth: '1200px', margin: '0 auto', padding: '32px 24px' }}>\n <Spacings.Stack scale=\"l\">\n <Spacings.Inline justifyContent=\"space-between\" alignItems=\"center\">\n <Spacings.Inline scale=\"m\" alignItems=\"center\">\n {backButton}\n <Text.Headline as=\"h1\">Puck Pages</Text.Headline>\n </Spacings.Inline>\n <PrimaryButton\n label=\"New Page\"\n iconLeft={<PlusThinIcon />}\n onClick={() => setCreating(true)}\n />\n </Spacings.Inline>\n\n {creating && (\n <Card insetScale=\"l\">\n <Spacings.Stack scale=\"m\">\n <Text.Subheadline as=\"h4\" isBold>Create New Page</Text.Subheadline>\n <Spacings.Inline scale=\"m\">\n <div style={{ flex: 1 }}>\n <Spacings.Stack scale=\"xs\">\n <Label htmlFor=\"new-page-name\">Name *</Label>\n <TextInput\n id=\"new-page-name\"\n value={newName}\n onChange={(e) => setNewName(e.target.value)}\n placeholder=\"Home Page\"\n />\n </Spacings.Stack>\n </div>\n <div style={{ flex: 1 }}>\n <Spacings.Stack scale=\"xs\">\n <Label htmlFor=\"new-page-slug\">Slug *</Label>\n <TextInput\n id=\"new-page-slug\"\n value={newSlug}\n onChange={(e) => setNewSlug(e.target.value)}\n placeholder=\"/home\"\n />\n </Spacings.Stack>\n </div>\n </Spacings.Inline>\n {formError && <Text.Body tone=\"negative\">{formError}</Text.Body>}\n <Spacings.Inline scale=\"s\">\n <PrimaryButton\n label={submitting ? 'Creating…' : 'Create'}\n onClick={() => void handleCreate()}\n isDisabled={submitting}\n />\n <SecondaryButton\n label=\"Cancel\"\n onClick={() => { setCreating(false); setFormError(''); }}\n />\n </Spacings.Inline>\n </Spacings.Stack>\n </Card>\n )}\n\n {pages.length === 0 && !creating ? (\n <Spacings.Stack scale=\"m\" alignItems=\"center\">\n <Text.Body tone=\"secondary\">No pages yet.</Text.Body>\n <PrimaryButton\n label=\"Create first page\"\n iconLeft={<PlusThinIcon />}\n onClick={() => setCreating(true)}\n />\n </Spacings.Stack>\n ) : pages.length > 0 ? (\n <DataTable\n columns={COLUMNS}\n rows={rows}\n itemRenderer={(row: PageRow, column) => {\n switch (column.key) {\n case 'name':\n return (\n <Spacings.Stack scale=\"xs\">\n <Text.Body isBold>{row.value.name}</Text.Body>\n <Text.Detail tone=\"secondary\">{row.key}</Text.Detail>\n </Spacings.Stack>\n );\n case 'slug':\n return (\n <code\n style={{\n background: 'var(--color-neutral-95)',\n padding: '2px 6px',\n borderRadius: 'var(--border-radius-4)',\n fontSize: 'var(--font-size-10)',\n fontFamily: 'monospace',\n }}\n >\n {row.value.slug}\n </code>\n );\n case 'status':\n return (\n <span>\n {row.states.draft && <StatusBadge variant=\"draft\" />}\n {row.states.published && <StatusBadge variant=\"published\" />}\n {!row.states.draft && !row.states.published && <StatusBadge variant=\"none\" />}\n </span>\n );\n case 'updatedAt':\n return (\n <Text.Body tone=\"secondary\">\n {new Date(row.value.updatedAt).toLocaleString()}\n </Text.Body>\n );\n case 'actions':\n return (\n <div style={{ display: 'flex', alignItems: 'center', gap: '8px' }}>\n <PrimaryButton\n label=\"Edit\"\n size=\"20\"\n onClick={() =>\n history.push(`/${row.key}/edit`, { pageName: row.value.name })\n }\n />\n <SecondaryButton\n label=\"Preview\"\n size=\"20\"\n onClick={() =>\n history.push(`/${row.key}/preview`, { pageName: row.value.name })\n }\n />\n <FlatButton\n tone=\"critical\"\n label={deleting === row.key ? '…' : 'Delete'}\n isDisabled={deleting === row.key}\n onClick={() => void handleDelete(row)}\n />\n </div>\n );\n default:\n return null;\n }\n }}\n />\n ) : null}\n </Spacings.Stack>\n </div>\n );\n};\n\n// ---------------------------------------------------------------------------\n// PageEditorRoute\n// ---------------------------------------------------------------------------\n\ninterface RouteProps {\n config: Config;\n backButton?: ReactNode;\n}\n\nconst PageEditorRoute: React.FC<RouteProps> = ({ config, backButton }) => {\n const { pageKey } = useParams<{ pageKey: string }>();\n const history = useHistory();\n const location = useLocation();\n const { baseURL, projectKey, businessUnitKey, jwtToken } = usePuckApiContext();\n const pageName =\n (location.state as { pageName?: string } | null)?.pageName ?? pageKey ?? 'Page';\n\n return (\n <div style={{ display: 'flex', flexDirection: 'column', height: '100%' }}>\n <div style={NAV_BAR_STYLE}>\n {backButton}\n {backButton && <Text.Body tone=\"secondary\">/</Text.Body>}\n <FlatButton\n label=\"Pages\"\n icon={<AngleLeftIcon />}\n iconPosition=\"left\"\n onClick={() => history.push('/')}\n />\n <Text.Body tone=\"secondary\">/</Text.Body>\n <Text.Body isBold>{pageName}</Text.Body>\n </div>\n <div style={{ flex: 1, overflow: 'hidden' }}>\n <PuckEditor\n baseURL={baseURL}\n projectKey={projectKey}\n businessUnitKey={businessUnitKey}\n jwtToken={jwtToken ?? ''}\n pageKey={pageKey!}\n config={config}\n onError={(err: Error) => { console.error('[PageManager] editor error:', err); }}\n />\n </div>\n </div>\n );\n};\n\n// ---------------------------------------------------------------------------\n// PagePreviewRoute\n// ---------------------------------------------------------------------------\n\nconst PagePreviewRoute: React.FC<RouteProps> = ({ config, backButton }) => {\n const { pageKey } = useParams<{ pageKey: string }>();\n const history = useHistory();\n const location = useLocation();\n const pageName =\n (location.state as { pageName?: string } | null)?.pageName ?? pageKey ?? 'Page';\n\n return (\n <div>\n <div style={NAV_BAR_STYLE}>\n {backButton}\n {backButton && <Text.Body tone=\"secondary\">/</Text.Body>}\n <FlatButton\n label=\"Pages\"\n icon={<AngleLeftIcon />}\n iconPosition=\"left\"\n onClick={() => history.push('/')}\n />\n <Text.Body tone=\"secondary\">/</Text.Body>\n <Text.Body isBold>{pageName}</Text.Body>\n <span\n style={{\n background: 'var(--color-primary-95)',\n color: 'var(--color-primary-25)',\n border: '1px solid var(--color-primary-85)',\n display: 'inline-flex',\n alignItems: 'center',\n padding: '2px 10px',\n borderRadius: 'var(--border-radius-20)',\n fontSize: 'var(--font-size-10)',\n fontWeight: 'var(--font-weight-600)',\n }}\n >\n Preview\n </span>\n </div>\n <PuckRenderer pageKey={pageKey} mode=\"preview\" config={config} />\n </div>\n );\n};\n\n// ---------------------------------------------------------------------------\n// Inner router component\n// ---------------------------------------------------------------------------\n\ninterface PageManagerInnerProps {\n config: Config;\n backButton?: ReactNode;\n}\n\nconst PageManagerInner: React.FC<PageManagerInnerProps> = ({ config, backButton }) => (\n <Switch>\n <Route exact path=\"/\" render={() => <PageList backButton={backButton} />} />\n <Route\n path=\"/:pageKey/edit\"\n render={() => <PageEditorRoute config={config} backButton={backButton} />}\n />\n <Route\n path=\"/:pageKey/preview\"\n render={() => <PagePreviewRoute config={config} backButton={backButton} />}\n />\n </Switch>\n);\n\n// ---------------------------------------------------------------------------\n// Public component\n// ---------------------------------------------------------------------------\n\nexport interface PageManagerProps {\n /** URL path where this manager is mounted, e.g. \"/pages\" — used as router basename */\n parentUrl: string;\n baseURL: string;\n projectKey: string;\n businessUnitKey: string;\n jwtToken: string;\n /** Puck component config — passed to editor and preview. Defaults to defaultPuckConfig. */\n config?: Config;\n /** Optional element rendered before the breadcrumb in editor/preview headers */\n backButton?: ReactNode;\n}\n\nexport const PageManager: React.FC<PageManagerProps> = ({\n parentUrl,\n baseURL,\n projectKey,\n businessUnitKey,\n jwtToken,\n config = DEFAULT_CONFIG,\n backButton,\n}) => (\n <PuckApiProvider\n baseURL={baseURL}\n projectKey={projectKey}\n businessUnitKey={businessUnitKey}\n jwtToken={jwtToken}\n >\n <BrowserRouter basename={parentUrl}>\n <PageManagerInner config={config} backButton={backButton} />\n </BrowserRouter>\n </PuckApiProvider>\n);\n"],"mappings":"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","names":[]}
1
+ {"version":3,"sources":["../src/PageManager.tsx","../src/EnsureIntlProvider.tsx"],"sourcesContent":["import React, { useState, type ReactNode } from 'react';\nimport {\n BrowserRouter,\n Switch,\n Route,\n useHistory,\n useParams,\n useLocation,\n} from 'react-router-dom';\nimport {\n PuckApiProvider,\n usePuckPages,\n usePuckApiContext,\n} from '@commercetools-demo/puck-api';\nimport { PuckEditor, defaultPuckConfig } from '@commercetools-demo/puck-editor';\nimport { PuckRenderer } from '@commercetools-demo/puck-renderer';\nimport { EnsureIntlProvider } from './EnsureIntlProvider';\n\nconst DEFAULT_CONFIG: Config = {\n ...defaultPuckConfig,\n components: { ...defaultPuckConfig.components },\n};\nimport type { Config } from '@measured/puck';\nimport type { CreatePuckPageInput, PuckPageListItem } from '@commercetools-demo/puck-types';\nimport DataTable from '@commercetools-uikit/data-table';\nimport PrimaryButton from '@commercetools-uikit/primary-button';\nimport SecondaryButton from '@commercetools-uikit/secondary-button';\nimport FlatButton from '@commercetools-uikit/flat-button';\nimport Card from '@commercetools-uikit/card';\nimport Spacings from '@commercetools-uikit/spacings';\nimport Text from '@commercetools-uikit/text';\nimport LoadingSpinner from '@commercetools-uikit/loading-spinner';\nimport TextInput from '@commercetools-uikit/text-input';\nimport Label from '@commercetools-uikit/label';\nimport { PlusThinIcon, AngleLeftIcon } from '@commercetools-uikit/icons';\n\n// ---------------------------------------------------------------------------\n// Status badge\n// ---------------------------------------------------------------------------\n\nconst StatusBadge: React.FC<{ variant: 'draft' | 'published' | 'none' }> = ({ variant }) => {\n const styles: React.CSSProperties =\n variant === 'published'\n ? { background: 'var(--color-success-95)', color: 'var(--color-success-40)', border: '1px solid var(--color-success-85)' }\n : variant === 'draft'\n ? { background: 'var(--color-warning-95)', color: 'var(--color-warning-40)', border: '1px solid var(--color-warning-85)' }\n : { background: 'var(--color-neutral-95)', color: 'var(--color-neutral-50)', border: '1px solid var(--color-neutral-85)' };\n return (\n <span\n style={{\n ...styles,\n display: 'inline-flex',\n alignItems: 'center',\n padding: '2px 8px',\n borderRadius: 'var(--border-radius-20)',\n fontSize: 'var(--font-size-10)',\n fontWeight: 'var(--font-weight-600)',\n marginRight: '4px',\n whiteSpace: 'nowrap',\n }}\n >\n {variant === 'published' ? 'Published' : variant === 'draft' ? 'Draft' : 'No state'}\n </span>\n );\n};\n\n// ---------------------------------------------------------------------------\n// Shared nav bar style\n// ---------------------------------------------------------------------------\n\nconst NAV_BAR_STYLE: React.CSSProperties = {\n position: 'sticky',\n top: 0,\n display: 'flex',\n alignItems: 'center',\n gap: '12px',\n padding: '8px 16px',\n background: 'var(--color-surface, #fff)',\n borderBottom: '1px solid var(--color-neutral-90)',\n zIndex: 200,\n flexShrink: 0,\n};\n\n// ---------------------------------------------------------------------------\n// Table columns\n// ---------------------------------------------------------------------------\n\ntype PageRow = PuckPageListItem & { id: string };\n\nconst COLUMNS = [\n { key: 'name', label: 'Name' },\n { key: 'slug', label: 'Slug' },\n { key: 'status', label: 'Status' },\n { key: 'updatedAt', label: 'Updated' },\n { key: 'actions', label: 'Actions', shouldIgnoreRowClick: true },\n];\n\n// ---------------------------------------------------------------------------\n// PageList route\n// ---------------------------------------------------------------------------\n\ninterface PageListProps {\n backButton?: ReactNode;\n}\n\nconst PageList: React.FC<PageListProps> = ({ backButton }) => {\n const history = useHistory();\n const { pages, loading, error, createPage, deletePage, refresh } = usePuckPages();\n\n const [creating, setCreating] = useState(false);\n const [newName, setNewName] = useState('');\n const [newSlug, setNewSlug] = useState('');\n const [formError, setFormError] = useState('');\n const [submitting, setSubmitting] = useState(false);\n const [deleting, setDeleting] = useState<string | null>(null);\n\n const handleCreate = async () => {\n if (!newName.trim()) { setFormError('Name is required'); return; }\n if (!newSlug.trim()) { setFormError('Slug is required'); return; }\n setFormError('');\n setSubmitting(true);\n try {\n const input: CreatePuckPageInput = {\n name: newName.trim(),\n slug: newSlug.trim().startsWith('/') ? newSlug.trim() : `/${newSlug.trim()}`,\n };\n const created = await createPage(input);\n setCreating(false);\n setNewName('');\n setNewSlug('');\n history.push(`/${created.key}/edit`, { pageName: created.value.name });\n } catch (err) {\n setFormError((err as Error).message);\n } finally {\n setSubmitting(false);\n }\n };\n\n const handleDelete = async (page: PuckPageListItem) => {\n if (!confirm(`Delete \"${page.value.name}\"? This cannot be undone.`)) return;\n setDeleting(page.key);\n try {\n await deletePage(page.key);\n await refresh();\n } finally {\n setDeleting(null);\n }\n };\n\n if (loading) {\n return (\n <div style={{ padding: '64px', display: 'flex', justifyContent: 'center' }}>\n <LoadingSpinner />\n </div>\n );\n }\n\n if (error) {\n return (\n <div style={{ padding: '32px' }}>\n <Text.Body tone=\"negative\">Error: {error}</Text.Body>\n </div>\n );\n }\n\n const rows: PageRow[] = pages.map((p: PuckPageListItem) => ({ ...p, id: p.key }));\n\n return (\n <div style={{ maxWidth: '1200px', margin: '0 auto', padding: '32px 24px' }}>\n <Spacings.Stack scale=\"l\">\n <Spacings.Inline justifyContent=\"space-between\" alignItems=\"center\">\n <Spacings.Inline scale=\"m\" alignItems=\"center\">\n {backButton}\n <Text.Headline as=\"h1\">Puck Pages</Text.Headline>\n </Spacings.Inline>\n <PrimaryButton\n label=\"New Page\"\n iconLeft={<PlusThinIcon />}\n onClick={() => setCreating(true)}\n />\n </Spacings.Inline>\n\n {creating && (\n <Card insetScale=\"l\">\n <Spacings.Stack scale=\"m\">\n <Text.Subheadline as=\"h4\" isBold>Create New Page</Text.Subheadline>\n <Spacings.Inline scale=\"m\">\n <div style={{ flex: 1 }}>\n <Spacings.Stack scale=\"xs\">\n <Label htmlFor=\"new-page-name\">Name *</Label>\n <TextInput\n id=\"new-page-name\"\n value={newName}\n onChange={(e) => setNewName(e.target.value)}\n placeholder=\"Home Page\"\n />\n </Spacings.Stack>\n </div>\n <div style={{ flex: 1 }}>\n <Spacings.Stack scale=\"xs\">\n <Label htmlFor=\"new-page-slug\">Slug *</Label>\n <TextInput\n id=\"new-page-slug\"\n value={newSlug}\n onChange={(e) => setNewSlug(e.target.value)}\n placeholder=\"/home\"\n />\n </Spacings.Stack>\n </div>\n </Spacings.Inline>\n {formError && <Text.Body tone=\"negative\">{formError}</Text.Body>}\n <Spacings.Inline scale=\"s\">\n <PrimaryButton\n label={submitting ? 'Creating…' : 'Create'}\n onClick={() => void handleCreate()}\n isDisabled={submitting}\n />\n <SecondaryButton\n label=\"Cancel\"\n onClick={() => { setCreating(false); setFormError(''); }}\n />\n </Spacings.Inline>\n </Spacings.Stack>\n </Card>\n )}\n\n {pages.length === 0 && !creating ? (\n <Spacings.Stack scale=\"m\" alignItems=\"center\">\n <Text.Body tone=\"secondary\">No pages yet.</Text.Body>\n <PrimaryButton\n label=\"Create first page\"\n iconLeft={<PlusThinIcon />}\n onClick={() => setCreating(true)}\n />\n </Spacings.Stack>\n ) : pages.length > 0 ? (\n <DataTable\n columns={COLUMNS}\n rows={rows}\n itemRenderer={(row: PageRow, column) => {\n switch (column.key) {\n case 'name':\n return (\n <Spacings.Stack scale=\"xs\">\n <Text.Body isBold>{row.value.name}</Text.Body>\n <Text.Detail tone=\"secondary\">{row.key}</Text.Detail>\n </Spacings.Stack>\n );\n case 'slug':\n return (\n <code\n style={{\n background: 'var(--color-neutral-95)',\n padding: '2px 6px',\n borderRadius: 'var(--border-radius-4)',\n fontSize: 'var(--font-size-10)',\n fontFamily: 'monospace',\n }}\n >\n {row.value.slug}\n </code>\n );\n case 'status':\n return (\n <span>\n {row.states.draft && <StatusBadge variant=\"draft\" />}\n {row.states.published && <StatusBadge variant=\"published\" />}\n {!row.states.draft && !row.states.published && <StatusBadge variant=\"none\" />}\n </span>\n );\n case 'updatedAt':\n return (\n <Text.Body tone=\"secondary\">\n {new Date(row.value.updatedAt).toLocaleString()}\n </Text.Body>\n );\n case 'actions':\n return (\n <div style={{ display: 'flex', alignItems: 'center', gap: '8px' }}>\n <PrimaryButton\n label=\"Edit\"\n size=\"20\"\n onClick={() =>\n history.push(`/${row.key}/edit`, { pageName: row.value.name })\n }\n />\n <SecondaryButton\n label=\"Preview\"\n size=\"20\"\n onClick={() =>\n history.push(`/${row.key}/preview`, { pageName: row.value.name })\n }\n />\n <FlatButton\n tone=\"critical\"\n label={deleting === row.key ? '…' : 'Delete'}\n isDisabled={deleting === row.key}\n onClick={() => void handleDelete(row)}\n />\n </div>\n );\n default:\n return null;\n }\n }}\n />\n ) : null}\n </Spacings.Stack>\n </div>\n );\n};\n\n// ---------------------------------------------------------------------------\n// PageEditorRoute\n// ---------------------------------------------------------------------------\n\ninterface RouteProps {\n config: Config;\n backButton?: ReactNode;\n}\n\nconst PageEditorRoute: React.FC<RouteProps> = ({ config, backButton }) => {\n const { pageKey } = useParams<{ pageKey: string }>();\n const history = useHistory();\n const location = useLocation();\n const { baseURL, projectKey, businessUnitKey, jwtToken } = usePuckApiContext();\n const pageName =\n (location.state as { pageName?: string } | null)?.pageName ?? pageKey ?? 'Page';\n\n return (\n <div style={{ display: 'flex', flexDirection: 'column', height: '100%' }}>\n <div style={NAV_BAR_STYLE}>\n {backButton}\n {backButton && <Text.Body tone=\"secondary\">/</Text.Body>}\n <FlatButton\n label=\"Pages\"\n icon={<AngleLeftIcon />}\n iconPosition=\"left\"\n onClick={() => history.push('/')}\n />\n <Text.Body tone=\"secondary\">/</Text.Body>\n <Text.Body isBold>{pageName}</Text.Body>\n </div>\n <div style={{ flex: 1, overflow: 'hidden' }}>\n <PuckEditor\n baseURL={baseURL}\n projectKey={projectKey}\n businessUnitKey={businessUnitKey}\n jwtToken={jwtToken ?? ''}\n pageKey={pageKey!}\n config={config}\n onError={(err: Error) => { console.error('[PageManager] editor error:', err); }}\n />\n </div>\n </div>\n );\n};\n\n// ---------------------------------------------------------------------------\n// PagePreviewRoute\n// ---------------------------------------------------------------------------\n\nconst PagePreviewRoute: React.FC<RouteProps> = ({ config, backButton }) => {\n const { pageKey } = useParams<{ pageKey: string }>();\n const history = useHistory();\n const location = useLocation();\n const pageName =\n (location.state as { pageName?: string } | null)?.pageName ?? pageKey ?? 'Page';\n\n return (\n <div>\n <div style={NAV_BAR_STYLE}>\n {backButton}\n {backButton && <Text.Body tone=\"secondary\">/</Text.Body>}\n <FlatButton\n label=\"Pages\"\n icon={<AngleLeftIcon />}\n iconPosition=\"left\"\n onClick={() => history.push('/')}\n />\n <Text.Body tone=\"secondary\">/</Text.Body>\n <Text.Body isBold>{pageName}</Text.Body>\n <span\n style={{\n background: 'var(--color-primary-95)',\n color: 'var(--color-primary-25)',\n border: '1px solid var(--color-primary-85)',\n display: 'inline-flex',\n alignItems: 'center',\n padding: '2px 10px',\n borderRadius: 'var(--border-radius-20)',\n fontSize: 'var(--font-size-10)',\n fontWeight: 'var(--font-weight-600)',\n }}\n >\n Preview\n </span>\n </div>\n <PuckRenderer pageKey={pageKey} mode=\"preview\" config={config} />\n </div>\n );\n};\n\n// ---------------------------------------------------------------------------\n// Inner router component\n// ---------------------------------------------------------------------------\n\ninterface PageManagerInnerProps {\n config: Config;\n backButton?: ReactNode;\n}\n\nconst PageManagerInner: React.FC<PageManagerInnerProps> = ({ config, backButton }) => (\n <Switch>\n <Route exact path=\"/\" render={() => <PageList backButton={backButton} />} />\n <Route\n path=\"/:pageKey/edit\"\n render={() => <PageEditorRoute config={config} backButton={backButton} />}\n />\n <Route\n path=\"/:pageKey/preview\"\n render={() => <PagePreviewRoute config={config} backButton={backButton} />}\n />\n </Switch>\n);\n\n// ---------------------------------------------------------------------------\n// Public component\n// ---------------------------------------------------------------------------\n\nexport interface PageManagerProps {\n /** URL path where this manager is mounted, e.g. \"/pages\" — used as router basename */\n parentUrl: string;\n baseURL: string;\n projectKey: string;\n businessUnitKey: string;\n jwtToken: string;\n /** Puck component config — passed to editor and preview. Defaults to defaultPuckConfig. */\n config?: Config;\n /** Optional element rendered before the breadcrumb in editor/preview headers */\n backButton?: ReactNode;\n}\n\nexport const PageManager: React.FC<PageManagerProps> = ({\n parentUrl,\n baseURL,\n projectKey,\n businessUnitKey,\n jwtToken,\n config = DEFAULT_CONFIG,\n backButton,\n}) => (\n <EnsureIntlProvider>\n <PuckApiProvider\n baseURL={baseURL}\n projectKey={projectKey}\n businessUnitKey={businessUnitKey}\n jwtToken={jwtToken}\n >\n <BrowserRouter basename={parentUrl}>\n <PageManagerInner config={config} backButton={backButton} />\n </BrowserRouter>\n </PuckApiProvider>\n </EnsureIntlProvider>\n);\n","import React, { useContext, type PropsWithChildren } from 'react';\nimport { IntlContext, IntlProvider, ReactIntlErrorCode } from 'react-intl';\n\n/**\n * Ensures a react-intl context exists for the commercetools UIKit components\n * rendered by this package.\n *\n * UIKit components (DataTable, Text, buttons, …) call react-intl internally and\n * require an `<IntlProvider>` in the ancestry. If the host already provides one\n * (e.g. the Merchant Center ApplicationShell, or a storefront that set up\n * react-intl), it is reused as-is. Otherwise a minimal English provider is\n * mounted so the package also works standalone.\n *\n * Detection mirrors react-intl's own `useIntl`: `IntlContext` defaults to `null`\n * when no provider is present.\n */\nexport const EnsureIntlProvider: React.FC<PropsWithChildren> = ({ children }) => {\n const intl = useContext(IntlContext);\n\n if (intl) {\n return <>{children}</>;\n }\n\n return (\n <IntlProvider\n locale=\"en\"\n defaultLocale=\"en\"\n messages={{}}\n onError={(err) => {\n // UIKit ships `defaultMessage`s, so a missing-translation against an\n // empty catalog is expected and would otherwise flood the console.\n if (err.code === ReactIntlErrorCode.MISSING_TRANSLATION) return;\n // eslint-disable-next-line no-console\n console.error(err);\n }}\n >\n {children}\n </IntlProvider>\n );\n};\n"],"mappings":"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","names":["jsx"]}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@commercetools-demo/puck-page-manager",
3
- "version": "0.5.0",
3
+ "version": "0.5.2",
4
4
  "description": "Router-aware page manager UI (list, editor, preview) for the Puck CMS integration",
5
5
  "main": "dist/index.js",
6
6
  "module": "dist/index.mjs",
@@ -25,10 +25,10 @@
25
25
  "typecheck": "tsc --noEmit"
26
26
  },
27
27
  "dependencies": {
28
- "@commercetools-demo/puck-api": "^0.5.0",
29
- "@commercetools-demo/puck-editor": "^0.5.0",
30
- "@commercetools-demo/puck-renderer": "^0.5.0",
31
- "@commercetools-demo/puck-types": "^0.5.0",
28
+ "@commercetools-demo/puck-api": "^0.5.2",
29
+ "@commercetools-demo/puck-editor": "^0.5.2",
30
+ "@commercetools-demo/puck-renderer": "^0.5.2",
31
+ "@commercetools-demo/puck-types": "^0.5.1",
32
32
  "@commercetools-uikit/card": "^20.5.0",
33
33
  "@commercetools-uikit/data-table": "^20.5.0",
34
34
  "@commercetools-uikit/flat-button": "^20.5.0",