@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 +9 -8
- package/dist/index.js.map +1 -1
- package/dist/index.mjs +11 -10
- package/dist/index.mjs.map +1 -1
- package/package.json +13 -7
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
|
|
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
|
-
|
|
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: () =>
|
|
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
|
|
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: () =>
|
|
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.
|
|
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
|
-
|
|
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
|
-
|
|
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":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;;ACAA,mBAAgC;AAChC,sBAAiD;AAKjD,wBAAsB;AACtB,4BAA0B;AAC1B,8BAA4B;AAC5B,yBAAuB;AACvB,kBAAiB;AACjB,sBAAqB;AACrB,kBAAiB;AACjB,6BAA2B;AAC3B,wBAAsB;AACtB,mBAAkB;AAClB,mBAAyC;AAcrC;AARJ,IAAM,cAAqE,CAAC,EAAE,QAAQ,MAAM;AAC1F,QAAM,SACJ,YAAY,cACR,EAAE,YAAY,2BAA2B,OAAO,2BAA2B,QAAQ,oCAAoC,IACvH,YAAY,UACV,EAAE,YAAY,2BAA2B,OAAO,2BAA2B,QAAQ,oCAAoC,IACvH,EAAE,YAAY,2BAA2B,OAAO,2BAA2B,QAAQ,oCAAoC;AAC/H,SACE;AAAA,IAAC;AAAA;AAAA,MACC,OAAO;AAAA,QACL,GAAG;AAAA,QACH,SAAS;AAAA,QACT,YAAY;AAAA,QACZ,SAAS;AAAA,QACT,cAAc;AAAA,QACd,UAAU;AAAA,QACV,YAAY;AAAA,QACZ,aAAa;AAAA,QACb,YAAY;AAAA,MACd;AAAA,MAEC,sBAAY,cAAc,cAAc,YAAY,UAAU,UAAU;AAAA;AAAA,EAC3E;AAEJ;AAQA,IAAM,UAAU;AAAA,EACd,EAAE,KAAK,QAAQ,OAAO,OAAO;AAAA,EAC7B,EAAE,KAAK,eAAe,OAAO,eAAe;AAAA,EAC5C,EAAE,KAAK,UAAU,OAAO,SAAS;AAAA,EACjC,EAAE,KAAK,aAAa,OAAO,UAAU;AAAA,EACrC,EAAE,KAAK,WAAW,OAAO,WAAW,sBAAsB,KAAK;AACjE;AAWA,IAAM,cAA0C,CAAC,EAAE,oBAAoB,OAAO,MAAM;AAClF,QAAM,EAAE,UAAU,SAAS,OAAO,eAAe,eAAe,eAAe,QAAQ,QACrF,iCAAgB,kBAAkB;AAEpC,QAAM,CAAC,YAAY,aAAa,QAAI,uBAAS,sBAAsB,EAAE;AACrE,QAAM,CAAC,YAAY,aAAa,QAAI,uBAAS,KAAK;AAClD,QAAM,CAAC,YAAY,aAAa,QAAI,uBAAS,EAAE;AAC/C,QAAM,CAAC,YAAY,aAAa,QAAI,uBAAS,sBAAsB,EAAE;AACrE,QAAM,CAAC,aAAa,cAAc,QAAI,uBAAwB,IAAI;AAClE,QAAM,CAAC,UAAU,WAAW,QAAI,uBAAS,KAAK;AAC9C,QAAM,CAAC,UAAU,WAAW,QAAI,uBAAwB,IAAI;AAE5D,QAAM,eAAe,MAAM,KAAK,cAAc,cAAc,MAAS;AAErE,QAAM,eAAe,YAAY;AAC/B,mBAAe,IAAI;AACnB,QAAI,CAAC,WAAW,KAAK,GAAG;AAAE,qBAAe,kBAAkB;AAAG;AAAA,IAAQ;AACtE,QAAI,CAAC,WAAW,KAAK,GAAG;AAAE,qBAAe,0BAA0B;AAAG;AAAA,IAAQ;AAC9E,gBAAY,IAAI;AAChB,QAAI;AACF,YAAM,QAAgC;AAAA,QACpC,MAAM,WAAW,KAAK;AAAA,QACtB,aAAa,WAAW,KAAK;AAAA,QAC7B,MAAM,EAAE,SAAS,CAAC,GAAG,MAAM,EAAE,OAAO,CAAC,EAAE,EAAE;AAAA,MAC3C;AACA,YAAM,cAAc,KAAK;AACzB,oBAAc,KAAK;AACnB,oBAAc,EAAE;AAChB,oBAAc,sBAAsB,EAAE;AAAA,IACxC,SAAS,KAAK;AACZ,qBAAgB,IAAc,OAAO;AAAA,IACvC,UAAE;AACA,kBAAY,KAAK;AAAA,IACnB;AAAA,EACF;AAEA,QAAM,eAAe,OAAO,QAAgB;AAC1C,QAAI,CAAC,QAAQ,gDAAgD,EAAG;AAChE,gBAAY,GAAG;AACf,QAAI;AACF,YAAM,cAAc,GAAG;AAAA,IACzB,UAAE;AACA,kBAAY,IAAI;AAAA,IAClB;AAAA,EACF;AAEA,QAAM,OAAqB,SAAS,IAAI,CAAC,OAAO,EAAE,GAAG,GAAG,IAAI,EAAE,IAAI,EAAE;AAEpE,SACE,4CAAC,SAAI,OAAO,EAAE,UAAU,UAAU,QAAQ,UAAU,SAAS,YAAY,GACvE,uDAAC,gBAAAA,QAAS,OAAT,EAAe,OAAM,KAEpB;AAAA,iDAAC,gBAAAA,QAAS,QAAT,EAAgB,gBAAe,iBAAgB,YAAW,UACzD;AAAA,kDAAC,YAAAC,QAAK,UAAL,EAAc,IAAG,MAAK,2BAAa;AAAA,MACpC;AAAA,QAAC,sBAAAC;AAAA,QAAA;AAAA,UACC,OAAM;AAAA,UACN,UAAU,4CAAC,6BAAa;AAAA,UACxB,SAAS,MAAM,cAAc,CAAC,MAAM,CAAC,CAAC;AAAA;AAAA,MACxC;AAAA,OACF;AAAA,IAGC,cACC,4CAAC,YAAAC,SAAA,EAAK,YAAW,KACf,uDAAC,gBAAAH,QAAS,OAAT,EAAe,OAAM,KACpB;AAAA,kDAAC,YAAAC,QAAK,aAAL,EAAiB,IAAG,MAAK,QAAM,MAAC,iCAAmB;AAAA,MACnD,eAAe,4CAAC,YAAAA,QAAK,MAAL,EAAU,MAAK,YAAY,uBAAY;AAAA,MACxD,6CAAC,gBAAAD,QAAS,QAAT,EAAgB,OAAM,KACrB;AAAA,oDAAC,SAAI,OAAO,EAAE,MAAM,EAAE,GACpB,uDAAC,gBAAAA,QAAS,OAAT,EAAe,OAAM,MACpB;AAAA,sDAAC,aAAAI,SAAA,EAAM,SAAQ,eAAc,kBAAI;AAAA,UACjC;AAAA,YAAC,kBAAAC;AAAA,YAAA;AAAA,cACC,IAAG;AAAA,cACH,OAAO;AAAA,cACP,UAAU,CAAC,MAAM,cAAc,EAAE,OAAO,KAAK;AAAA,cAC7C,aAAY;AAAA;AAAA,UACd;AAAA,WACF,GACF;AAAA,QACA,4CAAC,SAAI,OAAO,EAAE,MAAM,EAAE,GACpB,uDAAC,gBAAAL,QAAS,OAAT,EAAe,OAAM,MACpB;AAAA,sDAAC,aAAAI,SAAA,EAAM,SAAQ,eAAc,0BAAY;AAAA,UACzC;AAAA,YAAC,kBAAAC;AAAA,YAAA;AAAA,cACC,IAAG;AAAA,cACH,OAAO;AAAA,cACP,UAAU,CAAC,MAAM,cAAc,EAAE,OAAO,KAAK;AAAA,cAC7C,aAAY;AAAA;AAAA,UACd;AAAA,WACF,GACF;AAAA,SACF;AAAA,MACA,6CAAC,gBAAAL,QAAS,QAAT,EAAgB,OAAM,KACrB;AAAA;AAAA,UAAC,sBAAAE;AAAA,UAAA;AAAA,YACC,OAAO,WAAW,mBAAc;AAAA,YAChC,SAAS,MAAM,KAAK,aAAa;AAAA,YACjC,YAAY;AAAA;AAAA,QACd;AAAA,QACA,4CAAC,wBAAAI,SAAA,EAAgB,OAAM,UAAS,SAAS,MAAM,cAAc,KAAK,GAAG;AAAA,SACvE;AAAA,OACF,GACF;AAAA,IAIF,6CAAC,gBAAAN,QAAS,QAAT,EAAgB,OAAM,KAAI,YAAW,UACpC;AAAA,kDAAC,SAAI,OAAO,EAAE,MAAM,GAAG,UAAU,QAAQ,GACvC;AAAA,QAAC,kBAAAK;AAAA,QAAA;AAAA,UACC,OAAO;AAAA,UACP,UAAU,CAAC,MAAM,cAAc,EAAE,OAAO,KAAK;AAAA,UAC7C,aAAY;AAAA;AAAA,MACd,GACF;AAAA,MACA;AAAA,QAAC,wBAAAC;AAAA,QAAA;AAAA,UACC,OAAM;AAAA,UACN,UAAU,4CAAC,2BAAW;AAAA,UACtB,SAAS;AAAA;AAAA,MACX;AAAA,MACA;AAAA,QAAC,mBAAAC;AAAA,QAAA;AAAA,UACC,OAAM;AAAA,UACN,SAAS,MAAM;AAAE,0BAAc,EAAE;AAAG,iBAAK,cAAc,MAAS;AAAA,UAAG;AAAA;AAAA,MACrE;AAAA,MACA,4CAAC,mBAAAA,SAAA,EAAW,OAAM,WAAU,SAAS,MAAM,KAAK,QAAQ,GAAG;AAAA,OAC7D;AAAA,IAEC,SAAS,4CAAC,YAAAN,QAAK,MAAL,EAAU,MAAK,YAAY,iBAAM;AAAA,IAG3C,UACC,4CAAC,SAAI,OAAO,EAAE,SAAS,QAAQ,gBAAgB,UAAU,SAAS,OAAO,GACvE,sDAAC,uBAAAO,SAAA,EAAe,GAClB,IACE,SAAS,WAAW,IACtB,4CAAC,gBAAAR,QAAS,OAAT,EAAe,OAAM,KAAI,YAAW,UACnC,sDAAC,YAAAC,QAAK,MAAL,EAAU,MAAK,aAAY,qCAAuB,GACrD,IAEA;AAAA,MAAC,kBAAAQ;AAAA,MAAA;AAAA,QACC;AAAA,QACA;AAAA,QACA,cAAc,CAAC,KAAiB,WAAW;AACzC,kBAAQ,OAAO,KAAK;AAAA,YAClB,KAAK;AACH,qBAAO,4CAAC,YAAAR,QAAK,MAAL,EAAU,QAAM,MAAE,cAAI,MAAM,MAAK;AAAA,YAC3C,KAAK;AACH,qBACE;AAAA,gBAAC;AAAA;AAAA,kBACC,OAAO;AAAA,oBACL,YAAY;AAAA,oBACZ,SAAS;AAAA,oBACT,cAAc;AAAA,oBACd,UAAU;AAAA,oBACV,YAAY;AAAA,kBACd;AAAA,kBAEC,cAAI,MAAM;AAAA;AAAA,cACb;AAAA,YAEJ,KAAK,UAAU;AACb,oBAAM,WAAW,CAAC,CAAC,IAAI,OAAO;AAC9B,oBAAM,eAAe,CAAC,CAAC,IAAI,OAAO;AAClC,qBACE,6CAAC,UACE;AAAA,4BAAY,4CAAC,eAAY,SAAQ,SAAQ;AAAA,gBACzC,gBAAgB,4CAAC,eAAY,SAAQ,aAAY;AAAA,gBACjD,CAAC,YAAY,CAAC,gBAAgB,4CAAC,eAAY,SAAQ,QAAO;AAAA,iBAC7D;AAAA,YAEJ;AAAA,YACA,KAAK;AACH,qBACE,4CAAC,YAAAA,QAAK,MAAL,EAAU,MAAK,aACb,cAAI,KAAK,IAAI,MAAM,SAAS,EAAE,mBAAmB,GACpD;AAAA,YAEJ,KAAK;AACH,qBACE,6CAAC,SAAI,OAAO,EAAE,SAAS,QAAQ,YAAY,UAAU,KAAK,MAAM,GAC9D;AAAA,4DAAC,sBAAAC,SAAA,EAAc,OAAM,QAAO,MAAK,MAAK,SAAS,MAAM,OAAO,GAAG,GAAG;AAAA,gBAClE;AAAA,kBAAC,mBAAAK;AAAA,kBAAA;AAAA,oBACC,MAAK;AAAA,oBACL,OAAO,aAAa,IAAI,MAAM,WAAM;AAAA,oBACpC,YAAY,aAAa,IAAI;AAAA,oBAC7B,SAAS,MAAM,KAAK,aAAa,IAAI,GAAG;AAAA;AAAA,gBAC1C;AAAA,iBACF;AAAA,YAEJ;AACE,qBAAO;AAAA,UACX;AAAA,QACF;AAAA;AAAA,IACF;AAAA,KAEJ,GACF;AAEJ;AAeO,IAAM,iBAAgD,CAAC;AAAA,EAC5D;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF,MACE;AAAA,EAAC;AAAA;AAAA,IACC;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IAEA,sDAAC,eAAY,oBAAwC,QAAgB;AAAA;AACvE;;;ACxSF,IAAAG,gBAA8D;AAC9D,kBAA6C;AAC7C,IAAAC,eAAO;AACP,IAAAC,mBAAgD;AAEhD,yBAIO;AA8BH,IAAAC,sBAAA;AAbJ,IAAM,eAAoF;AAAA,EACxF,QAAW,EAAE,IAAI,4BAA6B,OAAO,wBAA2B,QAAQ,0BAA0B;AAAA,EAClH,SAAW,EAAE,IAAI,6BAA6B,OAAO,qBAA2B,QAAQ,2BAA2B;AAAA,EACnH,OAAW,EAAE,IAAI,6BAA6B,OAAO,uBAA2B,QAAQ,2BAA2B;AAAA,EACnH,WAAW,EAAE,IAAI,2BAA6B,OAAO,2BAA2B,QAAQ,yBAAyB;AACnH;AAEA,IAAMC,eAAkE,CAAC;AAAA,EACvE;AAAA,EACA;AACF,MAAM;AACJ,QAAM,KAAK,aAAa,OAAO;AAC/B,SACE;AAAA,IAAC;AAAA;AAAA,MACC,OAAO;AAAA,QACL,SAAS;AAAA,QACT,YAAY;AAAA,QACZ,SAAS;AAAA,QACT,cAAc;AAAA,QACd,UAAU;AAAA,QACV,YAAY;AAAA,QACZ,YAAY,GAAG;AAAA,QACf,OAAO,GAAG;AAAA,QACV,QAAQ,aAAa,GAAG,MAAM;AAAA,MAChC;AAAA,MAEC;AAAA;AAAA,EACH;AAEJ;AAEA,IAAM,iBAAgD,CAAC;AAAA,EACrD;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF,MAAM;AACJ,QAAM,WAAW,QAAQ,OAAO,KAAK;AACrC,QAAM,eAAe,QAAQ,OAAO,SAAS;AAE7C,SACE,8CAAC,SAAI,OAAO,EAAE,SAAS,QAAQ,YAAY,UAAU,KAAK,QAAQ,UAAU,OAAO,GACjF;AAAA,kDAAC,SAAI,OAAO,EAAE,SAAS,QAAQ,YAAY,UAAU,KAAK,MAAM,GAC7D;AAAA,gBAAU,6CAACA,cAAA,EAAY,OAAM,gBAAU,SAAQ,UAAS;AAAA,MACxD,CAAC,UAAU,WAAW,6CAACA,cAAA,EAAY,OAAM,WAAU,SAAQ,WAAU;AAAA,MACrE,CAAC,UAAU,CAAC,WAAW,YACtB,6CAACA,cAAA,EAAY,OAAM,SAAQ,SAAQ,SAAQ;AAAA,MAE5C,gBAAgB,6CAACA,cAAA,EAAY,OAAM,aAAY,SAAQ,aAAY;AAAA,OACtE;AAAA,IAEC,YAAY,gBACX;AAAA,MAAC;AAAA;AAAA,QACC,SAAS;AAAA,QACT,UAAU;AAAA,QACV,OAAO;AAAA,UACL,SAAS;AAAA,UACT,cAAc;AAAA,UACd,QAAQ;AAAA,UACR,YAAY;AAAA,UACZ,OAAO;AAAA,UACP,YAAY;AAAA,UACZ,UAAU;AAAA,UACV,QAAQ,SAAS,gBAAgB;AAAA,UACjC,SAAS,SAAS,MAAM;AAAA,QAC1B;AAAA,QACD;AAAA;AAAA,IAED;AAAA,IAGF;AAAA,MAAC;AAAA;AAAA,QACC,SAAS;AAAA,QACT,UAAU,CAAC,WAAW;AAAA,QACtB,OAAO;AAAA,UACL,SAAS;AAAA,UACT,cAAc;AAAA,UACd,QAAQ;AAAA,UACR,YAAY;AAAA,UACZ,OAAO;AAAA,UACP,YAAY;AAAA,UACZ,UAAU;AAAA,UACV,QAAS,CAAC,WAAW,SAAU,gBAAgB;AAAA,UAC/C,SAAU,CAAC,WAAW,SAAU,MAAM;AAAA,QACxC;AAAA,QACD;AAAA;AAAA,IAED;AAAA,IAEA;AAAA,MAAC;AAAA;AAAA,QACC,SAAS;AAAA,QACT,UAAU;AAAA,QACV,OAAO;AAAA,UACL,SAAS;AAAA,UACT,cAAc;AAAA,UACd,QAAQ;AAAA,UACR,YAAY;AAAA,UACZ,OAAO;AAAA,UACP,YAAY;AAAA,UACZ,UAAU;AAAA,UACV,QAAQ,SAAS,gBAAgB;AAAA,UACjC,SAAS,SAAS,MAAM;AAAA,UACxB,WAAW;AAAA,QACb;AAAA,QAEC,yBAAe,eAAe;AAAA;AAAA,IACjC;AAAA,KACF;AAEJ;AAcA,IAAM,qBAAwD,CAAC;AAAA,EAC7D;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF,MAAM;AACJ,QAAM;AAAA,IACJ;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EACF,QAAI,iCAAe,UAAU;AAE7B,QAAM,oBAAgB,sBAAoB,IAAI;AAC9C,QAAM,CAAC,mBAAmB,oBAAoB,QAAI,wBAAS,KAAK;AAEhE,QAAM,mBAAe,2BAAY,CAAC,SAAe;AAC/C,kBAAc,UAAU;AACxB,yBAAqB,IAAI;AAAA,EAC3B,GAAG,CAAC,CAAC;AAEL,QAAM,iBAAa,2BAAY,YAAY;AACzC,UAAM,OAAO,cAAc;AAC3B,QAAI,CAAC,KAAM;AACX,QAAI;AACF,YAAM,UAAU,IAAgB;AAChC,2BAAqB,KAAK;AAC1B,eAAS,IAAgB;AAAA,IAC3B,SAAS,KAAK;AACZ,gBAAU,GAAY;AAAA,IACxB;AAAA,EACF,GAAG,CAAC,WAAW,QAAQ,OAAO,CAAC;AAE/B,QAAM,oBAAgB;AAAA,IACpB,OAAO,SAAe;AACpB,UAAI;AACF,cAAM,UAAU,IAAgB;AAChC,6BAAqB,KAAK;AAC1B,cAAM,QAAQ,KAAK;AACnB,oBAAY,IAAgB;AAAA,MAC9B,SAAS,KAAK;AACZ,kBAAU,GAAY;AAAA,MACxB;AAAA,IACF;AAAA,IACA,CAAC,WAAW,SAAS,WAAW,OAAO;AAAA,EACzC;AAEA,QAAM,mBAAe,2BAAY,YAAY;AAC3C,QAAI;AACF,YAAM,kBAAkB;AACxB,2BAAqB,KAAK;AAAA,IAC5B,SAAS,KAAK;AACZ,gBAAU,GAAY;AAAA,IACxB;AAAA,EACF,GAAG,CAAC,mBAAmB,OAAO,CAAC;AAK/B,QAAM,oBAAgB,uBAAQ,MAAc;AAC1C,UAAM,kBAAkB,OAAO;AAAA,MAC7B,OAAO,QAAQ,OAAO,MAAM,UAAU,CAAC,CAAC,EAAE,OAAO,CAAC,CAAC,CAAC,MAAM,MAAM,OAAO;AAAA,IACzE;AACA,WAAO;AAAA,MACL,GAAG;AAAA,MACH,MAAM;AAAA,QACJ,GAAG,OAAO;AAAA,QACV,QAAQ;AAAA,UACN,OAAO,EAAE,MAAM,QAAQ,OAAO,gBAAgB;AAAA,UAC9C,MAAM,EAAE,MAAM,QAAQ,OAAO,OAAO;AAAA,UACpC,GAAG;AAAA,QACL;AAAA,QACA,cAAc;AAAA,UACZ,OAAO;AAAA,UACP,MAAM;AAAA,UACN,GAAG,OAAO,MAAM;AAAA,QAClB;AAAA,MACF;AAAA,IACF;AAAA,EACF,GAAG,CAAC,MAAM,CAAC;AAEX,MAAI,SAAS;AACX,WACE;AAAA,MAAC;AAAA;AAAA,QACC,OAAO;AAAA,UACL,SAAS;AAAA,UACT,YAAY;AAAA,UACZ,gBAAgB;AAAA,UAChB,QAAQ;AAAA,UACR,UAAU;AAAA,UACV,OAAO;AAAA,QACT;AAAA,QACD;AAAA;AAAA,IAED;AAAA,EAEJ;AAEA,MAAI,OAAO;AACT,WACE;AAAA,MAAC;AAAA;AAAA,QACC,OAAO;AAAA,UACL,SAAS;AAAA,UACT,OAAO;AAAA,UACP,YAAY;AAAA,UACZ,QAAQ;AAAA,UACR,cAAc;AAAA,UACd,QAAQ;AAAA,QACV;AAAA,QAEA;AAAA,uDAAC,YAAO,oCAAsB;AAAA,UAAS;AAAA,UAAE;AAAA;AAAA;AAAA,IAC3C;AAAA,EAEJ;AAGA,QAAM,aACJ,OAAO,OAAO,QACd,SAAS,QAAQ;AAAA,IACf,SAAS,CAAC;AAAA,IACV,MAAM,EAAE,OAAO,CAAC,EAAE;AAAA,EACpB;AAGF,SACE,6CAAC,8CACC;AAAA,IAAC;AAAA;AAAA,MACC,QAAQ;AAAA,MACR,MAAM;AAAA,MACN,UAAU;AAAA,MACV,WAAW;AAAA,MACX,WAAW;AAAA,QACT,eAAe,MACb;AAAA,UAAC;AAAA;AAAA,YACC;AAAA,YACA,SAAS;AAAA,YACT;AAAA,YACA,QAAQ,MAAM,KAAK,WAAW;AAAA,YAC9B,WAAW,MAAM,KAAK,cAAc,UAAkB;AAAA,YACtD,UAAU,MAAM,KAAK,aAAa;AAAA;AAAA,QACpC;AAAA,QAEF,YAAY,CAAC,EAAE,SAAS,MAAM,6CAAC,sCAAiB,UAAS;AAAA,QACzD,eAAe,CAAC,EAAE,UAAU,KAAK,MAC/B,6CAAC,0CAAoB,MAAa,UAAS;AAAA,MAE/C;AAAA;AAAA,EACF,GACF;AAEJ;AAmBO,IAAM,gBAA8C,CAAC;AAAA,EAC1D;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF,MACE;AAAA,EAAC;AAAA;AAAA,IACC;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IAEA;AAAA,MAAC;AAAA;AAAA,QACC;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA;AAAA,IACF;AAAA;AACF;;;AC7VF,IAAAC,gBAA8E;AAC9E,8BAOO;AACP,IAAAC,eAA6C;AAC7C,IAAAA,eAAO;AACP,IAAAC,sBAIO;AACP,IAAAC,mBAIO;AAOP,IAAAC,qBAAsB;AACtB,IAAAC,yBAA0B;AAC1B,IAAAC,2BAA4B;AAC5B,IAAAC,sBAAuB;AACvB,IAAAC,eAAiB;AACjB,IAAAC,mBAAqB;AACrB,IAAAC,eAAiB;AACjB,IAAAC,0BAA2B;AAC3B,IAAAC,qBAAsB;AACtB,IAAAC,gBAAkB;AAClB,IAAAC,gBAAwD;AAcpD,IAAAC,sBAAA;AARJ,IAAMC,eAAqE,CAAC,EAAE,QAAQ,MAAM;AAC1F,QAAM,SACJ,YAAY,cACR,EAAE,YAAY,2BAA2B,OAAO,2BAA2B,QAAQ,oCAAoC,IACvH,YAAY,UACV,EAAE,YAAY,2BAA2B,OAAO,2BAA2B,QAAQ,oCAAoC,IACvH,EAAE,YAAY,2BAA2B,OAAO,2BAA2B,QAAQ,oCAAoC;AAC/H,SACE;AAAA,IAAC;AAAA;AAAA,MACC,OAAO;AAAA,QACL,GAAG;AAAA,QACH,SAAS;AAAA,QACT,YAAY;AAAA,QACZ,SAAS;AAAA,QACT,cAAc;AAAA,QACd,UAAU;AAAA,QACV,YAAY;AAAA,QACZ,aAAa;AAAA,QACb,YAAY;AAAA,MACd;AAAA,MAEC,sBAAY,cAAc,cAAc,YAAY,UAAU,UAAU;AAAA;AAAA,EAC3E;AAEJ;AAQA,IAAMC,gBAAoF;AAAA,EACxF,QAAW,EAAE,IAAI,4BAA6B,OAAO,wBAA2B,QAAQ,0BAA0B;AAAA,EAClH,SAAW,EAAE,IAAI,6BAA6B,OAAO,qBAA2B,QAAQ,2BAA2B;AAAA,EACnH,OAAW,EAAE,IAAI,6BAA6B,OAAO,uBAA2B,QAAQ,2BAA2B;AAAA,EACnH,WAAW,EAAE,IAAI,2BAA6B,OAAO,2BAA2B,QAAQ,yBAAyB;AACnH;AAEA,IAAM,oBAAwE,CAAC,EAAE,OAAO,QAAQ,MAAM;AACpG,QAAM,KAAKA,cAAa,OAAO;AAC/B,SACE;AAAA,IAAC;AAAA;AAAA,MACC,OAAO;AAAA,QACL,SAAS;AAAA,QACT,YAAY;AAAA,QACZ,SAAS;AAAA,QACT,cAAc;AAAA,QACd,UAAU;AAAA,QACV,YAAY;AAAA,QACZ,YAAY,GAAG;AAAA,QACf,OAAO,GAAG;AAAA,QACV,QAAQ,aAAa,GAAG,MAAM;AAAA,MAChC;AAAA,MAEC;AAAA;AAAA,EACH;AAEJ;AAWA,IAAMC,kBAAgD,CAAC,EAAE,QAAQ,SAAS,QAAQ,QAAQ,WAAW,SAAS,MAAM;AAClH,QAAM,WAAW,QAAQ,OAAO,KAAK;AACrC,QAAM,eAAe,QAAQ,OAAO,SAAS;AAC7C,SACE,8CAAC,SAAI,OAAO,EAAE,SAAS,QAAQ,YAAY,UAAU,KAAK,QAAQ,UAAU,OAAO,GACjF;AAAA,kDAAC,SAAI,OAAO,EAAE,SAAS,QAAQ,YAAY,UAAU,KAAK,MAAM,GAC7D;AAAA,gBAAU,6CAAC,qBAAkB,OAAM,gBAAU,SAAQ,UAAS;AAAA,MAC9D,CAAC,UAAU,WAAW,6CAAC,qBAAkB,OAAM,WAAU,SAAQ,WAAU;AAAA,MAC3E,CAAC,UAAU,CAAC,WAAW,YAAY,6CAAC,qBAAkB,OAAM,SAAQ,SAAQ,SAAQ;AAAA,MACpF,gBAAgB,6CAAC,qBAAkB,OAAM,aAAY,SAAQ,aAAY;AAAA,OAC5E;AAAA,IACC,YAAY,gBACX;AAAA,MAAC;AAAA;AAAA,QACC,SAAS;AAAA,QACT,UAAU;AAAA,QACV,OAAO;AAAA,UACL,SAAS;AAAA,UACT,cAAc;AAAA,UACd,QAAQ;AAAA,UACR,YAAY;AAAA,UACZ,OAAO;AAAA,UACP,YAAY;AAAA,UACZ,UAAU;AAAA,UACV,QAAQ,SAAS,gBAAgB;AAAA,UACjC,SAAS,SAAS,MAAM;AAAA,QAC1B;AAAA,QACD;AAAA;AAAA,IAED;AAAA,IAEF;AAAA,MAAC;AAAA;AAAA,QACC,SAAS;AAAA,QACT,UAAU,CAAC,WAAW;AAAA,QACtB,OAAO;AAAA,UACL,SAAS;AAAA,UACT,cAAc;AAAA,UACd,QAAQ;AAAA,UACR,YAAY;AAAA,UACZ,OAAO;AAAA,UACP,YAAY;AAAA,UACZ,UAAU;AAAA,UACV,QAAS,CAAC,WAAW,SAAU,gBAAgB;AAAA,UAC/C,SAAU,CAAC,WAAW,SAAU,MAAM;AAAA,QACxC;AAAA,QACD;AAAA;AAAA,IAED;AAAA,IACA;AAAA,MAAC;AAAA;AAAA,QACC,SAAS;AAAA,QACT,UAAU;AAAA,QACV,OAAO;AAAA,UACL,SAAS;AAAA,UACT,cAAc;AAAA,UACd,QAAQ;AAAA,UACR,YAAY;AAAA,UACZ,OAAO;AAAA,UACP,YAAY;AAAA,UACZ,UAAU;AAAA,UACV,QAAQ,SAAS,gBAAgB;AAAA,UACjC,SAAS,SAAS,MAAM;AAAA,UACxB,WAAW;AAAA,QACb;AAAA,QAEC,yBAAe,eAAe;AAAA;AAAA,IACjC;AAAA,KACF;AAEJ;AAMA,IAAM,gBAAqC;AAAA,EACzC,UAAU;AAAA,EACV,KAAK;AAAA,EACL,SAAS;AAAA,EACT,YAAY;AAAA,EACZ,KAAK;AAAA,EACL,SAAS;AAAA,EACT,YAAY;AAAA,EACZ,cAAc;AAAA,EACd,QAAQ;AAAA,EACR,YAAY;AACd;AAQA,IAAM,UAAU;AAAA,EACd,EAAE,KAAK,QAAQ,OAAO,OAAO;AAAA,EAC7B,EAAE,KAAK,eAAe,OAAO,eAAe;AAAA,EAC5C,EAAE,KAAK,UAAU,OAAO,SAAS;AAAA,EACjC,EAAE,KAAK,aAAa,OAAO,UAAU;AAAA,EACrC,EAAE,KAAK,WAAW,OAAO,WAAW,sBAAsB,KAAK;AACjE;AAWA,IAAM,mBAAoD,CAAC,EAAE,oBAAoB,WAAW,MAAM;AAChG,QAAM,eAAW,qCAAY;AAC7B,QAAM,EAAE,UAAU,SAAS,OAAO,eAAe,eAAe,eAAe,QAAQ,QACrF,kCAAgB,kBAAkB;AAEpC,QAAM,CAAC,YAAY,aAAa,QAAI,wBAAS,sBAAsB,EAAE;AACrE,QAAM,CAAC,YAAY,aAAa,QAAI,wBAAS,KAAK;AAClD,QAAM,CAAC,YAAY,aAAa,QAAI,wBAAS,EAAE;AAC/C,QAAM,CAAC,YAAY,aAAa,QAAI,wBAAS,sBAAsB,EAAE;AACrE,QAAM,CAAC,aAAa,cAAc,QAAI,wBAAwB,IAAI;AAClE,QAAM,CAAC,UAAU,WAAW,QAAI,wBAAS,KAAK;AAC9C,QAAM,CAAC,UAAU,WAAW,QAAI,wBAAwB,IAAI;AAE5D,QAAM,eAAe,MAAM,KAAK,cAAc,cAAc,MAAS;AAErE,QAAM,eAAe,YAAY;AAC/B,mBAAe,IAAI;AACnB,QAAI,CAAC,WAAW,KAAK,GAAG;AAAE,qBAAe,kBAAkB;AAAG;AAAA,IAAQ;AACtE,QAAI,CAAC,WAAW,KAAK,GAAG;AAAE,qBAAe,0BAA0B;AAAG;AAAA,IAAQ;AAC9E,gBAAY,IAAI;AAChB,QAAI;AACF,YAAM,QAAgC;AAAA,QACpC,MAAM,WAAW,KAAK;AAAA,QACtB,aAAa,WAAW,KAAK;AAAA,QAC7B,MAAM,EAAE,SAAS,CAAC,GAAG,MAAM,EAAE,OAAO,CAAC,EAAE,EAAE;AAAA,MAC3C;AACA,YAAM,UAAU,MAAM,cAAc,KAAK;AACzC,oBAAc,KAAK;AACnB,oBAAc,EAAE;AAChB,oBAAc,sBAAsB,EAAE;AACtC,eAAS,IAAI,QAAQ,GAAG,IAAI,EAAE,OAAO,EAAE,aAAa,QAAQ,MAAM,KAAK,EAAE,CAAC;AAAA,IAC5E,SAAS,KAAK;AACZ,qBAAgB,IAAc,OAAO;AAAA,IACvC,UAAE;AACA,kBAAY,KAAK;AAAA,IACnB;AAAA,EACF;AAEA,QAAM,eAAe,OAAO,QAAgB;AAC1C,QAAI,CAAC,QAAQ,gDAAgD,EAAG;AAChE,gBAAY,GAAG;AACf,QAAI;AACF,YAAM,cAAc,GAAG;AAAA,IACzB,UAAE;AACA,kBAAY,IAAI;AAAA,IAClB;AAAA,EACF;AAEA,QAAM,OAAqB,SAAS,IAAI,CAAC,OAAO,EAAE,GAAG,GAAG,IAAI,EAAE,IAAI,EAAE;AAEpE,SACE,6CAAC,SAAI,OAAO,EAAE,UAAU,UAAU,QAAQ,UAAU,SAAS,YAAY,GACvE,wDAAC,iBAAAC,QAAS,OAAT,EAAe,OAAM,KACpB;AAAA,kDAAC,iBAAAA,QAAS,QAAT,EAAgB,gBAAe,iBAAgB,YAAW,UACzD;AAAA,oDAAC,iBAAAA,QAAS,QAAT,EAAgB,OAAM,KAAI,YAAW,UACnC;AAAA;AAAA,QACD,6CAAC,aAAAC,QAAK,UAAL,EAAc,IAAG,MAAK,2BAAa;AAAA,SACtC;AAAA,MACA;AAAA,QAAC,uBAAAC;AAAA,QAAA;AAAA,UACC,OAAM;AAAA,UACN,UAAU,6CAAC,8BAAa;AAAA,UACxB,SAAS,MAAM,cAAc,CAAC,MAAM,CAAC,CAAC;AAAA;AAAA,MACxC;AAAA,OACF;AAAA,IAEC,cACC,6CAAC,aAAAC,SAAA,EAAK,YAAW,KACf,wDAAC,iBAAAH,QAAS,OAAT,EAAe,OAAM,KACpB;AAAA,mDAAC,aAAAC,QAAK,aAAL,EAAiB,IAAG,MAAK,QAAM,MAAC,iCAAmB;AAAA,MACnD,eAAe,6CAAC,aAAAA,QAAK,MAAL,EAAU,MAAK,YAAY,uBAAY;AAAA,MACxD,8CAAC,iBAAAD,QAAS,QAAT,EAAgB,OAAM,KACrB;AAAA,qDAAC,SAAI,OAAO,EAAE,MAAM,EAAE,GACpB,wDAAC,iBAAAA,QAAS,OAAT,EAAe,OAAM,MACpB;AAAA,uDAAC,cAAAI,SAAA,EAAM,SAAQ,uBAAsB,kBAAI;AAAA,UACzC;AAAA,YAAC,mBAAAC;AAAA,YAAA;AAAA,cACC,IAAG;AAAA,cACH,OAAO;AAAA,cACP,UAAU,CAAC,MAAM,cAAc,EAAE,OAAO,KAAK;AAAA,cAC7C,aAAY;AAAA;AAAA,UACd;AAAA,WACF,GACF;AAAA,QACA,6CAAC,SAAI,OAAO,EAAE,MAAM,EAAE,GACpB,wDAAC,iBAAAL,QAAS,OAAT,EAAe,OAAM,MACpB;AAAA,uDAAC,cAAAI,SAAA,EAAM,SAAQ,uBAAsB,0BAAY;AAAA,UACjD;AAAA,YAAC,mBAAAC;AAAA,YAAA;AAAA,cACC,IAAG;AAAA,cACH,OAAO;AAAA,cACP,UAAU,CAAC,MAAM,cAAc,EAAE,OAAO,KAAK;AAAA,cAC7C,aAAY;AAAA;AAAA,UACd;AAAA,WACF,GACF;AAAA,SACF;AAAA,MACA,8CAAC,iBAAAL,QAAS,QAAT,EAAgB,OAAM,KACrB;AAAA;AAAA,UAAC,uBAAAE;AAAA,UAAA;AAAA,YACC,OAAO,WAAW,mBAAc;AAAA,YAChC,SAAS,MAAM,KAAK,aAAa;AAAA,YACjC,YAAY;AAAA;AAAA,QACd;AAAA,QACA,6CAAC,yBAAAI,SAAA,EAAgB,OAAM,UAAS,SAAS,MAAM,cAAc,KAAK,GAAG;AAAA,SACvE;AAAA,OACF,GACF;AAAA,IAGF,8CAAC,iBAAAN,QAAS,QAAT,EAAgB,OAAM,KAAI,YAAW,UACpC;AAAA,mDAAC,SAAI,OAAO,EAAE,MAAM,GAAG,UAAU,QAAQ,GACvC;AAAA,QAAC,mBAAAK;AAAA,QAAA;AAAA,UACC,OAAO;AAAA,UACP,UAAU,CAAC,MAAM,cAAc,EAAE,OAAO,KAAK;AAAA,UAC7C,aAAY;AAAA;AAAA,MACd,GACF;AAAA,MACA;AAAA,QAAC,yBAAAC;AAAA,QAAA;AAAA,UACC,OAAM;AAAA,UACN,UAAU,6CAAC,4BAAW;AAAA,UACtB,SAAS;AAAA;AAAA,MACX;AAAA,MACA;AAAA,QAAC,oBAAAC;AAAA,QAAA;AAAA,UACC,OAAM;AAAA,UACN,SAAS,MAAM;AAAE,0BAAc,EAAE;AAAG,iBAAK,cAAc,MAAS;AAAA,UAAG;AAAA;AAAA,MACrE;AAAA,MACA,6CAAC,oBAAAA,SAAA,EAAW,OAAM,WAAU,SAAS,MAAM,KAAK,QAAQ,GAAG;AAAA,OAC7D;AAAA,IAEC,SAAS,6CAAC,aAAAN,QAAK,MAAL,EAAU,MAAK,YAAY,iBAAM;AAAA,IAE3C,UACC,6CAAC,SAAI,OAAO,EAAE,SAAS,QAAQ,gBAAgB,UAAU,SAAS,OAAO,GACvE,uDAAC,wBAAAO,SAAA,EAAe,GAClB,IACE,SAAS,WAAW,IACtB,6CAAC,iBAAAR,QAAS,OAAT,EAAe,OAAM,KAAI,YAAW,UACnC,uDAAC,aAAAC,QAAK,MAAL,EAAU,MAAK,aAAY,qCAAuB,GACrD,IAEA;AAAA,MAAC,mBAAAQ;AAAA,MAAA;AAAA,QACC,SAAS;AAAA,QACT;AAAA,QACA,cAAc,CAAC,KAAiB,WAAW;AACzC,kBAAQ,OAAO,KAAK;AAAA,YAClB,KAAK;AACH,qBAAO,6CAAC,aAAAR,QAAK,MAAL,EAAU,QAAM,MAAE,cAAI,MAAM,MAAK;AAAA,YAC3C,KAAK;AACH,qBACE;AAAA,gBAAC;AAAA;AAAA,kBACC,OAAO;AAAA,oBACL,YAAY;AAAA,oBACZ,SAAS;AAAA,oBACT,cAAc;AAAA,oBACd,UAAU;AAAA,oBACV,YAAY;AAAA,kBACd;AAAA,kBAEC,cAAI,MAAM;AAAA;AAAA,cACb;AAAA,YAEJ,KAAK,UAAU;AACb,oBAAM,WAAW,CAAC,CAAC,IAAI,OAAO;AAC9B,oBAAM,eAAe,CAAC,CAAC,IAAI,OAAO;AAClC,qBACE,8CAAC,UACE;AAAA,4BAAY,6CAACJ,cAAA,EAAY,SAAQ,SAAQ;AAAA,gBACzC,gBAAgB,6CAACA,cAAA,EAAY,SAAQ,aAAY;AAAA,gBACjD,CAAC,YAAY,CAAC,gBAAgB,6CAACA,cAAA,EAAY,SAAQ,QAAO;AAAA,iBAC7D;AAAA,YAEJ;AAAA,YACA,KAAK;AACH,qBACE,6CAAC,aAAAI,QAAK,MAAL,EAAU,MAAK,aACb,cAAI,KAAK,IAAI,MAAM,SAAS,EAAE,mBAAmB,GACpD;AAAA,YAEJ,KAAK;AACH,qBACE,8CAAC,SAAI,OAAO,EAAE,SAAS,QAAQ,YAAY,UAAU,KAAK,MAAM,GAC9D;AAAA;AAAA,kBAAC,uBAAAC;AAAA,kBAAA;AAAA,oBACC,OAAM;AAAA,oBACN,MAAK;AAAA,oBACL,SAAS,MACP,SAAS,IAAI,IAAI,GAAG,IAAI,EAAE,OAAO,EAAE,aAAa,IAAI,MAAM,KAAK,EAAE,CAAC;AAAA;AAAA,gBAEtE;AAAA,gBACA;AAAA,kBAAC,oBAAAK;AAAA,kBAAA;AAAA,oBACC,MAAK;AAAA,oBACL,OAAO,aAAa,IAAI,MAAM,WAAM;AAAA,oBACpC,YAAY,aAAa,IAAI;AAAA,oBAC7B,SAAS,MAAM,KAAK,aAAa,IAAI,GAAG;AAAA;AAAA,gBAC1C;AAAA,iBACF;AAAA,YAEJ;AACE,qBAAO;AAAA,UACX;AAAA,QACF;AAAA;AAAA,IACF;AAAA,KAEJ,GACF;AAEJ;AAWA,IAAM,qBAAwD,CAAC,EAAE,QAAQ,WAAW,MAAM;AACxF,QAAM,EAAE,WAAW,QAAI,mCAAkC;AACzD,QAAM,eAAW,qCAAY;AAC7B,QAAM,eAAW,qCAAY;AAC7B,QAAM,cACH,SAAS,OAA2C,eAAe,cAAc;AAEpF,QAAM;AAAA,IACJ;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EACF,QAAI,iCAAe,UAAW;AAE9B,QAAM,oBAAgB,sBAAoB,IAAI;AAC9C,QAAM,CAAC,mBAAmB,oBAAoB,QAAI,wBAAS,KAAK;AAEhE,QAAM,mBAAe,2BAAY,CAAC,SAAe;AAC/C,kBAAc,UAAU;AACxB,yBAAqB,IAAI;AAAA,EAC3B,GAAG,CAAC,CAAC;AAEL,QAAM,iBAAa,2BAAY,YAAY;AACzC,UAAM,OAAO,cAAc;AAC3B,QAAI,CAAC,KAAM;AACX,QAAI;AACF,YAAM,UAAU,IAAgB;AAChC,2BAAqB,KAAK;AAAA,IAC5B,SAAS,KAAK;AACZ,cAAQ,MAAM,sCAAsC,GAAG;AAAA,IACzD;AAAA,EACF,GAAG,CAAC,SAAS,CAAC;AAEd,QAAM,oBAAgB;AAAA,IACpB,OAAO,SAAe;AACpB,UAAI;AACF,cAAM,UAAU,IAAgB;AAChC,6BAAqB,KAAK;AAC1B,cAAM,QAAQ,KAAK;AAAA,MACrB,SAAS,KAAK;AACZ,gBAAQ,MAAM,yCAAyC,GAAG;AAAA,MAC5D;AAAA,IACF;AAAA,IACA,CAAC,WAAW,OAAO;AAAA,EACrB;AAEA,QAAM,mBAAe,2BAAY,YAAY;AAC3C,QAAI;AACF,YAAM,kBAAkB;AACxB,2BAAqB,KAAK;AAAA,IAC5B,SAAS,KAAK;AACZ,cAAQ,MAAM,wCAAwC,GAAG;AAAA,IAC3D;AAAA,EACF,GAAG,CAAC,iBAAiB,CAAC;AAItB,QAAM,oBAAgB,uBAAQ,MAAc;AAC1C,UAAM,kBAAkB,OAAO;AAAA,MAC7B,OAAO,QAAQ,OAAO,MAAM,UAAU,CAAC,CAAC,EAAE,OAAO,CAAC,CAAC,CAAC,MAAM,MAAM,OAAO;AAAA,IACzE;AACA,WAAO;AAAA,MACL,GAAG;AAAA,MACH,MAAM;AAAA,QACJ,GAAG,OAAO;AAAA,QACV,QAAQ;AAAA,UACN,OAAO,EAAE,MAAM,QAAQ,OAAO,gBAAgB;AAAA,UAC9C,MAAM,EAAE,MAAM,QAAQ,OAAO,OAAO;AAAA,UACpC,GAAG;AAAA,QACL;AAAA,QACA,cAAc;AAAA,UACZ,OAAO;AAAA,UACP,MAAM;AAAA,UACN,GAAG,OAAO,MAAM;AAAA,QAClB;AAAA,MACF;AAAA,IACF;AAAA,EACF,GAAG,CAAC,MAAM,CAAC;AAEX,MAAI,SAAS;AACX,WACE;AAAA,MAAC;AAAA;AAAA,QACC,OAAO;AAAA,UACL,SAAS;AAAA,UACT,YAAY;AAAA,UACZ,gBAAgB;AAAA,UAChB,QAAQ;AAAA,UACR,UAAU;AAAA,UACV,OAAO;AAAA,QACT;AAAA,QACD;AAAA;AAAA,IAED;AAAA,EAEJ;AAEA,MAAI,OAAO;AACT,WACE;AAAA,MAAC;AAAA;AAAA,QACC,OAAO;AAAA,UACL,SAAS;AAAA,UACT,OAAO;AAAA,UACP,YAAY;AAAA,UACZ,QAAQ;AAAA,UACR,cAAc;AAAA,UACd,QAAQ;AAAA,QACV;AAAA,QAEA;AAAA,uDAAC,YAAO,oCAAsB;AAAA,UAAS;AAAA,UAAE;AAAA;AAAA;AAAA,IAC3C;AAAA,EAEJ;AAEA,QAAM,aACJ,OAAO,OAAO,QACd,SAAS,QAAQ;AAAA,IACf,SAAS,CAAC;AAAA,IACV,MAAM,EAAE,OAAO,CAAC,EAAE;AAAA,EACpB;AAEF,SACE,8CAAC,SAAI,OAAO,EAAE,SAAS,QAAQ,eAAe,UAAU,QAAQ,OAAO,GACrE;AAAA,kDAAC,SAAI,OAAO,eACT;AAAA;AAAA,MACA,cAAc,6CAAC,aAAAN,QAAK,MAAL,EAAU,MAAK,aAAY,eAAC;AAAA,MAC5C;AAAA,QAAC,oBAAAM;AAAA,QAAA;AAAA,UACC,OAAM;AAAA,UACN,MAAM,6CAAC,+BAAc;AAAA,UACrB,cAAa;AAAA,UACb,SAAS,MAAM,SAAS,GAAG;AAAA;AAAA,MAC7B;AAAA,MACA,6CAAC,aAAAN,QAAK,MAAL,EAAU,MAAK,aAAY,eAAC;AAAA,MAC7B,6CAAC,aAAAA,QAAK,MAAL,EAAU,QAAM,MAAE,uBAAY;AAAA,OACjC;AAAA,IACA,6CAAC,SAAI,OAAO,EAAE,MAAM,GAAG,UAAU,SAAS,GACxC,uDAAC,+CACC;AAAA,MAAC;AAAA;AAAA,QACC,QAAQ;AAAA,QACR,MAAM;AAAA,QACN,UAAU;AAAA,QACV,WAAW;AAAA,QACX,WAAW;AAAA,UACT,eAAe,MACb;AAAA,YAACF;AAAA,YAAA;AAAA,cACC;AAAA,cACA,SAAS;AAAA,cACT;AAAA,cACA,QAAQ,MAAM,KAAK,WAAW;AAAA,cAC9B,WAAW,MAAM,KAAK,cAAc,UAAkB;AAAA,cACtD,UAAU,MAAM,KAAK,aAAa;AAAA;AAAA,UACpC;AAAA,UAEF,YAAY,CAAC,EAAE,SAAS,MAAM,6CAAC,uCAAiB,UAAS;AAAA,UACzD,eAAe,CAAC,EAAE,UAAU,KAAK,MAC/B,6CAAC,2CAAoB,MAAa,UAAS;AAAA,QAE/C;AAAA;AAAA,IACF,GACF,GACF;AAAA,KACF;AAEJ;AAYA,IAAM,4BAAsE,CAAC;AAAA,EAC3E;AAAA,EACA;AAAA,EACA;AACF,MACE,8CAAC,kCACC;AAAA;AAAA,IAAC;AAAA;AAAA,MACC,MAAK;AAAA,MACL,SACE,6CAAC,oBAAiB,oBAAwC,YAAwB;AAAA;AAAA,EAEtF;AAAA,EACA;AAAA,IAAC;AAAA;AAAA,MACC,MAAK;AAAA,MACL,SAAS,6CAAC,sBAAmB,QAAgB,YAAwB;AAAA;AAAA,EACvE;AAAA,GACF;AAqBK,IAAM,uBAA4D,CAAC;AAAA,EACxE;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF,MACE;AAAA,EAAC;AAAA;AAAA,IACC;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IAEA,uDAAC,yCAAc,UAAU,WACvB;AAAA,MAAC;AAAA;AAAA,QACC;AAAA,QACA;AAAA,QACA;AAAA;AAAA,IACF,GACF;AAAA;AACF;","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
|
-
|
|
538
|
+
Switch,
|
|
539
539
|
Route,
|
|
540
|
-
|
|
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
|
|
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
|
-
|
|
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: () =>
|
|
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
|
|
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: () =>
|
|
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(
|
|
1058
|
+
}) => /* @__PURE__ */ jsxs3(Switch, { children: [
|
|
1059
1059
|
/* @__PURE__ */ jsx3(
|
|
1060
1060
|
Route,
|
|
1061
1061
|
{
|
|
1062
|
+
exact: true,
|
|
1062
1063
|
path: "/",
|
|
1063
|
-
|
|
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
|
-
|
|
1071
|
+
render: () => /* @__PURE__ */ jsx3(ContentEditorRoute, { config, backButton })
|
|
1071
1072
|
}
|
|
1072
1073
|
)
|
|
1073
1074
|
] });
|
package/dist/index.mjs.map
CHANGED
|
@@ -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.
|
|
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.
|
|
29
|
-
"@commercetools-demo/puck-editor": "^0.
|
|
30
|
-
"@commercetools-demo/puck-types": "^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": "^
|
|
53
|
-
"@types/react-dom": "^
|
|
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
|
}
|