@netlisian/softconfig 0.1.4 → 0.1.6

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.
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../src/puck/index.tsx","../../src/puck/store/index.tsx","../../src/puck/store/slices/builder.tsx","../../src/puck/lib/get-root-props.ts","../../src/puck/lib/builder/root-config.tsx","../../src/puck/lib/get-field-settings.tsx","../../src/puck/lib/get-settings-by-path.ts","../../src/puck/lib/array-field-utils.ts","../../src/puck/lib/custom-fields.ts","../../src/puck/context/useStore.ts","../../src/puck/lib/apply-mapping.ts","../../src/puck/lib/set-prop-by-path.ts","../../src/puck/lib/builder/generate-field-options.ts","../../src/puck/components/error-boundary/index.tsx","../../src/puck/lib/get-class-name-factory.ts","css-module:/media/manual_mount/osamuProjects/netlisian/packages/soft-config/src/puck/components/error-boundary/styles.module.css#css-module","../../src/puck/lib/builder/builder-config.tsx","../../src/puck/lib/soft-component-constants.ts","../../src/puck/lib/strip-id.ts","../../src/puck/lib/soft-component-from-appstate.ts","../../src/puck/lib/generate-id.ts","../../src/puck/lib/component-key.ts","../../src/puck/lib/soft-component-to-appstate.ts","../../src/puck/lib/root-droppable-id.ts","../../src/puck/components/soft-render/index.tsx","../../src/puck/lib/create-versioned-component-config.tsx","../../src/puck/lib/builder/sub-component-decomposer.tsx","../../src/puck/lib/builder/resolve-soft-component-data.ts","../../src/puck/lib/decompose-soft-component.ts","../../src/puck/lib/demolish-soft-component.ts","../../src/puck/lib/build-initial-soft-components.ts","../../src/puck/lib/edit-visibility-utils.ts","../../src/puck/context/storeProvider.tsx","../../src/puck/actions/useBuild.tsx","../../src/puck/lib/notify.ts","../../src/puck/hooks/useActionEvent.ts","../../src/puck/actions/useRemodel.tsx","../../src/puck/actions/useComplete.tsx","../../src/puck/actions/useCancel.tsx","../../src/puck/actions/useInspect.tsx","../../src/puck/actions/useDecompose.tsx","../../src/puck/actions/useDemolish.tsx","../../src/puck/actions/useSetDefaultVersion.tsx","../../src/puck/overrides/Header.tsx","css-module:/media/manual_mount/osamuProjects/netlisian/packages/soft-config/src/puck/overrides/Header.module.css#css-module","../../src/puck/actions/usePublish.tsx","../../src/puck/overrides/ActionBar.tsx","css-module:/media/manual_mount/osamuProjects/netlisian/packages/soft-config/src/puck/overrides/ActionBar.module.css#css-module","../../src/puck/overrides/DrawerItem.tsx","../../src/puck/lib/confirm.ts","css-module:/media/manual_mount/osamuProjects/netlisian/packages/soft-config/src/puck/overrides/DrawerItem.module.css#css-module","../../src/puck/components/modal/index.tsx","css-module:/media/manual_mount/osamuProjects/netlisian/packages/soft-config/src/puck/components/modal/styles.module.css#css-module","../../src/puck/overrides/Drawer.tsx","css-module:/media/manual_mount/osamuProjects/netlisian/packages/soft-config/src/puck/overrides/Drawer.module.css#css-module","../../src/puck/lib/action-callback.ts","../../src/puck/lib/dissolve-all-soft-components.ts","../../src/puck/lib/resolve-soft-config.ts"],"sourcesContent":["// export store\nexport * from \"./store\";\n\n// export context and selector\nexport { SoftConfigProvider } from \"./context/storeProvider\";\nexport { useSoftConfig, createUseSoftConfig } from \"./context/useStore\";\n\n// export types\nexport type { SoftComponent, SoftComponents, VersionedSoftComponent } from \"./types/SoftComponent\";\nexport type { Overrides } from \"./types/Overrides\";\nexport type { BuilderConfig, BuilderComponentConfig, BuilderRootConfig } from \"./types/BuilderConfig\";\nexport type { ActionEventPayload, OnActionsCallback } from \"./types/ActionEvents\";\nexport type {\n\tCustomFieldDefinition,\n\tCustomFieldReturnType,\n\tCustomFields,\n\tFieldSettings,\n\tSoftFieldDefinition,\n\tSoftFieldSettings,\n} from \"./types/SoftFields\";\n\n// export actions\nexport * from \"./actions\";\n\n// export overrides\nexport * from \"./overrides\";\n\n// export notification handler\nexport { setNotificationHandler, notify } from \"./lib/notify\";\n\n// export confirmation handler\nexport { setConfirmHandler, confirm } from \"./lib/confirm\";\n\n// export action callback\nexport { createActionCallback } from \"./lib/action-callback\";\n\nexport { resolveSoftConfig } from \"./lib/resolve-soft-config\";\n\n// Export modal\nexport { Modal } from \"./components/modal\";\n\n// Export mapping utilities for overrides.map consumers\nexport { filterToOptionsForFrom } from \"./lib/builder/generate-field-options\";\n\n// Export apply-mapping utilities\nexport { applyMapping, resolveValueByPath } from \"./lib/apply-mapping\";\nexport type { MapEntry, ApplyMappingOptions, ApplyMappingResult } from \"./types/Mapping\";","import { create, StoreApi } from \"zustand\";\r\nimport { subscribeWithSelector } from \"zustand/middleware\";\r\nimport type {\r\n // eslint-disable-next-line no-redeclare\r\n History,\r\n ComponentConfig,\r\n Config,\r\n DefaultComponentProps,\r\n} from \"@measured/puck\";\r\n\r\nimport { BuildersSlice, createBuildersSlice } from \"./slices/builder\";\r\nimport { SoftComponent, SoftComponents } from \"../types/SoftComponent\";\r\nimport { createVersionedComponentConfig } from \"../lib/create-versioned-component-config\";\r\nimport {\r\n buildInitialSoftComponents,\r\n hydrateSoftComponentsTransforms,\r\n buildReverseDependencyGraph,\r\n} from \"../lib/build-initial-soft-components\";\r\nimport { clearEditVisibility, setEditVisibility } from \"../lib/edit-visibility-utils\";\r\nimport { Overrides } from \"../types/Overrides\";\r\nimport { OnActionsCallback } from \"../types/ActionEvents\";\r\nimport type { CustomFields } from \"../types/SoftFields\";\r\n\r\ntype Status = \"building\" | \"remodeling\" | \"ready\" | \"inspecting\";\r\n\r\nexport type AppStore = {\r\n softConfig: Config;\r\n softComponents: SoftComponents;\r\n hydratedSoftComponents?: SoftComponents;\r\n state: Status;\r\n originalHistory: History[];\r\n storedConfig?: Config;\r\n overrides: Overrides;\r\n customFields: CustomFields;\r\n onActions?: OnActionsCallback;\r\n itemSelector: {\r\n index: number;\r\n zone: string;\r\n } | null;\r\n setItemSelector: (selector: { index: number; zone: string } | null) => void;\r\n\r\n originalItem: DefaultComponentProps | null;\r\n setOriginalItem: (item: DefaultComponentProps | null) => void;\r\n\r\n storeHistory: (history: History[]) => void;\r\n removeHistory: () => void;\r\n\r\n setSoftComponentConfig: (\r\n key: string,\r\n config: ComponentConfig,\r\n category?: string\r\n ) => void;\r\n\r\n removeSoftComponentConfig: (key: string) => void;\r\n removeSoftComponentVersion: (key: string, version: string) => void;\r\n setSoftCategoryConfig: (\r\n key: string,\r\n category: {\r\n components?: string[];\r\n visible?: boolean;\r\n defaultExpanded?: boolean;\r\n title?: string;\r\n }\r\n ) => void;\r\n removeSoftCategoryConfig: (key: string) => void;\r\n builder: BuildersSlice;\r\n setSoftComponent: (\r\n key: string,\r\n version: string,\r\n component: SoftComponent\r\n ) => void;\r\n setSoftComponents: (components: SoftComponents) => void;\r\n hydrateTransforms: () => void;\r\n setSoftComponentDefaultVersion: (key: string, version: string) => void;\r\n removeSoftComponent: (key: string) => void;\r\n editingComponent: string | null;\r\n editingComponentId: string | null;\r\n editableComponentIds: Set<string>;\r\n setEditableComponentIds: (ids: Set<string>) => void;\r\n addEditableComponentId: (id: string) => void;\r\n clearEditingState: () => void;\r\n\r\n /**\r\n * Reverse dependency graph: componentName -> Set of components that depend on it\r\n * Used to efficiently rebuild dependent components when a soft component is updated\r\n */\r\n dependencyGraph: Map<string, Set<string>>;\r\n\r\n /**\r\n * Rebuild all dependent components after a soft component is updated\r\n * Only rebuilds components that depend on the changed component\r\n *\r\n * @param componentName - The component that was updated\r\n * @param version - The version that was updated\r\n */\r\n rebuildDependents: (componentName: string, version: string) => void;\r\n\r\n /**\r\n * Iframe document reference for applying styling and edit visibility\r\n * Stored as a mutable ref to avoid triggering store updates.\r\n */\r\n iframeDocRef: { current: Document | null };\r\n\r\n /**\r\n * Get the current iframe document reference\r\n */\r\n getIframeDoc: () => Document | null;\r\n\r\n /**\r\n * Set the iframe document reference without causing re-renders\r\n */\r\n setIframeDoc: (doc: Document | null) => void;\r\n\r\n /**\r\n * Flag to control visibility of version config fields\r\n */\r\n showVersionFields: boolean;\r\n\r\n /**\r\n * Toggle the visibility of version config fields\r\n */\r\n setShowVersionFields: (show: boolean) => void;\r\n};\r\n\r\nexport type AppStoreApi = StoreApi<AppStore>;\r\n\r\nexport const createSoftConfigStore = (\r\n hardConfig: Config = {\r\n components: {},\r\n },\r\n softComponents: SoftComponents = {},\r\n overrides: Overrides = {},\r\n onActions?: OnActionsCallback,\r\n showVersionFields = true,\r\n customFields: CustomFields = {}\r\n) => {\r\n const normalizedSoftComponents = Object.fromEntries(\r\n Object.entries(softComponents || {})\r\n .filter(([key]) => !hardConfig.components || !hardConfig.components[key])\r\n .map(([key, value]) => [\r\n key,\r\n {\r\n ...value,\r\n name: value.name || key,\r\n },\r\n ])\r\n ) as SoftComponents;\r\n\r\n const iframeDocRef = { current: null as Document | null };\r\n const hydratedSoftComponents =\r\n overrides?.hydrateMapTransform\r\n ? hydrateSoftComponentsTransforms(\r\n normalizedSoftComponents,\r\n overrides.hydrateMapTransform\r\n )\r\n : normalizedSoftComponents;\r\n\r\n // Build initial dependency graph\r\n const initialDependencyGraph = buildReverseDependencyGraph(\r\n hydratedSoftComponents\r\n );\r\n\r\n return create<AppStore>()(\r\n subscribeWithSelector(\r\n (set, get) => ({\r\n state: \"ready\",\r\n originalHistory: [],\r\n overrides,\r\n customFields,\r\n onActions,\r\n iframeDocRef,\r\n showVersionFields: showVersionFields,\r\n editingComponent: null,\r\n setShowVersionFields: (show: boolean) => set({ showVersionFields: show }),\r\n getIframeDoc: () => iframeDocRef.current,\r\n setIframeDoc: (doc: Document | null) => {\r\n iframeDocRef.current = doc;\r\n\r\n if (!doc) {\r\n return;\r\n }\r\n\r\n const { state, editableComponentIds } = get();\r\n\r\n if (state === \"building\") {\r\n setEditVisibility(doc, {\r\n mode: \"build\",\r\n editableIds: editableComponentIds,\r\n });\r\n return;\r\n }\r\n\r\n if (state === \"remodeling\") {\r\n setEditVisibility(doc, {\r\n mode: \"remodel\",\r\n editableIds: editableComponentIds,\r\n });\r\n return;\r\n }\r\n\r\n clearEditVisibility(doc);\r\n },\r\n storeHistory: (history: History[]) => set({ originalHistory: history }),\r\n removeHistory: () => set({ originalHistory: [] }),\r\n itemSelector: null,\r\n setItemSelector: (selector) => set({ itemSelector: selector }),\r\n originalItem: null,\r\n setOriginalItem: (item) => set({ originalItem: item }),\r\n hydratedSoftComponents,\r\n softComponents: hydratedSoftComponents,\r\n dependencyGraph: initialDependencyGraph,\r\n softConfig: {\r\n ...hardConfig,\r\n components: {\r\n ...hardConfig.components,\r\n ...buildInitialSoftComponents(\r\n hardConfig,\r\n hydratedSoftComponents,\r\n overrides,\r\n showVersionFields,\r\n customFields\r\n ),\r\n },\r\n categories: {\r\n ...(hardConfig.categories || {}),\r\n },\r\n },\r\n setSoftComponent: (\r\n name: string,\r\n version: string,\r\n component: SoftComponent\r\n ) => {\r\n if (hardConfig.components && hardConfig.components[name]) {\r\n console.warn(`Cannot set soft component \"${name}\" because it conflicts with a base hardConfig component.`);\r\n return;\r\n }\r\n\r\n const existing = get().softComponents[name];\r\n\r\n set((state) => ({\r\n softComponents: {\r\n ...state.softComponents,\r\n [name]: {\r\n ...existing,\r\n name: component.name || existing?.name || name,\r\n category: component.category ?? existing?.category,\r\n defaultVersion: version,\r\n versions: {\r\n ...(state.softComponents[name]?.versions || {}),\r\n [version]: component,\r\n },\r\n },\r\n },\r\n }));\r\n },\r\n setSoftComponents: (incomingComponents: SoftComponents) => {\r\n const state = get();\r\n const nextSoftComponents = { ...state.softComponents };\r\n const nextConfigComponents = { ...state.softConfig.components };\r\n\r\n Object.entries(incomingComponents).forEach(([name, data]) => {\r\n if (hardConfig.components && hardConfig.components[name]) {\r\n return; // Skip base components completely\r\n }\r\n\r\n const existing = nextSoftComponents[name];\r\n\r\n const finalComponentData = existing ? {\r\n ...existing,\r\n ...data,\r\n name: data.name || existing.name || name,\r\n versions: { ...existing.versions, ...data.versions },\r\n } : data;\r\n\r\n finalComponentData.name = finalComponentData.name || name;\r\n\r\n nextSoftComponents[name] = finalComponentData;\r\n\r\n const activeVersion = finalComponentData.defaultVersion;\r\n const activeVersionData = finalComponentData.versions[activeVersion];\r\n\r\n if (activeVersionData) {\r\n nextConfigComponents[name] = createVersionedComponentConfig(\r\n name,\r\n finalComponentData.name || name,\r\n activeVersion,\r\n Object.keys(finalComponentData.versions),\r\n state.softConfig,\r\n nextSoftComponents,\r\n activeVersionData.defaultProps,\r\n state.showVersionFields,\r\n state.customFields\r\n );\r\n }\r\n });\r\n\r\n set({\r\n softComponents: nextSoftComponents,\r\n softConfig: {\r\n ...state.softConfig,\r\n components: nextConfigComponents,\r\n },\r\n });\r\n },\r\n\r\n hydrateTransforms: () => {\r\n const { overrides, softComponents, softConfig } = get();\r\n if (!overrides?.hydrateMapTransform) return;\r\n\r\n const hydratedComponents = hydrateSoftComponentsTransforms(\r\n softComponents,\r\n overrides.hydrateMapTransform\r\n );\r\n\r\n const nextConfigComponents = { ...softConfig.components };\r\n\r\n Object.entries(hydratedComponents).forEach(([name, componentData]) => {\r\n const activeVersion = componentData.defaultVersion;\r\n const activeVersionData = componentData.versions[activeVersion];\r\n\r\n if (activeVersionData) {\r\n nextConfigComponents[name] = createVersionedComponentConfig(\r\n name,\r\n componentData.name || name,\r\n activeVersion,\r\n Object.keys(componentData.versions),\r\n softConfig,\r\n hydratedComponents,\r\n activeVersionData.defaultProps,\r\n get().showVersionFields,\r\n get().customFields\r\n );\r\n }\r\n });\r\n\r\n set({\r\n softComponents: hydratedComponents,\r\n softConfig: {\r\n ...softConfig,\r\n components: nextConfigComponents\r\n }\r\n });\r\n },\r\n setSoftComponentDefaultVersion: (name: string, version: string) => {\r\n const softComponent = get().softComponents[name]?.versions?.[version];\r\n const allVersions = Object.keys(\r\n get().softComponents[name]?.versions || {}\r\n );\r\n const displayName = get().softComponents[name]?.name || name;\r\n\r\n if (!softComponent) {\r\n throw new Error(\r\n `Soft component \"${name}\" version \"${version}\" does not exist.`\r\n );\r\n }\r\n\r\n const newSoftComponentConfig = createVersionedComponentConfig(\r\n name,\r\n displayName,\r\n version,\r\n allVersions,\r\n get().softConfig,\r\n get().softComponents,\r\n softComponent.defaultProps,\r\n get().showVersionFields,\r\n get().customFields\r\n );\r\n\r\n set((state) => ({\r\n softConfig: {\r\n ...state.softConfig,\r\n components: {\r\n ...state.softConfig.components,\r\n [name]: newSoftComponentConfig,\r\n },\r\n },\r\n softComponents: {\r\n ...state.softComponents,\r\n [name]: {\r\n ...state.softComponents[name],\r\n defaultVersion: version,\r\n },\r\n },\r\n }));\r\n },\r\n removeSoftComponentVersion: (key: string, version: string) => {\r\n set((state) => {\r\n const component = state.softComponents[key];\r\n if (!component) return {};\r\n\r\n // Remove the version\r\n const newVersions = Object.fromEntries(\r\n Object.entries(component.versions || {}).filter(\r\n ([k, _]) => k !== version\r\n )\r\n );\r\n\r\n // Determine new defaultVersion\r\n let newDefaultVersion = component.defaultVersion;\r\n if (component.defaultVersion === version) {\r\n const versionKeys = Object.keys(newVersions);\r\n newDefaultVersion =\r\n versionKeys.length > 0\r\n ? versionKeys[versionKeys.length - 1]\r\n : \"\";\r\n }\r\n\r\n return {\r\n softComponents: {\r\n ...state.softComponents,\r\n [key]: {\r\n ...component,\r\n versions: newVersions,\r\n defaultVersion: newDefaultVersion,\r\n },\r\n },\r\n };\r\n });\r\n },\r\n removeSoftComponent: (key: string) => {\r\n set((state) => ({\r\n softComponents: Object.fromEntries(\r\n Object.entries(state.softComponents).filter(([k, _]) => k !== key)\r\n ),\r\n }));\r\n },\r\n setSoftComponentConfig: (\r\n key: string,\r\n config: ComponentConfig,\r\n category?: string\r\n ) => {\r\n set((state) => ({\r\n softConfig: {\r\n ...state.softConfig,\r\n components: {\r\n ...state.softConfig.components,\r\n [key]: { ...config },\r\n },\r\n categories:\r\n category\r\n ? {\r\n ...(state.softConfig.categories || {}),\r\n [category]: {\r\n ...(state.softConfig.categories?.[category] || {}),\r\n components: [\r\n ...(state.softConfig.categories?.[category]\r\n ?.components || []),\r\n key,\r\n ],\r\n },\r\n }\r\n : (state.softConfig.categories || {}),\r\n },\r\n }));\r\n },\r\n removeSoftComponentConfig: (key: string) => {\r\n set((state) => ({\r\n softConfig: {\r\n ...state.softConfig,\r\n components: Object.fromEntries(\r\n Object.entries(state.softConfig.components).filter(\r\n ([k, _]) => k !== key\r\n )\r\n ),\r\n },\r\n }));\r\n },\r\n setSoftCategoryConfig: (key: string, category) => {\r\n set((state) => ({\r\n softConfig: {\r\n ...state.softConfig,\r\n categories: {\r\n ...state.softConfig.categories,\r\n [key]: {\r\n ...state.softConfig.categories?.[key],\r\n ...category,\r\n },\r\n },\r\n },\r\n }));\r\n },\r\n removeSoftCategoryConfig: (key: string) => {\r\n set((state) => ({\r\n softConfig: {\r\n ...state.softConfig,\r\n categories: Object.fromEntries(\r\n Object.entries(state.softConfig.categories || {}).filter(\r\n ([k, _]) => k !== key\r\n )\r\n ),\r\n },\r\n }));\r\n },\r\n builder: createBuildersSlice(set, get, hardConfig),\r\n editingComponentId: null,\r\n editableComponentIds: new Set(),\r\n setEditableComponentIds: (ids) => set({ editableComponentIds: ids }),\r\n addEditableComponentId: (id) => {\r\n set((state) => {\r\n const newIds = new Set(state.editableComponentIds);\r\n newIds.add(id);\r\n return { editableComponentIds: newIds };\r\n });\r\n },\r\n clearEditingState: () =>\r\n set({\r\n editingComponentId: null,\r\n editableComponentIds: new Set(),\r\n }),\r\n rebuildDependents: (componentName: string, version: string) => {\r\n const state = get();\r\n const dependents = state.dependencyGraph.get(componentName) || new Set();\r\n\r\n if (dependents.size === 0) return;\r\n\r\n const config = { ...state.softConfig };\r\n const softComponents = state.softComponents;\r\n\r\n // Rebuild all dependent components\r\n const toBuild = Array.from(dependents);\r\n\r\n for (const dependentName of toBuild) {\r\n const dependent = softComponents[dependentName];\r\n const defaultVersion =\r\n dependent.defaultVersion || Object.keys(dependent.versions || {}).pop();\r\n\r\n if (!defaultVersion) continue;\r\n\r\n const versionedComponent = dependent.versions[defaultVersion];\r\n const allVersions = Object.keys(dependent.versions || {});\r\n\r\n if (!versionedComponent) continue;\r\n\r\n // Rebuild the dependent component config\r\n const newConfig = createVersionedComponentConfig(\r\n dependentName,\r\n dependent.name || dependentName,\r\n defaultVersion,\r\n allVersions,\r\n config,\r\n softComponents,\r\n versionedComponent.defaultProps,\r\n state.showVersionFields,\r\n state.customFields\r\n );\r\n\r\n config.components[dependentName] = newConfig;\r\n }\r\n\r\n set((s) => ({ ...s, softConfig: config }));\r\n },\r\n })\r\n )\r\n );\r\n};\r\n","import {\r\n AppState,\r\n ComponentConfig,\r\n Config,\r\n Data,\r\n DefaultComponentProps,\r\n History,\r\n PuckApi,\r\n ComponentData,\r\n walkTree,\r\n} from \"@measured/puck\";\r\nimport { AppStore } from \"../\";\r\nimport { builderConfig } from \"../../lib/builder/builder-config\";\r\nimport { BuilderRootConfig } from \"../../types/BuilderConfig\";\r\nimport { SoftComponent } from \"../../types/SoftComponent\";\r\nimport { softComponentFromAppState } from \"../../lib/soft-component-from-appstate\";\r\nimport { softComponentToAppState } from \"../../lib/soft-component-to-appstate\";\r\nimport { rootDroppableId } from \"../../lib/root-droppable-id\";\r\nimport { createVersionedComponentConfig } from \"../../lib/create-versioned-component-config\";\r\nimport { decomposeSoftComponent } from \"../../lib/decompose-soft-component\";\r\nimport { demolishSoftComponent } from \"../../lib/demolish-soft-component\";\r\nimport { createComponentKeyFromName } from \"../../lib/component-key\";\r\nimport { VersionedSoftComponent } from \"../../types/SoftComponent\";\r\n\r\nexport type CompletedComponentResult = {\r\n id: string;\r\n version: string;\r\n softComponent: VersionedSoftComponent[\"versions\"][string];\r\n};\r\n\r\nexport type BuildersSlice = {\r\n /**\r\n * Build a new soft component based on the selected item in history.\r\n *\r\n * Steps:\r\n * 1. Data Modifications:\r\n * - Store History\r\n * - Set currently selected item to the root\r\n * 2. Soft Config Modifications:\r\n * - Update root to include: name, fields, fieldSettings, for soft component\r\n * - Update each component config to map the soft fields to component fields\r\n * - Update each component for slot settings (Dropzone enable/disable)\r\n */\r\n build: (\r\n history: History<AppState>[],\r\n selectedItem: PuckApi[\"selectedItem\"],\r\n itemSelector: { index: number; zone?: string } | null,\r\n puckDispatch: PuckApi[\"dispatch\"],\r\n name?: string,\r\n ) => void | null;\r\n\r\n /**\r\n * Remodel the selected soft component by decomposing it and resetting as root.\r\n *\r\n * Steps:\r\n * 1. Data Modifications:\r\n * - Store History\r\n * - Decompose and set selected soft component to root\r\n * 2. Soft Config Modifications:\r\n * - Update root with name, fields, fieldSettings for soft component\r\n * - Update each component config to map soft fields to component fields\r\n * - Update each component for slot settings (Dropzone enable/disable)\r\n * - Remove selected component or dependencies to avoid circular dependencies\r\n */\r\n remodel: (\r\n history: History<AppState>[],\r\n selectedItem: PuckApi[\"selectedItem\"],\r\n itemSelector: { index: number; zone?: string } | null,\r\n puckDispatch: PuckApi[\"dispatch\"],\r\n refreshPermission: () => void\r\n ) => void;\r\n\r\n /**\r\n * Switch to a different version of the soft component being remodeled.\r\n *\r\n * Steps:\r\n * 1. Get the soft component for the selected version\r\n * 2. Convert it back to AppState format\r\n * 3. Update the puck data with the new version's content\r\n */\r\n setVersion: (\r\n componentName: string,\r\n newVersion: string,\r\n currentProps: Record<string, any>,\r\n puckDispatch: PuckApi[\"dispatch\"]\r\n ) => void;\r\n /**\r\n * Mark the current build/remodel as complete.\r\n *\r\n * Steps:\r\n * 1. Config Modifications:\r\n * - Compose the build settings into soft component\r\n * - Set the component to the config\r\n * - Restore permissions, resolve fields and resolve data of all components\r\n * 2. Data Modifications:\r\n * - Transform the last item of history to replace the source components into composed soft component\r\n * - Strip the build settings fields\r\n * - Apply modified history to puck data.\r\n */\r\n complete: (\r\n appState: AppState<any>,\r\n setHistories: PuckApi[\"history\"][\"setHistories\"],\r\n getItemBySelector: PuckApi[\"getItemBySelector\"]\r\n ) => CompletedComponentResult;\r\n\r\n demolish: (\r\n componentName: string,\r\n data: AppState[\"data\"],\r\n puckDispatch: PuckApi[\"dispatch\"]\r\n ) => void;\r\n\r\n inspect: (componentName: string, puckDispatch: PuckApi[\"dispatch\"]) => void;\r\n\r\n /**\r\n * Mark the current build/remodel as complete.\r\n *\r\n * Steps:\r\n * 1. Config Modifications:\r\n * - Restore permissions, resolve fields and resolve data of all components\r\n * 2. Data Modifications:\r\n * - Restore history to puck data.\r\n */\r\n cancel: (setHistories: PuckApi[\"history\"][\"setHistories\"]) => void;\r\n\r\n /** Compose multiple components into a soft component.\r\n * 1. SoftComponent: Get soft fields + default values from the appState.root + sub-component maps + fixedProps\r\n */\r\n compose: (\r\n appState: AppState,\r\n componentName: string,\r\n editedItem: ComponentData,\r\n displayName: string,\r\n category?: string\r\n ) => [ComponentConfig, string] | undefined;\r\n\r\n /** Break down a composed component into its parts.\r\n * 1. Get softComponentProps\r\n * 2. Create a virtual component with all the props from soft-component.\r\n * 3. Replace the softComponent with hardComponent\r\n */\r\n decompose: (componentData: ComponentData) => ComponentData[];\r\n};\r\n\r\nexport const createBuildersSlice = (\r\n set: (\r\n partial:\r\n | AppStore\r\n | Partial<AppStore>\r\n | ((state: AppStore) => AppStore | Partial<AppStore>),\r\n replace?: false\r\n ) => void,\r\n get: () => AppStore,\r\n initialConfig: Config\r\n): BuildersSlice => ({\r\n build: (history, selectedItem, itemSelector, puckDispatch, name) => {\r\n if (!selectedItem || !itemSelector) {\r\n throw new Error(\"No item selected to build from.\");\r\n }\r\n\r\n puckDispatch({\r\n type: \"set\",\r\n state: (previous) => ({\r\n ui: {\r\n ...previous.ui,\r\n itemSelector: null,\r\n },\r\n data: {\r\n ...previous.data,\r\n root: {\r\n ...previous.data.root,\r\n props: {\r\n ...previous.data.root?.props,\r\n _name: name || \"New Soft Component\",\r\n },\r\n } as Data[\"root\"],\r\n // content: [{ ...selectedItem }],\r\n },\r\n }),\r\n });\r\n\r\n const config = { ...get().softConfig };\r\n const overrides = get().overrides;\r\n const buildConfig = builderConfig(\r\n config,\r\n overrides,\r\n undefined,\r\n get().showVersionFields,\r\n undefined,\r\n get().customFields\r\n );\r\n\r\n // Building editable ids\r\n const editableIds = new Set<string>([selectedItem.props.id]);\r\n const initialContent = [{ ...selectedItem }];\r\n\r\n walkTree(\r\n {\r\n root: {\r\n\r\n }, content: initialContent\r\n },\r\n { components: config.components },\r\n (components) => {\r\n components.forEach((comp) => {\r\n editableIds.add(comp.props.id);\r\n });\r\n return components;\r\n }\r\n );\r\n\r\n set((s) => ({\r\n ...s,\r\n softConfig: buildConfig,\r\n storedConfig: config,\r\n originalHistory: history,\r\n itemSelector: {\r\n index: itemSelector.index,\r\n zone: itemSelector.zone || rootDroppableId,\r\n },\r\n editingComponentId: selectedItem.props.id,\r\n editableComponentIds: editableIds,\r\n state: \"building\",\r\n }));\r\n\r\n // TODO: Hack to rerender root\r\n setTimeout(\r\n () =>\r\n puckDispatch({\r\n type: \"replaceRoot\",\r\n root: {\r\n title: \"Soft Component Builder\",\r\n _name: name || \"New Soft Component\",\r\n },\r\n } as any),\r\n 100\r\n );\r\n },\r\n remodel: (history, selectedItem, itemSelector, puckDispatch) => {\r\n if (!selectedItem || !itemSelector) {\r\n throw new Error(\"No item selected to build from.\");\r\n }\r\n\r\n const softComponentName = selectedItem.type;\r\n\r\n if (!softComponentName) {\r\n throw new Error(\"Selected item must have a valid component type.\");\r\n }\r\n\r\n const softComponentVersion =\r\n (selectedItem.props as DefaultComponentProps)?.version || \"1.0.0\";\r\n\r\n // Get soft component from store\r\n const softComponent =\r\n get().softComponents[softComponentName]?.versions[softComponentVersion];\r\n const softComponentMeta = get().softComponents[softComponentName];\r\n\r\n const versions = Object.keys(\r\n get().softComponents[softComponentName].versions || {}\r\n );\r\n\r\n if (!softComponent) {\r\n throw new Error(\r\n `Soft component \"${softComponentName}\" with version \"${softComponentVersion}\" not found.`\r\n );\r\n }\r\n\r\n puckDispatch({\r\n type: \"setUi\",\r\n ui: (previous) => ({\r\n ...previous,\r\n itemSelector: undefined,\r\n }),\r\n });\r\n\r\n // Convert soft component back to AppState format for remodeling (decomposition)\r\n const { root, content } = softComponentToAppState(\r\n softComponent,\r\n softComponentName,\r\n softComponentVersion,\r\n versions,\r\n selectedItem.props,\r\n get().softConfig.components,\r\n get().overrides,\r\n softComponentMeta?.name || softComponentName,\r\n softComponentMeta?.category,\r\n get().customFields\r\n );\r\n\r\n const config = { ...get().softConfig };\r\n const overrides = get().overrides;\r\n // const getStore = () => get();\r\n // const getEditableIds = () => getStore().editableComponentIds;\r\n\r\n // Get dependent components from the reverse dependency graph\r\n const dependents = get().dependencyGraph.get(softComponentName) || new Set<string>();\r\n\r\n const buildConfig = builderConfig(\r\n config,\r\n overrides,\r\n softComponentName,\r\n get().showVersionFields,\r\n dependents,\r\n get().customFields\r\n );\r\n\r\n // Collect all descendant IDs in edit scope using walkTree\r\n const editableIds = new Set<string>([]);\r\n const decomposedComponents = get().builder.decompose(selectedItem);\r\n\r\n // These will become stale when component is decomposed we need the decomposed ids rather than soft component id\r\n walkTree(\r\n { root: {}, content: decomposedComponents || [] },\r\n { components: config.components },\r\n (components) => {\r\n components.forEach((comp) => {\r\n editableIds.add(comp.props.id);\r\n });\r\n return components;\r\n }\r\n );\r\n\r\n // Remove the component at current position\r\n // puckDispatch({\r\n // type: \"remove\",\r\n // index: itemSelector.index,\r\n // zone: itemSelector.zone || rootDroppableId,\r\n // });\r\n\r\n // Insert decomposed content at the same position\r\n // content.forEach((componentData, index) => {\r\n // puckDispatch({\r\n // type: \"insert\",\r\n // componentType: componentData.type,\r\n // destinationIndex: itemSelector.index + index,\r\n // destinationZone: itemSelector.zone || rootDroppableId,\r\n // id: componentData.props.id,\r\n // });\r\n // });\r\n\r\n // refreshPermissions()\r\n\r\n\r\n puckDispatch({\r\n type: \"setData\",\r\n data: (prevData) => ({\r\n root: { ...root, _versions: versions } as any,\r\n content: walkTree({ ...prevData }, { ...config }, (components) => {\r\n const next = components.map((component) => ({\r\n ...component,\r\n props: { ...component.props },\r\n }));\r\n\r\n const index = next.findIndex(\r\n (component) => component.props.id === selectedItem.props.id\r\n );\r\n\r\n if (index !== -1) {\r\n next.splice(\r\n index,\r\n 1,\r\n ...decomposedComponents.map((component) => ({\r\n ...component,\r\n props: { ...component.props },\r\n }))\r\n );\r\n }\r\n\r\n return next;\r\n }).content\r\n })\r\n });\r\n\r\n set((s) => ({\r\n ...s,\r\n storedConfig: config,\r\n softConfig: buildConfig,\r\n originalHistory: history,\r\n itemSelector: {\r\n index: itemSelector.index,\r\n zone: itemSelector.zone || rootDroppableId,\r\n },\r\n editingComponentId: selectedItem.props.id,\r\n editingComponent: softComponentName,\r\n editableComponentIds: editableIds,\r\n state: \"remodeling\",\r\n }));\r\n\r\n setTimeout(\r\n () =>\r\n puckDispatch({\r\n type: \"replaceRoot\",\r\n root: {\r\n title: (root.props as any).title,\r\n _name: (root.props as any)._name,\r\n _category: (root.props as any)._category,\r\n },\r\n } as any),\r\n 100\r\n );\r\n },\r\n complete: (appState, setHistories, getItemBySelector) => {\r\n if (get().state === \"ready\") {\r\n throw new Error(\"Not building or remodeling a component.\");\r\n }\r\n\r\n const displayName = (\r\n appState.data.root?.props as {\r\n _name?: string;\r\n }\r\n )?._name?.trim();\r\n\r\n\r\n // Handle existing name for remodelling\r\n if (!displayName) {\r\n throw new Error(\"Root component must have a name to compose.\");\r\n }\r\n\r\n const itemSelector = get().itemSelector;\r\n\r\n if (!itemSelector) {\r\n throw new Error(\"No item selector found for completed component.\");\r\n }\r\n\r\n // Get item selector\r\n // Get the item being edited\r\n const selectedItem = getItemBySelector(\r\n itemSelector\r\n )\r\n\r\n if (!selectedItem) {\r\n throw new Error(\"Cannot find item being edited\")\r\n }\r\n\r\n const rootCategory = (\r\n appState.data.root?.props as {\r\n _category?: string;\r\n }\r\n )?._category;\r\n\r\n const rootProps = appState.data.root?.props as BuilderRootConfig;\r\n\r\n const componentName =\r\n createComponentKeyFromName(displayName, get().overrides, {\r\n ...(rootProps || {}),\r\n existingKeys: Object.keys(get().softComponents),\r\n state: get().state,\r\n });\r\n\r\n if (!componentName) {\r\n throw new Error(\"Failed to generate component key from name.\");\r\n }\r\n\r\n const [newSoftComponentConfig, version] =\r\n get().builder.compose(\r\n appState,\r\n componentName,\r\n selectedItem,\r\n displayName,\r\n rootCategory\r\n ) || [];\r\n\r\n if (!newSoftComponentConfig) {\r\n throw new Error(\"Failed to compose new soft component config.\");\r\n }\r\n\r\n const storedHistories = get().originalHistory;\r\n setHistories([...storedHistories]);\r\n\r\n const config = { ...(get().softConfig || initialConfig) };\r\n\r\n set((s) => {\r\n const nextComponents = {\r\n ...Object.entries(config.components).reduce(\r\n (acc, [name, component]) => {\r\n let tempComponent: ComponentConfig | undefined =\r\n config.components?.[name];\r\n if (tempComponent) {\r\n acc[name] = tempComponent;\r\n acc[name].render = tempComponent.render;\r\n } else {\r\n tempComponent = { ...component };\r\n delete tempComponent?.resolvePermissions;\r\n delete tempComponent?.resolveData;\r\n acc[name] = tempComponent;\r\n }\r\n return acc;\r\n },\r\n {} as Config[\"components\"]\r\n ),\r\n [componentName]: { ...newSoftComponentConfig },\r\n };\r\n\r\n const categories = get().softConfig.categories || {};\r\n\r\n const nextCategories = rootCategory\r\n ? {\r\n ...categories,\r\n [rootCategory]: {\r\n ...(categories[rootCategory] || {}),\r\n title:\r\n categories[rootCategory]?.title || rootCategory,\r\n components: Array.from(\r\n new Set([\r\n ...(categories[rootCategory]?.components || []),\r\n componentName,\r\n ])\r\n ),\r\n },\r\n }\r\n : categories;\r\n\r\n return {\r\n ...s,\r\n softConfig: {\r\n ...config,\r\n root: {\r\n ...initialConfig.root,\r\n },\r\n components: nextComponents,\r\n categories: nextCategories,\r\n },\r\n storedConfig: undefined,\r\n state: \"inspecting\",\r\n originalHistory: [],\r\n editingComponent: null,\r\n editingComponentId: null,\r\n editableComponentIds: new Set(),\r\n };\r\n });\r\n\r\n if (!version) {\r\n throw new Error(\"Failed to resolve completed component version.\");\r\n }\r\n\r\n const completedSoftComponent = get().softComponents[componentName]?.versions[version];\r\n\r\n if (!completedSoftComponent) {\r\n throw new Error(\r\n `Completed soft component \\\"${componentName}\\\" version \\\"${version}\\\" not found.`\r\n );\r\n }\r\n\r\n // Rebuild all dependent components after successfully completing the component\r\n get().rebuildDependents(componentName, version);\r\n\r\n return {\r\n id: componentName,\r\n version,\r\n softComponent: completedSoftComponent,\r\n };\r\n },\r\n inspect: (componentName, puckDispatch) => {\r\n if (get().state !== \"inspecting\") {\r\n throw new Error(\"Not in inspecting state.\");\r\n }\r\n\r\n const selector = { ...get().itemSelector };\r\n\r\n if (selector?.index === undefined || !selector?.zone) {\r\n throw new Error(\"No selector found for last item.\");\r\n }\r\n\r\n setTimeout(() => {\r\n puckDispatch({\r\n type: \"remove\",\r\n index: selector.index!,\r\n zone: selector.zone!,\r\n });\r\n puckDispatch({\r\n type: \"insert\",\r\n destinationIndex: selector.index!,\r\n destinationZone: selector.zone!,\r\n componentType: componentName,\r\n });\r\n }, 500);\r\n\r\n set((s) => ({\r\n ...s,\r\n state: \"ready\",\r\n setItemSelector: undefined,\r\n setOriginalItem: undefined,\r\n editingComponentId: null,\r\n editableComponentIds: new Set(),\r\n }));\r\n },\r\n cancel: (setHistories) => {\r\n const storedHistories = get().originalHistory;\r\n setTimeout(() => setHistories([...storedHistories]), 100);\r\n\r\n set((s) => ({\r\n ...s,\r\n softConfig: get().storedConfig || initialConfig,\r\n storedConfig: undefined,\r\n originalHistory: [],\r\n itemSelector: null,\r\n originalItem: null,\r\n state: \"ready\",\r\n editingComponent: null,\r\n editingComponentId: null,\r\n editableComponentIds: new Set(),\r\n }));\r\n },\r\n compose: (appState, componentName, editedItem, displayName, category) => {\r\n if (!componentName) {\r\n throw new Error(\"Root component must have a name to compose.\");\r\n }\r\n\r\n const componentConfigs = get().softConfig.components;\r\n\r\n if (\r\n get().state === \"building\" &&\r\n Object.keys(componentConfigs).includes(componentName)\r\n ) {\r\n throw new Error(\r\n `Component name \"${componentName}\" already exists in the configuration.`\r\n );\r\n }\r\n\r\n const [softComponent, version]: [SoftComponent, string] =\r\n softComponentFromAppState(\r\n appState,\r\n componentConfigs,\r\n editedItem,\r\n {\r\n name: displayName,\r\n category,\r\n },\r\n get().customFields\r\n );\r\n\r\n // Get all versions and the default version of this component\r\n const existingComponent = get().softComponents[componentName];\r\n const allVersions = Object.keys(existingComponent?.versions || {});\r\n const isNewVersion = !allVersions.includes(version);\r\n\r\n const newSoftComponentConfig = createVersionedComponentConfig(\r\n componentName,\r\n displayName,\r\n version,\r\n isNewVersion ? [...allVersions, version] : allVersions,\r\n get().softConfig,\r\n {\r\n ...get().softComponents,\r\n [componentName]: {\r\n ...existingComponent,\r\n versions: {\r\n ...existingComponent?.versions,\r\n [version]: softComponent,\r\n },\r\n },\r\n },\r\n softComponent.defaultProps,\r\n get().showVersionFields,\r\n get().customFields\r\n );\r\n\r\n get().setSoftComponent(componentName, version, softComponent);\r\n\r\n return [newSoftComponentConfig, version];\r\n },\r\n decompose: (componentData) => {\r\n if (!componentData?.type || !componentData?.props.id) {\r\n throw new Error(\"Component data must have type and id to decompose.\");\r\n }\r\n\r\n return decomposeSoftComponent(componentData, get().softComponents);\r\n },\r\n demolish: (componentName, data, puckDispatch) => {\r\n if (get().state !== \"ready\") {\r\n throw new Error(\"Components can only be demolished in ready state.\");\r\n }\r\n\r\n const result = demolishSoftComponent(\r\n componentName,\r\n data,\r\n get().softConfig,\r\n get().softComponents\r\n );\r\n\r\n puckDispatch({\r\n type: \"setData\",\r\n data: result.data,\r\n });\r\n\r\n // Update store with new config and soft components\r\n set((s) => ({\r\n ...s,\r\n softComponents: result.softComponents,\r\n softConfig: result.config,\r\n }));\r\n },\r\n setVersion: (componentName, newVersion, currentProps, puckDispatch) => {\r\n if (get().state !== \"remodeling\") {\r\n throw new Error(\"Can only switch versions during remodeling.\");\r\n }\r\n\r\n const softComponent =\r\n get().softComponents[componentName]?.versions[newVersion];\r\n const softComponentMeta = get().softComponents[componentName];\r\n\r\n if (!softComponent) {\r\n throw new Error(\r\n `Soft component \"${componentName}\" with version \"${newVersion}\" not found.`\r\n );\r\n }\r\n\r\n const versions = Object.keys(\r\n get().softComponents[componentName].versions || {}\r\n );\r\n\r\n // Convert soft component to AppState format\r\n const { root, content } = softComponentToAppState(\r\n softComponent,\r\n componentName,\r\n newVersion,\r\n versions,\r\n currentProps,\r\n get().softConfig.components,\r\n get().overrides,\r\n softComponentMeta?.name || componentName,\r\n softComponentMeta?.category,\r\n get().customFields\r\n );\r\n\r\n // Update puck data with new version\r\n puckDispatch({\r\n type: \"setData\",\r\n data: (previous) => ({\r\n ...previous,\r\n root: { ...root, props: { ...root.props, _versions: versions } },\r\n content: content || [],\r\n }),\r\n });\r\n },\r\n});\r\n","import { AppState, Field } from \"@measured/puck\";\r\nimport { BuilderRootConfig } from \"../types/BuilderConfig\";\r\n\r\nexport const getRootProps = (appState: AppState): BuilderRootConfig =>\r\n appState.data.root.props as BuilderRootConfig;\r\n","import React, { useEffect } from \"react\";\r\nimport equal from \"react-fast-compare\";\r\nimport {\r\n AsFieldProps,\r\n Config,\r\n createUsePuck,\r\n Field,\r\n RootConfig,\r\n RootData,\r\n walkTree,\r\n WithChildren,\r\n WithId,\r\n} from \"@measured/puck\";\r\nimport { BuilderRootConfig } from \"../../types/BuilderConfig\";\r\nimport getFieldSettings from \"../get-field-settings\";\r\nimport { useSoftConfig } from \"../../context/useStore\";\r\nimport { AppStore } from \"../../store\";\r\nimport { applyMapping } from \"../apply-mapping\";\r\nimport { getCustomFieldTypeOptions } from \"../custom-fields\";\r\nimport type { MapEntry } from \"../../types/Mapping\";\r\nimport type { CustomFields } from \"../../types/SoftFields\";\r\n\r\nconst useCustomPuck = createUsePuck();\r\n\r\nconst breakVersion = (version: string) => {\r\n const [major, minor, patch] = version.split(\".\").map((v) => parseInt(v));\r\n return [major, minor, patch];\r\n};\r\n\r\nconst updateVersion = (\r\n version: string,\r\n increment: \"major\" | \"minor\" | \"patch\"\r\n) => {\r\n let [major, minor, patch] = breakVersion(version);\r\n if (increment === \"major\") {\r\n major += 1;\r\n minor = 0;\r\n patch = 0;\r\n } else if (increment === \"minor\") {\r\n minor += 1;\r\n patch = 0;\r\n } else {\r\n patch += 1;\r\n }\r\n return `${major}.${minor}.${patch}`;\r\n};\r\n\r\nconst getSerializableProps = (props: WithId<Record<string, any>>) => {\r\n const cleanProps: WithId<{\r\n [x: string]: any;\r\n }> = {\r\n id: props.id, \r\n };\r\n\r\n for (const key in props) {\r\n const value = props[key];\r\n\r\n // 1. Drop known Puck injected keys (but KEEP 'id', Puck needs it)\r\n if ([\"children\", \"puck\", \"editMode\"].includes(key)) continue;\r\n\r\n // 2. Drop React Elements. React nodes are objects that contain a $$typeof symbol.\r\n if (value && typeof value === \"object\" && value.$$typeof) continue;\r\n\r\n // 3. Drop any injected functions or callbacks\r\n if (typeof value === \"function\") continue;\r\n\r\n // If it passed the checks, it's safe serializable data\r\n cleanProps[key] = value;\r\n }\r\n\r\n return cleanProps;\r\n};\r\n\r\nexport const builderRootConfig = (\r\n config: Config,\r\n overrides: AppStore[\"overrides\"],\r\n editingComponent?: string,\r\n showVersionFields: boolean = true,\r\n customFields?: CustomFields\r\n): RootConfig<BuilderRootConfig> => {\r\n const customTypeOptions = getCustomFieldTypeOptions(customFields);\r\n\r\n return ({\r\n fields: {\r\n _name: (overrides.name || {\r\n type: \"text\",\r\n label: \"Soft Component Name\",\r\n }) as Field,\r\n _category: (overrides.categories || {\r\n type: \"select\",\r\n label: \"Category\",\r\n options: [\r\n ...(Object.keys(config.categories || {}).map((cat) => ({\r\n label: config.categories?.[cat].title || cat,\r\n value: cat,\r\n })) || []),\r\n {\r\n label: Object.keys(config.categories || {}).length\r\n ? \"Other\"\r\n : \"Uncategorized\",\r\n value: undefined,\r\n },\r\n ],\r\n }) as Field,\r\n _fields: {\r\n type: \"array\",\r\n label: \"Fields\",\r\n defaultItemProps: {\r\n name: \"New Field\",\r\n type: \"text\",\r\n },\r\n getItemSummary(\r\n item: { name: string; type: string },\r\n index?: number\r\n ) {\r\n return item.name || `Field ${(index || 0) + 1}`;\r\n },\r\n arrayFields: {\r\n name: { type: \"text\", label: \"Name\" },\r\n type: {\r\n type: \"select\",\r\n label: \"Type\",\r\n options: [\r\n { label: \"Text\", value: \"text\" },\r\n { label: \"Textarea\", value: \"textarea\" },\r\n { label: \"Number\", value: \"number\" },\r\n { label: \"Select\", value: \"select\" },\r\n { label: \"Radio\", value: \"radio\" },\r\n { label: \"Array\", value: \"array\" },\r\n { label: \"Object\", value: \"object\" },\r\n // { label: \"Reference\", value: \"reference\" },\r\n ...customTypeOptions,\r\n ],\r\n },\r\n },\r\n } as Field,\r\n ...(overrides.additionalRootFields || {}),\r\n },\r\n resolveFields({ props: data }, { fields, changed }) {\r\n const newFields = { ...fields };\r\n const rootFields: NonNullable<BuilderRootConfig[\"_fields\"]> = Array.isArray(\r\n (data as BuilderRootConfig | undefined)?._fields\r\n )\r\n ? (((data as BuilderRootConfig | undefined)?._fields || []) as NonNullable<\r\n BuilderRootConfig[\"_fields\"]\r\n >)\r\n : [];\r\n const rootFieldSettings =\r\n ((data as BuilderRootConfig | undefined)?._fieldSettings || {}) as NonNullable<\r\n BuilderRootConfig[\"_fieldSettings\"]\r\n >;\r\n\r\n if (changed._fields || changed._fieldSettings) {\r\n if (rootFields.length) {\r\n newFields._fieldSettings = {\r\n type: \"object\",\r\n label: \"Field Settings\",\r\n objectFields: getFieldSettings(\r\n rootFields,\r\n rootFieldSettings,\r\n customFields\r\n ),\r\n };\r\n } else {\r\n delete newFields._fieldSettings;\r\n }\r\n }\r\n\r\n // if (showVersionFields && data?._versions?.length) {\r\n // const latestVersion = data._versions[data._versions.length - 1] || \"1.0.0\";\r\n\r\n // newFields._version = {\r\n // type: \"select\",\r\n // label: \"Version\",\r\n // options: [\r\n // ...data._versions.map((v: string) => ({ label: v, value: v })),\r\n // {\r\n // label: `${updateVersion(latestVersion, \"patch\")} (Patch)`,\r\n // value: updateVersion(latestVersion, \"patch\"),\r\n // },\r\n // {\r\n // label: `${updateVersion(latestVersion, \"minor\")} (Minor)`,\r\n // value: updateVersion(latestVersion, \"minor\"),\r\n // },\r\n // {\r\n // label: `${updateVersion(latestVersion, \"major\")} (Major)`,\r\n // value: updateVersion(latestVersion, \"major\"),\r\n // },\r\n // ],\r\n // } as Field;\r\n // } else {\r\n // delete newFields._version;\r\n // }\r\n\r\n return newFields; // Return the new object\r\n },\r\n // resolveData: (props, params) => {\r\n // if (overrides.resolveRootData) {\r\n // return overrides.resolveRootData(props, params, { editingComponent });\r\n // }\r\n\r\n // const result: {\r\n // props: RootData<AsFieldProps<WithChildren<BuilderRootConfig>>>;\r\n // readOnly: Readonly<Record<string, boolean>> | undefined;\r\n // } = {\r\n // props,\r\n // readOnly: undefined,\r\n // };\r\n\r\n // return result;\r\n // },\r\n render: (props) => {\r\n const fieldSettings = props?._fieldSettings;\r\n const data = useCustomPuck((s) => s.appState.data);\r\n const dispatch = useCustomPuck((s) => s.dispatch);\r\n const getSelectorForId = useCustomPuck((s) => s.getSelectorForId);\r\n const setVersion = useSoftConfig((s) => s.builder.setVersion);\r\n const state = useSoftConfig((s) => s.state);\r\n\r\n useEffect(() => {\r\n if (!fieldSettings || Object.keys(fieldSettings).length === 0) return;\r\n\r\n const replacements: Array<{\r\n id: string;\r\n data: any;\r\n }> = [];\r\n\r\n walkTree(\r\n {\r\n content: data?.content || [],\r\n root: data?.root || {},\r\n },\r\n {\r\n components: config.components,\r\n },\r\n (content) =>\r\n content.map((child) => {\r\n const map = (child.props?._map || []) as MapEntry[];\r\n if (!map.length) return child;\r\n\r\n const cleanProps = getSerializableProps(child.props);\r\n const { newProps, changed } = applyMapping(\r\n cleanProps,\r\n fieldSettings,\r\n map,\r\n \"fieldSettings\"\r\n );\r\n\r\n // `applyMapping` can touch array bases in stages when several rows\r\n // target the same base. Skip replace unless the fully composed\r\n // serializable props actually changed; otherwise we can loop.\r\n if (!changed || equal(cleanProps, newProps)) return child;\r\n\r\n replacements.push({\r\n id: child.props.id,\r\n data: { ...child, props: newProps as typeof child.props },\r\n });\r\n\r\n return child;\r\n })\r\n );\r\n\r\n if (!replacements.length) return;\r\n\r\n replacements.forEach((replacement) => {\r\n const itemSelector = getSelectorForId(replacement.id);\r\n if (!itemSelector) return;\r\n\r\n dispatch({\r\n type: \"replace\",\r\n data: replacement.data,\r\n destinationIndex: itemSelector.index,\r\n destinationZone: itemSelector.zone,\r\n });\r\n });\r\n }, [fieldSettings, data, dispatch, getSelectorForId]);\r\n\r\n useEffect(() => {\r\n if (state !== \"remodeling\" || !props?._version || !props?._name) return;\r\n const currentVersion = props._version;\r\n if (props._versions?.includes(currentVersion) && props._versions.length > 1) {\r\n setVersion(props._name, currentVersion, props, dispatch);\r\n }\r\n }, [props?._version]);\r\n\r\n return <>{props.children}</>;\r\n },\r\n });\r\n};\r\n\r\n","import { AutoField, Field, Fields } from \"@measured/puck\";\r\nimport {\r\n buildArrayDefaultItemProps,\r\n getArrayItemSummary,\r\n isPrimitiveFieldType,\r\n} from \"./array-field-utils\";\r\nimport {\r\n getCustomFieldTypeOptions,\r\n resolveCustomFieldDefinition,\r\n resolveCustomFieldReturnType,\r\n resolveCustomFieldSchema,\r\n} from \"./custom-fields\";\r\nimport type {\r\n CustomFields,\r\n SoftFieldDefinition,\r\n SoftFieldSettings,\r\n} from \"../types/SoftFields\";\r\n\r\nconst buildPuckField = (\r\n field: SoftFieldDefinition,\r\n fieldSettings?: SoftFieldSettings[string],\r\n customFields?: CustomFields\r\n): Field => {\r\n const customFieldDefinition = resolveCustomFieldDefinition(\r\n field.type,\r\n customFields\r\n );\r\n const customReturnType = resolveCustomFieldReturnType(field.type, customFields);\r\n\r\n if (customFieldDefinition && customReturnType) {\r\n return {\r\n ...customFieldDefinition.field,\r\n type: \"custom\",\r\n label: customFieldDefinition.field.label || field.name,\r\n } as Field;\r\n }\r\n\r\n const resolvedType = field.type;\r\n\r\n switch (resolvedType) {\r\n case \"text\":\r\n case \"textarea\":\r\n return { type: resolvedType, label: field.name };\r\n case \"number\":\r\n return {\r\n type: resolvedType,\r\n label: field.name,\r\n min: fieldSettings?.min,\r\n max: fieldSettings?.max,\r\n step: fieldSettings?.step,\r\n };\r\n case \"select\":\r\n case \"radio\":\r\n return {\r\n type: resolvedType,\r\n label: field.name,\r\n options: fieldSettings?.options || [],\r\n };\r\n case \"array\": {\r\n const subFields = fieldSettings?.subFields || [];\r\n const subFieldSettings = fieldSettings?.subFieldSettings || {};\r\n\r\n return {\r\n type: \"array\",\r\n label: field.name,\r\n min: fieldSettings?.min,\r\n max: fieldSettings?.max,\r\n arrayFields: buildDefaultEditorFields(\r\n subFields,\r\n subFieldSettings,\r\n customFields\r\n ),\r\n defaultItemProps: buildArrayDefaultItemProps(subFields, subFieldSettings),\r\n getItemSummary(item, index) {\r\n return getArrayItemSummary(item, index, fieldSettings);\r\n },\r\n };\r\n }\r\n case \"object\":\r\n return {\r\n type: \"object\",\r\n label: field.name,\r\n objectFields: buildDefaultEditorFields(\r\n fieldSettings?.subFields || [],\r\n fieldSettings?.subFieldSettings || {},\r\n customFields\r\n ),\r\n };\r\n default:\r\n return { type: \"text\", label: field.name };\r\n }\r\n};\r\n\r\nconst buildDefaultEditorFields = (\r\n fields: SoftFieldDefinition[] = [],\r\n fieldSettings: SoftFieldSettings = {},\r\n customFields?: CustomFields\r\n): Fields => {\r\n return fields.reduce((acc, field) => {\r\n acc[field.name] = buildPuckField(\r\n field,\r\n fieldSettings[field.name],\r\n customFields\r\n );\r\n return acc;\r\n }, {} as Fields);\r\n};\r\n\r\nconst getFieldSettings = (\r\n _fields?: SoftFieldDefinition[],\r\n _fieldSettings?: SoftFieldSettings,\r\n customFields?: CustomFields,\r\n deep?: boolean\r\n): Fields => {\r\n const customTypeOptions = getCustomFieldTypeOptions(customFields);\r\n\r\n return (\r\n (_fields || [])\r\n ).reduce((fields, field) => {\r\n const fieldSettings: Fields = {\r\n // placeholder: { type: \"text\", label: \"Placeholder\" },\r\n };\r\n\r\n const currentFieldSettings = _fieldSettings?.[field.name];\r\n const customFieldDefinition = resolveCustomFieldDefinition(\r\n field.type,\r\n customFields\r\n );\r\n const customReturnType = resolveCustomFieldReturnType(\r\n field.type,\r\n customFields\r\n );\r\n const resolvedType = field.type;\r\n const customSchema = resolveCustomFieldSchema(field.type, customFields);\r\n const resolvedSubFields =\r\n customSchema?.subFields || currentFieldSettings?.subFields || [];\r\n const resolvedSubFieldSettings =\r\n customSchema?.subFieldSettings ||\r\n currentFieldSettings?.subFieldSettings ||\r\n {};\r\n const customDefaultValueField =\r\n customFieldDefinition && customReturnType\r\n ? ({\r\n ...customFieldDefinition.field,\r\n type: \"custom\",\r\n label: customFieldDefinition.field.label || \"Default Value\",\r\n } as Field)\r\n : null;\r\n\r\n if (customDefaultValueField) {\r\n fieldSettings.defaultValue = customDefaultValueField;\r\n }\r\n\r\n switch (resolvedType) {\r\n case \"text\":\r\n case \"textarea\":\r\n if (!customDefaultValueField) {\r\n fieldSettings.defaultValue = {\r\n type: resolvedType,\r\n label: \"Default Value\",\r\n };\r\n }\r\n break;\r\n\r\n case \"number\":\r\n if (!customDefaultValueField) {\r\n fieldSettings.defaultValue = {\r\n type: resolvedType,\r\n label: \"Default Value\",\r\n };\r\n }\r\n fieldSettings.min = {\r\n type: resolvedType,\r\n label: \"Minimum Value\",\r\n };\r\n fieldSettings.max = {\r\n type: resolvedType,\r\n label: \"Maximum Value\",\r\n };\r\n fieldSettings.step = {\r\n type: resolvedType,\r\n label: \"Step Size\",\r\n };\r\n break;\r\n case \"radio\":\r\n case \"select\": {\r\n const selectOptions = currentFieldSettings?.options || [];\r\n\r\n if (!customDefaultValueField) {\r\n fieldSettings.defaultValue = {\r\n type: \"custom\",\r\n label: \"Default Value\",\r\n render: ({ value, onChange, id }) => (\r\n <AutoField\r\n field={{\r\n type: resolvedType as \"select\" | \"radio\",\r\n label: \"Default Value\",\r\n options: selectOptions,\r\n }}\r\n value={value}\r\n onChange={onChange}\r\n readOnly={false}\r\n id={id}\r\n />\r\n ),\r\n };\r\n }\r\n\r\n fieldSettings.options = {\r\n type: \"array\",\r\n label: \"Options\",\r\n defaultItemProps: {\r\n label: \"New Option\",\r\n value: \"new\",\r\n },\r\n arrayFields: {\r\n label: { type: \"text\", label: \"Label\" },\r\n value: {\r\n type: \"text\",\r\n label: \"Value\",\r\n },\r\n },\r\n getItemSummary(item, index) {\r\n return item.label || `Option ${(index || 0) + 1}`;\r\n },\r\n };\r\n\r\n break;\r\n }\r\n case \"array\":\r\n case \"object\":\r\n fieldSettings.subFields = {\r\n type: \"array\",\r\n label: \"Sub Fields\",\r\n defaultItemProps: {\r\n name: \"New Sub Field\",\r\n type: \"text\",\r\n },\r\n arrayFields: {\r\n name: { type: \"text\", label: \"Name\" },\r\n type: {\r\n type: \"select\",\r\n options: deep\r\n ? [\r\n {\r\n label: \"Text\",\r\n value: \"text\",\r\n },\r\n {\r\n label: \"Number\",\r\n value: \"number\",\r\n },\r\n {\r\n label: \"Select\",\r\n value: \"select\",\r\n },\r\n {\r\n label: \"Radio\",\r\n value: \"radio\",\r\n },\r\n ...customTypeOptions,\r\n ]\r\n : [\r\n {\r\n label: \"Text\",\r\n value: \"text\",\r\n },\r\n {\r\n label: \"Number\",\r\n value: \"number\",\r\n },\r\n {\r\n label: \"Select\",\r\n value: \"select\",\r\n },\r\n {\r\n label: \"Radio\",\r\n value: \"radio\",\r\n },\r\n {\r\n label: \"Array\",\r\n value: \"array\",\r\n },\r\n {\r\n label: \"Object\",\r\n value: \"object\",\r\n },\r\n {\r\n label: \"Reference\",\r\n value: \"reference\",\r\n },\r\n ...customTypeOptions,\r\n ],\r\n },\r\n },\r\n getItemSummary(item, index) {\r\n return item.name || `Field ${(index || 0) + 1}`;\r\n },\r\n };\r\n\r\n if (!deep)\r\n fieldSettings.subFieldSettings = {\r\n type: \"object\",\r\n label: \"Sub Field Settings\",\r\n objectFields: resolvedSubFields\r\n ? getFieldSettings(\r\n resolvedSubFields,\r\n resolvedSubFieldSettings,\r\n customFields,\r\n true\r\n )\r\n : {},\r\n };\r\n\r\n if (resolvedType === \"array\") {\r\n if (!customDefaultValueField) {\r\n fieldSettings.defaultValue = {\r\n type: \"array\",\r\n label: \"Default Items\",\r\n arrayFields: buildDefaultEditorFields(\r\n resolvedSubFields,\r\n resolvedSubFieldSettings,\r\n customFields\r\n ),\r\n defaultItemProps: buildArrayDefaultItemProps(\r\n resolvedSubFields,\r\n resolvedSubFieldSettings\r\n ),\r\n getItemSummary(item, index) {\r\n return getArrayItemSummary(item, index, currentFieldSettings);\r\n },\r\n };\r\n }\r\n\r\n fieldSettings.min = {\r\n type: \"number\",\r\n label: \"Minimum Items\",\r\n };\r\n fieldSettings.max = {\r\n type: \"number\",\r\n label: \"Maximum Items\",\r\n };\r\n fieldSettings.summary = {\r\n type: \"select\",\r\n label: \"Summary\",\r\n options: [\r\n {\r\n label: \"Default Numbering / Count\",\r\n value: \"count\",\r\n },\r\n {\r\n label: \"Field\",\r\n value: \"field\",\r\n },\r\n {\r\n label: \"Expression\",\r\n value: \"expression\",\r\n },\r\n ],\r\n };\r\n\r\n if (currentFieldSettings?.summary === \"field\") {\r\n fieldSettings.summaryField = {\r\n type: \"select\",\r\n label: \"Summary Field\",\r\n options: [\r\n {\r\n label: \"Select a field\",\r\n value: \"\",\r\n },\r\n ...resolvedSubFields\r\n .filter((subField) => isPrimitiveFieldType(subField.type))\r\n .map((subField) => ({\r\n label: subField.name,\r\n value: subField.name,\r\n })),\r\n ],\r\n };\r\n }\r\n\r\n if (currentFieldSettings?.summary === \"expression\") {\r\n fieldSettings.summaryExpression = {\r\n type: \"text\",\r\n label: \"Summary Expression\",\r\n };\r\n }\r\n }\r\n break;\r\n }\r\n\r\n const overriddenFieldSettings = customFieldDefinition?.fieldSettingsOverride\r\n ? customFieldDefinition.fieldSettingsOverride({\r\n fieldName: field.name,\r\n fieldType: field.type,\r\n fieldSettings: currentFieldSettings,\r\n originalFieldSettings: fieldSettings,\r\n })\r\n : fieldSettings;\r\n\r\n fields[field.name] = {\r\n type: \"object\",\r\n label: field.name,\r\n objectFields: overriddenFieldSettings,\r\n };\r\n\r\n return fields;\r\n }, {} as Fields);\r\n};\r\nexport default getFieldSettings;\r\n","export function getFieldSettingsByPath(fieldSettings: {\r\n [x: string]: any;\r\n}, path: string): any {\r\n return path.split(\".\").reduce((o, key) => (o ? o[key] : undefined), fieldSettings);\r\n}\r\n","import { getFieldSettingsByPath } from \"./get-settings-by-path\";\nimport type { SoftFieldDefinition, SoftFieldSettings } from \"../types/SoftFields\";\n\nconst primitiveFieldTypes = new Set<SoftFieldDefinition[\"type\"]>([\n \"text\",\n \"textarea\",\n \"number\",\n \"select\",\n \"radio\",\n \"reference\",\n]);\n\nconst isPrimitiveValue = (value: unknown): boolean =>\n [\"string\", \"number\", \"boolean\"].includes(typeof value);\n\nconst getFallbackValueForField = (type: SoftFieldDefinition[\"type\"]) => {\n switch (type) {\n case \"number\":\n return 0;\n case \"array\":\n return [];\n case \"object\":\n return {};\n default:\n return \"\";\n }\n};\n\nconst resolveExpressionSummary = (\n item: Record<string, any>,\n index: number,\n expression?: string\n) => {\n if (!expression) return \"\";\n\n let isValid = true;\n\n const result = expression.replace(/\\{([^}]+)\\}/g, (_match, token: string) => {\n if (token === \"index\") {\n return String(index);\n }\n\n if (token.startsWith(\"item.\")) {\n const value = getFieldSettingsByPath(item, token.slice(5));\n if (isPrimitiveValue(value)) {\n return String(value);\n }\n }\n\n isValid = false;\n return \"\";\n });\n\n return isValid ? result : \"\";\n};\n\nexport const isPrimitiveFieldType = (type: SoftFieldDefinition[\"type\"]) =>\n primitiveFieldTypes.has(type);\n\nexport const buildArrayDefaultItemProps = (\n subFields: SoftFieldDefinition[] = [],\n subFieldSettings: SoftFieldSettings = {}\n) => {\n if (!subFields.length) return undefined;\n\n const item: Record<string, any> = {};\n let hasValue = false;\n\n subFields.forEach((subField) => {\n const settings = subFieldSettings[subField.name];\n if (\n settings &&\n Object.prototype.hasOwnProperty.call(settings, \"defaultValue\") &&\n settings.defaultValue !== undefined\n ) {\n item[subField.name] = settings.defaultValue;\n hasValue = true;\n return;\n }\n\n item[subField.name] = getFallbackValueForField(subField.type);\n hasValue = true;\n });\n\n return hasValue ? item : undefined;\n};\n\nexport const buildArrayDefaultValue = (\n subFields: SoftFieldDefinition[] = [],\n subFieldSettings: SoftFieldSettings = {}\n) => {\n const item = buildArrayDefaultItemProps(subFields, subFieldSettings);\n\n return item ? [item] : [];\n};\n\nexport const getArrayItemSummary = (\n item: Record<string, any>,\n index = 0,\n settings?: SoftFieldSettings[string]\n) => {\n if (settings?.summary === \"field\" && settings.summaryField) {\n const value = getFieldSettingsByPath(item, settings.summaryField);\n if (isPrimitiveValue(value) && String(value).length > 0) {\n return String(value);\n }\n\n return `Item ${(index || 0) + 1}`;\n }\n\n if (settings?.summary === \"expression\") {\n const summary = resolveExpressionSummary(\n item,\n index,\n settings.summaryExpression\n );\n return summary || `Item ${(index || 0) + 1}`;\n }\n\n return `Item ${(index || 0) + 1}`;\n};\n\n// A valid array mapping path includes an array segment, e.g. \"items[].fieldName\"\nexport const isArrayMappingPath = (path: string): boolean => {\n return typeof path === \"string\" && /^[^.]+\\[\\]\\.[^.]+$/.test(path);\n};\n\n// Back-compat alias for older imports.\nexport const isArrayItemMappingPath = isArrayMappingPath;\n\nexport const getArrayBasePath = (arrayPath: string): string | null => {\n if (!isArrayMappingPath(arrayPath)) return null;\n\n const match = arrayPath.match(/^([^.]+)\\[\\]\\./);\n return match ? match[1] : null;\n};\n\nexport const getArrayItemSubPath = (arrayPath: string): string | null => {\n if (!isArrayMappingPath(arrayPath)) return null;\n\n const match = arrayPath.match(/\\[\\]\\.(.+)$/);\n return match ? match[1] : null;\n};\n","import type { Field } from \"@measured/puck\";\nimport type {\n BuiltInSoftFieldType,\n CustomFieldDefinition,\n CustomFields,\n CustomFieldReturnType,\n SoftFieldDefinition,\n SoftFieldSettings,\n SoftFieldType,\n} from \"../types/SoftFields\";\n\nconst builtInSoftFieldTypes = new Set<BuiltInSoftFieldType>([\n \"text\",\n \"textarea\",\n \"number\",\n \"select\",\n \"radio\",\n \"array\",\n \"object\",\n \"reference\",\n]);\n\nconst warnedMessages = new Set<string>();\n\nconst warnOnce = (message: string): void => {\n if (warnedMessages.has(message)) {\n return;\n }\n\n warnedMessages.add(message);\n console.warn(message);\n};\n\nexport const isBuiltInSoftFieldType = (\n fieldType: string\n): fieldType is BuiltInSoftFieldType => {\n return builtInSoftFieldTypes.has(fieldType as BuiltInSoftFieldType);\n};\n\nexport const resolveCustomFieldDefinition = (\n fieldType: SoftFieldType,\n customFields?: CustomFields\n): CustomFieldDefinition | undefined => {\n if (isBuiltInSoftFieldType(fieldType)) {\n return undefined;\n }\n\n return customFields?.[fieldType];\n};\n\nexport const resolveCustomFieldReturnType = (\n fieldType: SoftFieldType,\n customFields?: CustomFields\n): CustomFieldReturnType | null => {\n const customField = resolveCustomFieldDefinition(fieldType, customFields);\n\n if (!customField) {\n return null;\n }\n\n if (!customField.returnType) {\n warnOnce(\n `[soft-config] Custom field \"${fieldType}\" is missing a required returnType and will be skipped from mapping options.`\n );\n return null;\n }\n\n return customField.returnType;\n};\n\nexport const resolveCustomFieldSchema = (\n fieldType: SoftFieldType,\n customFields?: CustomFields\n): {\n subFields: SoftFieldDefinition[];\n subFieldSettings: SoftFieldSettings;\n} | null => {\n const customField = resolveCustomFieldDefinition(fieldType, customFields);\n if (!customField) {\n return null;\n }\n\n const returnType = resolveCustomFieldReturnType(fieldType, customFields);\n if (!returnType) {\n return null;\n }\n\n if (returnType !== \"array\" && returnType !== \"object\") {\n return null;\n }\n\n const subFields = customField.subFields || [];\n if (!subFields.length) {\n warnOnce(\n `[soft-config] Custom field \"${fieldType}\" returns ${returnType} but does not define subFields. It will be skipped from mapping options.`\n );\n return null;\n }\n\n return {\n subFields,\n subFieldSettings: customField.subFieldSettings || {},\n };\n};\n\nexport type CustomFieldTypeOption = {\n label: string;\n value: string;\n};\n\n// Prefer the custom field label in selectors, with key fallback.\nexport const getCustomFieldTypeOptions = (\n customFields?: CustomFields\n): CustomFieldTypeOption[] => {\n if (!customFields) {\n return [];\n }\n\n return Object.entries(customFields)\n .filter(([fieldType]) => !isBuiltInSoftFieldType(fieldType))\n .map(([fieldType, definition]) => ({\n label:\n typeof definition.field.label === \"string\" && definition.field.label\n ? definition.field.label\n : fieldType,\n value: fieldType,\n }));\n};\n\nexport const mapCustomReturnTypeToMappingType = (\n returnType: CustomFieldReturnType\n): Field[\"type\"] => {\n switch (returnType) {\n case \"string\":\n return \"textarea\";\n case \"number\":\n return \"number\";\n case \"boolean\":\n return \"select\";\n case \"array\":\n return \"array\";\n case \"object\":\n return \"object\";\n default:\n return \"textarea\";\n }\n};\n\nexport const isCustomFieldType = (\n fieldType: SoftFieldType,\n customFields?: CustomFields\n): boolean => {\n return !isBuiltInSoftFieldType(fieldType) && Boolean(customFields?.[fieldType]);\n};\n\nexport const getCustomFieldTypeFromMeta = (\n fieldType: SoftFieldType,\n metadataType?: string\n): string | null => {\n if (metadataType) {\n return metadataType;\n }\n\n if (isBuiltInSoftFieldType(fieldType)) {\n return null;\n }\n\n return fieldType;\n};\n","import { createContext, useContext } from \"react\";\r\nimport { useStore } from \"zustand\";\r\nimport type { StoreApi } from \"zustand\";\r\nimport type { AppStore } from \"../store\";\r\n\r\nexport const appStoreContext = createContext<StoreApi<AppStore> | null>(null);\r\n\r\n// Create a hook factory similar to createUsePuck from @measured/puck\r\nexport const createUseSoftConfig = () => {\r\n // eslint-disable-next-line no-unused-vars\r\n return function useSoftConfig<T>(\r\n selector: (state: AppStore) => T,\r\n equalityFn?: (a: T, b: T) => boolean\r\n ): T {\r\n const context = useContext(appStoreContext);\r\n if (!context) {\r\n throw new Error(\r\n \"useSoftConfig must be used inside a SoftConfigProvider. Wrap your tree with <SoftConfigProvider value={store}>\"\r\n );\r\n }\r\n\r\n // Use type assertion to work around zustand's strict typing\r\n if (equalityFn) {\r\n return (useStore as any)(context, selector, equalityFn);\r\n }\r\n return useStore(context, selector);\r\n };\r\n};\r\n\r\n// Default hook instance for convenience\r\nexport const useSoftConfig = createUseSoftConfig();\r\n\r\n","/**\n * Shared helper: evaluates `_map` entries and applies mapped values to component props.\n *\n * Used by both the live builder effect (root-config.tsx) and the runtime\n * resolver (resolve-soft-component-data.ts) so the logic stays in one place.\n *\n * Array construction order (for array targets like `items[].imageUrl`):\n * 1. Start from `unmappedArrayItemDefaultValues` on the map entry (initially populated\n * from the component's `defaultItemProps`). These are the single source of\n * truth for the item \"template\".\n * 2. Overlay the mapped value for each array index.\n * The result is a freshly-constructed array whose length equals the mapped\n * source array and whose unmapped props come from the defaults above.\n */\n\nimport equal from \"react-fast-compare\";\nimport { setPropertyByPath } from \"./set-prop-by-path\";\nimport {\n getArrayBasePath,\n getArrayItemSubPath,\n isArrayMappingPath,\n} from \"./array-field-utils\";\nimport type {\n ApplyMappingOptions,\n ApplyMappingResult,\n MapEntry,\n} from \"../types/Mapping\";\n\nexport const resolveValueByPath = (source: any, path: string): any => {\n if (!path) return source;\n\n const segments = path.split(\".\");\n\n const resolveSegments = (current: any, index: number): any => {\n if (current === null || current === undefined) return undefined;\n if (index >= segments.length) return current;\n\n const segment = segments[index];\n\n if (segment.endsWith(\"[]\")) {\n const arrayKey = segment.slice(0, -2);\n const arraySource = arrayKey ? current?.[arrayKey] : current;\n const resolvedArray = Array.isArray(arraySource)\n ? arraySource\n : Array.isArray(arraySource?.defaultValue)\n ? arraySource.defaultValue\n : undefined;\n\n if (!resolvedArray) return undefined;\n if (index === segments.length - 1) return resolvedArray;\n\n return resolvedArray.map((item: any) => resolveSegments(item, index + 1));\n }\n\n return resolveSegments(current[segment], index + 1);\n };\n\n return resolveSegments(source, 0);\n};\n\nconst resolveFieldSettingEntryByPath = (\n settings: Record<string, any>,\n path: string\n): any => {\n if (!path) return undefined;\n\n const segments = path.split(\".\");\n let currentSettings: Record<string, any> | undefined = settings;\n let currentEntry: any;\n\n for (const segmentWithArraySuffix of segments) {\n const segment = segmentWithArraySuffix.endsWith(\"[]\")\n ? segmentWithArraySuffix.slice(0, -2)\n : segmentWithArraySuffix;\n\n if (!currentSettings || typeof currentSettings !== \"object\") {\n return undefined;\n }\n\n currentEntry = currentSettings[segment];\n if (currentEntry === undefined) {\n return undefined;\n }\n\n currentSettings = currentEntry?.subFieldSettings;\n }\n\n return currentEntry;\n};\n\n/**\n * Evaluate every `_map` entry and apply the results to `props`.\n *\n * @param props The component props to mutate (caller should pass a shallow copy).\n * @param fieldSettings Root-level `_fieldSettings` for resolving `from` paths.\n * @param map The `_map` array from the component.\n * @param resolveInput Strategy for resolving `from` values. Two modes:\n * - `\"fieldSettings\"` (builder): read from `fieldSettings` only.\n * - `\"propsFirst\"` (runtime): prefer live prop values, fall back\n * to fieldSettings `defaultValue`.\n */\nexport function applyMapping(\n props: Record<string, any>,\n fieldSettings: Record<string, any>,\n map: MapEntry[],\n resolveInput: \"fieldSettings\" | \"propsFirst\" = \"fieldSettings\",\n options?: ApplyMappingOptions\n): ApplyMappingResult {\n const newProps: Record<string, any> = { ...props };\n const sourceProps = options?.sourceProps ?? props;\n const mappedArrayPaths = new Set<string>();\n let changed = false;\n const changedArrayBases = new Set<string>();\n\n for (const entry of map) {\n const { from, to, transform } = entry;\n if (!from || !to) continue;\n\n const fromPaths = Array.isArray(from) ? from : [from];\n const toPaths = Array.isArray(to) ? to : [to];\n\n const hasInvalidPair = fromPaths.some((fp, idx) => {\n const tp = toPaths[idx] || toPaths[0];\n if (typeof fp !== \"string\" || typeof tp !== \"string\") return false;\n return isArrayMappingPath(fp) && !isArrayMappingPath(tp);\n });\n if (hasInvalidPair) continue;\n\n const inputValues = fromPaths.map((f) => {\n if (resolveInput === \"propsFirst\") {\n const propVal = resolveValueByPath(sourceProps, f);\n if (propVal !== undefined) return propVal;\n\n const setting = resolveValueByPath(fieldSettings, f);\n if (\n setting &&\n Object.prototype.hasOwnProperty.call(setting, \"defaultValue\")\n ) {\n return setting.defaultValue;\n }\n return propVal;\n }\n const directValue = resolveValueByPath(fieldSettings, f);\n if (directValue !== undefined) {\n return directValue;\n }\n\n return resolveFieldSettingEntryByPath(fieldSettings, f);\n });\n\n const resolvedInputs = inputValues.map((v) =>\n resolveInput === \"fieldSettings\" ? v?.defaultValue : v\n );\n let result = transform ? transform(resolvedInputs, newProps) : inputValues[0];\n\n if (\n resolveInput === \"fieldSettings\" &&\n !transform &&\n result !== undefined &&\n typeof result === \"object\" &&\n result !== null &&\n \"defaultValue\" in result\n ) {\n result = result.defaultValue;\n }\n\n const isSingleArrayTarget =\n toPaths.length === 1 &&\n typeof toPaths[0] === \"string\" &&\n isArrayMappingPath(toPaths[0]);\n\n if (isSingleArrayTarget) {\n const toPath = toPaths[0] as string;\n const arrayBase = getArrayBasePath(toPath);\n const subProp = getArrayItemSubPath(toPath) || \"\";\n if (!arrayBase) continue;\n\n const defaultArray = Array.isArray(options?.arrayDefaults?.[arrayBase])\n ? options?.arrayDefaults?.[arrayBase]\n : [];\n const currentArrayAtPath = resolveValueByPath(newProps, arrayBase);\n const currentArray = Array.isArray(currentArrayAtPath)\n ? currentArrayAtPath\n : [];\n\n const isFromArrayPath =\n typeof fromPaths[0] === \"string\" && isArrayMappingPath(fromPaths[0]);\n\n const sourceArray = isFromArrayPath\n ? Array.isArray(result)\n ? result\n : result !== undefined\n ? [result]\n : []\n : Array.isArray(result)\n ? result\n : defaultArray.map(() => result);\n\n let defaults: Record<string, any> =\n entry.unmappedArrayItemDefaultValues ||\n entry.defaultOverrides ||\n {};\n\n if (typeof defaults === \"string\") {\n try {\n defaults = JSON.parse(defaults);\n } catch (e) {\n defaults = {};\n }\n }\n\n const targetLength = sourceArray.length;\n\n const constructed = Array.from({ length: targetLength }).map((_, idx) => {\n const mappedValue = sourceArray[idx];\n const defaultItem =\n defaultArray[idx] && typeof defaultArray[idx] === \"object\"\n ? defaultArray[idx]\n : {};\n const currentItem =\n currentArray[idx] && typeof currentArray[idx] === \"object\"\n ? currentArray[idx]\n : {};\n const item: Record<string, any> = {\n ...defaultItem,\n ...defaults,\n ...currentItem,\n };\n\n if (subProp && mappedValue !== undefined) {\n setPropertyByPath(item, subProp, mappedValue);\n }\n\n return item;\n });\n\n // Multiple `_map` rows can target the same array base. Build the final\n // array from the current props so sibling rows compose instead of\n // overwriting each other and re-triggering no-op replace dispatches.\n const originalArray = resolveValueByPath(newProps, arrayBase);\n if (!equal(originalArray, constructed)) {\n setPropertyByPath(newProps, arrayBase, constructed);\n changedArrayBases.add(arrayBase);\n }\n\n mappedArrayPaths.add(arrayBase);\n } else if (toPaths.length === 1 && Array.isArray(result) && toPaths[0].includes(\"array\")) {\n const toPath = toPaths[0];\n const original = resolveValueByPath(newProps, toPath);\n if (!equal(original, result)) {\n setPropertyByPath(newProps, toPath, result);\n changed = true;\n }\n } else if (Array.isArray(result) && toPaths.length > 1) {\n result.forEach((val: any, idx: number) => {\n if (toPaths[idx]) {\n const orig = resolveValueByPath(newProps, toPaths[idx]);\n if (!equal(orig, val)) {\n setPropertyByPath(newProps, toPaths[idx], val);\n changed = true;\n }\n }\n });\n } else if (toPaths[0]) {\n const finalValue = result;\n const originalValue = resolveValueByPath(newProps, toPaths[0]);\n\n if (!equal(originalValue, finalValue)) {\n setPropertyByPath(newProps, toPaths[0], finalValue);\n changed = true;\n }\n }\n }\n\n // Only report a change when the final array value differs from the input.\n // This prevents the builder root effect from dispatching replace actions for\n // transient intermediate states produced while composing multiple array maps.\n const hasNetArrayChanges = Array.from(changedArrayBases).some((arrayBase) =>\n !equal(resolveValueByPath(props, arrayBase), resolveValueByPath(newProps, arrayBase))\n );\n\n return { newProps, mappedArrayPaths, changed: changed || hasNetArrayChanges };\n}\n","export function setPropertyByPath(props: any, path: string, value: any) {\r\n const parts = path.split(\".\");\r\n const last = parts.pop()!;\r\n let cur = props;\r\n for (const p of parts) {\r\n if (typeof cur[p] !== \"object\" || cur[p] === null) cur[p] = {};\r\n cur = cur[p];\r\n }\r\n cur[last] = value;\r\n}\r\n","import type { Field } from \"@measured/puck\";\r\nimport type { MappingOption } from \"../../types/Mapping\";\r\nimport type {\r\n CustomFields,\r\n SoftFieldDefinition,\r\n SoftFieldSettings,\r\n} from \"../../types/SoftFields\";\r\nimport {\r\n isBuiltInSoftFieldType,\r\n mapCustomReturnTypeToMappingType,\r\n resolveCustomFieldReturnType,\r\n resolveCustomFieldSchema,\r\n} from \"../custom-fields\";\r\n\r\nconst hasArrayMappingPath = (value: string) => value.includes(\"[]\");\r\n\r\nconst isBareArrayPath = (value: string) =>\r\n !hasArrayMappingPath(value) && !value.includes(\".\");\r\n\r\n/**\r\n * Filters toOptions based on the selected fromPath.\r\n * - If fromPath contains an array segment, only return array-path to-options.\r\n * - If fromPath is a bare array, only return bare array to-options.\r\n * - Otherwise, hide array-path to-options (prevent array-to-scalar mismatches).\r\n */\r\nexport function filterToOptionsForFrom(\r\n fromPath: string | undefined,\r\n toOptions: MappingOption[],\r\n): MappingOption[] {\r\n if (!fromPath) return toOptions;\r\n\r\n const fromHasArrayMapping = hasArrayMappingPath(fromPath);\r\n const fromIsBareArray = isBareArrayPath(fromPath);\r\n\r\n return toOptions.filter((option) => {\r\n const optionHasArrayMapping = hasArrayMappingPath(option.value);\r\n\r\n if (fromHasArrayMapping) {\r\n return optionHasArrayMapping;\r\n }\r\n\r\n if (fromIsBareArray) {\r\n return isBareArrayPath(option.value);\r\n }\r\n\r\n return !optionHasArrayMapping;\r\n });\r\n}\r\n\r\n/**\r\n * Recursively generates options for select fields from a nested field structure.\r\n * @param fields The root fields object\r\n * @param prefix The prefix for dot notation (used internally)\r\n * @returns Array of { label, value } for select options\r\n */\r\nexport function generateFieldOptions(\r\n fields: Record<string, Field>,\r\n prefix = \"\",\r\n): MappingOption[] {\r\n const opts: MappingOption[] = [];\r\n function recurse(current: Record<string, Field>, prefix: string) {\r\n Object.entries(current).forEach(([key, fld]) => {\r\n if (fld.type === \"slot\") return;\r\n if (key === \"_map\") return;\r\n if (key === \"_slotEnabled\") return;\r\n \r\n const path = prefix ? `${prefix}.${key}` : key;\r\n if (fld.type === \"object\" && fld.objectFields) {\r\n recurse(fld.objectFields, path);\r\n } else if (fld.type === \"array\" && fld.arrayFields) {\r\n recurse(fld.arrayFields, \r\n path + \"[]\"\r\n );\r\n } else {\r\n opts.push({ label: path, value: path, type: fld.type });\r\n }\r\n });\r\n }\r\n recurse(fields, prefix);\r\n return opts;\r\n}\r\n\r\nexport function generateDynamicFieldOptions(\r\n _fields: SoftFieldDefinition[] | undefined,\r\n _fieldSettings: SoftFieldSettings | undefined,\r\n customFields?: CustomFields,\r\n prefix = \"\",\r\n): MappingOption[] {\r\n const opts: MappingOption[] = [];\r\n\r\n if (!_fields) return opts;\r\n\r\n function recurse(\r\n fields: SoftFieldDefinition[],\r\n fieldSettings: SoftFieldSettings,\r\n currentPrefix: string,\r\n ) {\r\n fields.forEach((field) => {\r\n const settings = fieldSettings[field.name];\r\n const customReturnType = resolveCustomFieldReturnType(\r\n field.type,\r\n customFields\r\n );\r\n\r\n const path = currentPrefix\r\n ? `${currentPrefix}.${field.name}`\r\n : field.name;\r\n\r\n if (customReturnType) {\r\n if (customReturnType === \"array\" || customReturnType === \"object\") {\r\n const customSchema = resolveCustomFieldSchema(field.type, customFields);\r\n if (!customSchema) {\r\n return;\r\n }\r\n\r\n recurse(\r\n customSchema.subFields,\r\n customSchema.subFieldSettings,\r\n path + (customReturnType === \"array\" ? \"[]\" : \"\")\r\n );\r\n return;\r\n }\r\n\r\n opts.push({\r\n label: path,\r\n value: path,\r\n type: mapCustomReturnTypeToMappingType(customReturnType),\r\n });\r\n return;\r\n }\r\n\r\n if (!isBuiltInSoftFieldType(field.type)) {\r\n return;\r\n }\r\n\r\n // Handle subfields if they exist\r\n if (settings?.subFields?.length) {\r\n\r\n recurse(\r\n settings.subFields,\r\n settings.subFieldSettings || {},\r\n path + (field.type === \"array\" ? \"[]\" : \"\")\r\n );\r\n } else if (field.type !== \"array\" && field.type !== \"object\") {\r\n opts.push({ label: path, value: path, type: field.type });\r\n }\r\n });\r\n }\r\n\r\n recurse(_fields, _fieldSettings || {}, prefix);\r\n\r\n return opts;\r\n}\r\n","\"use client\";\r\n\r\nimport React, { Component, ErrorInfo, ReactNode } from \"react\";\r\nimport getClassNameFactory from \"../../lib/get-class-name-factory\";\r\nimport styles from \"./styles.module.css\";\r\n\r\nconst getClassName = getClassNameFactory(\"ErrorBoundary\", styles);\r\n\r\ninterface ErrorBoundaryProps {\r\n children: ReactNode;\r\n fallback?: ReactNode | ((error: Error, resetError: () => void) => ReactNode);\r\n}\r\n\r\ninterface ErrorBoundaryState {\r\n hasError: boolean;\r\n error: Error | null;\r\n}\r\n\r\nexport class ErrorBoundary extends Component<\r\n ErrorBoundaryProps,\r\n ErrorBoundaryState\r\n> {\r\n constructor(props: ErrorBoundaryProps) {\r\n super(props);\r\n this.state = {\r\n hasError: false,\r\n error: null,\r\n };\r\n }\r\n\r\n static getDerivedStateFromError(error: Error): ErrorBoundaryState {\r\n return {\r\n hasError: true,\r\n error,\r\n };\r\n }\r\n\r\n componentDidCatch(error: Error, errorInfo: ErrorInfo): void {\r\n console.error(\"Error caught by ErrorBoundary:\", error, errorInfo);\r\n }\r\n\r\n resetError = (): void => {\r\n this.setState({\r\n hasError: false,\r\n error: null,\r\n });\r\n };\r\n\r\n render(): ReactNode {\r\n if (this.state.hasError) {\r\n // Render custom fallback UI if provided\r\n if (typeof this.props.fallback === \"function\") {\r\n return this.props.fallback(this.state.error!, this.resetError);\r\n }\r\n\r\n if (this.props.fallback) {\r\n return this.props.fallback;\r\n }\r\n\r\n // Default fallback UI\r\n return (\r\n <div className={getClassName()}>\r\n <h3 className={getClassName(\"title\")}>\r\n Component Error\r\n </h3>\r\n <details className={getClassName(\"details\")}>\r\n <summary>Show error details</summary>\r\n {this.state.error && this.state.error.toString()}\r\n </details>\r\n <button\r\n onClick={this.resetError}\r\n className={getClassName(\"button\")}\r\n >\r\n Try Again\r\n </button>\r\n </div>\r\n );\r\n }\r\n\r\n return this.props.children;\r\n }\r\n}\r\n","import classnames from \"classnames\";\r\n\r\ntype OptionsObj = Record<string, any>;\r\ntype Options = string | OptionsObj;\r\n\r\nexport const getGlobalClassName = (rootClass: string, options: Options) => {\r\n if (typeof options === \"string\") {\r\n return `${rootClass}-${options}`;\r\n } else {\r\n const mappedOptions: Options = {};\r\n for (let option in options) {\r\n mappedOptions[`${rootClass}--${option}`] = options[option];\r\n }\r\n\r\n return classnames({\r\n [rootClass]: true,\r\n ...mappedOptions,\r\n });\r\n }\r\n};\r\n\r\nconst getClassNameFactory =\r\n (\r\n rootClass: string,\r\n styles: Record<string, string>,\r\n config: { baseClass?: string } = { baseClass: \"\" }\r\n ) =>\r\n (options: Options = {}) => {\r\n if (typeof options === \"string\") {\r\n const descendant = options;\r\n\r\n const style = styles[`${rootClass}-${descendant}`];\r\n\r\n if (style) {\r\n return config.baseClass + styles[`${rootClass}-${descendant}`] || \"\";\r\n }\r\n\r\n return \"\";\r\n } else if (typeof options === \"object\") {\r\n const modifiers = options;\r\n\r\n const prefixedModifiers: OptionsObj = {};\r\n\r\n for (let modifier in modifiers) {\r\n prefixedModifiers[styles[`${rootClass}--${modifier}`]] =\r\n modifiers[modifier];\r\n }\r\n\r\n const c = styles[rootClass];\r\n\r\n return (\r\n config.baseClass +\r\n classnames({\r\n [c]: !!c, // only apply the class if it exists\r\n ...prefixedModifiers,\r\n })\r\n );\r\n } else {\r\n return config.baseClass + styles[rootClass] || \"\";\r\n }\r\n };\r\n\r\nexport default getClassNameFactory;\r\n","import \"/media/manual_mount/osamuProjects/netlisian/packages/soft-config/src/puck/components/error-boundary/styles.module.css\"; export default {\"ErrorBoundary\":\"_ErrorBoundary_1xl05_5\",\"ErrorBoundary-title\":\"_ErrorBoundary-title_1xl05_21\",\"ErrorBoundary-details\":\"_ErrorBoundary-details_1xl05_31\",\"ErrorBoundary-button\":\"_ErrorBoundary-button_1xl05_39\"}","import { ComponentConfig, Config, Field, Fields } from \"@measured/puck\";\r\nimport {\r\n BuilderConfig,\r\n BuilderComponentConfig,\r\n} from \"../../types/BuilderConfig\";\r\nimport { getRootProps } from \"../get-root-props\";\r\nimport { builderRootConfig } from \"./root-config\";\r\nimport {\r\n generateDynamicFieldOptions,\r\n generateFieldOptions,\r\n} from \"./generate-field-options\";\r\nimport {\r\n getArrayBasePath,\r\n getArrayItemSubPath,\r\n isArrayMappingPath,\r\n} from \"../array-field-utils\";\r\n\r\nimport { ErrorBoundary } from \"../../components/error-boundary\";\r\nimport { AppStore } from \"../../store\";\r\nimport type { CustomFields } from \"../../types/SoftFields\";\r\n\r\n/* Generates builder soft config\r\n * - Update root to include: name, fields, fieldSettings, for soft component\r\n * - Update each component config to map the soft fields to component fields\r\n * - Add resolvePermissions to lock non-editable components\r\n */\r\nexport const builderConfig = (\r\n config: Config,\r\n overrides: AppStore[\"overrides\"],\r\n editingComponent?: string,\r\n showVersionFields: boolean = true,\r\n dependents?: Set<string>,\r\n customFields?: CustomFields\r\n): BuilderConfig => ({\r\n root: builderRootConfig(\r\n config,\r\n overrides,\r\n editingComponent,\r\n showVersionFields,\r\n customFields\r\n ),\r\n components: Object.entries({\r\n ...config.components,\r\n }).reduce(\r\n (acc, [name, component]) => {\r\n const tempComponent: ComponentConfig<BuilderComponentConfig> = {\r\n ...component,\r\n permissions: {\r\n insert: editingComponent !== name && !dependents?.has(name)\r\n },\r\n async resolveFields(data, params) {\r\n let fields: Record<string, Field> = {};\r\n\r\n if (!fields._slot) {\r\n const slotFields = Object.entries(params.fields).filter(\r\n ([_, field]) => field.type === \"slot\"\r\n );\r\n if (slotFields.length)\r\n fields._slot = {\r\n type: \"array\",\r\n label: \"Enable Dropdown Slots\",\r\n getItemSummary(item, index) {\r\n return item.slot || `Slot ${(index || 0) + 1}`;\r\n },\r\n arrayFields: {\r\n slot: {\r\n type: \"select\",\r\n label: \"Slot\",\r\n options: [\r\n { label: \"Select a slot\", value: \"\" },\r\n ...slotFields\r\n .filter(\r\n ([fieldName, field]) =>\r\n field.type === \"slot\" &&\r\n !(data.props?._slot || []).some(\r\n (s: { slot: string }) => s.slot === fieldName\r\n )\r\n )\r\n .map(([fieldName, field]) => ({\r\n label: field.label || fieldName,\r\n value: fieldName,\r\n })),\r\n ],\r\n },\r\n name: {\r\n type: \"text\",\r\n label: \"Name\",\r\n placeholder: \"Optional Slot Name\",\r\n },\r\n },\r\n };\r\n }\r\n\r\n const defaultFields =\r\n (component.resolveFields\r\n ? await component.resolveFields(data, params)\r\n : component.fields || {}) as Record<string, Field>;\r\n\r\n if (!fields._map || params.changed._map) {\r\n const rootProps = getRootProps(params.appState);\r\n const fromOptions = generateDynamicFieldOptions(\r\n rootProps?._fields || [],\r\n rootProps?._fieldSettings || {},\r\n customFields\r\n );\r\n const toOptionsFields =\r\n (component.resolveFields && data.props?._map\r\n ? await component.resolveFields(\r\n { ...data, props: { ...data.props, _map: undefined } },\r\n params\r\n )\r\n : defaultFields) as Record<string, Field>;\r\n\r\n const toOptions = generateFieldOptions(toOptionsFields);\r\n\r\n fields._map = overrides.map\r\n ? {\r\n type: \"custom\",\r\n render: ({ value, onChange, id }) => {\r\n\r\n const rootProps = getRootProps(params.appState);\r\n\r\n return overrides.map!({\r\n rootProps,\r\n value,\r\n onChange,\r\n id,\r\n props: data.props || {},\r\n fromOptions,\r\n toOptions,\r\n });\r\n },\r\n }\r\n : (() => {\r\n // Build default value sub-fields from target array's arrayFields\r\n const mapEntries = data.props?._map || [];\r\n const toPaths = mapEntries.flatMap((entry) =>\r\n Array.isArray(entry.to)\r\n ? entry.to\r\n : entry.to\r\n ? [entry.to]\r\n : []\r\n );\r\n const toPath = toPaths.find(\r\n (path) => typeof path === \"string\" && isArrayMappingPath(path)\r\n ) as string | undefined;\r\n const arrayBaseName = toPath ? getArrayBasePath(toPath) : null;\r\n const targetArrayField = arrayBaseName ? defaultFields[arrayBaseName] : null;\r\n const mappedSubProps = new Set<string>();\r\n\r\n if (arrayBaseName) {\r\n toPaths.forEach((path) => {\r\n if (typeof path !== \"string\") return;\r\n if (getArrayBasePath(path) !== arrayBaseName) return;\r\n const subProp = getArrayItemSubPath(path);\r\n if (subProp) mappedSubProps.add(subProp);\r\n });\r\n }\r\n\r\n // Build objectFields from the target array's arrayFields (primitive sub-fields only)\r\n const defaultValueFields: Record<string, Field> = {};\r\n if (targetArrayField && targetArrayField.type === \"array\" && (targetArrayField as any).arrayFields) {\r\n const arrayFields = (targetArrayField as any).arrayFields as Record<string, Field>;\r\n\r\n Object.entries(arrayFields).forEach(([key, fld]) => {\r\n // Skip the mapped field itself — it gets its value from the mapping\r\n if (mappedSubProps.has(key)) return;\r\n // Only include primitive fields\r\n if (fld.type === \"array\" || fld.type === \"object\" || fld.type === \"slot\") return;\r\n defaultValueFields[key] = { ...fld, label: fld.label || key };\r\n });\r\n }\r\n\r\n const baseArrayFields: Record<string, Field> = {\r\n from: {\r\n type: \"select\",\r\n label: \"From\",\r\n options: [\r\n { label: \"Select a field\", value: \"\" },\r\n ...fromOptions.map(({ label, value }) => ({\r\n label,\r\n value,\r\n })),\r\n ],\r\n },\r\n to: {\r\n type: \"select\",\r\n label: \"To\",\r\n options: [\r\n { label: \"Select a field\", value: \"\" },\r\n ...toOptions.map(({ label, value }: { label: string; value: string }) => ({\r\n label,\r\n value,\r\n })),\r\n ],\r\n },\r\n };\r\n if (arrayBaseName && Object.keys(defaultValueFields).length > 0) {\r\n baseArrayFields.unmappedArrayItemDefaultValues = {\r\n type: \"object\",\r\n label: \"Default Item Values\",\r\n objectFields: defaultValueFields,\r\n } as Field;\r\n }\r\n\r\n return {\r\n type: \"array\" as const,\r\n label: \"Dynamic Field Map\",\r\n arrayFields: baseArrayFields,\r\n };\r\n })();\r\n }\r\n\r\n fields = {\r\n ...fields,\r\n ...defaultFields,\r\n } as Record<string, Field>;\r\n\r\n return fields as Fields;\r\n },\r\n resolveData: ({ props }, { lastData }) => {\r\n // Migrate string default values to objects if needed (from old textarea UI)\r\n // and ensure they are objects for Puck's object field to avoid crashes.\r\n const _map = (props._map || []).map((item) => {\r\n const newItem = { ...item };\r\n if (typeof newItem.unmappedArrayItemDefaultValues === \"string\") {\r\n try {\r\n newItem.unmappedArrayItemDefaultValues = JSON.parse(\r\n newItem.unmappedArrayItemDefaultValues\r\n );\r\n } catch (e) {\r\n newItem.unmappedArrayItemDefaultValues = {};\r\n }\r\n } else if (!newItem.unmappedArrayItemDefaultValues) {\r\n newItem.unmappedArrayItemDefaultValues = {};\r\n }\r\n return newItem;\r\n });\r\n\r\n const readOnlyFields = _map.flatMap((item) => item.to);\r\n\r\n // Also mark parent array fields as read-only when any child\r\n // item property is mapped (e.g. items[].imageUrl → items)\r\n const readOnlyArrayBases = readOnlyFields\r\n .filter((field): field is string => typeof field === \"string\")\r\n .map(getArrayBasePath)\r\n .filter((base): base is string => base !== null);\r\n\r\n if (_map.length) {\r\n return {\r\n props: { ...props, _map },\r\n readOnly: [\r\n ...readOnlyFields.map((f) => String(f)),\r\n ...readOnlyArrayBases,\r\n ].reduce(\r\n (acc, field) => ({ ...acc, [field]: true }),\r\n {}\r\n ),\r\n };\r\n }\r\n\r\n // Resetting the read-only props\r\n return {\r\n props: { ...props, _map },\r\n readOnly: {},\r\n };\r\n },\r\n render: (props) => {\r\n return <ErrorBoundary>{component.render(props)}</ErrorBoundary>;\r\n },\r\n };\r\n\r\n acc[name] = tempComponent;\r\n return acc;\r\n },\r\n {} as Config[\"components\"]\r\n ),\r\n categories: config.categories || {},\r\n});\r\n","export const TECHNICAL_KEYS = new Set([\"_map\", \"_slot\", \"id\", \"_version\"]);\n","import { ComponentData, ComponentDataOptionalId } from \"@measured/puck\";\r\n\r\nexport const stripIdFromProps = (\r\n components: ComponentData[],\r\n allowedTypes: string[]\r\n): ComponentDataOptionalId[] => {\r\n return components.map((component) => sanitizeComponent(component, allowedTypes));\r\n};\r\n\r\nconst sanitizeComponent = (\r\n component: ComponentData,\r\n allowedTypes: string[]\r\n): ComponentDataOptionalId => {\r\n const cleanProps: ComponentDataOptionalId['props'] = {};\r\n\r\n for (const [key, value] of Object.entries(component.props)) {\r\n if (key === \"id\") continue;\r\n\r\n // Nested component\r\n if (\r\n value &&\r\n typeof value === \"object\" &&\r\n \"type\" in value &&\r\n allowedTypes.includes((value as any).type)\r\n ) {\r\n cleanProps[key] = sanitizeComponent(value as ComponentData, allowedTypes);\r\n continue;\r\n }\r\n\r\n cleanProps[key] = value;\r\n }\r\n\r\n return {\r\n ...component,\r\n props: cleanProps,\r\n };\r\n};\r\n","import { AppState, Field, Config, Fields, ComponentData } from \"@measured/puck\";\r\nimport { SoftComponent, SoftSubComponent } from \"../types/SoftComponent\";\r\nimport { BuilderRootConfig } from \"../types/BuilderConfig\";\r\nimport {\r\n buildArrayDefaultItemProps,\r\n buildArrayDefaultValue,\r\n getArrayItemSummary,\r\n getArrayBasePath,\r\n isArrayMappingPath,\r\n} from \"./array-field-utils\";\r\nimport { TECHNICAL_KEYS } from \"./soft-component-constants\";\r\nimport { stripIdFromProps } from \"./strip-id\";\r\nimport {\r\n resolveCustomFieldDefinition,\r\n resolveCustomFieldReturnType,\r\n resolveCustomFieldSchema,\r\n} from \"./custom-fields\";\r\nimport type { CustomFields } from \"../types/SoftFields\";\r\n\r\nconst getSubComponents = (\r\n content: AppState[\"data\"][\"content\"],\r\n componentConfigs: Config[\"components\"],\r\n fieldSettings: Record<string, any>,\r\n slots: SoftComponent[\"slots\"]\r\n): SoftComponent[\"components\"] => {\r\n if (!content || !Array.isArray(content)) return [];\r\n\r\n return content.map((componentProps) => {\r\n const componentConfig = componentConfigs[componentProps.type];\r\n\r\n const enabledSlotNames = new Set(\r\n (componentProps.props?._slot || []).map((s: { slot: string }) => s.slot)\r\n );\r\n const components =\r\n Object.entries(componentConfig?.fields || {})\r\n .filter(\r\n ([key, field]) => field.type === \"slot\" && !enabledSlotNames.has(key) // Skip if slot is enabled\r\n )\r\n .reduce(\r\n (acc, [fieldKey, _]) => {\r\n acc[fieldKey] = getSubComponents(\r\n (componentProps.props?.[\r\n fieldKey\r\n ] as AppState[\"data\"][\"content\"]) || [],\r\n componentConfigs,\r\n fieldSettings,\r\n slots\r\n );\r\n return acc;\r\n },\r\n {} as { [slot: string]: SoftSubComponent }\r\n ) || {};\r\n\r\n const map = componentProps.props?._map || [];\r\n const mappedPaths = new Set<string>();\r\n map.forEach((item: any) => {\r\n const to = Array.isArray(item.to) ? item.to : [item.to];\r\n to.forEach((path: string) => {\r\n if (path) {\r\n if (isArrayMappingPath(path)) {\r\n const basePath = getArrayBasePath(path);\r\n if (basePath) mappedPaths.add(basePath);\r\n } else {\r\n mappedPaths.add(path);\r\n }\r\n }\r\n });\r\n });\r\n\r\n const fixedProps = Object.entries({\r\n ...componentConfig?.defaultProps,\r\n ...componentProps.props,\r\n } as Record<string, any>).reduce((acc, [key, value]) => {\r\n if (!TECHNICAL_KEYS.has(key) && !mappedPaths.has(key)) {\r\n acc[key] = value;\r\n }\r\n return acc;\r\n }, {} as Record<string, any>);\r\n\r\n (componentProps.props._slot || []).forEach(\r\n (s: { slot: string; name: string }) => {\r\n if (s.slot)\r\n {\r\n const slotComponentProps = componentProps.props[s.slot] ||\r\n componentConfig?.defaultProps?.[s.slot]\r\n \r\n slots[s.name || `${componentProps.props.id}-${s.slot}`] =\r\n stripIdFromProps(slotComponentProps,\r\n Object.keys(componentConfigs)\r\n );\r\n }\r\n }\r\n );\r\n\r\n const subComponent: SoftSubComponent[number] = {\r\n map: componentProps.props?._map || [],\r\n fixedProps: fixedProps,\r\n type: componentProps.type,\r\n components: components,\r\n enabledSlots: componentProps.props?._slot || [],\r\n };\r\n\r\n return subComponent;\r\n });\r\n};\r\n\r\nconst softFieldsToPuckFields = (\r\n fields: BuilderRootConfig[\"_fields\"],\r\n fieldSettings: BuilderRootConfig[\"_fieldSettings\"],\r\n customFields?: CustomFields\r\n): { [key: string]: Field } => {\r\n return (\r\n fields?.reduce(\r\n (acc, field) => {\r\n const customFieldDefinition = resolveCustomFieldDefinition(\r\n field.type,\r\n customFields\r\n );\r\n const customReturnType = resolveCustomFieldReturnType(\r\n field.type,\r\n customFields\r\n );\r\n\r\n if (customFieldDefinition && customReturnType) {\r\n acc[field.name] = {\r\n ...customFieldDefinition.field,\r\n type: \"custom\",\r\n label: customFieldDefinition.field.label || field.name,\r\n } as Field;\r\n\r\n return acc;\r\n }\r\n\r\n switch (field.type) {\r\n case \"text\":\r\n case \"textarea\":\r\n acc[field.name] = { type: field.type, label: field.name };\r\n break;\r\n case \"number\":\r\n acc[field.name] = {\r\n type: field.type,\r\n label: field.name,\r\n min: fieldSettings?.[field.name]?.min,\r\n max: fieldSettings?.[field.name]?.max,\r\n step: fieldSettings?.[field.name]?.step,\r\n };\r\n break;\r\n case \"select\":\r\n case \"radio\":\r\n acc[field.name] = {\r\n type: field.type,\r\n label: field.name,\r\n options: fieldSettings?.[field.name]?.options || [],\r\n };\r\n break;\r\n // TODO: Default item props\r\n case \"array\":\r\n const currentArraySettings = fieldSettings?.[field.name] || {};\r\n acc[field.name] = {\r\n type: field.type,\r\n label: field.name,\r\n min: currentArraySettings.min,\r\n max: currentArraySettings.max,\r\n arrayFields: softFieldsToPuckFields(\r\n currentArraySettings.subFields || [],\r\n currentArraySettings.subFieldSettings || {},\r\n customFields\r\n ),\r\n defaultItemProps: buildArrayDefaultItemProps(\r\n currentArraySettings.subFields,\r\n currentArraySettings.subFieldSettings\r\n ),\r\n getItemSummary(item, index) {\r\n return getArrayItemSummary(item, index, currentArraySettings);\r\n },\r\n };\r\n break;\r\n // TODO: Needs testing to see if it works\r\n case \"object\":\r\n acc[field.name] = {\r\n type: field.type,\r\n label: field.name,\r\n objectFields: softFieldsToPuckFields(\r\n fieldSettings?.[field.name]?.subFields || [],\r\n fieldSettings?.[field.name]?.subFieldSettings || {},\r\n customFields\r\n ),\r\n };\r\n break;\r\n default:\r\n acc[field.name] = { type: \"text\", label: field.name };\r\n }\r\n\r\n return acc;\r\n },\r\n {} as { [key: string]: Field }\r\n ) || {}\r\n );\r\n};\r\n\r\nexport const softComponentFromAppState = (\r\n appState: AppState<any>,\r\n configComponents: Config[\"components\"],\r\n editedItem: ComponentData,\r\n metadata: {\r\n name: string;\r\n category?: string;\r\n },\r\n customFields?: CustomFields\r\n): [SoftComponent, string] => {\r\n const rootProps = appState.data.root?.props || {};\r\n\r\n const fields = (rootProps._fields || []) as BuilderRootConfig[\"_fields\"];\r\n const field_settings =\r\n (rootProps._fieldSettings as BuilderRootConfig[\"_fieldSettings\"]) || {};\r\n const normalizedFieldSettings: BuilderRootConfig[\"_fieldSettings\"] = {\r\n ...field_settings,\r\n };\r\n\r\n (fields || []).forEach((field) => {\r\n const customFieldDefinition = resolveCustomFieldDefinition(\r\n field.type,\r\n customFields\r\n );\r\n const customReturnType = resolveCustomFieldReturnType(\r\n field.type,\r\n customFields\r\n );\r\n\r\n if (!customFieldDefinition || !customReturnType) {\r\n return;\r\n }\r\n\r\n const schema = resolveCustomFieldSchema(field.type, customFields);\r\n const existingSettings = normalizedFieldSettings[field.name] || {};\r\n\r\n normalizedFieldSettings[field.name] = {\r\n ...existingSettings,\r\n customFieldType: field.type,\r\n customFieldReturnType: customReturnType,\r\n ...(schema\r\n ? {\r\n subFields: schema.subFields,\r\n subFieldSettings: schema.subFieldSettings,\r\n }\r\n : {}),\r\n };\r\n });\r\n\r\n // Extract all custom root fields (all starting with _ but not built-in)\r\n const builtInRootProps = new Set([\r\n \"_name\",\r\n \"_category\",\r\n \"_version\",\r\n \"_versions\",\r\n \"_fields\",\r\n \"_fieldSettings\",\r\n ]);\r\n\r\n const customRootProps = Object.keys(rootProps)\r\n .filter((key) => key.startsWith(\"_\") && !builtInRootProps.has(key))\r\n .reduce(\r\n (acc, key) => {\r\n acc[key] = rootProps[key];\r\n return acc;\r\n },\r\n {} as Record<string, any>\r\n );\r\n\r\n const slots: SoftComponent[\"slots\"] = {};\r\n\r\n const components = getSubComponents(\r\n [editedItem],\r\n configComponents,\r\n normalizedFieldSettings,\r\n slots\r\n );\r\n\r\n const defaultProps = {\r\n ...Object.keys(normalizedFieldSettings).reduce(\r\n (acc, field) => {\r\n const fieldDefinition = (fields || []).find((item) => item.name === field);\r\n const customFieldReturnType =\r\n normalizedFieldSettings[field]?.customFieldReturnType;\r\n\r\n if (\r\n fieldDefinition?.type === \"array\" ||\r\n customFieldReturnType === \"array\"\r\n ) {\r\n acc[field] =\r\n normalizedFieldSettings[field].defaultValue !== undefined\r\n ? normalizedFieldSettings[field].defaultValue\r\n : buildArrayDefaultValue(\r\n normalizedFieldSettings[field].subFields,\r\n normalizedFieldSettings[field].subFieldSettings\r\n );\r\n return acc;\r\n }\r\n\r\n acc[field] = normalizedFieldSettings[field].defaultValue;\r\n return acc;\r\n },\r\n {} as Record<string, any>\r\n ),\r\n ...slots,\r\n };\r\n\r\n return [\r\n {\r\n name: metadata.name,\r\n category: metadata.category,\r\n fields: {\r\n ...softFieldsToPuckFields(fields, normalizedFieldSettings, customFields),\r\n ...Object.keys(slots).reduce((acc, slot) => {\r\n acc[slot] = { type: \"slot\", label: slot };\r\n return acc;\r\n }, {} as Fields),\r\n },\r\n fieldSettings: normalizedFieldSettings,\r\n defaultProps,\r\n rootProps: customRootProps,\r\n components,\r\n slots,\r\n },\r\n rootProps._version || \"1.0.0\",\r\n ];\r\n};\r\n","import { v4 as uuidv4 } from \"uuid\";\r\n\r\nexport const generateId = (type?: string | number) =>\r\n type ? `${type}-${uuidv4()}` : uuidv4();\r\n","import { Overrides } from \"../types/Overrides\";\nimport { BuilderRootConfig } from \"../types/BuilderConfig\";\n\nconst defaultToCamelCase = (value: string): string => {\n const tokens = value\n .trim()\n .replace(/[^a-zA-Z0-9\\s_-]/g, \" \")\n .split(/[\\s_-]+/)\n .filter(Boolean);\n\n if (tokens.length === 0) return \"\";\n\n const [first, ...rest] = tokens;\n return `${first.toLowerCase()}${rest\n .map((token) => token.charAt(0).toUpperCase() + token.slice(1).toLowerCase())\n .join(\"\")}`;\n};\n\nexport const createComponentKeyFromName = (\n displayName: string,\n overrides: Overrides,\n context: Partial<BuilderRootConfig> & {\n existingKeys: string[];\n state: \"building\" | \"remodeling\" | \"ready\" | \"inspecting\";\n }\n): string => {\n const key = overrides.componentNameToKey\n ? overrides.componentNameToKey(displayName, context)\n : defaultToCamelCase(displayName);\n\n return key.trim();\n};\n\nexport const getComponentNameFromKey = (\n key: string,\n overrides?: Overrides\n): string => {\n if (overrides?.componentKeyToName) {\n return overrides.componentKeyToName(key);\n }\n return key;\n};\n","import { AppState, ComponentData, Config, Fields } from \"@measured/puck\";\r\nimport { SoftSubComponent } from \"../types/SoftComponent\";\r\nimport { VersionedSoftComponent } from \"../types/SoftComponent\";\r\nimport { generateId } from \"./generate-id\";\r\nimport { BuilderRootConfig } from \"../types/BuilderConfig\";\r\nimport { setPropertyByPath } from \"./set-prop-by-path\";\r\nimport { getComponentNameFromKey } from \"./component-key\";\r\nimport { Overrides } from \"../types/Overrides\";\r\nimport {\r\n buildArrayDefaultValue,\r\n getArrayBasePath,\r\n isArrayMappingPath,\r\n} from \"./array-field-utils\";\r\nimport { applyMapping } from \"./apply-mapping\";\r\nimport {\r\n resolveCustomFieldSchema,\r\n} from \"./custom-fields\";\r\nimport type {\r\n CustomFieldReturnType,\r\n CustomFields,\r\n} from \"../types/SoftFields\";\r\n\r\nconst mergeFieldSettings = (\r\n generated: BuilderRootConfig[\"_fieldSettings\"] = {},\r\n persisted: BuilderRootConfig[\"_fieldSettings\"] = {}\r\n): BuilderRootConfig[\"_fieldSettings\"] => {\r\n return Object.entries(persisted).reduce((acc, [fieldName, value]) => {\r\n const current = acc[fieldName] || {};\r\n\r\n acc[fieldName] = {\r\n ...current,\r\n ...value,\r\n subFieldSettings:\r\n current.subFieldSettings || value?.subFieldSettings\r\n ? mergeFieldSettings(\r\n current.subFieldSettings || {},\r\n value?.subFieldSettings || {}\r\n )\r\n : undefined,\r\n };\r\n\r\n return acc;\r\n }, { ...generated });\r\n};\r\n\r\n/**\r\n * Convert Puck fields back to soft field definitions\r\n */\r\nconst puckFieldsToSoftFields = (\r\n fields: Fields,\r\n slots: Set<string>,\r\n persistedFieldSettings: BuilderRootConfig[\"_fieldSettings\"] = {},\r\n customFields?: CustomFields\r\n): {\r\n fields: BuilderRootConfig[\"_fields\"];\r\n fieldSettings: BuilderRootConfig[\"_fieldSettings\"];\r\n} => {\r\n const softFields: BuilderRootConfig[\"_fields\"] = [];\r\n const fieldSettings: BuilderRootConfig[\"_fieldSettings\"] = {};\r\n\r\n Object.entries(fields).forEach(([fieldName, field]) => {\r\n const persistedSettings = persistedFieldSettings?.[fieldName];\r\n const fieldWithMeta = field as typeof field & {\r\n customFieldType?: string;\r\n customFieldReturnType?: CustomFieldReturnType;\r\n };\r\n\r\n const customFieldType =\r\n fieldWithMeta.customFieldType || persistedSettings?.customFieldType;\r\n const customFieldReturnType =\r\n fieldWithMeta.customFieldReturnType ||\r\n persistedSettings?.customFieldReturnType ||\r\n (customFieldType ? customFields?.[customFieldType]?.returnType : undefined);\r\n\r\n // Skip slot fields as they're handled separately\r\n if (slots.has(fieldName)) {\r\n return;\r\n }\r\n\r\n // Skip the _version field as it's implicit\r\n if (fieldName === \"_version\") {\r\n return;\r\n }\r\n\r\n if (field.type === \"custom\" && customFieldType) {\r\n softFields.push({ name: fieldName, type: customFieldType });\r\n\r\n const customSchema = resolveCustomFieldSchema(customFieldType, customFields);\r\n\r\n fieldSettings[fieldName] = {\r\n ...(persistedSettings || {}),\r\n customFieldType,\r\n customFieldReturnType,\r\n ...(customSchema\r\n ? {\r\n subFields: customSchema.subFields,\r\n subFieldSettings: customSchema.subFieldSettings,\r\n }\r\n : {}),\r\n };\r\n\r\n if (!Object.prototype.hasOwnProperty.call(fieldSettings[fieldName], \"defaultValue\")) {\r\n fieldSettings[fieldName].defaultValue = undefined;\r\n }\r\n\r\n return;\r\n }\r\n\r\n switch (field.type) {\r\n case \"text\":\r\n case \"textarea\":\r\n softFields.push({ name: fieldName, type: field.type });\r\n break;\r\n\r\n case \"number\":\r\n softFields.push({ name: fieldName, type: \"number\" });\r\n fieldSettings[fieldName] = {\r\n min: field.min,\r\n max: field.max,\r\n step: field.step,\r\n };\r\n break;\r\n\r\n case \"select\":\r\n case \"radio\":\r\n softFields.push({ name: fieldName, type: field.type });\r\n fieldSettings[fieldName] = {\r\n options: field.options ? [...field.options] : [],\r\n };\r\n break;\r\n\r\n case \"array\":\r\n softFields.push({ name: fieldName, type: \"array\" });\r\n const arrayFieldsResult = puckFieldsToSoftFields(\r\n field.arrayFields || {},\r\n new Set(),\r\n persistedSettings?.subFieldSettings,\r\n customFields\r\n );\r\n fieldSettings[fieldName] = {\r\n ...(persistedSettings || {}),\r\n subFields: arrayFieldsResult.fields,\r\n subFieldSettings: arrayFieldsResult.fieldSettings,\r\n };\r\n break;\r\n\r\n case \"object\":\r\n softFields.push({ name: fieldName, type: \"object\" });\r\n const objectFieldsResult = puckFieldsToSoftFields(\r\n field.objectFields || {},\r\n new Set(),\r\n persistedSettings?.subFieldSettings,\r\n customFields\r\n );\r\n fieldSettings[fieldName] = {\r\n ...(persistedSettings || {}),\r\n subFields: objectFieldsResult.fields,\r\n subFieldSettings: objectFieldsResult.fieldSettings,\r\n };\r\n break;\r\n\r\n default:\r\n softFields.push({ name: fieldName, type: \"text\" });\r\n }\r\n\r\n // Add default value from defaultProps if it exists\r\n fieldSettings[fieldName] = {\r\n ...(fieldSettings[fieldName] || persistedSettings || {}),\r\n defaultValue: Object.prototype.hasOwnProperty.call(\r\n fieldSettings[fieldName] || persistedSettings || {},\r\n \"defaultValue\"\r\n )\r\n ? (fieldSettings[fieldName] || persistedSettings || {}).defaultValue\r\n : undefined,\r\n };\r\n });\r\n\r\n return { fields: softFields, fieldSettings };\r\n};\r\n\r\n/**\r\n * Reconstruct component data from soft sub-components\r\n */\r\nconst reconstructComponents = (\r\n subComponents: SoftSubComponent,\r\n componentConfigs: Config[\"components\"],\r\n softComponentProps: Record<string, any>\r\n): ComponentData[] => {\r\n return subComponents.map((subComponent) => {\r\n const componentConfig = componentConfigs[subComponent.type];\r\n\r\n // Start with fixed props and technical metadata\r\n const props: Record<string, any> = {\r\n ...subComponent.fixedProps,\r\n _map: subComponent.map,\r\n };\r\n\r\n const arrayDefaults = (subComponent.map || []).reduce(\r\n (acc, mapEntry) => {\r\n const toPaths = Array.isArray(mapEntry.to) ? mapEntry.to : [mapEntry.to];\r\n toPaths.forEach((path) => {\r\n if (typeof path !== \"string\" || !isArrayMappingPath(path)) return;\r\n const arrayBase = getArrayBasePath(path);\r\n if (!arrayBase || acc[arrayBase]) return;\r\n\r\n const defaultValue = componentConfig?.defaultProps?.[arrayBase];\r\n if (Array.isArray(defaultValue)) acc[arrayBase] = defaultValue;\r\n });\r\n return acc;\r\n },\r\n {} as Record<string, any[]>\r\n );\r\n\r\n const sourceProps = {\r\n ...(componentConfig?.defaultProps || {}),\r\n ...softComponentProps,\r\n ...props,\r\n };\r\n\r\n // Use applyMapping to resolve and merge mapped values\r\n // This handles array mappings, transforms, and unmappedArrayItemDefaultValues\r\n const { newProps } = applyMapping(\r\n props,\r\n {}, // fieldSettings not needed for \"propsFirst\" mode as it resolves from propsFirst\r\n subComponent.map || [],\r\n \"propsFirst\",\r\n {\r\n sourceProps,\r\n arrayDefaults,\r\n }\r\n );\r\n\r\n // Update props with mapped values\r\n Object.assign(props, newProps);\r\n\r\n // Handle enabled slots\r\n if (subComponent.enabledSlots.length > 0) {\r\n props._slot = subComponent.enabledSlots;\r\n\r\n // Add slot content from soft component props\r\n subComponent.enabledSlots.forEach(({ slot, name }) => {\r\n const slotName = name || `${props.id}-${slot}`;\r\n if (softComponentProps[slotName] !== undefined) {\r\n props[slot] = softComponentProps[slotName];\r\n }\r\n });\r\n }\r\n\r\n // Recursively handle nested components in other slots\r\n Object.entries(subComponent.components).forEach(([slotKey, nestedComponents]) => {\r\n if (nestedComponents.length > 0) {\r\n props[slotKey] = reconstructComponents(\r\n nestedComponents,\r\n componentConfigs,\r\n softComponentProps\r\n );\r\n } else {\r\n props[slotKey] = [];\r\n }\r\n });\r\n\r\n const componentData: ComponentData = {\r\n type: subComponent.type,\r\n props: {\r\n id: props.id || generateId(subComponent.type),\r\n ...props,\r\n },\r\n };\r\n\r\n return componentData;\r\n });\r\n};\r\n\r\n/**\r\n * Convert a soft component back to AppState format for remodeling.\r\n * This is the inverse operation of softComponentFromAppState.\r\n *\r\n * @param softComponent - The soft component to convert\r\n * @param componentName - The name of the soft component\r\n * @param version - The version of the soft component\r\n * @param versions - The available versions of the soft component\r\n * @param componentProps - The props from the soft component instance\r\n * @param componentConfigs - The available component configs\r\n * @returns AppState data object with root props and content\r\n */\r\nexport const softComponentToAppState = (\r\n softComponent: VersionedSoftComponent[\"versions\"][string],\r\n componentName: string,\r\n version: string,\r\n versions: string[],\r\n componentProps: Record<string, any>,\r\n componentConfigs: Config[\"components\"],\r\n overrides: Overrides,\r\n displayName?: string,\r\n category?: string,\r\n customFields?: CustomFields\r\n): Pick<AppState[\"data\"], \"root\" | \"content\"> => {\r\n // Convert soft fields back to builder format\r\n const slots = new Set(Object.keys(softComponent.slots));\r\n const { fields, fieldSettings } = puckFieldsToSoftFields(\r\n softComponent.fields,\r\n slots,\r\n softComponent.fieldSettings,\r\n customFields\r\n );\r\n const mergedFieldSettings = mergeFieldSettings(\r\n fieldSettings,\r\n softComponent.fieldSettings || {}\r\n ) || {};\r\n\r\n // Set default values from soft component\r\n Object.entries(softComponent.defaultProps).forEach(([key, value]) => {\r\n if (mergedFieldSettings && mergedFieldSettings[key] && !slots.has(key)) {\r\n mergedFieldSettings[key].defaultValue = value;\r\n }\r\n });\r\n\r\n (fields || []).forEach((field) => {\r\n if (field.type !== \"array\" || slots.has(field.name)) return;\r\n\r\n const settings = mergedFieldSettings[field.name] || {};\r\n if (settings.defaultValue === undefined) {\r\n settings.defaultValue = buildArrayDefaultValue(\r\n settings.subFields,\r\n settings.subFieldSettings\r\n );\r\n }\r\n\r\n mergedFieldSettings[field.name] = settings;\r\n });\r\n\r\n // Build root props for the builder\r\n let rootProps: BuilderRootConfig = {\r\n _name: displayName || getComponentNameFromKey(componentName, overrides),\r\n _category: category,\r\n _version: version,\r\n _versions: versions,\r\n _fields: fields,\r\n _fieldSettings: mergedFieldSettings,\r\n ...(softComponent.rootProps || {}),\r\n };\r\n\r\n if (overrides.onRemodel) {\r\n rootProps = {\r\n ...rootProps,\r\n ...overrides.onRemodel(componentName),\r\n };\r\n }\r\n\r\n // Reconstruct component tree from soft components\r\n const content = reconstructComponents(\r\n softComponent.components,\r\n componentConfigs,\r\n componentProps\r\n );\r\n\r\n return {\r\n root: {\r\n props: {\r\n title: \"Soft Component Builder\",\r\n ...rootProps,\r\n },\r\n },\r\n content,\r\n };\r\n};\r\n","export const rootAreaId = \"root\";\r\nexport const rootZone = \"default-zone\";\r\nexport const rootDroppableId = `${rootAreaId}:${rootZone}`;\r\n","import React, { useMemo, memo } from \"react\";\r\nimport equal from \"react-fast-compare\";\r\nimport { SoftComponent, SoftSubComponent } from \"../../types/SoftComponent\";\r\nimport { Config, WithId, WithPuckProps } from \"@measured/puck\";\r\nimport { applyMapping } from \"../../lib/apply-mapping\";\r\nimport { ErrorBoundary } from \"../error-boundary\";\r\n\r\n// ─────────────────────────────────────────────────────────────────────────────\r\n// Safe deep clone\r\n//\r\n// Rules:\r\n// • Recursively clones plain objects and arrays.\r\n// • Preserves by reference: functions, React elements, class instances,\r\n// and anything else with a non-plain prototype (e.g. Radix refs, DOM\r\n// nodes, WeakMap keys). This is the correct alternative to JSON.parse/\r\n// stringify, which strips these and breaks Radix UI / Puck internals.\r\n// ─────────────────────────────────────────────────────────────────────────────\r\n\r\nfunction isPlainObject(val: unknown): val is Record<string, unknown> {\r\n if (typeof val !== \"object\" || val === null) return false;\r\n if (React.isValidElement(val)) return false;\r\n if (\"$$typeof\" in val) return false;\r\n const proto = Object.getPrototypeOf(val);\r\n return proto === Object.prototype || proto === null;\r\n}\r\n\r\n\r\nfunction cloneData<T>(value: T): T {\r\n if (value === null || value === undefined) return value;\r\n if (typeof value === \"function\") return value;\r\n if (Array.isArray(value)) return (value as unknown[]).map(cloneData) as unknown as T;\r\n if (!isPlainObject(value)) return value; // preserve class instances, refs, React elements\r\n return Object.fromEntries(\r\n Object.entries(value).map(([k, v]) => [k, cloneData(v)])\r\n ) as T;\r\n}\r\n\r\n// ─────────────────────────────────────────────────────────────────────────────\r\n// Types\r\n// ─────────────────────────────────────────────────────────────────────────────\r\n\r\ntype ComponentProps = WithId<WithPuckProps<Record<string, any>>>;\r\n\r\ninterface SharedRenderProps {\r\n softComponentFields: SoftComponent[\"fields\"];\r\n softComponentFieldSettings?: Record<string, any>;\r\n configComponents: Config[\"components\"];\r\n props: ComponentProps;\r\n depth?: number;\r\n}\r\n\r\ninterface SubComponentRendererProps extends Required<SharedRenderProps> {\r\n subComponent: any;\r\n index: number;\r\n}\r\n\r\n// ─────────────────────────────────────────────────────────────────────────────\r\n// SubComponentRenderer\r\n//\r\n// Renders a single sub-component entry. Extracted from the map loop so that\r\n// all hooks are called at the top level of a real component — fixing the\r\n// \"hooks inside .map()\" Rules of Hooks violation in the previous iteration.\r\n// ─────────────────────────────────────────────────────────────────────────────\r\n\r\nconst SubComponentRenderer = memo(\r\n ({\r\n subComponent,\r\n softComponentFields,\r\n softComponentFieldSettings,\r\n configComponents,\r\n props,\r\n depth,\r\n index,\r\n }: SubComponentRendererProps) => {\r\n // Destructure here — rest is derived from props so it doesn't need to be\r\n // a separate dep in useMemo; we access props[key] directly inside memos.\r\n const { id, puck, editMode } = props;\r\n\r\n const componentConfig = configComponents[subComponent?.type];\r\n\r\n // ── Hooks — ALL called unconditionally before any early returns ───────────\r\n\r\n /**\r\n * Deterministic stable ID.\r\n *\r\n * Includes `index` so siblings of the same type don't collide.\r\n * Avoids uuid() which produced a new value on every render, causing\r\n * child components to unmount and remount unnecessarily.\r\n */\r\n const stableId = useMemo(\r\n () =>\r\n depth === 0\r\n ? id\r\n : `${subComponent.type}-${id}-d${depth}-i${index}`,\r\n [id, depth, subComponent.type, index]\r\n );\r\n\r\n /**\r\n * Compute final resolved props in a single memo:\r\n * 1. Deep-clone fixedProps (safe for Radix refs / functions)\r\n * 2. Apply field mappings (transform must be pure — see note below)\r\n * 3. Wire slot render fns (internal recursive or externally provided)\r\n *\r\n * Combining all three here prevents multiple intermediate object allocations\r\n * and ensures one coherent invalidation boundary.\r\n *\r\n * NOTE on transform purity:\r\n * A transform that calls a state setter (e.g. props.onChange()) will fire\r\n * during the render phase and trigger an infinite re-render loop.\r\n * transforms MUST be pure — return a value, never cause side effects.\r\n */\r\n const finalProps = useMemo(() => {\r\n // Guard inside memo rather than before hooks — this keeps the hook call\r\n // count constant regardless of whether componentConfig is defined.\r\n if (!componentConfig) return {};\r\n\r\n const clonedProps = cloneData(subComponent.fixedProps || {});\r\n\r\n // ── Field mappings (via applyMapping for proper array-mapping support) ──\r\n // `from` paths reference the parent's props; `to` paths target the\r\n // sub-component's own props. applyMapping uses a single object for\r\n // both resolution and assignment, so we merge them for the call.\r\n if (subComponent.map?.length) {\r\n const mergedInput = { ...clonedProps, ...props };\r\n const { newProps } = applyMapping(\r\n mergedInput,\r\n softComponentFieldSettings || {},\r\n subComponent.map,\r\n \"propsFirst\"\r\n );\r\n\r\n // Copy only the keys that belong to the sub-component back\r\n const parentKeys = new Set(Object.keys(props));\r\n for (const [key, value] of Object.entries(newProps)) {\r\n if (!parentKeys.has(key) || key in clonedProps) {\r\n clonedProps[key] = value;\r\n }\r\n }\r\n }\r\n\r\n // ── Slot wiring ─────────────────────────────────────────────────────────\r\n Object.entries(componentConfig.fields || {}).forEach(\r\n ([slotKey, field]: [string, any]) => {\r\n if (field.type !== \"slot\") return;\r\n\r\n const enabledSlot = subComponent?.enabledSlots?.find(\r\n (s: any) => s.slot === slotKey\r\n );\r\n\r\n if (enabledSlot) {\r\n // Externally provided slot — read directly from props to keep\r\n // `rest` out of the dep list (it's a new object every render).\r\n const slotName =\r\n enabledSlot.name || `${subComponent.fixedProps?.id}-${slotKey}`;\r\n clonedProps[slotKey] = props[slotName] ?? (() => null);\r\n } else {\r\n // Internal recursive slot\r\n clonedProps[slotKey] = ({\r\n className,\r\n style,\r\n }: {\r\n className?: string;\r\n style?: React.CSSProperties;\r\n }) => (\r\n <div className={className} style={style}>\r\n <SoftRender\r\n softComponentFields={softComponentFields}\r\n softComponentFieldSettings={softComponentFieldSettings}\r\n softSubComponent={subComponent?.components?.[slotKey] ?? []}\r\n configComponents={configComponents}\r\n props={props}\r\n depth={depth + 1}\r\n />\r\n </div>\r\n );\r\n }\r\n }\r\n );\r\n\r\n return clonedProps;\r\n }, [\r\n componentConfig,\r\n subComponent,\r\n props,\r\n softComponentFields,\r\n softComponentFieldSettings,\r\n configComponents,\r\n depth,\r\n ]);\r\n\r\n // ── Conditional render — AFTER all hooks ──────────────────────────────────\r\n if (!componentConfig) return null;\r\n\r\n const ComponentRender = componentConfig.render;\r\n\r\n return (\r\n <ErrorBoundary>\r\n <ComponentRender\r\n id={stableId}\r\n editMode={editMode}\r\n puck={puck}\r\n {...finalProps}\r\n />\r\n </ErrorBoundary>\r\n );\r\n },\r\n\r\n // Custom comparator for SubComponentRenderer.\r\n //\r\n // Uses deep equality on subComponent (it may be a new reference even when\r\n // semantically unchanged if the parent SoftRender array is reconstructed)\r\n // and on props (the primary driver of field-mapping changes).\r\n // configComponents and softComponentFields are treated as stable config\r\n // references — reference equality is intentional and fast here.\r\n (prev, next) =>\r\n prev.depth === next.depth &&\r\n prev.index === next.index &&\r\n prev.configComponents === next.configComponents &&\r\n prev.softComponentFields === next.softComponentFields &&\r\n equal(prev.props, next.props) &&\r\n equal(prev.subComponent, next.subComponent) &&\r\n equal(prev.softComponentFieldSettings, next.softComponentFieldSettings)\r\n);\r\n\r\nSubComponentRenderer.displayName = \"SubComponentRenderer\";\r\n\r\n// ─────────────────────────────────────────────────────────────────────────────\r\n// SoftRender\r\n//\r\n// Maps a softSubComponent schema array to rendered output.\r\n// Memoized with a custom comparator that correctly covers all props —\r\n// the previous version omitted configComponents and softComponentFields,\r\n// which would silently suppress re-renders when those changed.\r\n// ─────────────────────────────────────────────────────────────────────────────\r\n\r\nexport const SoftRender = memo(\r\n ({\r\n softComponentFields,\r\n softComponentFieldSettings,\r\n softSubComponent,\r\n configComponents,\r\n props,\r\n depth = 0,\r\n }: SharedRenderProps & { softSubComponent: SoftSubComponent }) => {\r\n if (!softSubComponent?.length) return null;\r\n\r\n return (\r\n <>\r\n {softSubComponent.map((subComponent: any, index: number) => (\r\n <SubComponentRenderer\r\n key={`${subComponent?.type ?? \"comp\"}-${index}-${depth}`}\r\n subComponent={subComponent}\r\n softComponentFields={softComponentFields}\r\n softComponentFieldSettings={softComponentFieldSettings || {}}\r\n configComponents={configComponents}\r\n props={props}\r\n depth={depth}\r\n index={index}\r\n />\r\n ))}\r\n </>\r\n );\r\n },\r\n\r\n // Covers all five props — not just `props` and `softSubComponent`.\r\n // configComponents / softComponentFields: reference equality (stable config).\r\n // softComponentFieldSettings: deep equality (may carry dynamic defaults).\r\n // props / softSubComponent: deep equality (primary render drivers).\r\n (prev, next) =>\r\n prev.configComponents === next.configComponents &&\r\n prev.softComponentFields === next.softComponentFields &&\r\n equal(prev.props, next.props) &&\r\n equal(prev.softSubComponent, next.softSubComponent) &&\r\n equal(prev.softComponentFieldSettings, next.softComponentFieldSettings)\r\n);\r\n\r\nSoftRender.displayName = \"SoftRender\";","import { SoftRender } from \"../components/soft-render\";\r\nimport { SoftComponents } from \"../types/SoftComponent\";\r\nimport { ComponentConfig, Config, DefaultComponentProps, Field } from \"@measured/puck\";\r\nimport type { CustomFields } from \"../types/SoftFields\";\r\n\r\nconst hydrateCustomField = (\r\n fieldName: string,\r\n field: Field,\r\n fieldSettings: Record<string, unknown> | undefined,\r\n customFields?: CustomFields\r\n): Field => {\r\n if (field.type !== \"custom\") {\r\n return field;\r\n }\r\n\r\n const fieldWithMeta = field as Field & {\r\n customFieldType?: string;\r\n };\r\n\r\n const customFieldType =\r\n fieldWithMeta.customFieldType ||\r\n (fieldSettings?.[fieldName] as { customFieldType?: string } | undefined)\r\n ?.customFieldType;\r\n\r\n if (!customFieldType) {\r\n return field;\r\n }\r\n\r\n const customField = customFields?.[customFieldType];\r\n if (!customField) {\r\n return field;\r\n }\r\n\r\n return {\r\n ...field,\r\n ...customField.field,\r\n type: \"custom\",\r\n label: field.label || customField.field.label || fieldName,\r\n } as Field;\r\n};\r\n\r\nexport const createVersionedComponentConfig = (\r\n componentName: string,\r\n displayName: string,\r\n version: string,\r\n allVersions: string[],\r\n config: Config,\r\n softComponents: SoftComponents,\r\n defaultProps: DefaultComponentProps,\r\n showVersioning = true,\r\n customFields?: CustomFields\r\n): ComponentConfig => {\r\n const softConfig = config;\r\n return {\r\n label: displayName,\r\n fields: Object.fromEntries(\r\n (\r\n Object.entries(\r\n softComponents[componentName].versions?.[version]?.fields\r\n ) || [] // BUG: Issue not version dependent as has no co-relation with data. Refresh page or make custom implementation for slot.\r\n ).filter(\r\n ([key, field]) => field.type === \"slot\"\r\n ).map(([key, field]) => [key, { ...field }])\r\n ),\r\n defaultProps: {\r\n ...defaultProps,\r\n version,\r\n },\r\n resolveFields: (data) => {\r\n const selectedVersion =\r\n ((data.props as Record<string, unknown> | undefined)?.version as\r\n | string\r\n | undefined) || version;\r\n\r\n const versionedComponent =\r\n softComponents[componentName]?.versions[selectedVersion];\r\n\r\n let fields: Record<string, Field> = {};\r\n\r\n if (showVersioning) {\r\n fields.version = {\r\n label: \"Version\",\r\n type: \"select\",\r\n options: allVersions.map((v) => ({ label: v, value: v })),\r\n }\r\n }\r\n\r\n Object.entries(versionedComponent?.fields || {})\r\n .filter(([, field]) => field.type !== \"slot\")\r\n .forEach(([key, field]) => {\r\n fields[key] = hydrateCustomField(\r\n key,\r\n field,\r\n versionedComponent?.fieldSettings,\r\n customFields\r\n );\r\n })\r\n\r\n\r\n return fields;\r\n },\r\n render: (props) => {\r\n const selectedVersion =\r\n ((props as Record<string, unknown>).version as string | undefined) ||\r\n version;\r\n const versionedComponent =\r\n softComponents[componentName]?.versions[selectedVersion];\r\n\r\n return (\r\n <SoftRender\r\n softComponentFields={versionedComponent.fields}\r\n softComponentFieldSettings={versionedComponent.fieldSettings}\r\n softSubComponent={versionedComponent.components}\r\n configComponents={softConfig.components}\r\n props={props}\r\n />\r\n );\r\n },\r\n };\r\n};\r\n","import { ComponentData } from \"@measured/puck\";\r\nimport { SoftSubComponent } from \"../../types/SoftComponent\";\r\nimport { generateId } from \"../generate-id\";\r\nimport { applyMapping } from \"../apply-mapping\";\r\n\r\nexport const subComponentDecomposer = (\r\n componentRootData: ComponentData,\r\n softSubComponent: SoftSubComponent[number]\r\n): ComponentData => {\r\n const resolvedProps = {\r\n ...softSubComponent.fixedProps,\r\n };\r\n\r\n softSubComponent.map?.forEach((mapItem) => {\r\n const { newProps } = applyMapping(\r\n resolvedProps,\r\n {},\r\n [mapItem],\r\n \"propsFirst\",\r\n {\r\n sourceProps: componentRootData.props || {},\r\n }\r\n );\r\n\r\n Object.assign(resolvedProps, newProps);\r\n });\r\n\r\n // Convert enabled slots to key value object\r\n softSubComponent.enabledSlots.forEach(({ slot, name }) => {\r\n const referenceName = name || `${softSubComponent.fixedProps?.id}-${slot}`;\r\n resolvedProps[slot] = componentRootData.props?.[referenceName] || [];\r\n });\r\n\r\n // Convert subComponents to componentData\r\n Object.entries(softSubComponent.components).forEach(\r\n ([slotKey, subComponents]) => {\r\n resolvedProps[slotKey] = subComponents.map((subComponent) =>\r\n subComponentDecomposer(componentRootData, subComponent)\r\n );\r\n }\r\n );\r\n\r\n const accItem: ComponentData = {\r\n type: softSubComponent.type,\r\n props: {\r\n ...resolvedProps,\r\n id: generateId(softSubComponent.type),\r\n },\r\n };\r\n\r\n return accItem;\r\n};\r\n","import { DefaultComponentProps } from \"@measured/puck\";\nimport { applyMapping } from \"../apply-mapping\";\nimport type { MapEntry } from \"../../types/Mapping\";\n\nexport const resolveSoftComponentData = (\n props: {\n [x: string]: any;\n _map?: MapEntry[];\n id: string;\n },\n _fieldSettings: Record<string, any> = {}\n): {\n [x: string]: any;\n id: string;\n} => {\n const map = props._map;\n if (!map?.length) return { ...props };\n\n const { newProps } = applyMapping(\n props,\n _fieldSettings,\n map,\n \"propsFirst\"\n );\n\n return newProps as typeof props;\n};\n","import { ComponentData } from \"@measured/puck\";\r\nimport { SoftComponents } from \"../types/SoftComponent\";\r\nimport { subComponentDecomposer } from \"./builder/sub-component-decomposer\";\r\nimport { resolveSoftComponentData } from \"./builder/resolve-soft-component-data\";\r\n\r\n/**\r\n * Decomposes a single soft component one level into its constituent sub-components.\r\n * This performs a single-level decomposition only - it does not recursively decompose\r\n * nested soft components.\r\n * \r\n * If `fieldSettings` are provided, mappings from `_map` are applied to the component's\r\n * props before decomposition, ensuring that dynamically mapped values are baked in.\r\n * \r\n * @param componentData - The component data to decompose (must be a soft component)\r\n * @param softComponents - The registry of all soft components\r\n * @param fieldSettings - Optional root-level `_fieldSettings` for resolving mapped values\r\n * @returns Array of decomposed sub-components\r\n * @throws Error if component data is invalid or soft component not found\r\n */\r\nexport function decomposeSoftComponent(\r\n componentData: ComponentData,\r\n softComponents: SoftComponents,\r\n fieldSettings?: Record<string, any>\r\n): ComponentData[] {\r\n if (!componentData?.type || !componentData?.props.id) {\r\n throw new Error(\"Component data must have type and id to decompose.\");\r\n }\r\n\r\n const version = (componentData.props as any)?.version || \"1.0.0\";\r\n const softComponent = softComponents[componentData.type]?.versions[version];\r\n\r\n if (!softComponent) {\r\n throw new Error(\r\n `Soft component \"${componentData.type}\" version \"${version}\" not found.`\r\n );\r\n }\r\n\r\n // Apply field mappings before decomposition so sub-components receive resolved\r\n // values. This is for mapped component props, not array editor rows; slot\r\n // arrays are handled later by the dissolver via recursive component traversal.\r\n let resolvedComponentData = componentData;\r\n if (fieldSettings && componentData.props?._map?.length) {\r\n const resolvedProps = resolveSoftComponentData(\r\n componentData.props as any,\r\n fieldSettings\r\n );\r\n resolvedComponentData = {\r\n ...componentData,\r\n props: resolvedProps,\r\n };\r\n }\r\n\r\n // Decompose into direct sub-components (one level only)\r\n const decomposedComponentData: ComponentData[] = softComponent.components.map(\r\n (softSubComponent) => {\r\n return subComponentDecomposer(resolvedComponentData, softSubComponent);\r\n }\r\n );\r\n\r\n return decomposedComponentData;\r\n}\r\n\r\n/**\r\n * Checks if a component is a soft component (exists in the soft components registry).\r\n * \r\n * @param componentType - The component type to check\r\n * @param softComponents - The registry of all soft components\r\n * @returns True if the component is a soft component, false otherwise\r\n */\r\nexport function isSoftComponent(\r\n componentType: string,\r\n softComponents: SoftComponents\r\n): boolean {\r\n return componentType in softComponents;\r\n}\r\n","import { ComponentData, Config, Data, walkTree } from \"@measured/puck\";\r\nimport { SoftComponents } from \"../types/SoftComponent\";\r\nimport { decomposeSoftComponent } from \"./decompose-soft-component\";\r\n\r\n/**\r\n * Demolishes a soft component by replacing all instances of it with its decomposed parts.\r\n * This removes the soft component from both the data and the configuration.\r\n * \r\n * Process:\r\n * 1. Walk through all data and decompose instances of the specified component\r\n * 2. Remove the component from the soft components registry\r\n * 3. Remove the component from the config\r\n * \r\n * @param componentName - The name of the soft component to demolish\r\n * @param data - The current Puck data structure\r\n * @param config - The current Puck config\r\n * @param softComponents - The registry of all soft components\r\n * @returns Object containing updated data, config, and softComponents\r\n * \r\n * @example\r\n * ```ts\r\n * const result = demolishSoftComponent(\"Card\", data, config, softComponents);\r\n * // All Card components in data are replaced with their sub-components\r\n * // Card is removed from config and softComponents\r\n * ```\r\n */\r\nexport function demolishSoftComponent(\r\n componentName: string,\r\n data: Data,\r\n config: Config,\r\n softComponents: SoftComponents\r\n): {\r\n data: Data;\r\n config: Config;\r\n softComponents: SoftComponents;\r\n} {\r\n // Decompose all instances of the component in the data\r\n const resolvedData = walkTree(data, config, (components) => {\r\n components.forEach((componentData, index) => {\r\n if (componentData.type === componentName) {\r\n const decomposed = decomposeSoftComponent(componentData, softComponents);\r\n if (decomposed.length) {\r\n components.splice(index, 1, ...decomposed);\r\n }\r\n }\r\n });\r\n return components;\r\n });\r\n\r\n // Remove the soft component from the registry\r\n const newSoftComponents = { ...softComponents };\r\n delete newSoftComponents[componentName];\r\n\r\n // Remove the component from the config\r\n const newConfig: Config = {\r\n ...config,\r\n components: Object.entries(config.components).reduce(\r\n (acc, [name, component]) => {\r\n if (name !== componentName) {\r\n acc[name] = component;\r\n }\r\n return acc;\r\n },\r\n {} as Config[\"components\"]\r\n ),\r\n };\r\n\r\n return {\r\n data: resolvedData,\r\n config: newConfig,\r\n softComponents: newSoftComponents,\r\n };\r\n}\r\n","import { Config, ComponentConfig } from \"@measured/puck\";\r\nimport { SoftComponents, SoftSubComponent, VersionedSoftComponent } from \"../types/SoftComponent\";\r\nimport { Overrides } from \"../types/Overrides\";\r\nimport type { CustomFields } from \"../types/SoftFields\";\r\nimport { createVersionedComponentConfig } from \"./create-versioned-component-config\";\r\n\r\ntype Hydrator = NonNullable<Overrides[\"hydrateMapTransform\"]>;\r\n\r\nfunction hydrateSubComponentsTransforms(\r\n subComponents: SoftSubComponent,\r\n hydrator: Hydrator,\r\n context: {\r\n componentName: string;\r\n version: string;\r\n subComponentPath: string[];\r\n softComponent: VersionedSoftComponent[\"versions\"][string];\r\n }\r\n): SoftSubComponent {\r\n return subComponents.map((subComponent, idx) => {\r\n const path = [...context.subComponentPath, `${subComponent.type}:${idx}`];\r\n\r\n const mapped = subComponent.map?.map((mapItem) => {\r\n if (mapItem?.transform) return mapItem;\r\n const transform = hydrator(mapItem as any, {\r\n ...context,\r\n subComponentPath: path,\r\n });\r\n return transform ? { ...mapItem, transform } : mapItem;\r\n });\r\n\r\n const nestedComponents = Object.fromEntries(\r\n Object.entries(subComponent.components || {}).map(([slotKey, children]) => [\r\n slotKey,\r\n hydrateSubComponentsTransforms(children, hydrator, {\r\n ...context,\r\n subComponentPath: [...path, slotKey],\r\n }),\r\n ])\r\n );\r\n\r\n return {\r\n ...subComponent,\r\n map: mapped,\r\n components: nestedComponents,\r\n };\r\n });\r\n}\r\n\r\nexport function hydrateSoftComponentsTransforms(\r\n softComponents: SoftComponents,\r\n hydrator: Hydrator\r\n): SoftComponents {\r\n const hydrated: SoftComponents = {};\r\n\r\n Object.entries(softComponents || {}).forEach(([name, comp]) => {\r\n const versions: VersionedSoftComponent[\"versions\"] = {};\r\n Object.entries(comp.versions || {}).forEach(([version, softComponent]) => {\r\n versions[version] = {\r\n ...softComponent,\r\n components: hydrateSubComponentsTransforms(softComponent.components, hydrator, {\r\n componentName: name,\r\n version,\r\n subComponentPath: [],\r\n softComponent,\r\n }),\r\n };\r\n });\r\n\r\n hydrated[name] = {\r\n ...comp,\r\n name: comp.name || name,\r\n defaultVersion: comp.defaultVersion,\r\n versions,\r\n };\r\n });\r\n\r\n return hydrated;\r\n}\r\n\r\n/**\r\n * Extracts all component dependencies from a SoftComponent's structure\r\n * @param softComponents - All soft components\r\n * @param componentName - The component to analyze\r\n * @param version - The version to analyze\r\n * @returns Set of component names that this component depends on\r\n */\r\nfunction extractDependencies(\r\n softComponents: SoftComponents,\r\n componentName: string,\r\n version: string\r\n): Set<string> {\r\n const dependencies = new Set<string>();\r\n const component = softComponents[componentName]?.versions?.[version];\r\n\r\n if (!component) {\r\n return dependencies;\r\n }\r\n\r\n // Recursively extract dependencies from subcomponents\r\n const processSubComponents = (subComponents: any[]): void => {\r\n if (!Array.isArray(subComponents)) return;\r\n\r\n for (const subComponent of subComponents) {\r\n if (subComponent?.type) {\r\n // Add this type as a dependency\r\n dependencies.add(subComponent.type);\r\n\r\n // Recursively process nested components in slots\r\n if (subComponent.components) {\r\n Object.values(subComponent.components).forEach((nestedComponents) => {\r\n processSubComponents(nestedComponents as any[]);\r\n });\r\n }\r\n }\r\n }\r\n };\r\n\r\n processSubComponents(component.components);\r\n\r\n return dependencies;\r\n}\r\n\r\n/**\r\n * Builds a reverse dependency graph showing which components depend on each component\r\n * Also enriches softComponents with stored dependencies for backward compatibility\r\n *\r\n * @param softComponents - All soft components\r\n * @returns Map of componentName -> Set of components that depend on it\r\n */\r\nexport function buildReverseDependencyGraph(\r\n softComponents: SoftComponents\r\n): Map<string, Set<string>> {\r\n const reverseDeps = new Map<string, Set<string>>();\r\n\r\n for (const [componentName, component] of Object.entries(softComponents)) {\r\n const defaultVersion =\r\n component.defaultVersion || Object.keys(component.versions || {}).pop();\r\n\r\n if (!defaultVersion) continue;\r\n\r\n // Get all versions for this component\r\n Object.entries(component.versions || {}).forEach(([version, versionedComp]) => {\r\n const dependencies = extractDependencies(softComponents, componentName, version);\r\n\r\n // Store dependencies in the component for persistence\r\n if (!component.dependencies) {\r\n component.dependencies = {};\r\n }\r\n component.dependencies[version] = dependencies;\r\n\r\n // Build reverse graph: for each dependency, add this component as dependent\r\n for (const dep of dependencies) {\r\n if (!reverseDeps.has(dep)) {\r\n reverseDeps.set(dep, new Set());\r\n }\r\n reverseDeps.get(dep)!.add(componentName);\r\n }\r\n });\r\n }\r\n\r\n return reverseDeps;\r\n}\r\n\r\n/**\r\n * Performs topological sort on soft components based on their dependencies\r\n * Components that only depend on hard components come first, then their dependents, etc.\r\n * \r\n * @param softComponents - All soft components\r\n * @param hardComponentNames - Set of hard component names (from hardConfig)\r\n * @returns Array of component names in dependency order, or throws if circular dependency detected\r\n */\r\nfunction topologicalSort(\r\n softComponents: SoftComponents,\r\n hardComponentNames: Set<string>\r\n): string[] {\r\n const sorted: string[] = [];\r\n const visiting = new Set<string>();\r\n const visited = new Set<string>();\r\n\r\n // Build dependency graph for all soft components\r\n const dependencyGraph = new Map<string, Set<string>>();\r\n\r\n for (const [componentName, component] of Object.entries(softComponents)) {\r\n const defaultVersion =\r\n component.defaultVersion || Object.keys(component.versions || {}).pop();\r\n\r\n if (!defaultVersion) continue;\r\n\r\n const allDeps = extractDependencies(\r\n softComponents,\r\n componentName,\r\n defaultVersion\r\n );\r\n\r\n // Filter to only soft component dependencies (ignore hard components)\r\n const softDeps = new Set(\r\n [...allDeps].filter((dep) => !hardComponentNames.has(dep))\r\n );\r\n\r\n dependencyGraph.set(componentName, softDeps);\r\n }\r\n\r\n // DFS-based topological sort\r\n function visit(componentName: string): void {\r\n if (visited.has(componentName)) return;\r\n\r\n if (visiting.has(componentName)) {\r\n throw new Error(\r\n `Circular dependency detected involving component: ${componentName}`\r\n );\r\n }\r\n\r\n visiting.add(componentName);\r\n\r\n const dependencies = dependencyGraph.get(componentName) || new Set();\r\n\r\n for (const dep of dependencies) {\r\n // Only visit if it's a soft component\r\n if (softComponents[dep]) {\r\n visit(dep);\r\n }\r\n }\r\n\r\n visiting.delete(componentName);\r\n visited.add(componentName);\r\n sorted.push(componentName);\r\n }\r\n\r\n // Visit all soft components\r\n for (const componentName of Object.keys(softComponents)) {\r\n if (!visited.has(componentName)) {\r\n visit(componentName);\r\n }\r\n }\r\n\r\n return sorted;\r\n}\r\n\r\n/**\r\n * Builds initial soft component configurations in dependency order\r\n * Components that depend only on hard components are built first,\r\n * then components that depend on those, and so on.\r\n * \r\n * Example: Button (depends on hard) → Card (depends on Button) → Layout (depends on Card)\r\n * \r\n * @param hardConfig - The hard-coded configuration\r\n * @param softComponents - The soft components to build\r\n * @returns Record of component configurations ready to merge into the config\r\n */\r\nexport function buildInitialSoftComponents(\r\n hardConfig: Config,\r\n softComponents: SoftComponents,\r\n overrides?: Overrides,\r\n showVersioning = false,\r\n customFields?: CustomFields\r\n): Record<string, ComponentConfig> {\r\n if (!softComponents || Object.keys(softComponents).length === 0) {\r\n return {};\r\n }\r\n\r\n const hydratedSoftComponents = overrides?.hydrateMapTransform\r\n ? hydrateSoftComponentsTransforms(softComponents, overrides.hydrateMapTransform)\r\n : softComponents;\r\n\r\n // Get set of hard component names\r\n const hardComponentNames = new Set(Object.keys(hardConfig.components || {}));\r\n\r\n try {\r\n // Sort components by dependencies\r\n const sortedComponentNames = topologicalSort(\r\n hydratedSoftComponents,\r\n hardComponentNames\r\n );\r\n\r\n // Build a temporary config that accumulates as we go\r\n const buildingConfig: Config = {\r\n ...hardConfig,\r\n components: { ...hardConfig.components },\r\n };\r\n\r\n const componentConfigs: Record<string, ComponentConfig> = {};\r\n\r\n // Build components in dependency order\r\n for (const name of sortedComponentNames) {\r\n const comp = hydratedSoftComponents[name];\r\n const defaultVersion =\r\n comp.defaultVersion || Object.keys(comp.versions || {}).pop();\r\n const versionedComponent = comp.versions?.[defaultVersion || \"\"];\r\n const allVersions = Object.keys(comp.versions || {});\r\n\r\n if (!versionedComponent) {\r\n console.warn(\r\n `Soft component \"${name}\" does not have a valid default version. Skipping.`\r\n );\r\n continue;\r\n }\r\n\r\n // Create the component config with access to all previously built components\r\n const newSoftComponentConfig = createVersionedComponentConfig(\r\n name,\r\n comp.name || name,\r\n defaultVersion || \"1.0.0\",\r\n allVersions,\r\n buildingConfig, // Pass the accumulating config\r\n hydratedSoftComponents,\r\n versionedComponent.defaultProps,\r\n showVersioning,\r\n customFields,\r\n );\r\n\r\n componentConfigs[name] = newSoftComponentConfig;\r\n\r\n // Add to building config so subsequent components can reference it\r\n buildingConfig.components[name] = newSoftComponentConfig;\r\n }\r\n\r\n return componentConfigs;\r\n } catch (error) {\r\n console.error(\"Error building soft components:\", error);\r\n \r\n // Fallback to simple build without dependency ordering\r\n console.warn(\"Falling back to unordered component building\");\r\n \r\n const componentConfigs: Record<string, ComponentConfig> = {};\r\n \r\n for (const [name, comp] of Object.entries(hydratedSoftComponents)) {\r\n const defaultVersion =\r\n comp.defaultVersion || Object.keys(comp.versions || {}).pop();\r\n const versionedComponent = comp.versions?.[defaultVersion || \"\"];\r\n const allVersions = Object.keys(comp.versions || {});\r\n\r\n if (!versionedComponent) {\r\n console.warn(\r\n `Soft component \"${name}\" does not have a valid default version. Skipping.`\r\n );\r\n continue;\r\n }\r\n\r\n const newSoftComponentConfig = createVersionedComponentConfig(\r\n name,\r\n comp.name || name,\r\n defaultVersion || \"1.0.0\",\r\n allVersions,\r\n hardConfig,\r\n hydratedSoftComponents,\r\n versionedComponent.defaultProps,\r\n showVersioning,\r\n customFields,\r\n );\r\n\r\n componentConfigs[name] = newSoftComponentConfig;\r\n }\r\n\r\n return componentConfigs;\r\n }\r\n}\r\n","/**\r\n * Shared utility for managing component visibility and editing state styling\r\n * Sets a greyscale filter on all components except the ones being edited\r\n */\r\n\r\n/**\r\n * Visibility context for the current editing session\r\n */\r\nexport type EditVisibilityContext = {\r\n /**\r\n * Component IDs currently being edited (not greyed out)\r\n * During build: Puck component UUIDs (from editableComponentIds)\r\n * During remodel: Root component paths (from decomposed components)\r\n */\r\n editableIds: Set<string>;\r\n\r\n /**\r\n * Optional: Component IDs to also highlight (e.g., dependencies)\r\n */\r\n highlightDependencyIds?: Set<string>;\r\n\r\n /**\r\n * Mode affects how styling is applied\r\n * - \"build\": Editing a component, show only editable components\r\n * - \"remodel\": Remodeling a component, show the component being remodeled and its structure\r\n * - \"none\": No editing, all components visible\r\n */\r\n mode: \"build\" | \"remodel\" | \"none\";\r\n};\r\n\r\n/**\r\n * Apply visibility styling to the iframe document\r\n * All components become greyed out except those in editableIds\r\n *\r\n * @param doc - The iframe document\r\n * @param context - Visibility context with editable IDs and mode\r\n */\r\nexport const setEditVisibility = (\r\n doc: Document | null,\r\n context: EditVisibilityContext\r\n) => {\r\n if (!doc) return;\r\n\r\n try {\r\n // Apply greyscale filter to entire document when in editing mode\r\n const root = doc.documentElement;\r\n\r\n if (context.mode === \"none\") {\r\n // Remove any visibility styling\r\n root.removeAttribute(\"data-edit-mode\");\r\n root.classList.remove(\"edit-visibility-mode\");\r\n\r\n // Clear all component-level styling\r\n doc.querySelectorAll(\"[data-puck-component]\").forEach((el) => {\r\n el.removeAttribute(\"data-edit-visibility\");\r\n el.classList.remove(\"edit-visibility-greyed\", \"edit-visibility-editable\", \"edit-visibility-dependency\");\r\n });\r\n } else {\r\n // Enable visibility mode\r\n root.setAttribute(\"data-edit-mode\", context.mode);\r\n root.classList.add(\"edit-visibility-mode\");\r\n\r\n // Style all components\r\n doc.querySelectorAll(\"[data-puck-component]\").forEach((el) => {\r\n const id = el.getAttribute(\"data-puck-component\");\r\n if (!id) return;\r\n\r\n const isEditable = context.editableIds.has(id);\r\n const isDependency = context.highlightDependencyIds?.has(id);\r\n\r\n if (isEditable) {\r\n el.setAttribute(\"data-edit-visibility\", \"editable\");\r\n el.classList.remove(\"edit-visibility-greyed\", \"edit-visibility-dependency\");\r\n el.classList.add(\"edit-visibility-editable\");\r\n } else if (isDependency) {\r\n el.setAttribute(\"data-edit-visibility\", \"dependency\");\r\n el.classList.remove(\"edit-visibility-greyed\", \"edit-visibility-editable\");\r\n el.classList.add(\"edit-visibility-dependency\");\r\n } else {\r\n el.setAttribute(\"data-edit-visibility\", \"greyed\");\r\n el.classList.remove(\"edit-visibility-editable\", \"edit-visibility-dependency\");\r\n el.classList.add(\"edit-visibility-greyed\");\r\n }\r\n });\r\n }\r\n } catch (error) {\r\n console.warn(`Failed to set edit visibility:`, error);\r\n }\r\n};\r\n\r\n/**\r\n * Clear all visibility styling from the iframe document\r\n * @param doc - The iframe document\r\n */\r\nexport const clearEditVisibility = (doc: Document | null) => {\r\n if (!doc) return;\r\n\r\n try {\r\n const root = doc.documentElement;\r\n root.removeAttribute(\"data-edit-mode\");\r\n root.classList.remove(\"edit-visibility-mode\");\r\n\r\n doc.querySelectorAll(\"[data-puck-component]\").forEach((el) => {\r\n el.removeAttribute(\"data-edit-visibility\");\r\n el.classList.remove(\"edit-visibility-greyed\", \"edit-visibility-editable\", \"edit-visibility-dependency\");\r\n });\r\n } catch (error) {\r\n console.warn(`Failed to clear edit visibility:`, error);\r\n }\r\n};\r\n\r\n/**\r\n * Get all component IDs from the iframe document\r\n * Useful for debugging and understanding the component tree\r\n *\r\n * @param doc - The iframe document\r\n * @returns Array of component IDs\r\n */\r\nexport const getAllComponentIds = (doc: Document | null): string[] => {\r\n if (!doc) return [];\r\n\r\n try {\r\n return Array.from(doc.querySelectorAll(\"[data-puck-component]\"))\r\n .map((el) => el.getAttribute(\"data-puck-component\"))\r\n .filter((id): id is string => Boolean(id));\r\n } catch (error) {\r\n console.warn(`Failed to get component IDs:`, error);\r\n return [];\r\n }\r\n};\r\n","\"use client\";\r\n\r\nimport { Config, PuckAction } from \"@measured/puck\";\r\nimport { ReactNode, useEffect, useMemo, useState } from \"react\";\r\nimport { appStoreContext } from \"./useStore\";\r\nimport { createSoftConfigStore } from \"../store\";\r\nimport type { AppStore } from \"../store\";\r\nimport type { SoftComponents } from \"../types/SoftComponent\";\r\nimport type { Overrides } from \"../types/Overrides\";\r\nimport type { OnActionsCallback } from \"../types/ActionEvents\";\r\nimport type { CustomFields } from \"../types/SoftFields\";\r\nimport type { StoreApi } from \"zustand\";\r\nimport { clearEditVisibility, setEditVisibility } from \"../lib/edit-visibility-utils\";\r\n\r\nexport const SoftConfigProvider = ({\r\n children,\r\n hardConfig,\r\n softComponents,\r\n customFields,\r\n overrides,\r\n value,\r\n onActions,\r\n useVersioning = false,\r\n}: {\r\n children: (\r\n softConfig: Config,\r\n softComponents: SoftComponents,\r\n iframeDoc: AppStore['setIframeDoc'],\r\n validateAction: (action: PuckAction) => boolean\r\n ) => ReactNode;\r\n hardConfig: Config;\r\n softComponents: SoftComponents;\r\n customFields?: CustomFields;\r\n overrides?: Overrides;\r\n value?: StoreApi<AppStore>;\r\n onActions?: OnActionsCallback;\r\n useVersioning?: boolean;\r\n}) => {\r\n const store = value ?? useMemo(\r\n () =>\r\n createSoftConfigStore(\r\n hardConfig,\r\n softComponents,\r\n overrides,\r\n onActions,\r\n useVersioning,\r\n customFields\r\n ),\r\n [\r\n hardConfig,\r\n softComponents,\r\n overrides,\r\n onActions,\r\n useVersioning,\r\n customFields,\r\n ]\r\n );\r\n const [softConfig, setSoftConfig] = useState(\r\n () => store.getState().softConfig\r\n );\r\n const [internalSoftComponents, setSoftComponents] = useState(\r\n () => store.getState().softComponents\r\n );\r\n const storeSetIframeDoc = useMemo(\r\n () => store.getState().setIframeDoc,\r\n [store]\r\n );\r\n\r\n const validateAction = useMemo(\r\n () => (action: PuckAction): boolean => {\r\n const currentState = store.getState();\r\n\r\n // Only validate actions when NOT in \"ready\" state\r\n if (currentState.state === \"ready\") {\r\n return true;\r\n }\r\n\r\n const editableIds = currentState.editableComponentIds;\r\n\r\n\r\n // replace is most frequent check it first\r\n if (action.type === \"replace\") {\r\n const parentId = action.destinationZone?.split(\":\")[0];\r\n if (action.data.props.id && (editableIds.has(action.data.props.id))) {\r\n return true;\r\n } else if (parentId && editableIds.has(parentId)) {\r\n // Add editable id of the new component\r\n currentState.addEditableComponentId(action.data.props.id);\r\n return true;\r\n }\r\n\r\n return false;\r\n }\r\n\r\n // Insert and Duplicate: validate parent zone\r\n if (action.type === \"insert\" || action.type === \"duplicate\") {\r\n const zone = action.type === \"insert\"\r\n ? action.destinationZone\r\n : action.sourceZone;\r\n\r\n const parentId = zone?.split(\":\")[0];\r\n if (parentId && !editableIds.has(parentId)) {\r\n return false;\r\n }\r\n\r\n // For insert/duplicate, add the new component to editable list\r\n if (action.type === \"insert\") {\r\n const childId = action.id;\r\n if (childId) {\r\n currentState.addEditableComponentId(childId);\r\n }\r\n }\r\n return true;\r\n }\r\n\r\n\r\n // Remove, Move, Reorder, Replace: validate component being edited\r\n if (\r\n action.type === \"remove\" ||\r\n action.type === \"move\" ||\r\n action.type === \"reorder\"\r\n ) {\r\n let parentId;\r\n if (action.type === \"remove\") {\r\n parentId = action.zone.split(\":\")[0];\r\n } else if (action.type === \"move\" || action.type === \"reorder\") {\r\n parentId = action.destinationZone.split(\":\")[0];\r\n }\r\n if (parentId && !editableIds.has(parentId)) {\r\n return false;\r\n }\r\n return true;\r\n }\r\n\r\n return true;\r\n },\r\n [store]\r\n );\r\n\r\n useEffect(() => {\r\n const unsubscribe = store.subscribe(() => {\r\n setSoftConfig(store.getState().softConfig);\r\n setSoftComponents(store.getState().softComponents);\r\n });\r\n return () => {\r\n unsubscribe();\r\n };\r\n }, [store]);\r\n\r\n useEffect(() => {\r\n const unsubscribe = store.subscribe((state, prevState) => {\r\n // Only update when state or editableComponentIds actually change\r\n if (\r\n prevState &&\r\n state.state === prevState.state &&\r\n state.editableComponentIds === prevState.editableComponentIds\r\n ) {\r\n return;\r\n }\r\n\r\n const doc = store.getState().getIframeDoc();\r\n if (!doc) return;\r\n\r\n // Apply edit visibility styling based on current state\r\n if (state.state === \"building\") {\r\n setEditVisibility(doc, { mode: \"build\", editableIds: state.editableComponentIds });\r\n return;\r\n }\r\n\r\n if (state.state === \"remodeling\") {\r\n setEditVisibility(doc, { mode: \"remodel\", editableIds: state.editableComponentIds });\r\n return;\r\n }\r\n\r\n // FIX: Always clear visibility when not in editing mode\r\n // This ensures grey-out styling is removed after complete/cancel/inspect\r\n // Use requestAnimationFrame to ensure DOM has updated\r\n requestAnimationFrame(() => {\r\n const freshDoc = store.getState().getIframeDoc();\r\n if (freshDoc) {\r\n clearEditVisibility(freshDoc);\r\n }\r\n });\r\n });\r\n\r\n return () => {\r\n unsubscribe();\r\n };\r\n }, [store]);\r\n\r\n return (\r\n <appStoreContext.Provider value={store}>\r\n {children(softConfig as Config, internalSoftComponents, storeSetIframeDoc, validateAction)}\r\n </appStoreContext.Provider>\r\n );\r\n};\r\n","import { createUsePuck } from \"@measured/puck\";\r\nimport { useSoftConfig } from \"../context/useStore\";\r\nimport { notify } from \"../lib/notify\";\r\nimport { useActionEvent } from \"../hooks/useActionEvent\";\r\n\r\nconst useCustomPuck = createUsePuck();\r\n\r\nexport const useBuild = (\r\n name?: string\r\n) => {\r\n const build = useSoftConfig((s) => s.builder.build);\r\n const history = useCustomPuck((s) => s.history.histories);\r\n const selectedItem = useCustomPuck((s) => s.selectedItem);\r\n const itemSelector = useCustomPuck((s) => s.appState.ui.itemSelector);\r\n const dispatch = useCustomPuck((s) => s.dispatch);\r\n const status = useSoftConfig((s) => s.state);\r\n const { triggerAction } = useActionEvent();\r\n\r\n const handleBuild = () => {\r\n if (status !== \"ready\") {\r\n notify.error(\"Can only build when in ready state.\");\r\n return;\r\n }\r\n\r\n try {\r\n build(history, selectedItem, itemSelector, dispatch, name);\r\n \r\n if (selectedItem?.type) {\r\n void triggerAction({\r\n type: \"build\",\r\n payload: {\r\n id: selectedItem.type,\r\n },\r\n });\r\n }\r\n } catch (error) {\r\n console.error(\"Failed to build:\", error);\r\n notify.error(\r\n \"Failed to build: \" +\r\n (error instanceof Error ? error.message : String(error))\r\n );\r\n }\r\n };\r\n\r\n return { handleBuild, canBuild: status === \"ready\" };\r\n};\r\n","// Customizable error/success handler\r\ntype NotificationHandler = (message: string, type: \"error\" | \"success\") => void;\r\n\r\nlet customHandler: NotificationHandler | null = null;\r\n\r\n// Default handler using native alert (non-blocking alternative would be console)\r\nconst defaultHandler: NotificationHandler = (message, type) => {\r\n if (type === \"error\") {\r\n console.error(`[Error] ${message}`);\r\n // Non-blocking, just log to console instead of alert\r\n } else {\r\n console.log(`[Success] ${message}`);\r\n }\r\n};\r\n\r\nexport const setNotificationHandler = (handler: NotificationHandler) => {\r\n customHandler = handler;\r\n};\r\n\r\nexport const notify = {\r\n error: (message: string) => {\r\n const handler = customHandler || defaultHandler;\r\n handler(message, \"error\");\r\n },\r\n success: (message: string) => {\r\n const handler = customHandler || defaultHandler;\r\n handler(message, \"success\");\r\n },\r\n};\r\n","import { useCallback } from \"react\";\r\nimport { useSoftConfig } from \"../context/useStore\";\r\nimport type { ActionEventPayload } from \"../types/ActionEvents\";\r\n\r\nexport const useActionEvent = () => {\r\n const onActions = useSoftConfig((s) => s.onActions);\r\n\r\n const triggerAction = useCallback(\r\n async (event: ActionEventPayload) => {\r\n if (onActions) {\r\n try {\r\n await onActions(event);\r\n } catch (error) {\r\n console.error(\"Error in onActions callback:\", error);\r\n }\r\n }\r\n },\r\n [onActions]\r\n );\r\n\r\n return { triggerAction };\r\n};\r\n","import { createUsePuck } from \"@measured/puck\";\r\nimport type { DefaultComponentProps } from \"@measured/puck\";\r\nimport { useSoftConfig } from \"../context/useStore\";\r\nimport { notify } from \"../lib/notify\";\r\nimport { useActionEvent } from \"../hooks/useActionEvent\";\r\nimport type { VersionedSoftComponent } from \"../types/SoftComponent\";\r\n\r\nconst useCustomPuck = createUsePuck();\r\n\r\nexport const useRemodel = () => {\r\n const remodel = useSoftConfig((s) => s.builder.remodel);\r\n const history = useCustomPuck((s) => s.history.histories);\r\n const selectedItem = useCustomPuck((s) => s.selectedItem);\r\n const itemSelector = useCustomPuck((s) => s.appState.ui.itemSelector);\r\n const dispatch = useCustomPuck((s) => s.dispatch);\r\n const status = useSoftConfig((s) => s.state);\r\n const softComponents = useSoftConfig((s) => s.softComponents);\r\n const refreshPermissions = useCustomPuck((s) => s.refreshPermissions);\r\n const { triggerAction } = useActionEvent();\r\n\r\n const handleRemodel = (componentName?: string) => {\r\n if (status !== \"ready\") {\r\n notify.error(\"Can only remodel when in ready state.\");\r\n return null;\r\n }\r\n\r\n const name = componentName || selectedItem?.type;\r\n if (!name || !Object.keys(softComponents).includes(name)) {\r\n notify.error(\"Selected component is not a soft component.\");\r\n return null;\r\n }\r\n\r\n const selectedVersion =\r\n ((selectedItem?.props as DefaultComponentProps | undefined)?.version as string | undefined) ||\r\n softComponents[name]?.defaultVersion;\r\n\r\n const selectedSoftComponent =\r\n selectedVersion\r\n ? softComponents[name]?.versions[selectedVersion]\r\n : undefined;\r\n\r\n try {\r\n remodel(history, selectedItem, itemSelector, dispatch, refreshPermissions);\r\n\r\n void triggerAction({\r\n type: \"remodel\",\r\n payload: {\r\n id: name,\r\n version: selectedVersion,\r\n softComponent: selectedSoftComponent as VersionedSoftComponent[\"versions\"][string] | undefined,\r\n },\r\n });\r\n\r\n if (selectedVersion && selectedSoftComponent) {\r\n return {\r\n id: name,\r\n version: selectedVersion,\r\n softComponent: selectedSoftComponent,\r\n };\r\n }\r\n\r\n return { id: name, version: selectedVersion };\r\n } catch (error) {\r\n console.error(\"Failed to remodel:\", error);\r\n notify.error(\r\n \"Failed to remodel: \" +\r\n (error instanceof Error ? error.message : String(error))\r\n );\r\n return null;\r\n }\r\n };\r\n\r\n const canRemodel = (componentName?: string) => {\r\n const name = componentName || selectedItem?.type;\r\n return (\r\n status === \"ready\" &&\r\n name !== undefined &&\r\n Object.keys(softComponents).includes(name)\r\n );\r\n };\r\n\r\n return { handleRemodel, canRemodel };\r\n};\r\n","import { createUsePuck } from \"@measured/puck\";\r\nimport { useSoftConfig } from \"../context/useStore\";\r\nimport { notify } from \"../lib/notify\";\r\nimport { useState, useCallback } from \"react\";\r\nimport { useActionEvent } from \"../hooks/useActionEvent\";\r\nimport type { CompletedComponentResult } from \"../store/slices/builder\";\r\n\r\nconst useCustomPuck = createUsePuck();\r\n\r\nexport const useComplete = () => {\r\n const complete = useSoftConfig((s) => s.builder.complete);\r\n const appState = useCustomPuck((s) => s.appState);\r\n const setHistories = useCustomPuck((s) => s.history.setHistories);\r\n const getItemBySelector = useCustomPuck((s) => s.getItemBySelector);\r\n const status = useSoftConfig((s) => s.state);\r\n const [newComponent, setNewComponent] = useState<CompletedComponentResult | null>(null);\r\n const { triggerAction } = useActionEvent();\r\n\r\n const handleComplete = useCallback(() => {\r\n if (status === \"ready\") {\r\n notify.error(\"Not building or remodeling a component.\");\r\n return null;\r\n }\r\n\r\n try {\r\n const completedComponent = complete(appState, setHistories, getItemBySelector);\r\n setNewComponent(completedComponent);\r\n \r\n // Get the component data and soft component info\r\n const componentData = appState.data.root;\r\n \r\n if (componentData) {\r\n void triggerAction({\r\n type: \"complete\",\r\n payload: {\r\n id: completedComponent.id,\r\n version: completedComponent.version,\r\n componentData,\r\n softComponent: completedComponent.softComponent,\r\n },\r\n });\r\n }\r\n \r\n return completedComponent;\r\n } catch (error) {\r\n console.error(\"Failed to complete:\", error);\r\n notify.error(\r\n \"Failed to complete: \" +\r\n (error instanceof Error ? error.message : String(error))\r\n );\r\n return null;\r\n }\r\n }, [complete, appState, setHistories, status, triggerAction, getItemBySelector]);\r\n\r\n const canComplete = status === \"building\" || status === \"remodeling\";\r\n\r\n return { handleComplete, canComplete, newComponent, setNewComponent };\r\n};\r\n","import { createUsePuck } from \"@measured/puck\";\r\nimport { useSoftConfig } from \"../context/useStore\";\r\nimport { notify } from \"../lib/notify\";\r\nimport { useActionEvent } from \"../hooks/useActionEvent\";\r\n\r\nconst useCustomPuck = createUsePuck();\r\n\r\nexport const useCancel = () => {\r\n const cancel = useSoftConfig((s) => s.builder.cancel);\r\n const setHistories = useCustomPuck((s) => s.history.setHistories);\r\n const status = useSoftConfig((s) => s.state);\r\n const { triggerAction } = useActionEvent();\r\n\r\n const handleCancel = () => {\r\n if (status === \"ready\") {\r\n notify.error(\"Nothing to cancel.\");\r\n return;\r\n }\r\n\r\n try {\r\n cancel(setHistories);\r\n \r\n void triggerAction({\r\n type: \"cancel\",\r\n payload: {},\r\n });\r\n } catch (error) {\r\n console.error(\"Failed to cancel:\", error);\r\n notify.error(\r\n \"Failed to cancel: \" +\r\n (error instanceof Error ? error.message : String(error))\r\n );\r\n }\r\n };\r\n\r\n const canCancel = status === \"building\" || status === \"remodeling\";\r\n\r\n return { handleCancel, canCancel };\r\n};\r\n","import { createUsePuck } from \"@measured/puck\";\r\nimport { useSoftConfig } from \"../context/useStore\";\r\nimport { notify } from \"../lib/notify\";\r\nimport { useEffect } from \"react\";\r\nimport { useActionEvent } from \"../hooks/useActionEvent\";\r\nimport type { CompletedComponentResult } from \"../store/slices/builder\";\r\n\r\nconst useCustomPuck = createUsePuck();\r\n\r\nexport const useInspect = (component: CompletedComponentResult | null) => {\r\n const inspect = useSoftConfig((s) => s.builder.inspect);\r\n const dispatch = useCustomPuck((s) => s.dispatch);\r\n const status = useSoftConfig((s) => s.state);\r\n const { triggerAction } = useActionEvent();\r\n\r\n useEffect(() => {\r\n if (status !== \"inspecting\") return;\r\n if (!component) {\r\n notify.error(\"No component to inspect.\");\r\n return;\r\n }\r\n\r\n try {\r\n inspect(component.id, dispatch);\r\n\r\n void triggerAction({\r\n type: \"inspect\",\r\n payload: {\r\n id: component.id,\r\n version: component.version,\r\n softComponent: component.softComponent,\r\n },\r\n });\r\n } catch (error) {\r\n console.error(\"Failed to inspect:\", error);\r\n notify.error(\r\n \"Failed to inspect: \" +\r\n (error instanceof Error ? error.message : String(error))\r\n );\r\n }\r\n }, [status, component, inspect, dispatch, triggerAction]);\r\n};\r\n","import { ComponentData, createUsePuck, walkTree } from \"@measured/puck\";\r\nimport { useSoftConfig } from \"../context/useStore\";\r\nimport { notify } from \"../lib/notify\";\r\nimport { useActionEvent } from \"../hooks/useActionEvent\";\r\n\r\nconst useCustomPuck = createUsePuck();\r\n\r\nexport const useDecompose = () => {\r\n const decompose = useSoftConfig((s) => s.builder.decompose);\r\n const appState = useCustomPuck((s) => s.appState);\r\n const dispatch = useCustomPuck((s) => s.dispatch);\r\n const selectedItem = useCustomPuck((s) => s.selectedItem);\r\n const status = useSoftConfig((s) => s.state);\r\n const softComponents = useSoftConfig((s) => s.softComponents);\r\n const config = useSoftConfig((s) => s.softConfig);\r\n const { triggerAction } = useActionEvent();\r\n\r\n const handleDecompose = (componentData?: ComponentData) => {\r\n if (status !== \"ready\") {\r\n notify.error(\"Can only decompose when in ready state.\");\r\n return;\r\n }\r\n\r\n const target = componentData || (selectedItem as ComponentData);\r\n if (!target) {\r\n notify.error(\"No component selected to decompose.\");\r\n return;\r\n }\r\n\r\n const componentName = target.type;\r\n if (!Object.keys(softComponents).includes(componentName)) {\r\n notify.error(\"Selected component is not a soft component.\");\r\n return;\r\n }\r\n\r\n try {\r\n const decomposedComponents = decompose(target);\r\n\r\n if (!decomposedComponents || decomposedComponents.length === 0) {\r\n notify.error(\"Nothing to decompose.\");\r\n return;\r\n }\r\n\r\n // Walk Tree and replace the component with decomposed components\r\n const newData = walkTree(appState.data, config, (components) => {\r\n const index = components.findIndex((c) => c.props.id === target.props.id);\r\n\r\n if (index !== -1) {\r\n components.splice(index, 1, ...decomposedComponents);\r\n }\r\n\r\n return components;\r\n });\r\n\r\n dispatch({\r\n type: \"setData\",\r\n data: newData,\r\n });\r\n\r\n void triggerAction({\r\n type: \"decompose\",\r\n payload: {\r\n id: componentName,\r\n },\r\n });\r\n } catch (error) {\r\n console.error(\"Failed to decompose:\", error);\r\n notify.error(\r\n \"Failed to decompose: \" +\r\n (error instanceof Error ? error.message : String(error))\r\n );\r\n }\r\n };\r\n\r\n const canDecompose = (componentData?: ComponentData) => {\r\n const target = componentData || (selectedItem as ComponentData);\r\n return (\r\n status === \"ready\" &&\r\n target !== null &&\r\n Object.keys(softComponents).includes(target?.type || \"\")\r\n );\r\n };\r\n\r\n return { handleDecompose, canDecompose };\r\n};\r\n","import { createUsePuck } from \"@measured/puck\";\r\nimport { useSoftConfig } from \"../context/useStore\";\r\nimport { notify } from \"../lib/notify\";\r\nimport { createSoftConfigStore } from \"../store\";\r\nimport { useActionEvent } from \"../hooks/useActionEvent\";\r\n\r\nconst useCustomPuck = createUsePuck();\r\n\r\nexport const useDemolish = () => {\r\n const demolish = useSoftConfig((s) => s.builder.demolish);\r\n const dispatch = useCustomPuck((s) => s.dispatch);\r\n const data = useCustomPuck((s) => s.appState.data);\r\n const status = useSoftConfig((s) => s.state);\r\n const softComponents = useSoftConfig((s) => s.softComponents);\r\n const { triggerAction } = useActionEvent();\r\n\r\n const handleDemolish = (componentName: string) => {\r\n if (status !== \"ready\") {\r\n notify.error(\"Can only demolish when in ready state.\");\r\n return;\r\n }\r\n\r\n if (!Object.keys(softComponents).includes(componentName)) {\r\n notify.error(\"Component is not a soft component.\");\r\n return;\r\n }\r\n\r\n try {\r\n demolish(componentName, data, dispatch);\r\n \r\n void triggerAction({\r\n type: \"demolish\",\r\n payload: {\r\n id: componentName,\r\n },\r\n });\r\n } catch (error) {\r\n console.error(\"Failed to demolish:\", error);\r\n notify.error(\r\n \"Failed to demolish: \" +\r\n (error instanceof Error ? error.message : String(error))\r\n );\r\n }\r\n };\r\n\r\n const canDemolish = (componentName: string) => {\r\n return (\r\n status === \"ready\" && Object.keys(softComponents).includes(componentName)\r\n );\r\n };\r\n\r\n return { handleDemolish, canDemolish };\r\n};\r\n","import { useSoftConfig } from \"../context/useStore\";\r\nimport { useActionEvent } from \"../hooks/useActionEvent\";\r\n\r\nexport const useSetDefaultVersion = () => {\r\n const setSoftComponentDefaultVersion = useSoftConfig(\r\n (s) => s.setSoftComponentDefaultVersion\r\n );\r\n const softComponents = useSoftConfig((s) => s.softComponents);\r\n const status = useSoftConfig((s) => s.state);\r\n const { triggerAction } = useActionEvent();\r\n\r\n const handleSetDefaultVersion = (componentName: string, version: string) => {\r\n if (status !== \"ready\") {\r\n return;\r\n }\r\n\r\n if (!Object.keys(softComponents).includes(componentName)) {\r\n return;\r\n }\r\n\r\n const component = softComponents[componentName];\r\n if (!component?.versions[version]) {\r\n return;\r\n }\r\n\r\n setSoftComponentDefaultVersion(componentName, version);\r\n \r\n void triggerAction({\r\n type: \"setDefaultVersion\",\r\n payload: {\r\n id: componentName,\r\n version,\r\n },\r\n });\r\n };\r\n\r\n const canSetDefaultVersion = (componentName: string, version: string) => {\r\n const component = softComponents[componentName];\r\n return (\r\n status === \"ready\" &&\r\n component !== undefined &&\r\n component.versions[version] !== undefined &&\r\n component.defaultVersion !== version\r\n );\r\n };\r\n\r\n const getVersions = (componentName: string) => {\r\n return Object.keys(softComponents[componentName]?.versions || {});\r\n };\r\n\r\n const getDefaultVersion = (componentName: string) => {\r\n return softComponents[componentName]?.defaultVersion;\r\n };\r\n\r\n return {\r\n handleSetDefaultVersion,\r\n canSetDefaultVersion,\r\n getVersions,\r\n getDefaultVersion,\r\n };\r\n};\r\n","import React from \"react\";\r\nimport { Button, Data, createUsePuck } from \"@measured/puck\";\r\nimport { useComplete } from \"../actions/useComplete\";\r\nimport { useCancel } from \"../actions/useCancel\";\r\nimport { useInspect } from \"../actions/useInspect\";\r\nimport getClassNameFactory from \"../lib/get-class-name-factory\";\r\nimport styles from \"./Header.module.css\";\r\nimport { SoftComponents } from \"../types/SoftComponent\";\r\nimport { usePublish } from \"../actions/usePublish\";\r\n\r\nconst getClassName = getClassNameFactory(\"Header\", styles);\r\nconst usePuck = createUsePuck();\r\n\r\nexport const Header = ({\r\n onPublish,\r\n children,\r\n}: {\r\n onPublish?: (data: Data, softComponents: SoftComponents) => void;\r\n children: React.ReactNode;\r\n}) => {\r\n const { handleComplete, newComponent, setNewComponent } =\r\n useComplete();\r\n const { handleCancel, canCancel } = useCancel();\r\n const { handlePublish } = usePublish();\r\n const puck = usePuck(s => s.config);\r\n\r\n useInspect(newComponent);\r\n\r\n return (\r\n <div className={getClassName()}>\r\n {canCancel ? (\r\n <>\r\n <Button onClick={handleCancel}>Cancel</Button>\r\n <Button\r\n variant=\"primary\"\r\n onClick={() => {\r\n const completedComponent = handleComplete();\r\n if (completedComponent) {\r\n setNewComponent(completedComponent);\r\n }\r\n }}\r\n >\r\n Complete\r\n </Button>\r\n </>\r\n ) : children ? (\r\n children\r\n ) : (\r\n <Button\r\n variant=\"primary\"\r\n onClick={() => {\r\n if (onPublish) {\r\n handlePublish(onPublish);\r\n }\r\n }}\r\n >\r\n Publish\r\n </Button>\r\n )}\r\n </div>\r\n );\r\n};\r\n","import \"/media/manual_mount/osamuProjects/netlisian/packages/soft-config/src/puck/overrides/Header.module.css\"; export default {\"Header\":\"_Header_19oj9_1\"}","import { createUsePuck, Data } from \"@measured/puck\";\r\nimport { useSoftConfig } from \"../context/useStore\";\r\nimport { notify } from \"../lib/notify\";\r\nimport { SoftComponents } from \"../types/SoftComponent\";\r\nimport { useActionEvent } from \"../hooks/useActionEvent\";\r\n\r\nconst useCustomPuck = createUsePuck();\r\n\r\nexport const usePublish = () => {\r\n const components = useSoftConfig((s) => s.softComponents);\r\n const data = useCustomPuck((s) => s.appState.data);\r\n const status = useSoftConfig((s) => s.state);\r\n const { triggerAction } = useActionEvent();\r\n\r\n const handlePublish = (\r\n publish: (data: Data, softComponents: SoftComponents) => void,\r\n ) => {\r\n if (status !== \"ready\") {\r\n notify.error(\"Can only publish when in ready state.\");\r\n return;\r\n }\r\n if (!data) {\r\n notify.error(\"No data to publish.\");\r\n return;\r\n }\r\n\r\n publish(data, components);\r\n \r\n // Get all components to find what was published\r\n const rootComponentType = data.root?.type;\r\n const rootVersion = components[rootComponentType]?.defaultVersion;\r\n \r\n if (rootComponentType && rootVersion) {\r\n void triggerAction({\r\n type: \"publish\",\r\n payload: {\r\n id: rootComponentType,\r\n version: rootVersion,\r\n },\r\n });\r\n }\r\n };\r\n\r\n const canPublish = status === \"ready\";\r\n\r\n return { handlePublish, canPublish };\r\n};\r\n","import React, { useMemo } from \"react\";\r\nimport { ActionBar, createUsePuck } from \"@measured/puck\";\r\nimport { useBuild } from \"../actions/useBuild\";\r\nimport { useRemodel } from \"../actions/useRemodel\";\r\nimport { useDecompose } from \"../actions/useDecompose\";\r\nimport { useSoftConfig } from \"../context/useStore\";\r\nimport { Combine, ComponentIcon, EditIcon } from \"lucide-react\";\r\nimport getClassNameFactory from \"../lib/get-class-name-factory\";\r\nimport styles from \"./ActionBar.module.css\";\r\nimport { shallow } from \"zustand/shallow\";\r\nimport { createComponentKeyFromName, getComponentNameFromKey } from \"../lib/component-key\";\r\n\r\nconst getClassName = getClassNameFactory(\"ActionBar\", styles);\r\nconst usePuck = createUsePuck();\r\n\r\nexport const ActionBarOverride = (props: {\r\n label?: string;\r\n parentAction?: React.ReactNode;\r\n children?: React.ReactNode;\r\n}) => {\r\n const { handleBuild } = useBuild(props.label ? props.label + \" Soft Component\" : \"New Soft Component\");\r\n const { handleRemodel } = useRemodel();\r\n const { handleDecompose } = useDecompose();\r\n const overrides = useSoftConfig((s) => s.overrides);\r\n const softComponents = useSoftConfig((s) => s.softComponents, shallow);\r\n const editableIds = useSoftConfig((s) => s.editableComponentIds);\r\n const selectedItem = usePuck((s) => s.selectedItem);\r\n const rootProps = usePuck((s) => s.appState.data.root.props);\r\n const status = useSoftConfig((s) => s.state);\r\n const itemSelector = usePuck((s) => s.appState.ui.itemSelector);\r\n const softKeys = Object.keys(softComponents);\r\n\r\n const key = useMemo(() => {\r\n // Prefer the selected component type when available to avoid label->key drift.\r\n const selectedType = selectedItem?.type;\r\n if (selectedType && softKeys.includes(selectedType)) {\r\n return selectedType;\r\n }\r\n\r\n return createComponentKeyFromName(props.label || \"\", overrides, {\r\n ...(rootProps || {}),\r\n existingKeys: softKeys,\r\n state: status,\r\n });\r\n }, [\r\n props.label,\r\n overrides,\r\n selectedItem?.type,\r\n softKeys,\r\n status,\r\n rootProps,\r\n ]);\r\n\r\n const isSoftComponent = softKeys.includes(key!);\r\n const selectedId = selectedItem?.props?.id;\r\n const parentId = itemSelector?.zone?.split(\":\")[0];\r\n const isEditable = Boolean(selectedId && (editableIds.has(selectedId) || (parentId && editableIds.has(parentId))));\r\n\r\n const displayName = useMemo(() => {\r\n if (isSoftComponent) {\r\n return softComponents[key!]?.name || getComponentNameFromKey(key!, overrides);\r\n }\r\n return props.label || \"\";\r\n }, [isSoftComponent, key, props.label, overrides, softComponents]);\r\n\r\n return (\r\n <div className={getClassName()}>\r\n <ActionBar>\r\n <ActionBar.Group>\r\n {props.parentAction}\r\n <ActionBar.Label label={displayName} />\r\n </ActionBar.Group>\r\n\r\n\r\n <ActionBar.Group>\r\n {status === \"ready\" ? (\r\n isSoftComponent ? (\r\n <>\r\n <ActionBar.Action\r\n onClick={() => handleRemodel(key!)}\r\n label=\"Remodel Soft Component\"\r\n >\r\n <EditIcon size={16} />\r\n </ActionBar.Action>\r\n <ActionBar.Action\r\n onClick={() => handleDecompose()}\r\n label=\"Decompose Soft Component\"\r\n >\r\n <Combine size={16} />\r\n </ActionBar.Action>\r\n </>\r\n ) : (\r\n <ActionBar.Action\r\n onClick={handleBuild}\r\n label=\"Build Soft Component\"\r\n >\r\n <ComponentIcon size={16} />\r\n </ActionBar.Action>\r\n )\r\n ) : null}\r\n\r\n {status !== \"ready\" && !isEditable ? null : (props.children)}\r\n </ActionBar.Group>\r\n </ActionBar>\r\n </div>\r\n );\r\n};\r\n","import \"/media/manual_mount/osamuProjects/netlisian/packages/soft-config/src/puck/overrides/ActionBar.module.css\"; export default {\"ActionBar\":\"_ActionBar_pvuie_5\",\"ActionBar-label\":\"_ActionBar-label_pvuie_39\",\"ActionBar-action\":\"_ActionBar-action_pvuie_63\",\"ActionBar-group\":\"_ActionBar-group_pvuie_79\"}","import { useState } from \"react\";\nimport { Button, IconButton, createUsePuck } from \"@measured/puck\";\nimport { useDemolish } from \"../actions/useDemolish\";\nimport { useSetDefaultVersion } from \"../actions/useSetDefaultVersion\";\nimport { useSoftConfig } from \"../context/useStore\";\nimport { GripVertical, Check, X, Trash2, Cog } from \"lucide-react\";\nimport { confirm } from \"../lib/confirm\";\nimport getClassNameFactory from \"../lib/get-class-name-factory\";\nimport styles from \"./DrawerItem.module.css\";\nimport { Modal } from \"../components/modal\";\nimport { shallow } from \"zustand/shallow\";\nimport { useActionEvent } from \"../hooks/useActionEvent\";\n\nconst getClassName = getClassNameFactory(\"DrawerItem\", styles);\nconst usePuck = createUsePuck();\n\nexport const DrawerItem = (props: {\n name: string;\n label?: string;\n children: React.ReactNode;\n}): React.ReactElement => {\n const componentMeta = useSoftConfig((s) => s.softComponents[props.name]);\n const displayName = props.label ||componentMeta?.name || props.name;\n\n const softComponents = new Set(\n Object.keys(useSoftConfig((s) => s.softComponents, shallow))\n );\n const getPermissions = usePuck((s) => s.getPermissions);\n\n const insertAllowed = getPermissions({ type: props.name }).insert;\n\n const removeSoftComponentVersion = useSoftConfig(\n (s) => s.removeSoftComponentVersion\n );\n\n const { handleDemolish } = useDemolish();\n const { handleSetDefaultVersion, getVersions, getDefaultVersion } =\n useSetDefaultVersion();\n const { triggerAction } = useActionEvent();\n\n const [isEditing, setIsEditing] = useState(false);\n const [isHovering, setIsHovering] = useState(false);\n const [selectedVersion, setSelectedVersion] = useState(\"\");\n const [versionsToDelete, setVersionsToDelete] = useState<Set<string>>(\n new Set()\n );\n const [migrationTarget, setMigrationTarget] = useState<string>(\"decompose\");\n const useVersioning = useSoftConfig((s) => s.showVersionFields);\n\n const versions = getVersions(props.name);\n const defaultVersion = getDefaultVersion(props.name);\n\n const handleApply = async () => {\n if (selectedVersion && selectedVersion !== defaultVersion) {\n handleSetDefaultVersion(props.name, selectedVersion);\n }\n\n if (versionsToDelete.size > 0) {\n for (const version of versionsToDelete) {\n const remaining = versions.filter((v) => !versionsToDelete.has(v));\n if (remaining.length === 0) {\n const shouldDemolish = await confirm(\n `Deleting all versions will remove \"${props.name}\" entirely. Continue?`\n );\n if (shouldDemolish) {\n handleDemolish(props.name);\n }\n break;\n } else {\n removeSoftComponentVersion(props.name, version);\n void triggerAction({\n type: \"deleteVersion\",\n payload: {\n id: props.name,\n version,\n migrateToVersion: migrationTarget,\n },\n });\n }\n }\n }\n\n setIsEditing(false);\n setSelectedVersion(\"\");\n setVersionsToDelete(new Set());\n setMigrationTarget(\"decompose\");\n };\n\n const handleCancel = () => {\n setIsEditing(false);\n setSelectedVersion(\"\");\n setVersionsToDelete(new Set());\n setMigrationTarget(\"decompose\");\n };\n\n const toggleVersionForDeletion = (version: string) => {\n const newSet = new Set(versionsToDelete);\n if (newSet.has(version)) {\n newSet.delete(version);\n } else {\n newSet.add(version);\n }\n setVersionsToDelete(newSet);\n };\n\n const handleDemolishClick = async () => {\n const confirmed = await confirm(\n `Demolish \"${displayName}\" entirely? This will remove all versions.`\n );\n if (confirmed) {\n handleDemolish(props.name);\n setIsEditing(false);\n }\n };\n\n if (softComponents.has(props.name)) {\n const availableVersions = versions.filter((v) => !versionsToDelete.has(v));\n const migrationTargets = [\n { value: \"decompose\", label: \"Decompose to basic elements\" },\n ...availableVersions.map((version) => ({\n value: version,\n label: `Migrate to Version ${version}`,\n })),\n ];\n\n return (\n <>\n <div\n className={getClassName({ insertDisabled: !insertAllowed })}\n onMouseEnter={() => setIsHovering(true)}\n onMouseLeave={() => setIsHovering(false)}\n >\n {props.label}\n <div className={getClassName(\"content\")}>\n <div className={getClassName(\"name\")}>{displayName}</div>\n {/* Only show version badge if versioning is enabled */}\n {useVersioning && (\n <div className={getClassName(\"version\")}>v{defaultVersion}</div>\n )}\n </div>\n\n <div className={getClassName(\"actions\")}>\n {isHovering && (\n <div className={getClassName(\"settingsButton\")}>\n <IconButton\n title=\"Settings\"\n variant=\"secondary\"\n onClick={(e) => {\n e.stopPropagation();\n setIsEditing(true);\n setSelectedVersion(defaultVersion || \"\");\n }}\n >\n <Cog size={12} />\n </IconButton>\n </div>\n )}\n <div className={getClassName(\"grip\")}>\n <GripVertical size={16} />\n </div>\n </div>\n </div>\n\n <Modal isOpen={isEditing} onClose={handleCancel}>\n <div className={getClassName(\"modal\")}>\n <div className={getClassName(\"modalHeader\")}>\n <h2 className={getClassName(\"modalTitle\")}>{displayName}</h2>\n <p className={getClassName(\"modalSubtitle\")}>\n Component Settings\n </p>\n </div>\n\n <div className={getClassName(\"modalBody\")}>\n {/* VERSIONING FIELDS: CONDITIONAL RENDERING */}\n {useVersioning ? (\n <>\n <div className={getClassName(\"section\")}>\n <h3 className={getClassName(\"sectionTitle\")}>Versions</h3>\n <div className={getClassName(\"versionList\")}>\n {versions.map((version) => {\n const isDefault = version === (selectedVersion || defaultVersion);\n const isMarkedForDeletion = versionsToDelete.has(version);\n\n let rowClass = getClassName(\"versionRow\");\n if (isDefault) rowClass += \" \" + getClassName(\"versionRow--isDefault\");\n if (isMarkedForDeletion) rowClass += \" \" + getClassName(\"versionRow--isMarkedForDeletion\");\n\n return (\n <div key={version} className={rowClass}>\n <div className={getClassName(\"versionInfo\")}>\n <span className={getClassName(\"versionNumber\")}>Version {version}</span>\n {isDefault && <span className={getClassName(\"defaultBadge\")}>Default</span>}\n {isMarkedForDeletion && <span className={getClassName(\"deleteBadge\")}>Marked for deletion</span>}\n </div>\n <div className={getClassName(\"versionActions\")}>\n {!isDefault && !isMarkedForDeletion && (\n <Button variant=\"secondary\" onClick={() => setSelectedVersion(version)}>\n Set as Default\n </Button>\n )}\n <Button variant=\"secondary\" onClick={() => toggleVersionForDeletion(version)}>\n {isMarkedForDeletion ? <><X size={14} /> Undo</> : <><Trash2 size={14} /> Delete</>}\n </Button>\n </div>\n </div>\n );\n })}\n </div>\n </div>\n\n {versionsToDelete.size > 0 && (\n <div className={getClassName(\"section\")}>\n <h3 className={getClassName(\"sectionTitle\")}>Migration Settings</h3>\n <div className={getClassName(\"migrationOptions\")}>\n <div\n className={getClassName(\"migrationList\")}\n role=\"radiogroup\"\n aria-label=\"Migration target\"\n >\n {migrationTargets.map((target) => {\n const isSelected = migrationTarget === target.value;\n\n return (\n <button\n key={target.value}\n type=\"button\"\n role=\"radio\"\n aria-checked={isSelected}\n className={`${getClassName(\"migrationOption\")} ${\n isSelected\n ? getClassName(\"migrationOption--isSelected\")\n : \"\"\n }`}\n onClick={() => setMigrationTarget(target.value)}\n >\n <span className={getClassName(\"migrationOptionLabel\")}>\n {target.label}\n </span>\n {isSelected && <Check size={14} />}\n </button>\n );\n })}\n </div>\n </div>\n <p className={getClassName(\"helpText\")}>\n Choose where to move existing instances of the deleted versions.\n </p>\n </div>\n )}\n </>\n ) : (\n <div className={getClassName(\"section\")}>\n <p>Manage high-level settings for the <strong>{displayName}</strong> component.</p>\n </div>\n )}\n </div>\n\n <div className={getClassName(\"modalFooter\")}>\n <div className={getClassName(\"footerLeft\")}>\n {/* Only show Apply if versioning is active, otherwise just Close/Cancel */}\n {useVersioning ? (\n <Button size=\"medium\" onClick={handleApply}>\n <Check size={16} /> Apply Changes\n </Button>\n ) : (\n <Button size=\"medium\" onClick={handleCancel}>\n Close\n </Button>\n )}\n {useVersioning && (\n <Button size=\"medium\" variant=\"secondary\" onClick={handleCancel}>\n <X size={16} /> Cancel\n </Button>\n )}\n </div>\n\n <div className={getClassName(\"footerRight\")}>\n <Button size=\"medium\" variant=\"secondary\" onClick={handleDemolishClick}>\n <Trash2 size={16} /> Demolish Component\n </Button>\n </div>\n </div>\n </div>\n </Modal>\n </>\n );\n }\n\n return <>{props.children}</>;\n};\n\n/** @deprecated Use DrawerItem instead */\nexport const ComponentItem = DrawerItem;\n","// Confirmation dialog handler\r\ntype ConfirmHandler = (message: string) => Promise<boolean> | boolean;\r\n\r\nlet confirmHandler: ConfirmHandler = (message: string) => {\r\n return window.confirm(message);\r\n};\r\n\r\n/**\r\n * Set a custom confirmation handler\r\n * @param handler - Function that shows confirmation dialog and returns boolean or Promise<boolean>\r\n */\r\nexport const setConfirmHandler = (handler: ConfirmHandler) => {\r\n confirmHandler = handler;\r\n};\r\n\r\n/**\r\n * Show a confirmation dialog\r\n * @param message - The confirmation message\r\n * @returns Promise<boolean> - true if confirmed, false otherwise\r\n */\r\nexport const confirm = async (message: string): Promise<boolean> => {\r\n try {\r\n const result = confirmHandler(message);\r\n return result instanceof Promise ? await result : result;\r\n } catch (error) {\r\n console.error(\"Confirm handler error:\", error);\r\n return false;\r\n }\r\n};\r\n","import \"/media/manual_mount/osamuProjects/netlisian/packages/soft-config/src/puck/overrides/DrawerItem.module.css\"; export default {\"DrawerItem\":\"_DrawerItem_182aj_1\",\"DrawerItem--insertDisabled\":\"_DrawerItem--insertDisabled_182aj_14\",\"DrawerItem-content\":\"_DrawerItem-content_182aj_21\",\"DrawerItem-name\":\"_DrawerItem-name_182aj_31\",\"DrawerItem-version\":\"_DrawerItem-version_182aj_35\",\"DrawerItem-actions\":\"_DrawerItem-actions_182aj_40\",\"DrawerItem-settingsButton\":\"_DrawerItem-settingsButton_182aj_46\",\"DrawerItem-grip\":\"_DrawerItem-grip_182aj_56\",\"DrawerItem-modal\":\"_DrawerItem-modal_182aj_63\",\"DrawerItem-modalHeader\":\"_DrawerItem-modalHeader_182aj_71\",\"DrawerItem-modalTitle\":\"_DrawerItem-modalTitle_182aj_77\",\"DrawerItem-modalSubtitle\":\"_DrawerItem-modalSubtitle_182aj_84\",\"DrawerItem-modalBody\":\"_DrawerItem-modalBody_182aj_90\",\"DrawerItem-section\":\"_DrawerItem-section_182aj_100\",\"DrawerItem-sectionTitle\":\"_DrawerItem-sectionTitle_182aj_106\",\"DrawerItem-sectionDescription\":\"_DrawerItem-sectionDescription_182aj_113\",\"DrawerItem-versionList\":\"_DrawerItem-versionList_182aj_119\",\"DrawerItem-versionRow\":\"_DrawerItem-versionRow_182aj_125\",\"DrawerItem-versionRow--isDefault\":\"_DrawerItem-versionRow--isDefault_182aj_136\",\"DrawerItem-versionRow--isMarkedForDeletion\":\"_DrawerItem-versionRow--isMarkedForDeletion_182aj_141\",\"DrawerItem-versionInfo\":\"_DrawerItem-versionInfo_182aj_146\",\"DrawerItem-versionNumber\":\"_DrawerItem-versionNumber_182aj_153\",\"DrawerItem-defaultBadge\":\"_DrawerItem-defaultBadge_182aj_159\",\"DrawerItem-deleteBadge\":\"_DrawerItem-deleteBadge_182aj_170\",\"DrawerItem-versionActions\":\"_DrawerItem-versionActions_182aj_181\",\"DrawerItem-migrationOptions\":\"_DrawerItem-migrationOptions_182aj_187\",\"DrawerItem-migrationList\":\"_DrawerItem-migrationList_182aj_191\",\"DrawerItem-migrationOption\":\"_DrawerItem-migrationOption_182aj_187\",\"DrawerItem-migrationOption--isSelected\":\"_DrawerItem-migrationOption--isSelected_182aj_229\",\"DrawerItem-migrationOptionLabel\":\"_DrawerItem-migrationOptionLabel_182aj_234\",\"DrawerItem-modalFooter\":\"_DrawerItem-modalFooter_182aj_240\",\"DrawerItem-footerLeft\":\"_DrawerItem-footerLeft_182aj_250\",\"DrawerItem-footerRight\":\"_DrawerItem-footerRight_182aj_255\"}","import { ReactNode, useEffect, useState } from \"react\";\r\nimport { createPortal } from \"react-dom\";\r\nimport getClassNameFactory from \"../../lib/get-class-name-factory\";\r\nimport styles from \"./styles.module.css\";\r\n\r\nconst getClassName = getClassNameFactory(\"Modal\", styles);\r\n\r\nexport const Modal = ({\r\n children,\r\n onClose,\r\n isOpen,\r\n}: {\r\n children: ReactNode;\r\n onClose: () => void;\r\n isOpen: boolean;\r\n}) => {\r\n const [rootEl, setRootEl] = useState<any>(null);\r\n\r\n useEffect(() => {\r\n setRootEl(document.getElementById(\"puck-portal-root\"));\r\n }, []);\r\n\r\n useEffect(() => {\r\n if (!isOpen) {\r\n return;\r\n }\r\n\r\n const handleEscape = (event: KeyboardEvent) => {\r\n if (event.key === \"Escape\") {\r\n onClose();\r\n }\r\n };\r\n\r\n document.addEventListener(\"keydown\", handleEscape);\r\n return () => document.removeEventListener(\"keydown\", handleEscape);\r\n }, [isOpen, onClose]);\r\n\r\n if (!rootEl) {\r\n return <div />;\r\n }\r\n\r\n return createPortal(\r\n <div\r\n className={getClassName({ isOpen })}\r\n onClick={(event) => {\r\n if (event.target === event.currentTarget) {\r\n onClose();\r\n }\r\n }}\r\n >\r\n <div\r\n className={getClassName(\"inner\")}\r\n role=\"dialog\"\r\n aria-modal=\"true\"\r\n onClick={(e) => e.stopPropagation()}\r\n >\r\n {children}\r\n </div>\r\n </div>,\r\n rootEl\r\n );\r\n};\r\n","import \"/media/manual_mount/osamuProjects/netlisian/packages/soft-config/src/puck/components/modal/styles.module.css\"; export default {\"Modal\":\"_Modal_1t9ot_1\",\"Modal--isOpen\":\"_Modal--isOpen_1t9ot_29\",\"Modal-inner\":\"_Modal-inner_1t9ot_37\"}","import React, { useState } from \"react\";\nimport { createUsePuck, Drawer as PuckDrawer, Config } from \"@measured/puck\";\nimport { ChevronDown, ChevronUp } from \"lucide-react\";\nimport { DrawerItem } from \"./DrawerItem\";\nimport getClassNameFactory from \"../lib/get-class-name-factory\";\nimport styles from \"./Drawer.module.css\";\n\nconst getClassName = getClassNameFactory(\"Drawer\", styles);\n// Separate factory for the category wrapper -> .Drawer-category + .Drawer-category--isExpanded\nconst getCategoryClassName = getClassNameFactory(\"Drawer-category\", styles);\nconst usePuck = createUsePuck();\n\ntype GetPermissions = (params: { type: string }) => { insert: boolean };\n\ntype Category = {\n title?: string;\n components?: string[];\n visible?: boolean;\n defaultExpanded?: boolean;\n};\n\nconst CategorySection = ({\n id,\n title,\n componentKeys,\n getPermissions,\n expanded,\n onToggle,\n}: {\n id: string;\n title?: string;\n componentKeys: string[];\n getPermissions: GetPermissions;\n expanded: boolean;\n onToggle: (id: string) => void;\n}) => (\n <div className={getCategoryClassName({ isExpanded: expanded })}>\n {title && (\n <button\n type=\"button\"\n className={getClassName(\"categoryTitle\")}\n onClick={() => onToggle(id)}\n title={expanded ? `Collapse ${title}` : `Expand ${title}`}\n >\n <span>{title}</span>\n <span className={getClassName(\"categoryTitleIcon\")}>\n {expanded ? <ChevronUp size={12} /> : <ChevronDown size={12} />}\n </span>\n </button>\n )}\n <div className={getClassName(\"categoryContent\")}>\n <PuckDrawer>\n {componentKeys.map((key) => (\n <PuckDrawer.Item\n key={key}\n name={key}\n isDragDisabled={!getPermissions({ type: key }).insert}\n >\n {DrawerItem}\n </PuckDrawer.Item>\n ))}\n </PuckDrawer>\n </div>\n </div>\n);\n\n/**\n * Drawer — custom drawer override for the Puck editor.\n *\n * Reads config.categories from puck and renders a collapsible section per\n * category, each containing a PuckDrawer with DrawerItem as the item\n * renderer (soft-config versioning, demolish, and settings modal included).\n * Components not assigned to any category render under \"Other components\".\n *\n * Falls back to a flat list when no categories are defined.\n *\n * Usage:\n * overrides={{ drawer: Drawer }}\n */\nexport const Drawer = (_props: { children?: React.ReactNode }) => {\n const config = usePuck((s) => s.config) as Config & {\n categories?: Record<string, Category>;\n };\n const getPermissions = usePuck((s) => s.getPermissions);\n\n const categories = config.categories ?? {};\n\n const categorised = new Set(\n Object.values(categories).flatMap((cat) => cat.components ?? [])\n );\n\n const allKeys = Object.keys(config.components);\n const labels = Object.entries(config.components).reduce((acc, [key, comp]) => {\n acc[key] = comp.label || key;\n return acc;\n }, {} as Record<string, string>);\n const otherKeys = allKeys.filter((k) => !categorised.has(k));\n\n const categoryEntries = Object.entries(categories).filter(\n ([, cat]) => cat.visible !== false\n );\n\n const [expanded, setExpanded] = useState<Record<string, boolean>>(() => {\n const init: Record<string, boolean> = {};\n categoryEntries.forEach(([id, cat]) => {\n init[id] = cat.defaultExpanded !== false;\n });\n if (otherKeys.length > 0) init[\"__other__\"] = true;\n return init;\n });\n\n const toggle = (id: string) =>\n setExpanded((prev) => ({ ...prev, [id]: !prev[id] }));\n\n\n if (categoryEntries.length === 0) {\n return (\n <PuckDrawer>\n {allKeys.map((key) => (\n <PuckDrawer.Item\n key={key}\n name={key}\n label={labels[key]}\n isDragDisabled={!getPermissions({ type: key }).insert}\n >\n {DrawerItem}\n </PuckDrawer.Item>\n ))}\n </PuckDrawer>\n );\n }\n\n return (\n <div className={getClassName()}>\n {categoryEntries.map(([id, cat]) => (\n <CategorySection\n key={id}\n id={id}\n title={cat.title ?? id}\n componentKeys={(cat.components ?? []).filter(\n (k) => k in config.components\n )}\n getPermissions={getPermissions}\n expanded={expanded[id] ?? true}\n onToggle={toggle}\n />\n ))}\n\n {otherKeys.length > 0 && (\n <CategorySection\n id=\"__other__\"\n title=\"Other components\"\n componentKeys={otherKeys}\n getPermissions={getPermissions}\n expanded={expanded[\"__other__\"] ?? true}\n onToggle={toggle}\n />\n )}\n </div>\n );\n};\n","import \"/media/manual_mount/osamuProjects/netlisian/packages/soft-config/src/puck/overrides/Drawer.module.css\"; export default {\"Drawer\":\"_Drawer_12zq5_1\",\"Drawer-category\":\"_Drawer-category_12zq5_7\",\"Drawer-category--isExpanded\":\"_Drawer-category--isExpanded_12zq5_15\",\"Drawer-categoryContent\":\"_Drawer-categoryContent_12zq5_19\",\"Drawer-categoryTitle\":\"_Drawer-categoryTitle_12zq5_27\",\"Drawer-categoryTitleIcon\":\"_Drawer-categoryTitleIcon_12zq5_63\"}","import type { PuckAction, PuckApi } from \"@measured/puck\";\nimport { notify } from \"./notify\";\n\n/**\n * Create an action callback that validates and handles actions with undo support\n *\n * @param validateAction Function to validate if an action is allowed\n * @param undo Function to undo the last action (from Puck's history)\n * @returns Action handler function\n */\nexport const createActionCallback = (\n validateAction: (action: PuckAction) => boolean,\n undo: PuckApi['history']['back']\n) => {\n return (action: PuckAction) => {\n const isValid = validateAction(action);\n\n if (!isValid) {\n notify.error(\n \"Editing outside the soft component is not allowed when you are editing component definition.\",\n );\n // Delay undo by one render cycle to ensure Puck has processed the action\n if (typeof requestAnimationFrame === \"function\") {\n requestAnimationFrame(() => {\n requestAnimationFrame(() => {\n undo();\n });\n });\n } else {\n setTimeout(() => undo(), 0);\n }\n }\n };\n};\n","import { ComponentData, Config, Data } from \"@measured/puck\";\r\nimport { SoftComponents } from \"../types/SoftComponent\";\r\nimport { decomposeSoftComponent, isSoftComponent } from \"./decompose-soft-component\";\r\n\r\n/**\r\n * Extracts all component dependencies from a SoftComponent's structure.\r\n * Same as buildInitialSoftComponents but returns a Set for easier manipulation.\r\n */\r\nfunction extractDependencies(\r\n softComponents: SoftComponents,\r\n componentName: string,\r\n version: string\r\n): Set<string> {\r\n const dependencies = new Set<string>();\r\n const component = softComponents[componentName]?.versions?.[version];\r\n\r\n if (!component) {\r\n return dependencies;\r\n }\r\n\r\n // Recursively extract dependencies from subcomponents\r\n const processSubComponents = (subComponents: any[]): void => {\r\n if (!Array.isArray(subComponents)) return;\r\n\r\n for (const subComponent of subComponents) {\r\n if (subComponent?.type) {\r\n dependencies.add(subComponent.type);\r\n\r\n // Recursively process nested components in slots\r\n if (subComponent.components) {\r\n Object.values(subComponent.components).forEach((nestedComponents) => {\r\n processSubComponents(nestedComponents as any[]);\r\n });\r\n }\r\n }\r\n }\r\n };\r\n\r\n processSubComponents(component.components);\r\n\r\n return dependencies;\r\n}\r\n\r\n/**\r\n * Performs REVERSE topological sort on soft components.\r\n * Components with the most dependencies come first (Layout, Card, Button order).\r\n * This is the opposite of the build order - we dissolve composite components first,\r\n * then their dependencies, ensuring we always decompose to simpler forms.\r\n * \r\n * @param softComponents - All soft components\r\n * @param hardComponentNames - Set of hard component names\r\n * @returns Array of component names in reverse dependency order (composite first)\r\n */\r\nfunction reverseTopologicalSort(\r\n softComponents: SoftComponents,\r\n hardComponentNames: Set<string>\r\n): string[] {\r\n // Build dependency graph\r\n const dependencyGraph = new Map<string, Set<string>>();\r\n const dependents = new Map<string, Set<string>>(); // reverse graph\r\n\r\n for (const [componentName, component] of Object.entries(softComponents)) {\r\n const defaultVersion =\r\n component.defaultVersion || Object.keys(component.versions || {}).pop();\r\n\r\n if (!defaultVersion) continue;\r\n\r\n const allDeps = extractDependencies(\r\n softComponents,\r\n componentName,\r\n defaultVersion\r\n );\r\n\r\n // Filter to only soft component dependencies\r\n const softDeps = new Set(\r\n [...allDeps].filter((dep) => !hardComponentNames.has(dep))\r\n );\r\n\r\n dependencyGraph.set(componentName, softDeps);\r\n\r\n // Build reverse graph (who depends on me?)\r\n for (const dep of softDeps) {\r\n if (!dependents.has(dep)) {\r\n dependents.set(dep, new Set());\r\n }\r\n dependents.get(dep)!.add(componentName);\r\n }\r\n }\r\n\r\n // Calculate depth (distance from leaf components)\r\n const depths = new Map<string, number>();\r\n \r\n function calculateDepth(componentName: string): number {\r\n if (depths.has(componentName)) {\r\n return depths.get(componentName)!;\r\n }\r\n\r\n const deps = dependencyGraph.get(componentName) || new Set();\r\n if (deps.size === 0) {\r\n // Leaf component (no soft dependencies)\r\n depths.set(componentName, 0);\r\n return 0;\r\n }\r\n\r\n // Depth is 1 + max depth of dependencies\r\n let maxDepth = -1;\r\n for (const dep of deps) {\r\n if (softComponents[dep]) {\r\n maxDepth = Math.max(maxDepth, calculateDepth(dep));\r\n }\r\n }\r\n\r\n const depth = maxDepth + 1;\r\n depths.set(componentName, depth);\r\n return depth;\r\n }\r\n\r\n // Calculate depths for all components\r\n for (const componentName of Object.keys(softComponents)) {\r\n calculateDepth(componentName);\r\n }\r\n\r\n // Sort by depth (descending) - deepest (most composite) first\r\n const sortedByDepth = [...depths.entries()]\r\n .sort(([, depthA], [, depthB]) => depthB - depthA)\r\n .map(([name]) => name);\r\n\r\n return sortedByDepth;\r\n}\r\n\r\n/**\r\n * Recursively dissolves a component and all its slot contents until only hard components remain.\r\n * \r\n * @param componentData - The component to dissolve\r\n * @param softComponents - The registry of soft components\r\n * @param hardComponentNames - Set of hard component names\r\n * @param depth - Current recursion depth (for safety)\r\n * @returns Array of fully dissolved components (all hard)\r\n */\r\nfunction dissolveComponentRecursively(\r\n componentData: ComponentData,\r\n softComponents: SoftComponents,\r\n hardComponentNames: Set<string>,\r\n depth: number = 0,\r\n fieldSettings?: Record<string, any>\r\n): ComponentData[] {\r\n const MAX_DEPTH = 50; // Prevent infinite recursion\r\n \r\n if (depth > MAX_DEPTH) {\r\n console.error(\r\n `Maximum dissolution depth (${MAX_DEPTH}) exceeded for component ${componentData.type}. Possible circular dependency.`\r\n );\r\n return [componentData];\r\n }\r\n\r\n const componentType = componentData.type;\r\n\r\n // If this is a hard component, process its slots and return\r\n if (!isSoftComponent(componentType, softComponents)) {\r\n return [dissolveComponentSlots(componentData, softComponents, hardComponentNames, depth, fieldSettings)];\r\n }\r\n\r\n // This is a soft component - decompose it one level\r\n let decomposed: ComponentData[];\r\n try {\r\n decomposed = decomposeSoftComponent(componentData, softComponents, fieldSettings);\r\n } catch (error) {\r\n console.warn(\r\n `Failed to decompose soft component \"${componentType}\":`,\r\n error\r\n );\r\n return [componentData];\r\n }\r\n\r\n // Recursively dissolve each decomposed component\r\n const fullyDissolved: ComponentData[] = [];\r\n \r\n for (const component of decomposed) {\r\n const dissolved = dissolveComponentRecursively(\r\n component,\r\n softComponents,\r\n hardComponentNames,\r\n depth + 1,\r\n fieldSettings\r\n );\r\n fullyDissolved.push(...dissolved);\r\n }\r\n\r\n return fullyDissolved;\r\n}\r\n\r\n/**\r\n * Dissolves all soft components within the slots of a component.\r\n * \r\n * @param componentData - The component whose slots to dissolve\r\n * @param softComponents - The registry of soft components\r\n * @param hardComponentNames - Set of hard component names\r\n * @param depth - Current recursion depth\r\n * @returns The component with all slot contents fully dissolved to hard components\r\n */\r\nfunction dissolveComponentSlots(\r\n componentData: ComponentData,\r\n softComponents: SoftComponents,\r\n hardComponentNames: Set<string>,\r\n depth: number,\r\n fieldSettings?: Record<string, any>\r\n): ComponentData {\r\n const newProps = { ...componentData.props };\r\n\r\n // Process each prop that might be a slot (array of components). This is the\r\n // correct array-element dissolution path here: slot arrays contain component\r\n // objects and should recurse, while mapped field arrays stay as field data.\r\n Object.entries(newProps).forEach(([key, value]) => {\r\n if (Array.isArray(value) && value.length > 0 && value[0]?.type) {\r\n // This is a slot - recursively dissolve each component\r\n newProps[key] = (value as ComponentData[]).flatMap((slotComponent) =>\r\n dissolveComponentRecursively(\r\n slotComponent,\r\n softComponents,\r\n hardComponentNames,\r\n depth,\r\n fieldSettings\r\n )\r\n );\r\n }\r\n });\r\n\r\n return {\r\n ...componentData,\r\n props: newProps,\r\n };\r\n}\r\n\r\n/**\r\n * Dissolves all soft components in the data to their hard component foundations.\r\n * \r\n * This function uses reverse topological sorting to ensure components are dissolved\r\n * in the correct order: composite components (Layout) are dissolved first, then their\r\n * dependencies (Card), then their dependencies (Button), until only hard components remain.\r\n * \r\n * Process:\r\n * 1. Identify all soft and hard components\r\n * 2. Sort soft components in reverse dependency order (composite → leaf)\r\n * 3. Recursively dissolve each component until only hard components remain\r\n * 4. Process all slots to dissolve nested components\r\n * \r\n * @param data - The Puck data structure to dissolve\r\n * @param softComponents - The registry of soft components with their versions\r\n * @param config - The Puck config containing component definitions\r\n * @returns New data with all soft components fully dissolved to hard components only\r\n * \r\n * @example\r\n * ```ts\r\n * // Before: Layout (soft) -> Card (soft) -> Button (soft) -> Div (hard)\r\n * // After: Only hard components remain (Div, Span, etc.)\r\n * const dissolved = dissolveAllSoftComponents(data, softComponents, config);\r\n * ```\r\n */\r\nexport function dissolveAllSoftComponents(\r\n data: Data,\r\n softComponents: SoftComponents,\r\n config: Config\r\n): Data {\r\n // Get set of hard component names\r\n const hardComponentNames = new Set(\r\n Object.keys(config.components || {}).filter(\r\n (name) => !isSoftComponent(name, softComponents)\r\n )\r\n );\r\n\r\n // Get dissolution order (composite components first)\r\n reverseTopologicalSort(softComponents, hardComponentNames);\r\n\r\n // Extract root field settings for mapping resolution during dissolution.\r\n // We prioritize root props (live values) and merge in _fieldSettings (schema/defaults)\r\n // so that the resolver can find both current values and fallback defaults.\r\n const rootParams = (data.root as any)?.props || {};\r\n const fieldSettings = {\r\n ...((rootParams._fieldSettings as Record<string, any>) || {}),\r\n ...rootParams,\r\n };\r\n\r\n // Recursively dissolve all components in content\r\n const dissolveComponents = (components: ComponentData[]): ComponentData[] => {\r\n return components.flatMap((componentData) => {\r\n return dissolveComponentRecursively(\r\n componentData,\r\n softComponents,\r\n hardComponentNames,\r\n 0,\r\n fieldSettings\r\n );\r\n });\r\n };\r\n\r\n // Process all content\r\n const newContent = dissolveComponents(data.content || []);\r\n\r\n // Process zones if they exist\r\n const newZones: Record<string, ComponentData[]> = {};\r\n if (data.zones) {\r\n Object.entries(data.zones).forEach(([zoneName, zoneComponents]) => {\r\n newZones[zoneName] = dissolveComponents(zoneComponents);\r\n });\r\n }\r\n\r\n const result: Data = {\r\n ...data,\r\n content: newContent,\r\n ...(data.zones && { zones: newZones }),\r\n };\r\n\r\n return result;\r\n}\r\n\r\n/**\r\n * Validates that data contains only hard components (no soft components remain).\r\n * Useful for testing and debugging.\r\n * \r\n * @param data - The data to validate\r\n * @param softComponents - The soft components registry\r\n * @returns Object with validation result and any soft components found\r\n */\r\nexport function validateOnlyHardComponents(\r\n data: Data,\r\n softComponents: SoftComponents\r\n): {\r\n isValid: boolean;\r\n softComponentsFound: string[];\r\n} {\r\n const softComponentsFound: string[] = [];\r\n\r\n const checkComponents = (components: ComponentData[]): void => {\r\n for (const component of components) {\r\n if (isSoftComponent(component.type, softComponents)) {\r\n softComponentsFound.push(component.type);\r\n }\r\n\r\n // Check slots\r\n Object.values(component.props || {}).forEach((value) => {\r\n if (Array.isArray(value) && value.length > 0 && value[0]?.type) {\r\n checkComponents(value as ComponentData[]);\r\n }\r\n });\r\n }\r\n };\r\n\r\n checkComponents(data.content || []);\r\n\r\n if (data.zones) {\r\n Object.values(data.zones).forEach((zoneComponents) => {\r\n checkComponents(zoneComponents);\r\n });\r\n }\r\n\r\n return {\r\n isValid: softComponentsFound.length === 0,\r\n softComponentsFound: [...new Set(softComponentsFound)],\r\n };\r\n}\r\n","import { Data, Config } from \"@measured/puck\";\r\nimport { SoftComponents } from \"../types/SoftComponent\";\r\nimport {\r\n dissolveAllSoftComponents,\r\n validateOnlyHardComponents,\r\n} from \"./dissolve-all-soft-components\";\r\n\r\n/**\r\n * Resolves soft components in data by dissolving them to hard components only.\r\n * \r\n * This function uses reverse topological sorting to ensure components are dissolved\r\n * in the correct order (composite → leaf), guaranteeing that only hard components\r\n * remain in the final output.\r\n * \r\n * @param data - The Puck data structure to resolve\r\n * @param softComponents - The registry of soft components with their versions\r\n * @param config - The Puck config containing component definitions\r\n * @returns New data with all soft components fully dissolved to hard components\r\n * \r\n * @example\r\n * ```ts\r\n * const resolvedData = resolveSoftConfig(appState.data, softComponents, config);\r\n * ```\r\n */\r\nexport const resolveSoftConfig = (\r\n data: Data,\r\n softComponents: SoftComponents,\r\n config: Config\r\n): Data => { \r\n const dissolved = dissolveAllSoftComponents(data, softComponents, config);\r\n \r\n // Validate that only hard components remain (development check)\r\n if (process.env.NODE_ENV === \"development\") {\r\n const validation = validateOnlyHardComponents(dissolved, softComponents);\r\n if (!validation.isValid) {\r\n console.warn(\r\n \"Warning: Soft components still present after dissolution:\",\r\n validation.softComponentsFound\r\n );\r\n }\r\n }\r\n \r\n return dissolved;\r\n};\r\n\r\n// Export the main dissolution function for direct use\r\nexport { dissolveAllSoftComponents } from \"./dissolve-all-soft-components\";\r\n"],"mappings":"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","names":["import_zustand","import_puck","import_react","import_react_fast_compare","import_puck","useSoftConfig","equal","import_jsx_runtime","equal","prefix","import_react","classnames","import_jsx_runtime","import_jsx_runtime","_a","rootProps","acc","_a","uuidv4","import_react","import_react_fast_compare","import_jsx_runtime","React","_a","_b","equal","import_jsx_runtime","_a","_b","_a","import_puck","_a","_b","overrides","softComponents","import_react","import_jsx_runtime","import_puck","import_react","useCustomPuck","import_puck","useCustomPuck","import_puck","import_react","useCustomPuck","import_puck","useCustomPuck","import_puck","import_react","useCustomPuck","import_puck","useCustomPuck","import_puck","useCustomPuck","import_puck","import_puck","useCustomPuck","import_jsx_runtime","getClassName","import_react","import_puck","import_jsx_runtime","getClassName","usePuck","isSoftComponent","_a","import_react","import_puck","import_lucide_react","import_react","styles_module_default","import_jsx_runtime","getClassName","styles_module_default","import_shallow","import_jsx_runtime","getClassName","usePuck","import_react","import_puck","import_lucide_react","import_jsx_runtime","getClassName","usePuck","PuckDrawer","_a","_b","extractDependencies"]}