@commercetools-demo/puck-content-manager 0.1.0 → 0.2.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/index.js CHANGED
@@ -720,7 +720,7 @@ var COLUMNS = [
720
720
  { key: "actions", label: "Actions", shouldIgnoreRowClick: true }
721
721
  ];
722
722
  var ContentListRoute = ({ defaultContentType, backButton }) => {
723
- const navigate = (0, import_react_router_dom.useNavigate)();
723
+ const history = (0, import_react_router_dom.useHistory)();
724
724
  const { contents, loading, error, fetchContents, createContent, deleteContent, refresh } = (0, import_puck_api3.usePuckContents)(defaultContentType);
725
725
  const [filterType, setFilterType] = (0, import_react3.useState)(defaultContentType ?? "");
726
726
  const [showCreate, setShowCreate] = (0, import_react3.useState)(false);
@@ -751,7 +751,7 @@ var ContentListRoute = ({ defaultContentType, backButton }) => {
751
751
  setShowCreate(false);
752
752
  setCreateName("");
753
753
  setCreateType(defaultContentType ?? "");
754
- navigate(`/${created.key}`, { state: { contentName: created.value.name } });
754
+ history.push(`/${created.key}`, { contentName: created.value.name });
755
755
  } catch (err) {
756
756
  setCreateError(err.message);
757
757
  } finally {
@@ -895,7 +895,7 @@ var ContentListRoute = ({ defaultContentType, backButton }) => {
895
895
  {
896
896
  label: "Edit",
897
897
  size: "20",
898
- onClick: () => navigate(`/${row.key}`, { state: { contentName: row.value.name } })
898
+ onClick: () => history.push(`/${row.key}`, { contentName: row.value.name })
899
899
  }
900
900
  ),
901
901
  /* @__PURE__ */ (0, import_jsx_runtime3.jsx)(
@@ -918,7 +918,7 @@ var ContentListRoute = ({ defaultContentType, backButton }) => {
918
918
  };
919
919
  var ContentEditorRoute = ({ config, backButton }) => {
920
920
  const { contentKey } = (0, import_react_router_dom.useParams)();
921
- const navigate = (0, import_react_router_dom.useNavigate)();
921
+ const history = (0, import_react_router_dom.useHistory)();
922
922
  const location = (0, import_react_router_dom.useLocation)();
923
923
  const contentName = location.state?.contentName ?? contentKey ?? "Content";
924
924
  const {
@@ -1038,7 +1038,7 @@ var ContentEditorRoute = ({ config, backButton }) => {
1038
1038
  label: "Content Items",
1039
1039
  icon: /* @__PURE__ */ (0, import_jsx_runtime3.jsx)(import_icons2.AngleLeftIcon, {}),
1040
1040
  iconPosition: "left",
1041
- onClick: () => navigate("/")
1041
+ onClick: () => history.push("/")
1042
1042
  }
1043
1043
  ),
1044
1044
  /* @__PURE__ */ (0, import_jsx_runtime3.jsx)(import_text2.default.Body, { tone: "secondary", children: "/" }),
@@ -1074,19 +1074,20 @@ var ContentManagerRouterInner = ({
1074
1074
  config,
1075
1075
  defaultContentType,
1076
1076
  backButton
1077
- }) => /* @__PURE__ */ (0, import_jsx_runtime3.jsxs)(import_react_router_dom.Routes, { children: [
1077
+ }) => /* @__PURE__ */ (0, import_jsx_runtime3.jsxs)(import_react_router_dom.Switch, { children: [
1078
1078
  /* @__PURE__ */ (0, import_jsx_runtime3.jsx)(
1079
1079
  import_react_router_dom.Route,
1080
1080
  {
1081
+ exact: true,
1081
1082
  path: "/",
1082
- element: /* @__PURE__ */ (0, import_jsx_runtime3.jsx)(ContentListRoute, { defaultContentType, backButton })
1083
+ render: () => /* @__PURE__ */ (0, import_jsx_runtime3.jsx)(ContentListRoute, { defaultContentType, backButton })
1083
1084
  }
1084
1085
  ),
1085
1086
  /* @__PURE__ */ (0, import_jsx_runtime3.jsx)(
1086
1087
  import_react_router_dom.Route,
1087
1088
  {
1088
1089
  path: "/:contentKey",
1089
- element: /* @__PURE__ */ (0, import_jsx_runtime3.jsx)(ContentEditorRoute, { config, backButton })
1090
+ render: () => /* @__PURE__ */ (0, import_jsx_runtime3.jsx)(ContentEditorRoute, { config, backButton })
1090
1091
  }
1091
1092
  )
1092
1093
  ] });
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/index.ts","../src/ContentManager.tsx","../src/ContentEditor.tsx","../src/ContentManagerRouter.tsx"],"sourcesContent":["export { ContentManager } from './ContentManager';\nexport type { ContentManagerProps } from './ContentManager';\n\nexport { ContentEditor } from './ContentEditor';\nexport type { ContentEditorProps } from './ContentEditor';\n\nexport { ContentManagerRouter } from './ContentManagerRouter';\nexport type { ContentManagerRouterProps } from './ContentManagerRouter';\n","import React, { useState } from 'react';\nimport { PuckApiProvider, usePuckContents } from '@commercetools-demo/puck-api';\nimport type {\n CreatePuckContentInput,\n PuckContentListItem,\n} 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, SearchIcon } 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// Row type for DataTable\n// ---------------------------------------------------------------------------\n\ntype ContentRow = PuckContentListItem & { id: string };\n\nconst columns = [\n { key: 'name', label: 'Name' },\n { key: 'contentType', label: 'Content Type' },\n { key: 'status', label: 'Status' },\n { key: 'updatedAt', label: 'Updated' },\n { key: 'actions', label: 'Actions', shouldIgnoreRowClick: true },\n];\n\n// ---------------------------------------------------------------------------\n// Inner list component (uses context)\n// ---------------------------------------------------------------------------\n\ninterface ContentListProps {\n defaultContentType?: string;\n onEdit: (item: PuckContentListItem) => void;\n}\n\nconst ContentList: React.FC<ContentListProps> = ({ defaultContentType, onEdit }) => {\n const { contents, loading, error, fetchContents, createContent, deleteContent, refresh } =\n usePuckContents(defaultContentType);\n\n const [filterType, setFilterType] = useState(defaultContentType ?? '');\n const [showCreate, setShowCreate] = useState(false);\n const [createName, setCreateName] = useState('');\n const [createType, setCreateType] = useState(defaultContentType ?? '');\n const [createError, setCreateError] = useState<string | null>(null);\n const [creating, setCreating] = useState(false);\n const [deleting, setDeleting] = useState<string | null>(null);\n\n const handleFilter = () => void fetchContents(filterType || undefined);\n\n const handleCreate = async () => {\n setCreateError(null);\n if (!createName.trim()) { setCreateError('Name is required'); return; }\n if (!createType.trim()) { setCreateError('Content type is required'); return; }\n setCreating(true);\n try {\n const input: CreatePuckContentInput = {\n name: createName.trim(),\n contentType: createType.trim(),\n data: { content: [], root: { props: {} } },\n };\n await createContent(input);\n setShowCreate(false);\n setCreateName('');\n setCreateType(defaultContentType ?? '');\n } catch (err) {\n setCreateError((err as Error).message);\n } finally {\n setCreating(false);\n }\n };\n\n const handleDelete = async (key: string) => {\n if (!confirm('Delete this content item and all its versions?')) return;\n setDeleting(key);\n try {\n await deleteContent(key);\n } finally {\n setDeleting(null);\n }\n };\n\n const rows: ContentRow[] = contents.map((c) => ({ ...c, id: c.key }));\n\n return (\n <div style={{ maxWidth: '1200px', margin: '0 auto', padding: '32px 24px' }}>\n <Spacings.Stack scale=\"l\">\n {/* Header */}\n <Spacings.Inline justifyContent=\"space-between\" alignItems=\"center\">\n <Text.Headline as=\"h1\">Content Items</Text.Headline>\n <PrimaryButton\n label=\"New Content\"\n iconLeft={<PlusThinIcon />}\n onClick={() => setShowCreate((v) => !v)}\n />\n </Spacings.Inline>\n\n {/* Create form */}\n {showCreate && (\n <Card insetScale=\"l\">\n <Spacings.Stack scale=\"m\">\n <Text.Subheadline as=\"h4\" isBold>Create Content Item</Text.Subheadline>\n {createError && <Text.Body tone=\"negative\">{createError}</Text.Body>}\n <Spacings.Inline scale=\"m\">\n <div style={{ flex: 1 }}>\n <Spacings.Stack scale=\"xs\">\n <Label htmlFor=\"create-name\">Name</Label>\n <TextInput\n id=\"create-name\"\n value={createName}\n onChange={(e) => setCreateName(e.target.value)}\n placeholder=\"e.g. Homepage Hero\"\n />\n </Spacings.Stack>\n </div>\n <div style={{ flex: 1 }}>\n <Spacings.Stack scale=\"xs\">\n <Label htmlFor=\"create-type\">Content Type</Label>\n <TextInput\n id=\"create-type\"\n value={createType}\n onChange={(e) => setCreateType(e.target.value)}\n placeholder=\"e.g. hero, banner\"\n />\n </Spacings.Stack>\n </div>\n </Spacings.Inline>\n <Spacings.Inline scale=\"s\">\n <PrimaryButton\n label={creating ? 'Creating…' : 'Create'}\n onClick={() => void handleCreate()}\n isDisabled={creating}\n />\n <SecondaryButton label=\"Cancel\" onClick={() => setShowCreate(false)} />\n </Spacings.Inline>\n </Spacings.Stack>\n </Card>\n )}\n\n {/* Filter row */}\n <Spacings.Inline scale=\"s\" alignItems=\"center\">\n <div style={{ flex: 1, maxWidth: '280px' }}>\n <TextInput\n value={filterType}\n onChange={(e) => setFilterType(e.target.value)}\n placeholder=\"Filter by content type…\"\n />\n </div>\n <SecondaryButton\n label=\"Filter\"\n iconLeft={<SearchIcon />}\n onClick={handleFilter}\n />\n <FlatButton\n label=\"Clear\"\n onClick={() => { setFilterType(''); void fetchContents(undefined); }}\n />\n <FlatButton label=\"Refresh\" onClick={() => void refresh()} />\n </Spacings.Inline>\n\n {error && <Text.Body tone=\"negative\">{error}</Text.Body>}\n\n {/* Table */}\n {loading ? (\n <div style={{ display: 'flex', justifyContent: 'center', padding: '48px' }}>\n <LoadingSpinner />\n </div>\n ) : contents.length === 0 ? (\n <Spacings.Stack scale=\"m\" alignItems=\"center\">\n <Text.Body tone=\"secondary\">No content items found.</Text.Body>\n </Spacings.Stack>\n ) : (\n <DataTable\n columns={columns}\n rows={rows}\n itemRenderer={(row: ContentRow, column) => {\n switch (column.key) {\n case 'name':\n return <Text.Body isBold>{row.value.name}</Text.Body>;\n case 'contentType':\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.contentType}\n </code>\n );\n case 'status': {\n const hasDraft = !!row.states.draft;\n const hasPublished = !!row.states.published;\n return (\n <span>\n {hasDraft && <StatusBadge variant=\"draft\" />}\n {hasPublished && <StatusBadge variant=\"published\" />}\n {!hasDraft && !hasPublished && <StatusBadge variant=\"none\" />}\n </span>\n );\n }\n case 'updatedAt':\n return (\n <Text.Body tone=\"secondary\">\n {new Date(row.value.updatedAt).toLocaleDateString()}\n </Text.Body>\n );\n case 'actions':\n return (\n <div style={{ display: 'flex', alignItems: 'center', gap: '8px' }}>\n <PrimaryButton label=\"Edit\" size=\"20\" onClick={() => onEdit(row)} />\n <FlatButton\n tone=\"critical\"\n label={deleting === row.key ? '…' : 'Delete'}\n isDisabled={deleting === row.key}\n onClick={() => void handleDelete(row.key)}\n />\n </div>\n );\n default:\n return null;\n }\n }}\n />\n )}\n </Spacings.Stack>\n </div>\n );\n};\n\n// ---------------------------------------------------------------------------\n// Public component — wraps its own PuckApiProvider\n// ---------------------------------------------------------------------------\n\nexport interface ContentManagerProps {\n baseURL: string;\n projectKey: string;\n businessUnitKey: string;\n jwtToken: string;\n defaultContentType?: string;\n onEdit: (item: PuckContentListItem) => void;\n}\n\nexport const ContentManager: React.FC<ContentManagerProps> = ({\n baseURL,\n projectKey,\n businessUnitKey,\n jwtToken,\n defaultContentType,\n onEdit,\n}) => (\n <PuckApiProvider\n baseURL={baseURL}\n projectKey={projectKey}\n businessUnitKey={businessUnitKey}\n jwtToken={jwtToken}\n >\n <ContentList defaultContentType={defaultContentType} onEdit={onEdit} />\n </PuckApiProvider>\n);\n","import React, { useCallback, useMemo, useRef, useState } from 'react';\nimport { Puck, type Config, type Data } from '@measured/puck';\nimport '@measured/puck/puck.css';\nimport { PuckApiProvider, usePuckContent } from '@commercetools-demo/puck-api';\nimport type { PuckContentStateInfo, PuckData } from '@commercetools-demo/puck-types';\nimport {\n ComponentSearchProvider,\n ComponentsPanel,\n ComponentItemFilter,\n} from '@commercetools-demo/puck-editor';\n\n// ---------------------------------------------------------------------------\n// Inline toolbar — mirrors EditorToolbar but uses PuckContentStateInfo\n// ---------------------------------------------------------------------------\n\ninterface ContentToolbarProps {\n saving: boolean;\n isDirty: boolean;\n states: PuckContentStateInfo;\n onSave: () => void;\n onPublish: () => void;\n onRevert: () => void;\n}\n\ntype BadgeVariant = 'saving' | 'unsaved' | 'draft' | 'published';\n\nconst BADGE_STYLES: Record<BadgeVariant, { bg: string; color: string; border: string }> = {\n saving: { bg: 'rgba(251, 191, 36, 0.12)', color: 'var(--status-saving)', border: 'rgba(251, 191, 36, 0.3)' },\n unsaved: { bg: 'rgba(100, 116, 139, 0.12)', color: 'var(--text-muted)', border: 'rgba(100, 116, 139, 0.3)' },\n draft: { bg: 'rgba(129, 140, 248, 0.12)', color: 'var(--status-draft)', border: 'rgba(129, 140, 248, 0.3)' },\n published: { bg: 'rgba(6, 214, 160, 0.12)', color: 'var(--status-published)', border: 'rgba(6, 214, 160, 0.3)' },\n};\n\nconst StatusBadge: React.FC<{ label: string; variant: BadgeVariant }> = ({\n label,\n variant,\n}) => {\n const bs = BADGE_STYLES[variant];\n return (\n <span\n style={{\n display: 'inline-flex',\n alignItems: 'center',\n padding: '2px 10px',\n borderRadius: '12px',\n fontSize: '12px',\n fontWeight: 600,\n background: bs.bg,\n color: bs.color,\n border: `1px solid ${bs.border}`,\n }}\n >\n {label}\n </span>\n );\n};\n\nconst ContentToolbar: React.FC<ContentToolbarProps> = ({\n saving,\n isDirty,\n states,\n onSave,\n onPublish,\n onRevert,\n}) => {\n const hasDraft = Boolean(states.draft);\n const hasPublished = Boolean(states.published);\n\n return (\n <div style={{ display: 'flex', alignItems: 'center', gap: '12px', flexWrap: 'wrap' }}>\n <div style={{ display: 'flex', alignItems: 'center', gap: '6px' }}>\n {saving && <StatusBadge label=\"Saving…\" variant=\"saving\" />}\n {!saving && isDirty && <StatusBadge label=\"Unsaved\" variant=\"unsaved\" />}\n {!saving && !isDirty && hasDraft && (\n <StatusBadge label=\"Draft\" variant=\"draft\" />\n )}\n {hasPublished && <StatusBadge label=\"Published\" variant=\"published\" />}\n </div>\n\n {hasDraft && hasPublished && (\n <button\n onClick={onRevert}\n disabled={saving}\n style={{\n padding: '6px 14px',\n borderRadius: '4px',\n border: '1px solid var(--border-glow)',\n background: 'transparent',\n color: 'var(--text-muted)',\n fontWeight: 500,\n fontSize: '13px',\n cursor: saving ? 'not-allowed' : 'pointer',\n opacity: saving ? 0.5 : 1,\n }}\n >\n Revert to Published\n </button>\n )}\n\n <button\n onClick={onSave}\n disabled={!isDirty || saving}\n style={{\n padding: '6px 14px',\n borderRadius: '4px',\n border: '1px solid var(--border-glow)',\n background: 'transparent',\n color: 'var(--text-muted)',\n fontWeight: 500,\n fontSize: '13px',\n cursor: (!isDirty || saving) ? 'not-allowed' : 'pointer',\n opacity: (!isDirty || saving) ? 0.4 : 1,\n }}\n >\n Save\n </button>\n\n <button\n onClick={onPublish}\n disabled={saving}\n style={{\n padding: '6px 16px',\n borderRadius: '4px',\n border: '1px solid var(--accent-cyan)',\n background: 'rgba(0, 212, 255, 0.1)',\n color: 'var(--accent-cyan)',\n fontWeight: 600,\n fontSize: '13px',\n cursor: saving ? 'not-allowed' : 'pointer',\n opacity: saving ? 0.5 : 1,\n boxShadow: '0 0 12px rgba(0, 212, 255, 0.15)',\n }}\n >\n {hasPublished ? 'Re-publish' : 'Publish'}\n </button>\n </div>\n );\n};\n\n// ---------------------------------------------------------------------------\n// Inner editor component (uses context)\n// ---------------------------------------------------------------------------\n\ninterface ContentEditorInnerProps {\n contentKey: string;\n config: Config;\n onPublish?: (data: PuckData) => void;\n onSave?: (data: PuckData) => void;\n onError?: (error: Error) => void;\n}\n\nconst ContentEditorInner: React.FC<ContentEditorInnerProps> = ({\n contentKey,\n config,\n onPublish,\n onSave,\n onError,\n}) => {\n const {\n content,\n states,\n saving,\n loading,\n error,\n saveDraft,\n publish,\n revertToPublished,\n } = usePuckContent(contentKey);\n\n const latestDataRef = useRef<Data | null>(null);\n const [hasUnsavedChanges, setHasUnsavedChanges] = useState(false);\n\n const handleChange = useCallback((data: Data) => {\n latestDataRef.current = data;\n setHasUnsavedChanges(true);\n }, []);\n\n const handleSave = useCallback(async () => {\n const data = latestDataRef.current;\n if (!data) return;\n try {\n await saveDraft(data as PuckData);\n setHasUnsavedChanges(false);\n onSave?.(data as PuckData);\n } catch (err) {\n onError?.(err as Error);\n }\n }, [saveDraft, onSave, onError]);\n\n const handlePublish = useCallback(\n async (data: Data) => {\n try {\n await saveDraft(data as PuckData);\n setHasUnsavedChanges(false);\n await publish(false);\n onPublish?.(data as PuckData);\n } catch (err) {\n onError?.(err as Error);\n }\n },\n [saveDraft, publish, onPublish, onError]\n );\n\n const handleRevert = useCallback(async () => {\n try {\n await revertToPublished();\n setHasUnsavedChanges(false);\n } catch (err) {\n onError?.(err as Error);\n }\n }, [revertToPublished, onError]);\n\n\n // Override root fields with content-specific labels and add slot field.\n // Stored in content.data.root.props (title, slot, backgroundColor, etc.).\n const contentConfig = useMemo((): Config => {\n const otherRootFields = Object.fromEntries(\n Object.entries(config.root?.fields ?? {}).filter(([k]) => k !== 'title')\n );\n return {\n ...config,\n root: {\n ...config.root,\n fields: {\n title: { type: 'text', label: 'Content Title' },\n slot: { type: 'text', label: 'Slot' },\n ...otherRootFields,\n },\n defaultProps: {\n title: 'New Content',\n slot: '',\n ...config.root?.defaultProps,\n },\n },\n };\n }, [config]);\n\n if (loading) {\n return (\n <div\n style={{\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'center',\n height: '100vh',\n fontSize: '16px',\n color: 'var(--text-muted)',\n }}\n >\n Loading editor…\n </div>\n );\n }\n\n if (error) {\n return (\n <div\n style={{\n padding: '32px',\n color: 'var(--status-error)',\n background: 'rgba(248, 113, 113, 0.08)',\n border: '1px solid rgba(248, 113, 113, 0.25)',\n borderRadius: '8px',\n margin: '16px',\n }}\n >\n <strong>Error loading content:</strong> {error}\n </div>\n );\n }\n\n // Use draft state data if available, otherwise fall back to the main content value\n const activeData: PuckData =\n states.draft?.data ??\n content?.data ?? {\n content: [],\n root: { props: {} },\n };\n\n\n return (\n <ComponentSearchProvider>\n <Puck\n config={contentConfig}\n data={activeData as Data}\n onChange={handleChange}\n onPublish={handlePublish}\n overrides={{\n headerActions: () => (\n <ContentToolbar\n saving={saving}\n isDirty={hasUnsavedChanges}\n states={states}\n onSave={() => void handleSave()}\n onPublish={() => void handlePublish(activeData as Data)}\n onRevert={() => void handleRevert()}\n />\n ),\n components: ({ children }) => <ComponentsPanel>{children}</ComponentsPanel>,\n componentItem: ({ children, name }) => (\n <ComponentItemFilter name={name}>{children}</ComponentItemFilter>\n ),\n }}\n />\n </ComponentSearchProvider>\n );\n};\n\n// ---------------------------------------------------------------------------\n// Public component — wraps its own PuckApiProvider\n// ---------------------------------------------------------------------------\n\nexport interface ContentEditorProps {\n baseURL: string;\n projectKey: string;\n businessUnitKey: string;\n jwtToken: string;\n contentKey: string;\n /** Puck component config — must match what's used in the renderer */\n config: Config;\n onPublish?: (data: PuckData) => void;\n onSave?: (data: PuckData) => void;\n onError?: (error: Error) => void;\n}\n\nexport const ContentEditor: React.FC<ContentEditorProps> = ({\n baseURL,\n projectKey,\n businessUnitKey,\n jwtToken,\n contentKey,\n config,\n onPublish,\n onSave,\n onError,\n}) => (\n <PuckApiProvider\n baseURL={baseURL}\n projectKey={projectKey}\n businessUnitKey={businessUnitKey}\n jwtToken={jwtToken}\n >\n <ContentEditorInner\n contentKey={contentKey}\n config={config}\n onPublish={onPublish}\n onSave={onSave}\n onError={onError}\n />\n </PuckApiProvider>\n);\n","import React, { useState, useCallback, useMemo, useRef, type ReactNode } from 'react';\nimport {\n BrowserRouter,\n Routes,\n Route,\n useNavigate,\n useParams,\n useLocation,\n} from 'react-router-dom';\nimport { Puck, type Config, type Data } from '@measured/puck';\nimport '@measured/puck/puck.css';\nimport {\n ComponentSearchProvider,\n ComponentsPanel,\n ComponentItemFilter,\n} from '@commercetools-demo/puck-editor';\nimport {\n PuckApiProvider,\n usePuckContents,\n usePuckContent,\n} from '@commercetools-demo/puck-api';\nimport type {\n CreatePuckContentInput,\n PuckContentListItem,\n PuckContentStateInfo,\n PuckData,\n} 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, SearchIcon, 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// Content toolbar (status badges + publish/revert buttons)\n// ---------------------------------------------------------------------------\n\ntype BadgeVariant = 'saving' | 'unsaved' | 'draft' | 'published';\n\nconst BADGE_STYLES: Record<BadgeVariant, { bg: string; color: string; border: string }> = {\n saving: { bg: 'rgba(251, 191, 36, 0.12)', color: 'var(--status-saving)', border: 'rgba(251, 191, 36, 0.3)' },\n unsaved: { bg: 'rgba(100, 116, 139, 0.12)', color: 'var(--text-muted)', border: 'rgba(100, 116, 139, 0.3)' },\n draft: { bg: 'rgba(129, 140, 248, 0.12)', color: 'var(--status-draft)', border: 'rgba(129, 140, 248, 0.3)' },\n published: { bg: 'rgba(6, 214, 160, 0.12)', color: 'var(--status-published)', border: 'rgba(6, 214, 160, 0.3)' },\n};\n\nconst EditorStatusBadge: React.FC<{ label: string; variant: BadgeVariant }> = ({ label, variant }) => {\n const bs = BADGE_STYLES[variant];\n return (\n <span\n style={{\n display: 'inline-flex',\n alignItems: 'center',\n padding: '2px 10px',\n borderRadius: '12px',\n fontSize: '12px',\n fontWeight: 600,\n background: bs.bg,\n color: bs.color,\n border: `1px solid ${bs.border}`,\n }}\n >\n {label}\n </span>\n );\n};\n\ninterface ContentToolbarProps {\n saving: boolean;\n isDirty: boolean;\n states: PuckContentStateInfo;\n onSave: () => void;\n onPublish: () => void;\n onRevert: () => void;\n}\n\nconst ContentToolbar: React.FC<ContentToolbarProps> = ({ saving, isDirty, states, onSave, onPublish, onRevert }) => {\n const hasDraft = Boolean(states.draft);\n const hasPublished = Boolean(states.published);\n return (\n <div style={{ display: 'flex', alignItems: 'center', gap: '12px', flexWrap: 'wrap' }}>\n <div style={{ display: 'flex', alignItems: 'center', gap: '6px' }}>\n {saving && <EditorStatusBadge label=\"Saving…\" variant=\"saving\" />}\n {!saving && isDirty && <EditorStatusBadge label=\"Unsaved\" variant=\"unsaved\" />}\n {!saving && !isDirty && hasDraft && <EditorStatusBadge label=\"Draft\" variant=\"draft\" />}\n {hasPublished && <EditorStatusBadge label=\"Published\" variant=\"published\" />}\n </div>\n {hasDraft && hasPublished && (\n <button\n onClick={onRevert}\n disabled={saving}\n style={{\n padding: '6px 14px',\n borderRadius: '4px',\n border: '1px solid var(--border-glow)',\n background: 'transparent',\n color: 'var(--text-muted)',\n fontWeight: 500,\n fontSize: '13px',\n cursor: saving ? 'not-allowed' : 'pointer',\n opacity: saving ? 0.5 : 1,\n }}\n >\n Revert to Published\n </button>\n )}\n <button\n onClick={onSave}\n disabled={!isDirty || saving}\n style={{\n padding: '6px 14px',\n borderRadius: '4px',\n border: '1px solid var(--border-glow)',\n background: 'transparent',\n color: 'var(--text-muted)',\n fontWeight: 500,\n fontSize: '13px',\n cursor: (!isDirty || saving) ? 'not-allowed' : 'pointer',\n opacity: (!isDirty || saving) ? 0.4 : 1,\n }}\n >\n Save\n </button>\n <button\n onClick={onPublish}\n disabled={saving}\n style={{\n padding: '6px 16px',\n borderRadius: '4px',\n border: '1px solid var(--accent-cyan)',\n background: 'rgba(0, 212, 255, 0.1)',\n color: 'var(--accent-cyan)',\n fontWeight: 600,\n fontSize: '13px',\n cursor: saving ? 'not-allowed' : 'pointer',\n opacity: saving ? 0.5 : 1,\n boxShadow: '0 0 12px rgba(0, 212, 255, 0.15)',\n }}\n >\n {hasPublished ? 'Re-publish' : 'Publish'}\n </button>\n </div>\n );\n};\n\n// ---------------------------------------------------------------------------\n// 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 ContentRow = PuckContentListItem & { id: string };\n\nconst COLUMNS = [\n { key: 'name', label: 'Name' },\n { key: 'contentType', label: 'Content Type' },\n { key: 'status', label: 'Status' },\n { key: 'updatedAt', label: 'Updated' },\n { key: 'actions', label: 'Actions', shouldIgnoreRowClick: true },\n];\n\n// ---------------------------------------------------------------------------\n// ContentListRoute\n// ---------------------------------------------------------------------------\n\ninterface ContentListRouteProps {\n defaultContentType?: string;\n backButton?: ReactNode;\n}\n\nconst ContentListRoute: React.FC<ContentListRouteProps> = ({ defaultContentType, backButton }) => {\n const navigate = useNavigate();\n const { contents, loading, error, fetchContents, createContent, deleteContent, refresh } =\n usePuckContents(defaultContentType);\n\n const [filterType, setFilterType] = useState(defaultContentType ?? '');\n const [showCreate, setShowCreate] = useState(false);\n const [createName, setCreateName] = useState('');\n const [createType, setCreateType] = useState(defaultContentType ?? '');\n const [createError, setCreateError] = useState<string | null>(null);\n const [creating, setCreating] = useState(false);\n const [deleting, setDeleting] = useState<string | null>(null);\n\n const handleFilter = () => void fetchContents(filterType || undefined);\n\n const handleCreate = async () => {\n setCreateError(null);\n if (!createName.trim()) { setCreateError('Name is required'); return; }\n if (!createType.trim()) { setCreateError('Content type is required'); return; }\n setCreating(true);\n try {\n const input: CreatePuckContentInput = {\n name: createName.trim(),\n contentType: createType.trim(),\n data: { content: [], root: { props: {} } },\n };\n const created = await createContent(input);\n setShowCreate(false);\n setCreateName('');\n setCreateType(defaultContentType ?? '');\n navigate(`/${created.key}`, { state: { contentName: created.value.name } });\n } catch (err) {\n setCreateError((err as Error).message);\n } finally {\n setCreating(false);\n }\n };\n\n const handleDelete = async (key: string) => {\n if (!confirm('Delete this content item and all its versions?')) return;\n setDeleting(key);\n try {\n await deleteContent(key);\n } finally {\n setDeleting(null);\n }\n };\n\n const rows: ContentRow[] = contents.map((c) => ({ ...c, id: c.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\">Content Items</Text.Headline>\n </Spacings.Inline>\n <PrimaryButton\n label=\"New Content\"\n iconLeft={<PlusThinIcon />}\n onClick={() => setShowCreate((v) => !v)}\n />\n </Spacings.Inline>\n\n {showCreate && (\n <Card insetScale=\"l\">\n <Spacings.Stack scale=\"m\">\n <Text.Subheadline as=\"h4\" isBold>Create Content Item</Text.Subheadline>\n {createError && <Text.Body tone=\"negative\">{createError}</Text.Body>}\n <Spacings.Inline scale=\"m\">\n <div style={{ flex: 1 }}>\n <Spacings.Stack scale=\"xs\">\n <Label htmlFor=\"create-content-name\">Name</Label>\n <TextInput\n id=\"create-content-name\"\n value={createName}\n onChange={(e) => setCreateName(e.target.value)}\n placeholder=\"e.g. Homepage Hero\"\n />\n </Spacings.Stack>\n </div>\n <div style={{ flex: 1 }}>\n <Spacings.Stack scale=\"xs\">\n <Label htmlFor=\"create-content-type\">Content Type</Label>\n <TextInput\n id=\"create-content-type\"\n value={createType}\n onChange={(e) => setCreateType(e.target.value)}\n placeholder=\"e.g. hero, banner\"\n />\n </Spacings.Stack>\n </div>\n </Spacings.Inline>\n <Spacings.Inline scale=\"s\">\n <PrimaryButton\n label={creating ? 'Creating…' : 'Create'}\n onClick={() => void handleCreate()}\n isDisabled={creating}\n />\n <SecondaryButton label=\"Cancel\" onClick={() => setShowCreate(false)} />\n </Spacings.Inline>\n </Spacings.Stack>\n </Card>\n )}\n\n <Spacings.Inline scale=\"s\" alignItems=\"center\">\n <div style={{ flex: 1, maxWidth: '280px' }}>\n <TextInput\n value={filterType}\n onChange={(e) => setFilterType(e.target.value)}\n placeholder=\"Filter by content type…\"\n />\n </div>\n <SecondaryButton\n label=\"Filter\"\n iconLeft={<SearchIcon />}\n onClick={handleFilter}\n />\n <FlatButton\n label=\"Clear\"\n onClick={() => { setFilterType(''); void fetchContents(undefined); }}\n />\n <FlatButton label=\"Refresh\" onClick={() => void refresh()} />\n </Spacings.Inline>\n\n {error && <Text.Body tone=\"negative\">{error}</Text.Body>}\n\n {loading ? (\n <div style={{ display: 'flex', justifyContent: 'center', padding: '48px' }}>\n <LoadingSpinner />\n </div>\n ) : contents.length === 0 ? (\n <Spacings.Stack scale=\"m\" alignItems=\"center\">\n <Text.Body tone=\"secondary\">No content items found.</Text.Body>\n </Spacings.Stack>\n ) : (\n <DataTable\n columns={COLUMNS}\n rows={rows}\n itemRenderer={(row: ContentRow, column) => {\n switch (column.key) {\n case 'name':\n return <Text.Body isBold>{row.value.name}</Text.Body>;\n case 'contentType':\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.contentType}\n </code>\n );\n case 'status': {\n const hasDraft = !!row.states.draft;\n const hasPublished = !!row.states.published;\n return (\n <span>\n {hasDraft && <StatusBadge variant=\"draft\" />}\n {hasPublished && <StatusBadge variant=\"published\" />}\n {!hasDraft && !hasPublished && <StatusBadge variant=\"none\" />}\n </span>\n );\n }\n case 'updatedAt':\n return (\n <Text.Body tone=\"secondary\">\n {new Date(row.value.updatedAt).toLocaleDateString()}\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 navigate(`/${row.key}`, { state: { contentName: 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.key)}\n />\n </div>\n );\n default:\n return null;\n }\n }}\n />\n )}\n </Spacings.Stack>\n </div>\n );\n};\n\n// ---------------------------------------------------------------------------\n// ContentEditorRoute\n// ---------------------------------------------------------------------------\n\ninterface ContentEditorRouteProps {\n config: Config;\n backButton?: ReactNode;\n}\n\nconst ContentEditorRoute: React.FC<ContentEditorRouteProps> = ({ config, backButton }) => {\n const { contentKey } = useParams<{ contentKey: string }>();\n const navigate = useNavigate();\n const location = useLocation();\n const contentName =\n (location.state as { contentName?: string } | null)?.contentName ?? contentKey ?? 'Content';\n\n const {\n content,\n states,\n saving,\n loading,\n error,\n saveDraft,\n publish,\n revertToPublished,\n } = usePuckContent(contentKey!);\n\n const latestDataRef = useRef<Data | null>(null);\n const [hasUnsavedChanges, setHasUnsavedChanges] = useState(false);\n\n const handleChange = useCallback((data: Data) => {\n latestDataRef.current = data;\n setHasUnsavedChanges(true);\n }, []);\n\n const handleSave = useCallback(async () => {\n const data = latestDataRef.current;\n if (!data) return;\n try {\n await saveDraft(data as PuckData);\n setHasUnsavedChanges(false);\n } catch (err) {\n console.error('[ContentManagerRouter] save error:', err);\n }\n }, [saveDraft]);\n\n const handlePublish = useCallback(\n async (data: Data) => {\n try {\n await saveDraft(data as PuckData);\n setHasUnsavedChanges(false);\n await publish(false);\n } catch (err) {\n console.error('[ContentManagerRouter] publish error:', err);\n }\n },\n [saveDraft, publish]\n );\n\n const handleRevert = useCallback(async () => {\n try {\n await revertToPublished();\n setHasUnsavedChanges(false);\n } catch (err) {\n console.error('[ContentManagerRouter] revert error:', err);\n }\n }, [revertToPublished]);\n\n // Override root fields with content-specific labels and add slot field.\n // Stored in content.data.root.props (title, slot, backgroundColor, etc.).\n const contentConfig = useMemo((): Config => {\n const otherRootFields = Object.fromEntries(\n Object.entries(config.root?.fields ?? {}).filter(([k]) => k !== 'title')\n );\n return {\n ...config,\n root: {\n ...config.root,\n fields: {\n title: { type: 'text', label: 'Content Title' },\n slot: { type: 'text', label: 'Slot' },\n ...otherRootFields,\n },\n defaultProps: {\n title: 'New Content',\n slot: '',\n ...config.root?.defaultProps,\n },\n },\n };\n }, [config]);\n\n if (loading) {\n return (\n <div\n style={{\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'center',\n height: '100vh',\n fontSize: '16px',\n color: 'var(--text-muted)',\n }}\n >\n Loading editor…\n </div>\n );\n }\n\n if (error) {\n return (\n <div\n style={{\n padding: '32px',\n color: 'var(--status-error)',\n background: 'rgba(248, 113, 113, 0.08)',\n border: '1px solid rgba(248, 113, 113, 0.25)',\n borderRadius: '8px',\n margin: '16px',\n }}\n >\n <strong>Error loading content:</strong> {error}\n </div>\n );\n }\n\n const activeData: PuckData =\n states.draft?.data ??\n content?.data ?? {\n content: [],\n root: { props: {} },\n };\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=\"Content Items\"\n icon={<AngleLeftIcon />}\n iconPosition=\"left\"\n onClick={() => navigate('/')}\n />\n <Text.Body tone=\"secondary\">/</Text.Body>\n <Text.Body isBold>{contentName}</Text.Body>\n </div>\n <div style={{ flex: 1, overflow: 'hidden' }}>\n <ComponentSearchProvider>\n <Puck\n config={contentConfig}\n data={activeData as Data}\n onChange={handleChange}\n onPublish={handlePublish}\n overrides={{\n headerActions: () => (\n <ContentToolbar\n saving={saving}\n isDirty={hasUnsavedChanges}\n states={states}\n onSave={() => void handleSave()}\n onPublish={() => void handlePublish(activeData as Data)}\n onRevert={() => void handleRevert()}\n />\n ),\n components: ({ children }) => <ComponentsPanel>{children}</ComponentsPanel>,\n componentItem: ({ children, name }) => (\n <ComponentItemFilter name={name}>{children}</ComponentItemFilter>\n ),\n }}\n />\n </ComponentSearchProvider>\n </div>\n </div>\n );\n};\n\n// ---------------------------------------------------------------------------\n// Inner router component\n// ---------------------------------------------------------------------------\n\ninterface ContentManagerRouterInnerProps {\n config: Config;\n defaultContentType?: string;\n backButton?: ReactNode;\n}\n\nconst ContentManagerRouterInner: React.FC<ContentManagerRouterInnerProps> = ({\n config,\n defaultContentType,\n backButton,\n}) => (\n <Routes>\n <Route\n path=\"/\"\n element={\n <ContentListRoute defaultContentType={defaultContentType} backButton={backButton} />\n }\n />\n <Route\n path=\"/:contentKey\"\n element={<ContentEditorRoute config={config} backButton={backButton} />}\n />\n </Routes>\n);\n\n// ---------------------------------------------------------------------------\n// Public component\n// ---------------------------------------------------------------------------\n\nexport interface ContentManagerRouterProps {\n /** URL path where this manager is mounted, e.g. \"/content\" — used as router basename */\n parentUrl: string;\n baseURL: string;\n projectKey: string;\n businessUnitKey: string;\n jwtToken: string;\n /** Puck component config — must match what's used in the renderer */\n config: Config;\n defaultContentType?: string;\n /** Optional element rendered before the breadcrumb in the editor header */\n backButton?: ReactNode;\n}\n\nexport const ContentManagerRouter: React.FC<ContentManagerRouterProps> = ({\n parentUrl,\n baseURL,\n projectKey,\n businessUnitKey,\n jwtToken,\n config,\n defaultContentType,\n backButton,\n}) => (\n <PuckApiProvider\n baseURL={baseURL}\n projectKey={projectKey}\n businessUnitKey={businessUnitKey}\n jwtToken={jwtToken}\n >\n <BrowserRouter basename={parentUrl}>\n <ContentManagerRouterInner\n config={config}\n defaultContentType={defaultContentType}\n backButton={backButton}\n />\n </BrowserRouter>\n </PuckApiProvider>\n);\n"],"mappings":"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","names":["Spacings","Text","PrimaryButton","Card","Label","TextInput","SecondaryButton","FlatButton","LoadingSpinner","DataTable","import_react","import_puck","import_puck_api","import_jsx_runtime","StatusBadge","import_react","import_puck","import_puck_editor","import_puck_api","import_data_table","import_primary_button","import_secondary_button","import_flat_button","import_card","import_spacings","import_text","import_loading_spinner","import_text_input","import_label","import_icons","import_jsx_runtime","StatusBadge","BADGE_STYLES","ContentToolbar","Spacings","Text","PrimaryButton","Card","Label","TextInput","SecondaryButton","FlatButton","LoadingSpinner","DataTable"]}
1
+ {"version":3,"sources":["../src/index.ts","../src/ContentManager.tsx","../src/ContentEditor.tsx","../src/ContentManagerRouter.tsx"],"sourcesContent":["export { ContentManager } from './ContentManager';\nexport type { ContentManagerProps } from './ContentManager';\n\nexport { ContentEditor } from './ContentEditor';\nexport type { ContentEditorProps } from './ContentEditor';\n\nexport { ContentManagerRouter } from './ContentManagerRouter';\nexport type { ContentManagerRouterProps } from './ContentManagerRouter';\n","import React, { useState } from 'react';\nimport { PuckApiProvider, usePuckContents } from '@commercetools-demo/puck-api';\nimport type {\n CreatePuckContentInput,\n PuckContentListItem,\n} 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, SearchIcon } 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// Row type for DataTable\n// ---------------------------------------------------------------------------\n\ntype ContentRow = PuckContentListItem & { id: string };\n\nconst columns = [\n { key: 'name', label: 'Name' },\n { key: 'contentType', label: 'Content Type' },\n { key: 'status', label: 'Status' },\n { key: 'updatedAt', label: 'Updated' },\n { key: 'actions', label: 'Actions', shouldIgnoreRowClick: true },\n];\n\n// ---------------------------------------------------------------------------\n// Inner list component (uses context)\n// ---------------------------------------------------------------------------\n\ninterface ContentListProps {\n defaultContentType?: string;\n onEdit: (item: PuckContentListItem) => void;\n}\n\nconst ContentList: React.FC<ContentListProps> = ({ defaultContentType, onEdit }) => {\n const { contents, loading, error, fetchContents, createContent, deleteContent, refresh } =\n usePuckContents(defaultContentType);\n\n const [filterType, setFilterType] = useState(defaultContentType ?? '');\n const [showCreate, setShowCreate] = useState(false);\n const [createName, setCreateName] = useState('');\n const [createType, setCreateType] = useState(defaultContentType ?? '');\n const [createError, setCreateError] = useState<string | null>(null);\n const [creating, setCreating] = useState(false);\n const [deleting, setDeleting] = useState<string | null>(null);\n\n const handleFilter = () => void fetchContents(filterType || undefined);\n\n const handleCreate = async () => {\n setCreateError(null);\n if (!createName.trim()) { setCreateError('Name is required'); return; }\n if (!createType.trim()) { setCreateError('Content type is required'); return; }\n setCreating(true);\n try {\n const input: CreatePuckContentInput = {\n name: createName.trim(),\n contentType: createType.trim(),\n data: { content: [], root: { props: {} } },\n };\n await createContent(input);\n setShowCreate(false);\n setCreateName('');\n setCreateType(defaultContentType ?? '');\n } catch (err) {\n setCreateError((err as Error).message);\n } finally {\n setCreating(false);\n }\n };\n\n const handleDelete = async (key: string) => {\n if (!confirm('Delete this content item and all its versions?')) return;\n setDeleting(key);\n try {\n await deleteContent(key);\n } finally {\n setDeleting(null);\n }\n };\n\n const rows: ContentRow[] = contents.map((c) => ({ ...c, id: c.key }));\n\n return (\n <div style={{ maxWidth: '1200px', margin: '0 auto', padding: '32px 24px' }}>\n <Spacings.Stack scale=\"l\">\n {/* Header */}\n <Spacings.Inline justifyContent=\"space-between\" alignItems=\"center\">\n <Text.Headline as=\"h1\">Content Items</Text.Headline>\n <PrimaryButton\n label=\"New Content\"\n iconLeft={<PlusThinIcon />}\n onClick={() => setShowCreate((v) => !v)}\n />\n </Spacings.Inline>\n\n {/* Create form */}\n {showCreate && (\n <Card insetScale=\"l\">\n <Spacings.Stack scale=\"m\">\n <Text.Subheadline as=\"h4\" isBold>Create Content Item</Text.Subheadline>\n {createError && <Text.Body tone=\"negative\">{createError}</Text.Body>}\n <Spacings.Inline scale=\"m\">\n <div style={{ flex: 1 }}>\n <Spacings.Stack scale=\"xs\">\n <Label htmlFor=\"create-name\">Name</Label>\n <TextInput\n id=\"create-name\"\n value={createName}\n onChange={(e) => setCreateName(e.target.value)}\n placeholder=\"e.g. Homepage Hero\"\n />\n </Spacings.Stack>\n </div>\n <div style={{ flex: 1 }}>\n <Spacings.Stack scale=\"xs\">\n <Label htmlFor=\"create-type\">Content Type</Label>\n <TextInput\n id=\"create-type\"\n value={createType}\n onChange={(e) => setCreateType(e.target.value)}\n placeholder=\"e.g. hero, banner\"\n />\n </Spacings.Stack>\n </div>\n </Spacings.Inline>\n <Spacings.Inline scale=\"s\">\n <PrimaryButton\n label={creating ? 'Creating…' : 'Create'}\n onClick={() => void handleCreate()}\n isDisabled={creating}\n />\n <SecondaryButton label=\"Cancel\" onClick={() => setShowCreate(false)} />\n </Spacings.Inline>\n </Spacings.Stack>\n </Card>\n )}\n\n {/* Filter row */}\n <Spacings.Inline scale=\"s\" alignItems=\"center\">\n <div style={{ flex: 1, maxWidth: '280px' }}>\n <TextInput\n value={filterType}\n onChange={(e) => setFilterType(e.target.value)}\n placeholder=\"Filter by content type…\"\n />\n </div>\n <SecondaryButton\n label=\"Filter\"\n iconLeft={<SearchIcon />}\n onClick={handleFilter}\n />\n <FlatButton\n label=\"Clear\"\n onClick={() => { setFilterType(''); void fetchContents(undefined); }}\n />\n <FlatButton label=\"Refresh\" onClick={() => void refresh()} />\n </Spacings.Inline>\n\n {error && <Text.Body tone=\"negative\">{error}</Text.Body>}\n\n {/* Table */}\n {loading ? (\n <div style={{ display: 'flex', justifyContent: 'center', padding: '48px' }}>\n <LoadingSpinner />\n </div>\n ) : contents.length === 0 ? (\n <Spacings.Stack scale=\"m\" alignItems=\"center\">\n <Text.Body tone=\"secondary\">No content items found.</Text.Body>\n </Spacings.Stack>\n ) : (\n <DataTable\n columns={columns}\n rows={rows}\n itemRenderer={(row: ContentRow, column) => {\n switch (column.key) {\n case 'name':\n return <Text.Body isBold>{row.value.name}</Text.Body>;\n case 'contentType':\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.contentType}\n </code>\n );\n case 'status': {\n const hasDraft = !!row.states.draft;\n const hasPublished = !!row.states.published;\n return (\n <span>\n {hasDraft && <StatusBadge variant=\"draft\" />}\n {hasPublished && <StatusBadge variant=\"published\" />}\n {!hasDraft && !hasPublished && <StatusBadge variant=\"none\" />}\n </span>\n );\n }\n case 'updatedAt':\n return (\n <Text.Body tone=\"secondary\">\n {new Date(row.value.updatedAt).toLocaleDateString()}\n </Text.Body>\n );\n case 'actions':\n return (\n <div style={{ display: 'flex', alignItems: 'center', gap: '8px' }}>\n <PrimaryButton label=\"Edit\" size=\"20\" onClick={() => onEdit(row)} />\n <FlatButton\n tone=\"critical\"\n label={deleting === row.key ? '…' : 'Delete'}\n isDisabled={deleting === row.key}\n onClick={() => void handleDelete(row.key)}\n />\n </div>\n );\n default:\n return null;\n }\n }}\n />\n )}\n </Spacings.Stack>\n </div>\n );\n};\n\n// ---------------------------------------------------------------------------\n// Public component — wraps its own PuckApiProvider\n// ---------------------------------------------------------------------------\n\nexport interface ContentManagerProps {\n baseURL: string;\n projectKey: string;\n businessUnitKey: string;\n jwtToken: string;\n defaultContentType?: string;\n onEdit: (item: PuckContentListItem) => void;\n}\n\nexport const ContentManager: React.FC<ContentManagerProps> = ({\n baseURL,\n projectKey,\n businessUnitKey,\n jwtToken,\n defaultContentType,\n onEdit,\n}) => (\n <PuckApiProvider\n baseURL={baseURL}\n projectKey={projectKey}\n businessUnitKey={businessUnitKey}\n jwtToken={jwtToken}\n >\n <ContentList defaultContentType={defaultContentType} onEdit={onEdit} />\n </PuckApiProvider>\n);\n","import React, { useCallback, useMemo, useRef, useState } from 'react';\nimport { Puck, type Config, type Data } from '@measured/puck';\nimport '@measured/puck/puck.css';\nimport { PuckApiProvider, usePuckContent } from '@commercetools-demo/puck-api';\nimport type { PuckContentStateInfo, PuckData } from '@commercetools-demo/puck-types';\nimport {\n ComponentSearchProvider,\n ComponentsPanel,\n ComponentItemFilter,\n} from '@commercetools-demo/puck-editor';\n\n// ---------------------------------------------------------------------------\n// Inline toolbar — mirrors EditorToolbar but uses PuckContentStateInfo\n// ---------------------------------------------------------------------------\n\ninterface ContentToolbarProps {\n saving: boolean;\n isDirty: boolean;\n states: PuckContentStateInfo;\n onSave: () => void;\n onPublish: () => void;\n onRevert: () => void;\n}\n\ntype BadgeVariant = 'saving' | 'unsaved' | 'draft' | 'published';\n\nconst BADGE_STYLES: Record<BadgeVariant, { bg: string; color: string; border: string }> = {\n saving: { bg: 'rgba(251, 191, 36, 0.12)', color: 'var(--status-saving)', border: 'rgba(251, 191, 36, 0.3)' },\n unsaved: { bg: 'rgba(100, 116, 139, 0.12)', color: 'var(--text-muted)', border: 'rgba(100, 116, 139, 0.3)' },\n draft: { bg: 'rgba(129, 140, 248, 0.12)', color: 'var(--status-draft)', border: 'rgba(129, 140, 248, 0.3)' },\n published: { bg: 'rgba(6, 214, 160, 0.12)', color: 'var(--status-published)', border: 'rgba(6, 214, 160, 0.3)' },\n};\n\nconst StatusBadge: React.FC<{ label: string; variant: BadgeVariant }> = ({\n label,\n variant,\n}) => {\n const bs = BADGE_STYLES[variant];\n return (\n <span\n style={{\n display: 'inline-flex',\n alignItems: 'center',\n padding: '2px 10px',\n borderRadius: '12px',\n fontSize: '12px',\n fontWeight: 600,\n background: bs.bg,\n color: bs.color,\n border: `1px solid ${bs.border}`,\n }}\n >\n {label}\n </span>\n );\n};\n\nconst ContentToolbar: React.FC<ContentToolbarProps> = ({\n saving,\n isDirty,\n states,\n onSave,\n onPublish,\n onRevert,\n}) => {\n const hasDraft = Boolean(states.draft);\n const hasPublished = Boolean(states.published);\n\n return (\n <div style={{ display: 'flex', alignItems: 'center', gap: '12px', flexWrap: 'wrap' }}>\n <div style={{ display: 'flex', alignItems: 'center', gap: '6px' }}>\n {saving && <StatusBadge label=\"Saving…\" variant=\"saving\" />}\n {!saving && isDirty && <StatusBadge label=\"Unsaved\" variant=\"unsaved\" />}\n {!saving && !isDirty && hasDraft && (\n <StatusBadge label=\"Draft\" variant=\"draft\" />\n )}\n {hasPublished && <StatusBadge label=\"Published\" variant=\"published\" />}\n </div>\n\n {hasDraft && hasPublished && (\n <button\n onClick={onRevert}\n disabled={saving}\n style={{\n padding: '6px 14px',\n borderRadius: '4px',\n border: '1px solid var(--border-glow)',\n background: 'transparent',\n color: 'var(--text-muted)',\n fontWeight: 500,\n fontSize: '13px',\n cursor: saving ? 'not-allowed' : 'pointer',\n opacity: saving ? 0.5 : 1,\n }}\n >\n Revert to Published\n </button>\n )}\n\n <button\n onClick={onSave}\n disabled={!isDirty || saving}\n style={{\n padding: '6px 14px',\n borderRadius: '4px',\n border: '1px solid var(--border-glow)',\n background: 'transparent',\n color: 'var(--text-muted)',\n fontWeight: 500,\n fontSize: '13px',\n cursor: (!isDirty || saving) ? 'not-allowed' : 'pointer',\n opacity: (!isDirty || saving) ? 0.4 : 1,\n }}\n >\n Save\n </button>\n\n <button\n onClick={onPublish}\n disabled={saving}\n style={{\n padding: '6px 16px',\n borderRadius: '4px',\n border: '1px solid var(--accent-cyan)',\n background: 'rgba(0, 212, 255, 0.1)',\n color: 'var(--accent-cyan)',\n fontWeight: 600,\n fontSize: '13px',\n cursor: saving ? 'not-allowed' : 'pointer',\n opacity: saving ? 0.5 : 1,\n boxShadow: '0 0 12px rgba(0, 212, 255, 0.15)',\n }}\n >\n {hasPublished ? 'Re-publish' : 'Publish'}\n </button>\n </div>\n );\n};\n\n// ---------------------------------------------------------------------------\n// Inner editor component (uses context)\n// ---------------------------------------------------------------------------\n\ninterface ContentEditorInnerProps {\n contentKey: string;\n config: Config;\n onPublish?: (data: PuckData) => void;\n onSave?: (data: PuckData) => void;\n onError?: (error: Error) => void;\n}\n\nconst ContentEditorInner: React.FC<ContentEditorInnerProps> = ({\n contentKey,\n config,\n onPublish,\n onSave,\n onError,\n}) => {\n const {\n content,\n states,\n saving,\n loading,\n error,\n saveDraft,\n publish,\n revertToPublished,\n } = usePuckContent(contentKey);\n\n const latestDataRef = useRef<Data | null>(null);\n const [hasUnsavedChanges, setHasUnsavedChanges] = useState(false);\n\n const handleChange = useCallback((data: Data) => {\n latestDataRef.current = data;\n setHasUnsavedChanges(true);\n }, []);\n\n const handleSave = useCallback(async () => {\n const data = latestDataRef.current;\n if (!data) return;\n try {\n await saveDraft(data as PuckData);\n setHasUnsavedChanges(false);\n onSave?.(data as PuckData);\n } catch (err) {\n onError?.(err as Error);\n }\n }, [saveDraft, onSave, onError]);\n\n const handlePublish = useCallback(\n async (data: Data) => {\n try {\n await saveDraft(data as PuckData);\n setHasUnsavedChanges(false);\n await publish(false);\n onPublish?.(data as PuckData);\n } catch (err) {\n onError?.(err as Error);\n }\n },\n [saveDraft, publish, onPublish, onError]\n );\n\n const handleRevert = useCallback(async () => {\n try {\n await revertToPublished();\n setHasUnsavedChanges(false);\n } catch (err) {\n onError?.(err as Error);\n }\n }, [revertToPublished, onError]);\n\n\n // Override root fields with content-specific labels and add slot field.\n // Stored in content.data.root.props (title, slot, backgroundColor, etc.).\n const contentConfig = useMemo((): Config => {\n const otherRootFields = Object.fromEntries(\n Object.entries(config.root?.fields ?? {}).filter(([k]) => k !== 'title')\n );\n return {\n ...config,\n root: {\n ...config.root,\n fields: {\n title: { type: 'text', label: 'Content Title' },\n slot: { type: 'text', label: 'Slot' },\n ...otherRootFields,\n },\n defaultProps: {\n title: 'New Content',\n slot: '',\n ...config.root?.defaultProps,\n },\n },\n };\n }, [config]);\n\n if (loading) {\n return (\n <div\n style={{\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'center',\n height: '100vh',\n fontSize: '16px',\n color: 'var(--text-muted)',\n }}\n >\n Loading editor…\n </div>\n );\n }\n\n if (error) {\n return (\n <div\n style={{\n padding: '32px',\n color: 'var(--status-error)',\n background: 'rgba(248, 113, 113, 0.08)',\n border: '1px solid rgba(248, 113, 113, 0.25)',\n borderRadius: '8px',\n margin: '16px',\n }}\n >\n <strong>Error loading content:</strong> {error}\n </div>\n );\n }\n\n // Use draft state data if available, otherwise fall back to the main content value\n const activeData: PuckData =\n states.draft?.data ??\n content?.data ?? {\n content: [],\n root: { props: {} },\n };\n\n\n return (\n <ComponentSearchProvider>\n <Puck\n config={contentConfig}\n data={activeData as Data}\n onChange={handleChange}\n onPublish={handlePublish}\n overrides={{\n headerActions: () => (\n <ContentToolbar\n saving={saving}\n isDirty={hasUnsavedChanges}\n states={states}\n onSave={() => void handleSave()}\n onPublish={() => void handlePublish(activeData as Data)}\n onRevert={() => void handleRevert()}\n />\n ),\n components: ({ children }) => <ComponentsPanel>{children}</ComponentsPanel>,\n componentItem: ({ children, name }) => (\n <ComponentItemFilter name={name}>{children}</ComponentItemFilter>\n ),\n }}\n />\n </ComponentSearchProvider>\n );\n};\n\n// ---------------------------------------------------------------------------\n// Public component — wraps its own PuckApiProvider\n// ---------------------------------------------------------------------------\n\nexport interface ContentEditorProps {\n baseURL: string;\n projectKey: string;\n businessUnitKey: string;\n jwtToken: string;\n contentKey: string;\n /** Puck component config — must match what's used in the renderer */\n config: Config;\n onPublish?: (data: PuckData) => void;\n onSave?: (data: PuckData) => void;\n onError?: (error: Error) => void;\n}\n\nexport const ContentEditor: React.FC<ContentEditorProps> = ({\n baseURL,\n projectKey,\n businessUnitKey,\n jwtToken,\n contentKey,\n config,\n onPublish,\n onSave,\n onError,\n}) => (\n <PuckApiProvider\n baseURL={baseURL}\n projectKey={projectKey}\n businessUnitKey={businessUnitKey}\n jwtToken={jwtToken}\n >\n <ContentEditorInner\n contentKey={contentKey}\n config={config}\n onPublish={onPublish}\n onSave={onSave}\n onError={onError}\n />\n </PuckApiProvider>\n);\n","import React, { useState, useCallback, useMemo, useRef, type ReactNode } from 'react';\nimport {\n BrowserRouter,\n Switch,\n Route,\n useHistory,\n useParams,\n useLocation,\n} from 'react-router-dom';\nimport { Puck, type Config, type Data } from '@measured/puck';\nimport '@measured/puck/puck.css';\nimport {\n ComponentSearchProvider,\n ComponentsPanel,\n ComponentItemFilter,\n} from '@commercetools-demo/puck-editor';\nimport {\n PuckApiProvider,\n usePuckContents,\n usePuckContent,\n} from '@commercetools-demo/puck-api';\nimport type {\n CreatePuckContentInput,\n PuckContentListItem,\n PuckContentStateInfo,\n PuckData,\n} 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, SearchIcon, 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// Content toolbar (status badges + publish/revert buttons)\n// ---------------------------------------------------------------------------\n\ntype BadgeVariant = 'saving' | 'unsaved' | 'draft' | 'published';\n\nconst BADGE_STYLES: Record<BadgeVariant, { bg: string; color: string; border: string }> = {\n saving: { bg: 'rgba(251, 191, 36, 0.12)', color: 'var(--status-saving)', border: 'rgba(251, 191, 36, 0.3)' },\n unsaved: { bg: 'rgba(100, 116, 139, 0.12)', color: 'var(--text-muted)', border: 'rgba(100, 116, 139, 0.3)' },\n draft: { bg: 'rgba(129, 140, 248, 0.12)', color: 'var(--status-draft)', border: 'rgba(129, 140, 248, 0.3)' },\n published: { bg: 'rgba(6, 214, 160, 0.12)', color: 'var(--status-published)', border: 'rgba(6, 214, 160, 0.3)' },\n};\n\nconst EditorStatusBadge: React.FC<{ label: string; variant: BadgeVariant }> = ({ label, variant }) => {\n const bs = BADGE_STYLES[variant];\n return (\n <span\n style={{\n display: 'inline-flex',\n alignItems: 'center',\n padding: '2px 10px',\n borderRadius: '12px',\n fontSize: '12px',\n fontWeight: 600,\n background: bs.bg,\n color: bs.color,\n border: `1px solid ${bs.border}`,\n }}\n >\n {label}\n </span>\n );\n};\n\ninterface ContentToolbarProps {\n saving: boolean;\n isDirty: boolean;\n states: PuckContentStateInfo;\n onSave: () => void;\n onPublish: () => void;\n onRevert: () => void;\n}\n\nconst ContentToolbar: React.FC<ContentToolbarProps> = ({ saving, isDirty, states, onSave, onPublish, onRevert }) => {\n const hasDraft = Boolean(states.draft);\n const hasPublished = Boolean(states.published);\n return (\n <div style={{ display: 'flex', alignItems: 'center', gap: '12px', flexWrap: 'wrap' }}>\n <div style={{ display: 'flex', alignItems: 'center', gap: '6px' }}>\n {saving && <EditorStatusBadge label=\"Saving…\" variant=\"saving\" />}\n {!saving && isDirty && <EditorStatusBadge label=\"Unsaved\" variant=\"unsaved\" />}\n {!saving && !isDirty && hasDraft && <EditorStatusBadge label=\"Draft\" variant=\"draft\" />}\n {hasPublished && <EditorStatusBadge label=\"Published\" variant=\"published\" />}\n </div>\n {hasDraft && hasPublished && (\n <button\n onClick={onRevert}\n disabled={saving}\n style={{\n padding: '6px 14px',\n borderRadius: '4px',\n border: '1px solid var(--border-glow)',\n background: 'transparent',\n color: 'var(--text-muted)',\n fontWeight: 500,\n fontSize: '13px',\n cursor: saving ? 'not-allowed' : 'pointer',\n opacity: saving ? 0.5 : 1,\n }}\n >\n Revert to Published\n </button>\n )}\n <button\n onClick={onSave}\n disabled={!isDirty || saving}\n style={{\n padding: '6px 14px',\n borderRadius: '4px',\n border: '1px solid var(--border-glow)',\n background: 'transparent',\n color: 'var(--text-muted)',\n fontWeight: 500,\n fontSize: '13px',\n cursor: (!isDirty || saving) ? 'not-allowed' : 'pointer',\n opacity: (!isDirty || saving) ? 0.4 : 1,\n }}\n >\n Save\n </button>\n <button\n onClick={onPublish}\n disabled={saving}\n style={{\n padding: '6px 16px',\n borderRadius: '4px',\n border: '1px solid var(--accent-cyan)',\n background: 'rgba(0, 212, 255, 0.1)',\n color: 'var(--accent-cyan)',\n fontWeight: 600,\n fontSize: '13px',\n cursor: saving ? 'not-allowed' : 'pointer',\n opacity: saving ? 0.5 : 1,\n boxShadow: '0 0 12px rgba(0, 212, 255, 0.15)',\n }}\n >\n {hasPublished ? 'Re-publish' : 'Publish'}\n </button>\n </div>\n );\n};\n\n// ---------------------------------------------------------------------------\n// 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 ContentRow = PuckContentListItem & { id: string };\n\nconst COLUMNS = [\n { key: 'name', label: 'Name' },\n { key: 'contentType', label: 'Content Type' },\n { key: 'status', label: 'Status' },\n { key: 'updatedAt', label: 'Updated' },\n { key: 'actions', label: 'Actions', shouldIgnoreRowClick: true },\n];\n\n// ---------------------------------------------------------------------------\n// ContentListRoute\n// ---------------------------------------------------------------------------\n\ninterface ContentListRouteProps {\n defaultContentType?: string;\n backButton?: ReactNode;\n}\n\nconst ContentListRoute: React.FC<ContentListRouteProps> = ({ defaultContentType, backButton }) => {\n const history = useHistory();\n const { contents, loading, error, fetchContents, createContent, deleteContent, refresh } =\n usePuckContents(defaultContentType);\n\n const [filterType, setFilterType] = useState(defaultContentType ?? '');\n const [showCreate, setShowCreate] = useState(false);\n const [createName, setCreateName] = useState('');\n const [createType, setCreateType] = useState(defaultContentType ?? '');\n const [createError, setCreateError] = useState<string | null>(null);\n const [creating, setCreating] = useState(false);\n const [deleting, setDeleting] = useState<string | null>(null);\n\n const handleFilter = () => void fetchContents(filterType || undefined);\n\n const handleCreate = async () => {\n setCreateError(null);\n if (!createName.trim()) { setCreateError('Name is required'); return; }\n if (!createType.trim()) { setCreateError('Content type is required'); return; }\n setCreating(true);\n try {\n const input: CreatePuckContentInput = {\n name: createName.trim(),\n contentType: createType.trim(),\n data: { content: [], root: { props: {} } },\n };\n const created = await createContent(input);\n setShowCreate(false);\n setCreateName('');\n setCreateType(defaultContentType ?? '');\n history.push(`/${created.key}`, { contentName: created.value.name });\n } catch (err) {\n setCreateError((err as Error).message);\n } finally {\n setCreating(false);\n }\n };\n\n const handleDelete = async (key: string) => {\n if (!confirm('Delete this content item and all its versions?')) return;\n setDeleting(key);\n try {\n await deleteContent(key);\n } finally {\n setDeleting(null);\n }\n };\n\n const rows: ContentRow[] = contents.map((c) => ({ ...c, id: c.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\">Content Items</Text.Headline>\n </Spacings.Inline>\n <PrimaryButton\n label=\"New Content\"\n iconLeft={<PlusThinIcon />}\n onClick={() => setShowCreate((v) => !v)}\n />\n </Spacings.Inline>\n\n {showCreate && (\n <Card insetScale=\"l\">\n <Spacings.Stack scale=\"m\">\n <Text.Subheadline as=\"h4\" isBold>Create Content Item</Text.Subheadline>\n {createError && <Text.Body tone=\"negative\">{createError}</Text.Body>}\n <Spacings.Inline scale=\"m\">\n <div style={{ flex: 1 }}>\n <Spacings.Stack scale=\"xs\">\n <Label htmlFor=\"create-content-name\">Name</Label>\n <TextInput\n id=\"create-content-name\"\n value={createName}\n onChange={(e) => setCreateName(e.target.value)}\n placeholder=\"e.g. Homepage Hero\"\n />\n </Spacings.Stack>\n </div>\n <div style={{ flex: 1 }}>\n <Spacings.Stack scale=\"xs\">\n <Label htmlFor=\"create-content-type\">Content Type</Label>\n <TextInput\n id=\"create-content-type\"\n value={createType}\n onChange={(e) => setCreateType(e.target.value)}\n placeholder=\"e.g. hero, banner\"\n />\n </Spacings.Stack>\n </div>\n </Spacings.Inline>\n <Spacings.Inline scale=\"s\">\n <PrimaryButton\n label={creating ? 'Creating…' : 'Create'}\n onClick={() => void handleCreate()}\n isDisabled={creating}\n />\n <SecondaryButton label=\"Cancel\" onClick={() => setShowCreate(false)} />\n </Spacings.Inline>\n </Spacings.Stack>\n </Card>\n )}\n\n <Spacings.Inline scale=\"s\" alignItems=\"center\">\n <div style={{ flex: 1, maxWidth: '280px' }}>\n <TextInput\n value={filterType}\n onChange={(e) => setFilterType(e.target.value)}\n placeholder=\"Filter by content type…\"\n />\n </div>\n <SecondaryButton\n label=\"Filter\"\n iconLeft={<SearchIcon />}\n onClick={handleFilter}\n />\n <FlatButton\n label=\"Clear\"\n onClick={() => { setFilterType(''); void fetchContents(undefined); }}\n />\n <FlatButton label=\"Refresh\" onClick={() => void refresh()} />\n </Spacings.Inline>\n\n {error && <Text.Body tone=\"negative\">{error}</Text.Body>}\n\n {loading ? (\n <div style={{ display: 'flex', justifyContent: 'center', padding: '48px' }}>\n <LoadingSpinner />\n </div>\n ) : contents.length === 0 ? (\n <Spacings.Stack scale=\"m\" alignItems=\"center\">\n <Text.Body tone=\"secondary\">No content items found.</Text.Body>\n </Spacings.Stack>\n ) : (\n <DataTable\n columns={COLUMNS}\n rows={rows}\n itemRenderer={(row: ContentRow, column) => {\n switch (column.key) {\n case 'name':\n return <Text.Body isBold>{row.value.name}</Text.Body>;\n case 'contentType':\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.contentType}\n </code>\n );\n case 'status': {\n const hasDraft = !!row.states.draft;\n const hasPublished = !!row.states.published;\n return (\n <span>\n {hasDraft && <StatusBadge variant=\"draft\" />}\n {hasPublished && <StatusBadge variant=\"published\" />}\n {!hasDraft && !hasPublished && <StatusBadge variant=\"none\" />}\n </span>\n );\n }\n case 'updatedAt':\n return (\n <Text.Body tone=\"secondary\">\n {new Date(row.value.updatedAt).toLocaleDateString()}\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}`, { contentName: 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.key)}\n />\n </div>\n );\n default:\n return null;\n }\n }}\n />\n )}\n </Spacings.Stack>\n </div>\n );\n};\n\n// ---------------------------------------------------------------------------\n// ContentEditorRoute\n// ---------------------------------------------------------------------------\n\ninterface ContentEditorRouteProps {\n config: Config;\n backButton?: ReactNode;\n}\n\nconst ContentEditorRoute: React.FC<ContentEditorRouteProps> = ({ config, backButton }) => {\n const { contentKey } = useParams<{ contentKey: string }>();\n const history = useHistory();\n const location = useLocation();\n const contentName =\n (location.state as { contentName?: string } | null)?.contentName ?? contentKey ?? 'Content';\n\n const {\n content,\n states,\n saving,\n loading,\n error,\n saveDraft,\n publish,\n revertToPublished,\n } = usePuckContent(contentKey!);\n\n const latestDataRef = useRef<Data | null>(null);\n const [hasUnsavedChanges, setHasUnsavedChanges] = useState(false);\n\n const handleChange = useCallback((data: Data) => {\n latestDataRef.current = data;\n setHasUnsavedChanges(true);\n }, []);\n\n const handleSave = useCallback(async () => {\n const data = latestDataRef.current;\n if (!data) return;\n try {\n await saveDraft(data as PuckData);\n setHasUnsavedChanges(false);\n } catch (err) {\n console.error('[ContentManagerRouter] save error:', err);\n }\n }, [saveDraft]);\n\n const handlePublish = useCallback(\n async (data: Data) => {\n try {\n await saveDraft(data as PuckData);\n setHasUnsavedChanges(false);\n await publish(false);\n } catch (err) {\n console.error('[ContentManagerRouter] publish error:', err);\n }\n },\n [saveDraft, publish]\n );\n\n const handleRevert = useCallback(async () => {\n try {\n await revertToPublished();\n setHasUnsavedChanges(false);\n } catch (err) {\n console.error('[ContentManagerRouter] revert error:', err);\n }\n }, [revertToPublished]);\n\n // Override root fields with content-specific labels and add slot field.\n // Stored in content.data.root.props (title, slot, backgroundColor, etc.).\n const contentConfig = useMemo((): Config => {\n const otherRootFields = Object.fromEntries(\n Object.entries(config.root?.fields ?? {}).filter(([k]) => k !== 'title')\n );\n return {\n ...config,\n root: {\n ...config.root,\n fields: {\n title: { type: 'text', label: 'Content Title' },\n slot: { type: 'text', label: 'Slot' },\n ...otherRootFields,\n },\n defaultProps: {\n title: 'New Content',\n slot: '',\n ...config.root?.defaultProps,\n },\n },\n };\n }, [config]);\n\n if (loading) {\n return (\n <div\n style={{\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'center',\n height: '100vh',\n fontSize: '16px',\n color: 'var(--text-muted)',\n }}\n >\n Loading editor…\n </div>\n );\n }\n\n if (error) {\n return (\n <div\n style={{\n padding: '32px',\n color: 'var(--status-error)',\n background: 'rgba(248, 113, 113, 0.08)',\n border: '1px solid rgba(248, 113, 113, 0.25)',\n borderRadius: '8px',\n margin: '16px',\n }}\n >\n <strong>Error loading content:</strong> {error}\n </div>\n );\n }\n\n const activeData: PuckData =\n states.draft?.data ??\n content?.data ?? {\n content: [],\n root: { props: {} },\n };\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=\"Content Items\"\n icon={<AngleLeftIcon />}\n iconPosition=\"left\"\n onClick={() => history.push('/')}\n />\n <Text.Body tone=\"secondary\">/</Text.Body>\n <Text.Body isBold>{contentName}</Text.Body>\n </div>\n <div style={{ flex: 1, overflow: 'hidden' }}>\n <ComponentSearchProvider>\n <Puck\n config={contentConfig}\n data={activeData as Data}\n onChange={handleChange}\n onPublish={handlePublish}\n overrides={{\n headerActions: () => (\n <ContentToolbar\n saving={saving}\n isDirty={hasUnsavedChanges}\n states={states}\n onSave={() => void handleSave()}\n onPublish={() => void handlePublish(activeData as Data)}\n onRevert={() => void handleRevert()}\n />\n ),\n components: ({ children }) => <ComponentsPanel>{children}</ComponentsPanel>,\n componentItem: ({ children, name }) => (\n <ComponentItemFilter name={name}>{children}</ComponentItemFilter>\n ),\n }}\n />\n </ComponentSearchProvider>\n </div>\n </div>\n );\n};\n\n// ---------------------------------------------------------------------------\n// Inner router component\n// ---------------------------------------------------------------------------\n\ninterface ContentManagerRouterInnerProps {\n config: Config;\n defaultContentType?: string;\n backButton?: ReactNode;\n}\n\nconst ContentManagerRouterInner: React.FC<ContentManagerRouterInnerProps> = ({\n config,\n defaultContentType,\n backButton,\n}) => (\n <Switch>\n <Route\n exact\n path=\"/\"\n render={() => (\n <ContentListRoute defaultContentType={defaultContentType} backButton={backButton} />\n )}\n />\n <Route\n path=\"/:contentKey\"\n render={() => <ContentEditorRoute config={config} backButton={backButton} />}\n />\n </Switch>\n);\n\n// ---------------------------------------------------------------------------\n// Public component\n// ---------------------------------------------------------------------------\n\nexport interface ContentManagerRouterProps {\n /** URL path where this manager is mounted, e.g. \"/content\" — used as router basename */\n parentUrl: string;\n baseURL: string;\n projectKey: string;\n businessUnitKey: string;\n jwtToken: string;\n /** Puck component config — must match what's used in the renderer */\n config: Config;\n defaultContentType?: string;\n /** Optional element rendered before the breadcrumb in the editor header */\n backButton?: ReactNode;\n}\n\nexport const ContentManagerRouter: React.FC<ContentManagerRouterProps> = ({\n parentUrl,\n baseURL,\n projectKey,\n businessUnitKey,\n jwtToken,\n config,\n defaultContentType,\n backButton,\n}) => (\n <PuckApiProvider\n baseURL={baseURL}\n projectKey={projectKey}\n businessUnitKey={businessUnitKey}\n jwtToken={jwtToken}\n >\n <BrowserRouter basename={parentUrl}>\n <ContentManagerRouterInner\n config={config}\n defaultContentType={defaultContentType}\n backButton={backButton}\n />\n </BrowserRouter>\n </PuckApiProvider>\n);\n"],"mappings":"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","names":["Spacings","Text","PrimaryButton","Card","Label","TextInput","SecondaryButton","FlatButton","LoadingSpinner","DataTable","import_react","import_puck","import_puck_api","import_jsx_runtime","StatusBadge","import_react","import_puck","import_puck_editor","import_puck_api","import_data_table","import_primary_button","import_secondary_button","import_flat_button","import_card","import_spacings","import_text","import_loading_spinner","import_text_input","import_label","import_icons","import_jsx_runtime","StatusBadge","BADGE_STYLES","ContentToolbar","Spacings","Text","PrimaryButton","Card","Label","TextInput","SecondaryButton","FlatButton","LoadingSpinner","DataTable"]}
package/dist/index.mjs CHANGED
@@ -535,9 +535,9 @@ var ContentEditor = ({
535
535
  import { useState as useState3, useCallback as useCallback2, useMemo as useMemo2, useRef as useRef2 } from "react";
536
536
  import {
537
537
  BrowserRouter,
538
- Routes,
538
+ Switch,
539
539
  Route,
540
- useNavigate,
540
+ useHistory,
541
541
  useParams,
542
542
  useLocation
543
543
  } from "react-router-dom";
@@ -701,7 +701,7 @@ var COLUMNS = [
701
701
  { key: "actions", label: "Actions", shouldIgnoreRowClick: true }
702
702
  ];
703
703
  var ContentListRoute = ({ defaultContentType, backButton }) => {
704
- const navigate = useNavigate();
704
+ const history = useHistory();
705
705
  const { contents, loading, error, fetchContents, createContent, deleteContent, refresh } = usePuckContents2(defaultContentType);
706
706
  const [filterType, setFilterType] = useState3(defaultContentType ?? "");
707
707
  const [showCreate, setShowCreate] = useState3(false);
@@ -732,7 +732,7 @@ var ContentListRoute = ({ defaultContentType, backButton }) => {
732
732
  setShowCreate(false);
733
733
  setCreateName("");
734
734
  setCreateType(defaultContentType ?? "");
735
- navigate(`/${created.key}`, { state: { contentName: created.value.name } });
735
+ history.push(`/${created.key}`, { contentName: created.value.name });
736
736
  } catch (err) {
737
737
  setCreateError(err.message);
738
738
  } finally {
@@ -876,7 +876,7 @@ var ContentListRoute = ({ defaultContentType, backButton }) => {
876
876
  {
877
877
  label: "Edit",
878
878
  size: "20",
879
- onClick: () => navigate(`/${row.key}`, { state: { contentName: row.value.name } })
879
+ onClick: () => history.push(`/${row.key}`, { contentName: row.value.name })
880
880
  }
881
881
  ),
882
882
  /* @__PURE__ */ jsx3(
@@ -899,7 +899,7 @@ var ContentListRoute = ({ defaultContentType, backButton }) => {
899
899
  };
900
900
  var ContentEditorRoute = ({ config, backButton }) => {
901
901
  const { contentKey } = useParams();
902
- const navigate = useNavigate();
902
+ const history = useHistory();
903
903
  const location = useLocation();
904
904
  const contentName = location.state?.contentName ?? contentKey ?? "Content";
905
905
  const {
@@ -1019,7 +1019,7 @@ var ContentEditorRoute = ({ config, backButton }) => {
1019
1019
  label: "Content Items",
1020
1020
  icon: /* @__PURE__ */ jsx3(AngleLeftIcon, {}),
1021
1021
  iconPosition: "left",
1022
- onClick: () => navigate("/")
1022
+ onClick: () => history.push("/")
1023
1023
  }
1024
1024
  ),
1025
1025
  /* @__PURE__ */ jsx3(Text2.Body, { tone: "secondary", children: "/" }),
@@ -1055,19 +1055,20 @@ var ContentManagerRouterInner = ({
1055
1055
  config,
1056
1056
  defaultContentType,
1057
1057
  backButton
1058
- }) => /* @__PURE__ */ jsxs3(Routes, { children: [
1058
+ }) => /* @__PURE__ */ jsxs3(Switch, { children: [
1059
1059
  /* @__PURE__ */ jsx3(
1060
1060
  Route,
1061
1061
  {
1062
+ exact: true,
1062
1063
  path: "/",
1063
- element: /* @__PURE__ */ jsx3(ContentListRoute, { defaultContentType, backButton })
1064
+ render: () => /* @__PURE__ */ jsx3(ContentListRoute, { defaultContentType, backButton })
1064
1065
  }
1065
1066
  ),
1066
1067
  /* @__PURE__ */ jsx3(
1067
1068
  Route,
1068
1069
  {
1069
1070
  path: "/:contentKey",
1070
- element: /* @__PURE__ */ jsx3(ContentEditorRoute, { config, backButton })
1071
+ render: () => /* @__PURE__ */ jsx3(ContentEditorRoute, { config, backButton })
1071
1072
  }
1072
1073
  )
1073
1074
  ] });
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/ContentManager.tsx","../src/ContentEditor.tsx","../src/ContentManagerRouter.tsx"],"sourcesContent":["import React, { useState } from 'react';\nimport { PuckApiProvider, usePuckContents } from '@commercetools-demo/puck-api';\nimport type {\n CreatePuckContentInput,\n PuckContentListItem,\n} 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, SearchIcon } 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// Row type for DataTable\n// ---------------------------------------------------------------------------\n\ntype ContentRow = PuckContentListItem & { id: string };\n\nconst columns = [\n { key: 'name', label: 'Name' },\n { key: 'contentType', label: 'Content Type' },\n { key: 'status', label: 'Status' },\n { key: 'updatedAt', label: 'Updated' },\n { key: 'actions', label: 'Actions', shouldIgnoreRowClick: true },\n];\n\n// ---------------------------------------------------------------------------\n// Inner list component (uses context)\n// ---------------------------------------------------------------------------\n\ninterface ContentListProps {\n defaultContentType?: string;\n onEdit: (item: PuckContentListItem) => void;\n}\n\nconst ContentList: React.FC<ContentListProps> = ({ defaultContentType, onEdit }) => {\n const { contents, loading, error, fetchContents, createContent, deleteContent, refresh } =\n usePuckContents(defaultContentType);\n\n const [filterType, setFilterType] = useState(defaultContentType ?? '');\n const [showCreate, setShowCreate] = useState(false);\n const [createName, setCreateName] = useState('');\n const [createType, setCreateType] = useState(defaultContentType ?? '');\n const [createError, setCreateError] = useState<string | null>(null);\n const [creating, setCreating] = useState(false);\n const [deleting, setDeleting] = useState<string | null>(null);\n\n const handleFilter = () => void fetchContents(filterType || undefined);\n\n const handleCreate = async () => {\n setCreateError(null);\n if (!createName.trim()) { setCreateError('Name is required'); return; }\n if (!createType.trim()) { setCreateError('Content type is required'); return; }\n setCreating(true);\n try {\n const input: CreatePuckContentInput = {\n name: createName.trim(),\n contentType: createType.trim(),\n data: { content: [], root: { props: {} } },\n };\n await createContent(input);\n setShowCreate(false);\n setCreateName('');\n setCreateType(defaultContentType ?? '');\n } catch (err) {\n setCreateError((err as Error).message);\n } finally {\n setCreating(false);\n }\n };\n\n const handleDelete = async (key: string) => {\n if (!confirm('Delete this content item and all its versions?')) return;\n setDeleting(key);\n try {\n await deleteContent(key);\n } finally {\n setDeleting(null);\n }\n };\n\n const rows: ContentRow[] = contents.map((c) => ({ ...c, id: c.key }));\n\n return (\n <div style={{ maxWidth: '1200px', margin: '0 auto', padding: '32px 24px' }}>\n <Spacings.Stack scale=\"l\">\n {/* Header */}\n <Spacings.Inline justifyContent=\"space-between\" alignItems=\"center\">\n <Text.Headline as=\"h1\">Content Items</Text.Headline>\n <PrimaryButton\n label=\"New Content\"\n iconLeft={<PlusThinIcon />}\n onClick={() => setShowCreate((v) => !v)}\n />\n </Spacings.Inline>\n\n {/* Create form */}\n {showCreate && (\n <Card insetScale=\"l\">\n <Spacings.Stack scale=\"m\">\n <Text.Subheadline as=\"h4\" isBold>Create Content Item</Text.Subheadline>\n {createError && <Text.Body tone=\"negative\">{createError}</Text.Body>}\n <Spacings.Inline scale=\"m\">\n <div style={{ flex: 1 }}>\n <Spacings.Stack scale=\"xs\">\n <Label htmlFor=\"create-name\">Name</Label>\n <TextInput\n id=\"create-name\"\n value={createName}\n onChange={(e) => setCreateName(e.target.value)}\n placeholder=\"e.g. Homepage Hero\"\n />\n </Spacings.Stack>\n </div>\n <div style={{ flex: 1 }}>\n <Spacings.Stack scale=\"xs\">\n <Label htmlFor=\"create-type\">Content Type</Label>\n <TextInput\n id=\"create-type\"\n value={createType}\n onChange={(e) => setCreateType(e.target.value)}\n placeholder=\"e.g. hero, banner\"\n />\n </Spacings.Stack>\n </div>\n </Spacings.Inline>\n <Spacings.Inline scale=\"s\">\n <PrimaryButton\n label={creating ? 'Creating…' : 'Create'}\n onClick={() => void handleCreate()}\n isDisabled={creating}\n />\n <SecondaryButton label=\"Cancel\" onClick={() => setShowCreate(false)} />\n </Spacings.Inline>\n </Spacings.Stack>\n </Card>\n )}\n\n {/* Filter row */}\n <Spacings.Inline scale=\"s\" alignItems=\"center\">\n <div style={{ flex: 1, maxWidth: '280px' }}>\n <TextInput\n value={filterType}\n onChange={(e) => setFilterType(e.target.value)}\n placeholder=\"Filter by content type…\"\n />\n </div>\n <SecondaryButton\n label=\"Filter\"\n iconLeft={<SearchIcon />}\n onClick={handleFilter}\n />\n <FlatButton\n label=\"Clear\"\n onClick={() => { setFilterType(''); void fetchContents(undefined); }}\n />\n <FlatButton label=\"Refresh\" onClick={() => void refresh()} />\n </Spacings.Inline>\n\n {error && <Text.Body tone=\"negative\">{error}</Text.Body>}\n\n {/* Table */}\n {loading ? (\n <div style={{ display: 'flex', justifyContent: 'center', padding: '48px' }}>\n <LoadingSpinner />\n </div>\n ) : contents.length === 0 ? (\n <Spacings.Stack scale=\"m\" alignItems=\"center\">\n <Text.Body tone=\"secondary\">No content items found.</Text.Body>\n </Spacings.Stack>\n ) : (\n <DataTable\n columns={columns}\n rows={rows}\n itemRenderer={(row: ContentRow, column) => {\n switch (column.key) {\n case 'name':\n return <Text.Body isBold>{row.value.name}</Text.Body>;\n case 'contentType':\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.contentType}\n </code>\n );\n case 'status': {\n const hasDraft = !!row.states.draft;\n const hasPublished = !!row.states.published;\n return (\n <span>\n {hasDraft && <StatusBadge variant=\"draft\" />}\n {hasPublished && <StatusBadge variant=\"published\" />}\n {!hasDraft && !hasPublished && <StatusBadge variant=\"none\" />}\n </span>\n );\n }\n case 'updatedAt':\n return (\n <Text.Body tone=\"secondary\">\n {new Date(row.value.updatedAt).toLocaleDateString()}\n </Text.Body>\n );\n case 'actions':\n return (\n <div style={{ display: 'flex', alignItems: 'center', gap: '8px' }}>\n <PrimaryButton label=\"Edit\" size=\"20\" onClick={() => onEdit(row)} />\n <FlatButton\n tone=\"critical\"\n label={deleting === row.key ? '…' : 'Delete'}\n isDisabled={deleting === row.key}\n onClick={() => void handleDelete(row.key)}\n />\n </div>\n );\n default:\n return null;\n }\n }}\n />\n )}\n </Spacings.Stack>\n </div>\n );\n};\n\n// ---------------------------------------------------------------------------\n// Public component — wraps its own PuckApiProvider\n// ---------------------------------------------------------------------------\n\nexport interface ContentManagerProps {\n baseURL: string;\n projectKey: string;\n businessUnitKey: string;\n jwtToken: string;\n defaultContentType?: string;\n onEdit: (item: PuckContentListItem) => void;\n}\n\nexport const ContentManager: React.FC<ContentManagerProps> = ({\n baseURL,\n projectKey,\n businessUnitKey,\n jwtToken,\n defaultContentType,\n onEdit,\n}) => (\n <PuckApiProvider\n baseURL={baseURL}\n projectKey={projectKey}\n businessUnitKey={businessUnitKey}\n jwtToken={jwtToken}\n >\n <ContentList defaultContentType={defaultContentType} onEdit={onEdit} />\n </PuckApiProvider>\n);\n","import React, { useCallback, useMemo, useRef, useState } from 'react';\nimport { Puck, type Config, type Data } from '@measured/puck';\nimport '@measured/puck/puck.css';\nimport { PuckApiProvider, usePuckContent } from '@commercetools-demo/puck-api';\nimport type { PuckContentStateInfo, PuckData } from '@commercetools-demo/puck-types';\nimport {\n ComponentSearchProvider,\n ComponentsPanel,\n ComponentItemFilter,\n} from '@commercetools-demo/puck-editor';\n\n// ---------------------------------------------------------------------------\n// Inline toolbar — mirrors EditorToolbar but uses PuckContentStateInfo\n// ---------------------------------------------------------------------------\n\ninterface ContentToolbarProps {\n saving: boolean;\n isDirty: boolean;\n states: PuckContentStateInfo;\n onSave: () => void;\n onPublish: () => void;\n onRevert: () => void;\n}\n\ntype BadgeVariant = 'saving' | 'unsaved' | 'draft' | 'published';\n\nconst BADGE_STYLES: Record<BadgeVariant, { bg: string; color: string; border: string }> = {\n saving: { bg: 'rgba(251, 191, 36, 0.12)', color: 'var(--status-saving)', border: 'rgba(251, 191, 36, 0.3)' },\n unsaved: { bg: 'rgba(100, 116, 139, 0.12)', color: 'var(--text-muted)', border: 'rgba(100, 116, 139, 0.3)' },\n draft: { bg: 'rgba(129, 140, 248, 0.12)', color: 'var(--status-draft)', border: 'rgba(129, 140, 248, 0.3)' },\n published: { bg: 'rgba(6, 214, 160, 0.12)', color: 'var(--status-published)', border: 'rgba(6, 214, 160, 0.3)' },\n};\n\nconst StatusBadge: React.FC<{ label: string; variant: BadgeVariant }> = ({\n label,\n variant,\n}) => {\n const bs = BADGE_STYLES[variant];\n return (\n <span\n style={{\n display: 'inline-flex',\n alignItems: 'center',\n padding: '2px 10px',\n borderRadius: '12px',\n fontSize: '12px',\n fontWeight: 600,\n background: bs.bg,\n color: bs.color,\n border: `1px solid ${bs.border}`,\n }}\n >\n {label}\n </span>\n );\n};\n\nconst ContentToolbar: React.FC<ContentToolbarProps> = ({\n saving,\n isDirty,\n states,\n onSave,\n onPublish,\n onRevert,\n}) => {\n const hasDraft = Boolean(states.draft);\n const hasPublished = Boolean(states.published);\n\n return (\n <div style={{ display: 'flex', alignItems: 'center', gap: '12px', flexWrap: 'wrap' }}>\n <div style={{ display: 'flex', alignItems: 'center', gap: '6px' }}>\n {saving && <StatusBadge label=\"Saving…\" variant=\"saving\" />}\n {!saving && isDirty && <StatusBadge label=\"Unsaved\" variant=\"unsaved\" />}\n {!saving && !isDirty && hasDraft && (\n <StatusBadge label=\"Draft\" variant=\"draft\" />\n )}\n {hasPublished && <StatusBadge label=\"Published\" variant=\"published\" />}\n </div>\n\n {hasDraft && hasPublished && (\n <button\n onClick={onRevert}\n disabled={saving}\n style={{\n padding: '6px 14px',\n borderRadius: '4px',\n border: '1px solid var(--border-glow)',\n background: 'transparent',\n color: 'var(--text-muted)',\n fontWeight: 500,\n fontSize: '13px',\n cursor: saving ? 'not-allowed' : 'pointer',\n opacity: saving ? 0.5 : 1,\n }}\n >\n Revert to Published\n </button>\n )}\n\n <button\n onClick={onSave}\n disabled={!isDirty || saving}\n style={{\n padding: '6px 14px',\n borderRadius: '4px',\n border: '1px solid var(--border-glow)',\n background: 'transparent',\n color: 'var(--text-muted)',\n fontWeight: 500,\n fontSize: '13px',\n cursor: (!isDirty || saving) ? 'not-allowed' : 'pointer',\n opacity: (!isDirty || saving) ? 0.4 : 1,\n }}\n >\n Save\n </button>\n\n <button\n onClick={onPublish}\n disabled={saving}\n style={{\n padding: '6px 16px',\n borderRadius: '4px',\n border: '1px solid var(--accent-cyan)',\n background: 'rgba(0, 212, 255, 0.1)',\n color: 'var(--accent-cyan)',\n fontWeight: 600,\n fontSize: '13px',\n cursor: saving ? 'not-allowed' : 'pointer',\n opacity: saving ? 0.5 : 1,\n boxShadow: '0 0 12px rgba(0, 212, 255, 0.15)',\n }}\n >\n {hasPublished ? 'Re-publish' : 'Publish'}\n </button>\n </div>\n );\n};\n\n// ---------------------------------------------------------------------------\n// Inner editor component (uses context)\n// ---------------------------------------------------------------------------\n\ninterface ContentEditorInnerProps {\n contentKey: string;\n config: Config;\n onPublish?: (data: PuckData) => void;\n onSave?: (data: PuckData) => void;\n onError?: (error: Error) => void;\n}\n\nconst ContentEditorInner: React.FC<ContentEditorInnerProps> = ({\n contentKey,\n config,\n onPublish,\n onSave,\n onError,\n}) => {\n const {\n content,\n states,\n saving,\n loading,\n error,\n saveDraft,\n publish,\n revertToPublished,\n } = usePuckContent(contentKey);\n\n const latestDataRef = useRef<Data | null>(null);\n const [hasUnsavedChanges, setHasUnsavedChanges] = useState(false);\n\n const handleChange = useCallback((data: Data) => {\n latestDataRef.current = data;\n setHasUnsavedChanges(true);\n }, []);\n\n const handleSave = useCallback(async () => {\n const data = latestDataRef.current;\n if (!data) return;\n try {\n await saveDraft(data as PuckData);\n setHasUnsavedChanges(false);\n onSave?.(data as PuckData);\n } catch (err) {\n onError?.(err as Error);\n }\n }, [saveDraft, onSave, onError]);\n\n const handlePublish = useCallback(\n async (data: Data) => {\n try {\n await saveDraft(data as PuckData);\n setHasUnsavedChanges(false);\n await publish(false);\n onPublish?.(data as PuckData);\n } catch (err) {\n onError?.(err as Error);\n }\n },\n [saveDraft, publish, onPublish, onError]\n );\n\n const handleRevert = useCallback(async () => {\n try {\n await revertToPublished();\n setHasUnsavedChanges(false);\n } catch (err) {\n onError?.(err as Error);\n }\n }, [revertToPublished, onError]);\n\n\n // Override root fields with content-specific labels and add slot field.\n // Stored in content.data.root.props (title, slot, backgroundColor, etc.).\n const contentConfig = useMemo((): Config => {\n const otherRootFields = Object.fromEntries(\n Object.entries(config.root?.fields ?? {}).filter(([k]) => k !== 'title')\n );\n return {\n ...config,\n root: {\n ...config.root,\n fields: {\n title: { type: 'text', label: 'Content Title' },\n slot: { type: 'text', label: 'Slot' },\n ...otherRootFields,\n },\n defaultProps: {\n title: 'New Content',\n slot: '',\n ...config.root?.defaultProps,\n },\n },\n };\n }, [config]);\n\n if (loading) {\n return (\n <div\n style={{\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'center',\n height: '100vh',\n fontSize: '16px',\n color: 'var(--text-muted)',\n }}\n >\n Loading editor…\n </div>\n );\n }\n\n if (error) {\n return (\n <div\n style={{\n padding: '32px',\n color: 'var(--status-error)',\n background: 'rgba(248, 113, 113, 0.08)',\n border: '1px solid rgba(248, 113, 113, 0.25)',\n borderRadius: '8px',\n margin: '16px',\n }}\n >\n <strong>Error loading content:</strong> {error}\n </div>\n );\n }\n\n // Use draft state data if available, otherwise fall back to the main content value\n const activeData: PuckData =\n states.draft?.data ??\n content?.data ?? {\n content: [],\n root: { props: {} },\n };\n\n\n return (\n <ComponentSearchProvider>\n <Puck\n config={contentConfig}\n data={activeData as Data}\n onChange={handleChange}\n onPublish={handlePublish}\n overrides={{\n headerActions: () => (\n <ContentToolbar\n saving={saving}\n isDirty={hasUnsavedChanges}\n states={states}\n onSave={() => void handleSave()}\n onPublish={() => void handlePublish(activeData as Data)}\n onRevert={() => void handleRevert()}\n />\n ),\n components: ({ children }) => <ComponentsPanel>{children}</ComponentsPanel>,\n componentItem: ({ children, name }) => (\n <ComponentItemFilter name={name}>{children}</ComponentItemFilter>\n ),\n }}\n />\n </ComponentSearchProvider>\n );\n};\n\n// ---------------------------------------------------------------------------\n// Public component — wraps its own PuckApiProvider\n// ---------------------------------------------------------------------------\n\nexport interface ContentEditorProps {\n baseURL: string;\n projectKey: string;\n businessUnitKey: string;\n jwtToken: string;\n contentKey: string;\n /** Puck component config — must match what's used in the renderer */\n config: Config;\n onPublish?: (data: PuckData) => void;\n onSave?: (data: PuckData) => void;\n onError?: (error: Error) => void;\n}\n\nexport const ContentEditor: React.FC<ContentEditorProps> = ({\n baseURL,\n projectKey,\n businessUnitKey,\n jwtToken,\n contentKey,\n config,\n onPublish,\n onSave,\n onError,\n}) => (\n <PuckApiProvider\n baseURL={baseURL}\n projectKey={projectKey}\n businessUnitKey={businessUnitKey}\n jwtToken={jwtToken}\n >\n <ContentEditorInner\n contentKey={contentKey}\n config={config}\n onPublish={onPublish}\n onSave={onSave}\n onError={onError}\n />\n </PuckApiProvider>\n);\n","import React, { useState, useCallback, useMemo, useRef, type ReactNode } from 'react';\nimport {\n BrowserRouter,\n Routes,\n Route,\n useNavigate,\n useParams,\n useLocation,\n} from 'react-router-dom';\nimport { Puck, type Config, type Data } from '@measured/puck';\nimport '@measured/puck/puck.css';\nimport {\n ComponentSearchProvider,\n ComponentsPanel,\n ComponentItemFilter,\n} from '@commercetools-demo/puck-editor';\nimport {\n PuckApiProvider,\n usePuckContents,\n usePuckContent,\n} from '@commercetools-demo/puck-api';\nimport type {\n CreatePuckContentInput,\n PuckContentListItem,\n PuckContentStateInfo,\n PuckData,\n} 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, SearchIcon, 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// Content toolbar (status badges + publish/revert buttons)\n// ---------------------------------------------------------------------------\n\ntype BadgeVariant = 'saving' | 'unsaved' | 'draft' | 'published';\n\nconst BADGE_STYLES: Record<BadgeVariant, { bg: string; color: string; border: string }> = {\n saving: { bg: 'rgba(251, 191, 36, 0.12)', color: 'var(--status-saving)', border: 'rgba(251, 191, 36, 0.3)' },\n unsaved: { bg: 'rgba(100, 116, 139, 0.12)', color: 'var(--text-muted)', border: 'rgba(100, 116, 139, 0.3)' },\n draft: { bg: 'rgba(129, 140, 248, 0.12)', color: 'var(--status-draft)', border: 'rgba(129, 140, 248, 0.3)' },\n published: { bg: 'rgba(6, 214, 160, 0.12)', color: 'var(--status-published)', border: 'rgba(6, 214, 160, 0.3)' },\n};\n\nconst EditorStatusBadge: React.FC<{ label: string; variant: BadgeVariant }> = ({ label, variant }) => {\n const bs = BADGE_STYLES[variant];\n return (\n <span\n style={{\n display: 'inline-flex',\n alignItems: 'center',\n padding: '2px 10px',\n borderRadius: '12px',\n fontSize: '12px',\n fontWeight: 600,\n background: bs.bg,\n color: bs.color,\n border: `1px solid ${bs.border}`,\n }}\n >\n {label}\n </span>\n );\n};\n\ninterface ContentToolbarProps {\n saving: boolean;\n isDirty: boolean;\n states: PuckContentStateInfo;\n onSave: () => void;\n onPublish: () => void;\n onRevert: () => void;\n}\n\nconst ContentToolbar: React.FC<ContentToolbarProps> = ({ saving, isDirty, states, onSave, onPublish, onRevert }) => {\n const hasDraft = Boolean(states.draft);\n const hasPublished = Boolean(states.published);\n return (\n <div style={{ display: 'flex', alignItems: 'center', gap: '12px', flexWrap: 'wrap' }}>\n <div style={{ display: 'flex', alignItems: 'center', gap: '6px' }}>\n {saving && <EditorStatusBadge label=\"Saving…\" variant=\"saving\" />}\n {!saving && isDirty && <EditorStatusBadge label=\"Unsaved\" variant=\"unsaved\" />}\n {!saving && !isDirty && hasDraft && <EditorStatusBadge label=\"Draft\" variant=\"draft\" />}\n {hasPublished && <EditorStatusBadge label=\"Published\" variant=\"published\" />}\n </div>\n {hasDraft && hasPublished && (\n <button\n onClick={onRevert}\n disabled={saving}\n style={{\n padding: '6px 14px',\n borderRadius: '4px',\n border: '1px solid var(--border-glow)',\n background: 'transparent',\n color: 'var(--text-muted)',\n fontWeight: 500,\n fontSize: '13px',\n cursor: saving ? 'not-allowed' : 'pointer',\n opacity: saving ? 0.5 : 1,\n }}\n >\n Revert to Published\n </button>\n )}\n <button\n onClick={onSave}\n disabled={!isDirty || saving}\n style={{\n padding: '6px 14px',\n borderRadius: '4px',\n border: '1px solid var(--border-glow)',\n background: 'transparent',\n color: 'var(--text-muted)',\n fontWeight: 500,\n fontSize: '13px',\n cursor: (!isDirty || saving) ? 'not-allowed' : 'pointer',\n opacity: (!isDirty || saving) ? 0.4 : 1,\n }}\n >\n Save\n </button>\n <button\n onClick={onPublish}\n disabled={saving}\n style={{\n padding: '6px 16px',\n borderRadius: '4px',\n border: '1px solid var(--accent-cyan)',\n background: 'rgba(0, 212, 255, 0.1)',\n color: 'var(--accent-cyan)',\n fontWeight: 600,\n fontSize: '13px',\n cursor: saving ? 'not-allowed' : 'pointer',\n opacity: saving ? 0.5 : 1,\n boxShadow: '0 0 12px rgba(0, 212, 255, 0.15)',\n }}\n >\n {hasPublished ? 'Re-publish' : 'Publish'}\n </button>\n </div>\n );\n};\n\n// ---------------------------------------------------------------------------\n// 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 ContentRow = PuckContentListItem & { id: string };\n\nconst COLUMNS = [\n { key: 'name', label: 'Name' },\n { key: 'contentType', label: 'Content Type' },\n { key: 'status', label: 'Status' },\n { key: 'updatedAt', label: 'Updated' },\n { key: 'actions', label: 'Actions', shouldIgnoreRowClick: true },\n];\n\n// ---------------------------------------------------------------------------\n// ContentListRoute\n// ---------------------------------------------------------------------------\n\ninterface ContentListRouteProps {\n defaultContentType?: string;\n backButton?: ReactNode;\n}\n\nconst ContentListRoute: React.FC<ContentListRouteProps> = ({ defaultContentType, backButton }) => {\n const navigate = useNavigate();\n const { contents, loading, error, fetchContents, createContent, deleteContent, refresh } =\n usePuckContents(defaultContentType);\n\n const [filterType, setFilterType] = useState(defaultContentType ?? '');\n const [showCreate, setShowCreate] = useState(false);\n const [createName, setCreateName] = useState('');\n const [createType, setCreateType] = useState(defaultContentType ?? '');\n const [createError, setCreateError] = useState<string | null>(null);\n const [creating, setCreating] = useState(false);\n const [deleting, setDeleting] = useState<string | null>(null);\n\n const handleFilter = () => void fetchContents(filterType || undefined);\n\n const handleCreate = async () => {\n setCreateError(null);\n if (!createName.trim()) { setCreateError('Name is required'); return; }\n if (!createType.trim()) { setCreateError('Content type is required'); return; }\n setCreating(true);\n try {\n const input: CreatePuckContentInput = {\n name: createName.trim(),\n contentType: createType.trim(),\n data: { content: [], root: { props: {} } },\n };\n const created = await createContent(input);\n setShowCreate(false);\n setCreateName('');\n setCreateType(defaultContentType ?? '');\n navigate(`/${created.key}`, { state: { contentName: created.value.name } });\n } catch (err) {\n setCreateError((err as Error).message);\n } finally {\n setCreating(false);\n }\n };\n\n const handleDelete = async (key: string) => {\n if (!confirm('Delete this content item and all its versions?')) return;\n setDeleting(key);\n try {\n await deleteContent(key);\n } finally {\n setDeleting(null);\n }\n };\n\n const rows: ContentRow[] = contents.map((c) => ({ ...c, id: c.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\">Content Items</Text.Headline>\n </Spacings.Inline>\n <PrimaryButton\n label=\"New Content\"\n iconLeft={<PlusThinIcon />}\n onClick={() => setShowCreate((v) => !v)}\n />\n </Spacings.Inline>\n\n {showCreate && (\n <Card insetScale=\"l\">\n <Spacings.Stack scale=\"m\">\n <Text.Subheadline as=\"h4\" isBold>Create Content Item</Text.Subheadline>\n {createError && <Text.Body tone=\"negative\">{createError}</Text.Body>}\n <Spacings.Inline scale=\"m\">\n <div style={{ flex: 1 }}>\n <Spacings.Stack scale=\"xs\">\n <Label htmlFor=\"create-content-name\">Name</Label>\n <TextInput\n id=\"create-content-name\"\n value={createName}\n onChange={(e) => setCreateName(e.target.value)}\n placeholder=\"e.g. Homepage Hero\"\n />\n </Spacings.Stack>\n </div>\n <div style={{ flex: 1 }}>\n <Spacings.Stack scale=\"xs\">\n <Label htmlFor=\"create-content-type\">Content Type</Label>\n <TextInput\n id=\"create-content-type\"\n value={createType}\n onChange={(e) => setCreateType(e.target.value)}\n placeholder=\"e.g. hero, banner\"\n />\n </Spacings.Stack>\n </div>\n </Spacings.Inline>\n <Spacings.Inline scale=\"s\">\n <PrimaryButton\n label={creating ? 'Creating…' : 'Create'}\n onClick={() => void handleCreate()}\n isDisabled={creating}\n />\n <SecondaryButton label=\"Cancel\" onClick={() => setShowCreate(false)} />\n </Spacings.Inline>\n </Spacings.Stack>\n </Card>\n )}\n\n <Spacings.Inline scale=\"s\" alignItems=\"center\">\n <div style={{ flex: 1, maxWidth: '280px' }}>\n <TextInput\n value={filterType}\n onChange={(e) => setFilterType(e.target.value)}\n placeholder=\"Filter by content type…\"\n />\n </div>\n <SecondaryButton\n label=\"Filter\"\n iconLeft={<SearchIcon />}\n onClick={handleFilter}\n />\n <FlatButton\n label=\"Clear\"\n onClick={() => { setFilterType(''); void fetchContents(undefined); }}\n />\n <FlatButton label=\"Refresh\" onClick={() => void refresh()} />\n </Spacings.Inline>\n\n {error && <Text.Body tone=\"negative\">{error}</Text.Body>}\n\n {loading ? (\n <div style={{ display: 'flex', justifyContent: 'center', padding: '48px' }}>\n <LoadingSpinner />\n </div>\n ) : contents.length === 0 ? (\n <Spacings.Stack scale=\"m\" alignItems=\"center\">\n <Text.Body tone=\"secondary\">No content items found.</Text.Body>\n </Spacings.Stack>\n ) : (\n <DataTable\n columns={COLUMNS}\n rows={rows}\n itemRenderer={(row: ContentRow, column) => {\n switch (column.key) {\n case 'name':\n return <Text.Body isBold>{row.value.name}</Text.Body>;\n case 'contentType':\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.contentType}\n </code>\n );\n case 'status': {\n const hasDraft = !!row.states.draft;\n const hasPublished = !!row.states.published;\n return (\n <span>\n {hasDraft && <StatusBadge variant=\"draft\" />}\n {hasPublished && <StatusBadge variant=\"published\" />}\n {!hasDraft && !hasPublished && <StatusBadge variant=\"none\" />}\n </span>\n );\n }\n case 'updatedAt':\n return (\n <Text.Body tone=\"secondary\">\n {new Date(row.value.updatedAt).toLocaleDateString()}\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 navigate(`/${row.key}`, { state: { contentName: 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.key)}\n />\n </div>\n );\n default:\n return null;\n }\n }}\n />\n )}\n </Spacings.Stack>\n </div>\n );\n};\n\n// ---------------------------------------------------------------------------\n// ContentEditorRoute\n// ---------------------------------------------------------------------------\n\ninterface ContentEditorRouteProps {\n config: Config;\n backButton?: ReactNode;\n}\n\nconst ContentEditorRoute: React.FC<ContentEditorRouteProps> = ({ config, backButton }) => {\n const { contentKey } = useParams<{ contentKey: string }>();\n const navigate = useNavigate();\n const location = useLocation();\n const contentName =\n (location.state as { contentName?: string } | null)?.contentName ?? contentKey ?? 'Content';\n\n const {\n content,\n states,\n saving,\n loading,\n error,\n saveDraft,\n publish,\n revertToPublished,\n } = usePuckContent(contentKey!);\n\n const latestDataRef = useRef<Data | null>(null);\n const [hasUnsavedChanges, setHasUnsavedChanges] = useState(false);\n\n const handleChange = useCallback((data: Data) => {\n latestDataRef.current = data;\n setHasUnsavedChanges(true);\n }, []);\n\n const handleSave = useCallback(async () => {\n const data = latestDataRef.current;\n if (!data) return;\n try {\n await saveDraft(data as PuckData);\n setHasUnsavedChanges(false);\n } catch (err) {\n console.error('[ContentManagerRouter] save error:', err);\n }\n }, [saveDraft]);\n\n const handlePublish = useCallback(\n async (data: Data) => {\n try {\n await saveDraft(data as PuckData);\n setHasUnsavedChanges(false);\n await publish(false);\n } catch (err) {\n console.error('[ContentManagerRouter] publish error:', err);\n }\n },\n [saveDraft, publish]\n );\n\n const handleRevert = useCallback(async () => {\n try {\n await revertToPublished();\n setHasUnsavedChanges(false);\n } catch (err) {\n console.error('[ContentManagerRouter] revert error:', err);\n }\n }, [revertToPublished]);\n\n // Override root fields with content-specific labels and add slot field.\n // Stored in content.data.root.props (title, slot, backgroundColor, etc.).\n const contentConfig = useMemo((): Config => {\n const otherRootFields = Object.fromEntries(\n Object.entries(config.root?.fields ?? {}).filter(([k]) => k !== 'title')\n );\n return {\n ...config,\n root: {\n ...config.root,\n fields: {\n title: { type: 'text', label: 'Content Title' },\n slot: { type: 'text', label: 'Slot' },\n ...otherRootFields,\n },\n defaultProps: {\n title: 'New Content',\n slot: '',\n ...config.root?.defaultProps,\n },\n },\n };\n }, [config]);\n\n if (loading) {\n return (\n <div\n style={{\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'center',\n height: '100vh',\n fontSize: '16px',\n color: 'var(--text-muted)',\n }}\n >\n Loading editor…\n </div>\n );\n }\n\n if (error) {\n return (\n <div\n style={{\n padding: '32px',\n color: 'var(--status-error)',\n background: 'rgba(248, 113, 113, 0.08)',\n border: '1px solid rgba(248, 113, 113, 0.25)',\n borderRadius: '8px',\n margin: '16px',\n }}\n >\n <strong>Error loading content:</strong> {error}\n </div>\n );\n }\n\n const activeData: PuckData =\n states.draft?.data ??\n content?.data ?? {\n content: [],\n root: { props: {} },\n };\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=\"Content Items\"\n icon={<AngleLeftIcon />}\n iconPosition=\"left\"\n onClick={() => navigate('/')}\n />\n <Text.Body tone=\"secondary\">/</Text.Body>\n <Text.Body isBold>{contentName}</Text.Body>\n </div>\n <div style={{ flex: 1, overflow: 'hidden' }}>\n <ComponentSearchProvider>\n <Puck\n config={contentConfig}\n data={activeData as Data}\n onChange={handleChange}\n onPublish={handlePublish}\n overrides={{\n headerActions: () => (\n <ContentToolbar\n saving={saving}\n isDirty={hasUnsavedChanges}\n states={states}\n onSave={() => void handleSave()}\n onPublish={() => void handlePublish(activeData as Data)}\n onRevert={() => void handleRevert()}\n />\n ),\n components: ({ children }) => <ComponentsPanel>{children}</ComponentsPanel>,\n componentItem: ({ children, name }) => (\n <ComponentItemFilter name={name}>{children}</ComponentItemFilter>\n ),\n }}\n />\n </ComponentSearchProvider>\n </div>\n </div>\n );\n};\n\n// ---------------------------------------------------------------------------\n// Inner router component\n// ---------------------------------------------------------------------------\n\ninterface ContentManagerRouterInnerProps {\n config: Config;\n defaultContentType?: string;\n backButton?: ReactNode;\n}\n\nconst ContentManagerRouterInner: React.FC<ContentManagerRouterInnerProps> = ({\n config,\n defaultContentType,\n backButton,\n}) => (\n <Routes>\n <Route\n path=\"/\"\n element={\n <ContentListRoute defaultContentType={defaultContentType} backButton={backButton} />\n }\n />\n <Route\n path=\"/:contentKey\"\n element={<ContentEditorRoute config={config} backButton={backButton} />}\n />\n </Routes>\n);\n\n// ---------------------------------------------------------------------------\n// Public component\n// ---------------------------------------------------------------------------\n\nexport interface ContentManagerRouterProps {\n /** URL path where this manager is mounted, e.g. \"/content\" — used as router basename */\n parentUrl: string;\n baseURL: string;\n projectKey: string;\n businessUnitKey: string;\n jwtToken: string;\n /** Puck component config — must match what's used in the renderer */\n config: Config;\n defaultContentType?: string;\n /** Optional element rendered before the breadcrumb in the editor header */\n backButton?: ReactNode;\n}\n\nexport const ContentManagerRouter: React.FC<ContentManagerRouterProps> = ({\n parentUrl,\n baseURL,\n projectKey,\n businessUnitKey,\n jwtToken,\n config,\n defaultContentType,\n backButton,\n}) => (\n <PuckApiProvider\n baseURL={baseURL}\n projectKey={projectKey}\n businessUnitKey={businessUnitKey}\n jwtToken={jwtToken}\n >\n <BrowserRouter basename={parentUrl}>\n <ContentManagerRouterInner\n config={config}\n defaultContentType={defaultContentType}\n backButton={backButton}\n />\n </BrowserRouter>\n </PuckApiProvider>\n);\n"],"mappings":"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","names":["useState","PuckApiProvider","jsx","jsxs","StatusBadge","useState","useCallback","useMemo","useRef","Puck","ComponentSearchProvider","ComponentsPanel","ComponentItemFilter","PuckApiProvider","usePuckContents","usePuckContent","DataTable","PrimaryButton","SecondaryButton","FlatButton","Card","Spacings","Text","LoadingSpinner","TextInput","Label","PlusThinIcon","SearchIcon","jsx","jsxs","StatusBadge","BADGE_STYLES","ContentToolbar"]}
1
+ {"version":3,"sources":["../src/ContentManager.tsx","../src/ContentEditor.tsx","../src/ContentManagerRouter.tsx"],"sourcesContent":["import React, { useState } from 'react';\nimport { PuckApiProvider, usePuckContents } from '@commercetools-demo/puck-api';\nimport type {\n CreatePuckContentInput,\n PuckContentListItem,\n} 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, SearchIcon } 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// Row type for DataTable\n// ---------------------------------------------------------------------------\n\ntype ContentRow = PuckContentListItem & { id: string };\n\nconst columns = [\n { key: 'name', label: 'Name' },\n { key: 'contentType', label: 'Content Type' },\n { key: 'status', label: 'Status' },\n { key: 'updatedAt', label: 'Updated' },\n { key: 'actions', label: 'Actions', shouldIgnoreRowClick: true },\n];\n\n// ---------------------------------------------------------------------------\n// Inner list component (uses context)\n// ---------------------------------------------------------------------------\n\ninterface ContentListProps {\n defaultContentType?: string;\n onEdit: (item: PuckContentListItem) => void;\n}\n\nconst ContentList: React.FC<ContentListProps> = ({ defaultContentType, onEdit }) => {\n const { contents, loading, error, fetchContents, createContent, deleteContent, refresh } =\n usePuckContents(defaultContentType);\n\n const [filterType, setFilterType] = useState(defaultContentType ?? '');\n const [showCreate, setShowCreate] = useState(false);\n const [createName, setCreateName] = useState('');\n const [createType, setCreateType] = useState(defaultContentType ?? '');\n const [createError, setCreateError] = useState<string | null>(null);\n const [creating, setCreating] = useState(false);\n const [deleting, setDeleting] = useState<string | null>(null);\n\n const handleFilter = () => void fetchContents(filterType || undefined);\n\n const handleCreate = async () => {\n setCreateError(null);\n if (!createName.trim()) { setCreateError('Name is required'); return; }\n if (!createType.trim()) { setCreateError('Content type is required'); return; }\n setCreating(true);\n try {\n const input: CreatePuckContentInput = {\n name: createName.trim(),\n contentType: createType.trim(),\n data: { content: [], root: { props: {} } },\n };\n await createContent(input);\n setShowCreate(false);\n setCreateName('');\n setCreateType(defaultContentType ?? '');\n } catch (err) {\n setCreateError((err as Error).message);\n } finally {\n setCreating(false);\n }\n };\n\n const handleDelete = async (key: string) => {\n if (!confirm('Delete this content item and all its versions?')) return;\n setDeleting(key);\n try {\n await deleteContent(key);\n } finally {\n setDeleting(null);\n }\n };\n\n const rows: ContentRow[] = contents.map((c) => ({ ...c, id: c.key }));\n\n return (\n <div style={{ maxWidth: '1200px', margin: '0 auto', padding: '32px 24px' }}>\n <Spacings.Stack scale=\"l\">\n {/* Header */}\n <Spacings.Inline justifyContent=\"space-between\" alignItems=\"center\">\n <Text.Headline as=\"h1\">Content Items</Text.Headline>\n <PrimaryButton\n label=\"New Content\"\n iconLeft={<PlusThinIcon />}\n onClick={() => setShowCreate((v) => !v)}\n />\n </Spacings.Inline>\n\n {/* Create form */}\n {showCreate && (\n <Card insetScale=\"l\">\n <Spacings.Stack scale=\"m\">\n <Text.Subheadline as=\"h4\" isBold>Create Content Item</Text.Subheadline>\n {createError && <Text.Body tone=\"negative\">{createError}</Text.Body>}\n <Spacings.Inline scale=\"m\">\n <div style={{ flex: 1 }}>\n <Spacings.Stack scale=\"xs\">\n <Label htmlFor=\"create-name\">Name</Label>\n <TextInput\n id=\"create-name\"\n value={createName}\n onChange={(e) => setCreateName(e.target.value)}\n placeholder=\"e.g. Homepage Hero\"\n />\n </Spacings.Stack>\n </div>\n <div style={{ flex: 1 }}>\n <Spacings.Stack scale=\"xs\">\n <Label htmlFor=\"create-type\">Content Type</Label>\n <TextInput\n id=\"create-type\"\n value={createType}\n onChange={(e) => setCreateType(e.target.value)}\n placeholder=\"e.g. hero, banner\"\n />\n </Spacings.Stack>\n </div>\n </Spacings.Inline>\n <Spacings.Inline scale=\"s\">\n <PrimaryButton\n label={creating ? 'Creating…' : 'Create'}\n onClick={() => void handleCreate()}\n isDisabled={creating}\n />\n <SecondaryButton label=\"Cancel\" onClick={() => setShowCreate(false)} />\n </Spacings.Inline>\n </Spacings.Stack>\n </Card>\n )}\n\n {/* Filter row */}\n <Spacings.Inline scale=\"s\" alignItems=\"center\">\n <div style={{ flex: 1, maxWidth: '280px' }}>\n <TextInput\n value={filterType}\n onChange={(e) => setFilterType(e.target.value)}\n placeholder=\"Filter by content type…\"\n />\n </div>\n <SecondaryButton\n label=\"Filter\"\n iconLeft={<SearchIcon />}\n onClick={handleFilter}\n />\n <FlatButton\n label=\"Clear\"\n onClick={() => { setFilterType(''); void fetchContents(undefined); }}\n />\n <FlatButton label=\"Refresh\" onClick={() => void refresh()} />\n </Spacings.Inline>\n\n {error && <Text.Body tone=\"negative\">{error}</Text.Body>}\n\n {/* Table */}\n {loading ? (\n <div style={{ display: 'flex', justifyContent: 'center', padding: '48px' }}>\n <LoadingSpinner />\n </div>\n ) : contents.length === 0 ? (\n <Spacings.Stack scale=\"m\" alignItems=\"center\">\n <Text.Body tone=\"secondary\">No content items found.</Text.Body>\n </Spacings.Stack>\n ) : (\n <DataTable\n columns={columns}\n rows={rows}\n itemRenderer={(row: ContentRow, column) => {\n switch (column.key) {\n case 'name':\n return <Text.Body isBold>{row.value.name}</Text.Body>;\n case 'contentType':\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.contentType}\n </code>\n );\n case 'status': {\n const hasDraft = !!row.states.draft;\n const hasPublished = !!row.states.published;\n return (\n <span>\n {hasDraft && <StatusBadge variant=\"draft\" />}\n {hasPublished && <StatusBadge variant=\"published\" />}\n {!hasDraft && !hasPublished && <StatusBadge variant=\"none\" />}\n </span>\n );\n }\n case 'updatedAt':\n return (\n <Text.Body tone=\"secondary\">\n {new Date(row.value.updatedAt).toLocaleDateString()}\n </Text.Body>\n );\n case 'actions':\n return (\n <div style={{ display: 'flex', alignItems: 'center', gap: '8px' }}>\n <PrimaryButton label=\"Edit\" size=\"20\" onClick={() => onEdit(row)} />\n <FlatButton\n tone=\"critical\"\n label={deleting === row.key ? '…' : 'Delete'}\n isDisabled={deleting === row.key}\n onClick={() => void handleDelete(row.key)}\n />\n </div>\n );\n default:\n return null;\n }\n }}\n />\n )}\n </Spacings.Stack>\n </div>\n );\n};\n\n// ---------------------------------------------------------------------------\n// Public component — wraps its own PuckApiProvider\n// ---------------------------------------------------------------------------\n\nexport interface ContentManagerProps {\n baseURL: string;\n projectKey: string;\n businessUnitKey: string;\n jwtToken: string;\n defaultContentType?: string;\n onEdit: (item: PuckContentListItem) => void;\n}\n\nexport const ContentManager: React.FC<ContentManagerProps> = ({\n baseURL,\n projectKey,\n businessUnitKey,\n jwtToken,\n defaultContentType,\n onEdit,\n}) => (\n <PuckApiProvider\n baseURL={baseURL}\n projectKey={projectKey}\n businessUnitKey={businessUnitKey}\n jwtToken={jwtToken}\n >\n <ContentList defaultContentType={defaultContentType} onEdit={onEdit} />\n </PuckApiProvider>\n);\n","import React, { useCallback, useMemo, useRef, useState } from 'react';\nimport { Puck, type Config, type Data } from '@measured/puck';\nimport '@measured/puck/puck.css';\nimport { PuckApiProvider, usePuckContent } from '@commercetools-demo/puck-api';\nimport type { PuckContentStateInfo, PuckData } from '@commercetools-demo/puck-types';\nimport {\n ComponentSearchProvider,\n ComponentsPanel,\n ComponentItemFilter,\n} from '@commercetools-demo/puck-editor';\n\n// ---------------------------------------------------------------------------\n// Inline toolbar — mirrors EditorToolbar but uses PuckContentStateInfo\n// ---------------------------------------------------------------------------\n\ninterface ContentToolbarProps {\n saving: boolean;\n isDirty: boolean;\n states: PuckContentStateInfo;\n onSave: () => void;\n onPublish: () => void;\n onRevert: () => void;\n}\n\ntype BadgeVariant = 'saving' | 'unsaved' | 'draft' | 'published';\n\nconst BADGE_STYLES: Record<BadgeVariant, { bg: string; color: string; border: string }> = {\n saving: { bg: 'rgba(251, 191, 36, 0.12)', color: 'var(--status-saving)', border: 'rgba(251, 191, 36, 0.3)' },\n unsaved: { bg: 'rgba(100, 116, 139, 0.12)', color: 'var(--text-muted)', border: 'rgba(100, 116, 139, 0.3)' },\n draft: { bg: 'rgba(129, 140, 248, 0.12)', color: 'var(--status-draft)', border: 'rgba(129, 140, 248, 0.3)' },\n published: { bg: 'rgba(6, 214, 160, 0.12)', color: 'var(--status-published)', border: 'rgba(6, 214, 160, 0.3)' },\n};\n\nconst StatusBadge: React.FC<{ label: string; variant: BadgeVariant }> = ({\n label,\n variant,\n}) => {\n const bs = BADGE_STYLES[variant];\n return (\n <span\n style={{\n display: 'inline-flex',\n alignItems: 'center',\n padding: '2px 10px',\n borderRadius: '12px',\n fontSize: '12px',\n fontWeight: 600,\n background: bs.bg,\n color: bs.color,\n border: `1px solid ${bs.border}`,\n }}\n >\n {label}\n </span>\n );\n};\n\nconst ContentToolbar: React.FC<ContentToolbarProps> = ({\n saving,\n isDirty,\n states,\n onSave,\n onPublish,\n onRevert,\n}) => {\n const hasDraft = Boolean(states.draft);\n const hasPublished = Boolean(states.published);\n\n return (\n <div style={{ display: 'flex', alignItems: 'center', gap: '12px', flexWrap: 'wrap' }}>\n <div style={{ display: 'flex', alignItems: 'center', gap: '6px' }}>\n {saving && <StatusBadge label=\"Saving…\" variant=\"saving\" />}\n {!saving && isDirty && <StatusBadge label=\"Unsaved\" variant=\"unsaved\" />}\n {!saving && !isDirty && hasDraft && (\n <StatusBadge label=\"Draft\" variant=\"draft\" />\n )}\n {hasPublished && <StatusBadge label=\"Published\" variant=\"published\" />}\n </div>\n\n {hasDraft && hasPublished && (\n <button\n onClick={onRevert}\n disabled={saving}\n style={{\n padding: '6px 14px',\n borderRadius: '4px',\n border: '1px solid var(--border-glow)',\n background: 'transparent',\n color: 'var(--text-muted)',\n fontWeight: 500,\n fontSize: '13px',\n cursor: saving ? 'not-allowed' : 'pointer',\n opacity: saving ? 0.5 : 1,\n }}\n >\n Revert to Published\n </button>\n )}\n\n <button\n onClick={onSave}\n disabled={!isDirty || saving}\n style={{\n padding: '6px 14px',\n borderRadius: '4px',\n border: '1px solid var(--border-glow)',\n background: 'transparent',\n color: 'var(--text-muted)',\n fontWeight: 500,\n fontSize: '13px',\n cursor: (!isDirty || saving) ? 'not-allowed' : 'pointer',\n opacity: (!isDirty || saving) ? 0.4 : 1,\n }}\n >\n Save\n </button>\n\n <button\n onClick={onPublish}\n disabled={saving}\n style={{\n padding: '6px 16px',\n borderRadius: '4px',\n border: '1px solid var(--accent-cyan)',\n background: 'rgba(0, 212, 255, 0.1)',\n color: 'var(--accent-cyan)',\n fontWeight: 600,\n fontSize: '13px',\n cursor: saving ? 'not-allowed' : 'pointer',\n opacity: saving ? 0.5 : 1,\n boxShadow: '0 0 12px rgba(0, 212, 255, 0.15)',\n }}\n >\n {hasPublished ? 'Re-publish' : 'Publish'}\n </button>\n </div>\n );\n};\n\n// ---------------------------------------------------------------------------\n// Inner editor component (uses context)\n// ---------------------------------------------------------------------------\n\ninterface ContentEditorInnerProps {\n contentKey: string;\n config: Config;\n onPublish?: (data: PuckData) => void;\n onSave?: (data: PuckData) => void;\n onError?: (error: Error) => void;\n}\n\nconst ContentEditorInner: React.FC<ContentEditorInnerProps> = ({\n contentKey,\n config,\n onPublish,\n onSave,\n onError,\n}) => {\n const {\n content,\n states,\n saving,\n loading,\n error,\n saveDraft,\n publish,\n revertToPublished,\n } = usePuckContent(contentKey);\n\n const latestDataRef = useRef<Data | null>(null);\n const [hasUnsavedChanges, setHasUnsavedChanges] = useState(false);\n\n const handleChange = useCallback((data: Data) => {\n latestDataRef.current = data;\n setHasUnsavedChanges(true);\n }, []);\n\n const handleSave = useCallback(async () => {\n const data = latestDataRef.current;\n if (!data) return;\n try {\n await saveDraft(data as PuckData);\n setHasUnsavedChanges(false);\n onSave?.(data as PuckData);\n } catch (err) {\n onError?.(err as Error);\n }\n }, [saveDraft, onSave, onError]);\n\n const handlePublish = useCallback(\n async (data: Data) => {\n try {\n await saveDraft(data as PuckData);\n setHasUnsavedChanges(false);\n await publish(false);\n onPublish?.(data as PuckData);\n } catch (err) {\n onError?.(err as Error);\n }\n },\n [saveDraft, publish, onPublish, onError]\n );\n\n const handleRevert = useCallback(async () => {\n try {\n await revertToPublished();\n setHasUnsavedChanges(false);\n } catch (err) {\n onError?.(err as Error);\n }\n }, [revertToPublished, onError]);\n\n\n // Override root fields with content-specific labels and add slot field.\n // Stored in content.data.root.props (title, slot, backgroundColor, etc.).\n const contentConfig = useMemo((): Config => {\n const otherRootFields = Object.fromEntries(\n Object.entries(config.root?.fields ?? {}).filter(([k]) => k !== 'title')\n );\n return {\n ...config,\n root: {\n ...config.root,\n fields: {\n title: { type: 'text', label: 'Content Title' },\n slot: { type: 'text', label: 'Slot' },\n ...otherRootFields,\n },\n defaultProps: {\n title: 'New Content',\n slot: '',\n ...config.root?.defaultProps,\n },\n },\n };\n }, [config]);\n\n if (loading) {\n return (\n <div\n style={{\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'center',\n height: '100vh',\n fontSize: '16px',\n color: 'var(--text-muted)',\n }}\n >\n Loading editor…\n </div>\n );\n }\n\n if (error) {\n return (\n <div\n style={{\n padding: '32px',\n color: 'var(--status-error)',\n background: 'rgba(248, 113, 113, 0.08)',\n border: '1px solid rgba(248, 113, 113, 0.25)',\n borderRadius: '8px',\n margin: '16px',\n }}\n >\n <strong>Error loading content:</strong> {error}\n </div>\n );\n }\n\n // Use draft state data if available, otherwise fall back to the main content value\n const activeData: PuckData =\n states.draft?.data ??\n content?.data ?? {\n content: [],\n root: { props: {} },\n };\n\n\n return (\n <ComponentSearchProvider>\n <Puck\n config={contentConfig}\n data={activeData as Data}\n onChange={handleChange}\n onPublish={handlePublish}\n overrides={{\n headerActions: () => (\n <ContentToolbar\n saving={saving}\n isDirty={hasUnsavedChanges}\n states={states}\n onSave={() => void handleSave()}\n onPublish={() => void handlePublish(activeData as Data)}\n onRevert={() => void handleRevert()}\n />\n ),\n components: ({ children }) => <ComponentsPanel>{children}</ComponentsPanel>,\n componentItem: ({ children, name }) => (\n <ComponentItemFilter name={name}>{children}</ComponentItemFilter>\n ),\n }}\n />\n </ComponentSearchProvider>\n );\n};\n\n// ---------------------------------------------------------------------------\n// Public component — wraps its own PuckApiProvider\n// ---------------------------------------------------------------------------\n\nexport interface ContentEditorProps {\n baseURL: string;\n projectKey: string;\n businessUnitKey: string;\n jwtToken: string;\n contentKey: string;\n /** Puck component config — must match what's used in the renderer */\n config: Config;\n onPublish?: (data: PuckData) => void;\n onSave?: (data: PuckData) => void;\n onError?: (error: Error) => void;\n}\n\nexport const ContentEditor: React.FC<ContentEditorProps> = ({\n baseURL,\n projectKey,\n businessUnitKey,\n jwtToken,\n contentKey,\n config,\n onPublish,\n onSave,\n onError,\n}) => (\n <PuckApiProvider\n baseURL={baseURL}\n projectKey={projectKey}\n businessUnitKey={businessUnitKey}\n jwtToken={jwtToken}\n >\n <ContentEditorInner\n contentKey={contentKey}\n config={config}\n onPublish={onPublish}\n onSave={onSave}\n onError={onError}\n />\n </PuckApiProvider>\n);\n","import React, { useState, useCallback, useMemo, useRef, type ReactNode } from 'react';\nimport {\n BrowserRouter,\n Switch,\n Route,\n useHistory,\n useParams,\n useLocation,\n} from 'react-router-dom';\nimport { Puck, type Config, type Data } from '@measured/puck';\nimport '@measured/puck/puck.css';\nimport {\n ComponentSearchProvider,\n ComponentsPanel,\n ComponentItemFilter,\n} from '@commercetools-demo/puck-editor';\nimport {\n PuckApiProvider,\n usePuckContents,\n usePuckContent,\n} from '@commercetools-demo/puck-api';\nimport type {\n CreatePuckContentInput,\n PuckContentListItem,\n PuckContentStateInfo,\n PuckData,\n} 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, SearchIcon, 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// Content toolbar (status badges + publish/revert buttons)\n// ---------------------------------------------------------------------------\n\ntype BadgeVariant = 'saving' | 'unsaved' | 'draft' | 'published';\n\nconst BADGE_STYLES: Record<BadgeVariant, { bg: string; color: string; border: string }> = {\n saving: { bg: 'rgba(251, 191, 36, 0.12)', color: 'var(--status-saving)', border: 'rgba(251, 191, 36, 0.3)' },\n unsaved: { bg: 'rgba(100, 116, 139, 0.12)', color: 'var(--text-muted)', border: 'rgba(100, 116, 139, 0.3)' },\n draft: { bg: 'rgba(129, 140, 248, 0.12)', color: 'var(--status-draft)', border: 'rgba(129, 140, 248, 0.3)' },\n published: { bg: 'rgba(6, 214, 160, 0.12)', color: 'var(--status-published)', border: 'rgba(6, 214, 160, 0.3)' },\n};\n\nconst EditorStatusBadge: React.FC<{ label: string; variant: BadgeVariant }> = ({ label, variant }) => {\n const bs = BADGE_STYLES[variant];\n return (\n <span\n style={{\n display: 'inline-flex',\n alignItems: 'center',\n padding: '2px 10px',\n borderRadius: '12px',\n fontSize: '12px',\n fontWeight: 600,\n background: bs.bg,\n color: bs.color,\n border: `1px solid ${bs.border}`,\n }}\n >\n {label}\n </span>\n );\n};\n\ninterface ContentToolbarProps {\n saving: boolean;\n isDirty: boolean;\n states: PuckContentStateInfo;\n onSave: () => void;\n onPublish: () => void;\n onRevert: () => void;\n}\n\nconst ContentToolbar: React.FC<ContentToolbarProps> = ({ saving, isDirty, states, onSave, onPublish, onRevert }) => {\n const hasDraft = Boolean(states.draft);\n const hasPublished = Boolean(states.published);\n return (\n <div style={{ display: 'flex', alignItems: 'center', gap: '12px', flexWrap: 'wrap' }}>\n <div style={{ display: 'flex', alignItems: 'center', gap: '6px' }}>\n {saving && <EditorStatusBadge label=\"Saving…\" variant=\"saving\" />}\n {!saving && isDirty && <EditorStatusBadge label=\"Unsaved\" variant=\"unsaved\" />}\n {!saving && !isDirty && hasDraft && <EditorStatusBadge label=\"Draft\" variant=\"draft\" />}\n {hasPublished && <EditorStatusBadge label=\"Published\" variant=\"published\" />}\n </div>\n {hasDraft && hasPublished && (\n <button\n onClick={onRevert}\n disabled={saving}\n style={{\n padding: '6px 14px',\n borderRadius: '4px',\n border: '1px solid var(--border-glow)',\n background: 'transparent',\n color: 'var(--text-muted)',\n fontWeight: 500,\n fontSize: '13px',\n cursor: saving ? 'not-allowed' : 'pointer',\n opacity: saving ? 0.5 : 1,\n }}\n >\n Revert to Published\n </button>\n )}\n <button\n onClick={onSave}\n disabled={!isDirty || saving}\n style={{\n padding: '6px 14px',\n borderRadius: '4px',\n border: '1px solid var(--border-glow)',\n background: 'transparent',\n color: 'var(--text-muted)',\n fontWeight: 500,\n fontSize: '13px',\n cursor: (!isDirty || saving) ? 'not-allowed' : 'pointer',\n opacity: (!isDirty || saving) ? 0.4 : 1,\n }}\n >\n Save\n </button>\n <button\n onClick={onPublish}\n disabled={saving}\n style={{\n padding: '6px 16px',\n borderRadius: '4px',\n border: '1px solid var(--accent-cyan)',\n background: 'rgba(0, 212, 255, 0.1)',\n color: 'var(--accent-cyan)',\n fontWeight: 600,\n fontSize: '13px',\n cursor: saving ? 'not-allowed' : 'pointer',\n opacity: saving ? 0.5 : 1,\n boxShadow: '0 0 12px rgba(0, 212, 255, 0.15)',\n }}\n >\n {hasPublished ? 'Re-publish' : 'Publish'}\n </button>\n </div>\n );\n};\n\n// ---------------------------------------------------------------------------\n// 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 ContentRow = PuckContentListItem & { id: string };\n\nconst COLUMNS = [\n { key: 'name', label: 'Name' },\n { key: 'contentType', label: 'Content Type' },\n { key: 'status', label: 'Status' },\n { key: 'updatedAt', label: 'Updated' },\n { key: 'actions', label: 'Actions', shouldIgnoreRowClick: true },\n];\n\n// ---------------------------------------------------------------------------\n// ContentListRoute\n// ---------------------------------------------------------------------------\n\ninterface ContentListRouteProps {\n defaultContentType?: string;\n backButton?: ReactNode;\n}\n\nconst ContentListRoute: React.FC<ContentListRouteProps> = ({ defaultContentType, backButton }) => {\n const history = useHistory();\n const { contents, loading, error, fetchContents, createContent, deleteContent, refresh } =\n usePuckContents(defaultContentType);\n\n const [filterType, setFilterType] = useState(defaultContentType ?? '');\n const [showCreate, setShowCreate] = useState(false);\n const [createName, setCreateName] = useState('');\n const [createType, setCreateType] = useState(defaultContentType ?? '');\n const [createError, setCreateError] = useState<string | null>(null);\n const [creating, setCreating] = useState(false);\n const [deleting, setDeleting] = useState<string | null>(null);\n\n const handleFilter = () => void fetchContents(filterType || undefined);\n\n const handleCreate = async () => {\n setCreateError(null);\n if (!createName.trim()) { setCreateError('Name is required'); return; }\n if (!createType.trim()) { setCreateError('Content type is required'); return; }\n setCreating(true);\n try {\n const input: CreatePuckContentInput = {\n name: createName.trim(),\n contentType: createType.trim(),\n data: { content: [], root: { props: {} } },\n };\n const created = await createContent(input);\n setShowCreate(false);\n setCreateName('');\n setCreateType(defaultContentType ?? '');\n history.push(`/${created.key}`, { contentName: created.value.name });\n } catch (err) {\n setCreateError((err as Error).message);\n } finally {\n setCreating(false);\n }\n };\n\n const handleDelete = async (key: string) => {\n if (!confirm('Delete this content item and all its versions?')) return;\n setDeleting(key);\n try {\n await deleteContent(key);\n } finally {\n setDeleting(null);\n }\n };\n\n const rows: ContentRow[] = contents.map((c) => ({ ...c, id: c.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\">Content Items</Text.Headline>\n </Spacings.Inline>\n <PrimaryButton\n label=\"New Content\"\n iconLeft={<PlusThinIcon />}\n onClick={() => setShowCreate((v) => !v)}\n />\n </Spacings.Inline>\n\n {showCreate && (\n <Card insetScale=\"l\">\n <Spacings.Stack scale=\"m\">\n <Text.Subheadline as=\"h4\" isBold>Create Content Item</Text.Subheadline>\n {createError && <Text.Body tone=\"negative\">{createError}</Text.Body>}\n <Spacings.Inline scale=\"m\">\n <div style={{ flex: 1 }}>\n <Spacings.Stack scale=\"xs\">\n <Label htmlFor=\"create-content-name\">Name</Label>\n <TextInput\n id=\"create-content-name\"\n value={createName}\n onChange={(e) => setCreateName(e.target.value)}\n placeholder=\"e.g. Homepage Hero\"\n />\n </Spacings.Stack>\n </div>\n <div style={{ flex: 1 }}>\n <Spacings.Stack scale=\"xs\">\n <Label htmlFor=\"create-content-type\">Content Type</Label>\n <TextInput\n id=\"create-content-type\"\n value={createType}\n onChange={(e) => setCreateType(e.target.value)}\n placeholder=\"e.g. hero, banner\"\n />\n </Spacings.Stack>\n </div>\n </Spacings.Inline>\n <Spacings.Inline scale=\"s\">\n <PrimaryButton\n label={creating ? 'Creating…' : 'Create'}\n onClick={() => void handleCreate()}\n isDisabled={creating}\n />\n <SecondaryButton label=\"Cancel\" onClick={() => setShowCreate(false)} />\n </Spacings.Inline>\n </Spacings.Stack>\n </Card>\n )}\n\n <Spacings.Inline scale=\"s\" alignItems=\"center\">\n <div style={{ flex: 1, maxWidth: '280px' }}>\n <TextInput\n value={filterType}\n onChange={(e) => setFilterType(e.target.value)}\n placeholder=\"Filter by content type…\"\n />\n </div>\n <SecondaryButton\n label=\"Filter\"\n iconLeft={<SearchIcon />}\n onClick={handleFilter}\n />\n <FlatButton\n label=\"Clear\"\n onClick={() => { setFilterType(''); void fetchContents(undefined); }}\n />\n <FlatButton label=\"Refresh\" onClick={() => void refresh()} />\n </Spacings.Inline>\n\n {error && <Text.Body tone=\"negative\">{error}</Text.Body>}\n\n {loading ? (\n <div style={{ display: 'flex', justifyContent: 'center', padding: '48px' }}>\n <LoadingSpinner />\n </div>\n ) : contents.length === 0 ? (\n <Spacings.Stack scale=\"m\" alignItems=\"center\">\n <Text.Body tone=\"secondary\">No content items found.</Text.Body>\n </Spacings.Stack>\n ) : (\n <DataTable\n columns={COLUMNS}\n rows={rows}\n itemRenderer={(row: ContentRow, column) => {\n switch (column.key) {\n case 'name':\n return <Text.Body isBold>{row.value.name}</Text.Body>;\n case 'contentType':\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.contentType}\n </code>\n );\n case 'status': {\n const hasDraft = !!row.states.draft;\n const hasPublished = !!row.states.published;\n return (\n <span>\n {hasDraft && <StatusBadge variant=\"draft\" />}\n {hasPublished && <StatusBadge variant=\"published\" />}\n {!hasDraft && !hasPublished && <StatusBadge variant=\"none\" />}\n </span>\n );\n }\n case 'updatedAt':\n return (\n <Text.Body tone=\"secondary\">\n {new Date(row.value.updatedAt).toLocaleDateString()}\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}`, { contentName: 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.key)}\n />\n </div>\n );\n default:\n return null;\n }\n }}\n />\n )}\n </Spacings.Stack>\n </div>\n );\n};\n\n// ---------------------------------------------------------------------------\n// ContentEditorRoute\n// ---------------------------------------------------------------------------\n\ninterface ContentEditorRouteProps {\n config: Config;\n backButton?: ReactNode;\n}\n\nconst ContentEditorRoute: React.FC<ContentEditorRouteProps> = ({ config, backButton }) => {\n const { contentKey } = useParams<{ contentKey: string }>();\n const history = useHistory();\n const location = useLocation();\n const contentName =\n (location.state as { contentName?: string } | null)?.contentName ?? contentKey ?? 'Content';\n\n const {\n content,\n states,\n saving,\n loading,\n error,\n saveDraft,\n publish,\n revertToPublished,\n } = usePuckContent(contentKey!);\n\n const latestDataRef = useRef<Data | null>(null);\n const [hasUnsavedChanges, setHasUnsavedChanges] = useState(false);\n\n const handleChange = useCallback((data: Data) => {\n latestDataRef.current = data;\n setHasUnsavedChanges(true);\n }, []);\n\n const handleSave = useCallback(async () => {\n const data = latestDataRef.current;\n if (!data) return;\n try {\n await saveDraft(data as PuckData);\n setHasUnsavedChanges(false);\n } catch (err) {\n console.error('[ContentManagerRouter] save error:', err);\n }\n }, [saveDraft]);\n\n const handlePublish = useCallback(\n async (data: Data) => {\n try {\n await saveDraft(data as PuckData);\n setHasUnsavedChanges(false);\n await publish(false);\n } catch (err) {\n console.error('[ContentManagerRouter] publish error:', err);\n }\n },\n [saveDraft, publish]\n );\n\n const handleRevert = useCallback(async () => {\n try {\n await revertToPublished();\n setHasUnsavedChanges(false);\n } catch (err) {\n console.error('[ContentManagerRouter] revert error:', err);\n }\n }, [revertToPublished]);\n\n // Override root fields with content-specific labels and add slot field.\n // Stored in content.data.root.props (title, slot, backgroundColor, etc.).\n const contentConfig = useMemo((): Config => {\n const otherRootFields = Object.fromEntries(\n Object.entries(config.root?.fields ?? {}).filter(([k]) => k !== 'title')\n );\n return {\n ...config,\n root: {\n ...config.root,\n fields: {\n title: { type: 'text', label: 'Content Title' },\n slot: { type: 'text', label: 'Slot' },\n ...otherRootFields,\n },\n defaultProps: {\n title: 'New Content',\n slot: '',\n ...config.root?.defaultProps,\n },\n },\n };\n }, [config]);\n\n if (loading) {\n return (\n <div\n style={{\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'center',\n height: '100vh',\n fontSize: '16px',\n color: 'var(--text-muted)',\n }}\n >\n Loading editor…\n </div>\n );\n }\n\n if (error) {\n return (\n <div\n style={{\n padding: '32px',\n color: 'var(--status-error)',\n background: 'rgba(248, 113, 113, 0.08)',\n border: '1px solid rgba(248, 113, 113, 0.25)',\n borderRadius: '8px',\n margin: '16px',\n }}\n >\n <strong>Error loading content:</strong> {error}\n </div>\n );\n }\n\n const activeData: PuckData =\n states.draft?.data ??\n content?.data ?? {\n content: [],\n root: { props: {} },\n };\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=\"Content Items\"\n icon={<AngleLeftIcon />}\n iconPosition=\"left\"\n onClick={() => history.push('/')}\n />\n <Text.Body tone=\"secondary\">/</Text.Body>\n <Text.Body isBold>{contentName}</Text.Body>\n </div>\n <div style={{ flex: 1, overflow: 'hidden' }}>\n <ComponentSearchProvider>\n <Puck\n config={contentConfig}\n data={activeData as Data}\n onChange={handleChange}\n onPublish={handlePublish}\n overrides={{\n headerActions: () => (\n <ContentToolbar\n saving={saving}\n isDirty={hasUnsavedChanges}\n states={states}\n onSave={() => void handleSave()}\n onPublish={() => void handlePublish(activeData as Data)}\n onRevert={() => void handleRevert()}\n />\n ),\n components: ({ children }) => <ComponentsPanel>{children}</ComponentsPanel>,\n componentItem: ({ children, name }) => (\n <ComponentItemFilter name={name}>{children}</ComponentItemFilter>\n ),\n }}\n />\n </ComponentSearchProvider>\n </div>\n </div>\n );\n};\n\n// ---------------------------------------------------------------------------\n// Inner router component\n// ---------------------------------------------------------------------------\n\ninterface ContentManagerRouterInnerProps {\n config: Config;\n defaultContentType?: string;\n backButton?: ReactNode;\n}\n\nconst ContentManagerRouterInner: React.FC<ContentManagerRouterInnerProps> = ({\n config,\n defaultContentType,\n backButton,\n}) => (\n <Switch>\n <Route\n exact\n path=\"/\"\n render={() => (\n <ContentListRoute defaultContentType={defaultContentType} backButton={backButton} />\n )}\n />\n <Route\n path=\"/:contentKey\"\n render={() => <ContentEditorRoute config={config} backButton={backButton} />}\n />\n </Switch>\n);\n\n// ---------------------------------------------------------------------------\n// Public component\n// ---------------------------------------------------------------------------\n\nexport interface ContentManagerRouterProps {\n /** URL path where this manager is mounted, e.g. \"/content\" — used as router basename */\n parentUrl: string;\n baseURL: string;\n projectKey: string;\n businessUnitKey: string;\n jwtToken: string;\n /** Puck component config — must match what's used in the renderer */\n config: Config;\n defaultContentType?: string;\n /** Optional element rendered before the breadcrumb in the editor header */\n backButton?: ReactNode;\n}\n\nexport const ContentManagerRouter: React.FC<ContentManagerRouterProps> = ({\n parentUrl,\n baseURL,\n projectKey,\n businessUnitKey,\n jwtToken,\n config,\n defaultContentType,\n backButton,\n}) => (\n <PuckApiProvider\n baseURL={baseURL}\n projectKey={projectKey}\n businessUnitKey={businessUnitKey}\n jwtToken={jwtToken}\n >\n <BrowserRouter basename={parentUrl}>\n <ContentManagerRouterInner\n config={config}\n defaultContentType={defaultContentType}\n backButton={backButton}\n />\n </BrowserRouter>\n </PuckApiProvider>\n);\n"],"mappings":"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","names":["useState","PuckApiProvider","jsx","jsxs","StatusBadge","useState","useCallback","useMemo","useRef","Puck","ComponentSearchProvider","ComponentsPanel","ComponentItemFilter","PuckApiProvider","usePuckContents","usePuckContent","DataTable","PrimaryButton","SecondaryButton","FlatButton","Card","Spacings","Text","LoadingSpinner","TextInput","Label","PlusThinIcon","SearchIcon","jsx","jsxs","StatusBadge","BADGE_STYLES","ContentToolbar"]}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@commercetools-demo/puck-content-manager",
3
- "version": "0.1.0",
3
+ "version": "0.2.0",
4
4
  "description": "UI components for managing standalone Puck content items",
5
5
  "main": "dist/index.js",
6
6
  "module": "dist/index.mjs",
@@ -25,9 +25,9 @@
25
25
  "typecheck": "tsc --noEmit"
26
26
  },
27
27
  "dependencies": {
28
- "@commercetools-demo/puck-api": "^0.1.0",
29
- "@commercetools-demo/puck-editor": "^0.1.0",
30
- "@commercetools-demo/puck-types": "^0.1.0",
28
+ "@commercetools-demo/puck-api": "^0.2.0",
29
+ "@commercetools-demo/puck-editor": "^0.2.0",
30
+ "@commercetools-demo/puck-types": "^0.2.0",
31
31
  "@commercetools-uikit/card": "^20.5.0",
32
32
  "@commercetools-uikit/data-table": "^20.5.0",
33
33
  "@commercetools-uikit/design-system": "^20.5.0",
@@ -46,12 +46,18 @@
46
46
  "react": ">=19.0.0",
47
47
  "react-dom": ">=19.0.0",
48
48
  "react-intl": ">=6.0.0",
49
- "react-router-dom": ">=5.0.0"
49
+ "react-router-dom": ">=5.0.0 <6"
50
50
  },
51
51
  "devDependencies": {
52
- "@types/react": "^18",
53
- "@types/react-dom": "^18",
52
+ "@types/react": "^19",
53
+ "@types/react-dom": "^19",
54
+ "@types/react-router-dom": "^5",
54
55
  "tsup": "^8.3.0",
55
56
  "typescript": "^5.7.2"
57
+ },
58
+ "resolutions": {
59
+ "@types/react-router": "<6",
60
+ "@types/react-router-dom": "<6",
61
+ "react-router-dom": "<6"
56
62
  }
57
63
  }