uhuu-components 0.2.8 → 0.2.9
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.
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"uhuu-components.es.js","sources":["../node_modules/lodash/isObject.js","../node_modules/lodash/_freeGlobal.js","../node_modules/lodash/_root.js","../node_modules/lodash/now.js","../node_modules/lodash/_trimmedEndIndex.js","../node_modules/lodash/_baseTrim.js","../node_modules/lodash/_Symbol.js","../node_modules/lodash/_getRawTag.js","../node_modules/lodash/_objectToString.js","../node_modules/lodash/_baseGetTag.js","../node_modules/lodash/isObjectLike.js","../node_modules/lodash/isSymbol.js","../node_modules/lodash/toNumber.js","../node_modules/lodash/debounce.js","../src/uhuu/pagination-dynamic/pagination/DocumentUtils.ts","../src/uhuu/utility/PageSizeUtils.js","../src/uhuu/config/config-provider.tsx","../src/uhuu/pagination-dynamic/pagination-dynamic.tsx","../src/uhuu/pagination-dynamic/sheet-dynamic.tsx","../src/uhuu/pagination-static/pagination/CompatibilityUtils.ts","../src/uhuu/pagination-static/pagination/DocumentUtils.ts","../src/uhuu/pagination-static/pagination-static.tsx","../src/uhuu/pagination-static/sheet-static.tsx","../src/uhuu/editable/dialog-props.js","../src/uhuu/image/image-bleed.tsx","../src/uhuu/editor-shell/interactive-mode-context.tsx","../src/uhuu/ui/cn.ts","../src/uhuu/ui/button.tsx","../src/uhuu/ui/dropdown-menu.tsx","../src/uhuu/image/image-overlay-utils.tsx","../src/uhuu/image/image-bleed-with-overlay.tsx","../src/uhuu/image/image-spread.tsx","../src/uhuu/image/image-with-options.tsx","../src/uhuu/image/image-block.tsx","../src/uhuu/editable/editable.tsx","../src/uhuu/editor-shell/document/page-group-utils.ts","../src/uhuu/editor-shell/document/integration-utils.ts","../src/uhuu/editor-shell/document/template-data-provider.tsx","../src/uhuu/editor-shell/resizers/section-page-resizer.tsx","../src/uhuu/ui/sheet.tsx","../src/uhuu/editor-shell/document/default-render-thumbnail.tsx","../src/uhuu/editor-shell/document/add-page-dialog.tsx","../src/uhuu/utility/drag-drop-grid.tsx","../src/uhuu/ui/badge.tsx","../src/uhuu/editor-shell/document/page-order-dialog.tsx","../src/uhuu/ui/select.tsx","../src/uhuu/ui/switch.tsx","../src/uhuu/ui/slider.tsx","../src/uhuu/ui/label.tsx","../src/uhuu/editor-shell/document/page-options-renderer.tsx","../src/uhuu/editor-shell/document/page-options-dropdown.tsx","../src/uhuu/editor-shell/document/page-group.tsx","../src/uhuu/editor-shell/document/page-canvas.tsx","../src/uhuu/editor-shell/document/use-page-groups.ts","../src/uhuu/editor-shell/document/data-binding.ts","../src/uhuu/editor-shell/document/page-group-presets.ts","../src/uhuu/ui/alert-dialog.tsx","../src/uhuu/editor-shell/document/dev-print-controls.tsx","../src/uhuu/utility/is-dev.ts","../src/uhuu/editor-shell/document/page-editor.tsx","../src/uhuu/editor-shell/document/integration-adapter.ts","../src/PagedPreview.jsx","../src/index.js"],"sourcesContent":["/**\n * Checks if `value` is the\n * [language type](http://www.ecma-international.org/ecma-262/7.0/#sec-ecmascript-language-types)\n * of `Object`. (e.g. arrays, functions, objects, regexes, `new Number(0)`, and `new String('')`)\n *\n * @static\n * @memberOf _\n * @since 0.1.0\n * @category Lang\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is an object, else `false`.\n * @example\n *\n * _.isObject({});\n * // => true\n *\n * _.isObject([1, 2, 3]);\n * // => true\n *\n * _.isObject(_.noop);\n * // => true\n *\n * _.isObject(null);\n * // => false\n */\nfunction isObject(value) {\n var type = typeof value;\n return value != null && (type == 'object' || type == 'function');\n}\n\nmodule.exports = isObject;\n","/** Detect free variable `global` from Node.js. */\nvar freeGlobal = typeof global == 'object' && global && global.Object === Object && global;\n\nmodule.exports = freeGlobal;\n","var freeGlobal = require('./_freeGlobal');\n\n/** Detect free variable `self`. */\nvar freeSelf = typeof self == 'object' && self && self.Object === Object && self;\n\n/** Used as a reference to the global object. */\nvar root = freeGlobal || freeSelf || Function('return this')();\n\nmodule.exports = root;\n","var root = require('./_root');\n\n/**\n * Gets the timestamp of the number of milliseconds that have elapsed since\n * the Unix epoch (1 January 1970 00:00:00 UTC).\n *\n * @static\n * @memberOf _\n * @since 2.4.0\n * @category Date\n * @returns {number} Returns the timestamp.\n * @example\n *\n * _.defer(function(stamp) {\n * console.log(_.now() - stamp);\n * }, _.now());\n * // => Logs the number of milliseconds it took for the deferred invocation.\n */\nvar now = function() {\n return root.Date.now();\n};\n\nmodule.exports = now;\n","/** Used to match a single whitespace character. */\nvar reWhitespace = /\\s/;\n\n/**\n * Used by `_.trim` and `_.trimEnd` to get the index of the last non-whitespace\n * character of `string`.\n *\n * @private\n * @param {string} string The string to inspect.\n * @returns {number} Returns the index of the last non-whitespace character.\n */\nfunction trimmedEndIndex(string) {\n var index = string.length;\n\n while (index-- && reWhitespace.test(string.charAt(index))) {}\n return index;\n}\n\nmodule.exports = trimmedEndIndex;\n","var trimmedEndIndex = require('./_trimmedEndIndex');\n\n/** Used to match leading whitespace. */\nvar reTrimStart = /^\\s+/;\n\n/**\n * The base implementation of `_.trim`.\n *\n * @private\n * @param {string} string The string to trim.\n * @returns {string} Returns the trimmed string.\n */\nfunction baseTrim(string) {\n return string\n ? string.slice(0, trimmedEndIndex(string) + 1).replace(reTrimStart, '')\n : string;\n}\n\nmodule.exports = baseTrim;\n","var root = require('./_root');\n\n/** Built-in value references. */\nvar Symbol = root.Symbol;\n\nmodule.exports = Symbol;\n","var Symbol = require('./_Symbol');\n\n/** Used for built-in method references. */\nvar objectProto = Object.prototype;\n\n/** Used to check objects for own properties. */\nvar hasOwnProperty = objectProto.hasOwnProperty;\n\n/**\n * Used to resolve the\n * [`toStringTag`](http://ecma-international.org/ecma-262/7.0/#sec-object.prototype.tostring)\n * of values.\n */\nvar nativeObjectToString = objectProto.toString;\n\n/** Built-in value references. */\nvar symToStringTag = Symbol ? Symbol.toStringTag : undefined;\n\n/**\n * A specialized version of `baseGetTag` which ignores `Symbol.toStringTag` values.\n *\n * @private\n * @param {*} value The value to query.\n * @returns {string} Returns the raw `toStringTag`.\n */\nfunction getRawTag(value) {\n var isOwn = hasOwnProperty.call(value, symToStringTag),\n tag = value[symToStringTag];\n\n try {\n value[symToStringTag] = undefined;\n var unmasked = true;\n } catch (e) {}\n\n var result = nativeObjectToString.call(value);\n if (unmasked) {\n if (isOwn) {\n value[symToStringTag] = tag;\n } else {\n delete value[symToStringTag];\n }\n }\n return result;\n}\n\nmodule.exports = getRawTag;\n","/** Used for built-in method references. */\nvar objectProto = Object.prototype;\n\n/**\n * Used to resolve the\n * [`toStringTag`](http://ecma-international.org/ecma-262/7.0/#sec-object.prototype.tostring)\n * of values.\n */\nvar nativeObjectToString = objectProto.toString;\n\n/**\n * Converts `value` to a string using `Object.prototype.toString`.\n *\n * @private\n * @param {*} value The value to convert.\n * @returns {string} Returns the converted string.\n */\nfunction objectToString(value) {\n return nativeObjectToString.call(value);\n}\n\nmodule.exports = objectToString;\n","var Symbol = require('./_Symbol'),\n getRawTag = require('./_getRawTag'),\n objectToString = require('./_objectToString');\n\n/** `Object#toString` result references. */\nvar nullTag = '[object Null]',\n undefinedTag = '[object Undefined]';\n\n/** Built-in value references. */\nvar symToStringTag = Symbol ? Symbol.toStringTag : undefined;\n\n/**\n * The base implementation of `getTag` without fallbacks for buggy environments.\n *\n * @private\n * @param {*} value The value to query.\n * @returns {string} Returns the `toStringTag`.\n */\nfunction baseGetTag(value) {\n if (value == null) {\n return value === undefined ? undefinedTag : nullTag;\n }\n return (symToStringTag && symToStringTag in Object(value))\n ? getRawTag(value)\n : objectToString(value);\n}\n\nmodule.exports = baseGetTag;\n","/**\n * Checks if `value` is object-like. A value is object-like if it's not `null`\n * and has a `typeof` result of \"object\".\n *\n * @static\n * @memberOf _\n * @since 4.0.0\n * @category Lang\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is object-like, else `false`.\n * @example\n *\n * _.isObjectLike({});\n * // => true\n *\n * _.isObjectLike([1, 2, 3]);\n * // => true\n *\n * _.isObjectLike(_.noop);\n * // => false\n *\n * _.isObjectLike(null);\n * // => false\n */\nfunction isObjectLike(value) {\n return value != null && typeof value == 'object';\n}\n\nmodule.exports = isObjectLike;\n","var baseGetTag = require('./_baseGetTag'),\n isObjectLike = require('./isObjectLike');\n\n/** `Object#toString` result references. */\nvar symbolTag = '[object Symbol]';\n\n/**\n * Checks if `value` is classified as a `Symbol` primitive or object.\n *\n * @static\n * @memberOf _\n * @since 4.0.0\n * @category Lang\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is a symbol, else `false`.\n * @example\n *\n * _.isSymbol(Symbol.iterator);\n * // => true\n *\n * _.isSymbol('abc');\n * // => false\n */\nfunction isSymbol(value) {\n return typeof value == 'symbol' ||\n (isObjectLike(value) && baseGetTag(value) == symbolTag);\n}\n\nmodule.exports = isSymbol;\n","var baseTrim = require('./_baseTrim'),\n isObject = require('./isObject'),\n isSymbol = require('./isSymbol');\n\n/** Used as references for various `Number` constants. */\nvar NAN = 0 / 0;\n\n/** Used to detect bad signed hexadecimal string values. */\nvar reIsBadHex = /^[-+]0x[0-9a-f]+$/i;\n\n/** Used to detect binary string values. */\nvar reIsBinary = /^0b[01]+$/i;\n\n/** Used to detect octal string values. */\nvar reIsOctal = /^0o[0-7]+$/i;\n\n/** Built-in method references without a dependency on `root`. */\nvar freeParseInt = parseInt;\n\n/**\n * Converts `value` to a number.\n *\n * @static\n * @memberOf _\n * @since 4.0.0\n * @category Lang\n * @param {*} value The value to process.\n * @returns {number} Returns the number.\n * @example\n *\n * _.toNumber(3.2);\n * // => 3.2\n *\n * _.toNumber(Number.MIN_VALUE);\n * // => 5e-324\n *\n * _.toNumber(Infinity);\n * // => Infinity\n *\n * _.toNumber('3.2');\n * // => 3.2\n */\nfunction toNumber(value) {\n if (typeof value == 'number') {\n return value;\n }\n if (isSymbol(value)) {\n return NAN;\n }\n if (isObject(value)) {\n var other = typeof value.valueOf == 'function' ? value.valueOf() : value;\n value = isObject(other) ? (other + '') : other;\n }\n if (typeof value != 'string') {\n return value === 0 ? value : +value;\n }\n value = baseTrim(value);\n var isBinary = reIsBinary.test(value);\n return (isBinary || reIsOctal.test(value))\n ? freeParseInt(value.slice(2), isBinary ? 2 : 8)\n : (reIsBadHex.test(value) ? NAN : +value);\n}\n\nmodule.exports = toNumber;\n","var isObject = require('./isObject'),\n now = require('./now'),\n toNumber = require('./toNumber');\n\n/** Error message constants. */\nvar FUNC_ERROR_TEXT = 'Expected a function';\n\n/* Built-in method references for those with the same name as other `lodash` methods. */\nvar nativeMax = Math.max,\n nativeMin = Math.min;\n\n/**\n * Creates a debounced function that delays invoking `func` until after `wait`\n * milliseconds have elapsed since the last time the debounced function was\n * invoked. The debounced function comes with a `cancel` method to cancel\n * delayed `func` invocations and a `flush` method to immediately invoke them.\n * Provide `options` to indicate whether `func` should be invoked on the\n * leading and/or trailing edge of the `wait` timeout. The `func` is invoked\n * with the last arguments provided to the debounced function. Subsequent\n * calls to the debounced function return the result of the last `func`\n * invocation.\n *\n * **Note:** If `leading` and `trailing` options are `true`, `func` is\n * invoked on the trailing edge of the timeout only if the debounced function\n * is invoked more than once during the `wait` timeout.\n *\n * If `wait` is `0` and `leading` is `false`, `func` invocation is deferred\n * until to the next tick, similar to `setTimeout` with a timeout of `0`.\n *\n * See [David Corbacho's article](https://css-tricks.com/debouncing-throttling-explained-examples/)\n * for details over the differences between `_.debounce` and `_.throttle`.\n *\n * @static\n * @memberOf _\n * @since 0.1.0\n * @category Function\n * @param {Function} func The function to debounce.\n * @param {number} [wait=0] The number of milliseconds to delay.\n * @param {Object} [options={}] The options object.\n * @param {boolean} [options.leading=false]\n * Specify invoking on the leading edge of the timeout.\n * @param {number} [options.maxWait]\n * The maximum time `func` is allowed to be delayed before it's invoked.\n * @param {boolean} [options.trailing=true]\n * Specify invoking on the trailing edge of the timeout.\n * @returns {Function} Returns the new debounced function.\n * @example\n *\n * // Avoid costly calculations while the window size is in flux.\n * jQuery(window).on('resize', _.debounce(calculateLayout, 150));\n *\n * // Invoke `sendMail` when clicked, debouncing subsequent calls.\n * jQuery(element).on('click', _.debounce(sendMail, 300, {\n * 'leading': true,\n * 'trailing': false\n * }));\n *\n * // Ensure `batchLog` is invoked once after 1 second of debounced calls.\n * var debounced = _.debounce(batchLog, 250, { 'maxWait': 1000 });\n * var source = new EventSource('/stream');\n * jQuery(source).on('message', debounced);\n *\n * // Cancel the trailing debounced invocation.\n * jQuery(window).on('popstate', debounced.cancel);\n */\nfunction debounce(func, wait, options) {\n var lastArgs,\n lastThis,\n maxWait,\n result,\n timerId,\n lastCallTime,\n lastInvokeTime = 0,\n leading = false,\n maxing = false,\n trailing = true;\n\n if (typeof func != 'function') {\n throw new TypeError(FUNC_ERROR_TEXT);\n }\n wait = toNumber(wait) || 0;\n if (isObject(options)) {\n leading = !!options.leading;\n maxing = 'maxWait' in options;\n maxWait = maxing ? nativeMax(toNumber(options.maxWait) || 0, wait) : maxWait;\n trailing = 'trailing' in options ? !!options.trailing : trailing;\n }\n\n function invokeFunc(time) {\n var args = lastArgs,\n thisArg = lastThis;\n\n lastArgs = lastThis = undefined;\n lastInvokeTime = time;\n result = func.apply(thisArg, args);\n return result;\n }\n\n function leadingEdge(time) {\n // Reset any `maxWait` timer.\n lastInvokeTime = time;\n // Start the timer for the trailing edge.\n timerId = setTimeout(timerExpired, wait);\n // Invoke the leading edge.\n return leading ? invokeFunc(time) : result;\n }\n\n function remainingWait(time) {\n var timeSinceLastCall = time - lastCallTime,\n timeSinceLastInvoke = time - lastInvokeTime,\n timeWaiting = wait - timeSinceLastCall;\n\n return maxing\n ? nativeMin(timeWaiting, maxWait - timeSinceLastInvoke)\n : timeWaiting;\n }\n\n function shouldInvoke(time) {\n var timeSinceLastCall = time - lastCallTime,\n timeSinceLastInvoke = time - lastInvokeTime;\n\n // Either this is the first call, activity has stopped and we're at the\n // trailing edge, the system time has gone backwards and we're treating\n // it as the trailing edge, or we've hit the `maxWait` limit.\n return (lastCallTime === undefined || (timeSinceLastCall >= wait) ||\n (timeSinceLastCall < 0) || (maxing && timeSinceLastInvoke >= maxWait));\n }\n\n function timerExpired() {\n var time = now();\n if (shouldInvoke(time)) {\n return trailingEdge(time);\n }\n // Restart the timer.\n timerId = setTimeout(timerExpired, remainingWait(time));\n }\n\n function trailingEdge(time) {\n timerId = undefined;\n\n // Only invoke if we have `lastArgs` which means `func` has been\n // debounced at least once.\n if (trailing && lastArgs) {\n return invokeFunc(time);\n }\n lastArgs = lastThis = undefined;\n return result;\n }\n\n function cancel() {\n if (timerId !== undefined) {\n clearTimeout(timerId);\n }\n lastInvokeTime = 0;\n lastArgs = lastCallTime = lastThis = timerId = undefined;\n }\n\n function flush() {\n return timerId === undefined ? result : trailingEdge(now());\n }\n\n function debounced() {\n var time = now(),\n isInvoking = shouldInvoke(time);\n\n lastArgs = arguments;\n lastThis = this;\n lastCallTime = time;\n\n if (isInvoking) {\n if (timerId === undefined) {\n return leadingEdge(lastCallTime);\n }\n if (maxing) {\n // Handle invocations in a tight loop.\n clearTimeout(timerId);\n timerId = setTimeout(timerExpired, wait);\n return invokeFunc(lastCallTime);\n }\n }\n if (timerId === undefined) {\n timerId = setTimeout(timerExpired, wait);\n }\n return result;\n }\n debounced.cancel = cancel;\n debounced.flush = flush;\n return debounced;\n}\n\nmodule.exports = debounce;\n","declare const $uhuu: {\n editDialog: (value: any) => void;\n};\n\nclass DocumentUtils {\n prepareRendering(container: HTMLElement) { \n const { clientHeight: height, clientWidth: width } = container;\n container.innerHTML = '';\n if (height) container.style.minHeight = `${height}px`;\n if (width && window !== window.parent) container.style.minWidth = `${width}px`;\n document?.querySelectorAll(\"style[data-pagedjs-inserted-styles]\").forEach((style) => style.remove());\n this.resetZoom();\n }\n\n finalizeRendering(container: HTMLElement) { \n if (container) {\n container.style.minWidth = 'auto';\n container.style.minHeight = 'auto';\n }\n this.attachEventListeners();\n this.applyPagedCSS();\n this.restoreZoom();\n }\n\n attachEventListeners() { \n document?.querySelectorAll(\"[data-uhuu]\").forEach((item) => {\n const clickListener = function () {\n const value = JSON.parse(this.getAttribute(\"data-uhuu\"));\n $uhuu.editDialog(value);\n };\n item.removeEventListener('click', clickListener);\n item.addEventListener('click', clickListener);\n });\n }\n\n applyPagedCSS() { \n document?.querySelectorAll(\".page-break-after[data-paged-css]\").forEach((el) => {\n const pagedSheet = el.closest('div.pagedjs_sheet');\n const pagedCSS = el.getAttribute('data-paged-css');\n if (pagedSheet && pagedCSS) {\n pagedCSS.split(' ').filter(Boolean).forEach((cssClass) => pagedSheet.classList.add(cssClass));\n }\n });\n }\n\n getStyleUrls(styles: string, fileName: string) {\n if (styles) {\n const blob = new Blob([styles], { type: 'text/css' });\n return [URL.createObjectURL(blob)];\n }\n return fileName ? [fileName] : [];\n };\n\n private originalStyles: {\n width: string;\n height: string; \n transform: string;\n transformOrigin: string;\n };\n\n resetZoom() {\n if (typeof document === 'undefined') return;\n \n const body = document?.body;\n if(!body.style.transform) { \n return; \n }\n \n this.originalStyles = {\n width: body.style.width,\n height: body.style.height,\n transform: body.style.transform,\n transformOrigin: body.style.transformOrigin || 'center center'\n };\n\n body.style.opacity = '0';\n body.style.width = '100%';\n body.style.height = '100%';\n body.style.transform = '';\n }\n\n restoreZoom() { \n if (typeof document === 'undefined') return;\n \n const body = document?.body;\n body.style.opacity = '1';\n\n if(!this.originalStyles?.transform) return; \n body.style.width = this.originalStyles.width;\n body.style.height = this.originalStyles.height;\n body.style.transform = this.originalStyles.transform; \n }\n}\n\nexport default DocumentUtils;","/**\n * Standard page size calculations in millimeters\n */\nexport class PageSizeUtils {\n static PAGE_SIZES = {\n // A series\n 'A0': { width: 841, height: 1189 },\n 'A1': { width: 594, height: 841 },\n 'A2': { width: 420, height: 594 },\n 'A3': { width: 297, height: 420 },\n 'A4': { width: 210, height: 297 },\n 'A5': { width: 148, height: 210 },\n 'A6': { width: 105, height: 148 },\n \n // B series\n 'B0': { width: 1000, height: 1414 },\n 'B1': { width: 707, height: 1000 },\n 'B2': { width: 500, height: 707 },\n 'B3': { width: 353, height: 500 },\n 'B4': { width: 250, height: 353 },\n 'B5': { width: 176, height: 250 },\n 'B6': { width: 125, height: 176 },\n \n // C series (envelopes)\n 'C0': { width: 917, height: 1297 },\n 'C1': { width: 648, height: 917 },\n 'C2': { width: 458, height: 648 },\n 'C3': { width: 324, height: 458 },\n 'C4': { width: 229, height: 324 },\n 'C5': { width: 162, height: 229 },\n 'C6': { width: 114, height: 162 },\n \n // US Sizes\n 'LETTER': { width: 216, height: 279 },\n 'LEGAL': { width: 216, height: 356 },\n 'TABLOID': { width: 279, height: 432 },\n 'LEDGER': { width: 432, height: 279 }\n };\n /**\n * Get all available page size format names\n * @returns {string[]} Array of page size format names\n */\n static getStandardFormats() {\n return ['Custom', 'A3', 'A4', 'A5', 'LETTER', 'LEGAL'];\n }\n\n /**\n * Get dimensions for a specific page size\n * @param {Object} options - Configuration options\n * @param {string} options.format - Page size format (e.g., 'A4', 'LETTER')\n * @param {string} [options.orientation='portrait'] - Page orientation ('portrait' or 'landscape')\n * @returns {{ width: number, height: number } | null} Dimensions in millimeters\n */\n static getDimensions({ \n format, \n orientation = 'portrait'\n }) {\n const size = this.PAGE_SIZES[format.toUpperCase()];\n if (!size) return null;\n\n return orientation === 'landscape' ? \n { \n width: size.height, \n height: size.width\n } : \n { \n width: size.width, \n height: size.height\n };\n }\n\n /**\n * Convert millimeters to pixels at a given DPI\n * @param {number} mm - Value in millimeters\n * @param {number} dpi - Dots per inch (default: 72)\n * @returns {number} Value in pixels\n */\n static mmToPx(mm, dpi = 72) {\n return (mm * dpi) / 25.4;\n }\n\n /**\n * Get dimensions in pixels for a specific page size\n * @param {Object} options - Configuration options\n * @param {string} options.format - Page size format (e.g., 'A4', 'LETTER')\n * @param {string} [options.orientation='portrait'] - Page orientation ('portrait' or 'landscape')\n * @param {number} [options.dpi=72] - Dots per inch\n * @returns {{ width: number, height: number } | null} Dimensions in pixels\n */\n static getDimensionsInPx({ \n format, \n orientation = 'portrait', \n dpi = 72\n }) {\n const dimensions = this.getDimensions({ \n format, \n orientation\n });\n if (!dimensions) return null;\n\n return {\n width: this.mmToPx(dimensions.width, dpi),\n height: this.mmToPx(dimensions.height, dpi)\n };\n }\n\n /**\n * Check if a format exists\n * @param {string} format - Page size format to check\n * @returns {boolean} Whether the format exists\n */\n static hasFormat(format) {\n return format.toUpperCase() in this.PAGE_SIZES;\n }\n\n /**\n * Get all available formats\n * @returns {string[]} Array of available format names\n */\n static getAvailableFormats() {\n return Object.keys(this.PAGE_SIZES);\n }\n\n static pageParams(paginationType, args) {\n if (typeof document === 'undefined') return;\n \n const {format, orientation, width, height, bleed, showBleed, compatibility, printCssRaw, printCssUrl, preview} = args;\n const dimensions = (!format || format.toLowerCase() === 'custom') && width && height && width > 10 && height > 10 && width < 4000 && height < 4000\n ? { width, height } \n : this.getDimensions({ format: format ?? 'A4', orientation });\n\n\n if (dimensions) {\n document.documentElement.style.setProperty('--uhuu-page-width', `${dimensions.width}mm`);\n document.documentElement.style.setProperty('--uhuu-page-height', `${dimensions.height}mm`); \n }\n\n document.documentElement.style.setProperty('--uhuu-page-bleed', `${Math.min(Math.max(bleed ?? 0, 0), 400)}mm`);\n\n const page = { \n paginationType,\n format, \n orientation, \n bleed, \n width: dimensions?.width, \n height: dimensions?.height, \n preview, \n showBleed,\n compatibility,\n printCssRaw,\n printCssUrl \n };\n\n return { page }; \n }\n}\n\nexport default PageSizeUtils;","import React, { createContext } from 'react';\n\n// Create the Context\nexport const ConfigContext = createContext(null);\n\n// ConfigProvider Component\nconst ConfigProvider = ({ config, children }) => {\n return (\n <ConfigContext.Provider value={config}>\n {children}\n </ConfigContext.Provider>\n );\n};\n\nexport default ConfigProvider;","import { useState, useRef, useEffect } from 'react';\nimport { Previewer } from 'pagedjs';\nimport debounce from 'lodash/debounce';\nimport DocumentUtils from './pagination/DocumentUtils';\nimport PageSizeUtils from '../utility/PageSizeUtils';\nimport ConfigProvider from '../config/config-provider';\nimport './pagination/pagination-dynamic.css';\nimport './../styles/uhuu-indicators.css';\n\ninterface PaginationProps {\n children: React.ReactNode;\n className?: string;\n setup: any; \n}\n\nconst Pagination = ({ children, className, setup }: PaginationProps) => {\n \n const [rendering, setRendering] = useState(false);\n const containerRef = useRef(null);\n const contentRef = useRef(null); \n const documentUtilsRef = useRef<DocumentUtils>(new DocumentUtils());\n\n const config = PageSizeUtils.pageParams(\"dynamic\", setup);\n\n let printCssRaw = config?.page?.printCssRaw;\n if (config?.page?.width && config?.page?.height) {\n const pageRuleRegex = /@page\\s*{([^}]*)}/;\n const match = printCssRaw?.match(pageRuleRegex);\n \n const sizeAndBleedStyles = `\n size: ${config.page.width}mm ${config.page.height}mm;\n bleed: ${config.page.bleed ?? 0}mm;`;\n\n if (match) {\n // Remove any existing size/bleed properties\n const existingStyles = match[1].replace(/\\s*(size|bleed)\\s*:[^;]*;/g, '');\n const newPageRule = `@page {${sizeAndBleedStyles}${existingStyles}}`;\n printCssRaw = printCssRaw.replace(pageRuleRegex, newPageRule);\n } else {\n printCssRaw = `@page {${sizeAndBleedStyles}}\\n${printCssRaw ?? ''}`;\n }\n }\n\n const layoutPage = debounce(() => {\n if (!containerRef.current || !contentRef.current) {\n console.warn(\"Container or page content reference is missing.\");\n return;\n }\n\n if(rendering) {\n return;\n }\n \n setRendering(true); \n documentUtilsRef.current.prepareRendering(containerRef.current);\n\n const paged = new Previewer();\n const styleUrls = documentUtilsRef.current.getStyleUrls(printCssRaw ?? '', config?.page?.printCssUrl ?? '');\n \n try {\n paged.preview(contentRef.current?.innerHTML ?? '', styleUrls, containerRef.current).then(() => { \n setRendering(false);\n documentUtilsRef.current.finalizeRendering(containerRef.current);\n });\n } catch (error) {\n console.error(\"Error during Paged.js preview rendering:\", error); \n setRendering(false);\n }\n }, 500, { leading: true });\n\n useEffect(() => {\n layoutPage();\n }, [children, setup]);\n\n return (\n <ConfigProvider config={config}>\n <div className={[(className ?? ''), (rendering ? 'rendering' : 'rendered'), (config?.page?.showBleed ? 'uhuu-bleed-visible' : ''), (config?.page?.preview ?? '')].filter(Boolean).join(' ')} ref={containerRef}></div>\n <div className=\"uhuu-reactive-content\" style={{display: 'none'}} ref={contentRef}>\n {children}\n </div>\n </ConfigProvider>\n );\n};\n\nexport default Pagination;","import React, { ReactNode } from \"react\";\n\ninterface SheetProps {\n children: ReactNode;\n}\n\nconst Sheet: React.FC<SheetProps> = ({ children }) => {\n return <>{children}</>;\n};\n\nexport default Sheet;","class Compatibility {\n\n static handlePageBreakStyles() {\n document?.querySelectorAll(\".page-break-after[data-paged-css]\").forEach((el) => {\n const pagedSheet = el.closest('div.uhuu-page-sheet');\n const pagedCSS = el.getAttribute('data-paged-css');\n \n if (pagedSheet && pagedCSS) {\n const cssClasses = pagedCSS.split(' ').filter(Boolean);\n cssClasses.forEach((cssClass) => pagedSheet.classList.add(cssClass));\n }\n });\n }\n \n static handleUhuuDialogs() {\n const clickListener = function(this: HTMLElement) {\n const value = JSON.parse(this.getAttribute(\"data-uhuu\") || '{}');\n $uhuu.editDialog(value);\n };\n \n document?.querySelectorAll(\"[data-uhuu]\").forEach((el) => {\n el.removeEventListener('click', clickListener);\n el.addEventListener('click', clickListener);\n });\n }\n\n static handle() {\n Compatibility.handlePageBreakStyles();\n Compatibility.handleUhuuDialogs();\n }\n}\n\nexport default Compatibility;","class DocumentUtils {\n static setupPageStyles(printCssUrl?: string) {\n if (!printCssUrl || typeof document === 'undefined') return;\n const link = document.createElement(\"link\");\n link.rel = \"stylesheet\";\n link.href = printCssUrl;\n document.head.appendChild(link);\n return link;\n }\n\n static removePageStyles(link: HTMLLinkElement) {\n if (link && typeof document !== 'undefined') document?.head.removeChild(link);\n }\n \n}\n\nexport default DocumentUtils;","import React, { useEffect } from 'react';\nimport CompatibilityUtils from './pagination/CompatibilityUtils';\nimport DocumentUtils from './pagination/DocumentUtils';\nimport PageSizeUtils from '../utility/PageSizeUtils';\nimport ConfigProvider from '../config/config-provider';\nimport './pagination/print.css';\nimport './pagination/pagination-static.css';\nimport './../styles/uhuu-indicators.css';\n\ninterface PaginationProps {\n children: React.ReactNode;\n className?: string;\n setup: any;\n}\n\nexport const Pagination: React.FC<PaginationProps> = ({ children, className, setup }) => {\n const config = PageSizeUtils.pageParams(\"static\", setup);\n\n useEffect(() => {\n if (config?.page?.compatibility) {\n CompatibilityUtils.handle();\n }\n\n const styleLink = DocumentUtils.setupPageStyles(config?.page?.printCssUrl);\n\n return () => {\n if (styleLink) {\n DocumentUtils.removePageStyles(styleLink as HTMLLinkElement);\n }\n };\n }, [setup, config?.page?.compatibility, config?.page?.printCssUrl]);\n\n const combinedClassName = [className, config?.page?.preview].filter(Boolean).join(' ');\n\n return (\n <ConfigProvider config={config}>\n <div className={combinedClassName}>\n {children}\n </div>\n </ConfigProvider>\n );\n};\n\nexport default Pagination;\n","import React, { ReactNode, useContext, CSSProperties, forwardRef } from \"react\";\nimport { ConfigContext } from '../config/config-provider'; // Import the ConfigContext\n\ninterface SheetProps {\n children: ReactNode;\n className?: string;\n style?: CSSProperties;\n pageNo: number;\n showBleed?: boolean;\n overlay?: (args: {pageNo: number}) => ReactNode;\n 'data-page-key'?: string;\n}\n\nconst Sheet = forwardRef<HTMLDivElement, SheetProps>(({\n children,\n className = \"\",\n style,\n pageNo,\n overlay,\n showBleed,\n 'data-page-key': dataPageKey,\n}, ref) => {\n const config = useContext(ConfigContext);\n const showBleedArea = showBleed ?? config?.page?.showBleed ?? false;\n\n return (\n <div \n className={`uhuu-page-sheet ${className}`} \n style={style} \n ref={ref}\n data-page-key={dataPageKey}\n >\n {children}\n {overlay && overlay({pageNo})}\n {showBleedArea && <div className=\"uhuu-bleed-area\"></div>}\n </div>\n );\n});\n\nexport default Sheet;","export const getDialogProps = (props, config) => {\n const dialog = props.dialog;\n\n if (!dialog) return {};\n \n if(config?.page?.paginationType === 'dynamic') return {\n 'data-uhuu': JSON.stringify(dialog)\n };\n\n return {\n onClick: (e) => {\n e.stopPropagation();\n window.$uhuu?.editDialog(dialog);\n },\n 'data-uhuu' : ''\n };\n };","import { useContext, useState } from \"react\";\nimport { ConfigContext } from '../config/config-provider'; // Import the ConfigContext\nimport { getDialogProps } from '../editable/dialog-props';\nimport './image.css';\n\ninterface ImageBleedProps { \n src?: string;\n backgroundColor?: string;\n width?: number;\n left?: number;\n right?: number;\n top?: number;\n bottom?: number;\n height?: number;\n pageWidth?: number;\n pageHeight?: number;\n bleed?: number;\n dialog?: object;\n children?: React.ReactNode;\n}\n\nconst ImageBleed = (props: ImageBleedProps) => {\n const config = useContext(ConfigContext); \n // Get page dimensions and bleed from props or use defaults (from context if not provided) \n const BLEED = props.bleed ?? config?.page?.bleed ?? 0; \n const PAGE_CONTENT_WIDTH = (props.pageWidth ?? config?.page?.width ?? 210); \n const PAGE_CONTENT_HEIGHT = (props.pageHeight ?? config?.page?.height ?? 297); \n\n const {\n src,\n backgroundColor,\n width: imageW,\n height: imageH,\n left: imageL = 0,\n right: imageR = 0,\n top: imageT = 0,\n bottom: imageB = 0, \n } = props;\n\n\n const [coverClass, setCoverClass] = useState(\"h-full w-full object-cover object-center\");\n\n const unitFormat = (value) => `${value}mm`;\n\n const calculateImageHeight = (): number => {\n let result = imageH; \n if(!imageH) {\n result = PAGE_CONTENT_HEIGHT;\n if(!imageT) result += BLEED;\n if(!imageB) result += BLEED;\n if(imageT || imageB) result -= (imageT ?? 0) + (imageB ?? 0);\n }\n return result;\n };\n\n const calculateImageWidth = (): number => {\n\n let result = imageW; \n if(!imageW) {\n result = PAGE_CONTENT_WIDTH;\n if(!imageL) result += BLEED;\n if(!imageR) result += BLEED;\n if(imageL || imageR) result -= (imageL ?? 0) + (imageR ?? 0);\n }\n return result;\n };\n\n\n const imageWidth = calculateImageWidth();\n const imageHeight = calculateImageHeight();\n \n\n const formatStyleValue = (value: number | undefined): string | undefined => \n value !== undefined ? unitFormat(value) : undefined;\n\n const createStyle = (styles: Record<string, string | undefined>) => {\n return Object.fromEntries(\n Object.entries(styles).filter(([_, value]) => value !== undefined)\n );\n };\n\n // Replace old style object with new createStyle implementation\n const style = createStyle({\n backgroundColor,\n width: formatStyleValue(imageWidth),\n height: formatStyleValue(imageHeight),\n left: formatStyleValue(imageL > 0 ? imageL + BLEED : imageL),\n right: formatStyleValue(imageR > 0 ? imageR + BLEED : imageR),\n top: formatStyleValue(imageT > 0 ? imageT + BLEED : imageT),\n bottom: formatStyleValue(imageB > 0 ? imageB + BLEED : imageB),\n });\n\n \n // calc ratio of image: if imageHeight set to 0 (means it should be \"auto\") then calc using default pageHeight and spacings\n const ratio = imageHeight > 0 ? imageWidth / imageHeight : \n imageWidth / (PAGE_CONTENT_HEIGHT - (imageT ?? 0) - (imageB ?? 0));\n \n\n const imageLoaded = (e) => {\n // Compare loaded image ratio with container ratio to determine cover mode\n const imageRatio = e.target.naturalWidth / e.target.naturalHeight; // Use naturalWidth/Height to get actual image dimensions\n\n // If image is wider relative to container, use vertical cover mode\n // Otherwise use horizontal cover mode\n let imageClass = imageRatio > ratio ? \"cover-vertical\" : \"cover-horizontal\"; \n setCoverClass(imageClass);\n };\n\n \n\n return (\n <div className=\"uhuu-image-container\" style={style}>\n <div \n className=\"uhuu-image-inner\" \n {...getDialogProps(props, config)}\n >\n <img \n className={coverClass} \n src={src} \n onLoad={(e) => imageLoaded(e)} \n key={`${src}-${imageWidth}-${imageHeight}`}\n />\n {props.children}\n </div>\n </div>\n );\n};\n\nexport default ImageBleed;","import * as React from \"react\"\nimport { createContext, useContext, useState } from \"react\"\n\ninterface InteractiveModeContextType {\n interactive: boolean\n setInteractive: (value: boolean) => void\n enableDevTools?: boolean\n}\n\nconst InteractiveModeContext = createContext<InteractiveModeContextType>({\n interactive: true,\n setInteractive: () => {},\n enableDevTools: false,\n})\n\n/**\n * Hook to access interactive mode state\n * Returns true if UI should show interactive elements (default), false to hide them\n */\nexport function useInteractive() {\n return useContext(InteractiveModeContext)\n}\n\n/**\n * Hook to check if UI elements should be hidden\n * Returns true when interactive mode is OFF\n */\nexport function useShouldHideUI(): boolean {\n const { interactive } = useInteractive()\n return !interactive\n}\n\ninterface InteractiveModeProviderProps {\n children: React.ReactNode\n defaultInteractive?: boolean\n enableDevTools?: boolean\n}\n\n/**\n * InteractiveModeProvider - Global control for showing/hiding UI elements\n * \n * When interactive=true (default): Shows all controls (edit mode)\n * When interactive=false: Hides all UI elements (Print Mode)\n * \n * @param defaultInteractive - Initial interactive mode state (default: true)\n * @param enableDevTools - Force enable dev tools (print mode controls) even in production (default: false)\n * \n * @example\n * ```tsx\n * <InteractiveModeProvider defaultInteractive={true} enableDevTools={true}>\n * <MyApp />\n * </InteractiveModeProvider>\n * \n * // Inside components:\n * const { interactive, setInteractive } = useInteractive()\n * <button onClick={() => setInteractive(!interactive)}>\n * {interactive ? 'Hide UI' : 'Show UI'}\n * </button>\n * ```\n */\nexport function InteractiveModeProvider({\n children,\n defaultInteractive = true,\n enableDevTools = false,\n}: InteractiveModeProviderProps) {\n const shouldDisableInteractive = typeof window !== 'undefined' && (window as any)?.$uhuu_renderer ? true : false;\n \n const effectiveDefaultInteractive = shouldDisableInteractive \n ? false \n : defaultInteractive\n \n const [interactive, setInteractive] = useState(effectiveDefaultInteractive)\n\n return (\n <InteractiveModeContext.Provider value={{ interactive, setInteractive, enableDevTools }}>\n {children}\n </InteractiveModeContext.Provider>\n )\n}\n\n\n\n\n","import { clsx, type ClassValue } from \"clsx\"\nimport { twMerge } from \"tailwind-merge\"\n\nexport function cn(...inputs: ClassValue[]) {\n return twMerge(clsx(inputs))\n}\n\n","import * as React from \"react\"\nimport { cva, type VariantProps } from \"class-variance-authority\"\nimport { cn } from \"./cn\"\n\nconst buttonVariants = cva(\n \"inline-flex items-center justify-center gap-2 whitespace-nowrap rounded-md text-sm font-medium transition-colors focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-offset-2 disabled:pointer-events-none disabled:opacity-50\",\n {\n variants: {\n variant: {\n default: \"bg-gray-900 text-white hover:bg-gray-800\",\n outline: \"border border-gray-300 bg-white hover:bg-gray-50 text-gray-900\",\n ghost: \"hover:bg-gray-100 text-gray-900\",\n secondary: \"bg-gray-100 text-gray-900 hover:bg-gray-200\",\n },\n size: {\n default: \"h-10 px-4 py-2\",\n sm: \"h-9 px-3 text-sm\",\n lg: \"h-11 px-8\",\n icon: \"h-10 w-10\",\n },\n },\n defaultVariants: {\n variant: \"default\",\n size: \"default\",\n },\n }\n)\n\nexport interface ButtonProps\n extends React.ButtonHTMLAttributes<HTMLButtonElement>,\n VariantProps<typeof buttonVariants> {\n asChild?: boolean\n}\n\nconst Button = React.forwardRef<HTMLButtonElement, ButtonProps>(\n ({ className, variant, size, ...props }, ref) => {\n return (\n <button\n className={cn(buttonVariants({ variant, size, className }))}\n ref={ref}\n {...props}\n />\n )\n }\n)\nButton.displayName = \"Button\"\n\nexport { Button, buttonVariants }\n\n","import * as React from \"react\"\nimport * as DropdownMenuPrimitive from \"@radix-ui/react-dropdown-menu\"\nimport { cn } from \"./cn\"\n\nconst DropdownMenu = DropdownMenuPrimitive.Root\n\nconst DropdownMenuTrigger = DropdownMenuPrimitive.Trigger\n\nconst DropdownMenuGroup = DropdownMenuPrimitive.Group\n\nconst DropdownMenuPortal = DropdownMenuPrimitive.Portal\n\nconst DropdownMenuSub = DropdownMenuPrimitive.Sub\n\nconst DropdownMenuRadioGroup = DropdownMenuPrimitive.RadioGroup\n\nconst DropdownMenuSubTrigger = React.forwardRef<\n React.ElementRef<typeof DropdownMenuPrimitive.SubTrigger>,\n React.ComponentPropsWithoutRef<typeof DropdownMenuPrimitive.SubTrigger> & {\n inset?: boolean\n }\n>(({ className, inset, children, ...props }, ref) => (\n <DropdownMenuPrimitive.SubTrigger\n ref={ref}\n className={cn(\n \"flex cursor-default select-none items-center rounded-sm px-2 py-1.5 text-sm outline-none focus:bg-gray-100 data-[state=open]:bg-gray-100\",\n inset && \"pl-8\",\n className\n )}\n {...props}\n >\n {children}\n </DropdownMenuPrimitive.SubTrigger>\n))\nDropdownMenuSubTrigger.displayName = DropdownMenuPrimitive.SubTrigger.displayName\n\nconst DropdownMenuSubContent = React.forwardRef<\n React.ElementRef<typeof DropdownMenuPrimitive.SubContent>,\n React.ComponentPropsWithoutRef<typeof DropdownMenuPrimitive.SubContent>\n>(({ className, ...props }, ref) => (\n <DropdownMenuPrimitive.SubContent\n ref={ref} \n className={cn(\n \"z-50 min-w-[8rem] overflow-hidden rounded-md border border-gray-200 bg-white p-1 text-gray-900 shadow-lg data-[state=open]:animate-in data-[state=closed]:animate-out data-[state=closed]:fade-out-0 data-[state=open]:fade-in-0 data-[state=closed]:zoom-out-95 data-[state=open]:zoom-in-95 data-[side=bottom]:slide-in-from-top-2 data-[side=left]:slide-in-from-right-2 data-[side=right]:slide-in-from-left-2 data-[side=top]:slide-in-from-bottom-2\",\n className\n )}\n {...props}\n />\n))\nDropdownMenuSubContent.displayName = DropdownMenuPrimitive.SubContent.displayName\n\nconst DropdownMenuContent = React.forwardRef<\n React.ElementRef<typeof DropdownMenuPrimitive.Content>,\n React.ComponentPropsWithoutRef<typeof DropdownMenuPrimitive.Content>\n>(({ className, sideOffset = 4, ...props }, ref) => (\n <DropdownMenuPrimitive.Portal>\n <DropdownMenuPrimitive.Content\n ref={ref}\n sideOffset={sideOffset}\n data-uhuu-editor \n className={cn(\n \"z-50 min-w-[8rem] overflow-hidden rounded-md border border-gray-200 bg-white p-1 text-gray-900 shadow-md data-[state=open]:animate-in data-[state=closed]:animate-out data-[state=closed]:fade-out-0 data-[state=open]:fade-in-0 data-[state=closed]:zoom-out-95 data-[state=open]:zoom-in-95 data-[side=bottom]:slide-in-from-top-2 data-[side=left]:slide-in-from-right-2 data-[side=right]:slide-in-from-left-2 data-[side=top]:slide-in-from-bottom-2\",\n className\n )}\n {...props}\n />\n </DropdownMenuPrimitive.Portal>\n))\nDropdownMenuContent.displayName = DropdownMenuPrimitive.Content.displayName\n\nconst DropdownMenuItem = React.forwardRef<\n React.ElementRef<typeof DropdownMenuPrimitive.Item>,\n React.ComponentPropsWithoutRef<typeof DropdownMenuPrimitive.Item> & {\n inset?: boolean\n }\n>(({ className, inset, ...props }, ref) => (\n <DropdownMenuPrimitive.Item\n ref={ref}\n className={cn(\n \"relative flex cursor-default select-none items-center rounded-sm px-2 py-1.5 text-sm outline-none transition-colors focus:bg-gray-100 focus:text-gray-900 data-[disabled]:pointer-events-none data-[disabled]:opacity-50\",\n inset && \"pl-8\",\n className\n )}\n {...props}\n />\n))\nDropdownMenuItem.displayName = DropdownMenuPrimitive.Item.displayName\n\nconst DropdownMenuCheckboxItem = React.forwardRef<\n React.ElementRef<typeof DropdownMenuPrimitive.CheckboxItem>,\n React.ComponentPropsWithoutRef<typeof DropdownMenuPrimitive.CheckboxItem>\n>(({ className, children, checked, ...props }, ref) => (\n <DropdownMenuPrimitive.CheckboxItem\n ref={ref}\n className={cn(\n \"relative flex cursor-default select-none items-center rounded-sm py-1.5 pl-8 pr-2 text-sm outline-none transition-colors focus:bg-gray-100 focus:text-gray-900 data-[disabled]:pointer-events-none data-[disabled]:opacity-50\",\n className\n )}\n checked={checked}\n {...props}\n >\n {children}\n </DropdownMenuPrimitive.CheckboxItem>\n))\nDropdownMenuCheckboxItem.displayName = DropdownMenuPrimitive.CheckboxItem.displayName\n\nconst DropdownMenuRadioItem = React.forwardRef<\n React.ElementRef<typeof DropdownMenuPrimitive.RadioItem>,\n React.ComponentPropsWithoutRef<typeof DropdownMenuPrimitive.RadioItem>\n>(({ className, children, ...props }, ref) => (\n <DropdownMenuPrimitive.RadioItem\n ref={ref}\n className={cn(\n \"relative flex cursor-default select-none items-center rounded-sm py-1.5 pl-8 pr-2 text-sm outline-none transition-colors focus:bg-gray-100 focus:text-gray-900 data-[disabled]:pointer-events-none data-[disabled]:opacity-50\",\n className\n )}\n {...props}\n >\n {children}\n </DropdownMenuPrimitive.RadioItem>\n))\nDropdownMenuRadioItem.displayName = DropdownMenuPrimitive.RadioItem.displayName\n\nconst DropdownMenuLabel = React.forwardRef<\n React.ElementRef<typeof DropdownMenuPrimitive.Label>,\n React.ComponentPropsWithoutRef<typeof DropdownMenuPrimitive.Label> & {\n inset?: boolean\n }\n>(({ className, inset, ...props }, ref) => (\n <DropdownMenuPrimitive.Label\n ref={ref}\n className={cn(\n \"px-2 py-1.5 text-sm font-medium\",\n inset && \"pl-8\",\n className\n )}\n {...props}\n />\n))\nDropdownMenuLabel.displayName = DropdownMenuPrimitive.Label.displayName\n\nconst DropdownMenuSeparator = React.forwardRef<\n React.ElementRef<typeof DropdownMenuPrimitive.Separator>,\n React.ComponentPropsWithoutRef<typeof DropdownMenuPrimitive.Separator>\n>(({ className, ...props }, ref) => (\n <DropdownMenuPrimitive.Separator\n ref={ref}\n className={cn(\"-mx-1 my-1 h-px bg-gray-200\", className)}\n {...props}\n />\n))\nDropdownMenuSeparator.displayName = DropdownMenuPrimitive.Separator.displayName\n\nconst DropdownMenuShortcut = ({\n className,\n ...props\n}: React.HTMLAttributes<HTMLSpanElement>) => {\n return (\n <span\n className={cn(\"ml-auto text-xs tracking-widest opacity-60\", className)}\n {...props}\n />\n )\n}\nDropdownMenuShortcut.displayName = \"DropdownMenuShortcut\"\n\nexport {\n DropdownMenu,\n DropdownMenuTrigger,\n DropdownMenuContent,\n DropdownMenuItem,\n DropdownMenuCheckboxItem,\n DropdownMenuRadioItem,\n DropdownMenuLabel,\n DropdownMenuSeparator,\n DropdownMenuShortcut,\n DropdownMenuGroup,\n DropdownMenuPortal,\n DropdownMenuSub,\n DropdownMenuSubContent,\n DropdownMenuSubTrigger,\n DropdownMenuRadioGroup,\n}\n\n","import * as React from \"react\"\nimport { MoreHorizontal } from \"lucide-react\"\nimport type { ImageOption } from './image-with-options'\nimport { useShouldHideUI } from \"../editor-shell/interactive-mode-context\"\nimport { Button } from \"../ui/button\"\nimport {\n DropdownMenu,\n DropdownMenuContent,\n DropdownMenuItem,\n DropdownMenuTrigger,\n} from \"../ui/dropdown-menu\"\nimport { cn } from \"../ui/cn\"\n\ntype OptionSelectEvent = Event | React.SyntheticEvent\n\nexport const handleOptionSelect = (event: OptionSelectEvent, option: ImageOption) => {\n event.stopPropagation()\n\n if (option.onSelect) {\n option.onSelect(event)\n return\n }\n\n if (option.dialog && typeof window !== \"undefined\") {\n ;(window as any).$uhuu?.editDialog?.(option.dialog)\n }\n}\n\nexport const renderOverlay = (\n overlaySvg: string | undefined,\n overlayClassName: string | undefined\n): React.ReactNode => {\n if (!overlaySvg) return null\n \n const trimmed = overlaySvg.trim()\n const isInlineSvg = trimmed.startsWith(\"<\")\n\n if (isInlineSvg) {\n const normalizedSvg = trimmed.replace(/<svg\\b([^>]*)>/i, (match, attrs) => {\n let nextAttrs = attrs\n if (/\\bwidth=/.test(nextAttrs)) {\n nextAttrs = nextAttrs.replace(/\\bwidth=(\\\"[^\\\"]*\\\"|'[^']*'|[^\\s>]+)/i, 'width=\"100%\"')\n } else {\n nextAttrs += ' width=\"100%\"'\n }\n if (/\\bheight=/.test(nextAttrs)) {\n nextAttrs = nextAttrs.replace(/\\bheight=(\\\"[^\\\"]*\\\"|'[^']*'|[^\\s>]+)/i, 'height=\"100%\"')\n } else {\n nextAttrs += ' height=\"100%\"'\n }\n if (/\\bpreserveAspectRatio=/.test(nextAttrs)) {\n nextAttrs = nextAttrs.replace(\n /\\bpreserveAspectRatio=(\\\"[^\\\"]*\\\"|'[^']*'|[^\\s>]+)/i,\n 'preserveAspectRatio=\"xMidYMid slice\"'\n )\n } else {\n nextAttrs += ' preserveAspectRatio=\"xMidYMid slice\"'\n }\n return `<svg${nextAttrs}>`\n })\n return (\n <div\n className={cn(\"pointer-events-none absolute inset-0 z-10\", overlayClassName)}\n aria-hidden=\"true\"\n dangerouslySetInnerHTML={{ __html: normalizedSvg }}\n />\n )\n }\n\n return (\n <img\n src={overlaySvg}\n alt=\"\"\n aria-hidden=\"true\"\n className={cn(\n \"pointer-events-none absolute inset-0 z-10 h-full w-full object-cover\",\n overlayClassName\n )}\n />\n )\n}\n\nexport const renderOptionsButton = (\n options: ImageOption[],\n showOptions: boolean\n): React.ReactNode => {\n if (!showOptions) return null\n \n return (\n <div className=\"absolute right-2 top-2 z-20\">\n <DropdownMenu modal={false}>\n <DropdownMenuTrigger asChild>\n <Button\n variant=\"secondary\"\n size=\"icon\"\n title=\"Image options\"\n className=\"h-7 w-7 shadow-sm\"\n onPointerDown={(event) => event.stopPropagation()}\n onClick={(event) => event.stopPropagation()}\n >\n <MoreHorizontal className=\"h-4 w-4\" />\n </Button>\n </DropdownMenuTrigger>\n <DropdownMenuContent className=\"w-40 p-1.5\" align=\"end\">\n {options.map((option) => (\n <DropdownMenuItem\n key={option.id}\n onSelect={(event) => handleOptionSelect(event, option)}\n disabled={option.disabled}\n >\n {option.icon && <span className=\"mr-2 inline-flex\">{option.icon}</span>}\n <span>{option.label}</span>\n </DropdownMenuItem>\n ))}\n </DropdownMenuContent>\n </DropdownMenu>\n </div>\n )\n}\n\nexport const useShouldShowOptions = (\n options: ImageOption[] = []\n): boolean => {\n const shouldHideUI = useShouldHideUI()\n return options.length > 0 && !shouldHideUI\n}\n","import * as React from \"react\"\nimport ImageBleed from './image-bleed'\nimport type { ImageOption } from './image-with-options'\nimport {\n renderOverlay,\n renderOptionsButton,\n useShouldShowOptions,\n} from './image-overlay-utils'\n\ninterface ImageBleedWithOverlayProps {\n className?: string\n style?: React.CSSProperties\n overlaySvg?: string\n overlayClassName?: string\n options?: ImageOption[]\n dialogProps?: Record<string, any>\n bleedProps: any\n children?: React.ReactNode\n}\n\nconst ImageBleedWithOverlay = ({\n className,\n style,\n overlaySvg,\n overlayClassName,\n options = [],\n dialogProps,\n bleedProps,\n children,\n}: ImageBleedWithOverlayProps) => {\n const showOptions = useShouldShowOptions(options)\n\n // Render bleed with overlay inside, options button alongside\n return (\n <>\n <ImageBleed {...bleedProps}>\n {renderOverlay(overlaySvg, overlayClassName)}\n {children}\n </ImageBleed>\n {renderOptionsButton(options, showOptions)}\n </>\n )\n}\n\nexport default ImageBleedWithOverlay\n","import { useState, useContext } from \"react\";\nimport { ConfigContext } from '../config/config-provider'; // Import the ConfigContext\nimport { getDialogProps } from '../editable/dialog-props';\nimport './image.css';\n\ninterface ImageSpreadProps { \n src?: string;\n side?: \"start\" | \"end\";\n backgroundColor?: string;\n width?: number;\n left?: number;\n right?: number;\n top?: number;\n bottom?: number;\n height?: number;\n pageWidth?: number;\n pageHeight?: number;\n bleed?: number;\n dialog?: object;\n children?: React.ReactNode;\n}\n\n// Constants\nexport default function ImageSpread(props: ImageSpreadProps) {\n\n const config = useContext(ConfigContext); \n // Get page dimensions and bleed from props or use defaults (from context if not provided)\n const BLEED = props.bleed ?? config?.page?.bleed ?? 0; \n const PAGE_CONTENT_WIDTH = (props.pageWidth ?? config?.page?.width ?? 210);\n const PAGE_CONTENT_HEIGHT = (props.pageHeight ?? config?.page?.height ?? 297);\n \n const {\n src,\n side,\n backgroundColor,\n width: imageW,\n height: imageH,\n left: imageL = 0,\n right: imageR = 0,\n top: imageT = 0,\n bottom: imageB = 0, \n } = props;\n\n const [coverClass, setCoverClass] = useState(\"h-full w-full object-cover object-center\");\n\n\n const unitFormat = (val: number): string => {\n return `${val}mm`;\n };\n\n const calculateImageWidth = (): number => {\n let result = imageW; \n if(!imageW) {\n result = 2 * PAGE_CONTENT_WIDTH;\n if(!imageL) result += 2 * BLEED;\n if(!imageR) result += 2 * BLEED;\n if(imageL || imageR) result -= (imageL ?? 0) + (imageR ?? 0);\n }\n return result;\n };\n\n const calculateImageHeight = (): number => {\n let result = imageH; \n if(!imageH) {\n result = PAGE_CONTENT_HEIGHT;\n if(!imageT) result += BLEED;\n if(!imageB) result += BLEED;\n if(imageT || imageB) result -= (imageT ?? 0) + (imageB ?? 0);\n }\n return result;\n };\n\n // Calculate dimensions \n const imageWidth = calculateImageWidth();\n const imageHeight = calculateImageHeight(); \n \n\n const formatStyleValue = (value: number | undefined): string | undefined => \n value !== undefined ? unitFormat(value) : undefined;\n\n const createStyle = (styles: Record<string, string | undefined>) => {\n return Object.fromEntries(\n Object.entries(styles).filter(([_, value]) => value !== undefined)\n );\n };\n\n // const imageTop = imageT ?? (-1 * BLEED);\n // const imageBottom = imageB ?? undefined;\n const imageLeft = imageL > 0 ? imageL : (-1 * BLEED);\n const rightPageOffset = -1 * PAGE_CONTENT_WIDTH + imageLeft; // Offset of right page\n \n const leftStyle = createStyle({\n backgroundColor,\n width: formatStyleValue(imageWidth),\n height: formatStyleValue(imageHeight),\n left: formatStyleValue(imageLeft),\n top: formatStyleValue(imageT > 0 ? imageT + BLEED : imageT),\n bottom: formatStyleValue(imageB > 0 ? imageB + BLEED : imageB)\n });\n\n const rightStyle = createStyle({\n width: formatStyleValue(imageWidth),\n height: formatStyleValue(imageHeight),\n left: formatStyleValue(rightPageOffset),\n top: formatStyleValue(imageT > 0 ? imageT + BLEED : imageT),\n bottom: formatStyleValue(imageB > 0 ? imageB + BLEED : imageB)\n });\n\n // calc ratio of image: if imageHeight set to 0 (means it should be \"auto\") then calc using default pageHeight and spacings\n const ratio =\n imageHeight != 0\n ? imageWidth / imageHeight\n : imageWidth / (PAGE_CONTENT_HEIGHT - (imageT ?? 0) - (imageB ?? 0));\n\n const imageLoaded = (e) => {\n // Compare loaded image ratio with container ratio to determine cover mode\n const imageRatio = e.target.naturalWidth / e.target.naturalHeight; // Use naturalWidth/Height to get actual image dimensions\n \n // If image is wider relative to container, use vertical cover mode\n // Otherwise use horizontal cover mode\n let imageClass = imageRatio > ratio ? \"cover-vertical\" : \"cover-horizontal\"; \n setCoverClass(imageClass);\n };\n\n\n return <div className={`uhuu-image-container`} style={side == \"end\" ? rightStyle : leftStyle}>\n <div className=\"uhuu-image-inner\" {...getDialogProps(props, config)}>\n {props.children || (\n <img \n className={coverClass} \n src={src} \n onLoad={(e) => imageLoaded(e)}\n key={`${src}-${imageWidth}-${imageHeight}`} // Force reload when height or width change\n />\n )}\n </div>\n </div>\n}\n\n","import * as React from \"react\"\nimport { useContext } from \"react\"\nimport { ConfigContext } from \"../config/config-provider\"\nimport { getDialogProps } from \"../editable/dialog-props\"\nimport { cn } from \"../ui/cn\"\nimport {\n renderOverlay,\n renderOptionsButton,\n useShouldShowOptions,\n} from './image-overlay-utils'\n\ntype OptionSelectEvent = Event | React.SyntheticEvent\n\nexport type ImageOption = {\n id: string\n label: string\n icon?: React.ReactNode\n dialog?: Record<string, any> | null\n onSelect?: (event: OptionSelectEvent) => void\n disabled?: boolean\n}\n\ntype ImageRenderProps = React.ImgHTMLAttributes<HTMLImageElement>\n\ninterface ImageWithOptionsProps {\n src?: string\n alt?: string\n className?: string\n imageClassName?: string\n style?: React.CSSProperties\n imageStyle?: React.CSSProperties\n overlaySvg?: string\n overlayClassName?: string\n options?: ImageOption[]\n dialog?: Record<string, any> | null\n dialogProps?: Record<string, any>\n placeholder?: React.ReactNode\n children?: React.ReactNode\n imageProps?: React.ImgHTMLAttributes<HTMLImageElement>\n renderImage?: (props: ImageRenderProps) => React.ReactNode\n}\n\nconst ImageWithOptions = ({\n src,\n alt = \"\",\n className,\n imageClassName,\n style,\n imageStyle,\n overlaySvg,\n overlayClassName,\n options = [],\n dialog,\n dialogProps,\n placeholder,\n children,\n imageProps,\n renderImage,\n}: ImageWithOptionsProps) => {\n const config = useContext(ConfigContext)\n const baseDialogProps = dialog ? getDialogProps({ dialog }, config) : {}\n const showOptions = useShouldShowOptions(options)\n\n const mergedDialogProps = React.useMemo(() => {\n if (!dialogProps) return baseDialogProps\n const merged: Record<string, any> = { ...baseDialogProps, ...dialogProps }\n if (baseDialogProps.className || dialogProps.className) {\n merged.className = cn(baseDialogProps.className, dialogProps.className)\n }\n Object.keys(baseDialogProps).forEach((key) => {\n const baseHandler = baseDialogProps[key]\n const extraHandler = dialogProps[key]\n if (key.startsWith(\"on\") && typeof baseHandler === \"function\" && typeof extraHandler === \"function\") {\n merged[key] = (event: any) => {\n baseHandler(event)\n extraHandler(event)\n }\n }\n })\n return merged\n }, [baseDialogProps, dialogProps])\n\n const renderImageContent = () => {\n const imagePropsClassName = imageProps?.className\n const imagePropsStyle = imageProps?.style\n const finalSrc = imageProps?.src ?? src\n const finalAlt = imageProps?.alt ?? alt\n const mergedImageProps: React.ImgHTMLAttributes<HTMLImageElement> = {\n ...imageProps,\n src: finalSrc,\n alt: finalAlt,\n className: cn(\"h-full w-full object-cover\", imageClassName, imagePropsClassName),\n style: { ...imageStyle, ...imagePropsStyle },\n }\n\n if (renderImage) {\n return renderImage(mergedImageProps)\n }\n\n if (finalSrc) {\n return <img {...mergedImageProps} />\n }\n\n return placeholder ?? null\n }\n\n return (\n <div className={cn(\"relative\", className)} style={style}>\n <div className=\"relative h-full w-full\" {...mergedDialogProps}>\n {renderImageContent()}\n {children}\n {renderOverlay(overlaySvg, overlayClassName)}\n </div>\n {renderOptionsButton(options, showOptions)}\n </div>\n )\n}\n\nexport default ImageWithOptions\n","import * as React from \"react\"\nimport { useMemo } from \"react\"\nimport ImageBleed from './image-bleed'\nimport ImageBleedWithOverlay from './image-bleed-with-overlay'\nimport ImageSpread from './image-spread'\nimport ImageWithOptions from './image-with-options'\nimport type { ImageOption } from './image-with-options'\n\ntype ImageBlockMode = \"bleed\" | \"spread\" | \"auto\"\n\ntype ImageRenderProps = React.ImgHTMLAttributes<HTMLImageElement>\n\n// Annotation data structure\ntype AnnotationValue = {\n annotationSvg?: string\n annotations?: unknown[]\n}\n\n// Simplified annotation config\ninterface ImageBlockAnnotation {\n path: string // where annotation data is stored\n value?: AnnotationValue // preloaded data (optional)\n}\n\n// Dialog config with type\ninterface ImageBlockDialog {\n path: string // where data is stored\n type: 'image' | 'satellite' // dialog type\n config?: any // optional config (e.g., for satellite: lat, lng, zoom, etc.)\n}\n\ninterface ImageBlockProps {\n // Image source\n src?: string\n alt?: string // Optional - not required for PDF rendering\n \n // Styling - className/style for container, imageClassName/imageStyle for <img>\n className?: string\n imageClassName?: string\n style?: React.CSSProperties\n imageStyle?: React.CSSProperties\n backgroundColor?: string\n \n // Print mode - only needed for full-bleed print images\n mode?: ImageBlockMode\n side?: \"start\" | \"end\" // For spread mode (left/right page)\n \n // Bleed dimensions (only used in bleed/spread modes)\n width?: number\n height?: number\n left?: number\n right?: number\n top?: number\n bottom?: number\n pageWidth?: number\n pageHeight?: number\n bleed?: number\n \n // Simplified dialog config (auto-generates edit dialog with type)\n dialog?: ImageBlockDialog\n \n // Simplified annotation config (auto-generates overlay + annotate option)\n annotation?: ImageBlockAnnotation\n \n // Manual interactive features (for advanced use cases)\n overlaySvg?: string\n overlayClassName?: string\n options?: ImageOption[]\n dialogProps?: Record<string, any>\n placeholder?: React.ReactNode\n children?: React.ReactNode\n imageProps?: React.ImgHTMLAttributes<HTMLImageElement>\n renderImage?: (props: ImageRenderProps) => React.ReactNode\n}\n\nconst ImageBlock = (props: ImageBlockProps) => {\n // Auto-generate overlay and options from annotation/dialog config\n const { computedOverlaySvg, computedOptions } = useMemo(() => {\n const { annotation, dialog, overlaySvg, options, src } = props\n \n // If no simplified props, use manual props as-is\n if (!annotation && !dialog) {\n return {\n computedOverlaySvg: overlaySvg,\n computedOptions: options,\n }\n }\n \n // Extract annotation data\n const annotationValue = annotation?.value || {}\n \n // Auto-generate overlay from annotation\n const autoOverlaySvg = overlaySvg ?? annotationValue.annotationSvg ?? ''\n \n // Build options array\n const autoOptions: ImageOption[] = []\n \n // Only add options if annotation is enabled\n // (dialog alone doesn't show options dropdown)\n if (annotation) {\n // Add \"Edit image\" option if dialog config is provided\n if (dialog) {\n const dialogConfig: any = {\n path: dialog.path,\n type: dialog.type,\n }\n \n // For satellite dialogs, include config\n if (dialog.type === 'satellite' && dialog.config) {\n dialogConfig.config = {\n ...dialog.config,\n path: 'image',\n }\n }\n \n autoOptions.push({\n id: 'edit',\n label: 'Edit image',\n dialog: dialogConfig,\n })\n }\n \n // Add \"Annotate\" option\n const annotations = Array.isArray(annotationValue.annotations) \n ? annotationValue.annotations \n : []\n \n autoOptions.push({\n id: 'annotate',\n label: 'Annotate',\n dialog: {\n path: annotation.path,\n type: 'annotation',\n image: src,\n annotations,\n },\n })\n }\n \n // Merge auto-generated options with manual options\n const finalOptions = options ? [...autoOptions, ...options] : autoOptions\n \n return {\n computedOverlaySvg: autoOverlaySvg,\n computedOptions: finalOptions.length > 0 ? finalOptions : undefined,\n }\n }, [props.annotation, props.dialog, props.overlaySvg, props.options, props.src])\n \n // Determine mode: auto (default), bleed (for print), or spread (for print with sides)\n const mode: ImageBlockMode = useMemo(() => {\n if (props.mode) return props.mode\n if (props.side !== undefined) return \"spread\"\n \n // Auto-detect: if bleed dimensions are provided, use bleed mode\n const hasBleedDimensions = props.width !== undefined || props.height !== undefined || \n props.left !== undefined || props.right !== undefined ||\n props.top !== undefined || props.bottom !== undefined\n \n return hasBleedDimensions ? \"bleed\" : \"auto\"\n }, [props.mode, props.side, props.width, props.height, props.left, props.right, props.top, props.bottom])\n \n // Check if we need ImageWithOptions wrapper\n const needsImageWithOptions = \n mode === \"auto\" || // Auto mode always uses ImageWithOptions\n (computedOptions && computedOptions.length > 0) || \n computedOverlaySvg || \n props.renderImage !== undefined ||\n props.placeholder !== undefined ||\n props.children !== undefined\n \n // Extract props\n const {\n mode: _mode,\n side,\n src,\n alt,\n className,\n imageClassName,\n style,\n imageStyle,\n backgroundColor,\n width,\n height,\n left,\n right,\n top,\n bottom,\n pageWidth,\n pageHeight,\n bleed,\n overlayClassName,\n dialogProps,\n placeholder,\n children,\n imageProps,\n renderImage,\n } = props\n \n // Base component props (for bleed/spread modes)\n const baseProps = {\n src,\n backgroundColor,\n width,\n height,\n left,\n right,\n top,\n bottom,\n pageWidth,\n pageHeight,\n bleed,\n }\n \n // Auto mode: Simple image with wrapper if needed\n if (mode === \"auto\") {\n return (\n <ImageWithOptions\n src={src}\n alt={alt}\n className={className}\n style={style}\n imageClassName={imageClassName}\n imageStyle={imageStyle}\n overlaySvg={computedOverlaySvg}\n overlayClassName={overlayClassName}\n options={computedOptions}\n dialogProps={dialogProps}\n placeholder={placeholder}\n children={children}\n imageProps={imageProps}\n renderImage={renderImage}\n />\n )\n }\n \n // Spread mode: for print with left/right pages\n if (mode === \"spread\") {\n const spreadComponent = (\n <ImageSpread\n {...baseProps}\n side={side}\n />\n )\n \n if (needsImageWithOptions) {\n return (\n <ImageWithOptions\n className={className}\n style={style}\n overlaySvg={computedOverlaySvg}\n overlayClassName={overlayClassName}\n options={computedOptions}\n dialogProps={dialogProps}\n >\n {spreadComponent}\n {children}\n </ImageWithOptions>\n )\n }\n \n return spreadComponent\n }\n \n // Bleed mode: for print with bleed calculations\n // For bleed mode with overlay/options, use ImageBleedWithOverlay\n if (needsImageWithOptions && (computedOverlaySvg || computedOptions?.length)) {\n return (\n <ImageBleedWithOverlay\n className={className}\n style={style}\n overlaySvg={computedOverlaySvg}\n overlayClassName={overlayClassName}\n options={computedOptions}\n dialogProps={dialogProps}\n bleedProps={baseProps}\n >\n {children}\n </ImageBleedWithOverlay>\n )\n }\n \n // Simple bleed without overlay/options\n return (\n <ImageBleed {...baseProps} />\n )\n}\n\nexport default ImageBlock\nexport type { ImageOption }\n","import { useContext, useState } from \"react\";\nimport { ConfigContext } from '../config/config-provider'; // Import the ConfigContext\nimport { getDialogProps } from './dialog-props';\nimport './../styles/uhuu-indicators.css';\n\n\ninterface EditableProps { \n className?: string;\n dialog?: object;\n children?: React.ReactNode;\n}\n\nconst Editable = (props: EditableProps) => {\n const config = useContext(ConfigContext); \n // Get page dimensions and bleed from props or use defaults (from context if not provided) \n \n return ( \n <div \n className={props.className} \n {...getDialogProps(props, config)}\n >\n {props.children}\n </div> \n );\n};\n\nexport default Editable;","/**\n * Page Group Utilities\n * \n * Locked schema with explicit types and kind discriminator.\n * All helpers and reducers use these types for consistency.\n */\n\nimport type { ComponentType } from 'react';\nimport type { PageDataBinding } from './data-binding';\n\nexport type IntegrationRequirement = 'required' | 'optional' | 'none';\n\nexport type IntegrationConfig = {\n mode?: IntegrationRequirement;\n};\n\nexport type PageComponentProps = {\n integration?: any;\n payload?: any;\n pageId?: string;\n templateId?: string;\n pageNum?: number;\n componentKey?: string;\n page?: StandalonePage;\n pagePayload?: any;\n parentGroup?: PageGroup;\n dataBinding?: PageDataBinding;\n};\n\nexport type PageComponent = ComponentType<PageComponentProps>;\n\nexport type StandalonePage = {\n kind: 'page';\n id: string; // Instance ID (unique)\n componentKey?: string; // Template key for component resolution\n templateId?: string; // Reference to template (for repeatable pages)\n label?: string;\n className?: string; // CSS classes for page-sheet container (e.g., background colors for bleed)\n repeatable?: boolean; // Template metadata: whether it can be added again\n maxInstances?: number | null; // Template metadata: max allowed instances\n integration?: IntegrationRequirement | IntegrationConfig;\n pageNum?: number; // Derived, not stored in state\n component?: PageComponent; // Optional component for this page\n [key: string]: any; // Allow additional props\n};\n\nexport type PageGroup = {\n kind: 'group';\n id: string; // Instance ID (unique)\n templateId?: string; // Reference to template blueprint\n repeatable?: boolean; // Can this be added multiple times?\n maxInstances?: number | null; // Max instances allowed (null = unlimited)\n integration?: IntegrationRequirement | IntegrationConfig;\n label?: string;\n pages: Omit<StandalonePage, 'pageNum' | 'kind'>[]; // Internal pages (no pageNum, no kind, but can have renderer)\n pageNum?: never; // Groups don't have pageNum\n [key: string]: any; // Allow integration metadata and custom fields\n};\n\nexport type PageItem = StandalonePage | PageGroup;\n\n// Payload persistence helpers\nexport const DEFAULT_PAGE_EDITOR_STATE_KEY = 'uhuu_page_editor';\n\nexport type PageEditorState = {\n key: string;\n items: PageItem[];\n totalPages: number;\n updatedAt: string;\n};\n\n// Page filtering types for conditional rendering\nexport type RenderMode = 'all' | 'cover' | 'text' | 'custom';\n\nexport type PageRange = {\n start: number; // 1-based index, supports negative indices (-1 = last page, -2 = second to last)\n end: number; // Inclusive\n};\n\nexport type PageFilterConfig = {\n mode?: RenderMode;\n ranges?: PageRange[]; // Used with 'custom' mode\n coverPageCount?: number; // Number of pages at start/end for 'cover' mode (default: 2)\n};\n\n// Type guards (using kind discriminator - much safer than checking for pages property)\nexport function isPageGroup(item: PageItem): item is PageGroup {\n return item.kind === 'group';\n}\n\n/**\n * Flatten items to get all pages with derived pageNum\n * Internal function used by getTotalPageCount\n */\nfunction flattenPages(items: PageItem[]): Array<StandalonePage & { pageNum: number }> {\n const result: Array<StandalonePage & { pageNum: number }> = [];\n let pageNum = 1;\n \n for (const item of items) {\n if (isPageGroup(item)) {\n // Group: add all pages from the group\n for (const page of item.pages) {\n result.push({ \n ...page, \n kind: 'page' as const,\n pageNum: pageNum++ \n } as StandalonePage & { pageNum: number });\n }\n } else {\n // Standalone page\n result.push({ \n ...item, \n pageNum: pageNum++ \n });\n }\n }\n \n return result;\n}\n\n/**\n * Calculate and assign pageNum to all pages (central source of truth)\n * Returns items with pageNum derived\n */\nexport function updatePageNumbers(items: PageItem[]): Array<PageItem & { pageNum?: number }> {\n const result: Array<PageItem & { pageNum?: number }> = [];\n let pageNum = 1;\n \n for (const item of items) {\n if (isPageGroup(item)) {\n // Group: update pages within the group\n const updatedPages = item.pages.map(page => ({\n ...page,\n kind: 'page' as const,\n pageNum: pageNum++,\n }));\n result.push({\n ...item,\n pages: updatedPages\n });\n } else {\n // Standalone page\n result.push({\n ...item,\n pageNum: pageNum++\n });\n }\n }\n \n return result;\n}\n\n/**\n * Count all pages including those in groups\n */\nexport function getTotalPageCount(items: PageItem[]): number {\n return flattenPages(items).length;\n}\n\n// Reorder utilities\nexport type ReorderItem = {\n kind: 'page' | 'group';\n id: string;\n label?: string;\n pageComponent?: PageComponent; // Component for standalone pages\n pageComponentKey?: string; // Component key for standalone pages\n firstPageComponent?: PageComponent; // Component for first page in groups\n firstPageComponentKey?: string; // Component key for first page in groups\n [key: string]: any;\n}\n\n/**\n * Transform items for reorder dialog (groups appear as single units)\n */\nexport function transformItemsForReorder(items: PageItem[]): ReorderItem[] {\n return items.map(item => {\n const strictPosition = (item as any).strictPosition;\n if (isPageGroup(item)) {\n // For groups, create a representation with first page info\n const firstPage = item.pages[0];\n const firstPageComponentKey = firstPage?.componentKey ?? firstPage?.id;\n return {\n kind: 'group' as const,\n id: item.id,\n groupId: item.id,\n firstPageId: firstPage?.id,\n firstPageComponentKey,\n firstPageComponent: firstPage?.component, // Pass component from first page\n pageCount: item.pages.length,\n label: item.label || `${item.id} (${item.pages.length} pages)`,\n strictPosition // Preserve strictPosition\n };\n } else {\n // Standalone page\n const pageComponentKey = item.componentKey ?? item.id;\n return {\n kind: 'page' as const,\n id: item.id,\n label: item.label,\n pageId: item.id,\n pageComponentKey,\n pageLabel: item.label,\n pageNum: item.pageNum,\n pageComponent: item.component, // Pass component from page\n strictPosition // Preserve strictPosition\n };\n }\n });\n}\n\n/**\n * Restore group structure after reorder\n */\nexport function restoreItemsFromReorder(reorderedItems: ReorderItem[], originalItems: PageItem[]): PageItem[] {\n // Create a map of original items by ID\n const originalItemsMap = new Map<string, PageItem>();\n originalItems.forEach(item => {\n originalItemsMap.set(item.id, item);\n });\n \n // Reconstruct items array in the new order\n const restored: PageItem[] = [];\n for (const reorderedItem of reorderedItems) {\n const original = originalItemsMap.get(reorderedItem.id);\n if (original) {\n restored.push(original);\n }\n }\n \n return restored;\n}\n\n/**\n * Normalize items to ensure they carry a `kind` discriminator.\n * Safely converts legacy shapes that lack `kind` into the locked schema.\n */\nexport function normalizePageItems(items: Array<PageItem | Omit<PageItem, 'kind'> & { pages?: any[] }>): PageItem[] {\n return items.map((item) => {\n if ('kind' in item && (item as any).kind) {\n return item as PageItem;\n }\n\n const maybeGroup = (item as any).pages && Array.isArray((item as any).pages);\n if (maybeGroup) {\n return {\n kind: 'group' as const,\n ...(item as any),\n pages: ((item as any).pages ?? []).map((page: any) => {\n const { kind: _ignored, ...rest } = page || {};\n return {\n kind: 'page' as const,\n ...rest,\n };\n }),\n };\n }\n\n const { kind: _ignored, ...rest } = item as any;\n return {\n kind: 'page' as const,\n ...rest,\n };\n });\n}\n\n/**\n * Build a persistable state object for embedding into payloads.\n * Page numbers are derived and therefore omitted from persisted state.\n */\nexport function buildPageEditorState(\n items: PageItem[],\n key: string = DEFAULT_PAGE_EDITOR_STATE_KEY\n): PageEditorState {\n const normalized = normalizePageItems(items);\n return {\n key,\n items: normalized,\n totalPages: getTotalPageCount(normalized),\n updatedAt: new Date().toISOString(),\n };\n}\n\n/**\n * Read persisted state from a payload object.\n * Returns normalized items or null when not present.\n */\nexport function readPageEditorState(\n payload: any,\n key: string = DEFAULT_PAGE_EDITOR_STATE_KEY\n): PageEditorState | null {\n const maybeState = payload?.[key];\n if (!maybeState?.items) return null;\n const normalizedItems = normalizePageItems(maybeState.items as PageItem[]);\n return {\n key,\n items: normalizedItems,\n totalPages: getTotalPageCount(normalizedItems),\n updatedAt: maybeState.updatedAt || new Date().toISOString(),\n };\n}\n\n/**\n * Helper to produce a new payload object with the page editor state embedded.\n * Does not mutate the provided payload object.\n */\nexport function mergePageEditorStateIntoPayload(\n payload: any,\n items: PageItem[],\n key: string = DEFAULT_PAGE_EDITOR_STATE_KEY\n) {\n const state = buildPageEditorState(items, key);\n return { ...(payload ?? {}), [key]: state };\n}\n\n/**\n * Generate a unique ID for instances\n */\nexport function generateUID(): string {\n return Math.random()\n .toString(36)\n .slice(2, 11);\n}\n\n/**\n * Instantiate a standalone page from a template\n */\nexport function instantiatePage(\n templateId: string,\n componentKey: string,\n overrides?: { \n label?: string; \n repeatable?: boolean;\n maxInstances?: number | null;\n integration?: IntegrationRequirement | IntegrationConfig;\n [key: string]: any;\n }\n): StandalonePage {\n const instanceId = overrides?.repeatable ? generateUID() : templateId;\n\n return {\n kind: 'page',\n id: instanceId,\n componentKey,\n templateId,\n label: overrides?.label,\n repeatable: overrides?.repeatable,\n maxInstances: overrides?.maxInstances,\n ...overrides,\n };\n}\n\n/**\n * Instantiate a group from a template\n */\nexport function instantiateGroup(\n templateId: string,\n componentKeys: string[],\n overrides?: { \n label?: string;\n repeatable?: boolean;\n maxInstances?: number | null;\n integration?: IntegrationRequirement | IntegrationConfig;\n [key: string]: any;\n }\n): PageGroup {\n const instanceId = overrides?.repeatable ? generateUID() : templateId;\n \n return {\n kind: 'group',\n id: instanceId,\n templateId,\n label: overrides?.label,\n repeatable: overrides?.repeatable ?? false,\n maxInstances: overrides?.maxInstances ?? null,\n pages: componentKeys.map((key, idx) => ({\n id: `${instanceId}__${key}__${idx}`,\n componentKey: key,\n templateId: key,\n })),\n ...overrides,\n };\n}\n\n/**\n * Resolve a page index (supports negative indices)\n * @param index - Page index (1-based, negative from end)\n * @param totalPages - Total number of pages\n * @returns Resolved 1-based page number\n */\nfunction resolvePageIndex(index: number, totalPages: number): number {\n if (index < 0) {\n // Negative index: -1 = last page, -2 = second to last\n return totalPages + index + 1;\n }\n return index;\n}\n\n/**\n * Check if a page number is in any of the specified ranges\n * @param pageNum - 1-based page number\n * @param ranges - Array of page ranges\n * @param totalPages - Total number of pages\n */\nfunction isPageInRanges(pageNum: number, ranges: PageRange[], totalPages: number): boolean {\n for (const range of ranges) {\n const start = resolvePageIndex(range.start, totalPages);\n const end = resolvePageIndex(range.end, totalPages);\n \n if (pageNum >= start && pageNum <= end) {\n return true;\n }\n }\n return false;\n}\n\n/**\n * Get page ranges based on render mode\n * @param mode - Render mode\n * @param totalPages - Total number of pages\n * @param coverPageCount - Number of pages at start/end for cover mode\n */\nfunction getRangesForMode(mode: RenderMode, totalPages: number, coverPageCount: number = 2): PageRange[] {\n switch (mode) {\n case 'all':\n return [{ start: 1, end: totalPages }];\n \n case 'cover':\n // First N pages and last N pages\n return [\n { start: 1, end: coverPageCount },\n { start: -coverPageCount, end: -1 }\n ];\n \n case 'text':\n // Everything except first N and last N pages\n if (totalPages <= coverPageCount * 2) {\n // Not enough pages for text mode\n return [];\n }\n return [{ start: coverPageCount + 1, end: -(coverPageCount + 1) }];\n \n case 'custom':\n default:\n return [];\n }\n}\n\n/**\n * Filter items based on page filter configuration\n * @param items - Page items to filter\n * @param filterConfig - Filter configuration\n * @returns Filtered items maintaining structure (groups with filtered pages)\n */\nexport function filterPageItems(items: PageItem[], filterConfig?: PageFilterConfig): PageItem[] {\n // No filter or 'all' mode: return all items\n if (!filterConfig || filterConfig.mode === 'all') {\n return items;\n }\n\n const totalPages = getTotalPageCount(items);\n const mode = filterConfig.mode ?? 'all';\n const coverPageCount = filterConfig.coverPageCount ?? 2;\n \n // Get ranges to include\n const ranges = mode === 'custom' && filterConfig.ranges \n ? filterConfig.ranges \n : getRangesForMode(mode, totalPages, coverPageCount);\n\n if (ranges.length === 0) {\n return [];\n }\n\n // Filter items based on their existing page numbers\n const filtered: PageItem[] = [];\n\n for (const item of items) {\n if (isPageGroup(item)) {\n // Filter pages within the group based on their page numbers\n const filteredPages = item.pages.filter((page) => {\n return page.pageNum && isPageInRanges(page.pageNum, ranges, totalPages);\n });\n\n // Only include group if it has pages after filtering\n if (filteredPages.length > 0) {\n filtered.push({\n ...item,\n pages: filteredPages\n });\n }\n } else {\n // Standalone page - check if it should be included\n if (item.pageNum && isPageInRanges(item.pageNum, ranges, totalPages)) {\n filtered.push(item);\n }\n }\n }\n\n return filtered;\n}\n","/**\n * Integration Data Utilities\n * \n * Essential utilities for working with integration data in multi-instance templates.\n */\n\nimport type { PageItem } from './page-group-utils';\nimport { isPageGroup } from './page-group-utils';\n\n/**\n * Get integration data for a specific page/group instance\n */\nfunction getIntegrationData(payload: any, instanceId: string): any {\n if (!payload?.integrations) return undefined;\n return payload.integrations[instanceId];\n}\n\nexport function resolveIntegrationInstanceId(\n page: { id: string },\n parentGroup?: PageItem\n): string | null {\n if (parentGroup && isPageGroup(parentGroup)) {\n return parentGroup.id;\n }\n return page?.id ?? null;\n}\n\nexport function resolveIntegrationBinding(\n payload: any,\n page: { id: string },\n parentGroup?: PageItem\n): { instanceId: string | null; integration?: any } {\n const instanceId = resolveIntegrationInstanceId(page, parentGroup);\n if (!instanceId) return { instanceId: null, integration: undefined };\n return {\n instanceId,\n integration: getIntegrationData(payload, instanceId),\n };\n}\n\n/**\n * Resolve integration data for a page component\n * For group pages, prefer parent group's integration data\n */\nexport function resolveIntegrationForPage(\n payload: any,\n page: { id: string },\n parentGroup?: PageItem\n): any {\n const binding = resolveIntegrationBinding(payload, page, parentGroup);\n return binding.integration;\n}\n\nexport function buildIntegrationPath(\n instanceId?: string | null,\n fieldPath?: string\n) {\n if (!instanceId) return null;\n const base = `integrations.${instanceId}`;\n if (!fieldPath) return base;\n return `${base}.${fieldPath}`;\n}\n\n/**\n * Parse a dialog path to determine if it targets integration data\n * Returns the instance ID if the path targets integrations, null otherwise\n */\nexport function parseIntegrationPath(path: string): {\n instanceId: string | null;\n fieldPath: string;\n isIntegrationPath: boolean;\n} {\n if (!path) {\n return { instanceId: null, fieldPath: path, isIntegrationPath: false };\n }\n \n // Check if path starts with \"integrations.\"\n const integrationPrefix = 'integrations.';\n if (path.startsWith(integrationPrefix)) {\n const afterPrefix = path.slice(integrationPrefix.length);\n const dotIndex = afterPrefix.indexOf('.');\n \n if (dotIndex > 0) {\n // Path like \"integrations.group_1__123.field.subfield\"\n const instanceId = afterPrefix.slice(0, dotIndex);\n const fieldPath = afterPrefix.slice(dotIndex + 1);\n return { instanceId, fieldPath, isIntegrationPath: true };\n } else {\n // Path like \"integrations.group_1__123\" (targets entire integration)\n const instanceId = afterPrefix;\n return { instanceId, fieldPath: '', isIntegrationPath: true };\n }\n }\n \n return { instanceId: null, fieldPath: path, isIntegrationPath: false };\n}\n\n/**\n * Set a nested value in an object using dot notation path\n */\nfunction setNestedValue(obj: any, path: string, value: any): any {\n if (!path) return value;\n \n const keys = path.split('.');\n const result = { ...obj };\n let current: any = result;\n \n for (let i = 0; i < keys.length - 1; i++) {\n const key = keys[i];\n if (!(key in current) || typeof current[key] !== 'object' || current[key] === null) {\n current[key] = {};\n } else {\n current[key] = { ...current[key] };\n }\n current = current[key];\n }\n \n const lastKey = keys[keys.length - 1];\n current[lastKey] = value;\n \n return result;\n}\n\n/**\n * Update integration data in payload using a path-based update\n * Handles nested field updates (e.g., \"integrations.id.overrides.heroImage.url\")\n */\nexport function updateIntegrationByPath(\n payload: any,\n path: string,\n value: any\n): any {\n const parsed = parseIntegrationPath(path);\n \n if (!parsed.isIntegrationPath || !parsed.instanceId) {\n // Not an integration path, return payload as-is\n return payload;\n }\n \n const { instanceId, fieldPath } = parsed;\n const currentIntegration = getIntegrationData(payload, instanceId) || {};\n \n // Update nested field using dot notation\n const updatedIntegration = setNestedValue(\n currentIntegration,\n fieldPath,\n value\n );\n \n return {\n ...payload,\n integrations: {\n ...(payload?.integrations || {}),\n [instanceId]: updatedIntegration,\n },\n };\n}\n","import * as React from 'react';\nimport type { PageOption } from './page-editor';\nimport { mergePageEditorStateIntoPayload, PageItem, DEFAULT_PAGE_EDITOR_STATE_KEY } from './page-group-utils';\nimport { updateIntegrationByPath } from './integration-utils';\n\ntype PagePayloadTarget = string | { id?: string; templateId?: string; componentKey?: string } | PageItem | null | undefined;\n\nexport function getPagePayload(payload: any, target: PagePayloadTarget) {\n if (!payload || !target) return undefined;\n \n const targetId = typeof target === 'string' ? target : target?.id;\n const templateId = typeof target === 'string' ? undefined : (target as any)?.templateId ?? (target as any)?.componentKey;\n const fallbackId = typeof target === 'string' ? undefined : (target as any)?.componentKey;\n const candidateKeys = Array.from(\n new Set(\n [targetId, templateId, fallbackId].filter(Boolean) as string[]\n )\n );\n\n for (const key of candidateKeys) {\n if (payload?.pages?.[key] !== undefined) return payload.pages[key];\n }\n\n // Allow group-level payloads\n for (const key of candidateKeys) {\n if (payload?.groups?.[key] !== undefined) return payload.groups[key];\n }\n\n // Legacy fallback: top-level keys keyed by id/templateId\n for (const key of candidateKeys) {\n if ((payload as any)[key] !== undefined) return (payload as any)[key];\n }\n\n return undefined;\n}\n\ntype TemplateDataContextValue = {\n payload: any;\n setPayload: (next: any | ((prev: any) => any)) => void;\n setPageOptionValue: (pageOrGroupId: string, key: string, value: any) => void;\n setIntegrationPayload: (instanceId: string, next: any | ((prev: any) => any)) => void;\n setIntegrationPayloadValue: (instanceId: string, key: string, value: any) => void;\n removeIntegrationPayload: (instanceId: string) => void;\n updateIntegrationByDialogPath: (path: string, value: any) => void;\n mergePageEditorState: (items: PageItem[], key?: string) => void;\n getPagePayload: (target: PagePayloadTarget) => any;\n};\n\nexport const TemplateDataContext = React.createContext<TemplateDataContextValue | null>(null);\n\n/**\n * Get the list of reserved keys that the page editor manages.\n * These keys are isolated from external payload updates.\n */\nfunction getReservedKeys(stateKey: string = DEFAULT_PAGE_EDITOR_STATE_KEY): string[] {\n return [stateKey];\n}\n\n/**\n * Merge external payload while preserving reserved keys managed by page editor.\n * External payload is the source of truth for all keys except reserved ones.\n */\nfunction mergeExternalPayload(\n currentPayload: any,\n externalPayload: any,\n reservedKeys: string[]\n): any {\n if (!externalPayload) return currentPayload;\n if (!currentPayload) return externalPayload;\n\n // Start with external payload (source of truth for non-reserved keys)\n const merged = { ...externalPayload };\n \n // Overlay reserved keys from current payload (page editor owns these)\n reservedKeys.forEach(key => {\n if (currentPayload[key] !== undefined) {\n merged[key] = currentPayload[key];\n }\n });\n\n return merged;\n}\n\nexport function TemplateDataProvider({\n payload,\n onPayloadChange,\n children,\n stateKey = DEFAULT_PAGE_EDITOR_STATE_KEY,\n}: {\n payload?: any;\n onPayloadChange?: (nextPayload: any) => void;\n children: React.ReactNode;\n stateKey?: string;\n}) {\n const [currentPayload, setCurrentPayload] = React.useState(payload ?? {});\n const lastExternalPayloadRef = React.useRef<any>(null);\n const isInternalUpdateRef = React.useRef(false);\n const lastInternalPayloadRef = React.useRef<any>(null);\n const lastInternalTimestampRef = React.useRef<number>(0);\n const isInitialMountRef = React.useRef(true);\n\n // Serialize payload for comparison (simple deep equality check)\n const serializePayload = React.useCallback((p: any) => {\n try {\n return JSON.stringify(p);\n } catch {\n return String(p);\n }\n }, []);\n\n // Get reserved keys for this provider instance\n const reservedKeys = React.useMemo(() => getReservedKeys(stateKey), [stateKey]);\n\n // Helper to create payload without reserved keys for comparison\n const payloadWithoutReservedKeys = React.useCallback((p: any, keys: string[]) => {\n if (!p) return null;\n const filtered = { ...p };\n keys.forEach(key => {\n delete filtered[key];\n });\n return filtered;\n }, []);\n\n // When external payload changes, merge it while preserving reserved keys\n React.useEffect(() => {\n // Handle initial mount - set initial payload\n if (isInitialMountRef.current) {\n isInitialMountRef.current = false;\n if (payload) {\n console.log('[TemplateDataProvider] Initial mount - setting payload:', payload);\n lastExternalPayloadRef.current = payload;\n setCurrentPayload(payload);\n }\n return;\n }\n\n // Skip if this is an internal update (from setPayload)\n if (isInternalUpdateRef.current) {\n isInternalUpdateRef.current = false;\n console.log('[TemplateDataProvider] Skipping internal update');\n // Store the payload we just set internally to detect round-trips\n lastInternalPayloadRef.current = payload;\n lastInternalTimestampRef.current = Date.now();\n // Update lastExternalPayloadRef to prevent immediate re-merge\n lastExternalPayloadRef.current = payload;\n return;\n }\n\n // Skip if payload hasn't actually changed (same object reference)\n if (payload === lastExternalPayloadRef.current) {\n console.log('[TemplateDataProvider] Skipping - same object reference');\n return;\n }\n\n // Check if this is a round-trip by comparing non-reserved keys only\n // Only check for round-trips within a short time window (500ms) to avoid blocking legitimate updates\n const timeSinceLastInternal = Date.now() - lastInternalTimestampRef.current;\n const isRecentInternalUpdate = timeSinceLastInternal < 500;\n \n if (isRecentInternalUpdate && lastInternalPayloadRef.current !== null) {\n const currentWithoutReserved = payloadWithoutReservedKeys(payload, reservedKeys);\n const lastInternalWithoutReserved = payloadWithoutReservedKeys(lastInternalPayloadRef.current, reservedKeys);\n \n const currentSerialized = currentWithoutReserved ? serializePayload(currentWithoutReserved) : null;\n const lastInternalSerialized = lastInternalWithoutReserved ? serializePayload(lastInternalWithoutReserved) : null;\n \n if (currentSerialized && currentSerialized === lastInternalSerialized) {\n // This is likely a round-trip - skip it but update the ref\n console.log('[TemplateDataProvider] Skipping round-trip');\n lastInternalPayloadRef.current = null; // Clear after one check\n lastExternalPayloadRef.current = payload;\n return;\n }\n }\n\n // This is a genuine external update from $uhuu.listen or other external source - merge it\n console.log('[TemplateDataProvider] External payload update detected, merging...', payload);\n lastExternalPayloadRef.current = payload;\n setCurrentPayload((prev) => {\n if (!payload) return prev;\n const merged = mergeExternalPayload(prev, payload, reservedKeys);\n console.log('[TemplateDataProvider] Merged payload:', merged);\n return merged;\n });\n }, [payload, reservedKeys, serializePayload, payloadWithoutReservedKeys]);\n\n const notifyHost = React.useCallback(\n (next: any) => {\n onPayloadChange?.(next);\n if (typeof window !== 'undefined' && (window as any).$uhuu?.initPayload) {\n (window as any).$uhuu.initPayload(next);\n }\n },\n [onPayloadChange]\n );\n\n /**\n * Handle payload updates, including integration path updates from dialogs\n * When external payload updates come in with integration paths, route them correctly\n */\n const setPayload = React.useCallback(\n (next: any | ((prev: any) => any)) => {\n isInternalUpdateRef.current = true;\n setCurrentPayload((prev) => {\n const resolved = typeof next === 'function' ? (next as (prev: any) => any)(prev) : next;\n \n // Check if this update contains integration path updates from dialogs\n // The SDK/document editor may send updates with paths like \"integrations.id.field\"\n // We need to ensure these are properly structured\n let finalPayload = resolved;\n \n // If the payload has a _dialogUpdate flag or similar, process integration paths\n // This handles cases where dialogs update integration data via path-based updates\n if (resolved && typeof resolved === 'object') {\n // Check for any top-level keys that might be integration paths (from dialog updates)\n // The document editor might send updates that need to be routed to integrations\n const integrationKeys = Object.keys(resolved).filter(key => \n key.startsWith('integrations.') || key === 'integrations'\n );\n \n if (integrationKeys.length > 0 && resolved.integrations) {\n // Integration data is already properly structured, use as-is\n finalPayload = resolved;\n }\n }\n \n // Store the resolved payload to detect round-trips\n lastInternalPayloadRef.current = finalPayload;\n lastInternalTimestampRef.current = Date.now();\n notifyHost(finalPayload);\n return finalPayload;\n });\n },\n [notifyHost]\n );\n\n const setPageOptionValue = React.useCallback(\n (pageOrGroupId: string, key: string, value: any) => {\n setPayload((prev: any) => ({\n ...(prev ?? {}),\n pages: {\n ...(prev?.pages ?? {}),\n [pageOrGroupId]: {\n ...(prev?.pages?.[pageOrGroupId] ?? {}),\n [key]: value,\n },\n },\n }));\n },\n [setPayload]\n );\n\n const setIntegrationPayload = React.useCallback(\n (instanceId: string, next: any | ((prev: any) => any)) => {\n setPayload((prev: any) => {\n const prevIntegrations = prev?.integrations ?? {};\n const current = prevIntegrations[instanceId];\n const resolved = typeof next === 'function' ? (next as (prev: any) => any)(current) : next;\n return {\n ...(prev ?? {}),\n integrations: {\n ...prevIntegrations,\n [instanceId]: resolved,\n },\n };\n });\n },\n [setPayload]\n );\n\n const setIntegrationPayloadValue = React.useCallback(\n (instanceId: string, key: string, value: any) => {\n setIntegrationPayload(instanceId, (prevIntegration: any) => ({\n ...(prevIntegration ?? {}),\n [key]: value,\n }));\n },\n [setIntegrationPayload]\n );\n\n const removeIntegrationPayload = React.useCallback(\n (instanceId: string) => {\n setPayload((prev: any) => {\n if (!prev?.integrations || !prev.integrations[instanceId]) {\n return prev;\n }\n const { [instanceId]: removed, ...remainingIntegrations } = prev.integrations;\n return {\n ...prev,\n integrations: Object.keys(remainingIntegrations).length > 0 ? remainingIntegrations : undefined,\n };\n });\n },\n [setPayload]\n );\n\n /**\n * Update integration data using a path-based update (for dialog compatibility)\n * Handles paths like \"integrations.instanceId.field.subfield\"\n */\n const updateIntegrationByDialogPath = React.useCallback(\n (path: string, value: any) => {\n setPayload((prev: any) => updateIntegrationByPath(prev, path, value));\n },\n [setPayload]\n );\n\n const mergePageEditorState = React.useCallback(\n (items: PageItem[], key?: string) => {\n const effectiveKey = key ?? stateKey;\n setPayload((prev: any) => mergePageEditorStateIntoPayload(prev, items, effectiveKey));\n },\n [setPayload, stateKey]\n );\n\n const resolvePagePayload = React.useCallback(\n (target: PagePayloadTarget) => getPagePayload(currentPayload, target),\n [currentPayload]\n );\n\n const value = React.useMemo(\n () => ({\n payload: currentPayload,\n setPayload,\n setPageOptionValue,\n setIntegrationPayload,\n setIntegrationPayloadValue,\n removeIntegrationPayload,\n updateIntegrationByDialogPath,\n mergePageEditorState,\n getPagePayload: resolvePagePayload,\n }),\n [\n currentPayload,\n setPayload,\n setPageOptionValue,\n setIntegrationPayload,\n setIntegrationPayloadValue,\n removeIntegrationPayload,\n updateIntegrationByDialogPath,\n mergePageEditorState,\n resolvePagePayload,\n ]\n );\n\n return <TemplateDataContext.Provider value={value}>{children}</TemplateDataContext.Provider>;\n}\n\nexport function useTemplateData() {\n const ctx = React.useContext(TemplateDataContext);\n if (!ctx) {\n throw new Error('useTemplateData must be used within a TemplateDataProvider');\n }\n return ctx;\n}\n\n// JSON-friendly option builder: definitions → PageOption[] bound to payload.pages\nexport type PayloadOptionDefinition = Omit<PageOption, 'getValue' | 'onChange' | 'applyPatch'> & {\n defaultValue?: any;\n field?: string;\n};\n\nfunction toDefault(def: PayloadOptionDefinition) {\n if (def.defaultValue !== undefined) return def.defaultValue;\n if (def.type === 'toggle') return false;\n if (def.type === 'slider' || def.type === 'counter') return 0;\n return '';\n}\n\nfunction parseValue(def: PayloadOptionDefinition, raw: string | number | boolean) {\n if (def.type === 'toggle') return raw === true || raw === 'true';\n if (def.type === 'slider' || def.type === 'counter') return Number(raw);\n return raw;\n}\n\nexport function buildPayloadPageOption(\n def: PayloadOptionDefinition,\n payload: any,\n setPageOptionValue: (pageOrGroupId: string, key: string, value: any) => void\n): PageOption {\n const field = def.field ?? def.id;\n const base = def as Omit<PageOption, 'getValue' | 'onChange' | 'applyPatch'>;\n return {\n ...base,\n getValue: (item: PageItem) => {\n const stored = payload?.pages?.[item.id]?.[field];\n if (stored === undefined) return toDefault(def);\n if (def.type === 'toggle') return !!stored;\n return stored;\n },\n onChange: (pageOrGroupId: string, value: string) => {\n setPageOptionValue(pageOrGroupId, field, parseValue(def, value));\n },\n } as PageOption;\n}\n\nexport function buildPayloadPageOptions(\n definitions: PayloadOptionDefinition[],\n payload: any,\n setPageOptionValue: (pageOrGroupId: string, key: string, value: any) => void\n): PageOption[] {\n return definitions.map((def) =>\n buildPayloadPageOption(def, payload, setPageOptionValue)\n );\n}\n\nexport function usePayloadPageOptions(definitions: PayloadOptionDefinition[]): PageOption[] {\n const { payload, setPageOptionValue } = useTemplateData();\n\n return React.useMemo(\n () => buildPayloadPageOptions(definitions, payload, setPageOptionValue),\n [definitions, payload, setPageOptionValue]\n );\n}\n","import * as React from \"react\"\nimport { useState, useRef, useEffect, createContext, useContext } from \"react\"\nimport { Button } from \"../../ui/button\"\nimport { ZoomIn, ZoomOut, RotateCcw, Plus, ChevronDown, UnfoldVertical, UnfoldHorizontal, Maximize } from \"lucide-react\"\nimport {\n DropdownMenu,\n DropdownMenuContent,\n DropdownMenuItem,\n DropdownMenuTrigger,\n DropdownMenuSeparator,\n} from \"../../ui/dropdown-menu\"\nimport { useShouldHideUI } from \"../interactive-mode-context\"\nimport \"./section-page-resizer.css\"\n\n// Context for sharing zoom state across all sections\ninterface ZoomContextType {\n zoom: number\n scaleValue: number\n hideUI: boolean\n}\n\nconst ZoomContext = createContext<ZoomContextType>({ zoom: 100, scaleValue: 1, hideUI: false })\n\ninterface SectionPageResizerProps {\n children: React.ReactNode\n className?: string\n defaultZoom?: number\n minZoom?: number\n maxZoom?: number\n onAddPage?: () => void\n menuItems?: React.ReactNode\n hideUI?: boolean\n preview?: PreviewMode\n}\n\nexport type PreviewMode = \"single_page\" | \"two_pages\"\n\ninterface TwoPageSectionProps {\n children: React.ReactNode\n /** \"spread\" = two pages side by side, \"left\" = single page on left, \"right\" = single page on right */\n layout?: \"spread\" | \"left\" | \"right\"\n}\n\nexport function TwoPageSection({ children, layout = \"spread\" }: TwoPageSectionProps) {\n const { scaleValue } = useContext(ZoomContext)\n const pairRef = useRef<HTMLDivElement>(null)\n\n // Update pair width based on scaled content dimensions\n useEffect(() => {\n if (!pairRef.current) return\n\n const updatePairWidth = () => {\n const sections = pairRef.current?.querySelectorAll('[data-section-content]')\n if (!sections?.length) return\n\n // Sum natural widths of all pages in this pair\n const totalNaturalWidth = Array.from(sections).reduce((sum, section) => {\n const width = Number.parseInt(section.getAttribute('data-natural-width') || '0')\n return sum + width\n }, 0)\n\n if (totalNaturalWidth > 0) {\n const scaledWidth = totalNaturalWidth * scaleValue\n pairRef.current?.style.setProperty('--uhuu-group-pair-width', `${scaledWidth}px`)\n }\n }\n\n updatePairWidth()\n\n const resizeObserver = new ResizeObserver(updatePairWidth)\n const sections = pairRef.current.querySelectorAll('[data-section-content]')\n sections.forEach((section) => resizeObserver.observe(section))\n\n return () => resizeObserver.disconnect()\n }, [children, scaleValue])\n\n return (\n <div\n ref={pairRef}\n className={`two-pages-pair two-pages-pair--${layout}`}\n >\n {children}\n </div>\n )\n}\n\ninterface SectionProps {\n children: React.ReactNode\n title: string\n className?: string\n controls?: React.ReactNode\n origin?: \"left\" | \"right\" | \"center\"\n}\n\ntype FitMode = \"none\" | \"width\" | \"height\" | \"both\"\n\n// Individual Section Component\nexport function Section({ children, title, className = \"\", controls, origin = \"center\" }: SectionProps) {\n const { scaleValue, hideUI } = useContext(ZoomContext)\n const contentRef = useRef<HTMLDivElement>(null)\n const [contentHeight, setContentHeight] = useState<number>(0)\n const [contentWidth, setContentWidth] = useState<number>(0)\n\n // Calculate and update content dimensions\n useEffect(() => {\n if (contentRef.current) {\n const updateDimensions = () => {\n const element = contentRef.current\n if (element) {\n const originalTransform = element.style.transform\n element.style.transform = \"scale(1)\"\n\n const naturalHeight = element.scrollHeight\n const naturalWidth = element.scrollWidth\n\n element.style.transform = originalTransform\n\n setContentHeight(naturalHeight)\n setContentWidth(naturalWidth)\n }\n }\n\n updateDimensions()\n\n const resizeObserver = new ResizeObserver(updateDimensions)\n resizeObserver.observe(contentRef.current)\n\n return () => {\n resizeObserver.disconnect()\n }\n }\n }, [children])\n\n const scaledHeight = contentHeight * scaleValue\n const scaledWidth = Math.max(contentWidth * scaleValue, 150)\n \n // Align content based on transform origin (left/right for spreads, center for single pages)\n const alignmentMap = {\n left: { justify: \"justify-start\", origin: \"top left\" },\n right: { justify: \"justify-end\", origin: \"top right\" },\n center: { justify: \"justify-center\", origin: \"top center\" },\n }\n const { justify: contentAlignClass, origin: transformOrigin } = alignmentMap[origin]\n\n // If hiding UI, render children directly without controls or scaling\n if (hideUI) {\n return <div className={className}>{children}</div>\n }\n\n return (\n <div \n className={`group/section ${className}`}\n style={{\n width: `${scaledWidth}px`,\n minWidth: \"150px\",\n }}\n >\n {/* Section Header */}\n <div>\n {controls ?? (\n <div className=\"px-4 py-2 border-b border-gray-200\">\n <div className=\"text-sm font-medium text-gray-700\">{title} Controls</div>\n </div>\n )}\n </div>\n\n {/* Section Content - Scaled with dynamic height */}\n <div\n className=\"pt-1\"\n style={{\n height: scaledHeight > 0 ? `${scaledHeight + 32}px` : \"auto\",\n minHeight: \"100px\",\n }}\n >\n <div className={`flex items-start ${contentAlignClass}`}>\n <div\n ref={contentRef}\n data-section-content\n data-natural-width={contentWidth}\n data-natural-height={contentHeight}\n style={{\n transform: `scale(${scaleValue})`,\n transformOrigin,\n }}\n >\n {children}\n </div>\n </div>\n </div>\n </div>\n )\n}\n\n// Main Container with Controls\nexport default function SectionPageResizer({\n children,\n className = \"\",\n defaultZoom = 100,\n minZoom = 25,\n maxZoom = 200,\n onAddPage,\n menuItems,\n hideUI: hideUIProp,\n preview = \"single_page\",\n}: SectionPageResizerProps) {\n const shouldHideUI = useShouldHideUI()\n const hideUI = hideUIProp ?? shouldHideUI\n \n const [zoom, setZoom] = useState(defaultZoom)\n const [fitMode, setFitMode] = useState<FitMode>(\"none\")\n const containerRef = useRef<HTMLDivElement>(null)\n const contentRef = useRef<HTMLDivElement>(null)\n const [autoFitInitialized, setAutoFitInitialized] = useState(false)\n const [lastContainerWidth, setLastContainerWidth] = useState<number>(0)\n const [isInitializing, setIsInitializing] = useState(true)\n\n // Calculate fit-to-container zoom levels\n const calculateFitZoom = (mode: FitMode) => {\n if (!containerRef.current || !contentRef.current) return zoom\n\n const container = containerRef.current.getBoundingClientRect()\n\n const firstSection = contentRef.current.querySelector(\"[data-section-content]\")\n if (!firstSection) return zoom\n\n let contentWidth = Number.parseInt(firstSection.getAttribute(\"data-natural-width\") || \"0\")\n const contentHeight = Number.parseInt(firstSection.getAttribute(\"data-natural-height\") || \"0\")\n\n if (contentWidth === 0 || contentHeight === 0) return zoom\n\n // For two-page preview, account for 2x page width when calculating fit to width\n if (preview === \"two_pages\") {\n contentWidth = contentWidth * 2\n }\n\n const availableWidth = container.width - 32\n // Use screen height for better \"fit to height\" calculation, accounting for bottom controls\n const availableHeight = screen.height - 120\n\n const scaleX = (availableWidth / contentWidth) * 100\n const scaleY = (availableHeight / contentHeight) * 100\n\n switch (mode) {\n case \"width\":\n return Math.min(Math.max(scaleX, minZoom), maxZoom)\n case \"height\":\n return Math.min(Math.max(scaleY, minZoom), maxZoom)\n case \"both\":\n return Math.min(Math.max(Math.min(scaleX, scaleY), minZoom), maxZoom)\n default:\n return zoom\n }\n }\n\n // Handle fit mode changes\n const handleFitMode = (mode: FitMode) => {\n setFitMode(mode)\n if (mode !== \"none\") {\n const newZoom = calculateFitZoom(mode)\n setZoom(newZoom)\n }\n }\n\n // Zoom in/out buttons with 25% steps\n const zoomIn = () => {\n const newZoom = Math.min(zoom + 25, maxZoom)\n setZoom(newZoom)\n setFitMode(\"none\")\n }\n\n const zoomOut = () => {\n const newZoom = Math.max(zoom - 25, minZoom)\n setZoom(newZoom)\n setFitMode(\"none\")\n }\n\n // Reset zoom\n const resetZoom = () => {\n setZoom(defaultZoom)\n setFitMode(\"none\")\n }\n\n // Handle initialization and window resize\n useEffect(() => {\n const handleInitialization = () => {\n if (!containerRef.current || !contentRef.current) return\n\n const container = containerRef.current.getBoundingClientRect()\n const currentContainerWidth = container.width\n\n if (!autoFitInitialized) {\n const firstSection = contentRef.current.querySelector(\"[data-section-content]\")\n if (firstSection) {\n const sectionWidth = Number.parseInt(firstSection.getAttribute(\"data-natural-width\") || \"0\")\n if (sectionWidth > 0) {\n if (sectionWidth > currentContainerWidth - 48) {\n const newZoom = calculateFitZoom(\"both\")\n setFitMode(\"both\")\n setZoom(newZoom)\n }\n setAutoFitInitialized(true)\n setLastContainerWidth(currentContainerWidth)\n setIsInitializing(false)\n return\n }\n }\n if (isInitializing) {\n setTimeout(handleInitialization, 50)\n return\n }\n }\n\n setIsInitializing(false)\n }\n\n const handleResize = () => {\n if (!containerRef.current || isInitializing) return\n\n const container = containerRef.current.getBoundingClientRect()\n const currentContainerWidth = container.width\n\n if (Math.abs(currentContainerWidth - lastContainerWidth) > 10) {\n if (fitMode !== \"none\") {\n const newZoom = calculateFitZoom(fitMode)\n setZoom(newZoom)\n }\n setLastContainerWidth(currentContainerWidth)\n }\n }\n\n handleInitialization()\n\n window.addEventListener(\"resize\", handleResize)\n return () => {\n window.removeEventListener(\"resize\", handleResize)\n }\n }, [fitMode, minZoom, maxZoom, autoFitInitialized, lastContainerWidth, isInitializing])\n\n const scaleValue = zoom / 100\n\n // If hiding UI, render children directly without any wrapper or controls\n if (hideUI) {\n return (\n <ZoomContext.Provider value={{ zoom: 100, scaleValue: 1, hideUI: true }}>\n <div className={className}>{children}</div>\n </ZoomContext.Provider>\n )\n }\n\n return (\n <ZoomContext.Provider value={{ zoom, scaleValue, hideUI: false }}>\n <div ref={containerRef} className={`flex flex-col min-h-0 ${className}`}>\n {/* Global Controls - Unscaled */}\n <div data-uhuu-editor className=\"fixed right-4 bottom-4 z-50 flex items-center gap-1.5 px-2.5 py-1.5 bg-white/90 backdrop-blur-md border border-gray-200/60 rounded-lg shadow-sm\">\n {menuItems}\n <div className=\"h-4 w-px bg-gray-200 mx-0.5\" />\n <DropdownMenu modal={false}>\n <DropdownMenuTrigger asChild>\n <Button variant=\"ghost\" size=\"sm\" title=\"Zoom\" className=\"text-xs font-medium text-gray-700 hover:bg-gray-100/80 h-7 px-2.5\">\n {Math.round(zoom)}%\n <ChevronDown className=\"w-3 h-3 ml-1 opacity-60\" />\n </Button>\n </DropdownMenuTrigger>\n <DropdownMenuContent className=\"w-52 p-1.5\" align=\"end\">\n <DropdownMenuItem\n onClick={() => handleFitMode(\"width\")}\n className={`cursor-pointer flex items-center ${fitMode === \"width\" ? \"bg-gray-100\" : \"\"}`}\n >\n <UnfoldHorizontal className=\"w-4 h-4 mr-2\" />\n <span>Fit to Width</span>\n </DropdownMenuItem>\n <DropdownMenuItem\n onClick={() => handleFitMode(\"height\")}\n className={`cursor-pointer flex items-center ${fitMode === \"height\" ? \"bg-gray-100\" : \"\"}`}\n >\n <UnfoldVertical className=\"w-4 h-4 mr-2\" />\n <span>Fit to Height</span>\n </DropdownMenuItem>\n <DropdownMenuItem\n onClick={() => handleFitMode(\"both\")}\n className={`cursor-pointer flex items-center ${fitMode === \"both\" ? \"bg-gray-100\" : \"\"}`}\n >\n <Maximize className=\"w-4 h-4 mr-2\" />\n <span>Fit to Page</span>\n </DropdownMenuItem>\n <DropdownMenuSeparator className=\"my-1.5\" />\n \n {/* Zoom Controls - Compact inline layout */}\n <div className=\"flex items-center justify-center gap-2 px-3 py-2.5\" onClick={(e) => e.stopPropagation()}>\n <Button\n variant=\"ghost\"\n size=\"sm\"\n onClick={(e) => {\n e.stopPropagation()\n zoomOut()\n }}\n disabled={zoom <= minZoom}\n className=\"h-8 w-8 p-0 hover:bg-gray-100 disabled:opacity-40\"\n title=\"Zoom out (25%)\"\n >\n <ZoomOut className=\"w-4 h-4\" />\n </Button>\n \n <div className=\"relative\">\n <input\n type=\"number\"\n value={Math.round(zoom)}\n onChange={(e) => {\n const value = Number.parseInt(e.target.value)\n if (!isNaN(value)) {\n const clampedValue = Math.min(Math.max(value, minZoom), maxZoom)\n setZoom(clampedValue)\n setFitMode(\"none\")\n }\n }}\n onFocus={(e) => e.target.select()}\n className=\"w-20 pr-6 text-center text-sm text-gray-700 bg-white border border-gray-300 rounded px-2 py-1.5 focus:outline-none focus:ring-2 focus:ring-blue-500 focus:border-transparent transition-all\"\n min={minZoom}\n max={maxZoom}\n />\n <span className=\"absolute right-2 top-1/2 -translate-y-1/2 text-xs text-gray-400 pointer-events-none\">%</span>\n </div>\n \n <Button\n variant=\"ghost\"\n size=\"sm\"\n onClick={(e) => {\n e.stopPropagation()\n zoomIn()\n }}\n disabled={zoom >= maxZoom}\n className=\"h-8 w-8 p-0 hover:bg-gray-100 disabled:opacity-40\"\n title=\"Zoom in (25%)\"\n >\n <ZoomIn className=\"w-4 h-4\" />\n </Button>\n </div>\n </DropdownMenuContent>\n </DropdownMenu>\n </div>\n\n {/* Content Container */}\n <div ref={contentRef}>\n <div className={preview === \"two_pages\" ? \"group_two_pages\" : \"flex flex-col items-center\"}>{children}</div>\n </div>\n\n <div className=\"flex justify-center pb-16\">\n <Button size=\"sm\" variant=\"outline\" onClick={() => (onAddPage ? onAddPage() : null)}>\n <Plus />\n </Button>\n </div>\n </div>\n </ZoomContext.Provider>\n )\n}\n","import * as React from \"react\"\nimport * as SheetPrimitive from \"@radix-ui/react-dialog\"\nimport { XIcon } from \"lucide-react\"\nimport { cn } from \"./cn\"\n\nconst Sheet = SheetPrimitive.Root\n\nconst SheetTrigger = SheetPrimitive.Trigger\n\nconst SheetClose = SheetPrimitive.Close\n\nconst SheetPortal = SheetPrimitive.Portal\n\nconst SheetOverlay = React.forwardRef<\n React.ElementRef<typeof SheetPrimitive.Overlay>,\n React.ComponentPropsWithoutRef<typeof SheetPrimitive.Overlay>\n>(({ className, ...props }, ref) => (\n <SheetPrimitive.Overlay\n className={cn(\n \"fixed inset-0 z-50 bg-black/50 data-[state=open]:animate-in data-[state=closed]:animate-out data-[state=closed]:fade-out-0 data-[state=open]:fade-in-0\",\n className\n )}\n {...props}\n ref={ref}\n />\n))\nSheetOverlay.displayName = SheetPrimitive.Overlay.displayName\n\ninterface SheetContentProps\n extends React.ComponentPropsWithoutRef<typeof SheetPrimitive.Content> {\n side?: \"top\" | \"right\" | \"bottom\" | \"left\"\n}\n\nconst SheetContent = React.forwardRef<\n React.ElementRef<typeof SheetPrimitive.Content>,\n SheetContentProps\n>(({ side = \"right\", className, children, ...props }, ref) => (\n <SheetPortal>\n <SheetOverlay />\n <SheetPrimitive.Content\n ref={ref}\n className={cn(\n \"fixed z-50 gap-4 bg-white p-6 shadow-lg transition ease-in-out data-[state=open]:animate-in data-[state=closed]:animate-out data-[state=closed]:duration-300 data-[state=open]:duration-500\",\n side === \"top\" &&\n \"inset-x-0 top-0 border-b data-[state=closed]:slide-out-to-top data-[state=open]:slide-in-from-top\",\n side === \"bottom\" &&\n \"inset-x-0 bottom-0 border-t data-[state=closed]:slide-out-to-bottom data-[state=open]:slide-in-from-bottom\",\n side === \"left\" &&\n \"inset-y-0 left-0 h-full w-3/4 border-r data-[state=closed]:slide-out-to-left data-[state=open]:slide-in-from-left sm:max-w-sm\",\n side === \"right\" &&\n \"inset-y-0 right-0 h-full w-3/4 border-l data-[state=closed]:slide-out-to-right data-[state=open]:slide-in-from-right sm:max-w-sm\",\n className\n )}\n {...props}\n >\n {children}\n <SheetPrimitive.Close className=\"absolute right-4 top-4 rounded-sm opacity-70 ring-offset-white transition-opacity hover:opacity-100 focus:outline-none focus:ring-2 focus:ring-gray-400 focus:ring-offset-2 disabled:pointer-events-none data-[state=open]:bg-gray-100\">\n <XIcon className=\"h-4 w-4\" />\n <span className=\"sr-only\">Close</span>\n </SheetPrimitive.Close>\n </SheetPrimitive.Content>\n </SheetPortal>\n))\nSheetContent.displayName = SheetPrimitive.Content.displayName\n\nconst SheetHeader = ({\n className,\n ...props\n}: React.HTMLAttributes<HTMLDivElement>) => (\n <div\n className={cn(\n \"flex flex-col space-y-2 text-center sm:text-left\",\n className\n )}\n {...props}\n />\n)\nSheetHeader.displayName = \"SheetHeader\"\n\nconst SheetFooter = ({\n className,\n ...props\n}: React.HTMLAttributes<HTMLDivElement>) => (\n <div\n className={cn(\n \"flex flex-col-reverse sm:flex-row sm:justify-end sm:space-x-2\",\n className\n )}\n {...props}\n />\n)\nSheetFooter.displayName = \"SheetFooter\"\n\nconst SheetTitle = React.forwardRef<\n React.ElementRef<typeof SheetPrimitive.Title>,\n React.ComponentPropsWithoutRef<typeof SheetPrimitive.Title>\n>(({ className, ...props }, ref) => (\n <SheetPrimitive.Title\n ref={ref}\n className={cn(\"text-lg font-medium text-gray-900\", className)}\n {...props}\n />\n))\nSheetTitle.displayName = SheetPrimitive.Title.displayName\n\nconst SheetDescription = React.forwardRef<\n React.ElementRef<typeof SheetPrimitive.Description>,\n React.ComponentPropsWithoutRef<typeof SheetPrimitive.Description>\n>(({ className, ...props }, ref) => (\n <SheetPrimitive.Description\n ref={ref}\n className={cn(\"text-sm text-gray-500\", className)}\n {...props}\n />\n))\nSheetDescription.displayName = SheetPrimitive.Description.displayName\n\nexport {\n Sheet,\n SheetPortal,\n SheetOverlay,\n SheetTrigger,\n SheetClose,\n SheetContent,\n SheetHeader,\n SheetFooter,\n SheetTitle,\n SheetDescription,\n}\n\n","import * as React from 'react';\nimport { Lock } from 'lucide-react';\nimport { ReorderItem } from './page-group-utils';\nimport type { PageComponent } from './page-group-utils';\nimport { getPagePayload } from './template-data-provider';\nimport { resolveIntegrationForPage } from './integration-utils';\n\ninterface DefaultRenderThumbnailOptions {\n // PageComponent registry: map of pageId to React component\n pageComponents: { [pageId: string]: PageComponent };\n \n // Payload to pass to PageComponents\n payload?: any;\n \n // Page setup dimensions (same as Pagination setup prop) - in millimeters\n setup?: { width: number; height: number };\n \n // Optional: Custom thumbnail dimensions (height auto-derives from page aspect if omitted)\n thumbnailWidth?: number;\n thumbnailHeight?: number;\n}\n\n/**\n * Creates a default renderThumbnail function that renders actual PageComponents\n * instead of reference images. This ensures thumbnails accurately represent\n * the rendered page content.\n * \n * @internal - This is an internal utility, not part of the public API\n */\nexport function createDefaultRenderThumbnail(\n options: DefaultRenderThumbnailOptions\n): (item: ReorderItem, index: number, isDragging?: boolean) => React.ReactNode {\n const { \n pageComponents, \n payload, \n setup = { width: 210, height: 297 }, // Default A4 size in mm\n thumbnailWidth = 200, \n thumbnailHeight, \n } = options;\n \n const pageWidthMm = setup.width || 210;\n const pageHeightMm = setup.height || 297;\n const pageAspectRatio = pageWidthMm / pageHeightMm;\n\n // Derive thumbnail height from page aspect ratio if not provided\n const finalThumbnailWidth = thumbnailWidth;\n const finalThumbnailHeight = thumbnailHeight ?? Math.round(finalThumbnailWidth / pageAspectRatio);\n\n // Convert mm to pixels at 96dpi (1mm = 3.779527559px) for accurate scaling\n const pageWidthPx = pageWidthMm * 3.779527559;\n const pageHeightPx = pageHeightMm * 3.779527559;\n\n \n return (item: ReorderItem, index: number, isDragging?: boolean) => {\n const strictPosition = (item as any).strictPosition;\n const isLocked = strictPosition === 'start' || strictPosition === 'end';\n \n if (item.kind === 'group') {\n // Group thumbnail: show first page with group indicator\n const firstPageId = item.firstPageId as string | undefined;\n const firstPageComponentKey = item.firstPageComponentKey ?? firstPageId;\n const firstPagePayload = getPagePayload(payload, { id: firstPageId, componentKey: firstPageComponentKey });\n // Use component from item if available, otherwise fall back to pageComponents registry\n const FirstPageComponent = item.firstPageComponent || (firstPageComponentKey ? pageComponents[firstPageComponentKey] : null);\n \n // Resolve integration data for group (group pages use the group's integration)\n // For groups, instanceId is the group ID, so we can directly access it\n const integration = payload?.integrations?.[item.id]; \n \n return (\n <div \n className={`relative bg-white border-2 rounded-md overflow-hidden transition-all ${\n isDragging \n ? 'border-blue-400 shadow-2xl scale-105' \n : isLocked\n ? 'border-gray-300 bg-gray-50'\n : 'border-blue-300 hover:border-blue-400 hover:shadow-lg'\n }`}\n style={{ width: `${finalThumbnailWidth}px`, height: `${finalThumbnailHeight}px` }}\n >\n {/* Render actual PageComponent */}\n {FirstPageComponent ? (\n <div \n className=\"w-full h-full flex items-center justify-center bg-gray-50 overflow-hidden relative pointer-events-none\"\n >\n <div \n className=\"absolute w-full h-full flex items-center justify-center pointer-events-none\"\n style={{\n transform: `scale(${Math.min(finalThumbnailWidth / pageWidthPx, finalThumbnailHeight / pageHeightPx)})`,\n transformOrigin: 'center',\n }}\n >\n <div className=\"!shrink-0\" style={{ width: `${pageWidthPx}px`, height: `${pageHeightPx}px`, backgroundColor: 'white', pointerEvents: 'none' }}>\n <FirstPageComponent\n payload={payload}\n pageId={firstPageId}\n templateId={firstPageComponentKey}\n pagePayload={firstPagePayload}\n componentKey={firstPageComponentKey}\n integration={integration}\n />\n </div>\n </div>\n </div>\n ) : (\n <div className=\"w-full h-full flex items-center justify-center bg-gray-50 pointer-events-none\">\n <div className=\"text-center p-4\">\n <div className=\"text-sm font-medium text-gray-700\">Group {item.id}</div>\n <div className=\"text-xs text-gray-500 mt-1\">{firstPageId || 'No preview'}</div>\n </div>\n </div>\n )}\n \n {/* Group indicator badge */}\n <div className=\"absolute top-2 right-2 px-2 py-1 bg-blue-600/80 backdrop-blur-sm text-white text-xs font-medium rounded shadow-lg pointer-events-none\">\n Group ({item.pageCount} pages)\n </div>\n \n {/* Lock indicator for strict position */}\n {isLocked && (\n <div className=\"absolute top-2 left-2 px-2 py-1 bg-gray-600/80 backdrop-blur-sm text-white text-xs font-medium rounded shadow-lg pointer-events-none flex items-center gap-1\">\n <Lock className=\"size-3\" />\n <span>{strictPosition === 'start' ? 'Start' : 'End'}</span>\n </div>\n )}\n \n {/* Group info overlay */}\n <div className=\"absolute bottom-0 left-0 right-0 bg-black/40 backdrop-blur-sm p-3 pointer-events-none\">\n <div className=\"flex items-center justify-between gap-2 text-white\">\n <div className=\"flex-1 min-w-0\">\n <div className=\"text-sm font-medium truncate\">\n {item.label || item.id}\n </div>\n <div className=\"text-xs opacity-90 truncate\">{item.id}</div>\n </div>\n <div className=\"px-2 py-1 bg-blue-600/80 backdrop-blur-sm rounded text-xs shrink-0 font-medium\">\n Group\n </div>\n </div>\n </div>\n \n {/* Drag indicator */}\n {isDragging && (\n <div className=\"absolute inset-0 flex items-center justify-center bg-blue-500/10 pointer-events-none\">\n <div className=\"text-blue-600 font-medium text-sm bg-white/90 px-3 py-1 rounded-full shadow-lg\">\n Dragging Group...\n </div>\n </div>\n )}\n </div>\n );\n } else {\n // Standalone page thumbnail\n const pageId = item.pageId as string | undefined;\n const pageComponentKey = item.pageComponentKey ?? pageId;\n const pagePayload = getPagePayload(payload, { id: pageId, componentKey: pageComponentKey });\n // Use component from item if available, otherwise fall back to pageComponents registry\n const PageComponent = item.pageComponent || (pageComponentKey ? pageComponents[pageComponentKey] : null);\n \n // Resolve integration data for standalone page\n const integration = pageId ? resolveIntegrationForPage(payload, { id: pageId }) : undefined;\n return (\n <div \n className={`relative bg-white border-2 rounded-md overflow-hidden transition-all ${\n isDragging \n ? 'border-blue-400 shadow-2xl scale-105' \n : isLocked\n ? 'border-gray-300 bg-gray-50'\n : 'border-gray-200 hover:border-blue-300 hover:shadow-lg'\n }`}\n style={{ width: `${finalThumbnailWidth}px`, height: `${finalThumbnailHeight}px` }}\n >\n {/* Render actual PageComponent */}\n {PageComponent ? (\n <div \n className=\"w-full h-full flex items-center justify-center bg-gray-50 overflow-hidden relative pointer-events-none\"\n >\n <div \n className=\"absolute inset-0 flex items-center justify-center pointer-events-none\"\n style={{\n transform: `scale(${Math.min(finalThumbnailWidth / pageWidthPx, finalThumbnailHeight / pageHeightPx)})`,\n transformOrigin: 'center',\n }}\n >\n <div className=\"!shrink-0\" style={{ width: `${pageWidthPx}px`, height: `${pageHeightPx}px`, backgroundColor: 'white', pointerEvents: 'none' }}>\n <PageComponent \n payload={payload}\n pageId={pageId}\n templateId={pageComponentKey}\n pagePayload={pagePayload}\n componentKey={pageComponentKey}\n integration={integration}\n />\n </div>\n </div>\n </div>\n ) : (\n <div className=\"w-full h-full flex items-center justify-center bg-gray-50 pointer-events-none\">\n <div className=\"text-center p-4\">\n <div className=\"text-sm font-medium text-gray-700\">Page {item.pageNum}</div>\n <div className=\"text-xs text-gray-500 mt-1\">{pageId || 'No preview'}</div>\n </div>\n </div>\n )}\n \n {/* Lock indicator for strict position */}\n {isLocked && (\n <div className=\"absolute top-2 left-2 px-2 py-1 bg-gray-600/80 backdrop-blur-sm text-white text-xs font-medium rounded shadow-lg pointer-events-none flex items-center gap-1\">\n <Lock className=\"size-3\" />\n <span>{strictPosition === 'start' ? 'Start' : 'End'}</span>\n </div>\n )}\n \n {/* Page info overlay */}\n <div className=\"absolute bottom-0 left-0 right-0 bg-black/40 backdrop-blur-sm p-3 pointer-events-none\">\n <div className=\"flex items-center justify-between gap-2 text-white\">\n <div className=\"flex-1 min-w-0\">\n <div className=\"text-sm font-medium truncate\">\n {item.pageLabel || `Page ${item.pageNum}`}\n </div>\n <div className=\"text-xs opacity-90 truncate\">{item.pageId}</div>\n </div>\n <div className=\"px-2 py-1 bg-white/20 backdrop-blur-sm rounded text-xs shrink-0\">\n Page\n </div>\n </div>\n </div>\n \n {/* Drag indicator */}\n {isDragging && (\n <div className=\"absolute inset-0 flex items-center justify-center bg-blue-500/10 pointer-events-none\">\n <div className=\"text-blue-600 font-medium text-sm bg-white/90 px-3 py-1 rounded-full shadow-lg\">\n Dragging...\n </div>\n </div>\n )}\n </div>\n );\n }\n };\n}\n","import { Plus } from 'lucide-react';\nimport { Sheet, SheetContent, SheetHeader, SheetTitle, SheetDescription } from '../../ui/sheet';\nimport { AvailableItem, AvailableGroupItem, AvailablePageItem } from './use-page-groups';\nimport type { PageComponent, ReorderItem } from './page-group-utils';\nimport { createDefaultRenderThumbnail } from './default-render-thumbnail';\nimport * as React from 'react';\n\ninterface AddPageDialogProps {\n open: boolean;\n onOpenChange: (open: boolean) => void;\n availableItems: AvailableItem[];\n onSelectItem: (item: AvailableItem) => Promise<void> | void;\n pageComponents?: { [pageId: string]: PageComponent };\n payload?: any;\n setup?: { width: number; height: number };\n gridColsClass?: string;\n // MVP: No customization props, just works\n}\n\nexport function AddPageDialog({\n open,\n onOpenChange,\n availableItems,\n onSelectItem,\n pageComponents,\n payload,\n setup = { width: 210, height: 297 },\n gridColsClass = \"grid grid-cols-2 md:grid-cols-3 lg:grid-cols-4 xl:grid-cols-6 gap-6\",\n}: AddPageDialogProps) {\n const handleSelect = (item: AvailableItem) => {\n onOpenChange(false);\n void onSelectItem(item);\n };\n\n const pageWidthMm = setup.width || 210;\n const pageHeightMm = setup.height || 297;\n const pageAspectRatio = pageWidthMm / pageHeightMm;\n const thumbnailWidth = 200;\n const thumbnailHeight = Math.round(thumbnailWidth / pageAspectRatio);\n\n const defaultRenderThumbnail = React.useMemo(() => {\n if (!pageComponents) return null;\n return createDefaultRenderThumbnail({\n pageComponents,\n payload,\n setup,\n thumbnailWidth,\n thumbnailHeight,\n });\n }, [pageComponents, payload, setup, thumbnailWidth, thumbnailHeight]);\n\n const toReorderItem = (item: AvailableItem, index: number): ReorderItem => {\n if (item.kind === 'group') {\n const group = item as AvailableGroupItem;\n const firstPageComponentKey = group.pageComponentKeys?.[0];\n return {\n kind: 'group',\n id: item.id,\n label: item.label,\n pageCount: (group.pageComponentKeys ?? []).length,\n firstPageId: firstPageComponentKey,\n firstPageComponentKey,\n } as ReorderItem;\n }\n\n const pageItem = item as AvailablePageItem;\n const componentKey = pageItem.componentKey ?? pageItem.id;\n return {\n kind: 'page',\n id: pageItem.id,\n pageId: pageItem.id,\n pageComponentKey: componentKey,\n pageLabel: pageItem.label,\n pageNum: index + 1,\n } as ReorderItem;\n };\n\n return (\n <Sheet open={open} onOpenChange={onOpenChange}>\n <SheetContent side=\"bottom\" className=\"h-[90vh] p-0 gap-0 w-full max-w-none rounded-t-md\" data-uhuu-editor>\n <SheetHeader className=\"border-b border-gray-200 p-4\">\n <div className=\"flex items-center gap-3\">\n <div className=\"w-10 h-10 bg-gray-100 rounded-full flex items-center justify-center\">\n <Plus className=\"w-5 h-5\" />\n </div>\n <div className=\"flex-1\">\n <SheetTitle className=\"text-lg font-medium text-gray-900\">\n Add Page or Group\n </SheetTitle>\n <SheetDescription className=\"text-sm text-gray-500 mt-1.5\">\n Select a page or group to add to your document.\n </SheetDescription>\n </div>\n </div>\n </SheetHeader>\n\n <div className=\"flex-1 overflow-hidden\">\n <div className=\"h-full max-h-[calc(90vh-100px)] overflow-auto px-6 py-6\">\n {availableItems.length === 0 ? (\n <div className=\"text-center py-16\">\n <div className=\"w-16 h-16 bg-gray-100 rounded-full flex items-center justify-center mx-auto mb-4\">\n <Plus className=\"w-8 h-8 text-gray-400\" />\n </div>\n <div className=\"text-lg font-medium text-gray-900 mb-2\">No items available</div>\n <p className=\"text-gray-500 mb-4\">All pages and groups have been added.</p>\n </div>\n ) : (\n <div className={gridColsClass}>\n {availableItems.map((item, index) => {\n const isGroup = item.kind === 'group';\n const id = item.id;\n const label = isGroup\n ? (item.label || `Group ${index + 1}`)\n : (item.label || `Page ${item.id}`);\n const pageCount = isGroup ? ((item as AvailableGroupItem).pageComponentKeys ?? []).length : 1;\n const hasDefaultThumbnail = !!defaultRenderThumbnail;\n return (\n <div\n key={id}\n onClick={() => handleSelect(item)}\n className={\n hasDefaultThumbnail\n ? \"relative w-full h-[280px] cursor-pointer rounded-md overflow-hidden transition-all group\"\n : \"relative w-full h-[280px] cursor-pointer bg-white border-2 rounded-md overflow-hidden transition-all border-gray-200 hover:border-blue-400 hover:shadow-lg group\"\n }\n >\n {/* Thumbnail area */}\n <div className=\"w-full h-full relative overflow-hidden\">\n {defaultRenderThumbnail && (\n <div className=\"absolute inset-0 flex items-center pointer-events-none\">\n {defaultRenderThumbnail(toReorderItem(item, index), index, false)}\n </div>\n )}\n {!defaultRenderThumbnail && (\n <>\n {isGroup ? (\n <div className=\"p-4\">\n <div className=\"w-16 h-16 bg-blue-100 rounded-full flex items-center justify-center mx-auto mb-3\">\n <Plus className=\"w-8 h-8 text-blue-600\" />\n </div>\n <div className=\"text-sm font-medium text-gray-700\">{label}</div>\n <div className=\"text-xs text-gray-500 mt-1\">\n {pageCount} {pageCount === 1 ? 'page' : 'pages'}\n </div>\n </div>\n ) : (\n <div className=\"p-4\">\n <div className=\"w-16 h-16 bg-gray-100 rounded-full flex items-center justify-center mx-auto mb-3\">\n <Plus className=\"w-8 h-8 text-gray-400\" />\n </div>\n <div className=\"text-sm font-medium text-gray-700\">{label}</div>\n <div className=\"text-xs text-gray-500 mt-1\">{id}</div>\n </div>\n )}\n </>\n )}\n </div>\n\n {!defaultRenderThumbnail && (\n <>\n {/* Group indicator badge */}\n {isGroup && (\n <div className=\"absolute top-2 right-2 px-2 py-1 bg-blue-600/80 backdrop-blur-sm text-white text-xs font-medium rounded shadow-lg pointer-events-none\">\n Group ({pageCount} {pageCount === 1 ? 'page' : 'pages'})\n </div>\n )}\n\n {/* Item info overlay - positioned at bottom to match reorder dialog */}\n <div className=\"absolute bottom-0 left-0 right-0 bg-black/40 backdrop-blur-sm p-3 pointer-events-none\">\n <div className=\"flex items-center justify-between gap-2 text-white\">\n <div className=\"flex-1 min-w-0\">\n <div className=\"text-sm font-medium truncate\">{label}</div>\n <div className=\"text-xs opacity-90 truncate\">{id}</div>\n </div>\n {isGroup ? (\n <div className=\"px-2 py-1 bg-blue-600/80 backdrop-blur-sm rounded text-xs shrink-0 font-medium\">\n Group\n </div>\n ) : (\n <div className=\"px-2 py-1 bg-white/20 backdrop-blur-sm rounded text-xs shrink-0\">\n Page\n </div>\n )}\n </div>\n </div>\n </>\n )}\n\n {/* Small hover indicator */}\n <div className=\"absolute top-3 left-3 w-8 h-8 bg-black rounded-full flex items-center justify-center shadow-lg opacity-0 group-hover:opacity-100 transition-opacity pointer-events-none z-10\">\n <Plus className=\"w-4 h-4 text-white\" />\n </div>\n </div>\n );\n })}\n </div>\n )}\n </div>\n </div>\n </SheetContent>\n </Sheet>\n );\n}\n","import * as React from \"react\"\nimport { useState, useEffect } from \"react\"\nimport {\n DndContext,\n closestCenter,\n KeyboardSensor,\n PointerSensor,\n useSensor,\n useSensors,\n type DragEndEvent,\n type DragStartEvent,\n DragOverlay,\n} from \"@dnd-kit/core\"\nimport {\n arrayMove,\n SortableContext,\n sortableKeyboardCoordinates,\n rectSortingStrategy,\n} from \"@dnd-kit/sortable\"\nimport { useSortable } from \"@dnd-kit/sortable\"\nimport { CSS } from \"@dnd-kit/utilities\"\n\ninterface SortableItemProps<T> {\n item: T\n index: number\n renderItem: (item: T, index: number, isDragging?: boolean) => React.ReactNode\n renderDragIndicator?: (item: T, index: number) => React.ReactNode\n keyExtractor: (item: T) => string\n disabled?: boolean\n}\n\nfunction SortableItem<T>({\n item,\n index,\n renderItem,\n renderDragIndicator,\n keyExtractor,\n disabled = false,\n}: SortableItemProps<T>) {\n const { attributes, listeners, setNodeRef, transform, transition, isDragging } = useSortable({\n id: keyExtractor(item),\n disabled,\n })\n\n const style = {\n transform: CSS.Transform.toString(transform),\n transition,\n }\n\n return (\n <div ref={setNodeRef} style={style} className={`relative group/drag-item ${isDragging ? \"opacity-50\" : \"\"} ${disabled ? \"opacity-60\" : \"\"}`}>\n {/* Main item content */}\n {renderItem(item, index, isDragging)}\n\n {/* Drag indicator overlay */}\n {!disabled && (\n renderDragIndicator ? (\n <div {...attributes} {...listeners}>\n {renderDragIndicator(item, index)}\n </div>\n ) : (\n /* If no drag indicator, make entire item draggable */\n <div\n {...attributes}\n {...listeners}\n className=\"absolute inset-0 cursor-grab active:cursor-grabbing touch-none\"\n />\n )\n )}\n </div>\n )\n}\n\nfunction DragOverlayItem<T>({\n item,\n index,\n renderItem,\n}: {\n item: T\n index: number\n renderItem: (item: T, index: number, isDragging?: boolean) => React.ReactNode\n}) {\n return <div className=\"rotate-2\">{renderItem(item, index, true)}</div>\n}\n\nexport interface DragDropGridProps<T> {\n items: T[]\n onChange: (reorderedItems: T[]) => void\n renderItem: (item: T, index: number, isDragging?: boolean) => React.ReactNode\n renderDragIndicator?: (item: T, index: number) => React.ReactNode\n keyExtractor: (item: T) => string\n gridColsClass?: string\n className?: string\n renderToolbar?: () => React.ReactNode\n renderEmptyState?: () => React.ReactNode\n showDebugInfo?: boolean\n renderDragOverlay?: (item: T, index: number) => React.ReactNode\n isItemDisabled?: (item: T) => boolean\n canDropAt?: (draggedItem: T, targetIndex: number, items: T[]) => boolean\n}\n\nexport default function DragDropGrid<T>({\n items: initialItems,\n onChange,\n renderItem,\n renderDragIndicator,\n keyExtractor,\n gridColsClass = \"grid grid-cols-2 md:grid-cols-3 lg:grid-cols-4 xl:grid-cols-6 2xl:grid-cols-6 gap-4\",\n className = \"\",\n renderToolbar,\n renderEmptyState,\n showDebugInfo = false,\n renderDragOverlay,\n isItemDisabled,\n canDropAt,\n}: DragDropGridProps<T>) {\n const [items, setItems] = useState<T[]>(initialItems)\n\n // Sync with parent state when initialItems changes\n useEffect(() => {\n setItems(initialItems)\n }, [initialItems])\n\n const [activeId, setActiveId] = useState<string | null>(null)\n\n const sensors = useSensors(\n useSensor(PointerSensor),\n useSensor(KeyboardSensor, {\n coordinateGetter: sortableKeyboardCoordinates,\n })\n )\n\n const handleDragStart = (event: DragStartEvent) => {\n const draggedItem = items.find((item) => keyExtractor(item) === event.active.id)\n // Prevent dragging disabled items\n if (draggedItem && isItemDisabled && isItemDisabled(draggedItem)) {\n return\n }\n setActiveId(event.active.id as string)\n }\n\n const handleDragEnd = (event: DragEndEvent) => {\n const { active, over } = event\n\n if (!over || active.id === over.id) {\n setActiveId(null)\n return\n }\n\n const draggedItem = items.find((item) => keyExtractor(item) === active.id)\n const oldIndex = items.findIndex((item) => keyExtractor(item) === active.id)\n const newIndex = items.findIndex((item) => keyExtractor(item) === over.id)\n\n // Prevent dragging disabled items\n if (draggedItem && isItemDisabled && isItemDisabled(draggedItem)) {\n setActiveId(null)\n return\n }\n\n // Check if drop is allowed at target position\n if (canDropAt && !canDropAt(draggedItem!, newIndex, items)) {\n setActiveId(null)\n return\n }\n\n if (oldIndex !== -1 && newIndex !== -1) {\n const newItems = arrayMove(items, oldIndex, newIndex)\n setItems(newItems)\n onChange(newItems)\n }\n\n setActiveId(null)\n }\n\n const activeItem = items.find((item) => keyExtractor(item) === activeId)\n const activeIndex = activeItem ? items.findIndex((item) => keyExtractor(item) === activeId) : -1\n\n return (\n <div className={`w-full ${className}`}>\n {renderToolbar && <div className=\"mb-6\">{renderToolbar()}</div>}\n\n {items.length === 0 && renderEmptyState ? (\n renderEmptyState()\n ) : (\n <div className=\"mb-6\">\n <DndContext\n sensors={sensors}\n collisionDetection={closestCenter}\n onDragStart={handleDragStart}\n onDragEnd={handleDragEnd}\n >\n <SortableContext items={items.map(keyExtractor)} strategy={rectSortingStrategy}>\n <div className={gridColsClass}>\n {items.map((item, index) => (\n <SortableItem\n key={keyExtractor(item)}\n item={item}\n index={index}\n renderItem={renderItem}\n renderDragIndicator={renderDragIndicator}\n keyExtractor={keyExtractor}\n disabled={isItemDisabled ? isItemDisabled(item) : false}\n />\n ))}\n </div>\n </SortableContext>\n <DragOverlay>\n {activeItem ? (\n renderDragOverlay ? (\n <div className=\"rotate-2 shadow-lg\">{renderDragOverlay(activeItem, activeIndex)}</div>\n ) : (\n <DragOverlayItem item={activeItem} index={activeIndex} renderItem={renderItem} />\n )\n ) : null}\n </DragOverlay>\n </DndContext>\n </div>\n )}\n\n {/* Debug info */}\n {showDebugInfo && (\n <div className=\"fixed top-4 left-4 bg-white rounded-lg border shadow-lg p-3 text-sm max-w-xs\">\n <div className=\"font-medium mb-1\">Debug Info</div>\n <div className=\"text-gray-600 text-xs\">\n Items: {items.length} | Active: {activeId || \"none\"}\n </div>\n <div className=\"text-xs text-gray-500 mt-1 break-all\">\n Order: {items.map((item, i) => `${i + 1}:${keyExtractor(item).slice(0, 3)}`).join(\" → \")}\n </div>\n </div>\n )}\n </div>\n )\n}\n\n","import * as React from \"react\"\nimport { cva, type VariantProps } from \"class-variance-authority\"\nimport { cn } from \"./cn\"\n\nconst badgeVariants = cva(\n \"inline-flex items-center rounded-md border px-2.5 py-0.5 text-xs font-medium transition-colors focus:outline-none focus:ring-2 focus:ring-offset-2\",\n {\n variants: {\n variant: {\n default: \"border-transparent bg-gray-900 text-white\",\n secondary: \"border-transparent bg-gray-100 text-gray-900\",\n outline: \"border-gray-300 text-gray-900 bg-white\",\n },\n },\n defaultVariants: {\n variant: \"default\",\n },\n }\n)\n\nexport interface BadgeProps\n extends React.HTMLAttributes<HTMLDivElement>,\n VariantProps<typeof badgeVariants> {}\n\nfunction Badge({ className, variant, ...props }: BadgeProps) {\n return (\n <div className={cn(badgeVariants({ variant }), className)} {...props} />\n )\n}\n\nexport { Badge, badgeVariants }\n\n","import * as React from \"react\"\nimport { GripVertical, ArrowUpDown, Lock } from \"lucide-react\"\nimport DragDropGrid from \"../../utility/drag-drop-grid\"\nimport { Sheet, SheetContent, SheetHeader, SheetTitle, SheetDescription, SheetFooter } from \"../../ui/sheet\"\nimport { Badge } from \"../../ui/badge\"\nimport { Button } from \"../../ui/button\"\nimport { createDefaultRenderThumbnail } from \"./default-render-thumbnail\"\nimport type { PageComponent } from \"./page-group-utils\"\n\nexport interface PageItem {\n id: string\n [key: string]: any\n}\n\nexport interface PageOrderDialogProps<T extends PageItem> {\n open: boolean\n onOpenChange: (open: boolean) => void\n pages: T[]\n onReorder: (newOrder: T[]) => void\n renderThumbnail?: (page: T, index: number, isDragging?: boolean) => React.ReactNode\n \n // NEW: For automatic thumbnail rendering\n pageComponents?: { [pageId: string]: PageComponent }\n payload?: any\n \n // Page setup dimensions (same as Pagination setup prop) - in millimeters\n setup?: { width: number; height: number }\n \n title?: string\n description?: string\n gridColsClass?: string\n}\n\n// Default page thumbnail component with simple preview\nfunction DefaultPageThumbnail<T extends PageItem>({\n page,\n index,\n isDragging,\n}: {\n page: T\n index: number\n isDragging?: boolean\n}) {\n const thumbnailWidth = 200\n const thumbnailHeight = 280\n const strictPosition = (page as any).strictPosition\n const isLocked = strictPosition === 'start' || strictPosition === 'end'\n\n return (\n <div\n className={`flex items-center justify-center border relative rounded-lg bg-white overflow-hidden transition-all ${\n isDragging\n ? \"opacity-50 border-gray-400 shadow-xl scale-105\"\n : isLocked\n ? \"border-gray-300 bg-gray-50\"\n : \"border-gray-200 group-hover/drag-item:border-gray-300 group-hover/drag-item:shadow-md\"\n }`}\n > \n <div\n className=\"flex items-center justify-center\"\n style={{\n width: `${thumbnailWidth}px`,\n height: `${thumbnailHeight}px`,\n }}\n >\n {/* Default content rendering */}\n {page.content || (\n <div className=\"text-center p-4\">\n <div className=\"text-sm font-medium text-gray-700\">{page.label || `Page ${index + 1}`}</div>\n <div className=\"text-xs text-gray-400 mt-1 font-mono\">{page.id}</div>\n </div>\n )}\n </div>\n\n {/* Page number badge */}\n <div className=\"absolute top-2 left-2 z-20\">\n <Badge variant=\"secondary\" className={`text-xs min-w-[24px] h-6 font-medium bg-white/95 backdrop-blur-sm flex items-center justify-center shadow-sm border border-gray-200 ${isLocked ? 'opacity-75' : ''}`}>\n {isLocked ? (\n <Lock className=\"size-3 text-gray-500\" />\n ) : (\n <>\n <span className=\"group-hover/drag-item:hidden\">{index + 1}</span>\n <GripVertical className=\"size-4 text-gray-400 hidden group-hover/drag-item:block\" />\n </>\n )}\n </Badge>\n </div>\n </div>\n )\n}\n\nexport function PageOrderDialog<T extends PageItem>({\n open,\n onOpenChange,\n pages,\n onReorder,\n renderThumbnail,\n pageComponents,\n payload,\n setup,\n title = \"Reorder Pages\",\n description = \"Drag and drop pages to change their order.\",\n gridColsClass = \"grid grid-cols-2 md:grid-cols-3 lg:grid-cols-4 xl:grid-cols-6 gap-6\",\n}: PageOrderDialogProps<T>) {\n // Track local order changes - only apply on save\n const [localPages, setLocalPages] = React.useState<T[]>(pages)\n const [hasChanges, setHasChanges] = React.useState(false)\n\n // Sync local state when pages prop changes (but only if dialog is closed or no local changes)\n React.useEffect(() => {\n if (!open) {\n setLocalPages(pages)\n setHasChanges(false)\n } else if (!hasChanges) {\n setLocalPages(pages)\n }\n }, [pages, open, hasChanges])\n\n const handleLocalReorder = (newOrder: T[]) => {\n setLocalPages(newOrder)\n setHasChanges(true)\n }\n\n const handleSave = () => {\n onReorder(localPages)\n setHasChanges(false)\n onOpenChange(false)\n }\n\n const handleCancel = () => {\n setLocalPages(pages)\n setHasChanges(false)\n onOpenChange(false)\n }\n\n // Auto-create default renderThumbnail if pageComponents provided and no valid custom renderThumbnail\n const defaultRenderThumbnail = React.useMemo(() => { \n // Only auto-create if renderThumbnail is not provided or is not a function\n if ((!renderThumbnail || typeof renderThumbnail !== 'function') && pageComponents) {\n return createDefaultRenderThumbnail({ pageComponents, payload, setup })\n }\n return null\n }, [renderThumbnail, pageComponents, payload, setup])\n \n const renderPageThumbnail = (page: T, index: number, isDragging?: boolean) => {\n // Priority: 1. Custom renderThumbnail (if it's a function), 2. Auto-created defaultRenderThumbnail, 3. DefaultPageThumbnail\n if (renderThumbnail && typeof renderThumbnail === 'function') {\n return renderThumbnail(page, index, isDragging)\n }\n if (defaultRenderThumbnail) {\n return defaultRenderThumbnail(page as any, index, isDragging)\n }\n return <DefaultPageThumbnail page={page} index={index} isDragging={isDragging} />\n }\n\n const renderEmptyState = () => (\n <div className=\"text-center py-20\">\n <div className=\"w-12 h-12 bg-gray-50 rounded-lg flex items-center justify-center mx-auto mb-3\">\n <ArrowUpDown className=\"w-6 h-6 text-gray-400\" />\n </div>\n <div className=\"text-base font-medium text-gray-900 mb-1\">No pages found</div>\n <p className=\"text-sm text-gray-500\">Add some pages to get started with reordering.</p>\n </div>\n )\n\n const keyExtractor = (page: T) => page.id\n\n // Check if an item has strictPosition and should be disabled from dragging\n const isItemDisabled = React.useCallback((page: T) => {\n const strictPosition = (page as any).strictPosition;\n return strictPosition === 'start' || strictPosition === 'end';\n }, []);\n\n // Check if an item can be dropped at a specific position\n const canDropAt = React.useCallback((draggedItem: T, targetIndex: number, items: T[]) => {\n const draggedPosition = (draggedItem as any).strictPosition;\n \n // Items with strictPosition cannot be dragged (should be caught by isItemDisabled, but double-check)\n if (draggedPosition === 'start' || draggedPosition === 'end') {\n return false;\n }\n\n // Find the boundaries of start, middle, and end sections\n let startEndIndex = -1;\n let endStartIndex = items.length;\n \n for (let i = 0; i < items.length; i++) {\n const position = (items[i] as any).strictPosition;\n if (position === 'start') {\n startEndIndex = i;\n } else if (position === 'end' && endStartIndex === items.length) {\n endStartIndex = i;\n // Don't break - continue to find all end items\n }\n }\n\n // Regular items can only be dropped in the middle section\n // (after all start items and before all end items)\n if (targetIndex <= startEndIndex) {\n return false;\n }\n\n if (targetIndex >= endStartIndex) {\n return false;\n }\n\n return true;\n }, []);\n\n return (\n <Sheet open={open} onOpenChange={(newOpen) => {\n // Only allow closing via explicit cancel/save buttons\n if (!newOpen) {\n handleCancel()\n }\n }}>\n <SheetContent \n side=\"bottom\" \n className=\"h-[90vh] p-0 gap-0 w-full max-w-none rounded-t-md flex flex-col [&>button]:hidden\"\n onPointerDownOutside={(e) => {\n // Prevent closing when clicking outside - use cancel/save buttons instead\n e.preventDefault()\n }}\n onEscapeKeyDown={(e) => {\n // Prevent escape from closing - use cancel button instead\n e.preventDefault()\n }}\n data-uhuu-editor\n >\n <SheetHeader className=\"border-b border-gray-200 p-4\">\n <div className=\"flex items-start justify-between\">\n <div className=\"flex-1\">\n <SheetTitle className=\"text-lg font-medium text-gray-900\">{title}</SheetTitle>\n <SheetDescription className=\"text-sm text-gray-500 mt-1.5\">{description}</SheetDescription>\n </div>\n <Badge variant=\"outline\" className=\"ml-4 text-xs\">\n {localPages.length} {localPages.length === 1 ? \"page\" : \"pages\"}\n </Badge>\n </div>\n </SheetHeader>\n\n <div className=\"flex-1 overflow-hidden flex flex-col\">\n <div className=\"flex-1 overflow-auto px-6 py-6\">\n <DragDropGrid\n items={localPages}\n onChange={handleLocalReorder}\n renderItem={renderPageThumbnail}\n keyExtractor={keyExtractor}\n renderEmptyState={renderEmptyState}\n gridColsClass={gridColsClass}\n className=\"pb-4\"\n isItemDisabled={isItemDisabled}\n canDropAt={canDropAt}\n />\n </div>\n </div>\n\n <SheetFooter className=\"border-t border-gray-200 px-4 py-3 gap-3\">\n <Button\n variant=\"outline\"\n onClick={handleCancel}\n >\n Cancel\n </Button>\n <Button\n variant=\"default\"\n onClick={handleSave}\n disabled={!hasChanges}\n >\n Save Changes\n </Button>\n </SheetFooter>\n </SheetContent>\n </Sheet>\n )\n}\n","import * as React from \"react\"\nimport { cn } from \"./cn\"\n\nexport interface SelectProps extends React.SelectHTMLAttributes<HTMLSelectElement> {}\n\nconst Select = React.forwardRef<HTMLSelectElement, SelectProps>(\n ({ className, children, ...props }, ref) => {\n return (\n <select\n className={cn(\n \"flex h-8 w-full rounded-md border border-gray-200 bg-white px-2.5 py-1 text-sm text-gray-900 outline-none transition-colors focus:border-gray-400 focus:ring-2 focus:ring-gray-200 focus:ring-offset-0 disabled:cursor-not-allowed disabled:opacity-50\",\n className\n )}\n ref={ref}\n {...props}\n >\n {children}\n </select>\n )\n }\n)\nSelect.displayName = \"Select\"\n\nexport { Select }\n\n\n","import * as React from 'react'\nimport * as SwitchPrimitive from '@radix-ui/react-switch'\nimport { cn } from './cn'\n\nexport interface SwitchProps extends React.ComponentProps<typeof SwitchPrimitive.Root> {}\n\nconst Switch = React.forwardRef<\n React.ElementRef<typeof SwitchPrimitive.Root>,\n SwitchProps\n>(({ className, ...props }, ref) => {\n return (\n <SwitchPrimitive.Root\n ref={ref}\n className={cn(\n 'peer inline-flex h-5 w-9 shrink-0 cursor-pointer items-center rounded-full border-2 border-transparent bg-gray-200 transition-colors focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-gray-400 focus-visible:ring-offset-2 focus-visible:ring-offset-white disabled:cursor-not-allowed disabled:opacity-50 data-[state=checked]:bg-gray-900 data-[state=unchecked]:bg-gray-200',\n className\n )}\n {...props}\n >\n <SwitchPrimitive.Thumb\n className={cn(\n 'pointer-events-none block h-4 w-4 rounded-full bg-white shadow-lg ring-0 transition-transform data-[state=checked]:translate-x-4 data-[state=unchecked]:translate-x-0'\n )}\n />\n </SwitchPrimitive.Root>\n )\n})\nSwitch.displayName = SwitchPrimitive.Root.displayName\n\nexport { Switch }\n","import * as React from 'react'\nimport * as SliderPrimitive from '@radix-ui/react-slider'\nimport { cn } from './cn'\n\nexport interface SliderProps extends React.ComponentProps<typeof SliderPrimitive.Root> {}\n\nconst Slider = React.forwardRef<\n React.ElementRef<typeof SliderPrimitive.Root>,\n SliderProps\n>(({ className, ...props }, ref) => {\n return (\n <SliderPrimitive.Root\n ref={ref}\n className={cn(\n 'relative flex w-full touch-none select-none items-center data-[disabled]:opacity-50',\n className\n )}\n {...props}\n >\n <SliderPrimitive.Track className=\"relative h-1.5 w-full grow overflow-hidden rounded-full bg-gray-200\">\n <SliderPrimitive.Range className=\"absolute h-full bg-gray-900\" />\n </SliderPrimitive.Track>\n <SliderPrimitive.Thumb className=\"block h-4 w-4 rounded-full border-2 border-gray-900 bg-white shadow transition-colors focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-gray-400 focus-visible:ring-offset-2 disabled:pointer-events-none disabled:opacity-50\" />\n </SliderPrimitive.Root>\n )\n})\nSlider.displayName = SliderPrimitive.Root.displayName\n\nexport { Slider }\n","import * as React from 'react'\nimport * as LabelPrimitive from '@radix-ui/react-label'\nimport { cn } from './cn'\n\nexport interface LabelProps extends React.ComponentProps<typeof LabelPrimitive.Root> {}\n\nconst Label = React.forwardRef<\n React.ElementRef<typeof LabelPrimitive.Root>,\n LabelProps\n>(({ className, ...props }, ref) => {\n return (\n <LabelPrimitive.Root\n ref={ref}\n className={cn(\n 'text-sm font-medium leading-none text-gray-700 peer-disabled:cursor-not-allowed peer-disabled:opacity-70',\n className\n )}\n {...props}\n />\n )\n})\nLabel.displayName = LabelPrimitive.Root.displayName\n\nexport { Label }\n","import { Check, Minus, Plus } from 'lucide-react';\nimport { Select } from '../../ui/select';\nimport { Switch } from '../../ui/switch';\nimport { Slider } from '../../ui/slider';\nimport { Label } from '../../ui/label';\nimport { Button } from '../../ui/button';\nimport { PageOption } from './page-editor';\nimport { PageItem } from './page-group-utils';\n\ntype PageOptionsRendererProps = {\n pageOptions: PageOption[];\n targetItem: PageItem;\n onChange: (pageOption: PageOption, targetItem: PageItem, value: string) => void;\n};\n\nexport function PageOptionsRenderer({\n pageOptions,\n targetItem,\n onChange,\n}: PageOptionsRendererProps) {\n const matchesTarget = (option: PageOption, item: PageItem) => {\n if (!option.appliesTo) return true;\n const targets = Array.isArray(option.appliesTo) ? option.appliesTo : [option.appliesTo];\n return targets.some(target => {\n if (typeof target === 'function') return target(item);\n // Match by instance ID, template ID, or component key\n return target === item.id || target === item.templateId || (item as any).componentKey === target;\n });\n };\n\n // Filter out options that don't apply to this page (getValue returns empty string or false for non-applicable options)\n const applicableOptions = pageOptions.filter(option => {\n if (!matchesTarget(option, targetItem)) return false;\n const value = option.getValue(targetItem);\n if (option.type === 'select' || option.type === 'color-series') {\n return value !== ''; // Only show if value is not empty\n }\n if (option.type === 'toggle') {\n // Always show toggles, they can be false\n return true;\n }\n // For slider and counter, always show\n return true;\n });\n\n const renderOption = (option: PageOption) => {\n const currentValue = option.getValue(targetItem);\n\n switch (option.type) {\n case 'select': {\n return (\n <div key={option.id} className=\"space-y-1.5\">\n <Label htmlFor={option.id} className=\"text-xs font-medium text-gray-500\">\n {option.label}\n </Label>\n <Select\n id={option.id}\n value={String(currentValue)}\n onChange={(e) => onChange(option, targetItem, e.target.value)}\n className=\"w-full text-sm\"\n >\n {option.options.map((opt) => (\n <option key={opt.value} value={opt.value}>\n {opt.label}\n </option>\n ))}\n </Select>\n </div>\n );\n }\n\n case 'toggle': {\n const boolValue = typeof currentValue === 'boolean' ? currentValue : currentValue === 'true';\n return (\n <div key={option.id} className=\"flex items-center justify-between py-1.5\">\n <Label htmlFor={option.id} className=\"text-xs font-medium text-gray-500\">\n {option.label}\n </Label>\n <Switch\n id={option.id}\n checked={boolValue}\n onCheckedChange={(checked) => onChange(option, targetItem, String(checked))}\n />\n </div>\n );\n }\n\n case 'slider': {\n const numValue = typeof currentValue === 'number' ? currentValue : Number(currentValue) || option.min;\n return (\n <div key={option.id} className=\"space-y-1.5\">\n <div className=\"flex items-center justify-between\">\n <Label htmlFor={option.id} className=\"text-xs font-medium text-gray-500\">\n {option.label}\n </Label>\n <span className=\"text-xs font-mono tabular-nums text-gray-700\">{numValue}</span>\n </div>\n <Slider\n id={option.id}\n min={option.min}\n max={option.max}\n step={option.step}\n value={[numValue]}\n onValueChange={(values) => onChange(option, targetItem, String(values[0]))}\n />\n </div>\n );\n }\n\n case 'counter': {\n const numValue = typeof currentValue === 'number' ? currentValue : Number(currentValue) || option.min;\n return (\n <div key={option.id} className=\"space-y-1.5\">\n <Label className=\"text-xs font-medium text-gray-500\">{option.label}</Label>\n <div className=\"flex items-center gap-2\">\n <Button\n variant=\"outline\"\n size=\"sm\"\n className=\"h-8 w-8 shrink-0 p-0\"\n onClick={() => {\n const newValue = Math.max(option.min, numValue - option.step);\n onChange(option, targetItem, String(newValue));\n }}\n disabled={numValue <= option.min}\n type=\"button\"\n >\n <Minus className=\"h-3.5 w-3.5\" />\n </Button>\n <div className=\"flex-1 text-center px-3 py-1.5 bg-gray-50 rounded-md border border-gray-200\">\n <span className=\"text-sm font-mono tabular-nums font-medium text-gray-900\">{numValue}</span>\n </div>\n <Button\n variant=\"outline\"\n size=\"sm\"\n className=\"h-8 w-8 shrink-0 p-0\"\n onClick={() => {\n const newValue = Math.min(option.max, numValue + option.step);\n onChange(option, targetItem, String(newValue));\n }}\n disabled={numValue >= option.max}\n type=\"button\"\n >\n <Plus className=\"h-3.5 w-3.5\" />\n </Button>\n </div>\n </div>\n );\n }\n\n case 'color-series': {\n const stringValue = String(currentValue);\n return (\n <div key={option.id} className=\"space-y-1.5\">\n <Label className=\"text-xs font-medium text-gray-500\">{option.label}</Label>\n <div className=\"flex flex-wrap gap-1.5\">\n {option.options.map((color) => {\n const isSelected = stringValue === color.value;\n return (\n <button\n key={color.value}\n onClick={() => onChange(option, targetItem, color.value)}\n className={`h-7 w-7 rounded-md border-2 transition-all flex items-center justify-center ${\n isSelected\n ? 'border-gray-900 scale-110'\n : 'border-gray-200 hover:border-gray-400 hover:scale-105'\n }`}\n style={{ backgroundColor: color.hex || color.value }}\n type=\"button\"\n title={`${color.label}${color.hex ? ` (${color.hex})` : ''}`}\n >\n {isSelected && (\n <Check className=\"h-4 w-4 text-white drop-shadow-[0_1px_2px_rgba(0,0,0,0.8)]\" strokeWidth={3} />\n )}\n </button>\n );\n })}\n </div>\n </div>\n );\n }\n\n default:\n console.warn(`Unknown option type: ${(option as any).type}`);\n return null;\n }\n };\n\n return <div className=\"space-y-3\">{applicableOptions.map((option) => renderOption(option))}</div>;\n}\n","import * as React from 'react';\nimport { MoreHorizontal, Trash2 } from 'lucide-react';\nimport { Button } from '../../ui/button';\nimport {\n DropdownMenu,\n DropdownMenuContent,\n DropdownMenuItem,\n DropdownMenuTrigger,\n DropdownMenuSeparator,\n} from '../../ui/dropdown-menu';\nimport { PageOption } from './page-editor';\nimport { PageItem } from './page-group-utils';\nimport { PageOptionsRenderer } from './page-options-renderer';\n\nexport interface PageOptionsDropdownProps {\n pageOptions: PageOption[];\n targetItem: PageItem | undefined;\n onChange: (pageOption: PageOption, targetItem: PageItem, value: string) => void;\n onRemove?: (targetId: string) => void;\n showRemove?: boolean;\n title?: string;\n removeLabel?: string;\n triggerClassName?: string;\n}\n\nexport function PageOptionsDropdown({\n pageOptions,\n targetItem,\n onChange,\n onRemove,\n showRemove = false,\n title = 'Options',\n removeLabel = 'Remove',\n triggerClassName,\n}: PageOptionsDropdownProps) {\n if (!targetItem) return null;\n\n return (\n <DropdownMenu modal={false}>\n <DropdownMenuTrigger asChild className={triggerClassName || 'page-options-trigger'}>\n <Button\n variant=\"ghost\"\n size=\"sm\"\n className=\"h-7 w-7\"\n title={title}\n >\n <MoreHorizontal className=\"w-4 h-4\" />\n <span className=\"sr-only\">{title}</span>\n </Button>\n </DropdownMenuTrigger>\n <DropdownMenuContent className=\"min-w-48 p-3\" align=\"center\">\n <PageOptionsRenderer\n pageOptions={pageOptions}\n targetItem={targetItem}\n onChange={onChange}\n />\n {showRemove && onRemove && (\n <>\n {pageOptions.length > 0 && <DropdownMenuSeparator className=\"my-2\" />}\n <DropdownMenuItem\n onClick={() => onRemove(targetItem.id)}\n className=\"text-red-600 focus:text-red-700 focus:bg-red-50\"\n >\n <Trash2 className=\"w-4 h-4 mr-2\" />\n <span>{removeLabel}</span>\n </DropdownMenuItem>\n </>\n )}\n </DropdownMenuContent>\n </DropdownMenu>\n );\n}\n\n","import * as React from 'react';\nimport { Section } from '../resizers/section-page-resizer';\nimport { PageGroup as PageGroupType, StandalonePage, PageItem } from './page-group-utils';\nimport { Badge } from '../../ui/badge';\nimport { PageOption } from './page-editor';\nimport { PageOptionsDropdown } from './page-options-dropdown';\n\ninterface PageGroupProps {\n group: PageGroupType;\n pagesWithPageNum: Array<StandalonePage & { pageNum: number }>;\n onRemove: (groupId: string) => void;\n totalItems: number;\n renderPage: (page: StandalonePage & { pageNum: number }) => React.ReactNode;\n pageOptions: PageOption[];\n onPageOptionChange: (pageOption: PageOption, target: PageItem, value: string) => void;\n onLabelChange?: (groupId: string, label: string) => void;\n // MVP: Minimal props, no advanced customization\n}\n\nexport function PageGroup({\n group,\n pagesWithPageNum,\n onRemove,\n totalItems,\n renderPage,\n pageOptions,\n onPageOptionChange,\n onLabelChange,\n}: PageGroupProps) {\n const handleLabelClick = () => {\n if (!onLabelChange) return;\n const currentLabel = group.label || group.id;\n const entered = window.prompt('Rename group:', currentLabel);\n if (entered !== null) {\n const trimmed = entered.trim();\n onLabelChange(group.id, trimmed || '');\n }\n };\n return (\n <>\n {pagesWithPageNum.map((page, indexInGroup) => {\n const isFirstPage = indexInGroup === 0;\n \n return (\n <Section\n key={page.id}\n title={`Sheet ${page.pageNum}`}\n controls={\n isFirstPage ? (\n // Group-level controls only on first page\n <div data-uhuu-editor className=\"pl-0 py-1.5 flex justify-between items-center\">\n <div className=\"flex items-center gap-2\">\n <span className=\"page-number\">\n {page.pageNum}\n </span>\n {page.label && (\n <span className=\"text-xs text-gray-500\">\n {page.label}\n </span>\n )}\n <Badge \n variant=\"outline\" \n className=\"text-xs font-normal text-gray-600 border-gray-200 bg-transparent cursor-pointer hover:bg-gray-50 transition-colors\"\n onClick={handleLabelClick}\n title=\"Click to rename\"\n data-group-id={group.id}\n >\n {group.label || group.id}\n </Badge>\n </div>\n <div className=\"flex items-center\">\n <PageOptionsDropdown\n pageOptions={pageOptions}\n targetItem={group}\n onChange={onPageOptionChange}\n onRemove={onRemove}\n showRemove={totalItems > 1}\n title=\"Group options\"\n removeLabel=\"Remove Group\"\n />\n </div>\n </div>\n ) : (\n // No controls for pages within group (group internal pages are not directly editable)\n <div className=\"pl-0 pr-3 py-1.5 flex justify-between items-center\">\n <div className=\"flex items-center gap-2\">\n <span className=\"page-number\">\n {page.pageNum}\n </span>\n {page.label && (\n <span className=\"text-xs text-gray-500\">\n {page.label}\n </span>\n )}\n <span className=\"text-xs text-gray-400\">·</span>\n </div>\n </div>\n )\n }\n >\n {renderPage(page)}\n </Section>\n );\n })}\n </>\n );\n}\n","import * as React from 'react';\nimport Pagination from '../../pagination-static/pagination-static';\nimport Sheet from '../../pagination-static/sheet-static';\nimport type { PageComponent, PageGroup, PageItem, StandalonePage } from './page-group-utils';\nimport type { PageDataBinding } from './data-binding';\n\ninterface PageCanvasProps {\n pageId: string;\n templateId?: string;\n componentKey?: string;\n component?: PageComponent;\n payload?: any;\n pagePayload?: any;\n integration?: any;\n page?: StandalonePage;\n parentGroup?: PageItem;\n setup?: { width: number; height: number; [key: string]: any };\n reference?: React.ReactNode;\n overlay?: React.ReactNode | ((args: { pageNo: number; pageId: string }) => React.ReactNode);\n className?: string;\n pageNo?: number;\n dataBinding?: PageDataBinding;\n}\n\n/**\n * Small helper that renders a single page with Pagination + Sheet\n * and optional reference/overlay. Keeps templates from duplicating\n * the same scaffold for every page render.\n */\nexport function PageCanvas({\n pageId,\n templateId,\n componentKey,\n component: PageComponent,\n payload,\n pagePayload,\n integration,\n page,\n parentGroup,\n setup,\n reference,\n overlay,\n className,\n pageNo = 0,\n dataBinding,\n}: PageCanvasProps) {\n const renderOverlay = typeof overlay === 'function'\n ? (pageNo: number) => overlay({ pageNo, pageId })\n : () => overlay;\n\n // Build automatic class for page key targeting\n const pageKey = componentKey || templateId || pageId;\n const pageKeyClass = pageKey ? `uhuu-page--${pageKey}` : '';\n const combinedClassName = [pageKeyClass, className].filter(Boolean).join(' ');\n\n return (\n <Pagination setup={setup}>\n <Sheet \n className={combinedClassName} \n pageNo={pageNo} \n overlay={({ pageNo }) => renderOverlay(pageNo)}\n data-page-key={pageKey}\n >\n {reference}\n {PageComponent ? (\n <PageComponent\n payload={payload}\n pagePayload={pagePayload}\n integration={integration}\n pageId={pageId}\n templateId={templateId ?? componentKey ?? pageId}\n pageNum={pageNo}\n page={page}\n parentGroup={parentGroup as PageGroup}\n componentKey={componentKey}\n dataBinding={dataBinding}\n />\n ) : null}\n </Sheet>\n </Pagination>\n );\n}\n\nexport default PageCanvas;\n","import { useState, useMemo, useCallback, useContext } from 'react';\nimport {\n PageItem,\n StandalonePage,\n PageComponent,\n IntegrationRequirement,\n IntegrationConfig,\n isPageGroup,\n updatePageNumbers,\n getTotalPageCount,\n transformItemsForReorder,\n restoreItemsFromReorder,\n ReorderItem,\n PageEditorState,\n DEFAULT_PAGE_EDITOR_STATE_KEY,\n buildPageEditorState,\n instantiateGroup,\n instantiatePage,\n PageFilterConfig,\n filterPageItems,\n} from './page-group-utils';\nimport { createDefaultRenderThumbnail } from './default-render-thumbnail';\nimport { TemplateDataContext } from './template-data-provider';\n\nexport type AvailablePageItem = {\n kind: 'page';\n id: string; // Template ID\n templateId?: string; // Reference to template\n componentKey?: string; // Component key for resolution\n label?: string;\n component?: PageComponent;\n meta?: Record<string, any>;\n repeatable?: boolean;\n maxInstances?: number | null;\n integration?: IntegrationRequirement | IntegrationConfig;\n [key: string]: any;\n};\n\nexport type AvailableGroupItem = {\n kind: 'group';\n id: string; // Template ID\n templateId?: string; // Reference to template\n repeatable?: boolean; // Can be added multiple times\n maxInstances?: number | null; // Max instances allowed\n pageComponentKeys?: string[]; // Component keys (not instance IDs)\n label?: string;\n integration?: IntegrationRequirement | IntegrationConfig;\n meta?: Record<string, any>;\n [key: string]: any;\n};\n\nexport type AvailableItem = AvailablePageItem | AvailableGroupItem;\n\ntype PageItemWithNumbers = PageItem & {\n pageNum?: number;\n pages?: Array<StandalonePage & { pageNum: number }>;\n};\n\ninterface UsePageGroupsOptions {\n // Initial state - what pages/groups come when template first loads\n initialItems: PageItem[];\n \n // Available items that can be added (simple: array of page IDs or group configs)\n availableItems?: AvailableItem[];\n \n // Callbacks (optional for MVP)\n onItemsChange?: (items: PageItem[], state: PageEditorState) => void;\n onStateChange?: (state: PageEditorState) => void;\n \n // NEW: For automatic thumbnail rendering\n pageComponents?: { [pageId: string]: PageComponent };\n payload?: any;\n \n // Page setup dimensions (same as Pagination setup prop) - in millimeters\n setup?: { width: number; height: number };\n\n // Payload state key (for persistence helpers)\n stateKey?: string;\n\n // Hook for resolving a draft item before it is committed (integration fetch, async defaults, etc.)\n resolveNewItem?: (draft: PageItem) => Promise<PageItem | null | void> | PageItem | null | void;\n\n notifyError?: (message: string) => void;\n \n // Page filter for conditional rendering\n pageFilter?: PageFilterConfig;\n}\n\ninterface UsePageGroupsReturn {\n // State\n items: PageItem[];\n itemsWithPageNum: PageItemWithNumbers[];\n totalPageCount: number;\n \n // Available items (filtered - excludes already used)\n availableItemsToAdd: AvailableItem[];\n \n // CRUD operations (MVP - minimal surface)\n addItem: (item: AvailableItem) => Promise<void>;\n removeItem: (itemId: string) => void;\n updateItemFields: (itemId: string, patch: Partial<PageItem>) => void;\n reorderItems: (newOrder: PageItem[]) => void;\n \n // Add page dialog state\n addDialogOpen: boolean;\n setAddDialogOpen: (open: boolean) => void;\n openAddDialog: () => void;\n \n // Render helper (simple - just pages)\n renderItems: (\n renderPage: (\n page: StandalonePage & { pageNum: number },\n parentItem?: PageItem\n ) => React.ReactNode\n ) => React.ReactNode[];\n \n // Reorder helpers (for PageOrderDialog)\n itemsForReorder: ReorderItem[];\n handleReorder: (reorderedItems: ReorderItem[]) => void;\n \n // Default renderThumbnail (if pageComponents provided)\n defaultRenderThumbnail?: (item: ReorderItem, index: number, isDragging?: boolean) => React.ReactNode;\n}\n\nexport function usePageGroups(options: UsePageGroupsOptions): UsePageGroupsReturn {\n const {\n initialItems,\n availableItems = [],\n onItemsChange,\n onStateChange,\n pageComponents,\n payload,\n setup,\n stateKey = DEFAULT_PAGE_EDITOR_STATE_KEY,\n resolveNewItem,\n notifyError,\n pageFilter,\n } = options;\n \n const [items, setItems] = useState<PageItem[]>(initialItems);\n const [addDialogOpen, setAddDialogOpen] = useState(false);\n \n // Get TemplateDataProvider context (optional - returns null if not available)\n const templateDataContext = useContext(TemplateDataContext);\n \n // Update items and notify parent\n const updateItems = useCallback((newItems: PageItem[]) => {\n setItems(newItems);\n const state = buildPageEditorState(newItems, stateKey);\n \n // If TemplateDataProvider is available, use it as single source of truth for payload updates\n // This ensures all payload modifications (including reordering) go through the provider\n if (templateDataContext?.mergePageEditorState) {\n templateDataContext.mergePageEditorState(newItems, stateKey);\n }\n \n onStateChange?.(state);\n onItemsChange?.(newItems, state);\n }, [onItemsChange, onStateChange, stateKey, templateDataContext]);\n \n // Count instances by templateId\n const instanceCountsByTemplate = useMemo(() => {\n const counts = new Map<string, number>();\n items.forEach(item => {\n const templateId = item.templateId ?? item.id;\n counts.set(templateId, (counts.get(templateId) ?? 0) + 1);\n if (isPageGroup(item)) {\n item.pages?.forEach((page) => {\n const pageTemplateId = (page as any).templateId ?? page.id;\n counts.set(pageTemplateId, (counts.get(pageTemplateId) ?? 0) + 1);\n });\n }\n });\n return counts;\n }, [items]);\n \n // Filter available items based on repeatability and maxInstances\n const availableItemsToAdd = useMemo(() => {\n return availableItems.filter(item => {\n // Handle page items\n if ((item as AvailablePageItem).kind === 'page') {\n const pageItem = item as AvailablePageItem;\n const templateId = pageItem.templateId ?? pageItem.id;\n const count = instanceCountsByTemplate.get(templateId) ?? 0;\n const isRepeatable = pageItem.repeatable ?? false;\n const maxInstances = pageItem.maxInstances ?? null;\n\n if (!isRepeatable && count > 0) {\n return false;\n }\n\n if (maxInstances !== null && count >= maxInstances) {\n return false;\n }\n\n return true;\n }\n\n // Handle group items\n const groupItem = item as AvailableGroupItem;\n const templateId = groupItem.templateId ?? groupItem.id;\n const count = instanceCountsByTemplate.get(templateId) ?? 0;\n const isRepeatable = groupItem.repeatable ?? false;\n const maxInstances = groupItem.maxInstances ?? null;\n\n // If not repeatable and already has an instance, hide it\n if (!isRepeatable && count > 0) {\n return false;\n }\n\n // If repeatable, check maxInstances limit\n if (isRepeatable && maxInstances !== null && count >= maxInstances) {\n return false;\n }\n\n return true;\n });\n }, [availableItems, instanceCountsByTemplate]);\n \n // Calculate total page count\n const totalPageCount = useMemo(() => getTotalPageCount(items), [items]);\n \n // Add item (page or group) - creates instance from template\n const addItem = useCallback(async (item: AvailableItem) => {\n const resolveIntegrationMode = (\n integration?: IntegrationRequirement | IntegrationConfig\n ): IntegrationRequirement => {\n if (!integration) return 'none';\n if (typeof integration === 'string') return integration;\n return integration.mode ?? 'optional';\n };\n\n const createDraftFromAvailable = (available: AvailableItem): PageItem => {\n // Handle page items\n if ((available as AvailablePageItem).kind === 'page') {\n const pageItem = available as AvailablePageItem;\n const templateId = pageItem.templateId ?? pageItem.id;\n const componentKey = pageItem.componentKey ?? pageItem.id;\n return instantiatePage(templateId, componentKey, {\n label: pageItem.label,\n className: pageItem.className,\n repeatable: pageItem.repeatable,\n maxInstances: pageItem.maxInstances,\n integration: pageItem.integration,\n strictPosition: pageItem.strictPosition,\n });\n }\n\n // Handle group items\n const groupConfig = available as AvailableGroupItem;\n const templateId = groupConfig.templateId ?? groupConfig.id;\n \n // Component keys define the template makeup for this group\n const componentKeys = groupConfig.pageComponentKeys ?? [];\n\n return instantiateGroup(templateId, componentKeys, {\n label: groupConfig.label,\n repeatable: groupConfig.repeatable ?? false,\n maxInstances: groupConfig.maxInstances ?? null,\n integration: groupConfig.integration,\n });\n };\n\n const draft = createDraftFromAvailable(item);\n const debugIntegration = typeof window !== 'undefined'\n && (window as any).$uhuu?.debug;\n let integrationData: any = undefined;\n\n let resolved: PageItem | null | void = draft;\n if (resolveNewItem) {\n resolved = await resolveNewItem(draft);\n } else {\n const integrationMode = resolveIntegrationMode((draft as any).integration);\n let shouldAbort = false;\n\n if (debugIntegration) {\n console.debug('[usePageGroups] integration check', {\n id: draft.id,\n kind: (draft as any).kind,\n integration: (draft as any).integration,\n mode: integrationMode,\n });\n }\n\n if (integrationMode !== 'none' && typeof window !== 'undefined') {\n const requestIntegration = (window as any).$uhuu?.requestIntegration?.bind((window as any).$uhuu);\n if (requestIntegration) {\n if (debugIntegration) {\n console.debug('[usePageGroups] requestIntegration start', { id: draft.id, mode: integrationMode });\n }\n integrationData = await requestIntegration({ item: draft, mode: integrationMode });\n if (debugIntegration) {\n console.debug('[usePageGroups] requestIntegration done', { id: draft.id, hasData: integrationData != null });\n }\n if (integrationData == null && integrationMode === 'required') {\n shouldAbort = true;\n }\n } else if (integrationMode === 'required') {\n console.warn('[usePageGroups] Integration data required but $uhuu.requestIntegration is not available.');\n shouldAbort = true;\n }\n }\n\n if (shouldAbort) return;\n\n }\n\n if (resolved === null) return;\n const finalItem = (resolved ?? draft) as PageItem;\n \n // Store integration data using the instance ID\n // For groups, this is the group ID; for pages, it's the page ID\n if (integrationData !== undefined && templateDataContext?.setIntegrationPayload) {\n const instanceId = finalItem.id;\n if (debugIntegration) {\n console.debug('[usePageGroups] storing integration data', {\n instanceId,\n hasData: integrationData != null,\n dataKeys: integrationData ? Object.keys(integrationData) : [],\n });\n }\n templateDataContext.setIntegrationPayload(instanceId, integrationData);\n }\n \n // Insert item in correct position based on strictPosition flags\n const insertItemInPosition = (newItems: PageItem[], itemToInsert: PageItem): PageItem[] => {\n const itemPosition = (itemToInsert as any).strictPosition;\n \n // If the new item has a strictPosition flag, insert it accordingly\n if (itemPosition === 'start') {\n return [itemToInsert, ...newItems];\n } else if (itemPosition === 'end') {\n return [...newItems, itemToInsert];\n }\n \n // Otherwise, find the insertion point:\n // - After all items with strictPosition: 'start'\n // - Before all items with strictPosition: 'end'\n const startItems: PageItem[] = [];\n const middleItems: PageItem[] = [];\n const endItems: PageItem[] = [];\n \n newItems.forEach(item => {\n const position = (item as any).strictPosition;\n if (position === 'start') {\n startItems.push(item);\n } else if (position === 'end') {\n endItems.push(item);\n } else {\n middleItems.push(item);\n }\n });\n \n // Insert new item in the middle section\n return [...startItems, ...middleItems, itemToInsert, ...endItems];\n };\n \n updateItems(insertItemInPosition(items, finalItem));\n }, [items, updateItems, resolveNewItem, templateDataContext]);\n \n // Remove item or page from group\n const removeItem = useCallback((itemId: string) => {\n const showError = (message: string) => {\n if (notifyError) {\n notifyError(message);\n } else {\n alert(message);\n }\n };\n\n // First, try to find an item with this ID (standalone page or group)\n const targetItem = items.find(i => i.id === itemId);\n \n // If found as a direct item (group or standalone page), remove it entirely\n if (targetItem) {\n const totalCount = getTotalPageCount(items);\n if (totalCount <= 1) {\n showError('Cannot remove the last page. At least one page is required.');\n return;\n }\n \n // Remove integration data if it exists for this instance\n if (templateDataContext?.removeIntegrationPayload) {\n const instanceId = targetItem.id;\n const hasIntegrationData = templateDataContext.payload?.integrations?.[instanceId] !== undefined;\n if (hasIntegrationData) {\n templateDataContext.removeIntegrationPayload(instanceId);\n }\n }\n updateItems(items.filter(item => item.id !== itemId));\n return;\n }\n \n // If not found as direct item, it might be a page ID within a group\n for (const item of items) {\n if (isPageGroup(item) && item.pages.some(p => p.id === itemId)) {\n const totalCount = getTotalPageCount(items);\n if (totalCount <= 1) {\n showError('Cannot remove the last page. At least one page is required.');\n return;\n }\n \n if (item.pages.length === 1) {\n // Last page in group - remove the entire group\n // Remove integration data if it exists for this group instance\n if (templateDataContext?.removeIntegrationPayload) {\n const instanceId = item.id;\n const hasIntegrationData = templateDataContext.payload?.integrations?.[instanceId] !== undefined;\n if (hasIntegrationData) {\n templateDataContext.removeIntegrationPayload(instanceId);\n }\n }\n updateItems(items.filter(i => i.id !== item.id));\n } else {\n // Multiple pages in group - remove just this page from the group\n // Note: We don't remove integration data here because the group still exists\n // and other pages in the group may still use the integration data\n updateItems(items.map(i => {\n if (i.id === item.id && isPageGroup(i)) {\n return {\n ...i,\n pages: i.pages.filter(p => p.id !== itemId),\n };\n }\n return i;\n }));\n }\n return;\n }\n }\n }, [items, notifyError, updateItems, templateDataContext]);\n \n const updateItemFields = useCallback((itemId: string, patch: Partial<PageItem>) => {\n updateItems(items.map(item => {\n if (item.id === itemId) {\n if (isPageGroup(item)) {\n return {\n ...item,\n ...patch,\n };\n }\n return { ...item, ...patch };\n }\n return item;\n }));\n }, [items, updateItems]);\n \n // Reorder items\n const reorderItems = useCallback((newOrder: PageItem[]) => {\n updateItems(newOrder);\n }, [updateItems]);\n \n // Items with derived pageNum for rendering\n // Apply page filtering if configured\n const itemsWithPageNum = useMemo(() => {\n const itemsWithNumbers = updatePageNumbers(items) as PageItemWithNumbers[];\n \n // Apply page filter if configured (preserves original page numbers)\n if (pageFilter) {\n return filterPageItems(itemsWithNumbers as PageItem[], pageFilter) as PageItemWithNumbers[];\n }\n \n return itemsWithNumbers;\n }, [items, pageFilter]);\n \n // Render helper - automatically handles pages vs groups\n const renderItems = useCallback((\n renderPage: (\n page: StandalonePage & { pageNum: number },\n parentItem?: PageItem\n ) => React.ReactNode\n ): React.ReactNode[] => {\n const rendered: React.ReactNode[] = [];\n itemsWithPageNum.forEach(item => {\n if (isPageGroup(item)) {\n const groupPages = (item.pages ?? []) as Array<StandalonePage & { pageNum: number }>;\n groupPages.forEach(page => {\n rendered.push(renderPage(page, item));\n });\n } else {\n rendered.push(renderPage(item as StandalonePage & { pageNum: number }, item));\n }\n });\n return rendered;\n }, [itemsWithPageNum]);\n \n // Reorder helpers\n const itemsForReorder = useMemo(\n () => transformItemsForReorder(itemsWithPageNum as PageItem[]),\n [itemsWithPageNum]\n );\n \n const handleReorder = useCallback((reorderedItems: ReorderItem[]) => {\n const restored = restoreItemsFromReorder(reorderedItems, items);\n \n // Enforce strictPosition constraints: items with strictPosition: 'start' stay at start,\n // items with strictPosition: 'end' stay at end\n const enforcePositions = (itemsToOrder: PageItem[]): PageItem[] => {\n const startItems: PageItem[] = [];\n const middleItems: PageItem[] = [];\n const endItems: PageItem[] = [];\n \n itemsToOrder.forEach(item => {\n const position = (item as any).strictPosition;\n if (position === 'start') {\n startItems.push(item);\n } else if (position === 'end') {\n endItems.push(item);\n } else {\n middleItems.push(item);\n }\n });\n \n return [...startItems, ...middleItems, ...endItems];\n };\n \n updateItems(enforcePositions(restored));\n }, [items, updateItems]);\n \n const openAddDialog = useCallback(() => {\n setAddDialogOpen(true);\n }, []);\n \n // Generate defaultRenderThumbnail if pageComponents provided\n const defaultRenderThumbnail = useMemo(() => {\n if (pageComponents) {\n return createDefaultRenderThumbnail({ pageComponents, payload, setup });\n }\n return undefined;\n }, [pageComponents, payload, setup]);\n \n return {\n items,\n itemsWithPageNum,\n totalPageCount,\n availableItemsToAdd,\n addItem,\n removeItem,\n updateItemFields,\n reorderItems,\n addDialogOpen,\n setAddDialogOpen,\n openAddDialog,\n renderItems,\n itemsForReorder,\n handleReorder,\n defaultRenderThumbnail,\n };\n}\n","import { isPageGroup, PageItem, StandalonePage } from './page-group-utils';\nimport {\n buildIntegrationPath,\n resolveIntegrationBinding,\n resolveIntegrationInstanceId,\n} from './integration-utils';\n\ntype PathBuilder = (subPath?: string) => string | null;\n\nexport type IntegrationBinding = {\n instanceId: string | null;\n data?: any;\n path: PathBuilder;\n};\n\nexport type PageDataBinding = {\n payload: any;\n pageId: string;\n pagePayload?: any;\n parentGroupId?: string;\n integration: IntegrationBinding;\n paths: {\n integration: PathBuilder;\n page: PathBuilder;\n group: PathBuilder;\n document: PathBuilder;\n };\n defaults: {\n imageGalleryPath?: string | null;\n };\n};\n\ntype BuildPageDataBindingOptions = {\n payload: any;\n page: StandalonePage;\n parentGroup?: PageItem;\n pagePayload?: any;\n defaults?: {\n imageGalleryPath?: string;\n };\n};\n\nfunction buildPath(base: string | null, subPath?: string) {\n if (!base) return null;\n if (!subPath) return base;\n return `${base}.${subPath}`;\n}\n\nfunction resolveGalleryPath(\n payload: any,\n integrationData: any,\n defaults?: { imageGalleryPath?: string }\n): string | null | undefined {\n return (\n integrationData?.meta?.imageGalleryPath ??\n integrationData?.config?.imageGalleryPath ??\n integrationData?.imageGalleryPath ??\n payload?.options?.imageGalleryPath ??\n payload?.templateSetup?.options?.imageGalleryPath ??\n defaults?.imageGalleryPath\n );\n}\n\nexport function buildPageDataBinding({\n payload,\n page,\n parentGroup,\n pagePayload,\n defaults,\n}: BuildPageDataBindingOptions): PageDataBinding {\n const integrationBinding = resolveIntegrationBinding(payload, page, parentGroup);\n const groupId = parentGroup && isPageGroup(parentGroup) ? parentGroup.id : undefined;\n const pageBase = `pages.${page.id}`;\n const groupBase = groupId ? `pages.${groupId}` : null;\n\n return {\n payload,\n pageId: page.id,\n pagePayload,\n parentGroupId: groupId,\n integration: {\n instanceId: integrationBinding.instanceId,\n data: integrationBinding.integration,\n path: (subPath?: string) =>\n buildIntegrationPath(integrationBinding.instanceId, subPath),\n },\n paths: {\n integration: (subPath?: string) =>\n buildIntegrationPath(integrationBinding.instanceId, subPath),\n page: (subPath?: string) => buildPath(pageBase, subPath),\n group: (subPath?: string) => buildPath(groupBase, subPath),\n document: (subPath?: string) => subPath ?? null,\n },\n defaults: {\n imageGalleryPath: resolveGalleryPath(\n payload,\n integrationBinding.integration,\n defaults\n ),\n },\n };\n}\n\nexport function buildIntegrationDialogPath(\n page: StandalonePage,\n parentGroup?: PageItem,\n subPath?: string\n) {\n const instanceId = resolveIntegrationInstanceId(page, parentGroup);\n return buildIntegrationPath(instanceId, subPath);\n}\n","import {\n PageItem,\n PageGroup,\n StandalonePage,\n instantiateGroup,\n instantiatePage,\n PageComponent,\n IntegrationRequirement,\n IntegrationConfig,\n} from './page-group-utils';\nimport { AvailableItem } from './use-page-groups';\n\ntype SimplePageRef = string | (Partial<StandalonePage> & { id: string; componentKey?: string });\n\ntype PageTemplateDefinition = {\n label?: string;\n className?: string;\n componentKey?: string;\n component?: PageComponent;\n repeatable?: boolean;\n maxInstances?: number | null;\n integration?: IntegrationRequirement | IntegrationConfig;\n allowAsSinglePage?: boolean; // If false, page can only be added as part of a group (default: true)\n strictPosition?: 'start' | 'end'; // If set, page should always stay at the start or end of the document\n};\n\ntype SimpleGroupDefinition = {\n id: string; // Template ID\n label?: string;\n repeatable?: boolean; // Can be added multiple times\n maxInstances?: number | null; // Max instances (null = unlimited)\n pageComponentKeys?: string[]; // Template keys (not instance IDs)\n integration?: IntegrationRequirement | IntegrationConfig;\n};\n\ntype BuildPageGroupsConfigArgs = {\n initial: Array<SimplePageRef | SimpleGroupDefinition | string>;\n groups?: SimpleGroupDefinition[] | Record<string, SimpleGroupDefinition>;\n pageComponentKeys?: string[];\n pages?: Record<string, PageTemplateDefinition>;\n pageComponents?: Record<string, PageComponent>;\n};\n\ntype BuildPageGroupsConfigResult = {\n initialItems: PageItem[];\n availableItems: AvailableItem[];\n pageComponents: Record<string, PageComponent>;\n};\n\nconst asPage = (\n page: SimplePageRef, \n templateId?: string, \n isInitial: boolean = false,\n templateLookup?: Record<string, PageTemplateDefinition>\n): StandalonePage => {\n const pageId = typeof page === 'string' ? page : page.id;\n const templateConfig = templateLookup?.[pageId];\n const componentKey = typeof page === 'string'\n ? (templateConfig?.componentKey ?? pageId)\n : (page.componentKey ?? templateConfig?.componentKey ?? page.id);\n const pageTemplateId = templateId ?? pageId;\n const repeatable = (typeof page === 'string' ? undefined : (page as any).repeatable) ?? templateConfig?.repeatable ?? false;\n const maxInstances = (typeof page === 'string' ? undefined : (page as any).maxInstances) ?? templateConfig?.maxInstances ?? null;\n const label = (typeof page === 'string' ? undefined : page.label) ?? templateConfig?.label;\n const className = (typeof page === 'string' ? undefined : (page as any).className) ?? templateConfig?.className;\n const component = (typeof page === 'string' ? undefined : (page as any).component) ?? templateConfig?.component;\n const integration = (typeof page === 'string' ? undefined : (page as any).integration) ?? templateConfig?.integration;\n const strictPosition = (typeof page === 'string' ? undefined : (page as any).strictPosition) ?? templateConfig?.strictPosition;\n\n if (isInitial) {\n // For initial items with explicit IDs, use the ID directly (don't instantiate)\n return {\n kind: 'page',\n id: pageId,\n componentKey,\n templateId: pageTemplateId,\n label,\n className,\n repeatable,\n maxInstances,\n integration,\n component,\n strictPosition,\n ...(typeof page === 'string' ? {} : page),\n };\n }\n\n // For items added later, instantiate with unique ID\n return instantiatePage(pageTemplateId, componentKey, {\n label,\n className,\n repeatable,\n maxInstances,\n integration,\n component,\n strictPosition,\n ...(typeof page === 'string' ? {} : page),\n });\n};\n\nconst asGroup = (group: SimpleGroupDefinition, isInitial: boolean = false): PageGroup => {\n const componentKeys = group.pageComponentKeys ?? [];\n \n // For initial items, use the template ID directly (don't instantiate)\n // For items added later, instantiate with unique IDs\n if (isInitial) {\n const instanceId = group.id; // Use template ID as instance ID for initial items\n return {\n kind: 'group',\n id: instanceId,\n templateId: group.id,\n label: group.label,\n repeatable: group.repeatable ?? false,\n maxInstances: group.maxInstances ?? null,\n integration: group.integration,\n pages: componentKeys.map((key, idx) => ({\n id: `${instanceId}__${key}__${idx}`,\n componentKey: key,\n templateId: key,\n })),\n };\n }\n \n return instantiateGroup(group.id, componentKeys, {\n label: group.label,\n repeatable: group.repeatable ?? false,\n maxInstances: group.maxInstances ?? null,\n integration: group.integration,\n });\n};\n\nconst normalizeGroups = (groups?: SimpleGroupDefinition[] | Record<string, SimpleGroupDefinition>): SimpleGroupDefinition[] => {\n if (!groups) return [];\n if (Array.isArray(groups)) return groups;\n return Object.entries(groups).map(([id, def]) => ({ ...def, id }));\n};\n\nexport const buildPageGroupsConfig = (args: BuildPageGroupsConfigArgs): BuildPageGroupsConfigResult => {\n const {\n initial,\n groups,\n pageComponentKeys = [],\n pages = {},\n pageComponents: explicitPageComponents = {},\n } = args;\n\n const normalizedGroups = normalizeGroups(groups);\n const groupMap = new Map<string, SimpleGroupDefinition>();\n normalizedGroups.forEach((group) => groupMap.set(group.id, group));\n const inferredPageComponentKeys = pageComponentKeys.length ? pageComponentKeys : Object.keys(pages);\n const mergedPageComponents: Record<string, PageComponent> = { ...explicitPageComponents };\n Object.entries(pages).forEach(([key, def]) => {\n if (def.component) mergedPageComponents[key] = def.component;\n });\n\n const initialItems: PageItem[] = initial.map((item) => {\n if (typeof item === 'string') {\n const maybeGroup = groupMap.get(item);\n if (maybeGroup) {\n return asGroup(maybeGroup, true); // isInitial = true\n }\n return asPage(item, undefined, true, pages); // isInitial = true\n }\n\n const maybeGroup = (item as any).pageComponentKeys && Array.isArray((item as any).pageComponentKeys);\n if (maybeGroup) {\n return asGroup(item as SimpleGroupDefinition, true); // isInitial = true\n }\n\n return asPage(item as SimplePageRef, undefined, true, pages); // isInitial = true\n });\n\n const availableGroupItems: AvailableItem[] = normalizedGroups.map((group) => {\n const componentKeys = group.pageComponentKeys ?? [];\n return {\n kind: 'group',\n id: group.id, // Template ID\n templateId: group.id,\n label: group.label,\n pageComponentKeys: componentKeys,\n repeatable: group.repeatable ?? false,\n maxInstances: group.maxInstances ?? null,\n integration: group.integration,\n };\n });\n\n // For standalone pages, create template items\n // Filter out pages that are not allowed as single pages (allowAsSinglePage === false)\n const availablePageItems: AvailableItem[] = inferredPageComponentKeys\n .filter(key => {\n const templateConfig = pages?.[key];\n // Default to true if not specified\n return templateConfig?.allowAsSinglePage !== false;\n })\n .map(key => {\n const templateConfig = pages?.[key];\n return {\n kind: 'page',\n id: key, // Template ID\n templateId: key,\n componentKey: templateConfig?.componentKey ?? key,\n label: templateConfig?.label,\n className: templateConfig?.className,\n repeatable: templateConfig?.repeatable ?? false,\n maxInstances: templateConfig?.maxInstances ?? null,\n integration: templateConfig?.integration,\n strictPosition: templateConfig?.strictPosition,\n };\n });\n\n const availableItems: AvailableItem[] = [\n ...availablePageItems,\n ...availableGroupItems,\n ];\n\n return { initialItems, availableItems, pageComponents: mergedPageComponents };\n};\n","import * as React from \"react\";\nimport * as AlertDialogPrimitive from \"@radix-ui/react-alert-dialog\";\nimport { cn } from \"./cn\";\n\nconst AlertDialog = AlertDialogPrimitive.Root;\nconst AlertDialogTrigger = AlertDialogPrimitive.Trigger;\nconst AlertDialogPortal = AlertDialogPrimitive.Portal;\n\nconst AlertDialogOverlay = React.forwardRef<\n React.ElementRef<typeof AlertDialogPrimitive.Overlay>,\n React.ComponentPropsWithoutRef<typeof AlertDialogPrimitive.Overlay>\n>(({ className, ...props }, ref) => (\n <AlertDialogPrimitive.Overlay\n ref={ref}\n className={cn(\n \"fixed inset-0 z-50 bg-black/40 backdrop-blur-[1px] data-[state=open]:animate-in data-[state=closed]:animate-out data-[state=closed]:fade-out-0 data-[state=open]:fade-in-0\",\n className\n )}\n {...props}\n />\n));\nAlertDialogOverlay.displayName = AlertDialogPrimitive.Overlay.displayName;\n\nconst AlertDialogContent = React.forwardRef<\n React.ElementRef<typeof AlertDialogPrimitive.Content>,\n React.ComponentPropsWithoutRef<typeof AlertDialogPrimitive.Content>\n>(({ className, ...props }, ref) => (\n <AlertDialogPortal>\n <AlertDialogOverlay />\n <AlertDialogPrimitive.Content\n ref={ref} data-uhuu-editor\n className={cn(\n \"fixed left-[50%] top-[50%] z-50 w-full max-w-md translate-x-[-50%] translate-y-[-50%] rounded-md border border-gray-200 bg-white p-6 shadow-lg outline-none data-[state=open]:animate-in data-[state=closed]:animate-out data-[state=closed]:fade-out-0 data-[state=open]:fade-in-0\",\n className\n )}\n {...props}\n />\n </AlertDialogPortal>\n));\nAlertDialogContent.displayName = AlertDialogPrimitive.Content.displayName;\n\nconst AlertDialogHeader = ({\n className,\n ...props\n}: React.HTMLAttributes<HTMLDivElement>) => (\n <div className={cn(\"flex flex-col gap-2 text-left\", className)} {...props} />\n);\nAlertDialogHeader.displayName = \"AlertDialogHeader\";\n\nconst AlertDialogFooter = ({\n className,\n ...props\n}: React.HTMLAttributes<HTMLDivElement>) => (\n <div\n className={cn(\"mt-6 flex flex-col-reverse gap-2 sm:flex-row sm:justify-end\", className)}\n {...props}\n />\n);\nAlertDialogFooter.displayName = \"AlertDialogFooter\";\n\nconst AlertDialogTitle = React.forwardRef<\n React.ElementRef<typeof AlertDialogPrimitive.Title>,\n React.ComponentPropsWithoutRef<typeof AlertDialogPrimitive.Title>\n>(({ className, ...props }, ref) => (\n <AlertDialogPrimitive.Title\n ref={ref}\n className={cn(\"text-base font-semibold text-gray-900\", className)}\n {...props}\n />\n));\nAlertDialogTitle.displayName = AlertDialogPrimitive.Title.displayName;\n\nconst AlertDialogDescription = React.forwardRef<\n React.ElementRef<typeof AlertDialogPrimitive.Description>,\n React.ComponentPropsWithoutRef<typeof AlertDialogPrimitive.Description>\n>(({ className, ...props }, ref) => (\n <AlertDialogPrimitive.Description\n ref={ref}\n className={cn(\"text-sm text-gray-600\", className)}\n {...props}\n />\n));\nAlertDialogDescription.displayName = AlertDialogPrimitive.Description.displayName;\n\nconst AlertDialogAction = React.forwardRef<\n React.ElementRef<typeof AlertDialogPrimitive.Action>,\n React.ComponentPropsWithoutRef<typeof AlertDialogPrimitive.Action>\n>(({ className, ...props }, ref) => (\n <AlertDialogPrimitive.Action\n ref={ref}\n className={cn(\n \"inline-flex h-9 items-center justify-center rounded-md bg-gray-900 px-4 text-sm font-medium text-white transition-colors hover:bg-gray-800\",\n className\n )}\n {...props}\n />\n));\nAlertDialogAction.displayName = AlertDialogPrimitive.Action.displayName;\n\nconst AlertDialogCancel = React.forwardRef<\n React.ElementRef<typeof AlertDialogPrimitive.Cancel>,\n React.ComponentPropsWithoutRef<typeof AlertDialogPrimitive.Cancel>\n>(({ className, ...props }, ref) => (\n <AlertDialogPrimitive.Cancel\n ref={ref}\n className={cn(\n \"inline-flex h-9 items-center justify-center rounded-md border border-gray-200 bg-white px-4 text-sm font-medium text-gray-900 transition-colors hover:bg-gray-50\",\n className\n )}\n {...props}\n />\n));\nAlertDialogCancel.displayName = AlertDialogPrimitive.Cancel.displayName;\n\nexport {\n AlertDialog,\n AlertDialogTrigger,\n AlertDialogContent,\n AlertDialogHeader,\n AlertDialogFooter,\n AlertDialogTitle,\n AlertDialogDescription,\n AlertDialogAction,\n AlertDialogCancel,\n};\n","import { Printer, Check } from 'lucide-react';\nimport { PageFilterConfig } from './page-group-utils';\nimport { Button } from '../../ui/button';\nimport {\n DropdownMenu,\n DropdownMenuContent,\n DropdownMenuItem,\n DropdownMenuTrigger,\n} from '../../ui/dropdown-menu';\n\nexport interface PrintConfig {\n label: string;\n filter: PageFilterConfig | null;\n pageFormat?: { bleed?: number; [key: string]: any }; // PageFormat overrides to merge\n}\n\nexport interface PrintConfigMap {\n [key: string]: PrintConfig;\n}\n\nexport interface DevPrintControlsProps {\n modes?: PrintConfigMap;\n selectedMode?: string; // Current mode from parent\n onModeChange?: (mode: string, config: PrintConfig) => void;\n interactive: boolean;\n onInteractiveChange: (interactive: boolean) => void;\n}\n\n/**\n * Developer print controls - print mode toggle with optional filter dropdown\n */\nexport function DevPrintControls({\n modes,\n selectedMode: selectedModeProp,\n onModeChange,\n interactive,\n onInteractiveChange,\n}: DevPrintControlsProps) {\n const modeKeys = modes ? Object.keys(modes) : [];\n const currentMode = selectedModeProp || modeKeys[0] || 'all';\n\n const handleModeSelect = (mode: string) => {\n // Enter print mode with selected filter\n onInteractiveChange(false);\n \n if (onModeChange && modes && modes[mode]) {\n onModeChange(mode, modes[mode]);\n }\n };\n\n const currentModeLabel = modes && modes[currentMode] ? modes[currentMode].label : 'All Pages';\n\n // No modes defined: Simple toggle button\n if (modeKeys.length === 0) {\n return (\n <Button\n variant=\"ghost\"\n size=\"sm\"\n onClick={() => onInteractiveChange(!interactive)}\n className={`text-xs font-medium text-gray-700 hover:bg-gray-100/80 h-7 px-2.5 ${!interactive ? 'bg-gray-100/80' : ''}`}\n >\n <Printer className=\"w-3.5 h-3.5\" />\n {currentModeLabel || 'Print Mode'}\n </Button>\n );\n }\n\n // Modes defined: Dropdown to select filter\n return (\n <DropdownMenu>\n <DropdownMenuTrigger asChild>\n <Button\n variant=\"ghost\"\n size=\"sm\"\n className={`text-xs font-medium text-gray-700 hover:bg-gray-100/80 h-7 px-2.5 ${!interactive ? 'bg-gray-100/80' : ''}`}\n >\n <Printer className=\"w-3.5 h-3.5\" />\n {currentModeLabel}\n </Button>\n </DropdownMenuTrigger>\n \n <DropdownMenuContent align=\"center\" className=\"min-w-[160px]\">\n {modeKeys.map((key) => (\n <DropdownMenuItem\n key={key}\n onClick={() => handleModeSelect(key)}\n className=\"flex items-center gap-2\"\n >\n {currentMode === key ? (\n <Check className=\"w-3 h-3 text-gray-400\" />\n ) : (\n <span className=\"w-3 h-3\" />\n )}\n {modes![key].label}\n </DropdownMenuItem>\n ))}\n </DropdownMenuContent>\n </DropdownMenu>\n );\n}\n","/**\n * Check if the code is running in development mode.\n * Checks if running on localhost or local development domains.\n * \n * @returns {boolean} True if running in development mode, false otherwise\n */\nexport function isDev(): boolean {\n // Only check runtime environment, not build-time variables\n if (typeof window !== 'undefined') {\n const hostname = window.location.hostname;\n return hostname === 'localhost' || \n hostname === '127.0.0.1' ||\n hostname.endsWith('.local') ||\n window.location.port !== ''; // Any port means dev server\n }\n \n return false;\n}\n","import * as React from 'react';\nimport { useMemo, useState, useContext } from 'react';\nimport { Plus, ClipboardList, X } from 'lucide-react';\nimport { useInteractive, useShouldHideUI } from '../interactive-mode-context';\nimport SectionPageResizer, { Section, TwoPageSection } from '../resizers/section-page-resizer';\nimport { AddPageDialog } from './add-page-dialog';\nimport { PageOrderDialog } from './page-order-dialog';\nimport { PageGroup } from './page-group';\nimport { PageCanvas } from './page-canvas';\nimport { PageOptionsDropdown } from './page-options-dropdown';\nimport {\n isPageGroup,\n normalizePageItems,\n PageItem,\n StandalonePage,\n PageEditorState,\n DEFAULT_PAGE_EDITOR_STATE_KEY,\n PageComponent,\n readPageEditorState,\n PageFilterConfig,\n} from './page-group-utils';\nimport { usePageGroups, AvailableItem } from './use-page-groups';\nimport {\n TemplateDataProvider,\n TemplateDataContext,\n getPagePayload as resolvePagePayload,\n buildPayloadPageOption,\n type PayloadOptionDefinition,\n} from './template-data-provider';\nimport { resolveIntegrationForPage } from './integration-utils';\nimport { buildPageDataBinding } from './data-binding';\nimport { buildPageGroupsConfig } from './page-group-presets';\nimport { Button } from '../../ui/button';\nimport { Badge } from '../../ui/badge';\nimport {\n AlertDialog,\n AlertDialogAction,\n AlertDialogContent,\n AlertDialogDescription,\n AlertDialogFooter,\n AlertDialogHeader,\n AlertDialogTitle,\n} from '../../ui/alert-dialog';\nimport { DevPrintControls, type PrintConfigMap } from './dev-print-controls';\nimport { isDev } from '../../utility/is-dev';\n\ntype ReferenceRenderer = (pageId: string) => React.ReactNode;\n\n// Schema-based page option types\nexport type PageOptionSelectValue = {\n label: string;\n value: string;\n hex?: string; // For color-series options\n};\n\ntype PageOptionTarget = string | ((pageOrGroup: PageItem) => boolean);\n\ntype BasePageOption = {\n id: string;\n label: string;\n description?: string;\n appliesTo?: PageOptionTarget | PageOptionTarget[];\n};\n\nexport type SelectPageOption = BasePageOption & {\n type: 'select';\n options: PageOptionSelectValue[];\n getValue: (pageOrGroup: PageItem) => string | number | boolean;\n onChange?: (\n pageOrGroupId: string,\n value: string,\n context: { item?: PageItem; updateItem: (patch: Partial<PageItem>) => void }\n ) => void;\n applyPatch?: (value: string, item?: PageItem) => Partial<PageItem> | void;\n};\n\nexport type TogglePageOption = BasePageOption & {\n type: 'toggle';\n getValue: (pageOrGroup: PageItem) => boolean;\n onChange?: (\n pageOrGroupId: string,\n value: string,\n context: { item?: PageItem; updateItem: (patch: Partial<PageItem>) => void }\n ) => void;\n applyPatch?: (value: string, item?: PageItem) => Partial<PageItem> | void;\n};\n\nexport type SliderPageOption = BasePageOption & {\n type: 'slider';\n min: number;\n max: number;\n step: number;\n getValue: (pageOrGroup: PageItem) => number;\n onChange?: (\n pageOrGroupId: string,\n value: string,\n context: { item?: PageItem; updateItem: (patch: Partial<PageItem>) => void }\n ) => void;\n applyPatch?: (value: string, item?: PageItem) => Partial<PageItem> | void;\n};\n\nexport type CounterPageOption = BasePageOption & {\n type: 'counter';\n min: number;\n max: number;\n step: number;\n getValue: (pageOrGroup: PageItem) => number;\n onChange?: (\n pageOrGroupId: string,\n value: string,\n context: { item?: PageItem; updateItem: (patch: Partial<PageItem>) => void }\n ) => void;\n applyPatch?: (value: string, item?: PageItem) => Partial<PageItem> | void;\n};\n\nexport type ColorSeriesPageOption = BasePageOption & {\n type: 'color-series';\n options: PageOptionSelectValue[]; // Must include hex property\n getValue: (pageOrGroup: PageItem) => string;\n onChange?: (\n pageOrGroupId: string,\n value: string,\n context: { item?: PageItem; updateItem: (patch: Partial<PageItem>) => void }\n ) => void;\n applyPatch?: (value: string, item?: PageItem) => Partial<PageItem> | void;\n};\n\nexport type PageOption = SelectPageOption | TogglePageOption | SliderPageOption | CounterPageOption | ColorSeriesPageOption;\n\ntype PreviewMode = 'single_page' | 'two_pages';\n\ninterface PageEditorProps {\n templateConfig: Parameters<typeof buildPageGroupsConfig>[0];\n payload?: any;\n onPayloadChange?: (nextPayload: any) => void;\n pageFormat?: { width: number; height: number; preview?: PreviewMode; bleed?: number; [key: string]: any };\n pageOptions?: Array<PageOption | PayloadOptionDefinition>;\n notifyError?: (message: string) => void;\n referenceRenderer?: ReferenceRenderer;\n renderOverlay?: (args: { pageNo: number; total: number; pageId: string; parent?: PageItem }) => React.ReactNode;\n renderPage?: (args: { page: StandalonePage & { pageNum: number }; parent?: PageItem }) => React.ReactNode;\n menuItems?: React.ReactNode;\n gridColsClass?: string;\n reorderTitle?: string;\n reorderDescription?: string;\n stateKey?: string;\n onItemsChange?: (items: PageItem[], state: PageEditorState) => void;\n onStateChange?: (state: PageEditorState) => void;\n resolveNewItem?: (draft: PageItem) => Promise<PageItem | null | void> | PageItem | null | void;\n pageFilter?: PageFilterConfig; // Filter which pages to render\n printConfigs?: PrintConfigMap; // Unified print configurations (includes filter + pageFormat)\n}\n\ntype PageEditorInnerProps = Omit<PageEditorProps, 'templateConfig'> & {\n initialItems?: PageItem[];\n availableItems?: AvailableItem[];\n pageComponents?: { [pageId: string]: PageComponent };\n};\n\nfunction PageEditorInner({\n initialItems = [],\n availableItems = [],\n pageComponents = {},\n payload,\n pageFormat,\n pageOptions = [],\n notifyError,\n referenceRenderer,\n renderOverlay,\n renderPage,\n menuItems,\n gridColsClass,\n reorderTitle = 'Reorder Pages and Groups',\n reorderDescription = 'Drag and drop to reorder. Groups move as a single unit.',\n stateKey = DEFAULT_PAGE_EDITOR_STATE_KEY,\n onItemsChange,\n onStateChange,\n resolveNewItem,\n pageFilter,\n printConfigs,\n}: PageEditorInnerProps) {\n const setup = pageFormat ?? { width: 210, height: 297 };\n const { interactive, setInteractive, enableDevTools } = useInteractive();\n const shouldHideUI = useShouldHideUI();\n \n // Dev print mode state\n const [devFilter, setDevFilter] = useState<PageFilterConfig | null>(null);\n const [devPageFormat, setDevPageFormat] = useState<any>(null);\n const [devSelectedMode, setDevSelectedMode] = useState<string | undefined>(undefined);\n \n // Use devFilter if set, otherwise use pageFilter prop\n const effectiveFilter = devFilter ?? pageFilter;\n \n // Apply dev pageFormat overrides if set, otherwise use original pageFormat\n const effectivePageFormat = useMemo(() => {\n if (devPageFormat) {\n return { ...setup, ...devPageFormat };\n }\n return setup;\n }, [setup, devPageFormat]);\n \n // Get payload from context if available (preferred), otherwise use prop\n const templateDataContext = useContext(TemplateDataContext);\n const effectivePayload = templateDataContext?.payload ?? payload;\n const [orderDialogOpen, setOrderDialogOpen] = useState(false);\n const preview: PreviewMode = effectivePageFormat?.preview ?? 'single_page';\n const pageSetup = useMemo(\n () => (preview === 'two_pages' ? { ...effectivePageFormat, preview: 'single_page' } : effectivePageFormat),\n [preview, effectivePageFormat]\n );\n\n const normalizedItems = useMemo(() => normalizePageItems(initialItems), [initialItems]);\n const resolvedPageOptions = useMemo(() => {\n if (!pageOptions?.length) return [];\n\n return pageOptions\n .map((option) => {\n if ('getValue' in option) return option;\n\n if (!templateDataContext?.setPageOptionValue) {\n if (isDev() || enableDevTools) {\n console.warn(\n 'PageEditor: payload-backed pageOptions require TemplateDataProvider or payload/onPayloadChange.'\n );\n }\n return null;\n }\n\n return buildPayloadPageOption(\n option,\n templateDataContext.payload,\n templateDataContext.setPageOptionValue\n );\n })\n .filter(Boolean) as PageOption[];\n }, [pageOptions, templateDataContext]);\n\n const {\n items,\n itemsWithPageNum,\n totalPageCount,\n availableItemsToAdd,\n addItem,\n removeItem,\n updateItemFields,\n addDialogOpen,\n setAddDialogOpen,\n openAddDialog,\n itemsForReorder,\n handleReorder,\n defaultRenderThumbnail,\n } = usePageGroups({\n initialItems: normalizedItems,\n availableItems,\n pageComponents,\n payload: effectivePayload,\n setup,\n stateKey,\n onItemsChange,\n onStateChange,\n resolveNewItem,\n notifyError,\n pageFilter: effectiveFilter,\n });\n\n const handlePageOptionChange = React.useCallback(\n (pageOption: PageOption, targetItem: PageItem | undefined, value: string) => {\n if (!targetItem) return;\n\n const patch = pageOption.applyPatch?.(value, targetItem);\n if (patch) {\n updateItemFields(targetItem.id, patch);\n }\n\n pageOption.onChange?.(targetItem.id, value, {\n item: targetItem,\n updateItem: (patch) => updateItemFields(targetItem.id, patch),\n });\n },\n [updateItemFields]\n );\n\n const defaultOverlay = (info: { pageNo: number; total: number }) => (\n <div className=\"absolute bottom-[10mm] left-[15mm] right-[15mm] text-[7pt] text-gray-600 flex items-center justify-between pointer-events-none\">\n <span>Page</span>\n <span>\n {info.pageNo} / {info.total}\n </span>\n </div>\n );\n\n const buildOverlay = (pageNo: number, pageId: string, parent?: PageItem) => {\n if (renderOverlay) {\n return renderOverlay({ pageNo, total: totalPageCount, pageId, parent });\n }\n return defaultOverlay({ pageNo, total: totalPageCount });\n };\n\n const renderPageContent = (page: StandalonePage & { pageNum: number }, parent?: PageItem) => {\n if (renderPage) {\n return renderPage({ page, parent });\n }\n\n const reference = referenceRenderer ? referenceRenderer(page.id) : null;\n const componentKey = page.componentKey ?? page.id;\n const templateId = page.templateId ?? componentKey;\n const PageComponent = pageComponents[componentKey];\n const pagePayload = templateDataContext?.getPagePayload\n ? templateDataContext.getPagePayload(page)\n : resolvePagePayload(effectivePayload, { id: page.id, templateId, componentKey });\n \n // Resolve integration data using utility function\n // For group pages, prefer parent group's integration; fallback to page's own integration\n const integration = resolveIntegrationForPage(\n effectivePayload,\n page,\n parent\n );\n\n const dataBinding = buildPageDataBinding({\n payload: effectivePayload,\n page,\n parentGroup: parent,\n pagePayload,\n });\n\n return (\n <PageCanvas\n pageId={page.id}\n templateId={templateId}\n pageNo={page.pageNum}\n component={PageComponent}\n payload={effectivePayload}\n pagePayload={pagePayload}\n integration={integration}\n page={page}\n parentGroup={parent}\n componentKey={componentKey}\n setup={pageSetup}\n reference={reference}\n overlay={({ pageNo }) => buildOverlay(pageNo, page.id, parent)}\n className={page.className}\n dataBinding={dataBinding}\n />\n );\n };\n\n // Render controls for standalone pages or group pages\n const renderPageControls = (page: StandalonePage & { pageNum: number }, parentGroup?: PageItem) => {\n const isGroupPage = !!parentGroup && isPageGroup(parentGroup);\n const isFirstPageInGroup = isGroupPage && parentGroup.pages[0]?.id === page.id;\n \n // For group pages, only show controls on the first page (group-level controls)\n if (isGroupPage && !isFirstPageInGroup) {\n return (\n <div className=\"pl-0 pr-3 py-1.5 flex justify-between items-center h-10\">\n <div className=\"flex items-center gap-2\">\n <span className=\"page-number\">\n {page.pageNum}\n </span>\n {page.label && (\n <span className=\"text-xs text-gray-500\">\n {page.label}\n </span>\n )}\n <span className=\"text-xs text-gray-400\">·</span>\n </div>\n </div>\n );\n }\n\n // Group-level controls (for first page in group) or standalone page controls\n return (\n <div className=\"pl-0 py-1.5 flex justify-start gap-2 items-center\">\n <div className=\"flex items-center gap-2\">\n <span className=\"page-number\">\n {page.pageNum}\n </span>\n {page.label && (\n <span className=\"text-xs text-gray-500\">\n {page.label}\n </span>\n )}\n {isGroupPage && (\n <Badge \n variant=\"outline\" \n className=\"hidden sm:inline-flex text-xs font-normal text-gray-600 border-gray-200 bg-transparent cursor-pointer hover:bg-gray-50 transition-colors\"\n onClick={() => {\n const currentLabel = parentGroup.label || parentGroup.id;\n const entered = window.prompt('Rename group:', currentLabel);\n if (entered !== null) {\n const trimmed = entered.trim();\n updateItemFields(parentGroup.id, { label: trimmed || undefined });\n }\n }}\n title=\"Click to rename\"\n data-group-id={parentGroup.id}\n >\n {parentGroup.label || parentGroup.id}\n </Badge>\n )}\n </div>\n <div className=\"flex items-center\">\n <PageOptionsDropdown\n pageOptions={resolvedPageOptions}\n targetItem={isGroupPage ? parentGroup : page}\n onChange={handlePageOptionChange}\n onRemove={removeItem}\n showRemove={totalPageCount > 1}\n title={isGroupPage ? \"Group options\" : \"Page options\"}\n removeLabel={isGroupPage ? \"Remove Group\" : \"Remove\"}\n />\n </div>\n </div>\n );\n };\n\n type PageWithParent = (StandalonePage & { pageNum: number }) & {\n parentGroup?: PageItem;\n };\n\n const flattenedPagesForTwoPages = useMemo<PageWithParent[]>(() => {\n if (preview !== 'two_pages') return [];\n\n const flattened: PageWithParent[] = [];\n \n for (const item of itemsWithPageNum) {\n const pages = isPageGroup(item) \n ? (item.pages ?? []) as Array<StandalonePage & { pageNum: number }>\n : [item as StandalonePage & { pageNum: number }];\n\n for (const page of pages) {\n if (page?.id) {\n flattened.push({\n ...page,\n kind: 'page' as const,\n id: page.id,\n pageNum: page.pageNum ?? 1,\n parentGroup: isPageGroup(item) ? item : undefined,\n });\n }\n }\n }\n\n return flattened.sort((a, b) => (a.pageNum ?? 0) - (b.pageNum ?? 0));\n }, [preview, itemsWithPageNum]);\n\n type PagePair = {\n left?: PageWithParent;\n right?: PageWithParent;\n layout: \"spread\" | \"left\" | \"right\";\n };\n\n /**\n * Transform origin logic for two-page spreads:\n * - Even pages (2,4,6...) appear on LEFT side → scale from RIGHT edge (gutter)\n * - Odd pages (1,3,5...) appear on RIGHT side → scale from LEFT edge (gutter)\n * This ensures pages meet precisely at center when zoomed\n */\n const pagePairs = useMemo<PagePair[]>(() => {\n if (preview !== 'two_pages') return [];\n\n const pages = flattenedPagesForTwoPages;\n if (!pages.length) return [];\n \n // Page 1 is always alone on the right (cover)\n const pairs: PagePair[] = [{ left: undefined, right: pages[0], layout: \"right\" }];\n \n // Subsequent pages are paired: 2-3, 4-5, 6-7, etc.\n for (let i = 1; i < pages.length; i += 2) {\n const leftPage = pages[i];\n const rightPage = pages[i + 1];\n \n if (rightPage) {\n pairs.push({ left: leftPage, right: rightPage, layout: \"spread\" });\n } else {\n // Single page at end: even pages go left, odd pages go right\n const isEven = leftPage.pageNum % 2 === 0;\n pairs.push({\n left: isEven ? leftPage : undefined,\n right: isEven ? undefined : leftPage,\n layout: isEven ? \"left\" : \"right\",\n });\n }\n }\n \n return pairs;\n }, [preview, flattenedPagesForTwoPages]);\n\n const defaultMenu = (\n <div className=\"flex items-center gap-1\">\n <Badge variant=\"secondary\" className=\"font-normal text-xs bg-gray-100/80 text-gray-700 border-0\">\n {totalPageCount} {totalPageCount === 1 ? 'Page' : 'Pages'}\n </Badge>\n { enableDevTools && printConfigs && (\n <DevPrintControls\n modes={printConfigs}\n selectedMode={devSelectedMode}\n onModeChange={(mode, config) => {\n setDevSelectedMode(mode);\n setDevFilter(config.filter ?? null);\n setDevPageFormat(config.pageFormat ?? null);\n }}\n interactive={interactive}\n onInteractiveChange={(newInteractive) => {\n setInteractive(newInteractive);\n // Reset pageFormat overrides when going back to edit mode\n if (newInteractive) {\n setDevPageFormat(null);\n }\n }}\n /> \n )} \n {interactive && (\n <>\n <Button\n variant=\"ghost\"\n size=\"sm\"\n onClick={openAddDialog}\n title=\"Add page or group\"\n className=\"text-xs font-medium text-gray-700 hover:bg-gray-100/80 h-7 px-2.5\"\n >\n <Plus className=\"w-3.5 h-3.5\" />\n Add\n </Button>\n <Button\n variant=\"ghost\"\n size=\"sm\"\n onClick={() => setOrderDialogOpen(true)}\n title=\"Reorder pages and groups using drag and drop\"\n className=\"text-xs font-medium text-gray-700 hover:bg-gray-100/80 h-7 px-2.5\"\n >\n <ClipboardList className=\"w-3.5 h-3.5\" />\n Reorder\n </Button>\n </>\n )}\n </div>\n );\n\n return (\n <>\n {/* Back button when in print mode - always rendered, hidden in print output */}\n {enableDevTools && !interactive && (\n <Button\n onClick={() => setInteractive(true)}\n data-uhuu-editor\n size=\"sm\"\n className=\"print:hidden fixed top-4 right-4 z-50 flex items-center gap-1.5 !text-xs rounded-full\"\n title=\"Back to Edit Mode\"\n >\n <X className=\"w-4 h-4\" />\n Back to Editor\n </Button>\n )}\n \n <SectionPageResizer\n defaultZoom={80}\n minZoom={25}\n maxZoom={200}\n menuItems={menuItems ?? defaultMenu}\n onAddPage={openAddDialog}\n preview={preview}\n >\n {preview === 'two_pages' ? (\n pagePairs.map((pair, index) => (\n <TwoPageSection key={`pair-${index}`} layout={pair.layout}>\n {pair.left && (\n <Section\n key={pair.left.id}\n title={`Sheet ${pair.left.pageNum}`}\n controls={renderPageControls(pair.left, pair.left.parentGroup)}\n origin={pair.left.pageNum % 2 === 0 ? 'right' : 'left'}\n >\n {renderPageContent(pair.left, pair.left.parentGroup)}\n </Section>\n )}\n {pair.right && (\n <Section\n key={pair.right.id}\n title={`Sheet ${pair.right.pageNum}`}\n controls={renderPageControls(pair.right, pair.right.parentGroup)}\n origin={pair.right.pageNum % 2 === 0 ? 'right' : 'left'}\n >\n {renderPageContent(pair.right, pair.right.parentGroup)}\n </Section>\n )}\n </TwoPageSection>\n ))\n ) : (\n itemsWithPageNum.map((item) => {\n if (isPageGroup(item)) {\n const pagesWithNumbers = (item.pages ?? []) as Array<StandalonePage & { pageNum: number }>;\n return (\n <PageGroup\n key={item.id}\n group={item}\n pagesWithPageNum={pagesWithNumbers}\n onRemove={removeItem}\n onLabelChange={(groupId, label) => {\n updateItemFields(groupId, { label: label || undefined });\n }}\n totalItems={items.length}\n renderPage={(page) => renderPageContent(page, item)}\n pageOptions={resolvedPageOptions}\n onPageOptionChange={(pageOption, target, value) => handlePageOptionChange(pageOption, target, value)}\n />\n );\n }\n\n const page = item as StandalonePage & { pageNum: number };\n return (\n <Section\n key={page.id}\n title={`Sheet ${page.pageNum}`}\n controls={renderPageControls(page)}\n >\n {renderPageContent(page)}\n </Section>\n );\n })\n )}\n </SectionPageResizer>\n\n {interactive && !shouldHideUI && (\n <>\n <AddPageDialog\n open={addDialogOpen}\n onOpenChange={setAddDialogOpen}\n availableItems={availableItemsToAdd}\n onSelectItem={addItem}\n pageComponents={pageComponents}\n payload={effectivePayload}\n setup={setup}\n gridColsClass={gridColsClass}\n data-uhuu-editor\n />\n\n <PageOrderDialog\n open={orderDialogOpen}\n onOpenChange={setOrderDialogOpen}\n pages={itemsForReorder}\n onReorder={(newOrder) => {\n handleReorder(newOrder);\n setOrderDialogOpen(false);\n }}\n pageComponents={pageComponents}\n payload={effectivePayload}\n setup={setup}\n renderThumbnail={defaultRenderThumbnail}\n title={reorderTitle}\n description={reorderDescription}\n gridColsClass={gridColsClass}\n data-uhuu-editor\n />\n </>\n )}\n </>\n );\n}\n\nfunction PageEditorView(props: PageEditorProps) {\n const { templateConfig, ...rest } = props;\n // Check if TemplateDataProvider already exists in the tree\n const existingContext = useContext(TemplateDataContext);\n \n // If context exists, or if no payload/onPayloadChange is provided, render directly\n // Otherwise, wrap with TemplateDataProvider for automatic payload management\n if (existingContext || (!props.payload && !props.onPayloadChange)) {\n return <PageEditorInner {...rest} />;\n }\n \n // Wrap with TemplateDataProvider to enable automatic payload updates\n // Pass stateKey so it can preserve page editor state correctly\n return (\n <TemplateDataProvider \n payload={props.payload} \n onPayloadChange={props.onPayloadChange}\n stateKey={props.stateKey}\n >\n <PageEditorInner {...rest} />\n </TemplateDataProvider>\n );\n}\n\nexport function PageEditor(props: PageEditorProps) {\n const templateDataContext = useContext(TemplateDataContext);\n const effectivePayload = templateDataContext?.payload ?? props.payload;\n const resolvedConfig = React.useMemo(\n () => buildPageGroupsConfig(props.templateConfig),\n [props.templateConfig]\n );\n const [noticeState, setNoticeState] = React.useState<{ open: boolean; message: string }>({\n open: false,\n message: '',\n });\n\n const notifyError = React.useCallback((message: string) => {\n setNoticeState({ open: true, message });\n }, []);\n\n const restoredItems = React.useMemo(\n () => readPageEditorState(effectivePayload)?.items ?? resolvedConfig.initialItems,\n [effectivePayload, resolvedConfig.initialItems]\n );\n\n return (\n <>\n <PageEditorView\n {...props}\n payload={effectivePayload}\n initialItems={restoredItems}\n availableItems={resolvedConfig.availableItems}\n pageComponents={resolvedConfig.pageComponents}\n notifyError={notifyError}\n />\n\n <AlertDialog\n open={noticeState.open}\n onOpenChange={(open) => {\n if (!open) {\n setNoticeState({ open: false, message: '' });\n }\n }}\n >\n <AlertDialogContent>\n <AlertDialogHeader>\n <AlertDialogTitle>Cannot remove item</AlertDialogTitle>\n <AlertDialogDescription>\n {noticeState.message}\n </AlertDialogDescription>\n </AlertDialogHeader>\n <AlertDialogFooter>\n <AlertDialogAction onClick={() => setNoticeState({ open: false, message: '' })}>\n OK\n </AlertDialogAction>\n </AlertDialogFooter>\n </AlertDialogContent>\n </AlertDialog>\n </>\n );\n}\n\nexport default PageEditor;\n","import * as React from 'react';\nimport type { PageDataBinding } from './data-binding';\nimport { getDialogProps } from '../../editable/dialog-props';\n\n/**\n * Dialog configuration options\n */\nexport type DialogOptions = {\n type?: 'image' | 'text' | 'assistant' | 'markdown' | 'spreadsheet' | 'map';\n imagePath?: string;\n imageGalleryPath?: string;\n ratio?: number;\n rows?: number;\n value?: any;\n payload?: any;\n [key: string]: any;\n};\n\n/**\n * Dialog configuration returned by dialog builders\n */\nexport type DialogConfig = {\n path: string;\n subPath?: string | null;\n imageGalleryPath?: string;\n type?: string;\n imagePath?: string;\n ratio?: number;\n rows?: number;\n value?: any;\n payload?: any;\n [key: string]: any;\n};\n\n/**\n * Config-based resolver: map of keys to path strings or functions\n * Path strings support optional chaining (e.g., 'integration.listing ?? integration.pba_listing')\n */\nexport type IntegrationResolverConfig = {\n [key: string]: string | ((integration: any) => any);\n};\n\n/**\n * Function-based resolver: complex extraction logic\n */\nexport type IntegrationResolverFunction = (\n integration: any,\n payload?: any\n) => any;\n\n/**\n * Union type for resolver\n */\nexport type IntegrationResolver = IntegrationResolverConfig | IntegrationResolverFunction;\n\n/**\n * Gallery path resolver: string path or function\n */\nexport type GalleryPathResolver = string | ((integration: any) => string | null);\n\n/**\n * Integration adapter configuration\n */\nexport type IntegrationAdapterConfig = {\n dataBinding: PageDataBinding;\n integration: any;\n resolver: IntegrationResolver;\n galleryPath?: GalleryPathResolver;\n defaults?: Record<string, any>;\n};\n\n/**\n * Integration adapter API returned by useIntegrationAdapter\n */\nexport type IntegrationAdapter = {\n // Resolved data (e.g., { listing, property, media })\n data: any;\n \n // Dialog builder that automatically uses dataBinding\n dialog: (subPath: string, options?: DialogOptions, value?: any) => DialogConfig | null;\n \n // Dialog props helper (combines dialog + getDialogProps)\n dialogProps: (subPath: string, options?: DialogOptions, value?: any) => Record<string, any>;\n \n // Gallery path (resolved from config or integration structure)\n galleryPath: string | null;\n \n // Integration instance info\n instanceId: string | null;\n integration: any;\n};\n\n/**\n * Evaluate a path string with optional chaining support\n * Supports patterns like: 'integration.listing ?? integration.pba_listing'\n */\nfunction evaluatePathString(path: string, integration: any): any {\n if (!path || !integration) return undefined;\n \n // Handle nullish coalescing operator (??)\n if (path.includes('??')) {\n const parts = path.split('??').map(p => p.trim());\n for (const part of parts) {\n const value = getNestedValue(integration, part);\n if (value !== undefined && value !== null) {\n return value;\n }\n }\n return undefined;\n }\n \n return getNestedValue(integration, path);\n}\n\n/**\n * Get nested value from object using dot notation\n */\nfunction getNestedValue(obj: any, path: string): any {\n if (!path) return obj;\n const keys = path.split('.');\n let current = obj;\n for (const key of keys) {\n if (current == null) return undefined;\n current = current[key];\n }\n return current;\n}\n\n/**\n * Resolve integration data using config-based resolver\n */\nfunction resolveWithConfig(\n config: IntegrationResolverConfig,\n integration: any,\n payload?: any\n): any {\n const result: any = {};\n \n for (const [key, resolver] of Object.entries(config)) {\n if (typeof resolver === 'function') {\n result[key] = resolver(integration);\n } else if (typeof resolver === 'string') {\n // Remove 'integration.' prefix if present (it's implicit)\n const path = resolver.startsWith('integration.') \n ? resolver.slice('integration.'.length)\n : resolver;\n result[key] = evaluatePathString(path, integration);\n }\n }\n \n return result;\n}\n\n/**\n * Resolve integration data using function-based resolver\n */\nfunction resolveWithFunction(\n resolver: IntegrationResolverFunction,\n integration: any,\n payload?: any\n): any {\n return resolver(integration, payload);\n}\n\n/**\n * Resolve integration data using the configured resolver\n */\nfunction resolveIntegrationData(\n resolver: IntegrationResolver,\n integration: any,\n payload?: any\n): any {\n if (typeof resolver === 'function') {\n return resolveWithFunction(resolver, integration, payload);\n } else {\n return resolveWithConfig(resolver, integration, payload);\n }\n}\n\n/**\n * Resolve gallery path from various sources\n */\nfunction resolveGalleryPath(\n dataBinding: PageDataBinding,\n integration: any,\n configGalleryPath?: GalleryPathResolver\n): string | null {\n // Priority 1: dataBinding.defaults.imageGalleryPath (from integration meta/config)\n if (dataBinding?.defaults?.imageGalleryPath) {\n return dataBinding.defaults.imageGalleryPath;\n }\n \n // Priority 2: Config-provided gallery path resolver\n if (configGalleryPath) {\n if (typeof configGalleryPath === 'function') {\n const resolved = configGalleryPath(integration);\n if (resolved) return resolved;\n } else if (typeof configGalleryPath === 'string') {\n return configGalleryPath;\n }\n }\n \n // Priority 3: Try to infer from integration structure\n if (integration?.media?.images) return 'media.images';\n if (integration?.listing?.media?.images) return 'listing.media.images';\n if (integration?.pba_listing?.media?.images) return 'pba_listing.media.images';\n if (integration?.property?.media?.images) return 'property.media.images';\n \n return null;\n}\n\n/**\n * Build integration dialog path using dataBinding\n */\nfunction buildDialogPath(\n dataBinding: PageDataBinding,\n subPath: string,\n isAssistant: boolean\n): string | null {\n if (!dataBinding?.integration?.path) return null;\n \n if (isAssistant) {\n // For assistant dialogs, include subPath in the main path\n return dataBinding.integration.path(subPath);\n } else {\n // For other dialogs, get base path and subPath is handled separately\n return dataBinding.integration.path();\n }\n}\n\n/**\n * Build dialog configuration\n */\nfunction buildDialogConfig(\n dataBinding: PageDataBinding,\n subPath: string,\n options: DialogOptions = {},\n value?: any,\n galleryPath: string | null = null\n): DialogConfig | null {\n const integrationPath = dataBinding?.integration?.path?.();\n if (!integrationPath) return null;\n \n const isAssistant = options.type === 'assistant';\n const isImage = options.type === 'image' || options.imagePath;\n \n // Build the full path\n const fullPath = isAssistant\n ? dataBinding.integration.path(subPath) ?? [integrationPath, subPath].filter(Boolean).join('.')\n : [integrationPath, subPath].filter(Boolean).join('.');\n \n // For image dialogs, resolve gallery path\n if (isImage) {\n const resolvedGalleryPath = options.imageGalleryPath \n ?? (galleryPath ? `${integrationPath}.${galleryPath}` : null)\n ?? dataBinding.defaults.imageGalleryPath;\n \n return {\n path: fullPath,\n imagePath: options.imagePath || 'url',\n imageGalleryPath: resolvedGalleryPath,\n type: options.type || 'image',\n ratio: options.ratio,\n value,\n payload: options.payload ?? dataBinding.payload,\n ...options,\n };\n }\n \n // For assistant dialogs, path includes subPath\n if (isAssistant) {\n return {\n path: fullPath,\n type: 'assistant',\n rows: options.rows,\n value,\n payload: options.payload ?? dataBinding.payload,\n ...options,\n };\n }\n \n // For other dialogs\n return {\n path: integrationPath,\n subPath,\n type: options.type || 'text',\n rows: options.rows,\n value,\n payload: options.payload ?? dataBinding.payload,\n ...options,\n };\n}\n\n/**\n * Hook to create an integration adapter for easy data resolution and dialog building\n * \n * @example\n * ```tsx\n * const adapter = useIntegrationAdapter({\n * dataBinding,\n * integration,\n * resolver: {\n * listing: 'listing ?? pba_listing',\n * property: 'property',\n * media: 'media',\n * },\n * galleryPath: (integration) => {\n * if (integration?.media?.images) return 'media.images';\n * return 'listing.media.images';\n * },\n * });\n * \n * // Use resolved data\n * const { listing, property, media } = adapter.data;\n * \n * // Use dialog props\n * <div {...adapter.dialogProps('overrides.heroImage', { type: 'image', imagePath: 'url' }, heroImage)}>\n * ```\n */\nexport function useIntegrationAdapter(\n config: IntegrationAdapterConfig\n): IntegrationAdapter {\n const { dataBinding, integration, resolver, galleryPath: configGalleryPath, defaults } = config;\n \n // Resolve integration data\n const resolvedData = React.useMemo(() => {\n return resolveIntegrationData(resolver, integration, dataBinding?.payload);\n }, [resolver, integration, dataBinding?.payload]);\n \n // Resolve gallery path\n const galleryPath = React.useMemo(() => {\n return resolveGalleryPath(dataBinding, integration, configGalleryPath);\n }, [dataBinding, integration, configGalleryPath]);\n \n // Dialog builder\n const dialog = React.useCallback(\n (subPath: string, options: DialogOptions = {}, value?: any): DialogConfig | null => {\n return buildDialogConfig(\n dataBinding,\n subPath,\n options,\n value,\n galleryPath\n );\n },\n [dataBinding, galleryPath]\n );\n \n // Dialog props builder (combines dialog + getDialogProps)\n const dialogProps = React.useCallback(\n (subPath: string, options: DialogOptions = {}, value?: any): Record<string, any> => {\n const dialogConfig = dialog(subPath, options, value);\n if (!dialogConfig) return {};\n \n // Use the getDialogProps utility from editable\n // getDialogProps expects { dialog } and optional config\n const props = getDialogProps({ dialog: dialogConfig }, { page: { paginationType: 'static' } });\n \n // Ensure stopPropagation is called on click\n if (props.onClick) {\n const originalOnClick = props.onClick;\n props.onClick = (e: any) => {\n e.stopPropagation();\n originalOnClick(e);\n };\n }\n \n return props;\n },\n [dialog]\n );\n \n return React.useMemo(\n () => ({\n data: resolvedData,\n dialog,\n dialogProps,\n galleryPath,\n instanceId: dataBinding?.integration?.instanceId ?? null,\n integration,\n }),\n [resolvedData, dialog, dialogProps, galleryPath, dataBinding, integration]\n );\n}\n\n","import { useState, forwardRef, useRef, useImperativeHandle, useCallback } from 'react';\nimport { Previewer } from 'pagedjs';\nimport debounce from 'lodash/debounce';\n\nconst PagedComponent = forwardRef(({ children }, ref) => {\n const [rendering, setRendering] = useState(false);\n const containerRef = useRef(null);\n const pageFlowRef = useRef(null);\n\n if (typeof document === 'undefined') {\n return null;\n }\n\n // Expose layout method to parent via ref\n useImperativeHandle(ref, () => ({\n layout: layoutPage,\n }));\n\n // Memoize the layoutPage function with debounce\n const layoutPage = useCallback(\n debounce(() => {\n // Ensure container and flow elements are available\n if (!containerRef.current || !pageFlowRef.current) {\n console.warn(\"Container or page flow reference is missing.\");\n return;\n }\n\n setRendering(true);\n\n const { clientHeight: height, clientWidth: width } = containerRef.current;\n\n // Clear the container before rendering new content\n containerRef.current.innerHTML = '';\n\n // Set fixed width and height to avoid layout issues during rendering\n if (height) containerRef.current.style.minHeight = `${height}px`;\n if (width && window !== window.parent) containerRef.current.style.minWidth = `${width}px`;\n\n // Remove previously inserted paged.js styles\n document.querySelectorAll(\"style[data-pagedjs-inserted-styles]\").forEach((style) => style.remove());\n\n let pageFileName = \"page.css\"\n const paged = new Previewer();\n\n // Wrap in a try-catch to handle errors during preview generation\n try {\n paged.preview(pageFlowRef.current.innerHTML, [pageFileName], containerRef.current).then(() => {\n setRendering(false);\n\n // revert back container minWidth, minHeight after rendering.\n containerRef.current.style.minWidth = 'auto';\n containerRef.current.style.minHeight = 'auto';\n\n // Attach event listeners for elements with \"data-uhuu\" attribute\n document.querySelectorAll(\"[data-uhuu]\").forEach((item) => {\n const clickListener = function () {\n const value = JSON.parse(this.getAttribute(\"data-uhuu\"));\n $uhuu.editDialog(value);\n };\n // Ensure unique listener attachment\n item.removeEventListener('click', clickListener);\n item.addEventListener('click', clickListener);\n });\n\n // Apply custom classes based on page-break-after elements\n document.querySelectorAll(\".page-break-after[data-paged-css]\").forEach((el) => {\n const pagedSheet = el.closest('div.pagedjs_sheet');\n const pagedCSS = el.getAttribute('data-paged-css');\n if (pagedSheet && pagedCSS) {\n pagedCSS.split(' ').filter(Boolean).forEach((cssClass) => pagedSheet.classList.add(cssClass));\n }\n });\n });\n } catch (error) {\n console.error(\"Error during Paged.js preview rendering:\", error);\n setRendering(false);\n }\n }, 500),\n []\n );\n\n return (\n <div className={rendering ? 'rendering uhuu-page' : 'rendered uhuu-page'}>\n {/* Container for Paged.js preview */}\n <div className=\"pagedjs_preview_container\" ref={containerRef}></div>\n\n {/* Hidden flow container for the content */}\n <div style={{display:\"none\"}} ref={pageFlowRef}>\n {children}\n </div>\n </div>\n );\n});\n\nexport default PagedComponent;","// src/index.js\nimport './uhuu/styles/uhuu-editor-theme.css';\nimport PaginationDynamic from './uhuu/pagination-dynamic/pagination-dynamic';\nimport SheetDynamic from './uhuu/pagination-dynamic/sheet-dynamic';\n\n// Group Dynamic components\nexport const Dynamic = {\n Pagination: PaginationDynamic,\n Sheet: SheetDynamic\n};\n\nimport PaginationStatic from './uhuu/pagination-static/pagination-static';\nimport SheetStatic from './uhuu/pagination-static/sheet-static';\n\n// Group Static components\nexport const Static = {\n Pagination: PaginationStatic,\n Sheet: SheetStatic\n};\n\nexport { default as ImageBlock } from './uhuu/image/image-block';\nexport { default as Editable } from './uhuu/editable/editable';\n\n// EditorShell components - only export what templates actually use\nexport { TemplateDataProvider } from './uhuu/editor-shell/document/template-data-provider';\nexport { PageEditor } from './uhuu/editor-shell/document/page-editor';\nexport { InteractiveModeProvider, useInteractive } from './uhuu/editor-shell/interactive-mode-context';\nexport { useIntegrationAdapter } from './uhuu/editor-shell/document/integration-adapter';\n\n// Group EditorShell exports\nimport { TemplateDataProvider } from './uhuu/editor-shell/document/template-data-provider';\nimport { PageEditor } from './uhuu/editor-shell/document/page-editor';\nimport { InteractiveModeProvider, useInteractive } from './uhuu/editor-shell/interactive-mode-context';\nimport { useIntegrationAdapter } from './uhuu/editor-shell/document/integration-adapter';\n\nexport const EditorShell = {\n TemplateDataProvider,\n PageEditor,\n InteractiveModeProvider,\n useInteractive,\n useIntegrationAdapter,\n};\n\n// backwards compatibility\nexport { default as PagedPreview } from './PagedPreview';\n"],"names":["isObject","value","type","isObject_1","freeGlobal","global","_freeGlobal","require$$0","freeSelf","root","_root","now","now_1","reWhitespace","trimmedEndIndex","string","index","_trimmedEndIndex","reTrimStart","baseTrim","_baseTrim","Symbol","_Symbol","objectProto","hasOwnProperty","nativeObjectToString","symToStringTag","getRawTag","isOwn","tag","unmasked","result","_getRawTag","objectToString","_objectToString","require$$1","require$$2","nullTag","undefinedTag","baseGetTag","_baseGetTag","isObjectLike","isObjectLike_1","symbolTag","isSymbol","isSymbol_1","NAN","reIsBadHex","reIsBinary","reIsOctal","freeParseInt","toNumber","other","isBinary","toNumber_1","FUNC_ERROR_TEXT","nativeMax","nativeMin","debounce","func","wait","options","lastArgs","lastThis","maxWait","timerId","lastCallTime","lastInvokeTime","leading","maxing","trailing","invokeFunc","time","args","thisArg","leadingEdge","timerExpired","remainingWait","timeSinceLastCall","timeSinceLastInvoke","timeWaiting","shouldInvoke","trailingEdge","cancel","flush","debounced","isInvoking","debounce_1","DocumentUtils$1","container","height","width","style","item","clickListener","el","pagedSheet","pagedCSS","cssClass","styles","fileName","blob","body","PageSizeUtils","format","orientation","size","mm","dpi","dimensions","paginationType","bleed","showBleed","compatibility","printCssRaw","printCssUrl","preview","ConfigContext","createContext","ConfigProvider","config","children","Pagination","className","setup","rendering","setRendering","useState","containerRef","useRef","contentRef","documentUtilsRef","DocumentUtils","pageRuleRegex","match","sizeAndBleedStyles","existingStyles","newPageRule","layoutPage","paged","Previewer","styleUrls","error","useEffect","jsxs","jsx","Sheet","Compatibility","link","CompatibilityUtils","styleLink","combinedClassName","forwardRef","pageNo","overlay","dataPageKey","ref","useContext","showBleedArea","getDialogProps","props","dialog","e","ImageBleed","BLEED","PAGE_CONTENT_WIDTH","PAGE_CONTENT_HEIGHT","src","backgroundColor","imageW","imageH","imageL","imageR","imageT","imageB","coverClass","setCoverClass","unitFormat","calculateImageHeight","imageWidth","imageHeight","formatStyleValue","_","ratio","imageLoaded","imageClass","InteractiveModeContext","useInteractive","useShouldHideUI","interactive","InteractiveModeProvider","defaultInteractive","enableDevTools","effectiveDefaultInteractive","setInteractive","cn","inputs","twMerge","clsx","buttonVariants","cva","Button","React","variant","DropdownMenu","DropdownMenuPrimitive","DropdownMenuTrigger","DropdownMenuSubTrigger","inset","DropdownMenuSubContent","DropdownMenuContent","sideOffset","DropdownMenuItem","DropdownMenuCheckboxItem","checked","DropdownMenuRadioItem","DropdownMenuLabel","DropdownMenuSeparator","handleOptionSelect","event","option","renderOverlay","overlaySvg","overlayClassName","trimmed","normalizedSvg","attrs","nextAttrs","renderOptionsButton","showOptions","MoreHorizontal","useShouldShowOptions","shouldHideUI","ImageBleedWithOverlay","dialogProps","bleedProps","Fragment","ImageSpread","side","val","calculateImageWidth","createStyle","imageLeft","rightPageOffset","leftStyle","rightStyle","ImageWithOptions","alt","imageClassName","imageStyle","placeholder","imageProps","renderImage","baseDialogProps","mergedDialogProps","merged","key","baseHandler","extraHandler","renderImageContent","imagePropsClassName","imagePropsStyle","finalSrc","finalAlt","mergedImageProps","ImageBlock","computedOverlaySvg","computedOptions","useMemo","annotation","annotationValue","autoOverlaySvg","autoOptions","dialogConfig","annotations","finalOptions","mode","needsImageWithOptions","_mode","left","right","top","bottom","pageWidth","pageHeight","baseProps","spreadComponent","Editable","DEFAULT_PAGE_EDITOR_STATE_KEY","isPageGroup","flattenPages","items","pageNum","page","updatePageNumbers","updatedPages","getTotalPageCount","transformItemsForReorder","strictPosition","firstPage","firstPageComponentKey","pageComponentKey","restoreItemsFromReorder","reorderedItems","originalItems","originalItemsMap","restored","reorderedItem","original","normalizePageItems","_ignored","rest","buildPageEditorState","normalized","readPageEditorState","payload","maybeState","normalizedItems","mergePageEditorStateIntoPayload","state","generateUID","instantiatePage","templateId","componentKey","overrides","instantiateGroup","componentKeys","instanceId","idx","resolvePageIndex","totalPages","isPageInRanges","ranges","range","start","end","getRangesForMode","coverPageCount","filterPageItems","filterConfig","filtered","filteredPages","getIntegrationData","resolveIntegrationInstanceId","parentGroup","resolveIntegrationBinding","resolveIntegrationForPage","buildIntegrationPath","fieldPath","base","parseIntegrationPath","path","integrationPrefix","afterPrefix","dotIndex","setNestedValue","obj","keys","current","i","lastKey","updateIntegrationByPath","parsed","currentIntegration","updatedIntegration","getPagePayload","target","targetId","fallbackId","candidateKeys","TemplateDataContext","getReservedKeys","stateKey","mergeExternalPayload","currentPayload","externalPayload","reservedKeys","TemplateDataProvider","onPayloadChange","setCurrentPayload","lastExternalPayloadRef","isInternalUpdateRef","lastInternalPayloadRef","lastInternalTimestampRef","isInitialMountRef","serializePayload","p","payloadWithoutReservedKeys","currentWithoutReserved","lastInternalWithoutReserved","currentSerialized","lastInternalSerialized","prev","notifyHost","next","setPayload","resolved","finalPayload","setPageOptionValue","pageOrGroupId","setIntegrationPayload","prevIntegrations","setIntegrationPayloadValue","prevIntegration","removeIntegrationPayload","removed","remainingIntegrations","updateIntegrationByDialogPath","mergePageEditorState","effectiveKey","resolvePagePayload","toDefault","def","parseValue","raw","buildPayloadPageOption","field","stored","ZoomContext","TwoPageSection","layout","scaleValue","pairRef","updatePairWidth","sections","totalNaturalWidth","sum","section","scaledWidth","resizeObserver","Section","title","controls","origin","hideUI","contentHeight","setContentHeight","contentWidth","setContentWidth","updateDimensions","element","originalTransform","naturalHeight","naturalWidth","scaledHeight","alignmentMap","contentAlignClass","transformOrigin","SectionPageResizer","defaultZoom","minZoom","maxZoom","onAddPage","menuItems","hideUIProp","zoom","setZoom","fitMode","setFitMode","autoFitInitialized","setAutoFitInitialized","lastContainerWidth","setLastContainerWidth","isInitializing","setIsInitializing","calculateFitZoom","firstSection","availableWidth","availableHeight","scaleX","scaleY","handleFitMode","newZoom","zoomIn","zoomOut","handleInitialization","currentContainerWidth","sectionWidth","handleResize","ChevronDown","UnfoldHorizontal","UnfoldVertical","Maximize","ZoomOut","clampedValue","ZoomIn","Plus","SheetPrimitive","SheetPortal","SheetOverlay","SheetContent","XIcon","SheetHeader","SheetFooter","SheetTitle","SheetDescription","createDefaultRenderThumbnail","pageComponents","thumbnailWidth","thumbnailHeight","pageWidthMm","pageHeightMm","pageAspectRatio","finalThumbnailWidth","finalThumbnailHeight","pageWidthPx","pageHeightPx","isDragging","isLocked","firstPageId","firstPagePayload","FirstPageComponent","integration","Lock","pageId","pagePayload","PageComponent","AddPageDialog","open","onOpenChange","availableItems","onSelectItem","gridColsClass","handleSelect","defaultRenderThumbnail","toReorderItem","group","pageItem","isGroup","id","label","pageCount","SortableItem","renderItem","renderDragIndicator","keyExtractor","disabled","attributes","listeners","setNodeRef","transform","transition","useSortable","CSS","DragOverlayItem","DragDropGrid","initialItems","onChange","renderToolbar","renderEmptyState","showDebugInfo","renderDragOverlay","isItemDisabled","canDropAt","setItems","activeId","setActiveId","sensors","useSensors","useSensor","PointerSensor","KeyboardSensor","sortableKeyboardCoordinates","handleDragStart","draggedItem","handleDragEnd","active","over","oldIndex","newIndex","newItems","arrayMove","activeItem","activeIndex","DndContext","closestCenter","SortableContext","rectSortingStrategy","DragOverlay","badgeVariants","Badge","DefaultPageThumbnail","GripVertical","PageOrderDialog","pages","onReorder","renderThumbnail","description","localPages","setLocalPages","hasChanges","setHasChanges","handleLocalReorder","newOrder","handleSave","handleCancel","renderPageThumbnail","ArrowUpDown","targetIndex","draggedPosition","startEndIndex","endStartIndex","position","newOpen","Select","Switch","SwitchPrimitive","Slider","SliderPrimitive","Label","LabelPrimitive","PageOptionsRenderer","pageOptions","targetItem","matchesTarget","applicableOptions","renderOption","currentValue","opt","boolValue","numValue","values","newValue","Minus","stringValue","color","isSelected","Check","PageOptionsDropdown","onRemove","showRemove","removeLabel","triggerClassName","Trash2","PageGroup","pagesWithPageNum","totalItems","renderPage","onPageOptionChange","onLabelChange","handleLabelClick","currentLabel","entered","indexInGroup","isFirstPage","PageCanvas","reference","dataBinding","pageKey","usePageGroups","onItemsChange","onStateChange","resolveNewItem","notifyError","pageFilter","addDialogOpen","setAddDialogOpen","templateDataContext","updateItems","useCallback","instanceCountsByTemplate","counts","pageTemplateId","availableItemsToAdd","count","isRepeatable","maxInstances","groupItem","totalPageCount","addItem","resolveIntegrationMode","draft","available","groupConfig","debugIntegration","integrationData","integrationMode","shouldAbort","requestIntegration","finalItem","itemToInsert","itemPosition","startItems","middleItems","endItems","removeItem","itemId","showError","message","updateItemFields","patch","reorderItems","itemsWithPageNum","itemsWithNumbers","renderItems","rendered","itemsForReorder","handleReorder","itemsToOrder","openAddDialog","buildPath","subPath","resolveGalleryPath","defaults","buildPageDataBinding","integrationBinding","groupId","pageBase","groupBase","asPage","isInitial","templateLookup","templateConfig","repeatable","component","asGroup","normalizeGroups","groups","buildPageGroupsConfig","initial","pageComponentKeys","explicitPageComponents","normalizedGroups","groupMap","inferredPageComponentKeys","mergedPageComponents","maybeGroup","availableGroupItems","AlertDialog","AlertDialogPrimitive","AlertDialogPortal","AlertDialogOverlay","AlertDialogContent","AlertDialogHeader","AlertDialogFooter","AlertDialogTitle","AlertDialogDescription","AlertDialogAction","AlertDialogCancel","DevPrintControls","modes","selectedModeProp","onModeChange","onInteractiveChange","modeKeys","currentMode","handleModeSelect","currentModeLabel","Printer","isDev","hostname","PageEditorInner","pageFormat","referenceRenderer","reorderTitle","reorderDescription","printConfigs","devFilter","setDevFilter","devPageFormat","setDevPageFormat","devSelectedMode","setDevSelectedMode","effectiveFilter","effectivePageFormat","effectivePayload","orderDialogOpen","setOrderDialogOpen","pageSetup","resolvedPageOptions","handlePageOptionChange","pageOption","defaultOverlay","info","buildOverlay","parent","renderPageContent","renderPageControls","isGroupPage","isFirstPageInGroup","flattenedPagesForTwoPages","flattened","a","b","pagePairs","pairs","leftPage","rightPage","isEven","X","newInteractive","ClipboardList","pair","pagesWithNumbers","PageEditorView","PageEditor","resolvedConfig","noticeState","setNoticeState","restoredItems","evaluatePathString","parts","part","getNestedValue","resolveWithConfig","resolver","resolveWithFunction","resolveIntegrationData","configGalleryPath","buildDialogConfig","galleryPath","integrationPath","isAssistant","isImage","fullPath","resolvedGalleryPath","useIntegrationAdapter","resolvedData","originalOnClick","PagedComponent","pageFlowRef","useImperativeHandle","pageFileName","Dynamic","PaginationDynamic","SheetDynamic","Static","PaginationStatic","SheetStatic","EditorShell"],"mappings":"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","x_google_ignoreList":[0,1,2,3,4,5,6,7,8,9,10,11,12,13]}
|
|
1
|
+
{"version":3,"file":"uhuu-components.es.js","sources":["../node_modules/lodash/isObject.js","../node_modules/lodash/_freeGlobal.js","../node_modules/lodash/_root.js","../node_modules/lodash/now.js","../node_modules/lodash/_trimmedEndIndex.js","../node_modules/lodash/_baseTrim.js","../node_modules/lodash/_Symbol.js","../node_modules/lodash/_getRawTag.js","../node_modules/lodash/_objectToString.js","../node_modules/lodash/_baseGetTag.js","../node_modules/lodash/isObjectLike.js","../node_modules/lodash/isSymbol.js","../node_modules/lodash/toNumber.js","../node_modules/lodash/debounce.js","../src/uhuu/pagination-dynamic/pagination/DocumentUtils.ts","../src/uhuu/utility/PageSizeUtils.js","../src/uhuu/config/config-provider.tsx","../src/uhuu/pagination-dynamic/pagination-dynamic.tsx","../src/uhuu/pagination-dynamic/sheet-dynamic.tsx","../src/uhuu/pagination-static/pagination/CompatibilityUtils.ts","../src/uhuu/pagination-static/pagination/DocumentUtils.ts","../src/uhuu/pagination-static/pagination-static.tsx","../src/uhuu/pagination-static/sheet-static.tsx","../src/uhuu/editable/dialog-props.js","../src/uhuu/image/image-bleed.tsx","../src/uhuu/editor-shell/interactive-mode-context.tsx","../src/uhuu/ui/cn.ts","../src/uhuu/ui/button.tsx","../src/uhuu/ui/dropdown-menu.tsx","../src/uhuu/image/image-overlay-utils.tsx","../src/uhuu/image/image-bleed-with-overlay.tsx","../src/uhuu/image/image-spread.tsx","../src/uhuu/image/image-with-options.tsx","../src/uhuu/image/image-block.tsx","../src/uhuu/editable/editable.tsx","../src/uhuu/editor-shell/document/page-group-utils.ts","../src/uhuu/editor-shell/document/integration-utils.ts","../src/uhuu/editor-shell/document/template-data-provider.tsx","../src/uhuu/editor-shell/resizers/section-page-resizer.tsx","../src/uhuu/ui/sheet.tsx","../src/uhuu/editor-shell/document/default-render-thumbnail.tsx","../src/uhuu/editor-shell/document/add-page-dialog.tsx","../src/uhuu/utility/drag-drop-grid.tsx","../src/uhuu/ui/badge.tsx","../src/uhuu/editor-shell/document/page-order-dialog.tsx","../src/uhuu/ui/select.tsx","../src/uhuu/ui/switch.tsx","../src/uhuu/ui/slider.tsx","../src/uhuu/ui/label.tsx","../src/uhuu/editor-shell/document/page-options-renderer.tsx","../src/uhuu/editor-shell/document/page-options-dropdown.tsx","../src/uhuu/editor-shell/document/page-group.tsx","../src/uhuu/editor-shell/document/page-canvas.tsx","../src/uhuu/editor-shell/document/use-page-groups.ts","../src/uhuu/editor-shell/document/data-binding.ts","../src/uhuu/editor-shell/document/page-group-presets.ts","../src/uhuu/ui/alert-dialog.tsx","../src/uhuu/editor-shell/document/dev-print-controls.tsx","../src/uhuu/utility/is-dev.ts","../src/uhuu/editor-shell/document/page-editor.tsx","../src/uhuu/editor-shell/document/integration-adapter.ts","../src/PagedPreview.jsx","../src/index.js"],"sourcesContent":["/**\n * Checks if `value` is the\n * [language type](http://www.ecma-international.org/ecma-262/7.0/#sec-ecmascript-language-types)\n * of `Object`. (e.g. arrays, functions, objects, regexes, `new Number(0)`, and `new String('')`)\n *\n * @static\n * @memberOf _\n * @since 0.1.0\n * @category Lang\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is an object, else `false`.\n * @example\n *\n * _.isObject({});\n * // => true\n *\n * _.isObject([1, 2, 3]);\n * // => true\n *\n * _.isObject(_.noop);\n * // => true\n *\n * _.isObject(null);\n * // => false\n */\nfunction isObject(value) {\n var type = typeof value;\n return value != null && (type == 'object' || type == 'function');\n}\n\nmodule.exports = isObject;\n","/** Detect free variable `global` from Node.js. */\nvar freeGlobal = typeof global == 'object' && global && global.Object === Object && global;\n\nmodule.exports = freeGlobal;\n","var freeGlobal = require('./_freeGlobal');\n\n/** Detect free variable `self`. */\nvar freeSelf = typeof self == 'object' && self && self.Object === Object && self;\n\n/** Used as a reference to the global object. */\nvar root = freeGlobal || freeSelf || Function('return this')();\n\nmodule.exports = root;\n","var root = require('./_root');\n\n/**\n * Gets the timestamp of the number of milliseconds that have elapsed since\n * the Unix epoch (1 January 1970 00:00:00 UTC).\n *\n * @static\n * @memberOf _\n * @since 2.4.0\n * @category Date\n * @returns {number} Returns the timestamp.\n * @example\n *\n * _.defer(function(stamp) {\n * console.log(_.now() - stamp);\n * }, _.now());\n * // => Logs the number of milliseconds it took for the deferred invocation.\n */\nvar now = function() {\n return root.Date.now();\n};\n\nmodule.exports = now;\n","/** Used to match a single whitespace character. */\nvar reWhitespace = /\\s/;\n\n/**\n * Used by `_.trim` and `_.trimEnd` to get the index of the last non-whitespace\n * character of `string`.\n *\n * @private\n * @param {string} string The string to inspect.\n * @returns {number} Returns the index of the last non-whitespace character.\n */\nfunction trimmedEndIndex(string) {\n var index = string.length;\n\n while (index-- && reWhitespace.test(string.charAt(index))) {}\n return index;\n}\n\nmodule.exports = trimmedEndIndex;\n","var trimmedEndIndex = require('./_trimmedEndIndex');\n\n/** Used to match leading whitespace. */\nvar reTrimStart = /^\\s+/;\n\n/**\n * The base implementation of `_.trim`.\n *\n * @private\n * @param {string} string The string to trim.\n * @returns {string} Returns the trimmed string.\n */\nfunction baseTrim(string) {\n return string\n ? string.slice(0, trimmedEndIndex(string) + 1).replace(reTrimStart, '')\n : string;\n}\n\nmodule.exports = baseTrim;\n","var root = require('./_root');\n\n/** Built-in value references. */\nvar Symbol = root.Symbol;\n\nmodule.exports = Symbol;\n","var Symbol = require('./_Symbol');\n\n/** Used for built-in method references. */\nvar objectProto = Object.prototype;\n\n/** Used to check objects for own properties. */\nvar hasOwnProperty = objectProto.hasOwnProperty;\n\n/**\n * Used to resolve the\n * [`toStringTag`](http://ecma-international.org/ecma-262/7.0/#sec-object.prototype.tostring)\n * of values.\n */\nvar nativeObjectToString = objectProto.toString;\n\n/** Built-in value references. */\nvar symToStringTag = Symbol ? Symbol.toStringTag : undefined;\n\n/**\n * A specialized version of `baseGetTag` which ignores `Symbol.toStringTag` values.\n *\n * @private\n * @param {*} value The value to query.\n * @returns {string} Returns the raw `toStringTag`.\n */\nfunction getRawTag(value) {\n var isOwn = hasOwnProperty.call(value, symToStringTag),\n tag = value[symToStringTag];\n\n try {\n value[symToStringTag] = undefined;\n var unmasked = true;\n } catch (e) {}\n\n var result = nativeObjectToString.call(value);\n if (unmasked) {\n if (isOwn) {\n value[symToStringTag] = tag;\n } else {\n delete value[symToStringTag];\n }\n }\n return result;\n}\n\nmodule.exports = getRawTag;\n","/** Used for built-in method references. */\nvar objectProto = Object.prototype;\n\n/**\n * Used to resolve the\n * [`toStringTag`](http://ecma-international.org/ecma-262/7.0/#sec-object.prototype.tostring)\n * of values.\n */\nvar nativeObjectToString = objectProto.toString;\n\n/**\n * Converts `value` to a string using `Object.prototype.toString`.\n *\n * @private\n * @param {*} value The value to convert.\n * @returns {string} Returns the converted string.\n */\nfunction objectToString(value) {\n return nativeObjectToString.call(value);\n}\n\nmodule.exports = objectToString;\n","var Symbol = require('./_Symbol'),\n getRawTag = require('./_getRawTag'),\n objectToString = require('./_objectToString');\n\n/** `Object#toString` result references. */\nvar nullTag = '[object Null]',\n undefinedTag = '[object Undefined]';\n\n/** Built-in value references. */\nvar symToStringTag = Symbol ? Symbol.toStringTag : undefined;\n\n/**\n * The base implementation of `getTag` without fallbacks for buggy environments.\n *\n * @private\n * @param {*} value The value to query.\n * @returns {string} Returns the `toStringTag`.\n */\nfunction baseGetTag(value) {\n if (value == null) {\n return value === undefined ? undefinedTag : nullTag;\n }\n return (symToStringTag && symToStringTag in Object(value))\n ? getRawTag(value)\n : objectToString(value);\n}\n\nmodule.exports = baseGetTag;\n","/**\n * Checks if `value` is object-like. A value is object-like if it's not `null`\n * and has a `typeof` result of \"object\".\n *\n * @static\n * @memberOf _\n * @since 4.0.0\n * @category Lang\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is object-like, else `false`.\n * @example\n *\n * _.isObjectLike({});\n * // => true\n *\n * _.isObjectLike([1, 2, 3]);\n * // => true\n *\n * _.isObjectLike(_.noop);\n * // => false\n *\n * _.isObjectLike(null);\n * // => false\n */\nfunction isObjectLike(value) {\n return value != null && typeof value == 'object';\n}\n\nmodule.exports = isObjectLike;\n","var baseGetTag = require('./_baseGetTag'),\n isObjectLike = require('./isObjectLike');\n\n/** `Object#toString` result references. */\nvar symbolTag = '[object Symbol]';\n\n/**\n * Checks if `value` is classified as a `Symbol` primitive or object.\n *\n * @static\n * @memberOf _\n * @since 4.0.0\n * @category Lang\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is a symbol, else `false`.\n * @example\n *\n * _.isSymbol(Symbol.iterator);\n * // => true\n *\n * _.isSymbol('abc');\n * // => false\n */\nfunction isSymbol(value) {\n return typeof value == 'symbol' ||\n (isObjectLike(value) && baseGetTag(value) == symbolTag);\n}\n\nmodule.exports = isSymbol;\n","var baseTrim = require('./_baseTrim'),\n isObject = require('./isObject'),\n isSymbol = require('./isSymbol');\n\n/** Used as references for various `Number` constants. */\nvar NAN = 0 / 0;\n\n/** Used to detect bad signed hexadecimal string values. */\nvar reIsBadHex = /^[-+]0x[0-9a-f]+$/i;\n\n/** Used to detect binary string values. */\nvar reIsBinary = /^0b[01]+$/i;\n\n/** Used to detect octal string values. */\nvar reIsOctal = /^0o[0-7]+$/i;\n\n/** Built-in method references without a dependency on `root`. */\nvar freeParseInt = parseInt;\n\n/**\n * Converts `value` to a number.\n *\n * @static\n * @memberOf _\n * @since 4.0.0\n * @category Lang\n * @param {*} value The value to process.\n * @returns {number} Returns the number.\n * @example\n *\n * _.toNumber(3.2);\n * // => 3.2\n *\n * _.toNumber(Number.MIN_VALUE);\n * // => 5e-324\n *\n * _.toNumber(Infinity);\n * // => Infinity\n *\n * _.toNumber('3.2');\n * // => 3.2\n */\nfunction toNumber(value) {\n if (typeof value == 'number') {\n return value;\n }\n if (isSymbol(value)) {\n return NAN;\n }\n if (isObject(value)) {\n var other = typeof value.valueOf == 'function' ? value.valueOf() : value;\n value = isObject(other) ? (other + '') : other;\n }\n if (typeof value != 'string') {\n return value === 0 ? value : +value;\n }\n value = baseTrim(value);\n var isBinary = reIsBinary.test(value);\n return (isBinary || reIsOctal.test(value))\n ? freeParseInt(value.slice(2), isBinary ? 2 : 8)\n : (reIsBadHex.test(value) ? NAN : +value);\n}\n\nmodule.exports = toNumber;\n","var isObject = require('./isObject'),\n now = require('./now'),\n toNumber = require('./toNumber');\n\n/** Error message constants. */\nvar FUNC_ERROR_TEXT = 'Expected a function';\n\n/* Built-in method references for those with the same name as other `lodash` methods. */\nvar nativeMax = Math.max,\n nativeMin = Math.min;\n\n/**\n * Creates a debounced function that delays invoking `func` until after `wait`\n * milliseconds have elapsed since the last time the debounced function was\n * invoked. The debounced function comes with a `cancel` method to cancel\n * delayed `func` invocations and a `flush` method to immediately invoke them.\n * Provide `options` to indicate whether `func` should be invoked on the\n * leading and/or trailing edge of the `wait` timeout. The `func` is invoked\n * with the last arguments provided to the debounced function. Subsequent\n * calls to the debounced function return the result of the last `func`\n * invocation.\n *\n * **Note:** If `leading` and `trailing` options are `true`, `func` is\n * invoked on the trailing edge of the timeout only if the debounced function\n * is invoked more than once during the `wait` timeout.\n *\n * If `wait` is `0` and `leading` is `false`, `func` invocation is deferred\n * until to the next tick, similar to `setTimeout` with a timeout of `0`.\n *\n * See [David Corbacho's article](https://css-tricks.com/debouncing-throttling-explained-examples/)\n * for details over the differences between `_.debounce` and `_.throttle`.\n *\n * @static\n * @memberOf _\n * @since 0.1.0\n * @category Function\n * @param {Function} func The function to debounce.\n * @param {number} [wait=0] The number of milliseconds to delay.\n * @param {Object} [options={}] The options object.\n * @param {boolean} [options.leading=false]\n * Specify invoking on the leading edge of the timeout.\n * @param {number} [options.maxWait]\n * The maximum time `func` is allowed to be delayed before it's invoked.\n * @param {boolean} [options.trailing=true]\n * Specify invoking on the trailing edge of the timeout.\n * @returns {Function} Returns the new debounced function.\n * @example\n *\n * // Avoid costly calculations while the window size is in flux.\n * jQuery(window).on('resize', _.debounce(calculateLayout, 150));\n *\n * // Invoke `sendMail` when clicked, debouncing subsequent calls.\n * jQuery(element).on('click', _.debounce(sendMail, 300, {\n * 'leading': true,\n * 'trailing': false\n * }));\n *\n * // Ensure `batchLog` is invoked once after 1 second of debounced calls.\n * var debounced = _.debounce(batchLog, 250, { 'maxWait': 1000 });\n * var source = new EventSource('/stream');\n * jQuery(source).on('message', debounced);\n *\n * // Cancel the trailing debounced invocation.\n * jQuery(window).on('popstate', debounced.cancel);\n */\nfunction debounce(func, wait, options) {\n var lastArgs,\n lastThis,\n maxWait,\n result,\n timerId,\n lastCallTime,\n lastInvokeTime = 0,\n leading = false,\n maxing = false,\n trailing = true;\n\n if (typeof func != 'function') {\n throw new TypeError(FUNC_ERROR_TEXT);\n }\n wait = toNumber(wait) || 0;\n if (isObject(options)) {\n leading = !!options.leading;\n maxing = 'maxWait' in options;\n maxWait = maxing ? nativeMax(toNumber(options.maxWait) || 0, wait) : maxWait;\n trailing = 'trailing' in options ? !!options.trailing : trailing;\n }\n\n function invokeFunc(time) {\n var args = lastArgs,\n thisArg = lastThis;\n\n lastArgs = lastThis = undefined;\n lastInvokeTime = time;\n result = func.apply(thisArg, args);\n return result;\n }\n\n function leadingEdge(time) {\n // Reset any `maxWait` timer.\n lastInvokeTime = time;\n // Start the timer for the trailing edge.\n timerId = setTimeout(timerExpired, wait);\n // Invoke the leading edge.\n return leading ? invokeFunc(time) : result;\n }\n\n function remainingWait(time) {\n var timeSinceLastCall = time - lastCallTime,\n timeSinceLastInvoke = time - lastInvokeTime,\n timeWaiting = wait - timeSinceLastCall;\n\n return maxing\n ? nativeMin(timeWaiting, maxWait - timeSinceLastInvoke)\n : timeWaiting;\n }\n\n function shouldInvoke(time) {\n var timeSinceLastCall = time - lastCallTime,\n timeSinceLastInvoke = time - lastInvokeTime;\n\n // Either this is the first call, activity has stopped and we're at the\n // trailing edge, the system time has gone backwards and we're treating\n // it as the trailing edge, or we've hit the `maxWait` limit.\n return (lastCallTime === undefined || (timeSinceLastCall >= wait) ||\n (timeSinceLastCall < 0) || (maxing && timeSinceLastInvoke >= maxWait));\n }\n\n function timerExpired() {\n var time = now();\n if (shouldInvoke(time)) {\n return trailingEdge(time);\n }\n // Restart the timer.\n timerId = setTimeout(timerExpired, remainingWait(time));\n }\n\n function trailingEdge(time) {\n timerId = undefined;\n\n // Only invoke if we have `lastArgs` which means `func` has been\n // debounced at least once.\n if (trailing && lastArgs) {\n return invokeFunc(time);\n }\n lastArgs = lastThis = undefined;\n return result;\n }\n\n function cancel() {\n if (timerId !== undefined) {\n clearTimeout(timerId);\n }\n lastInvokeTime = 0;\n lastArgs = lastCallTime = lastThis = timerId = undefined;\n }\n\n function flush() {\n return timerId === undefined ? result : trailingEdge(now());\n }\n\n function debounced() {\n var time = now(),\n isInvoking = shouldInvoke(time);\n\n lastArgs = arguments;\n lastThis = this;\n lastCallTime = time;\n\n if (isInvoking) {\n if (timerId === undefined) {\n return leadingEdge(lastCallTime);\n }\n if (maxing) {\n // Handle invocations in a tight loop.\n clearTimeout(timerId);\n timerId = setTimeout(timerExpired, wait);\n return invokeFunc(lastCallTime);\n }\n }\n if (timerId === undefined) {\n timerId = setTimeout(timerExpired, wait);\n }\n return result;\n }\n debounced.cancel = cancel;\n debounced.flush = flush;\n return debounced;\n}\n\nmodule.exports = debounce;\n","declare const $uhuu: {\n editDialog: (value: any) => void;\n};\n\nclass DocumentUtils {\n prepareRendering(container: HTMLElement) { \n const { clientHeight: height, clientWidth: width } = container;\n container.innerHTML = '';\n if (height) container.style.minHeight = `${height}px`;\n if (width && window !== window.parent) container.style.minWidth = `${width}px`;\n document?.querySelectorAll(\"style[data-pagedjs-inserted-styles]\").forEach((style) => style.remove());\n this.resetZoom();\n }\n\n finalizeRendering(container: HTMLElement) { \n if (container) {\n container.style.minWidth = 'auto';\n container.style.minHeight = 'auto';\n }\n this.attachEventListeners();\n this.applyPagedCSS();\n this.restoreZoom();\n }\n\n attachEventListeners() { \n document?.querySelectorAll(\"[data-uhuu]\").forEach((item) => {\n const clickListener = function () {\n const value = JSON.parse(this.getAttribute(\"data-uhuu\"));\n $uhuu.editDialog(value);\n };\n item.removeEventListener('click', clickListener);\n item.addEventListener('click', clickListener);\n });\n }\n\n applyPagedCSS() { \n document?.querySelectorAll(\".page-break-after[data-paged-css]\").forEach((el) => {\n const pagedSheet = el.closest('div.pagedjs_sheet');\n const pagedCSS = el.getAttribute('data-paged-css');\n if (pagedSheet && pagedCSS) {\n pagedCSS.split(' ').filter(Boolean).forEach((cssClass) => pagedSheet.classList.add(cssClass));\n }\n });\n }\n\n getStyleUrls(styles: string, fileName: string) {\n if (styles) {\n const blob = new Blob([styles], { type: 'text/css' });\n return [URL.createObjectURL(blob)];\n }\n return fileName ? [fileName] : [];\n };\n\n private originalStyles: {\n width: string;\n height: string; \n transform: string;\n transformOrigin: string;\n };\n\n resetZoom() {\n if (typeof document === 'undefined') return;\n \n const body = document?.body;\n if(!body.style.transform) { \n return; \n }\n \n this.originalStyles = {\n width: body.style.width,\n height: body.style.height,\n transform: body.style.transform,\n transformOrigin: body.style.transformOrigin || 'center center'\n };\n\n body.style.opacity = '0';\n body.style.width = '100%';\n body.style.height = '100%';\n body.style.transform = '';\n }\n\n restoreZoom() { \n if (typeof document === 'undefined') return;\n \n const body = document?.body;\n body.style.opacity = '1';\n\n if(!this.originalStyles?.transform) return; \n body.style.width = this.originalStyles.width;\n body.style.height = this.originalStyles.height;\n body.style.transform = this.originalStyles.transform; \n }\n}\n\nexport default DocumentUtils;","/**\n * Standard page size calculations in millimeters\n */\nexport class PageSizeUtils {\n static PAGE_SIZES = {\n // A series\n 'A0': { width: 841, height: 1189 },\n 'A1': { width: 594, height: 841 },\n 'A2': { width: 420, height: 594 },\n 'A3': { width: 297, height: 420 },\n 'A4': { width: 210, height: 297 },\n 'A5': { width: 148, height: 210 },\n 'A6': { width: 105, height: 148 },\n \n // B series\n 'B0': { width: 1000, height: 1414 },\n 'B1': { width: 707, height: 1000 },\n 'B2': { width: 500, height: 707 },\n 'B3': { width: 353, height: 500 },\n 'B4': { width: 250, height: 353 },\n 'B5': { width: 176, height: 250 },\n 'B6': { width: 125, height: 176 },\n \n // C series (envelopes)\n 'C0': { width: 917, height: 1297 },\n 'C1': { width: 648, height: 917 },\n 'C2': { width: 458, height: 648 },\n 'C3': { width: 324, height: 458 },\n 'C4': { width: 229, height: 324 },\n 'C5': { width: 162, height: 229 },\n 'C6': { width: 114, height: 162 },\n \n // US Sizes\n 'LETTER': { width: 216, height: 279 },\n 'LEGAL': { width: 216, height: 356 },\n 'TABLOID': { width: 279, height: 432 },\n 'LEDGER': { width: 432, height: 279 }\n };\n /**\n * Get all available page size format names\n * @returns {string[]} Array of page size format names\n */\n static getStandardFormats() {\n return ['Custom', 'A3', 'A4', 'A5', 'LETTER', 'LEGAL'];\n }\n\n /**\n * Get dimensions for a specific page size\n * @param {Object} options - Configuration options\n * @param {string} options.format - Page size format (e.g., 'A4', 'LETTER')\n * @param {string} [options.orientation='portrait'] - Page orientation ('portrait' or 'landscape')\n * @returns {{ width: number, height: number } | null} Dimensions in millimeters\n */\n static getDimensions({ \n format, \n orientation = 'portrait'\n }) {\n const size = this.PAGE_SIZES[format.toUpperCase()];\n if (!size) return null;\n\n return orientation === 'landscape' ? \n { \n width: size.height, \n height: size.width\n } : \n { \n width: size.width, \n height: size.height\n };\n }\n\n /**\n * Convert millimeters to pixels at a given DPI\n * @param {number} mm - Value in millimeters\n * @param {number} dpi - Dots per inch (default: 72)\n * @returns {number} Value in pixels\n */\n static mmToPx(mm, dpi = 72) {\n return (mm * dpi) / 25.4;\n }\n\n /**\n * Get dimensions in pixels for a specific page size\n * @param {Object} options - Configuration options\n * @param {string} options.format - Page size format (e.g., 'A4', 'LETTER')\n * @param {string} [options.orientation='portrait'] - Page orientation ('portrait' or 'landscape')\n * @param {number} [options.dpi=72] - Dots per inch\n * @returns {{ width: number, height: number } | null} Dimensions in pixels\n */\n static getDimensionsInPx({ \n format, \n orientation = 'portrait', \n dpi = 72\n }) {\n const dimensions = this.getDimensions({ \n format, \n orientation\n });\n if (!dimensions) return null;\n\n return {\n width: this.mmToPx(dimensions.width, dpi),\n height: this.mmToPx(dimensions.height, dpi)\n };\n }\n\n /**\n * Check if a format exists\n * @param {string} format - Page size format to check\n * @returns {boolean} Whether the format exists\n */\n static hasFormat(format) {\n return format.toUpperCase() in this.PAGE_SIZES;\n }\n\n /**\n * Get all available formats\n * @returns {string[]} Array of available format names\n */\n static getAvailableFormats() {\n return Object.keys(this.PAGE_SIZES);\n }\n\n static pageParams(paginationType, args) {\n if (typeof document === 'undefined') return;\n \n const {format, orientation, width, height, bleed, showBleed, compatibility, printCssRaw, printCssUrl, preview} = args;\n const dimensions = (!format || format.toLowerCase() === 'custom') && width && height && width > 10 && height > 10 && width < 4000 && height < 4000\n ? { width, height } \n : this.getDimensions({ format: format ?? 'A4', orientation });\n\n\n if (dimensions) {\n document.documentElement.style.setProperty('--uhuu-page-width', `${dimensions.width}mm`);\n document.documentElement.style.setProperty('--uhuu-page-height', `${dimensions.height}mm`); \n }\n\n document.documentElement.style.setProperty('--uhuu-page-bleed', `${Math.min(Math.max(bleed ?? 0, 0), 400)}mm`);\n\n const page = { \n paginationType,\n format, \n orientation, \n bleed, \n width: dimensions?.width, \n height: dimensions?.height, \n preview, \n showBleed,\n compatibility,\n printCssRaw,\n printCssUrl \n };\n\n return { page }; \n }\n}\n\nexport default PageSizeUtils;","import React, { createContext } from 'react';\n\n// Create the Context\nexport const ConfigContext = createContext(null);\n\n// ConfigProvider Component\nconst ConfigProvider = ({ config, children }) => {\n return (\n <ConfigContext.Provider value={config}>\n {children}\n </ConfigContext.Provider>\n );\n};\n\nexport default ConfigProvider;","import { useState, useRef, useEffect } from 'react';\nimport { Previewer } from 'pagedjs';\nimport debounce from 'lodash/debounce';\nimport DocumentUtils from './pagination/DocumentUtils';\nimport PageSizeUtils from '../utility/PageSizeUtils';\nimport ConfigProvider from '../config/config-provider';\nimport './pagination/pagination-dynamic.css';\nimport './../styles/uhuu-indicators.css';\n\ninterface PaginationProps {\n children: React.ReactNode;\n className?: string;\n setup: any; \n}\n\nconst Pagination = ({ children, className, setup }: PaginationProps) => {\n \n const [rendering, setRendering] = useState(false);\n const containerRef = useRef(null);\n const contentRef = useRef(null); \n const documentUtilsRef = useRef<DocumentUtils>(new DocumentUtils());\n\n const config = PageSizeUtils.pageParams(\"dynamic\", setup);\n\n let printCssRaw = config?.page?.printCssRaw;\n if (config?.page?.width && config?.page?.height) {\n const pageRuleRegex = /@page\\s*{([^}]*)}/;\n const match = printCssRaw?.match(pageRuleRegex);\n \n const sizeAndBleedStyles = `\n size: ${config.page.width}mm ${config.page.height}mm;\n bleed: ${config.page.bleed ?? 0}mm;`;\n\n if (match) {\n // Remove any existing size/bleed properties\n const existingStyles = match[1].replace(/\\s*(size|bleed)\\s*:[^;]*;/g, '');\n const newPageRule = `@page {${sizeAndBleedStyles}${existingStyles}}`;\n printCssRaw = printCssRaw.replace(pageRuleRegex, newPageRule);\n } else {\n printCssRaw = `@page {${sizeAndBleedStyles}}\\n${printCssRaw ?? ''}`;\n }\n }\n\n const layoutPage = debounce(() => {\n if (!containerRef.current || !contentRef.current) {\n console.warn(\"Container or page content reference is missing.\");\n return;\n }\n\n if(rendering) {\n return;\n }\n \n setRendering(true); \n documentUtilsRef.current.prepareRendering(containerRef.current);\n\n const paged = new Previewer();\n const styleUrls = documentUtilsRef.current.getStyleUrls(printCssRaw ?? '', config?.page?.printCssUrl ?? '');\n \n try {\n paged.preview(contentRef.current?.innerHTML ?? '', styleUrls, containerRef.current).then(() => { \n setRendering(false);\n documentUtilsRef.current.finalizeRendering(containerRef.current);\n });\n } catch (error) {\n console.error(\"Error during Paged.js preview rendering:\", error); \n setRendering(false);\n }\n }, 500, { leading: true });\n\n useEffect(() => {\n layoutPage();\n }, [children, setup]);\n\n return (\n <ConfigProvider config={config}>\n <div className={[(className ?? ''), (rendering ? 'rendering' : 'rendered'), (config?.page?.showBleed ? 'uhuu-bleed-visible' : ''), (config?.page?.preview ?? '')].filter(Boolean).join(' ')} ref={containerRef}></div>\n <div className=\"uhuu-reactive-content\" style={{display: 'none'}} ref={contentRef}>\n {children}\n </div>\n </ConfigProvider>\n );\n};\n\nexport default Pagination;","import React, { ReactNode } from \"react\";\n\ninterface SheetProps {\n children: ReactNode;\n}\n\nconst Sheet: React.FC<SheetProps> = ({ children }) => {\n return <>{children}</>;\n};\n\nexport default Sheet;","class Compatibility {\n\n static handlePageBreakStyles() {\n document?.querySelectorAll(\".page-break-after[data-paged-css]\").forEach((el) => {\n const pagedSheet = el.closest('div.uhuu-page-sheet');\n const pagedCSS = el.getAttribute('data-paged-css');\n \n if (pagedSheet && pagedCSS) {\n const cssClasses = pagedCSS.split(' ').filter(Boolean);\n cssClasses.forEach((cssClass) => pagedSheet.classList.add(cssClass));\n }\n });\n }\n \n static handleUhuuDialogs() {\n const clickListener = function(this: HTMLElement) {\n const value = JSON.parse(this.getAttribute(\"data-uhuu\") || '{}');\n $uhuu.editDialog(value);\n };\n \n document?.querySelectorAll(\"[data-uhuu]\").forEach((el) => {\n el.removeEventListener('click', clickListener);\n el.addEventListener('click', clickListener);\n });\n }\n\n static handle() {\n Compatibility.handlePageBreakStyles();\n Compatibility.handleUhuuDialogs();\n }\n}\n\nexport default Compatibility;","class DocumentUtils {\n static setupPageStyles(printCssUrl?: string) {\n if (!printCssUrl || typeof document === 'undefined') return;\n const link = document.createElement(\"link\");\n link.rel = \"stylesheet\";\n link.href = printCssUrl;\n document.head.appendChild(link);\n return link;\n }\n\n static removePageStyles(link: HTMLLinkElement) {\n if (link && typeof document !== 'undefined') document?.head.removeChild(link);\n }\n \n}\n\nexport default DocumentUtils;","import React, { useEffect } from 'react';\nimport CompatibilityUtils from './pagination/CompatibilityUtils';\nimport DocumentUtils from './pagination/DocumentUtils';\nimport PageSizeUtils from '../utility/PageSizeUtils';\nimport ConfigProvider from '../config/config-provider';\nimport './pagination/print.css';\nimport './pagination/pagination-static.css';\nimport './../styles/uhuu-indicators.css';\n\ninterface PaginationProps {\n children: React.ReactNode;\n className?: string;\n setup: any;\n}\n\nexport const Pagination: React.FC<PaginationProps> = ({ children, className, setup }) => {\n const config = PageSizeUtils.pageParams(\"static\", setup);\n\n useEffect(() => {\n if (config?.page?.compatibility) {\n CompatibilityUtils.handle();\n }\n\n const styleLink = DocumentUtils.setupPageStyles(config?.page?.printCssUrl);\n\n return () => {\n if (styleLink) {\n DocumentUtils.removePageStyles(styleLink as HTMLLinkElement);\n }\n };\n }, [setup, config?.page?.compatibility, config?.page?.printCssUrl]);\n\n const combinedClassName = [className, config?.page?.preview].filter(Boolean).join(' ');\n\n return (\n <ConfigProvider config={config}>\n <div className={combinedClassName}>\n {children}\n </div>\n </ConfigProvider>\n );\n};\n\nexport default Pagination;\n","import React, { ReactNode, useContext, CSSProperties, forwardRef } from \"react\";\nimport { ConfigContext } from '../config/config-provider'; // Import the ConfigContext\n\ninterface SheetProps {\n children: ReactNode;\n className?: string;\n style?: CSSProperties;\n pageNo: number;\n showBleed?: boolean;\n overlay?: (args: {pageNo: number}) => ReactNode;\n 'data-page-key'?: string;\n}\n\nconst Sheet = forwardRef<HTMLDivElement, SheetProps>(({\n children,\n className = \"\",\n style,\n pageNo,\n overlay,\n showBleed,\n 'data-page-key': dataPageKey,\n}, ref) => {\n const config = useContext(ConfigContext);\n const showBleedArea = showBleed ?? config?.page?.showBleed ?? false;\n\n return (\n <div \n className={`uhuu-page-sheet ${className}`} \n style={style} \n ref={ref}\n data-page-key={dataPageKey}\n >\n {children}\n {overlay && overlay({pageNo})}\n {showBleedArea && <div className=\"uhuu-bleed-area\"></div>}\n </div>\n );\n});\n\nexport default Sheet;","export const getDialogProps = (props, config) => {\n const dialog = props.dialog;\n\n if (!dialog) return {};\n \n if(config?.page?.paginationType === 'dynamic') return {\n 'data-uhuu': JSON.stringify(dialog)\n };\n\n return {\n onClick: (e) => {\n e.stopPropagation();\n window.$uhuu?.editDialog(dialog);\n },\n 'data-uhuu' : ''\n };\n };","import { useContext, useState } from \"react\";\nimport { ConfigContext } from '../config/config-provider'; // Import the ConfigContext\nimport { getDialogProps } from '../editable/dialog-props';\nimport './image.css';\n\ninterface ImageBleedProps { \n src?: string;\n backgroundColor?: string;\n width?: number;\n left?: number;\n right?: number;\n top?: number;\n bottom?: number;\n height?: number;\n pageWidth?: number;\n pageHeight?: number;\n bleed?: number;\n dialog?: object;\n children?: React.ReactNode;\n}\n\nconst ImageBleed = (props: ImageBleedProps) => {\n const config = useContext(ConfigContext); \n // Get page dimensions and bleed from props or use defaults (from context if not provided) \n const BLEED = props.bleed ?? config?.page?.bleed ?? 0; \n const PAGE_CONTENT_WIDTH = (props.pageWidth ?? config?.page?.width ?? 210); \n const PAGE_CONTENT_HEIGHT = (props.pageHeight ?? config?.page?.height ?? 297); \n\n const {\n src,\n backgroundColor,\n width: imageW,\n height: imageH,\n left: imageL = 0,\n right: imageR = 0,\n top: imageT = 0,\n bottom: imageB = 0, \n } = props;\n\n\n const [coverClass, setCoverClass] = useState(\"h-full w-full object-cover object-center\");\n\n const unitFormat = (value) => `${value}mm`;\n\n const calculateImageHeight = (): number => {\n let result = imageH; \n if(!imageH) {\n result = PAGE_CONTENT_HEIGHT;\n if(!imageT) result += BLEED;\n if(!imageB) result += BLEED;\n if(imageT || imageB) result -= (imageT ?? 0) + (imageB ?? 0);\n }\n return result;\n };\n\n const calculateImageWidth = (): number => {\n\n let result = imageW; \n if(!imageW) {\n result = PAGE_CONTENT_WIDTH;\n if(!imageL) result += BLEED;\n if(!imageR) result += BLEED;\n if(imageL || imageR) result -= (imageL ?? 0) + (imageR ?? 0);\n }\n return result;\n };\n\n\n const imageWidth = calculateImageWidth();\n const imageHeight = calculateImageHeight();\n \n\n const formatStyleValue = (value: number | undefined): string | undefined => \n value !== undefined ? unitFormat(value) : undefined;\n\n const createStyle = (styles: Record<string, string | undefined>) => {\n return Object.fromEntries(\n Object.entries(styles).filter(([_, value]) => value !== undefined)\n );\n };\n\n // Replace old style object with new createStyle implementation\n const style = createStyle({\n backgroundColor,\n width: formatStyleValue(imageWidth),\n height: formatStyleValue(imageHeight),\n left: formatStyleValue(imageL > 0 ? imageL + BLEED : imageL),\n right: formatStyleValue(imageR > 0 ? imageR + BLEED : imageR),\n top: formatStyleValue(imageT > 0 ? imageT + BLEED : imageT),\n bottom: formatStyleValue(imageB > 0 ? imageB + BLEED : imageB),\n });\n\n \n // calc ratio of image: if imageHeight set to 0 (means it should be \"auto\") then calc using default pageHeight and spacings\n const ratio = imageHeight > 0 ? imageWidth / imageHeight : \n imageWidth / (PAGE_CONTENT_HEIGHT - (imageT ?? 0) - (imageB ?? 0));\n \n\n const imageLoaded = (e) => {\n // Compare loaded image ratio with container ratio to determine cover mode\n const imageRatio = e.target.naturalWidth / e.target.naturalHeight; // Use naturalWidth/Height to get actual image dimensions\n\n // If image is wider relative to container, use vertical cover mode\n // Otherwise use horizontal cover mode\n let imageClass = imageRatio > ratio ? \"cover-vertical\" : \"cover-horizontal\"; \n setCoverClass(imageClass);\n };\n\n \n\n return (\n <div className=\"uhuu-image-container\" style={style}>\n <div \n className=\"uhuu-image-inner\" \n {...getDialogProps(props, config)}\n >\n <img \n className={coverClass} \n src={src} \n onLoad={(e) => imageLoaded(e)} \n key={`${src}-${imageWidth}-${imageHeight}`}\n />\n {props.children}\n </div>\n </div>\n );\n};\n\nexport default ImageBleed;","import * as React from \"react\"\nimport { createContext, useContext, useState } from \"react\"\n\ninterface InteractiveModeContextType {\n interactive: boolean\n setInteractive: (value: boolean) => void\n enableDevTools?: boolean\n}\n\nconst InteractiveModeContext = createContext<InteractiveModeContextType>({\n interactive: true,\n setInteractive: () => {},\n enableDevTools: false,\n})\n\n/**\n * Hook to access interactive mode state\n * Returns true if UI should show interactive elements (default), false to hide them\n */\nexport function useInteractive() {\n return useContext(InteractiveModeContext)\n}\n\n/**\n * Hook to check if UI elements should be hidden\n * Returns true when interactive mode is OFF\n */\nexport function useShouldHideUI(): boolean {\n const { interactive } = useInteractive()\n return !interactive\n}\n\ninterface InteractiveModeProviderProps {\n children: React.ReactNode\n defaultInteractive?: boolean\n enableDevTools?: boolean\n}\n\n/**\n * InteractiveModeProvider - Global control for showing/hiding UI elements\n * \n * When interactive=true (default): Shows all controls (edit mode)\n * When interactive=false: Hides all UI elements (Print Mode)\n * \n * @param defaultInteractive - Initial interactive mode state (default: true)\n * @param enableDevTools - Force enable dev tools (print mode controls) even in production (default: false)\n * \n * @example\n * ```tsx\n * <InteractiveModeProvider defaultInteractive={true} enableDevTools={true}>\n * <MyApp />\n * </InteractiveModeProvider>\n * \n * // Inside components:\n * const { interactive, setInteractive } = useInteractive()\n * <button onClick={() => setInteractive(!interactive)}>\n * {interactive ? 'Hide UI' : 'Show UI'}\n * </button>\n * ```\n */\nexport function InteractiveModeProvider({\n children,\n defaultInteractive = true,\n enableDevTools = false,\n}: InteractiveModeProviderProps) {\n const shouldDisableInteractive = typeof window !== 'undefined' && (window as any)?.$uhuu_renderer ? true : false;\n \n const effectiveDefaultInteractive = shouldDisableInteractive \n ? false \n : defaultInteractive\n \n const [interactive, setInteractive] = useState(effectiveDefaultInteractive)\n\n return (\n <InteractiveModeContext.Provider value={{ interactive, setInteractive, enableDevTools }}>\n {children}\n </InteractiveModeContext.Provider>\n )\n}\n\n\n\n\n","import { clsx, type ClassValue } from \"clsx\"\nimport { twMerge } from \"tailwind-merge\"\n\nexport function cn(...inputs: ClassValue[]) {\n return twMerge(clsx(inputs))\n}\n\n","import * as React from \"react\"\nimport { cva, type VariantProps } from \"class-variance-authority\"\nimport { cn } from \"./cn\"\n\nconst buttonVariants = cva(\n \"inline-flex items-center justify-center gap-2 whitespace-nowrap rounded-md text-sm font-medium transition-colors focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-offset-2 disabled:pointer-events-none disabled:opacity-50\",\n {\n variants: {\n variant: {\n default: \"bg-gray-900 text-white hover:bg-gray-800\",\n outline: \"border border-gray-300 bg-white hover:bg-gray-50 text-gray-900\",\n ghost: \"hover:bg-gray-100 text-gray-900\",\n secondary: \"bg-gray-100 text-gray-900 hover:bg-gray-200\",\n },\n size: {\n default: \"h-10 px-4 py-2\",\n sm: \"h-9 px-3 text-sm\",\n lg: \"h-11 px-8\",\n icon: \"h-10 w-10\",\n },\n },\n defaultVariants: {\n variant: \"default\",\n size: \"default\",\n },\n }\n)\n\nexport interface ButtonProps\n extends React.ButtonHTMLAttributes<HTMLButtonElement>,\n VariantProps<typeof buttonVariants> {\n asChild?: boolean\n}\n\nconst Button = React.forwardRef<HTMLButtonElement, ButtonProps>(\n ({ className, variant, size, ...props }, ref) => {\n return (\n <button\n className={cn(buttonVariants({ variant, size, className }))}\n ref={ref}\n {...props}\n />\n )\n }\n)\nButton.displayName = \"Button\"\n\nexport { Button, buttonVariants }\n\n","import * as React from \"react\"\nimport * as DropdownMenuPrimitive from \"@radix-ui/react-dropdown-menu\"\nimport { cn } from \"./cn\"\n\nconst DropdownMenu = DropdownMenuPrimitive.Root\n\nconst DropdownMenuTrigger = DropdownMenuPrimitive.Trigger\n\nconst DropdownMenuGroup = DropdownMenuPrimitive.Group\n\nconst DropdownMenuPortal = DropdownMenuPrimitive.Portal\n\nconst DropdownMenuSub = DropdownMenuPrimitive.Sub\n\nconst DropdownMenuRadioGroup = DropdownMenuPrimitive.RadioGroup\n\nconst DropdownMenuSubTrigger = React.forwardRef<\n React.ElementRef<typeof DropdownMenuPrimitive.SubTrigger>,\n React.ComponentPropsWithoutRef<typeof DropdownMenuPrimitive.SubTrigger> & {\n inset?: boolean\n }\n>(({ className, inset, children, ...props }, ref) => (\n <DropdownMenuPrimitive.SubTrigger\n ref={ref}\n className={cn(\n \"flex cursor-default select-none items-center rounded-sm px-2 py-1.5 text-sm outline-none focus:bg-gray-100 data-[state=open]:bg-gray-100\",\n inset && \"pl-8\",\n className\n )}\n {...props}\n >\n {children}\n </DropdownMenuPrimitive.SubTrigger>\n))\nDropdownMenuSubTrigger.displayName = DropdownMenuPrimitive.SubTrigger.displayName\n\nconst DropdownMenuSubContent = React.forwardRef<\n React.ElementRef<typeof DropdownMenuPrimitive.SubContent>,\n React.ComponentPropsWithoutRef<typeof DropdownMenuPrimitive.SubContent>\n>(({ className, ...props }, ref) => (\n <DropdownMenuPrimitive.SubContent\n ref={ref} \n className={cn(\n \"z-50 min-w-[8rem] overflow-hidden rounded-md border border-gray-200 bg-white p-1 text-gray-900 shadow-lg data-[state=open]:animate-in data-[state=closed]:animate-out data-[state=closed]:fade-out-0 data-[state=open]:fade-in-0 data-[state=closed]:zoom-out-95 data-[state=open]:zoom-in-95 data-[side=bottom]:slide-in-from-top-2 data-[side=left]:slide-in-from-right-2 data-[side=right]:slide-in-from-left-2 data-[side=top]:slide-in-from-bottom-2\",\n className\n )}\n {...props}\n />\n))\nDropdownMenuSubContent.displayName = DropdownMenuPrimitive.SubContent.displayName\n\nconst DropdownMenuContent = React.forwardRef<\n React.ElementRef<typeof DropdownMenuPrimitive.Content>,\n React.ComponentPropsWithoutRef<typeof DropdownMenuPrimitive.Content>\n>(({ className, sideOffset = 4, ...props }, ref) => (\n <DropdownMenuPrimitive.Portal>\n <DropdownMenuPrimitive.Content\n ref={ref}\n sideOffset={sideOffset}\n data-uhuu-editor \n className={cn(\n \"z-50 min-w-[8rem] overflow-hidden rounded-md border border-gray-200 bg-white p-1 text-gray-900 shadow-md data-[state=open]:animate-in data-[state=closed]:animate-out data-[state=closed]:fade-out-0 data-[state=open]:fade-in-0 data-[state=closed]:zoom-out-95 data-[state=open]:zoom-in-95 data-[side=bottom]:slide-in-from-top-2 data-[side=left]:slide-in-from-right-2 data-[side=right]:slide-in-from-left-2 data-[side=top]:slide-in-from-bottom-2\",\n className\n )}\n {...props}\n />\n </DropdownMenuPrimitive.Portal>\n))\nDropdownMenuContent.displayName = DropdownMenuPrimitive.Content.displayName\n\nconst DropdownMenuItem = React.forwardRef<\n React.ElementRef<typeof DropdownMenuPrimitive.Item>,\n React.ComponentPropsWithoutRef<typeof DropdownMenuPrimitive.Item> & {\n inset?: boolean\n }\n>(({ className, inset, ...props }, ref) => (\n <DropdownMenuPrimitive.Item\n ref={ref}\n className={cn(\n \"relative flex cursor-default select-none items-center rounded-sm px-2 py-1.5 text-sm outline-none transition-colors focus:bg-gray-100 focus:text-gray-900 data-[disabled]:pointer-events-none data-[disabled]:opacity-50\",\n inset && \"pl-8\",\n className\n )}\n {...props}\n />\n))\nDropdownMenuItem.displayName = DropdownMenuPrimitive.Item.displayName\n\nconst DropdownMenuCheckboxItem = React.forwardRef<\n React.ElementRef<typeof DropdownMenuPrimitive.CheckboxItem>,\n React.ComponentPropsWithoutRef<typeof DropdownMenuPrimitive.CheckboxItem>\n>(({ className, children, checked, ...props }, ref) => (\n <DropdownMenuPrimitive.CheckboxItem\n ref={ref}\n className={cn(\n \"relative flex cursor-default select-none items-center rounded-sm py-1.5 pl-8 pr-2 text-sm outline-none transition-colors focus:bg-gray-100 focus:text-gray-900 data-[disabled]:pointer-events-none data-[disabled]:opacity-50\",\n className\n )}\n checked={checked}\n {...props}\n >\n {children}\n </DropdownMenuPrimitive.CheckboxItem>\n))\nDropdownMenuCheckboxItem.displayName = DropdownMenuPrimitive.CheckboxItem.displayName\n\nconst DropdownMenuRadioItem = React.forwardRef<\n React.ElementRef<typeof DropdownMenuPrimitive.RadioItem>,\n React.ComponentPropsWithoutRef<typeof DropdownMenuPrimitive.RadioItem>\n>(({ className, children, ...props }, ref) => (\n <DropdownMenuPrimitive.RadioItem\n ref={ref}\n className={cn(\n \"relative flex cursor-default select-none items-center rounded-sm py-1.5 pl-8 pr-2 text-sm outline-none transition-colors focus:bg-gray-100 focus:text-gray-900 data-[disabled]:pointer-events-none data-[disabled]:opacity-50\",\n className\n )}\n {...props}\n >\n {children}\n </DropdownMenuPrimitive.RadioItem>\n))\nDropdownMenuRadioItem.displayName = DropdownMenuPrimitive.RadioItem.displayName\n\nconst DropdownMenuLabel = React.forwardRef<\n React.ElementRef<typeof DropdownMenuPrimitive.Label>,\n React.ComponentPropsWithoutRef<typeof DropdownMenuPrimitive.Label> & {\n inset?: boolean\n }\n>(({ className, inset, ...props }, ref) => (\n <DropdownMenuPrimitive.Label\n ref={ref}\n className={cn(\n \"px-2 py-1.5 text-sm font-medium\",\n inset && \"pl-8\",\n className\n )}\n {...props}\n />\n))\nDropdownMenuLabel.displayName = DropdownMenuPrimitive.Label.displayName\n\nconst DropdownMenuSeparator = React.forwardRef<\n React.ElementRef<typeof DropdownMenuPrimitive.Separator>,\n React.ComponentPropsWithoutRef<typeof DropdownMenuPrimitive.Separator>\n>(({ className, ...props }, ref) => (\n <DropdownMenuPrimitive.Separator\n ref={ref}\n className={cn(\"-mx-1 my-1 h-px bg-gray-200\", className)}\n {...props}\n />\n))\nDropdownMenuSeparator.displayName = DropdownMenuPrimitive.Separator.displayName\n\nconst DropdownMenuShortcut = ({\n className,\n ...props\n}: React.HTMLAttributes<HTMLSpanElement>) => {\n return (\n <span\n className={cn(\"ml-auto text-xs tracking-widest opacity-60\", className)}\n {...props}\n />\n )\n}\nDropdownMenuShortcut.displayName = \"DropdownMenuShortcut\"\n\nexport {\n DropdownMenu,\n DropdownMenuTrigger,\n DropdownMenuContent,\n DropdownMenuItem,\n DropdownMenuCheckboxItem,\n DropdownMenuRadioItem,\n DropdownMenuLabel,\n DropdownMenuSeparator,\n DropdownMenuShortcut,\n DropdownMenuGroup,\n DropdownMenuPortal,\n DropdownMenuSub,\n DropdownMenuSubContent,\n DropdownMenuSubTrigger,\n DropdownMenuRadioGroup,\n}\n\n","import * as React from \"react\"\nimport { MoreHorizontal } from \"lucide-react\"\nimport type { ImageOption } from './image-with-options'\nimport { useShouldHideUI } from \"../editor-shell/interactive-mode-context\"\nimport { Button } from \"../ui/button\"\nimport {\n DropdownMenu,\n DropdownMenuContent,\n DropdownMenuItem,\n DropdownMenuTrigger,\n} from \"../ui/dropdown-menu\"\nimport { cn } from \"../ui/cn\"\n\ntype OptionSelectEvent = Event | React.SyntheticEvent\n\nexport const handleOptionSelect = (event: OptionSelectEvent, option: ImageOption) => {\n event.stopPropagation()\n\n if (option.onSelect) {\n option.onSelect(event)\n return\n }\n\n if (option.dialog && typeof window !== \"undefined\") {\n ;(window as any).$uhuu?.editDialog?.(option.dialog)\n }\n}\n\nexport const renderOverlay = (\n overlaySvg: string | undefined,\n overlayClassName: string | undefined\n): React.ReactNode => {\n if (!overlaySvg) return null\n \n const trimmed = overlaySvg.trim()\n const isInlineSvg = trimmed.startsWith(\"<\")\n\n if (isInlineSvg) {\n const normalizedSvg = trimmed.replace(/<svg\\b([^>]*)>/i, (match, attrs) => {\n let nextAttrs = attrs\n if (/\\bwidth=/.test(nextAttrs)) {\n nextAttrs = nextAttrs.replace(/\\bwidth=(\\\"[^\\\"]*\\\"|'[^']*'|[^\\s>]+)/i, 'width=\"100%\"')\n } else {\n nextAttrs += ' width=\"100%\"'\n }\n if (/\\bheight=/.test(nextAttrs)) {\n nextAttrs = nextAttrs.replace(/\\bheight=(\\\"[^\\\"]*\\\"|'[^']*'|[^\\s>]+)/i, 'height=\"100%\"')\n } else {\n nextAttrs += ' height=\"100%\"'\n }\n if (/\\bpreserveAspectRatio=/.test(nextAttrs)) {\n nextAttrs = nextAttrs.replace(\n /\\bpreserveAspectRatio=(\\\"[^\\\"]*\\\"|'[^']*'|[^\\s>]+)/i,\n 'preserveAspectRatio=\"xMidYMid slice\"'\n )\n } else {\n nextAttrs += ' preserveAspectRatio=\"xMidYMid slice\"'\n }\n return `<svg${nextAttrs}>`\n })\n return (\n <div\n className={cn(\"pointer-events-none absolute inset-0 z-10\", overlayClassName)}\n aria-hidden=\"true\"\n dangerouslySetInnerHTML={{ __html: normalizedSvg }}\n />\n )\n }\n\n return (\n <img\n src={overlaySvg}\n alt=\"\"\n aria-hidden=\"true\"\n className={cn(\n \"pointer-events-none absolute inset-0 z-10 h-full w-full object-cover\",\n overlayClassName\n )}\n />\n )\n}\n\nexport const renderOptionsButton = (\n options: ImageOption[],\n showOptions: boolean\n): React.ReactNode => {\n if (!showOptions) return null\n \n return (\n <div className=\"absolute right-2 top-2 z-20\">\n <DropdownMenu modal={false}>\n <DropdownMenuTrigger asChild>\n <Button\n variant=\"secondary\"\n size=\"icon\"\n title=\"Image options\"\n className=\"h-7 w-7 shadow-sm\"\n onPointerDown={(event) => event.stopPropagation()}\n onClick={(event) => event.stopPropagation()}\n >\n <MoreHorizontal className=\"h-4 w-4\" />\n </Button>\n </DropdownMenuTrigger>\n <DropdownMenuContent className=\"w-40 p-1.5\" align=\"end\">\n {options.map((option) => (\n <DropdownMenuItem\n key={option.id}\n onSelect={(event) => handleOptionSelect(event, option)}\n disabled={option.disabled}\n >\n {option.icon && <span className=\"mr-2 inline-flex\">{option.icon}</span>}\n <span>{option.label}</span>\n </DropdownMenuItem>\n ))}\n </DropdownMenuContent>\n </DropdownMenu>\n </div>\n )\n}\n\nexport const useShouldShowOptions = (\n options: ImageOption[] = []\n): boolean => {\n const shouldHideUI = useShouldHideUI()\n return options.length > 0 && !shouldHideUI\n}\n","import * as React from \"react\"\nimport ImageBleed from './image-bleed'\nimport type { ImageOption } from './image-with-options'\nimport {\n renderOverlay,\n renderOptionsButton,\n useShouldShowOptions,\n} from './image-overlay-utils'\n\ninterface ImageBleedWithOverlayProps {\n className?: string\n style?: React.CSSProperties\n overlaySvg?: string\n overlayClassName?: string\n options?: ImageOption[]\n dialogProps?: Record<string, any>\n bleedProps: any\n children?: React.ReactNode\n}\n\nconst ImageBleedWithOverlay = ({\n className,\n style,\n overlaySvg,\n overlayClassName,\n options = [],\n dialogProps,\n bleedProps,\n children,\n}: ImageBleedWithOverlayProps) => {\n const showOptions = useShouldShowOptions(options)\n\n // Render bleed with overlay inside, options button alongside\n return (\n <>\n <ImageBleed {...bleedProps}>\n {renderOverlay(overlaySvg, overlayClassName)}\n {children}\n </ImageBleed>\n {renderOptionsButton(options, showOptions)}\n </>\n )\n}\n\nexport default ImageBleedWithOverlay\n","import { useState, useContext } from \"react\";\nimport { ConfigContext } from '../config/config-provider'; // Import the ConfigContext\nimport { getDialogProps } from '../editable/dialog-props';\nimport './image.css';\n\ninterface ImageSpreadProps { \n src?: string;\n side?: \"start\" | \"end\";\n backgroundColor?: string;\n width?: number;\n left?: number;\n right?: number;\n top?: number;\n bottom?: number;\n height?: number;\n pageWidth?: number;\n pageHeight?: number;\n bleed?: number;\n dialog?: object;\n children?: React.ReactNode;\n}\n\n// Constants\nexport default function ImageSpread(props: ImageSpreadProps) {\n\n const config = useContext(ConfigContext); \n // Get page dimensions and bleed from props or use defaults (from context if not provided)\n const BLEED = props.bleed ?? config?.page?.bleed ?? 0; \n const PAGE_CONTENT_WIDTH = (props.pageWidth ?? config?.page?.width ?? 210);\n const PAGE_CONTENT_HEIGHT = (props.pageHeight ?? config?.page?.height ?? 297);\n \n const {\n src,\n side,\n backgroundColor,\n width: imageW,\n height: imageH,\n left: imageL = 0,\n right: imageR = 0,\n top: imageT = 0,\n bottom: imageB = 0, \n } = props;\n\n const [coverClass, setCoverClass] = useState(\"h-full w-full object-cover object-center\");\n\n\n const unitFormat = (val: number): string => {\n return `${val}mm`;\n };\n\n const calculateImageWidth = (): number => {\n let result = imageW; \n if(!imageW) {\n result = 2 * PAGE_CONTENT_WIDTH;\n if(!imageL) result += 2 * BLEED;\n if(!imageR) result += 2 * BLEED;\n if(imageL || imageR) result -= (imageL ?? 0) + (imageR ?? 0);\n }\n return result;\n };\n\n const calculateImageHeight = (): number => {\n let result = imageH; \n if(!imageH) {\n result = PAGE_CONTENT_HEIGHT;\n if(!imageT) result += BLEED;\n if(!imageB) result += BLEED;\n if(imageT || imageB) result -= (imageT ?? 0) + (imageB ?? 0);\n }\n return result;\n };\n\n // Calculate dimensions \n const imageWidth = calculateImageWidth();\n const imageHeight = calculateImageHeight(); \n \n\n const formatStyleValue = (value: number | undefined): string | undefined => \n value !== undefined ? unitFormat(value) : undefined;\n\n const createStyle = (styles: Record<string, string | undefined>) => {\n return Object.fromEntries(\n Object.entries(styles).filter(([_, value]) => value !== undefined)\n );\n };\n\n // const imageTop = imageT ?? (-1 * BLEED);\n // const imageBottom = imageB ?? undefined;\n const imageLeft = imageL > 0 ? imageL : (-1 * BLEED);\n const rightPageOffset = -1 * PAGE_CONTENT_WIDTH + imageLeft; // Offset of right page\n \n const leftStyle = createStyle({\n backgroundColor,\n width: formatStyleValue(imageWidth),\n height: formatStyleValue(imageHeight),\n left: formatStyleValue(imageLeft),\n top: formatStyleValue(imageT > 0 ? imageT + BLEED : imageT),\n bottom: formatStyleValue(imageB > 0 ? imageB + BLEED : imageB)\n });\n\n const rightStyle = createStyle({\n width: formatStyleValue(imageWidth),\n height: formatStyleValue(imageHeight),\n left: formatStyleValue(rightPageOffset),\n top: formatStyleValue(imageT > 0 ? imageT + BLEED : imageT),\n bottom: formatStyleValue(imageB > 0 ? imageB + BLEED : imageB)\n });\n\n // calc ratio of image: if imageHeight set to 0 (means it should be \"auto\") then calc using default pageHeight and spacings\n const ratio =\n imageHeight != 0\n ? imageWidth / imageHeight\n : imageWidth / (PAGE_CONTENT_HEIGHT - (imageT ?? 0) - (imageB ?? 0));\n\n const imageLoaded = (e) => {\n // Compare loaded image ratio with container ratio to determine cover mode\n const imageRatio = e.target.naturalWidth / e.target.naturalHeight; // Use naturalWidth/Height to get actual image dimensions\n \n // If image is wider relative to container, use vertical cover mode\n // Otherwise use horizontal cover mode\n let imageClass = imageRatio > ratio ? \"cover-vertical\" : \"cover-horizontal\"; \n setCoverClass(imageClass);\n };\n\n\n return <div className={`uhuu-image-container`} style={side == \"end\" ? rightStyle : leftStyle}>\n <div className=\"uhuu-image-inner\" {...getDialogProps(props, config)}>\n {props.children || (\n <img \n className={coverClass} \n src={src} \n onLoad={(e) => imageLoaded(e)}\n key={`${src}-${imageWidth}-${imageHeight}`} // Force reload when height or width change\n />\n )}\n </div>\n </div>\n}\n\n","import * as React from \"react\"\nimport { useContext } from \"react\"\nimport { ConfigContext } from \"../config/config-provider\"\nimport { getDialogProps } from \"../editable/dialog-props\"\nimport { cn } from \"../ui/cn\"\nimport {\n renderOverlay,\n renderOptionsButton,\n useShouldShowOptions,\n} from './image-overlay-utils'\n\ntype OptionSelectEvent = Event | React.SyntheticEvent\n\nexport type ImageOption = {\n id: string\n label: string\n icon?: React.ReactNode\n dialog?: Record<string, any> | null\n onSelect?: (event: OptionSelectEvent) => void\n disabled?: boolean\n}\n\ntype ImageRenderProps = React.ImgHTMLAttributes<HTMLImageElement>\n\ninterface ImageWithOptionsProps {\n src?: string\n alt?: string\n className?: string\n imageClassName?: string\n style?: React.CSSProperties\n imageStyle?: React.CSSProperties\n overlaySvg?: string\n overlayClassName?: string\n options?: ImageOption[]\n dialog?: Record<string, any> | null\n dialogProps?: Record<string, any>\n placeholder?: React.ReactNode\n children?: React.ReactNode\n imageProps?: React.ImgHTMLAttributes<HTMLImageElement>\n renderImage?: (props: ImageRenderProps) => React.ReactNode\n}\n\nconst ImageWithOptions = ({\n src,\n alt = \"\",\n className,\n imageClassName,\n style,\n imageStyle,\n overlaySvg,\n overlayClassName,\n options = [],\n dialog,\n dialogProps,\n placeholder,\n children,\n imageProps,\n renderImage,\n}: ImageWithOptionsProps) => {\n const config = useContext(ConfigContext)\n const baseDialogProps = dialog ? getDialogProps({ dialog }, config) : {}\n const showOptions = useShouldShowOptions(options)\n\n const mergedDialogProps = React.useMemo(() => {\n if (!dialogProps) return baseDialogProps\n const merged: Record<string, any> = { ...baseDialogProps, ...dialogProps }\n if (baseDialogProps.className || dialogProps.className) {\n merged.className = cn(baseDialogProps.className, dialogProps.className)\n }\n Object.keys(baseDialogProps).forEach((key) => {\n const baseHandler = baseDialogProps[key]\n const extraHandler = dialogProps[key]\n if (key.startsWith(\"on\") && typeof baseHandler === \"function\" && typeof extraHandler === \"function\") {\n merged[key] = (event: any) => {\n baseHandler(event)\n extraHandler(event)\n }\n }\n })\n return merged\n }, [baseDialogProps, dialogProps])\n\n const renderImageContent = () => {\n const imagePropsClassName = imageProps?.className\n const imagePropsStyle = imageProps?.style\n const finalSrc = imageProps?.src ?? src\n const finalAlt = imageProps?.alt ?? alt\n const mergedImageProps: React.ImgHTMLAttributes<HTMLImageElement> = {\n ...imageProps,\n src: finalSrc,\n alt: finalAlt,\n className: cn(\"h-full w-full object-cover\", imageClassName, imagePropsClassName),\n style: { ...imageStyle, ...imagePropsStyle },\n }\n\n if (renderImage) {\n return renderImage(mergedImageProps)\n }\n\n if (finalSrc) {\n return <img {...mergedImageProps} />\n }\n\n return placeholder ?? null\n }\n\n return (\n <div className={cn(\"relative\", className)} style={style}>\n <div className=\"relative h-full w-full\" {...mergedDialogProps}>\n {renderImageContent()}\n {children}\n {renderOverlay(overlaySvg, overlayClassName)}\n </div>\n {renderOptionsButton(options, showOptions)}\n </div>\n )\n}\n\nexport default ImageWithOptions\n","import * as React from \"react\"\nimport { useMemo } from \"react\"\nimport ImageBleed from './image-bleed'\nimport ImageBleedWithOverlay from './image-bleed-with-overlay'\nimport ImageSpread from './image-spread'\nimport ImageWithOptions from './image-with-options'\nimport type { ImageOption } from './image-with-options'\n\ntype ImageBlockMode = \"bleed\" | \"spread\" | \"auto\"\n\ntype ImageRenderProps = React.ImgHTMLAttributes<HTMLImageElement>\n\n// Annotation data structure\ntype AnnotationValue = {\n annotationSvg?: string\n annotations?: unknown[]\n}\n\n// Simplified annotation config\ninterface ImageBlockAnnotation {\n path: string // where annotation data is stored\n value?: AnnotationValue // preloaded data (optional)\n}\n\n// Dialog config with type\ninterface ImageBlockDialog {\n path: string // where data is stored\n type: 'image' | 'satellite' // dialog type\n config?: any // optional config (e.g., for satellite: lat, lng, zoom, etc.)\n}\n\ninterface ImageBlockProps {\n // Image source\n src?: string\n alt?: string // Optional - not required for PDF rendering\n \n // Styling - className/style for container, imageClassName/imageStyle for <img>\n className?: string\n imageClassName?: string\n style?: React.CSSProperties\n imageStyle?: React.CSSProperties\n backgroundColor?: string\n \n // Print mode - only needed for full-bleed print images\n mode?: ImageBlockMode\n side?: \"start\" | \"end\" // For spread mode (left/right page)\n \n // Bleed dimensions (only used in bleed/spread modes)\n width?: number\n height?: number\n left?: number\n right?: number\n top?: number\n bottom?: number\n pageWidth?: number\n pageHeight?: number\n bleed?: number\n \n // Simplified dialog config (auto-generates edit dialog with type)\n dialog?: ImageBlockDialog\n \n // Simplified annotation config (auto-generates overlay + annotate option)\n annotation?: ImageBlockAnnotation\n \n // Manual interactive features (for advanced use cases)\n overlaySvg?: string\n overlayClassName?: string\n options?: ImageOption[]\n dialogProps?: Record<string, any>\n placeholder?: React.ReactNode\n children?: React.ReactNode\n imageProps?: React.ImgHTMLAttributes<HTMLImageElement>\n renderImage?: (props: ImageRenderProps) => React.ReactNode\n}\n\nconst ImageBlock = (props: ImageBlockProps) => {\n // Auto-generate overlay and options from annotation/dialog config\n const { computedOverlaySvg, computedOptions } = useMemo(() => {\n const { annotation, dialog, overlaySvg, options, src } = props\n \n // If no simplified props, use manual props as-is\n if (!annotation && !dialog) {\n return {\n computedOverlaySvg: overlaySvg,\n computedOptions: options,\n }\n }\n \n // Extract annotation data\n const annotationValue = annotation?.value || {}\n \n // Auto-generate overlay from annotation\n const autoOverlaySvg = overlaySvg ?? annotationValue.annotationSvg ?? ''\n \n // Build options array\n const autoOptions: ImageOption[] = []\n \n // Only add options if annotation is enabled\n // (dialog alone doesn't show options dropdown)\n if (annotation) {\n // Add \"Edit image\" option if dialog config is provided\n if (dialog) {\n const dialogConfig: any = {\n path: dialog.path,\n type: dialog.type,\n }\n \n // For satellite dialogs, include config\n if (dialog.type === 'satellite' && dialog.config) {\n dialogConfig.config = {\n ...dialog.config,\n path: 'image',\n }\n }\n \n autoOptions.push({\n id: 'edit',\n label: 'Edit image',\n dialog: dialogConfig,\n })\n }\n \n // Add \"Annotate\" option\n const annotations = Array.isArray(annotationValue.annotations) \n ? annotationValue.annotations \n : []\n \n autoOptions.push({\n id: 'annotate',\n label: 'Annotate',\n dialog: {\n path: annotation.path,\n type: 'annotation',\n image: src,\n annotations,\n },\n })\n }\n \n // Merge auto-generated options with manual options\n const finalOptions = options ? [...autoOptions, ...options] : autoOptions\n \n return {\n computedOverlaySvg: autoOverlaySvg,\n computedOptions: finalOptions.length > 0 ? finalOptions : undefined,\n }\n }, [props.annotation, props.dialog, props.overlaySvg, props.options, props.src])\n \n // Determine mode: auto (default), bleed (for print), or spread (for print with sides)\n const mode: ImageBlockMode = useMemo(() => {\n if (props.mode) return props.mode\n if (props.side !== undefined) return \"spread\"\n \n // Auto-detect: if bleed dimensions are provided, use bleed mode\n const hasBleedDimensions = props.width !== undefined || props.height !== undefined || \n props.left !== undefined || props.right !== undefined ||\n props.top !== undefined || props.bottom !== undefined\n \n return hasBleedDimensions ? \"bleed\" : \"auto\"\n }, [props.mode, props.side, props.width, props.height, props.left, props.right, props.top, props.bottom])\n \n // Check if we need ImageWithOptions wrapper\n const needsImageWithOptions = \n mode === \"auto\" || // Auto mode always uses ImageWithOptions\n (computedOptions && computedOptions.length > 0) || \n computedOverlaySvg || \n props.renderImage !== undefined ||\n props.placeholder !== undefined ||\n props.children !== undefined\n \n // Extract props\n const {\n mode: _mode,\n side,\n src,\n alt,\n className,\n imageClassName,\n style,\n imageStyle,\n backgroundColor,\n width,\n height,\n left,\n right,\n top,\n bottom,\n pageWidth,\n pageHeight,\n bleed,\n overlayClassName,\n dialogProps,\n placeholder,\n children,\n imageProps,\n renderImage,\n } = props\n \n // Base component props (for bleed/spread modes)\n const baseProps = {\n src,\n backgroundColor,\n width,\n height,\n left,\n right,\n top,\n bottom,\n pageWidth,\n pageHeight,\n bleed,\n }\n \n // Auto mode: Simple image with wrapper if needed\n if (mode === \"auto\") {\n return (\n <ImageWithOptions\n src={src}\n alt={alt}\n className={className}\n style={style}\n imageClassName={imageClassName}\n imageStyle={imageStyle}\n overlaySvg={computedOverlaySvg}\n overlayClassName={overlayClassName}\n options={computedOptions}\n dialogProps={dialogProps}\n placeholder={placeholder}\n children={children}\n imageProps={imageProps}\n renderImage={renderImage}\n />\n )\n }\n \n // Spread mode: for print with left/right pages\n if (mode === \"spread\") {\n const spreadComponent = (\n <ImageSpread\n {...baseProps}\n side={side}\n />\n )\n \n if (needsImageWithOptions) {\n return (\n <ImageWithOptions\n className={className}\n style={style}\n overlaySvg={computedOverlaySvg}\n overlayClassName={overlayClassName}\n options={computedOptions}\n dialogProps={dialogProps}\n >\n {spreadComponent}\n {children}\n </ImageWithOptions>\n )\n }\n \n return spreadComponent\n }\n \n // Bleed mode: for print with bleed calculations\n // For bleed mode with overlay/options, use ImageBleedWithOverlay\n if (needsImageWithOptions && (computedOverlaySvg || computedOptions?.length)) {\n return (\n <ImageBleedWithOverlay\n className={className}\n style={style}\n overlaySvg={computedOverlaySvg}\n overlayClassName={overlayClassName}\n options={computedOptions}\n dialogProps={dialogProps}\n bleedProps={baseProps}\n >\n {children}\n </ImageBleedWithOverlay>\n )\n }\n \n // Simple bleed without overlay/options\n return (\n <ImageBleed {...baseProps} />\n )\n}\n\nexport default ImageBlock\nexport type { ImageOption }\n","import { useContext, useState } from \"react\";\nimport { ConfigContext } from '../config/config-provider'; // Import the ConfigContext\nimport { getDialogProps } from './dialog-props';\nimport './../styles/uhuu-indicators.css';\n\n\ninterface EditableProps { \n className?: string;\n dialog?: object;\n children?: React.ReactNode;\n}\n\nconst Editable = (props: EditableProps) => {\n const config = useContext(ConfigContext); \n // Get page dimensions and bleed from props or use defaults (from context if not provided) \n \n return ( \n <div \n className={props.className} \n {...getDialogProps(props, config)}\n >\n {props.children}\n </div> \n );\n};\n\nexport default Editable;","/**\n * Page Group Utilities\n * \n * Locked schema with explicit types and kind discriminator.\n * All helpers and reducers use these types for consistency.\n */\n\nimport type { ComponentType } from 'react';\nimport type { PageDataBinding } from './data-binding';\n\nexport type IntegrationRequirement = 'required' | 'optional' | 'none';\n\nexport type IntegrationConfig = {\n mode?: IntegrationRequirement;\n};\n\nexport type PageComponentProps = {\n integration?: any;\n payload?: any;\n pageId?: string;\n templateId?: string;\n pageNum?: number;\n componentKey?: string;\n page?: StandalonePage;\n pagePayload?: any;\n parentGroup?: PageGroup;\n dataBinding?: PageDataBinding;\n};\n\nexport type PageComponent = ComponentType<PageComponentProps>;\n\nexport type StandalonePage = {\n kind: 'page';\n id: string; // Instance ID (unique)\n componentKey?: string; // Template key for component resolution\n templateId?: string; // Reference to template (for repeatable pages)\n label?: string;\n className?: string; // CSS classes for page-sheet container (e.g., background colors for bleed)\n repeatable?: boolean; // Template metadata: whether it can be added again\n maxInstances?: number | null; // Template metadata: max allowed instances\n integration?: IntegrationRequirement | IntegrationConfig;\n pageNum?: number; // Derived, not stored in state\n component?: PageComponent; // Optional component for this page\n [key: string]: any; // Allow additional props\n};\n\nexport type PageGroup = {\n kind: 'group';\n id: string; // Instance ID (unique)\n templateId?: string; // Reference to template blueprint\n repeatable?: boolean; // Can this be added multiple times?\n maxInstances?: number | null; // Max instances allowed (null = unlimited)\n integration?: IntegrationRequirement | IntegrationConfig;\n label?: string;\n pages: Omit<StandalonePage, 'pageNum' | 'kind'>[]; // Internal pages (no pageNum, no kind, but can have renderer)\n pageNum?: never; // Groups don't have pageNum\n [key: string]: any; // Allow integration metadata and custom fields\n};\n\nexport type PageItem = StandalonePage | PageGroup;\n\n// Payload persistence helpers\nexport const DEFAULT_PAGE_EDITOR_STATE_KEY = 'uhuu_page_editor';\n\nexport type PageEditorState = {\n key: string;\n items: PageItem[];\n totalPages: number;\n updatedAt: string;\n};\n\n// Page filtering types for conditional rendering\nexport type RenderMode = 'all' | 'cover' | 'text' | 'custom';\n\nexport type PageRange = {\n start: number; // 1-based index, supports negative indices (-1 = last page, -2 = second to last)\n end: number; // Inclusive\n};\n\nexport type PageFilterConfig = {\n mode?: RenderMode;\n ranges?: PageRange[]; // Used with 'custom' mode\n coverPageCount?: number; // Number of pages at start/end for 'cover' mode (default: 2)\n};\n\n// Type guards (using kind discriminator - much safer than checking for pages property)\nexport function isPageGroup(item: PageItem): item is PageGroup {\n return item.kind === 'group';\n}\n\n/**\n * Flatten items to get all pages with derived pageNum\n * Internal function used by getTotalPageCount\n */\nfunction flattenPages(items: PageItem[]): Array<StandalonePage & { pageNum: number }> {\n const result: Array<StandalonePage & { pageNum: number }> = [];\n let pageNum = 1;\n \n for (const item of items) {\n if (isPageGroup(item)) {\n // Group: add all pages from the group\n for (const page of item.pages) {\n result.push({ \n ...page, \n kind: 'page' as const,\n pageNum: pageNum++ \n } as StandalonePage & { pageNum: number });\n }\n } else {\n // Standalone page\n result.push({ \n ...item, \n pageNum: pageNum++ \n });\n }\n }\n \n return result;\n}\n\n/**\n * Calculate and assign pageNum to all pages (central source of truth)\n * Returns items with pageNum derived\n */\nexport function updatePageNumbers(items: PageItem[]): Array<PageItem & { pageNum?: number }> {\n const result: Array<PageItem & { pageNum?: number }> = [];\n let pageNum = 1;\n \n for (const item of items) {\n if (isPageGroup(item)) {\n // Group: update pages within the group\n const updatedPages = item.pages.map(page => ({\n ...page,\n kind: 'page' as const,\n pageNum: pageNum++,\n }));\n result.push({\n ...item,\n pages: updatedPages\n });\n } else {\n // Standalone page\n result.push({\n ...item,\n pageNum: pageNum++\n });\n }\n }\n \n return result;\n}\n\n/**\n * Count all pages including those in groups\n */\nexport function getTotalPageCount(items: PageItem[]): number {\n return flattenPages(items).length;\n}\n\n// Reorder utilities\nexport type ReorderItem = {\n kind: 'page' | 'group';\n id: string;\n label?: string;\n pageComponent?: PageComponent; // Component for standalone pages\n pageComponentKey?: string; // Component key for standalone pages\n firstPageComponent?: PageComponent; // Component for first page in groups\n firstPageComponentKey?: string; // Component key for first page in groups\n [key: string]: any;\n}\n\n/**\n * Transform items for reorder dialog (groups appear as single units)\n */\nexport function transformItemsForReorder(items: PageItem[]): ReorderItem[] {\n return items.map(item => {\n const strictPosition = (item as any).strictPosition;\n if (isPageGroup(item)) {\n // For groups, create a representation with first page info\n const firstPage = item.pages[0];\n const firstPageComponentKey = firstPage?.componentKey ?? firstPage?.id;\n return {\n kind: 'group' as const,\n id: item.id,\n groupId: item.id,\n firstPageId: firstPage?.id,\n firstPageComponentKey,\n firstPageComponent: firstPage?.component, // Pass component from first page\n pageCount: item.pages.length,\n label: item.label || `${item.id} (${item.pages.length} pages)`,\n strictPosition // Preserve strictPosition\n };\n } else {\n // Standalone page\n const pageComponentKey = item.componentKey ?? item.id;\n return {\n kind: 'page' as const,\n id: item.id,\n label: item.label,\n pageId: item.id,\n pageComponentKey,\n pageLabel: item.label,\n pageNum: item.pageNum,\n pageComponent: item.component, // Pass component from page\n strictPosition // Preserve strictPosition\n };\n }\n });\n}\n\n/**\n * Restore group structure after reorder\n */\nexport function restoreItemsFromReorder(reorderedItems: ReorderItem[], originalItems: PageItem[]): PageItem[] {\n // Create a map of original items by ID\n const originalItemsMap = new Map<string, PageItem>();\n originalItems.forEach(item => {\n originalItemsMap.set(item.id, item);\n });\n \n // Reconstruct items array in the new order\n const restored: PageItem[] = [];\n for (const reorderedItem of reorderedItems) {\n const original = originalItemsMap.get(reorderedItem.id);\n if (original) {\n restored.push(original);\n }\n }\n \n return restored;\n}\n\n/**\n * Normalize items to ensure they carry a `kind` discriminator.\n * Safely converts legacy shapes that lack `kind` into the locked schema.\n */\nexport function normalizePageItems(items: Array<PageItem | Omit<PageItem, 'kind'> & { pages?: any[] }>): PageItem[] {\n return items.map((item) => {\n if ('kind' in item && (item as any).kind) {\n return item as PageItem;\n }\n\n const maybeGroup = (item as any).pages && Array.isArray((item as any).pages);\n if (maybeGroup) {\n return {\n kind: 'group' as const,\n ...(item as any),\n pages: ((item as any).pages ?? []).map((page: any) => {\n const { kind: _ignored, ...rest } = page || {};\n return {\n kind: 'page' as const,\n ...rest,\n };\n }),\n };\n }\n\n const { kind: _ignored, ...rest } = item as any;\n return {\n kind: 'page' as const,\n ...rest,\n };\n });\n}\n\n/**\n * Build a persistable state object for embedding into payloads.\n * Page numbers are derived and therefore omitted from persisted state.\n */\nexport function buildPageEditorState(\n items: PageItem[],\n key: string = DEFAULT_PAGE_EDITOR_STATE_KEY\n): PageEditorState {\n const normalized = normalizePageItems(items);\n return {\n key,\n items: normalized,\n totalPages: getTotalPageCount(normalized),\n updatedAt: new Date().toISOString(),\n };\n}\n\n/**\n * Read persisted state from a payload object.\n * Returns normalized items or null when not present.\n */\nexport function readPageEditorState(\n payload: any,\n key: string = DEFAULT_PAGE_EDITOR_STATE_KEY\n): PageEditorState | null {\n const maybeState = payload?.[key];\n if (!maybeState?.items) return null;\n const normalizedItems = normalizePageItems(maybeState.items as PageItem[]);\n return {\n key,\n items: normalizedItems,\n totalPages: getTotalPageCount(normalizedItems),\n updatedAt: maybeState.updatedAt || new Date().toISOString(),\n };\n}\n\n/**\n * Helper to produce a new payload object with the page editor state embedded.\n * Does not mutate the provided payload object.\n */\nexport function mergePageEditorStateIntoPayload(\n payload: any,\n items: PageItem[],\n key: string = DEFAULT_PAGE_EDITOR_STATE_KEY\n) {\n const state = buildPageEditorState(items, key);\n return { ...(payload ?? {}), [key]: state };\n}\n\n/**\n * Generate a unique ID for instances\n */\nexport function generateUID(): string {\n return Math.random()\n .toString(36)\n .slice(2, 11);\n}\n\n/**\n * Instantiate a standalone page from a template\n */\nexport function instantiatePage(\n templateId: string,\n componentKey: string,\n overrides?: { \n label?: string; \n repeatable?: boolean;\n maxInstances?: number | null;\n integration?: IntegrationRequirement | IntegrationConfig;\n [key: string]: any;\n }\n): StandalonePage {\n const instanceId = overrides?.repeatable ? generateUID() : templateId;\n\n return {\n kind: 'page',\n id: instanceId,\n componentKey,\n templateId,\n label: overrides?.label,\n repeatable: overrides?.repeatable,\n maxInstances: overrides?.maxInstances,\n ...overrides,\n };\n}\n\n/**\n * Instantiate a group from a template\n */\nexport function instantiateGroup(\n templateId: string,\n componentKeys: string[],\n overrides?: { \n label?: string;\n repeatable?: boolean;\n maxInstances?: number | null;\n integration?: IntegrationRequirement | IntegrationConfig;\n [key: string]: any;\n }\n): PageGroup {\n const instanceId = overrides?.repeatable ? generateUID() : templateId;\n \n return {\n kind: 'group',\n id: instanceId,\n templateId,\n label: overrides?.label,\n repeatable: overrides?.repeatable ?? false,\n maxInstances: overrides?.maxInstances ?? null,\n pages: componentKeys.map((key, idx) => ({\n id: `${instanceId}__${key}__${idx}`,\n componentKey: key,\n templateId: key,\n })),\n ...overrides,\n };\n}\n\n/**\n * Resolve a page index (supports negative indices)\n * @param index - Page index (1-based, negative from end)\n * @param totalPages - Total number of pages\n * @returns Resolved 1-based page number\n */\nfunction resolvePageIndex(index: number, totalPages: number): number {\n if (index < 0) {\n // Negative index: -1 = last page, -2 = second to last\n return totalPages + index + 1;\n }\n return index;\n}\n\n/**\n * Check if a page number is in any of the specified ranges\n * @param pageNum - 1-based page number\n * @param ranges - Array of page ranges\n * @param totalPages - Total number of pages\n */\nfunction isPageInRanges(pageNum: number, ranges: PageRange[], totalPages: number): boolean {\n for (const range of ranges) {\n const start = resolvePageIndex(range.start, totalPages);\n const end = resolvePageIndex(range.end, totalPages);\n \n if (pageNum >= start && pageNum <= end) {\n return true;\n }\n }\n return false;\n}\n\n/**\n * Get page ranges based on render mode\n * @param mode - Render mode\n * @param totalPages - Total number of pages\n * @param coverPageCount - Number of pages at start/end for cover mode\n */\nfunction getRangesForMode(mode: RenderMode, totalPages: number, coverPageCount: number = 2): PageRange[] {\n switch (mode) {\n case 'all':\n return [{ start: 1, end: totalPages }];\n \n case 'cover':\n // First N pages and last N pages\n return [\n { start: 1, end: coverPageCount },\n { start: -coverPageCount, end: -1 }\n ];\n \n case 'text':\n // Everything except first N and last N pages\n if (totalPages <= coverPageCount * 2) {\n // Not enough pages for text mode\n return [];\n }\n return [{ start: coverPageCount + 1, end: -(coverPageCount + 1) }];\n \n case 'custom':\n default:\n return [];\n }\n}\n\n/**\n * Filter items based on page filter configuration\n * @param items - Page items to filter\n * @param filterConfig - Filter configuration\n * @returns Filtered items maintaining structure (groups with filtered pages)\n */\nexport function filterPageItems(items: PageItem[], filterConfig?: PageFilterConfig): PageItem[] {\n // No filter or 'all' mode: return all items\n if (!filterConfig || filterConfig.mode === 'all') {\n return items;\n }\n\n const totalPages = getTotalPageCount(items);\n const mode = filterConfig.mode ?? 'all';\n const coverPageCount = filterConfig.coverPageCount ?? 2;\n \n // Get ranges to include\n const ranges = mode === 'custom' && filterConfig.ranges \n ? filterConfig.ranges \n : getRangesForMode(mode, totalPages, coverPageCount);\n\n if (ranges.length === 0) {\n return [];\n }\n\n // Filter items based on their existing page numbers\n const filtered: PageItem[] = [];\n\n for (const item of items) {\n if (isPageGroup(item)) {\n // Filter pages within the group based on their page numbers\n const filteredPages = item.pages.filter((page) => {\n return page.pageNum && isPageInRanges(page.pageNum, ranges, totalPages);\n });\n\n // Only include group if it has pages after filtering\n if (filteredPages.length > 0) {\n filtered.push({\n ...item,\n pages: filteredPages\n });\n }\n } else {\n // Standalone page - check if it should be included\n if (item.pageNum && isPageInRanges(item.pageNum, ranges, totalPages)) {\n filtered.push(item);\n }\n }\n }\n\n return filtered;\n}\n","/**\n * Integration Data Utilities\n * \n * Essential utilities for working with integration data in multi-instance templates.\n */\n\nimport type { PageItem } from './page-group-utils';\nimport { isPageGroup } from './page-group-utils';\n\n/**\n * Get integration data for a specific page/group instance\n */\nfunction getIntegrationData(payload: any, instanceId: string): any {\n if (!payload?.integrations) return undefined;\n return payload.integrations[instanceId];\n}\n\nexport function resolveIntegrationInstanceId(\n page: { id: string },\n parentGroup?: PageItem\n): string | null {\n if (parentGroup && isPageGroup(parentGroup)) {\n return parentGroup.id;\n }\n return page?.id ?? null;\n}\n\nexport function resolveIntegrationBinding(\n payload: any,\n page: { id: string },\n parentGroup?: PageItem\n): { instanceId: string | null; integration?: any } {\n const instanceId = resolveIntegrationInstanceId(page, parentGroup);\n if (!instanceId) return { instanceId: null, integration: undefined };\n return {\n instanceId,\n integration: getIntegrationData(payload, instanceId),\n };\n}\n\n/**\n * Resolve integration data for a page component\n * For group pages, prefer parent group's integration data\n */\nexport function resolveIntegrationForPage(\n payload: any,\n page: { id: string },\n parentGroup?: PageItem\n): any {\n const binding = resolveIntegrationBinding(payload, page, parentGroup);\n return binding.integration;\n}\n\nexport function buildIntegrationPath(\n instanceId?: string | null,\n fieldPath?: string\n) {\n if (!instanceId) return null;\n const base = `integrations.${instanceId}`;\n if (!fieldPath) return base;\n return `${base}.${fieldPath}`;\n}\n\n/**\n * Parse a dialog path to determine if it targets integration data\n * Returns the instance ID if the path targets integrations, null otherwise\n */\nexport function parseIntegrationPath(path: string): {\n instanceId: string | null;\n fieldPath: string;\n isIntegrationPath: boolean;\n} {\n if (!path) {\n return { instanceId: null, fieldPath: path, isIntegrationPath: false };\n }\n \n // Check if path starts with \"integrations.\"\n const integrationPrefix = 'integrations.';\n if (path.startsWith(integrationPrefix)) {\n const afterPrefix = path.slice(integrationPrefix.length);\n const dotIndex = afterPrefix.indexOf('.');\n \n if (dotIndex > 0) {\n // Path like \"integrations.group_1__123.field.subfield\"\n const instanceId = afterPrefix.slice(0, dotIndex);\n const fieldPath = afterPrefix.slice(dotIndex + 1);\n return { instanceId, fieldPath, isIntegrationPath: true };\n } else {\n // Path like \"integrations.group_1__123\" (targets entire integration)\n const instanceId = afterPrefix;\n return { instanceId, fieldPath: '', isIntegrationPath: true };\n }\n }\n \n return { instanceId: null, fieldPath: path, isIntegrationPath: false };\n}\n\n/**\n * Set a nested value in an object using dot notation path\n */\nfunction setNestedValue(obj: any, path: string, value: any): any {\n if (!path) return value;\n \n const keys = path.split('.');\n const result = { ...obj };\n let current: any = result;\n \n for (let i = 0; i < keys.length - 1; i++) {\n const key = keys[i];\n if (!(key in current) || typeof current[key] !== 'object' || current[key] === null) {\n current[key] = {};\n } else {\n current[key] = { ...current[key] };\n }\n current = current[key];\n }\n \n const lastKey = keys[keys.length - 1];\n current[lastKey] = value;\n \n return result;\n}\n\n/**\n * Update integration data in payload using a path-based update\n * Handles nested field updates (e.g., \"integrations.id.overrides.heroImage.url\")\n */\nexport function updateIntegrationByPath(\n payload: any,\n path: string,\n value: any\n): any {\n const parsed = parseIntegrationPath(path);\n \n if (!parsed.isIntegrationPath || !parsed.instanceId) {\n // Not an integration path, return payload as-is\n return payload;\n }\n \n const { instanceId, fieldPath } = parsed;\n const currentIntegration = getIntegrationData(payload, instanceId) || {};\n \n // Update nested field using dot notation\n const updatedIntegration = setNestedValue(\n currentIntegration,\n fieldPath,\n value\n );\n \n return {\n ...payload,\n integrations: {\n ...(payload?.integrations || {}),\n [instanceId]: updatedIntegration,\n },\n };\n}\n","import * as React from 'react';\nimport type { PageOption } from './page-editor';\nimport { mergePageEditorStateIntoPayload, PageItem, DEFAULT_PAGE_EDITOR_STATE_KEY } from './page-group-utils';\nimport { updateIntegrationByPath } from './integration-utils';\n\ntype PagePayloadTarget = string | { id?: string; templateId?: string; componentKey?: string } | PageItem | null | undefined;\n\nexport function getPagePayload(payload: any, target: PagePayloadTarget) {\n if (!payload || !target) return undefined;\n \n const targetId = typeof target === 'string' ? target : target?.id;\n const templateId = typeof target === 'string' ? undefined : (target as any)?.templateId ?? (target as any)?.componentKey;\n const fallbackId = typeof target === 'string' ? undefined : (target as any)?.componentKey;\n const candidateKeys = Array.from(\n new Set(\n [targetId, templateId, fallbackId].filter(Boolean) as string[]\n )\n );\n\n for (const key of candidateKeys) {\n if (payload?.pages?.[key] !== undefined) return payload.pages[key];\n }\n\n // Allow group-level payloads\n for (const key of candidateKeys) {\n if (payload?.groups?.[key] !== undefined) return payload.groups[key];\n }\n\n // Legacy fallback: top-level keys keyed by id/templateId\n for (const key of candidateKeys) {\n if ((payload as any)[key] !== undefined) return (payload as any)[key];\n }\n\n return undefined;\n}\n\ntype TemplateDataContextValue = {\n payload: any;\n setPayload: (next: any | ((prev: any) => any)) => void;\n setPageOptionValue: (pageOrGroupId: string, key: string, value: any) => void;\n setIntegrationPayload: (instanceId: string, next: any | ((prev: any) => any)) => void;\n setIntegrationPayloadValue: (instanceId: string, key: string, value: any) => void;\n removeIntegrationPayload: (instanceId: string) => void;\n updateIntegrationByDialogPath: (path: string, value: any) => void;\n mergePageEditorState: (items: PageItem[], key?: string) => void;\n getPagePayload: (target: PagePayloadTarget) => any;\n};\n\nexport const TemplateDataContext = React.createContext<TemplateDataContextValue | null>(null);\n\n/**\n * Get the list of reserved keys that the page editor manages.\n * These keys are isolated from external payload updates.\n */\nfunction getReservedKeys(stateKey: string = DEFAULT_PAGE_EDITOR_STATE_KEY): string[] {\n return [stateKey];\n}\n\n/**\n * Merge external payload while preserving reserved keys managed by page editor.\n * External payload is the source of truth for all keys except reserved ones.\n */\nfunction mergeExternalPayload(\n currentPayload: any,\n externalPayload: any,\n reservedKeys: string[]\n): any {\n if (!externalPayload) return currentPayload;\n if (!currentPayload) return externalPayload;\n\n // Start with external payload (source of truth for non-reserved keys)\n const merged = { ...externalPayload };\n \n // Overlay reserved keys from current payload (page editor owns these)\n reservedKeys.forEach(key => {\n if (currentPayload[key] !== undefined) {\n merged[key] = currentPayload[key];\n }\n });\n\n return merged;\n}\n\nexport function TemplateDataProvider({\n payload,\n onPayloadChange,\n children,\n stateKey = DEFAULT_PAGE_EDITOR_STATE_KEY,\n}: {\n payload?: any;\n onPayloadChange?: (nextPayload: any) => void;\n children: React.ReactNode;\n stateKey?: string;\n}) {\n const [currentPayload, setCurrentPayload] = React.useState(payload ?? {});\n const lastExternalPayloadRef = React.useRef<any>(null);\n const isInternalUpdateRef = React.useRef(false);\n const lastInternalPayloadRef = React.useRef<any>(null);\n const lastInternalTimestampRef = React.useRef<number>(0);\n const isInitialMountRef = React.useRef(true);\n\n // Serialize payload for comparison (simple deep equality check)\n const serializePayload = React.useCallback((p: any) => {\n try {\n return JSON.stringify(p);\n } catch {\n return String(p);\n }\n }, []);\n\n // Get reserved keys for this provider instance\n const reservedKeys = React.useMemo(() => getReservedKeys(stateKey), [stateKey]);\n\n // Helper to create payload without reserved keys for comparison\n const payloadWithoutReservedKeys = React.useCallback((p: any, keys: string[]) => {\n if (!p) return null;\n const filtered = { ...p };\n keys.forEach(key => {\n delete filtered[key];\n });\n return filtered;\n }, []);\n\n // When external payload changes, merge it while preserving reserved keys\n React.useEffect(() => {\n // Handle initial mount - set initial payload\n if (isInitialMountRef.current) {\n isInitialMountRef.current = false;\n if (payload) {\n console.log('[TemplateDataProvider] Initial mount - setting payload:', payload);\n lastExternalPayloadRef.current = payload;\n setCurrentPayload(payload);\n }\n return;\n }\n\n // Skip if this is an internal update (from setPayload)\n if (isInternalUpdateRef.current) {\n isInternalUpdateRef.current = false;\n console.log('[TemplateDataProvider] Skipping internal update');\n // Store the payload we just set internally to detect round-trips\n lastInternalPayloadRef.current = payload;\n lastInternalTimestampRef.current = Date.now();\n // Update lastExternalPayloadRef to prevent immediate re-merge\n lastExternalPayloadRef.current = payload;\n return;\n }\n\n // Skip if payload hasn't actually changed (same object reference)\n if (payload === lastExternalPayloadRef.current) {\n console.log('[TemplateDataProvider] Skipping - same object reference');\n return;\n }\n\n // Check if this is a round-trip by comparing non-reserved keys only\n // Only check for round-trips within a short time window (500ms) to avoid blocking legitimate updates\n const timeSinceLastInternal = Date.now() - lastInternalTimestampRef.current;\n const isRecentInternalUpdate = timeSinceLastInternal < 500;\n \n if (isRecentInternalUpdate && lastInternalPayloadRef.current !== null) {\n const currentWithoutReserved = payloadWithoutReservedKeys(payload, reservedKeys);\n const lastInternalWithoutReserved = payloadWithoutReservedKeys(lastInternalPayloadRef.current, reservedKeys);\n \n const currentSerialized = currentWithoutReserved ? serializePayload(currentWithoutReserved) : null;\n const lastInternalSerialized = lastInternalWithoutReserved ? serializePayload(lastInternalWithoutReserved) : null;\n \n if (currentSerialized && currentSerialized === lastInternalSerialized) {\n // This is likely a round-trip - skip it but update the ref\n console.log('[TemplateDataProvider] Skipping round-trip');\n lastInternalPayloadRef.current = null; // Clear after one check\n lastExternalPayloadRef.current = payload;\n return;\n }\n }\n\n // This is a genuine external update from $uhuu.listen or other external source - merge it\n console.log('[TemplateDataProvider] External payload update detected, merging...', payload);\n lastExternalPayloadRef.current = payload;\n setCurrentPayload((prev) => {\n if (!payload) return prev;\n const merged = mergeExternalPayload(prev, payload, reservedKeys);\n console.log('[TemplateDataProvider] Merged payload:', merged);\n return merged;\n });\n }, [payload, reservedKeys, serializePayload, payloadWithoutReservedKeys]);\n\n const notifyHost = React.useCallback(\n (next: any) => {\n onPayloadChange?.(next);\n if (typeof window !== 'undefined' && (window as any).$uhuu?.initPayload) {\n (window as any).$uhuu.initPayload(next);\n }\n },\n [onPayloadChange]\n );\n\n /**\n * Handle payload updates, including integration path updates from dialogs\n * When external payload updates come in with integration paths, route them correctly\n */\n const setPayload = React.useCallback(\n (next: any | ((prev: any) => any)) => {\n isInternalUpdateRef.current = true;\n setCurrentPayload((prev) => {\n const resolved = typeof next === 'function' ? (next as (prev: any) => any)(prev) : next;\n \n // Check if this update contains integration path updates from dialogs\n // The SDK/document editor may send updates with paths like \"integrations.id.field\"\n // We need to ensure these are properly structured\n let finalPayload = resolved;\n \n // If the payload has a _dialogUpdate flag or similar, process integration paths\n // This handles cases where dialogs update integration data via path-based updates\n if (resolved && typeof resolved === 'object') {\n // Check for any top-level keys that might be integration paths (from dialog updates)\n // The document editor might send updates that need to be routed to integrations\n const integrationKeys = Object.keys(resolved).filter(key => \n key.startsWith('integrations.') || key === 'integrations'\n );\n \n if (integrationKeys.length > 0 && resolved.integrations) {\n // Integration data is already properly structured, use as-is\n finalPayload = resolved;\n }\n }\n \n // Store the resolved payload to detect round-trips\n lastInternalPayloadRef.current = finalPayload;\n lastInternalTimestampRef.current = Date.now();\n notifyHost(finalPayload);\n return finalPayload;\n });\n },\n [notifyHost]\n );\n\n const setPageOptionValue = React.useCallback(\n (pageOrGroupId: string, key: string, value: any) => {\n setPayload((prev: any) => ({\n ...(prev ?? {}),\n pages: {\n ...(prev?.pages ?? {}),\n [pageOrGroupId]: {\n ...(prev?.pages?.[pageOrGroupId] ?? {}),\n [key]: value,\n },\n },\n }));\n },\n [setPayload]\n );\n\n const setIntegrationPayload = React.useCallback(\n (instanceId: string, next: any | ((prev: any) => any)) => {\n setPayload((prev: any) => {\n const prevIntegrations = prev?.integrations ?? {};\n const current = prevIntegrations[instanceId];\n const resolved = typeof next === 'function' ? (next as (prev: any) => any)(current) : next;\n return {\n ...(prev ?? {}),\n integrations: {\n ...prevIntegrations,\n [instanceId]: resolved,\n },\n };\n });\n },\n [setPayload]\n );\n\n const setIntegrationPayloadValue = React.useCallback(\n (instanceId: string, key: string, value: any) => {\n setIntegrationPayload(instanceId, (prevIntegration: any) => ({\n ...(prevIntegration ?? {}),\n [key]: value,\n }));\n },\n [setIntegrationPayload]\n );\n\n const removeIntegrationPayload = React.useCallback(\n (instanceId: string) => {\n setPayload((prev: any) => {\n if (!prev?.integrations || !prev.integrations[instanceId]) {\n return prev;\n }\n const { [instanceId]: removed, ...remainingIntegrations } = prev.integrations;\n return {\n ...prev,\n integrations: Object.keys(remainingIntegrations).length > 0 ? remainingIntegrations : undefined,\n };\n });\n },\n [setPayload]\n );\n\n /**\n * Update integration data using a path-based update (for dialog compatibility)\n * Handles paths like \"integrations.instanceId.field.subfield\"\n */\n const updateIntegrationByDialogPath = React.useCallback(\n (path: string, value: any) => {\n setPayload((prev: any) => updateIntegrationByPath(prev, path, value));\n },\n [setPayload]\n );\n\n const mergePageEditorState = React.useCallback(\n (items: PageItem[], key?: string) => {\n const effectiveKey = key ?? stateKey;\n setPayload((prev: any) => mergePageEditorStateIntoPayload(prev, items, effectiveKey));\n },\n [setPayload, stateKey]\n );\n\n const resolvePagePayload = React.useCallback(\n (target: PagePayloadTarget) => getPagePayload(currentPayload, target),\n [currentPayload]\n );\n\n const value = React.useMemo(\n () => ({\n payload: currentPayload,\n setPayload,\n setPageOptionValue,\n setIntegrationPayload,\n setIntegrationPayloadValue,\n removeIntegrationPayload,\n updateIntegrationByDialogPath,\n mergePageEditorState,\n getPagePayload: resolvePagePayload,\n }),\n [\n currentPayload,\n setPayload,\n setPageOptionValue,\n setIntegrationPayload,\n setIntegrationPayloadValue,\n removeIntegrationPayload,\n updateIntegrationByDialogPath,\n mergePageEditorState,\n resolvePagePayload,\n ]\n );\n\n return <TemplateDataContext.Provider value={value}>{children}</TemplateDataContext.Provider>;\n}\n\nexport function useTemplateData() {\n const ctx = React.useContext(TemplateDataContext);\n if (!ctx) {\n throw new Error('useTemplateData must be used within a TemplateDataProvider');\n }\n return ctx;\n}\n\n// JSON-friendly option builder: definitions → PageOption[] bound to payload.pages\nexport type PayloadOptionDefinition = Omit<PageOption, 'getValue' | 'onChange' | 'applyPatch'> & {\n defaultValue?: any;\n field?: string;\n};\n\nfunction toDefault(def: PayloadOptionDefinition) {\n if (def.defaultValue !== undefined) return def.defaultValue;\n if (def.type === 'toggle') return false;\n if (def.type === 'slider' || def.type === 'counter') return 0;\n return '';\n}\n\nfunction parseValue(def: PayloadOptionDefinition, raw: string | number | boolean) {\n if (def.type === 'toggle') return raw === true || raw === 'true';\n if (def.type === 'slider' || def.type === 'counter') return Number(raw);\n return raw;\n}\n\nexport function buildPayloadPageOption(\n def: PayloadOptionDefinition,\n payload: any,\n setPageOptionValue: (pageOrGroupId: string, key: string, value: any) => void\n): PageOption {\n const field = def.field ?? def.id;\n const base = def as Omit<PageOption, 'getValue' | 'onChange' | 'applyPatch'>;\n return {\n ...base,\n getValue: (item: PageItem) => {\n const stored = payload?.pages?.[item.id]?.[field];\n if (stored === undefined) return toDefault(def);\n if (def.type === 'toggle') return !!stored;\n return stored;\n },\n onChange: (pageOrGroupId: string, value: string) => {\n setPageOptionValue(pageOrGroupId, field, parseValue(def, value));\n },\n } as PageOption;\n}\n\nexport function buildPayloadPageOptions(\n definitions: PayloadOptionDefinition[],\n payload: any,\n setPageOptionValue: (pageOrGroupId: string, key: string, value: any) => void\n): PageOption[] {\n return definitions.map((def) =>\n buildPayloadPageOption(def, payload, setPageOptionValue)\n );\n}\n\nexport function usePayloadPageOptions(definitions: PayloadOptionDefinition[]): PageOption[] {\n const { payload, setPageOptionValue } = useTemplateData();\n\n return React.useMemo(\n () => buildPayloadPageOptions(definitions, payload, setPageOptionValue),\n [definitions, payload, setPageOptionValue]\n );\n}\n","import * as React from \"react\"\nimport { useState, useRef, useEffect, createContext, useContext } from \"react\"\nimport { Button } from \"../../ui/button\"\nimport { ZoomIn, ZoomOut, RotateCcw, Plus, ChevronDown, UnfoldVertical, UnfoldHorizontal, Maximize } from \"lucide-react\"\nimport {\n DropdownMenu,\n DropdownMenuContent,\n DropdownMenuItem,\n DropdownMenuTrigger,\n DropdownMenuSeparator,\n} from \"../../ui/dropdown-menu\"\nimport { useShouldHideUI } from \"../interactive-mode-context\"\nimport \"./section-page-resizer.css\"\n\n// Context for sharing zoom state across all sections\ninterface ZoomContextType {\n zoom: number\n scaleValue: number\n hideUI: boolean\n}\n\nconst ZoomContext = createContext<ZoomContextType>({ zoom: 100, scaleValue: 1, hideUI: false })\n\ninterface SectionPageResizerProps {\n children: React.ReactNode\n className?: string\n defaultZoom?: number\n minZoom?: number\n maxZoom?: number\n onAddPage?: () => void\n menuItems?: React.ReactNode\n hideUI?: boolean\n preview?: PreviewMode\n}\n\nexport type PreviewMode = \"single_page\" | \"two_pages\"\n\ninterface TwoPageSectionProps {\n children: React.ReactNode\n /** \"spread\" = two pages side by side, \"left\" = single page on left, \"right\" = single page on right */\n layout?: \"spread\" | \"left\" | \"right\"\n}\n\nexport function TwoPageSection({ children, layout = \"spread\" }: TwoPageSectionProps) {\n const { scaleValue } = useContext(ZoomContext)\n const pairRef = useRef<HTMLDivElement>(null)\n\n // Update pair width based on scaled content dimensions\n useEffect(() => {\n if (!pairRef.current) return\n\n const updatePairWidth = () => {\n const sections = pairRef.current?.querySelectorAll('[data-section-content]')\n if (!sections?.length) return\n\n // Sum natural widths of all pages in this pair\n const totalNaturalWidth = Array.from(sections).reduce((sum, section) => {\n const width = Number.parseInt(section.getAttribute('data-natural-width') || '0')\n return sum + width\n }, 0)\n\n if (totalNaturalWidth > 0) {\n const scaledWidth = totalNaturalWidth * scaleValue\n pairRef.current?.style.setProperty('--uhuu-group-pair-width', `${scaledWidth}px`)\n }\n }\n\n updatePairWidth()\n\n const resizeObserver = new ResizeObserver(updatePairWidth)\n const sections = pairRef.current.querySelectorAll('[data-section-content]')\n sections.forEach((section) => resizeObserver.observe(section))\n\n return () => resizeObserver.disconnect()\n }, [children, scaleValue])\n\n return (\n <div\n ref={pairRef}\n className={`two-pages-pair two-pages-pair--${layout}`}\n >\n {children}\n </div>\n )\n}\n\ninterface SectionProps {\n children: React.ReactNode\n title: string\n className?: string\n controls?: React.ReactNode\n origin?: \"left\" | \"right\" | \"center\"\n}\n\ntype FitMode = \"none\" | \"width\" | \"height\" | \"both\"\n\n// Individual Section Component\nexport function Section({ children, title, className = \"\", controls, origin = \"center\" }: SectionProps) {\n const { scaleValue, hideUI } = useContext(ZoomContext)\n const contentRef = useRef<HTMLDivElement>(null)\n const [contentHeight, setContentHeight] = useState<number>(0)\n const [contentWidth, setContentWidth] = useState<number>(0)\n\n // Calculate and update content dimensions\n useEffect(() => {\n if (contentRef.current) {\n const updateDimensions = () => {\n const element = contentRef.current\n if (element) {\n const originalTransform = element.style.transform\n element.style.transform = \"scale(1)\"\n\n const naturalHeight = element.scrollHeight\n const naturalWidth = element.scrollWidth\n\n element.style.transform = originalTransform\n\n setContentHeight(naturalHeight)\n setContentWidth(naturalWidth)\n }\n }\n\n updateDimensions()\n\n const resizeObserver = new ResizeObserver(updateDimensions)\n resizeObserver.observe(contentRef.current)\n\n return () => {\n resizeObserver.disconnect()\n }\n }\n }, [children])\n\n const scaledHeight = contentHeight * scaleValue\n const scaledWidth = Math.max(contentWidth * scaleValue, 150)\n \n // Align content based on transform origin (left/right for spreads, center for single pages)\n const alignmentMap = {\n left: { justify: \"justify-start\", origin: \"top left\" },\n right: { justify: \"justify-end\", origin: \"top right\" },\n center: { justify: \"justify-center\", origin: \"top center\" },\n }\n const { justify: contentAlignClass, origin: transformOrigin } = alignmentMap[origin]\n\n // If hiding UI, render children directly without controls or scaling\n if (hideUI) {\n return <div className={className}>{children}</div>\n }\n\n return (\n <div \n className={`group/section ${className}`}\n style={{\n width: `${scaledWidth}px`,\n minWidth: \"150px\",\n }}\n >\n {/* Section Header */}\n <div>\n {controls ?? (\n <div className=\"px-4 py-2 border-b border-gray-200\">\n <div className=\"text-sm font-medium text-gray-700\">{title} Controls</div>\n </div>\n )}\n </div>\n\n {/* Section Content - Scaled with dynamic height */}\n <div\n className=\"pt-1\"\n style={{\n height: scaledHeight > 0 ? `${scaledHeight + 32}px` : \"auto\",\n minHeight: \"100px\",\n }}\n >\n <div className={`flex items-start ${contentAlignClass}`}>\n <div\n ref={contentRef}\n data-section-content\n data-natural-width={contentWidth}\n data-natural-height={contentHeight}\n style={{\n transform: `scale(${scaleValue})`,\n transformOrigin,\n }}\n >\n {children}\n </div>\n </div>\n </div>\n </div>\n )\n}\n\n// Main Container with Controls\nexport default function SectionPageResizer({\n children,\n className = \"\",\n defaultZoom = 100,\n minZoom = 25,\n maxZoom = 200,\n onAddPage,\n menuItems,\n hideUI: hideUIProp,\n preview = \"single_page\",\n}: SectionPageResizerProps) {\n const shouldHideUI = useShouldHideUI()\n const hideUI = hideUIProp ?? shouldHideUI\n \n const [zoom, setZoom] = useState(defaultZoom)\n const [fitMode, setFitMode] = useState<FitMode>(\"none\")\n const containerRef = useRef<HTMLDivElement>(null)\n const contentRef = useRef<HTMLDivElement>(null)\n const [autoFitInitialized, setAutoFitInitialized] = useState(false)\n const [lastContainerWidth, setLastContainerWidth] = useState<number>(0)\n const [isInitializing, setIsInitializing] = useState(true)\n\n // Calculate fit-to-container zoom levels\n const calculateFitZoom = (mode: FitMode) => {\n if (!containerRef.current || !contentRef.current) return zoom\n\n const container = containerRef.current.getBoundingClientRect()\n\n const firstSection = contentRef.current.querySelector(\"[data-section-content]\")\n if (!firstSection) return zoom\n\n let contentWidth = Number.parseInt(firstSection.getAttribute(\"data-natural-width\") || \"0\")\n const contentHeight = Number.parseInt(firstSection.getAttribute(\"data-natural-height\") || \"0\")\n\n if (contentWidth === 0 || contentHeight === 0) return zoom\n\n // For two-page preview, account for 2x page width when calculating fit to width\n if (preview === \"two_pages\") {\n contentWidth = contentWidth * 2\n }\n\n const availableWidth = container.width - 32\n // Use screen height for better \"fit to height\" calculation, accounting for bottom controls\n const availableHeight = screen.height - 120\n\n const scaleX = (availableWidth / contentWidth) * 100\n const scaleY = (availableHeight / contentHeight) * 100\n\n switch (mode) {\n case \"width\":\n return Math.min(Math.max(scaleX, minZoom), maxZoom)\n case \"height\":\n return Math.min(Math.max(scaleY, minZoom), maxZoom)\n case \"both\":\n return Math.min(Math.max(Math.min(scaleX, scaleY), minZoom), maxZoom)\n default:\n return zoom\n }\n }\n\n // Handle fit mode changes\n const handleFitMode = (mode: FitMode) => {\n setFitMode(mode)\n if (mode !== \"none\") {\n const newZoom = calculateFitZoom(mode)\n setZoom(newZoom)\n }\n }\n\n // Zoom in/out buttons with 25% steps\n const zoomIn = () => {\n const newZoom = Math.min(zoom + 25, maxZoom)\n setZoom(newZoom)\n setFitMode(\"none\")\n }\n\n const zoomOut = () => {\n const newZoom = Math.max(zoom - 25, minZoom)\n setZoom(newZoom)\n setFitMode(\"none\")\n }\n\n // Reset zoom\n const resetZoom = () => {\n setZoom(defaultZoom)\n setFitMode(\"none\")\n }\n\n // Handle initialization and window resize\n useEffect(() => {\n const handleInitialization = () => {\n if (!containerRef.current || !contentRef.current) return\n\n const container = containerRef.current.getBoundingClientRect()\n const currentContainerWidth = container.width\n\n if (!autoFitInitialized) {\n const firstSection = contentRef.current.querySelector(\"[data-section-content]\")\n if (firstSection) {\n const sectionWidth = Number.parseInt(firstSection.getAttribute(\"data-natural-width\") || \"0\")\n if (sectionWidth > 0) {\n if (sectionWidth > currentContainerWidth - 48) {\n const newZoom = calculateFitZoom(\"both\")\n setFitMode(\"both\")\n setZoom(newZoom)\n }\n setAutoFitInitialized(true)\n setLastContainerWidth(currentContainerWidth)\n setIsInitializing(false)\n return\n }\n }\n if (isInitializing) {\n setTimeout(handleInitialization, 50)\n return\n }\n }\n\n setIsInitializing(false)\n }\n\n const handleResize = () => {\n if (!containerRef.current || isInitializing) return\n\n const container = containerRef.current.getBoundingClientRect()\n const currentContainerWidth = container.width\n\n if (Math.abs(currentContainerWidth - lastContainerWidth) > 10) {\n if (fitMode !== \"none\") {\n const newZoom = calculateFitZoom(fitMode)\n setZoom(newZoom)\n }\n setLastContainerWidth(currentContainerWidth)\n }\n }\n\n handleInitialization()\n\n window.addEventListener(\"resize\", handleResize)\n return () => {\n window.removeEventListener(\"resize\", handleResize)\n }\n }, [fitMode, minZoom, maxZoom, autoFitInitialized, lastContainerWidth, isInitializing])\n\n const scaleValue = zoom / 100\n\n // If hiding UI, render children directly without any wrapper or controls\n if (hideUI) {\n return (\n <ZoomContext.Provider value={{ zoom: 100, scaleValue: 1, hideUI: true }}>\n <div className={className}>{children}</div>\n </ZoomContext.Provider>\n )\n }\n\n return (\n <ZoomContext.Provider value={{ zoom, scaleValue, hideUI: false }}>\n <div ref={containerRef} className={`flex flex-col min-h-0 ${className}`}>\n {/* Global Controls - Unscaled */}\n <div data-uhuu-editor className=\"fixed right-4 bottom-4 z-50 flex items-center gap-1.5 px-2.5 py-1.5 bg-white/90 backdrop-blur-md border border-gray-200/60 rounded-lg shadow-sm\">\n {menuItems}\n <div className=\"h-4 w-px bg-gray-200 mx-0.5\" />\n <DropdownMenu modal={false}>\n <DropdownMenuTrigger asChild>\n <Button variant=\"ghost\" size=\"sm\" title=\"Zoom\" className=\"text-xs font-medium text-gray-700 hover:bg-gray-100/80 h-7 px-2.5\">\n {Math.round(zoom)}%\n <ChevronDown className=\"w-3 h-3 ml-1 opacity-60\" />\n </Button>\n </DropdownMenuTrigger>\n <DropdownMenuContent className=\"w-52 p-1.5\" align=\"end\">\n <DropdownMenuItem\n onClick={() => handleFitMode(\"width\")}\n className={`cursor-pointer flex items-center ${fitMode === \"width\" ? \"bg-gray-100\" : \"\"}`}\n >\n <UnfoldHorizontal className=\"w-4 h-4 mr-2\" />\n <span>Fit to Width</span>\n </DropdownMenuItem>\n <DropdownMenuItem\n onClick={() => handleFitMode(\"height\")}\n className={`cursor-pointer flex items-center ${fitMode === \"height\" ? \"bg-gray-100\" : \"\"}`}\n >\n <UnfoldVertical className=\"w-4 h-4 mr-2\" />\n <span>Fit to Height</span>\n </DropdownMenuItem>\n <DropdownMenuItem\n onClick={() => handleFitMode(\"both\")}\n className={`cursor-pointer flex items-center ${fitMode === \"both\" ? \"bg-gray-100\" : \"\"}`}\n >\n <Maximize className=\"w-4 h-4 mr-2\" />\n <span>Fit to Page</span>\n </DropdownMenuItem>\n <DropdownMenuSeparator className=\"my-1.5\" />\n \n {/* Zoom Controls - Compact inline layout */}\n <div className=\"flex items-center justify-center gap-2 px-3 py-2.5\" onClick={(e) => e.stopPropagation()}>\n <Button\n variant=\"ghost\"\n size=\"sm\"\n onClick={(e) => {\n e.stopPropagation()\n zoomOut()\n }}\n disabled={zoom <= minZoom}\n className=\"h-8 w-8 p-0 hover:bg-gray-100 disabled:opacity-40\"\n title=\"Zoom out (25%)\"\n >\n <ZoomOut className=\"w-4 h-4\" />\n </Button>\n \n <div className=\"relative\">\n <input\n type=\"number\"\n value={Math.round(zoom)}\n onChange={(e) => {\n const value = Number.parseInt(e.target.value)\n if (!isNaN(value)) {\n const clampedValue = Math.min(Math.max(value, minZoom), maxZoom)\n setZoom(clampedValue)\n setFitMode(\"none\")\n }\n }}\n onFocus={(e) => e.target.select()}\n className=\"w-20 pr-6 text-center text-sm text-gray-700 bg-white border border-gray-300 rounded px-2 py-1.5 focus:outline-none focus:ring-2 focus:ring-blue-500 focus:border-transparent transition-all\"\n min={minZoom}\n max={maxZoom}\n />\n <span className=\"absolute right-2 top-1/2 -translate-y-1/2 text-xs text-gray-400 pointer-events-none\">%</span>\n </div>\n \n <Button\n variant=\"ghost\"\n size=\"sm\"\n onClick={(e) => {\n e.stopPropagation()\n zoomIn()\n }}\n disabled={zoom >= maxZoom}\n className=\"h-8 w-8 p-0 hover:bg-gray-100 disabled:opacity-40\"\n title=\"Zoom in (25%)\"\n >\n <ZoomIn className=\"w-4 h-4\" />\n </Button>\n </div>\n </DropdownMenuContent>\n </DropdownMenu>\n </div>\n\n {/* Content Container */}\n <div ref={contentRef}>\n <div className={preview === \"two_pages\" ? \"group_two_pages\" : \"flex flex-col items-center\"}>{children}</div>\n </div>\n\n <div className=\"flex justify-center pb-16\">\n <Button size=\"sm\" variant=\"outline\" onClick={() => (onAddPage ? onAddPage() : null)}>\n <Plus />\n </Button>\n </div>\n </div>\n </ZoomContext.Provider>\n )\n}\n","import * as React from \"react\"\nimport * as SheetPrimitive from \"@radix-ui/react-dialog\"\nimport { XIcon } from \"lucide-react\"\nimport { cn } from \"./cn\"\n\nconst Sheet = SheetPrimitive.Root\n\nconst SheetTrigger = SheetPrimitive.Trigger\n\nconst SheetClose = SheetPrimitive.Close\n\nconst SheetPortal = SheetPrimitive.Portal\n\nconst SheetOverlay = React.forwardRef<\n React.ElementRef<typeof SheetPrimitive.Overlay>,\n React.ComponentPropsWithoutRef<typeof SheetPrimitive.Overlay>\n>(({ className, ...props }, ref) => (\n <SheetPrimitive.Overlay\n className={cn(\n \"fixed inset-0 z-50 bg-black/50 data-[state=open]:animate-in data-[state=closed]:animate-out data-[state=closed]:fade-out-0 data-[state=open]:fade-in-0\",\n className\n )}\n {...props}\n ref={ref}\n />\n))\nSheetOverlay.displayName = SheetPrimitive.Overlay.displayName\n\ninterface SheetContentProps\n extends React.ComponentPropsWithoutRef<typeof SheetPrimitive.Content> {\n side?: \"top\" | \"right\" | \"bottom\" | \"left\"\n}\n\nconst SheetContent = React.forwardRef<\n React.ElementRef<typeof SheetPrimitive.Content>,\n SheetContentProps\n>(({ side = \"right\", className, children, ...props }, ref) => (\n <SheetPortal>\n <SheetOverlay />\n <SheetPrimitive.Content\n ref={ref}\n className={cn(\n \"fixed z-50 gap-4 bg-white p-6 shadow-lg transition ease-in-out data-[state=open]:animate-in data-[state=closed]:animate-out data-[state=closed]:duration-300 data-[state=open]:duration-500\",\n side === \"top\" &&\n \"inset-x-0 top-0 border-b data-[state=closed]:slide-out-to-top data-[state=open]:slide-in-from-top\",\n side === \"bottom\" &&\n \"inset-x-0 bottom-0 border-t data-[state=closed]:slide-out-to-bottom data-[state=open]:slide-in-from-bottom\",\n side === \"left\" &&\n \"inset-y-0 left-0 h-full w-3/4 border-r data-[state=closed]:slide-out-to-left data-[state=open]:slide-in-from-left sm:max-w-sm\",\n side === \"right\" &&\n \"inset-y-0 right-0 h-full w-3/4 border-l data-[state=closed]:slide-out-to-right data-[state=open]:slide-in-from-right sm:max-w-sm\",\n className\n )}\n {...props}\n >\n {children}\n <SheetPrimitive.Close className=\"absolute right-4 top-4 rounded-sm opacity-70 ring-offset-white transition-opacity hover:opacity-100 focus:outline-none focus:ring-2 focus:ring-gray-400 focus:ring-offset-2 disabled:pointer-events-none data-[state=open]:bg-gray-100\">\n <XIcon className=\"h-4 w-4\" />\n <span className=\"sr-only\">Close</span>\n </SheetPrimitive.Close>\n </SheetPrimitive.Content>\n </SheetPortal>\n))\nSheetContent.displayName = SheetPrimitive.Content.displayName\n\nconst SheetHeader = ({\n className,\n ...props\n}: React.HTMLAttributes<HTMLDivElement>) => (\n <div\n className={cn(\n \"flex flex-col space-y-2 text-center sm:text-left\",\n className\n )}\n {...props}\n />\n)\nSheetHeader.displayName = \"SheetHeader\"\n\nconst SheetFooter = ({\n className,\n ...props\n}: React.HTMLAttributes<HTMLDivElement>) => (\n <div\n className={cn(\n \"flex flex-col-reverse sm:flex-row sm:justify-end sm:space-x-2\",\n className\n )}\n {...props}\n />\n)\nSheetFooter.displayName = \"SheetFooter\"\n\nconst SheetTitle = React.forwardRef<\n React.ElementRef<typeof SheetPrimitive.Title>,\n React.ComponentPropsWithoutRef<typeof SheetPrimitive.Title>\n>(({ className, ...props }, ref) => (\n <SheetPrimitive.Title\n ref={ref}\n className={cn(\"text-lg font-medium text-gray-900\", className)}\n {...props}\n />\n))\nSheetTitle.displayName = SheetPrimitive.Title.displayName\n\nconst SheetDescription = React.forwardRef<\n React.ElementRef<typeof SheetPrimitive.Description>,\n React.ComponentPropsWithoutRef<typeof SheetPrimitive.Description>\n>(({ className, ...props }, ref) => (\n <SheetPrimitive.Description\n ref={ref}\n className={cn(\"text-sm text-gray-500\", className)}\n {...props}\n />\n))\nSheetDescription.displayName = SheetPrimitive.Description.displayName\n\nexport {\n Sheet,\n SheetPortal,\n SheetOverlay,\n SheetTrigger,\n SheetClose,\n SheetContent,\n SheetHeader,\n SheetFooter,\n SheetTitle,\n SheetDescription,\n}\n\n","import * as React from 'react';\nimport { Lock } from 'lucide-react';\nimport { ReorderItem } from './page-group-utils';\nimport type { PageComponent } from './page-group-utils';\nimport { getPagePayload } from './template-data-provider';\nimport { resolveIntegrationForPage } from './integration-utils';\n\ninterface DefaultRenderThumbnailOptions {\n // PageComponent registry: map of pageId to React component\n pageComponents: { [pageId: string]: PageComponent };\n \n // Payload to pass to PageComponents\n payload?: any;\n \n // Page setup dimensions (same as Pagination setup prop) - in millimeters\n setup?: { width: number; height: number };\n \n // Optional: Custom thumbnail dimensions (height auto-derives from page aspect if omitted)\n thumbnailWidth?: number;\n thumbnailHeight?: number;\n}\n\n/**\n * Creates a default renderThumbnail function that renders actual PageComponents\n * instead of reference images. This ensures thumbnails accurately represent\n * the rendered page content.\n * \n * @internal - This is an internal utility, not part of the public API\n */\nexport function createDefaultRenderThumbnail(\n options: DefaultRenderThumbnailOptions\n): (item: ReorderItem, index: number, isDragging?: boolean) => React.ReactNode {\n const { \n pageComponents, \n payload, \n setup = { width: 210, height: 297 }, // Default A4 size in mm\n thumbnailWidth = 200, \n thumbnailHeight, \n } = options;\n \n const pageWidthMm = setup.width || 210;\n const pageHeightMm = setup.height || 297;\n const pageAspectRatio = pageWidthMm / pageHeightMm;\n\n // Derive thumbnail height from page aspect ratio if not provided\n const finalThumbnailWidth = thumbnailWidth;\n const finalThumbnailHeight = thumbnailHeight ?? Math.round(finalThumbnailWidth / pageAspectRatio);\n\n // Convert mm to pixels at 96dpi (1mm = 3.779527559px) for accurate scaling\n const pageWidthPx = pageWidthMm * 3.779527559;\n const pageHeightPx = pageHeightMm * 3.779527559;\n\n \n return (item: ReorderItem, index: number, isDragging?: boolean) => {\n const strictPosition = (item as any).strictPosition;\n const isLocked = strictPosition === 'start' || strictPosition === 'end';\n \n if (item.kind === 'group') {\n // Group thumbnail: show first page with group indicator\n const firstPageId = item.firstPageId as string | undefined;\n const firstPageComponentKey = item.firstPageComponentKey ?? firstPageId;\n const firstPagePayload = getPagePayload(payload, { id: firstPageId, componentKey: firstPageComponentKey });\n // Use component from item if available, otherwise fall back to pageComponents registry\n const FirstPageComponent = item.firstPageComponent || (firstPageComponentKey ? pageComponents[firstPageComponentKey] : null);\n \n // Resolve integration data for group (group pages use the group's integration)\n // For groups, instanceId is the group ID, so we can directly access it\n const integration = payload?.integrations?.[item.id]; \n \n return (\n <div \n className={`relative bg-white border-2 rounded-md overflow-hidden transition-all ${\n isDragging \n ? 'border-blue-400 shadow-2xl scale-105' \n : isLocked\n ? 'border-gray-300 bg-gray-50'\n : 'border-blue-300 hover:border-blue-400 hover:shadow-lg'\n }`}\n style={{ width: `${finalThumbnailWidth}px`, height: `${finalThumbnailHeight}px` }}\n >\n {/* Render actual PageComponent */}\n {FirstPageComponent ? (\n <div \n className=\"w-full h-full flex items-center justify-center bg-gray-50 overflow-hidden relative pointer-events-none\"\n >\n <div \n className=\"absolute w-full h-full flex items-center justify-center pointer-events-none\"\n style={{\n transform: `scale(${Math.min(finalThumbnailWidth / pageWidthPx, finalThumbnailHeight / pageHeightPx)})`,\n transformOrigin: 'center',\n }}\n >\n <div className=\"!shrink-0\" style={{ width: `${pageWidthPx}px`, height: `${pageHeightPx}px`, backgroundColor: 'white', pointerEvents: 'none' }}>\n <FirstPageComponent\n payload={payload}\n pageId={firstPageId}\n templateId={firstPageComponentKey}\n pagePayload={firstPagePayload}\n componentKey={firstPageComponentKey}\n integration={integration}\n />\n </div>\n </div>\n </div>\n ) : (\n <div className=\"w-full h-full flex items-center justify-center bg-gray-50 pointer-events-none\">\n <div className=\"text-center p-4\">\n <div className=\"text-sm font-medium text-gray-700\">Group {item.id}</div>\n <div className=\"text-xs text-gray-500 mt-1\">{firstPageId || 'No preview'}</div>\n </div>\n </div>\n )}\n \n {/* Group indicator badge */}\n <div className=\"absolute top-2 right-2 px-2 py-1 bg-blue-600/80 backdrop-blur-sm text-white text-xs font-medium rounded shadow-lg pointer-events-none\">\n Group ({item.pageCount} pages)\n </div>\n \n {/* Lock indicator for strict position */}\n {isLocked && (\n <div className=\"absolute top-2 left-2 px-2 py-1 bg-gray-600/80 backdrop-blur-sm text-white text-xs font-medium rounded shadow-lg pointer-events-none flex items-center gap-1\">\n <Lock className=\"size-3\" />\n <span>{strictPosition === 'start' ? 'Start' : 'End'}</span>\n </div>\n )}\n \n {/* Group info overlay */}\n <div className=\"absolute bottom-0 left-0 right-0 bg-black/40 backdrop-blur-sm p-3 pointer-events-none\">\n <div className=\"flex items-center justify-between gap-2 text-white\">\n <div className=\"flex-1 min-w-0\">\n <div className=\"text-sm font-medium truncate\">\n {item.label || item.id}\n </div>\n <div className=\"text-xs opacity-90 truncate\">{item.id}</div>\n </div>\n <div className=\"px-2 py-1 bg-blue-600/80 backdrop-blur-sm rounded text-xs shrink-0 font-medium\">\n Group\n </div>\n </div>\n </div>\n \n {/* Drag indicator */}\n {isDragging && (\n <div className=\"absolute inset-0 flex items-center justify-center bg-blue-500/10 pointer-events-none\">\n <div className=\"text-blue-600 font-medium text-sm bg-white/90 px-3 py-1 rounded-full shadow-lg\">\n Dragging Group...\n </div>\n </div>\n )}\n </div>\n );\n } else {\n // Standalone page thumbnail\n const pageId = item.pageId as string | undefined;\n const pageComponentKey = item.pageComponentKey ?? pageId;\n const pagePayload = getPagePayload(payload, { id: pageId, componentKey: pageComponentKey });\n // Use component from item if available, otherwise fall back to pageComponents registry\n const PageComponent = item.pageComponent || (pageComponentKey ? pageComponents[pageComponentKey] : null);\n \n // Resolve integration data for standalone page\n const integration = pageId ? resolveIntegrationForPage(payload, { id: pageId }) : undefined;\n return (\n <div \n className={`relative bg-white border-2 rounded-md overflow-hidden transition-all ${\n isDragging \n ? 'border-blue-400 shadow-2xl scale-105' \n : isLocked\n ? 'border-gray-300 bg-gray-50'\n : 'border-gray-200 hover:border-blue-300 hover:shadow-lg'\n }`}\n style={{ width: `${finalThumbnailWidth}px`, height: `${finalThumbnailHeight}px` }}\n >\n {/* Render actual PageComponent */}\n {PageComponent ? (\n <div \n className=\"w-full h-full flex items-center justify-center bg-gray-50 overflow-hidden relative pointer-events-none\"\n >\n <div \n className=\"absolute inset-0 flex items-center justify-center pointer-events-none\"\n style={{\n transform: `scale(${Math.min(finalThumbnailWidth / pageWidthPx, finalThumbnailHeight / pageHeightPx)})`,\n transformOrigin: 'center',\n }}\n >\n <div className=\"!shrink-0\" style={{ width: `${pageWidthPx}px`, height: `${pageHeightPx}px`, backgroundColor: 'white', pointerEvents: 'none' }}>\n <PageComponent \n payload={payload}\n pageId={pageId}\n templateId={pageComponentKey}\n pagePayload={pagePayload}\n componentKey={pageComponentKey}\n integration={integration}\n />\n </div>\n </div>\n </div>\n ) : (\n <div className=\"w-full h-full flex items-center justify-center bg-gray-50 pointer-events-none\">\n <div className=\"text-center p-4\">\n <div className=\"text-sm font-medium text-gray-700\">Page {item.pageNum}</div>\n <div className=\"text-xs text-gray-500 mt-1\">{pageId || 'No preview'}</div>\n </div>\n </div>\n )}\n \n {/* Lock indicator for strict position */}\n {isLocked && (\n <div className=\"absolute top-2 left-2 px-2 py-1 bg-gray-600/80 backdrop-blur-sm text-white text-xs font-medium rounded shadow-lg pointer-events-none flex items-center gap-1\">\n <Lock className=\"size-3\" />\n <span>{strictPosition === 'start' ? 'Start' : 'End'}</span>\n </div>\n )}\n \n {/* Page info overlay */}\n <div className=\"absolute bottom-0 left-0 right-0 bg-black/40 backdrop-blur-sm p-3 pointer-events-none\">\n <div className=\"flex items-center justify-between gap-2 text-white\">\n <div className=\"flex-1 min-w-0\">\n <div className=\"text-sm font-medium truncate\">\n {item.pageLabel || `Page ${item.pageNum}`}\n </div>\n <div className=\"text-xs opacity-90 truncate\">{item.pageId}</div>\n </div>\n <div className=\"px-2 py-1 bg-white/20 backdrop-blur-sm rounded text-xs shrink-0\">\n Page\n </div>\n </div>\n </div>\n \n {/* Drag indicator */}\n {isDragging && (\n <div className=\"absolute inset-0 flex items-center justify-center bg-blue-500/10 pointer-events-none\">\n <div className=\"text-blue-600 font-medium text-sm bg-white/90 px-3 py-1 rounded-full shadow-lg\">\n Dragging...\n </div>\n </div>\n )}\n </div>\n );\n }\n };\n}\n","import { Plus } from 'lucide-react';\nimport { Sheet, SheetContent, SheetHeader, SheetTitle, SheetDescription } from '../../ui/sheet';\nimport { AvailableItem, AvailableGroupItem, AvailablePageItem } from './use-page-groups';\nimport type { PageComponent, ReorderItem } from './page-group-utils';\nimport { createDefaultRenderThumbnail } from './default-render-thumbnail';\nimport * as React from 'react';\n\ninterface AddPageDialogProps {\n open: boolean;\n onOpenChange: (open: boolean) => void;\n availableItems: AvailableItem[];\n onSelectItem: (item: AvailableItem) => Promise<void> | void;\n pageComponents?: { [pageId: string]: PageComponent };\n payload?: any;\n setup?: { width: number; height: number };\n gridColsClass?: string;\n // MVP: No customization props, just works\n}\n\nexport function AddPageDialog({\n open,\n onOpenChange,\n availableItems,\n onSelectItem,\n pageComponents,\n payload,\n setup = { width: 210, height: 297 },\n gridColsClass = \"grid grid-cols-2 md:grid-cols-3 lg:grid-cols-4 xl:grid-cols-6 gap-6\",\n}: AddPageDialogProps) {\n const handleSelect = (item: AvailableItem) => {\n onOpenChange(false);\n void onSelectItem(item);\n };\n\n const pageWidthMm = setup.width || 210;\n const pageHeightMm = setup.height || 297;\n const pageAspectRatio = pageWidthMm / pageHeightMm;\n const thumbnailWidth = 200;\n const thumbnailHeight = Math.round(thumbnailWidth / pageAspectRatio);\n\n const defaultRenderThumbnail = React.useMemo(() => {\n if (!pageComponents) return null;\n return createDefaultRenderThumbnail({\n pageComponents,\n payload,\n setup,\n thumbnailWidth,\n thumbnailHeight,\n });\n }, [pageComponents, payload, setup, thumbnailWidth, thumbnailHeight]);\n\n const toReorderItem = (item: AvailableItem, index: number): ReorderItem => {\n if (item.kind === 'group') {\n const group = item as AvailableGroupItem;\n const firstPageComponentKey = group.pageComponentKeys?.[0];\n return {\n kind: 'group',\n id: item.id,\n label: item.label,\n pageCount: (group.pageComponentKeys ?? []).length,\n firstPageId: firstPageComponentKey,\n firstPageComponentKey,\n } as ReorderItem;\n }\n\n const pageItem = item as AvailablePageItem;\n const componentKey = pageItem.componentKey ?? pageItem.id;\n return {\n kind: 'page',\n id: pageItem.id,\n pageId: pageItem.id,\n pageComponentKey: componentKey,\n pageLabel: pageItem.label,\n pageNum: index + 1,\n } as ReorderItem;\n };\n\n return (\n <Sheet open={open} onOpenChange={onOpenChange}>\n <SheetContent side=\"bottom\" className=\"h-[90vh] p-0 gap-0 w-full max-w-none rounded-t-md\" data-uhuu-editor>\n <SheetHeader className=\"border-b border-gray-200 p-4\">\n <div className=\"flex items-center gap-3\">\n <div className=\"w-10 h-10 bg-gray-100 rounded-full flex items-center justify-center\">\n <Plus className=\"w-5 h-5\" />\n </div>\n <div className=\"flex-1\">\n <SheetTitle className=\"text-lg font-medium text-gray-900\">\n Add Page or Group\n </SheetTitle>\n <SheetDescription className=\"text-sm text-gray-500 mt-1.5\">\n Select a page or group to add to your document.\n </SheetDescription>\n </div>\n </div>\n </SheetHeader>\n\n <div className=\"flex-1 overflow-hidden\">\n <div className=\"h-full max-h-[calc(90vh-100px)] overflow-auto px-6 py-6\">\n {availableItems.length === 0 ? (\n <div className=\"text-center py-16\">\n <div className=\"w-16 h-16 bg-gray-100 rounded-full flex items-center justify-center mx-auto mb-4\">\n <Plus className=\"w-8 h-8 text-gray-400\" />\n </div>\n <div className=\"text-lg font-medium text-gray-900 mb-2\">No items available</div>\n <p className=\"text-gray-500 mb-4\">All pages and groups have been added.</p>\n </div>\n ) : (\n <div className={gridColsClass}>\n {availableItems.map((item, index) => {\n const isGroup = item.kind === 'group';\n const id = item.id;\n const label = isGroup\n ? (item.label || `Group ${index + 1}`)\n : (item.label || `Page ${item.id}`);\n const pageCount = isGroup ? ((item as AvailableGroupItem).pageComponentKeys ?? []).length : 1;\n const hasDefaultThumbnail = !!defaultRenderThumbnail;\n return (\n <div\n key={id}\n onClick={() => handleSelect(item)}\n className={\n hasDefaultThumbnail\n ? \"relative w-full h-[280px] cursor-pointer rounded-md overflow-hidden transition-all group\"\n : \"relative w-full h-[280px] cursor-pointer bg-white border-2 rounded-md overflow-hidden transition-all border-gray-200 hover:border-blue-400 hover:shadow-lg group\"\n }\n >\n {/* Thumbnail area */}\n <div className=\"w-full h-full relative overflow-hidden\">\n {defaultRenderThumbnail && (\n <div className=\"absolute inset-0 flex items-center pointer-events-none\">\n {defaultRenderThumbnail(toReorderItem(item, index), index, false)}\n </div>\n )}\n {!defaultRenderThumbnail && (\n <>\n {isGroup ? (\n <div className=\"p-4\">\n <div className=\"w-16 h-16 bg-blue-100 rounded-full flex items-center justify-center mx-auto mb-3\">\n <Plus className=\"w-8 h-8 text-blue-600\" />\n </div>\n <div className=\"text-sm font-medium text-gray-700\">{label}</div>\n <div className=\"text-xs text-gray-500 mt-1\">\n {pageCount} {pageCount === 1 ? 'page' : 'pages'}\n </div>\n </div>\n ) : (\n <div className=\"p-4\">\n <div className=\"w-16 h-16 bg-gray-100 rounded-full flex items-center justify-center mx-auto mb-3\">\n <Plus className=\"w-8 h-8 text-gray-400\" />\n </div>\n <div className=\"text-sm font-medium text-gray-700\">{label}</div>\n <div className=\"text-xs text-gray-500 mt-1\">{id}</div>\n </div>\n )}\n </>\n )}\n </div>\n\n {!defaultRenderThumbnail && (\n <>\n {/* Group indicator badge */}\n {isGroup && (\n <div className=\"absolute top-2 right-2 px-2 py-1 bg-blue-600/80 backdrop-blur-sm text-white text-xs font-medium rounded shadow-lg pointer-events-none\">\n Group ({pageCount} {pageCount === 1 ? 'page' : 'pages'})\n </div>\n )}\n\n {/* Item info overlay - positioned at bottom to match reorder dialog */}\n <div className=\"absolute bottom-0 left-0 right-0 bg-black/40 backdrop-blur-sm p-3 pointer-events-none\">\n <div className=\"flex items-center justify-between gap-2 text-white\">\n <div className=\"flex-1 min-w-0\">\n <div className=\"text-sm font-medium truncate\">{label}</div>\n <div className=\"text-xs opacity-90 truncate\">{id}</div>\n </div>\n {isGroup ? (\n <div className=\"px-2 py-1 bg-blue-600/80 backdrop-blur-sm rounded text-xs shrink-0 font-medium\">\n Group\n </div>\n ) : (\n <div className=\"px-2 py-1 bg-white/20 backdrop-blur-sm rounded text-xs shrink-0\">\n Page\n </div>\n )}\n </div>\n </div>\n </>\n )}\n\n {/* Small hover indicator */}\n <div className=\"absolute top-3 left-3 w-8 h-8 bg-black rounded-full flex items-center justify-center shadow-lg opacity-0 group-hover:opacity-100 transition-opacity pointer-events-none z-10\">\n <Plus className=\"w-4 h-4 text-white\" />\n </div>\n </div>\n );\n })}\n </div>\n )}\n </div>\n </div>\n </SheetContent>\n </Sheet>\n );\n}\n","import * as React from \"react\"\nimport { useState, useEffect } from \"react\"\nimport {\n DndContext,\n closestCenter,\n KeyboardSensor,\n PointerSensor,\n useSensor,\n useSensors,\n type DragEndEvent,\n type DragStartEvent,\n DragOverlay,\n} from \"@dnd-kit/core\"\nimport {\n arrayMove,\n SortableContext,\n sortableKeyboardCoordinates,\n rectSortingStrategy,\n} from \"@dnd-kit/sortable\"\nimport { useSortable } from \"@dnd-kit/sortable\"\nimport { CSS } from \"@dnd-kit/utilities\"\n\ninterface SortableItemProps<T> {\n item: T\n index: number\n renderItem: (item: T, index: number, isDragging?: boolean) => React.ReactNode\n renderDragIndicator?: (item: T, index: number) => React.ReactNode\n keyExtractor: (item: T) => string\n disabled?: boolean\n}\n\nfunction SortableItem<T>({\n item,\n index,\n renderItem,\n renderDragIndicator,\n keyExtractor,\n disabled = false,\n}: SortableItemProps<T>) {\n const { attributes, listeners, setNodeRef, transform, transition, isDragging } = useSortable({\n id: keyExtractor(item),\n disabled,\n })\n\n const style = {\n transform: CSS.Transform.toString(transform),\n transition,\n }\n\n return (\n <div ref={setNodeRef} style={style} className={`relative group/drag-item ${isDragging ? \"opacity-50\" : \"\"} ${disabled ? \"opacity-60\" : \"\"}`}>\n {/* Main item content */}\n {renderItem(item, index, isDragging)}\n\n {/* Drag indicator overlay */}\n {!disabled && (\n renderDragIndicator ? (\n <div {...attributes} {...listeners}>\n {renderDragIndicator(item, index)}\n </div>\n ) : (\n /* If no drag indicator, make entire item draggable */\n <div\n {...attributes}\n {...listeners}\n className=\"absolute inset-0 cursor-grab active:cursor-grabbing touch-none\"\n />\n )\n )}\n </div>\n )\n}\n\nfunction DragOverlayItem<T>({\n item,\n index,\n renderItem,\n}: {\n item: T\n index: number\n renderItem: (item: T, index: number, isDragging?: boolean) => React.ReactNode\n}) {\n return <div className=\"rotate-2\">{renderItem(item, index, true)}</div>\n}\n\nexport interface DragDropGridProps<T> {\n items: T[]\n onChange: (reorderedItems: T[]) => void\n renderItem: (item: T, index: number, isDragging?: boolean) => React.ReactNode\n renderDragIndicator?: (item: T, index: number) => React.ReactNode\n keyExtractor: (item: T) => string\n gridColsClass?: string\n className?: string\n renderToolbar?: () => React.ReactNode\n renderEmptyState?: () => React.ReactNode\n showDebugInfo?: boolean\n renderDragOverlay?: (item: T, index: number) => React.ReactNode\n isItemDisabled?: (item: T) => boolean\n canDropAt?: (draggedItem: T, targetIndex: number, items: T[]) => boolean\n}\n\nexport default function DragDropGrid<T>({\n items: initialItems,\n onChange,\n renderItem,\n renderDragIndicator,\n keyExtractor,\n gridColsClass = \"grid grid-cols-2 md:grid-cols-3 lg:grid-cols-4 xl:grid-cols-6 2xl:grid-cols-6 gap-4\",\n className = \"\",\n renderToolbar,\n renderEmptyState,\n showDebugInfo = false,\n renderDragOverlay,\n isItemDisabled,\n canDropAt,\n}: DragDropGridProps<T>) {\n const [items, setItems] = useState<T[]>(initialItems)\n\n // Sync with parent state when initialItems changes\n useEffect(() => {\n setItems(initialItems)\n }, [initialItems])\n\n const [activeId, setActiveId] = useState<string | null>(null)\n\n const sensors = useSensors(\n useSensor(PointerSensor),\n useSensor(KeyboardSensor, {\n coordinateGetter: sortableKeyboardCoordinates,\n })\n )\n\n const handleDragStart = (event: DragStartEvent) => {\n const draggedItem = items.find((item) => keyExtractor(item) === event.active.id)\n // Prevent dragging disabled items\n if (draggedItem && isItemDisabled && isItemDisabled(draggedItem)) {\n return\n }\n setActiveId(event.active.id as string)\n }\n\n const handleDragEnd = (event: DragEndEvent) => {\n const { active, over } = event\n\n if (!over || active.id === over.id) {\n setActiveId(null)\n return\n }\n\n const draggedItem = items.find((item) => keyExtractor(item) === active.id)\n const oldIndex = items.findIndex((item) => keyExtractor(item) === active.id)\n const newIndex = items.findIndex((item) => keyExtractor(item) === over.id)\n\n // Prevent dragging disabled items\n if (draggedItem && isItemDisabled && isItemDisabled(draggedItem)) {\n setActiveId(null)\n return\n }\n\n // Check if drop is allowed at target position\n if (canDropAt && !canDropAt(draggedItem!, newIndex, items)) {\n setActiveId(null)\n return\n }\n\n if (oldIndex !== -1 && newIndex !== -1) {\n const newItems = arrayMove(items, oldIndex, newIndex)\n setItems(newItems)\n onChange(newItems)\n }\n\n setActiveId(null)\n }\n\n const activeItem = items.find((item) => keyExtractor(item) === activeId)\n const activeIndex = activeItem ? items.findIndex((item) => keyExtractor(item) === activeId) : -1\n\n return (\n <div className={`w-full ${className}`}>\n {renderToolbar && <div className=\"mb-6\">{renderToolbar()}</div>}\n\n {items.length === 0 && renderEmptyState ? (\n renderEmptyState()\n ) : (\n <div className=\"mb-6\">\n <DndContext\n sensors={sensors}\n collisionDetection={closestCenter}\n onDragStart={handleDragStart}\n onDragEnd={handleDragEnd}\n >\n <SortableContext items={items.map(keyExtractor)} strategy={rectSortingStrategy}>\n <div className={gridColsClass}>\n {items.map((item, index) => (\n <SortableItem\n key={keyExtractor(item)}\n item={item}\n index={index}\n renderItem={renderItem}\n renderDragIndicator={renderDragIndicator}\n keyExtractor={keyExtractor}\n disabled={isItemDisabled ? isItemDisabled(item) : false}\n />\n ))}\n </div>\n </SortableContext>\n <DragOverlay>\n {activeItem ? (\n renderDragOverlay ? (\n <div className=\"rotate-2 shadow-lg\">{renderDragOverlay(activeItem, activeIndex)}</div>\n ) : (\n <DragOverlayItem item={activeItem} index={activeIndex} renderItem={renderItem} />\n )\n ) : null}\n </DragOverlay>\n </DndContext>\n </div>\n )}\n\n {/* Debug info */}\n {showDebugInfo && (\n <div className=\"fixed top-4 left-4 bg-white rounded-lg border shadow-lg p-3 text-sm max-w-xs\">\n <div className=\"font-medium mb-1\">Debug Info</div>\n <div className=\"text-gray-600 text-xs\">\n Items: {items.length} | Active: {activeId || \"none\"}\n </div>\n <div className=\"text-xs text-gray-500 mt-1 break-all\">\n Order: {items.map((item, i) => `${i + 1}:${keyExtractor(item).slice(0, 3)}`).join(\" → \")}\n </div>\n </div>\n )}\n </div>\n )\n}\n\n","import * as React from \"react\"\nimport { cva, type VariantProps } from \"class-variance-authority\"\nimport { cn } from \"./cn\"\n\nconst badgeVariants = cva(\n \"inline-flex items-center rounded-md border px-2.5 py-0.5 text-xs font-medium transition-colors focus:outline-none focus:ring-2 focus:ring-offset-2\",\n {\n variants: {\n variant: {\n default: \"border-transparent bg-gray-900 text-white\",\n secondary: \"border-transparent bg-gray-100 text-gray-900\",\n outline: \"border-gray-300 text-gray-900 bg-white\",\n },\n },\n defaultVariants: {\n variant: \"default\",\n },\n }\n)\n\nexport interface BadgeProps\n extends React.HTMLAttributes<HTMLDivElement>,\n VariantProps<typeof badgeVariants> {}\n\nfunction Badge({ className, variant, ...props }: BadgeProps) {\n return (\n <div className={cn(badgeVariants({ variant }), className)} {...props} />\n )\n}\n\nexport { Badge, badgeVariants }\n\n","import * as React from \"react\"\nimport { GripVertical, ArrowUpDown, Lock } from \"lucide-react\"\nimport DragDropGrid from \"../../utility/drag-drop-grid\"\nimport { Sheet, SheetContent, SheetHeader, SheetTitle, SheetDescription, SheetFooter } from \"../../ui/sheet\"\nimport { Badge } from \"../../ui/badge\"\nimport { Button } from \"../../ui/button\"\nimport { createDefaultRenderThumbnail } from \"./default-render-thumbnail\"\nimport type { PageComponent } from \"./page-group-utils\"\n\nexport interface PageItem {\n id: string\n [key: string]: any\n}\n\nexport interface PageOrderDialogProps<T extends PageItem> {\n open: boolean\n onOpenChange: (open: boolean) => void\n pages: T[]\n onReorder: (newOrder: T[]) => void\n renderThumbnail?: (page: T, index: number, isDragging?: boolean) => React.ReactNode\n \n // NEW: For automatic thumbnail rendering\n pageComponents?: { [pageId: string]: PageComponent }\n payload?: any\n \n // Page setup dimensions (same as Pagination setup prop) - in millimeters\n setup?: { width: number; height: number }\n \n title?: string\n description?: string\n gridColsClass?: string\n}\n\n// Default page thumbnail component with simple preview\nfunction DefaultPageThumbnail<T extends PageItem>({\n page,\n index,\n isDragging,\n}: {\n page: T\n index: number\n isDragging?: boolean\n}) {\n const thumbnailWidth = 200\n const thumbnailHeight = 280\n const strictPosition = (page as any).strictPosition\n const isLocked = strictPosition === 'start' || strictPosition === 'end'\n\n return (\n <div\n className={`flex items-center justify-center border relative rounded-lg bg-white overflow-hidden transition-all ${\n isDragging\n ? \"opacity-50 border-gray-400 shadow-xl scale-105\"\n : isLocked\n ? \"border-gray-300 bg-gray-50\"\n : \"border-gray-200 group-hover/drag-item:border-gray-300 group-hover/drag-item:shadow-md\"\n }`}\n > \n <div\n className=\"flex items-center justify-center\"\n style={{\n width: `${thumbnailWidth}px`,\n height: `${thumbnailHeight}px`,\n }}\n >\n {/* Default content rendering */}\n {page.content || (\n <div className=\"text-center p-4\">\n <div className=\"text-sm font-medium text-gray-700\">{page.label || `Page ${index + 1}`}</div>\n <div className=\"text-xs text-gray-400 mt-1 font-mono\">{page.id}</div>\n </div>\n )}\n </div>\n\n {/* Page number badge */}\n <div className=\"absolute top-2 left-2 z-20\">\n <Badge variant=\"secondary\" className={`text-xs min-w-[24px] h-6 font-medium bg-white/95 backdrop-blur-sm flex items-center justify-center shadow-sm border border-gray-200 ${isLocked ? 'opacity-75' : ''}`}>\n {isLocked ? (\n <Lock className=\"size-3 text-gray-500\" />\n ) : (\n <>\n <span className=\"group-hover/drag-item:hidden\">{index + 1}</span>\n <GripVertical className=\"size-4 text-gray-400 hidden group-hover/drag-item:block\" />\n </>\n )}\n </Badge>\n </div>\n </div>\n )\n}\n\nexport function PageOrderDialog<T extends PageItem>({\n open,\n onOpenChange,\n pages,\n onReorder,\n renderThumbnail,\n pageComponents,\n payload,\n setup,\n title = \"Reorder Pages\",\n description = \"Drag and drop pages to change their order.\",\n gridColsClass = \"grid grid-cols-2 md:grid-cols-3 lg:grid-cols-4 xl:grid-cols-6 gap-6\",\n}: PageOrderDialogProps<T>) {\n // Track local order changes - only apply on save\n const [localPages, setLocalPages] = React.useState<T[]>(pages)\n const [hasChanges, setHasChanges] = React.useState(false)\n\n // Sync local state when pages prop changes (but only if dialog is closed or no local changes)\n React.useEffect(() => {\n if (!open) {\n setLocalPages(pages)\n setHasChanges(false)\n } else if (!hasChanges) {\n setLocalPages(pages)\n }\n }, [pages, open, hasChanges])\n\n const handleLocalReorder = (newOrder: T[]) => {\n setLocalPages(newOrder)\n setHasChanges(true)\n }\n\n const handleSave = () => {\n onReorder(localPages)\n setHasChanges(false)\n onOpenChange(false)\n }\n\n const handleCancel = () => {\n setLocalPages(pages)\n setHasChanges(false)\n onOpenChange(false)\n }\n\n // Auto-create default renderThumbnail if pageComponents provided and no valid custom renderThumbnail\n const defaultRenderThumbnail = React.useMemo(() => { \n // Only auto-create if renderThumbnail is not provided or is not a function\n if ((!renderThumbnail || typeof renderThumbnail !== 'function') && pageComponents) {\n return createDefaultRenderThumbnail({ pageComponents, payload, setup })\n }\n return null\n }, [renderThumbnail, pageComponents, payload, setup])\n \n const renderPageThumbnail = (page: T, index: number, isDragging?: boolean) => {\n // Priority: 1. Custom renderThumbnail (if it's a function), 2. Auto-created defaultRenderThumbnail, 3. DefaultPageThumbnail\n if (renderThumbnail && typeof renderThumbnail === 'function') {\n return renderThumbnail(page, index, isDragging)\n }\n if (defaultRenderThumbnail) {\n return defaultRenderThumbnail(page as any, index, isDragging)\n }\n return <DefaultPageThumbnail page={page} index={index} isDragging={isDragging} />\n }\n\n const renderEmptyState = () => (\n <div className=\"text-center py-20\">\n <div className=\"w-12 h-12 bg-gray-50 rounded-lg flex items-center justify-center mx-auto mb-3\">\n <ArrowUpDown className=\"w-6 h-6 text-gray-400\" />\n </div>\n <div className=\"text-base font-medium text-gray-900 mb-1\">No pages found</div>\n <p className=\"text-sm text-gray-500\">Add some pages to get started with reordering.</p>\n </div>\n )\n\n const keyExtractor = (page: T) => page.id\n\n // Check if an item has strictPosition and should be disabled from dragging\n const isItemDisabled = React.useCallback((page: T) => {\n const strictPosition = (page as any).strictPosition;\n return strictPosition === 'start' || strictPosition === 'end';\n }, []);\n\n // Check if an item can be dropped at a specific position\n const canDropAt = React.useCallback((draggedItem: T, targetIndex: number, items: T[]) => {\n const draggedPosition = (draggedItem as any).strictPosition;\n \n // Items with strictPosition cannot be dragged (should be caught by isItemDisabled, but double-check)\n if (draggedPosition === 'start' || draggedPosition === 'end') {\n return false;\n }\n\n // Find the boundaries of start, middle, and end sections\n let startEndIndex = -1;\n let endStartIndex = items.length;\n \n for (let i = 0; i < items.length; i++) {\n const position = (items[i] as any).strictPosition;\n if (position === 'start') {\n startEndIndex = i;\n } else if (position === 'end' && endStartIndex === items.length) {\n endStartIndex = i;\n // Don't break - continue to find all end items\n }\n }\n\n // Regular items can only be dropped in the middle section\n // (after all start items and before all end items)\n if (targetIndex <= startEndIndex) {\n return false;\n }\n\n if (targetIndex >= endStartIndex) {\n return false;\n }\n\n return true;\n }, []);\n\n return (\n <Sheet open={open} onOpenChange={(newOpen) => {\n // Only allow closing via explicit cancel/save buttons\n if (!newOpen) {\n handleCancel()\n }\n }}>\n <SheetContent \n side=\"bottom\" \n className=\"h-[90vh] p-0 gap-0 w-full max-w-none rounded-t-md flex flex-col [&>button]:hidden\"\n onPointerDownOutside={(e) => {\n // Prevent closing when clicking outside - use cancel/save buttons instead\n e.preventDefault()\n }}\n onEscapeKeyDown={(e) => {\n // Prevent escape from closing - use cancel button instead\n e.preventDefault()\n }}\n data-uhuu-editor\n >\n <SheetHeader className=\"border-b border-gray-200 p-4\">\n <div className=\"flex items-start justify-between\">\n <div className=\"flex-1\">\n <SheetTitle className=\"text-lg font-medium text-gray-900\">{title}</SheetTitle>\n <SheetDescription className=\"text-sm text-gray-500 mt-1.5\">{description}</SheetDescription>\n </div>\n <Badge variant=\"outline\" className=\"ml-4 text-xs\">\n {localPages.length} {localPages.length === 1 ? \"page\" : \"pages\"}\n </Badge>\n </div>\n </SheetHeader>\n\n <div className=\"flex-1 overflow-hidden flex flex-col\">\n <div className=\"flex-1 overflow-auto px-6 py-6\">\n <DragDropGrid\n items={localPages}\n onChange={handleLocalReorder}\n renderItem={renderPageThumbnail}\n keyExtractor={keyExtractor}\n renderEmptyState={renderEmptyState}\n gridColsClass={gridColsClass}\n className=\"pb-4\"\n isItemDisabled={isItemDisabled}\n canDropAt={canDropAt}\n />\n </div>\n </div>\n\n <SheetFooter className=\"border-t border-gray-200 px-4 py-3 gap-3\">\n <Button\n variant=\"outline\"\n onClick={handleCancel}\n >\n Cancel\n </Button>\n <Button\n variant=\"default\"\n onClick={handleSave}\n disabled={!hasChanges}\n >\n Save Changes\n </Button>\n </SheetFooter>\n </SheetContent>\n </Sheet>\n )\n}\n","import * as React from \"react\"\nimport { cn } from \"./cn\"\n\nexport interface SelectProps extends React.SelectHTMLAttributes<HTMLSelectElement> {}\n\nconst Select = React.forwardRef<HTMLSelectElement, SelectProps>(\n ({ className, children, ...props }, ref) => {\n return (\n <select\n className={cn(\n \"flex h-8 w-full rounded-md border border-gray-200 bg-white px-2.5 py-1 text-sm text-gray-900 outline-none transition-colors focus:border-gray-400 focus:ring-2 focus:ring-gray-200 focus:ring-offset-0 disabled:cursor-not-allowed disabled:opacity-50\",\n className\n )}\n ref={ref}\n {...props}\n >\n {children}\n </select>\n )\n }\n)\nSelect.displayName = \"Select\"\n\nexport { Select }\n\n\n","import * as React from 'react'\nimport * as SwitchPrimitive from '@radix-ui/react-switch'\nimport { cn } from './cn'\n\nexport interface SwitchProps extends React.ComponentProps<typeof SwitchPrimitive.Root> {}\n\nconst Switch = React.forwardRef<\n React.ElementRef<typeof SwitchPrimitive.Root>,\n SwitchProps\n>(({ className, ...props }, ref) => {\n return (\n <SwitchPrimitive.Root\n ref={ref}\n className={cn(\n 'peer inline-flex h-5 w-9 shrink-0 cursor-pointer items-center rounded-full border-2 border-transparent bg-gray-200 transition-colors focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-gray-400 focus-visible:ring-offset-2 focus-visible:ring-offset-white disabled:cursor-not-allowed disabled:opacity-50 data-[state=checked]:bg-gray-900 data-[state=unchecked]:bg-gray-200',\n className\n )}\n {...props}\n >\n <SwitchPrimitive.Thumb\n className={cn(\n 'pointer-events-none block h-4 w-4 rounded-full bg-white shadow-lg ring-0 transition-transform data-[state=checked]:translate-x-4 data-[state=unchecked]:translate-x-0'\n )}\n />\n </SwitchPrimitive.Root>\n )\n})\nSwitch.displayName = SwitchPrimitive.Root.displayName\n\nexport { Switch }\n","import * as React from 'react'\nimport * as SliderPrimitive from '@radix-ui/react-slider'\nimport { cn } from './cn'\n\nexport interface SliderProps extends React.ComponentProps<typeof SliderPrimitive.Root> {}\n\nconst Slider = React.forwardRef<\n React.ElementRef<typeof SliderPrimitive.Root>,\n SliderProps\n>(({ className, ...props }, ref) => {\n return (\n <SliderPrimitive.Root\n ref={ref}\n className={cn(\n 'relative flex w-full touch-none select-none items-center data-[disabled]:opacity-50',\n className\n )}\n {...props}\n >\n <SliderPrimitive.Track className=\"relative h-1.5 w-full grow overflow-hidden rounded-full bg-gray-200\">\n <SliderPrimitive.Range className=\"absolute h-full bg-gray-900\" />\n </SliderPrimitive.Track>\n <SliderPrimitive.Thumb className=\"block h-4 w-4 rounded-full border-2 border-gray-900 bg-white shadow transition-colors focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-gray-400 focus-visible:ring-offset-2 disabled:pointer-events-none disabled:opacity-50\" />\n </SliderPrimitive.Root>\n )\n})\nSlider.displayName = SliderPrimitive.Root.displayName\n\nexport { Slider }\n","import * as React from 'react'\nimport * as LabelPrimitive from '@radix-ui/react-label'\nimport { cn } from './cn'\n\nexport interface LabelProps extends React.ComponentProps<typeof LabelPrimitive.Root> {}\n\nconst Label = React.forwardRef<\n React.ElementRef<typeof LabelPrimitive.Root>,\n LabelProps\n>(({ className, ...props }, ref) => {\n return (\n <LabelPrimitive.Root\n ref={ref}\n className={cn(\n 'text-sm font-medium leading-none text-gray-700 peer-disabled:cursor-not-allowed peer-disabled:opacity-70',\n className\n )}\n {...props}\n />\n )\n})\nLabel.displayName = LabelPrimitive.Root.displayName\n\nexport { Label }\n","import { Check, Minus, Plus } from 'lucide-react';\nimport { Select } from '../../ui/select';\nimport { Switch } from '../../ui/switch';\nimport { Slider } from '../../ui/slider';\nimport { Label } from '../../ui/label';\nimport { Button } from '../../ui/button';\nimport { PageOption } from './page-editor';\nimport { PageItem } from './page-group-utils';\n\ntype PageOptionsRendererProps = {\n pageOptions: PageOption[];\n targetItem: PageItem;\n onChange: (pageOption: PageOption, targetItem: PageItem, value: string) => void;\n};\n\nexport function PageOptionsRenderer({\n pageOptions,\n targetItem,\n onChange,\n}: PageOptionsRendererProps) {\n const matchesTarget = (option: PageOption, item: PageItem) => {\n if (!option.appliesTo) return true;\n const targets = Array.isArray(option.appliesTo) ? option.appliesTo : [option.appliesTo];\n return targets.some(target => {\n if (typeof target === 'function') return target(item);\n // Match by instance ID, template ID, or component key\n return target === item.id || target === item.templateId || (item as any).componentKey === target;\n });\n };\n\n // Filter out options that don't apply to this page (getValue returns empty string or false for non-applicable options)\n const applicableOptions = pageOptions.filter(option => {\n if (!matchesTarget(option, targetItem)) return false;\n const value = option.getValue(targetItem);\n if (option.type === 'select' || option.type === 'color-series') {\n return value !== ''; // Only show if value is not empty\n }\n if (option.type === 'toggle') {\n // Always show toggles, they can be false\n return true;\n }\n // For slider and counter, always show\n return true;\n });\n\n const renderOption = (option: PageOption) => {\n const currentValue = option.getValue(targetItem);\n\n switch (option.type) {\n case 'select': {\n return (\n <div key={option.id} className=\"space-y-1.5\">\n <Label htmlFor={option.id} className=\"text-xs font-medium text-gray-500\">\n {option.label}\n </Label>\n <Select\n id={option.id}\n value={String(currentValue)}\n onChange={(e) => onChange(option, targetItem, e.target.value)}\n className=\"w-full text-sm\"\n >\n {option.options.map((opt) => (\n <option key={opt.value} value={opt.value}>\n {opt.label}\n </option>\n ))}\n </Select>\n </div>\n );\n }\n\n case 'toggle': {\n const boolValue = typeof currentValue === 'boolean' ? currentValue : currentValue === 'true';\n return (\n <div key={option.id} className=\"flex items-center justify-between py-1.5\">\n <Label htmlFor={option.id} className=\"text-xs font-medium text-gray-500\">\n {option.label}\n </Label>\n <Switch\n id={option.id}\n checked={boolValue}\n onCheckedChange={(checked) => onChange(option, targetItem, String(checked))}\n />\n </div>\n );\n }\n\n case 'slider': {\n const numValue = typeof currentValue === 'number' ? currentValue : Number(currentValue) || option.min;\n return (\n <div key={option.id} className=\"space-y-1.5\">\n <div className=\"flex items-center justify-between\">\n <Label htmlFor={option.id} className=\"text-xs font-medium text-gray-500\">\n {option.label}\n </Label>\n <span className=\"text-xs font-mono tabular-nums text-gray-700\">{numValue}</span>\n </div>\n <Slider\n id={option.id}\n min={option.min}\n max={option.max}\n step={option.step}\n value={[numValue]}\n onValueChange={(values) => onChange(option, targetItem, String(values[0]))}\n />\n </div>\n );\n }\n\n case 'counter': {\n const numValue = typeof currentValue === 'number' ? currentValue : Number(currentValue) || option.min;\n return (\n <div key={option.id} className=\"space-y-1.5\">\n <Label className=\"text-xs font-medium text-gray-500\">{option.label}</Label>\n <div className=\"flex items-center gap-2\">\n <Button\n variant=\"outline\"\n size=\"sm\"\n className=\"h-8 w-8 shrink-0 p-0\"\n onClick={() => {\n const newValue = Math.max(option.min, numValue - option.step);\n onChange(option, targetItem, String(newValue));\n }}\n disabled={numValue <= option.min}\n type=\"button\"\n >\n <Minus className=\"h-3.5 w-3.5\" />\n </Button>\n <div className=\"flex-1 text-center px-3 py-1.5 bg-gray-50 rounded-md border border-gray-200\">\n <span className=\"text-sm font-mono tabular-nums font-medium text-gray-900\">{numValue}</span>\n </div>\n <Button\n variant=\"outline\"\n size=\"sm\"\n className=\"h-8 w-8 shrink-0 p-0\"\n onClick={() => {\n const newValue = Math.min(option.max, numValue + option.step);\n onChange(option, targetItem, String(newValue));\n }}\n disabled={numValue >= option.max}\n type=\"button\"\n >\n <Plus className=\"h-3.5 w-3.5\" />\n </Button>\n </div>\n </div>\n );\n }\n\n case 'color-series': {\n const stringValue = String(currentValue);\n return (\n <div key={option.id} className=\"space-y-1.5\">\n <Label className=\"text-xs font-medium text-gray-500\">{option.label}</Label>\n <div className=\"flex flex-wrap gap-1.5\">\n {option.options.map((color) => {\n const isSelected = stringValue === color.value;\n return (\n <button\n key={color.value}\n onClick={() => onChange(option, targetItem, color.value)}\n className={`h-7 w-7 rounded-md border-2 transition-all flex items-center justify-center ${\n isSelected\n ? 'border-gray-900 scale-110'\n : 'border-gray-200 hover:border-gray-400 hover:scale-105'\n }`}\n style={{ backgroundColor: color.hex || color.value }}\n type=\"button\"\n title={`${color.label}${color.hex ? ` (${color.hex})` : ''}`}\n >\n {isSelected && (\n <Check className=\"h-4 w-4 text-white drop-shadow-[0_1px_2px_rgba(0,0,0,0.8)]\" strokeWidth={3} />\n )}\n </button>\n );\n })}\n </div>\n </div>\n );\n }\n\n default:\n console.warn(`Unknown option type: ${(option as any).type}`);\n return null;\n }\n };\n\n return <div className=\"space-y-3\">{applicableOptions.map((option) => renderOption(option))}</div>;\n}\n","import * as React from 'react';\nimport { MoreHorizontal, Trash2 } from 'lucide-react';\nimport { Button } from '../../ui/button';\nimport {\n DropdownMenu,\n DropdownMenuContent,\n DropdownMenuItem,\n DropdownMenuTrigger,\n DropdownMenuSeparator,\n} from '../../ui/dropdown-menu';\nimport { PageOption } from './page-editor';\nimport { PageItem } from './page-group-utils';\nimport { PageOptionsRenderer } from './page-options-renderer';\n\nexport interface PageOptionsDropdownProps {\n pageOptions: PageOption[];\n targetItem: PageItem | undefined;\n onChange: (pageOption: PageOption, targetItem: PageItem, value: string) => void;\n onRemove?: (targetId: string) => void;\n showRemove?: boolean;\n title?: string;\n removeLabel?: string;\n triggerClassName?: string;\n}\n\nexport function PageOptionsDropdown({\n pageOptions,\n targetItem,\n onChange,\n onRemove,\n showRemove = false,\n title = 'Options',\n removeLabel = 'Remove',\n triggerClassName,\n}: PageOptionsDropdownProps) {\n if (!targetItem) return null;\n\n return (\n <DropdownMenu modal={false}>\n <DropdownMenuTrigger asChild className={triggerClassName || 'page-options-trigger'}>\n <Button\n variant=\"ghost\"\n size=\"sm\"\n className=\"h-7 w-7\"\n title={title}\n >\n <MoreHorizontal className=\"w-4 h-4\" />\n <span className=\"sr-only\">{title}</span>\n </Button>\n </DropdownMenuTrigger>\n <DropdownMenuContent className=\"min-w-48 p-3\" align=\"center\">\n <PageOptionsRenderer\n pageOptions={pageOptions}\n targetItem={targetItem}\n onChange={onChange}\n />\n {showRemove && onRemove && (\n <>\n {pageOptions.length > 0 && <DropdownMenuSeparator className=\"my-2\" />}\n <DropdownMenuItem\n onClick={() => onRemove(targetItem.id)}\n className=\"text-red-600 focus:text-red-700 focus:bg-red-50\"\n >\n <Trash2 className=\"w-4 h-4 mr-2\" />\n <span>{removeLabel}</span>\n </DropdownMenuItem>\n </>\n )}\n </DropdownMenuContent>\n </DropdownMenu>\n );\n}\n\n","import * as React from 'react';\nimport { Section } from '../resizers/section-page-resizer';\nimport { PageGroup as PageGroupType, StandalonePage, PageItem } from './page-group-utils';\nimport { Badge } from '../../ui/badge';\nimport { PageOption } from './page-editor';\nimport { PageOptionsDropdown } from './page-options-dropdown';\n\ninterface PageGroupProps {\n group: PageGroupType;\n pagesWithPageNum: Array<StandalonePage & { pageNum: number }>;\n onRemove: (groupId: string) => void;\n totalItems: number;\n renderPage: (page: StandalonePage & { pageNum: number }) => React.ReactNode;\n pageOptions: PageOption[];\n onPageOptionChange: (pageOption: PageOption, target: PageItem, value: string) => void;\n onLabelChange?: (groupId: string, label: string) => void;\n // MVP: Minimal props, no advanced customization\n}\n\nexport function PageGroup({\n group,\n pagesWithPageNum,\n onRemove,\n totalItems,\n renderPage,\n pageOptions,\n onPageOptionChange,\n onLabelChange,\n}: PageGroupProps) {\n const handleLabelClick = () => {\n if (!onLabelChange) return;\n const currentLabel = group.label || group.id;\n const entered = window.prompt('Rename group:', currentLabel);\n if (entered !== null) {\n const trimmed = entered.trim();\n onLabelChange(group.id, trimmed || '');\n }\n };\n return (\n <>\n {pagesWithPageNum.map((page, indexInGroup) => {\n const isFirstPage = indexInGroup === 0;\n \n return (\n <Section\n key={page.id}\n title={`Sheet ${page.pageNum}`}\n controls={\n isFirstPage ? (\n // Group-level controls only on first page\n <div data-uhuu-editor className=\"pl-0 py-1.5 flex justify-between items-center\">\n <div className=\"flex items-center gap-2\">\n <span className=\"page-number\">\n {page.pageNum}\n </span>\n {page.label && (\n <span className=\"text-xs text-gray-500\">\n {page.label}\n </span>\n )}\n <Badge \n variant=\"outline\" \n className=\"text-xs font-normal text-gray-600 border-gray-200 bg-transparent cursor-pointer hover:bg-gray-50 transition-colors\"\n onClick={handleLabelClick}\n title=\"Click to rename\"\n data-group-id={group.id}\n >\n {group.label || group.id}\n </Badge>\n </div>\n <div className=\"flex items-center\">\n <PageOptionsDropdown\n pageOptions={pageOptions}\n targetItem={group}\n onChange={onPageOptionChange}\n onRemove={onRemove}\n showRemove={totalItems > 1}\n title=\"Group options\"\n removeLabel=\"Remove Group\"\n />\n </div>\n </div>\n ) : (\n // No controls for pages within group (group internal pages are not directly editable)\n <div className=\"pl-0 pr-3 py-1.5 flex justify-between items-center\">\n <div className=\"flex items-center gap-2\">\n <span className=\"page-number\">\n {page.pageNum}\n </span>\n {page.label && (\n <span className=\"text-xs text-gray-500\">\n {page.label}\n </span>\n )}\n <span className=\"text-xs text-gray-400\">·</span>\n </div>\n </div>\n )\n }\n >\n {renderPage(page)}\n </Section>\n );\n })}\n </>\n );\n}\n","import * as React from 'react';\nimport Pagination from '../../pagination-static/pagination-static';\nimport Sheet from '../../pagination-static/sheet-static';\nimport type { PageComponent, PageGroup, PageItem, StandalonePage } from './page-group-utils';\nimport type { PageDataBinding } from './data-binding';\n\ninterface PageCanvasProps {\n pageId: string;\n templateId?: string;\n componentKey?: string;\n component?: PageComponent;\n payload?: any;\n pagePayload?: any;\n integration?: any;\n page?: StandalonePage;\n parentGroup?: PageItem;\n setup?: { width: number; height: number; [key: string]: any };\n reference?: React.ReactNode;\n overlay?: React.ReactNode | ((args: { pageNo: number; pageId: string }) => React.ReactNode);\n className?: string;\n pageNo?: number;\n dataBinding?: PageDataBinding;\n}\n\n/**\n * Small helper that renders a single page with Pagination + Sheet\n * and optional reference/overlay. Keeps templates from duplicating\n * the same scaffold for every page render.\n */\nexport function PageCanvas({\n pageId,\n templateId,\n componentKey,\n component: PageComponent,\n payload,\n pagePayload,\n integration,\n page,\n parentGroup,\n setup,\n reference,\n overlay,\n className,\n pageNo = 0,\n dataBinding,\n}: PageCanvasProps) {\n const renderOverlay = typeof overlay === 'function'\n ? (pageNo: number) => overlay({ pageNo, pageId })\n : () => overlay;\n\n // Build automatic class for page key targeting\n const pageKey = componentKey || templateId || pageId;\n const pageKeyClass = pageKey ? `uhuu-page--${pageKey}` : '';\n const combinedClassName = [pageKeyClass, className].filter(Boolean).join(' ');\n\n return (\n <Pagination setup={setup}>\n <Sheet \n className={combinedClassName} \n pageNo={pageNo} \n overlay={({ pageNo }) => renderOverlay(pageNo)}\n data-page-key={pageKey}\n >\n {reference}\n {PageComponent ? (\n <PageComponent\n payload={payload}\n pagePayload={pagePayload}\n integration={integration}\n pageId={pageId}\n templateId={templateId ?? componentKey ?? pageId}\n pageNum={pageNo}\n page={page}\n parentGroup={parentGroup as PageGroup}\n componentKey={componentKey}\n dataBinding={dataBinding}\n />\n ) : null}\n </Sheet>\n </Pagination>\n );\n}\n\nexport default PageCanvas;\n","import { useState, useMemo, useCallback, useContext } from 'react';\nimport {\n PageItem,\n StandalonePage,\n PageComponent,\n IntegrationRequirement,\n IntegrationConfig,\n isPageGroup,\n updatePageNumbers,\n getTotalPageCount,\n transformItemsForReorder,\n restoreItemsFromReorder,\n ReorderItem,\n PageEditorState,\n DEFAULT_PAGE_EDITOR_STATE_KEY,\n buildPageEditorState,\n instantiateGroup,\n instantiatePage,\n PageFilterConfig,\n filterPageItems,\n} from './page-group-utils';\nimport { createDefaultRenderThumbnail } from './default-render-thumbnail';\nimport { TemplateDataContext } from './template-data-provider';\n\nexport type AvailablePageItem = {\n kind: 'page';\n id: string; // Template ID\n templateId?: string; // Reference to template\n componentKey?: string; // Component key for resolution\n label?: string;\n component?: PageComponent;\n meta?: Record<string, any>;\n repeatable?: boolean;\n maxInstances?: number | null;\n integration?: IntegrationRequirement | IntegrationConfig;\n [key: string]: any;\n};\n\nexport type AvailableGroupItem = {\n kind: 'group';\n id: string; // Template ID\n templateId?: string; // Reference to template\n repeatable?: boolean; // Can be added multiple times\n maxInstances?: number | null; // Max instances allowed\n pageComponentKeys?: string[]; // Component keys (not instance IDs)\n label?: string;\n integration?: IntegrationRequirement | IntegrationConfig;\n meta?: Record<string, any>;\n [key: string]: any;\n};\n\nexport type AvailableItem = AvailablePageItem | AvailableGroupItem;\n\ntype PageItemWithNumbers = PageItem & {\n pageNum?: number;\n pages?: Array<StandalonePage & { pageNum: number }>;\n};\n\ninterface UsePageGroupsOptions {\n // Initial state - what pages/groups come when template first loads\n initialItems: PageItem[];\n \n // Available items that can be added (simple: array of page IDs or group configs)\n availableItems?: AvailableItem[];\n \n // Callbacks (optional for MVP)\n onItemsChange?: (items: PageItem[], state: PageEditorState) => void;\n onStateChange?: (state: PageEditorState) => void;\n \n // NEW: For automatic thumbnail rendering\n pageComponents?: { [pageId: string]: PageComponent };\n payload?: any;\n \n // Page setup dimensions (same as Pagination setup prop) - in millimeters\n setup?: { width: number; height: number };\n\n // Payload state key (for persistence helpers)\n stateKey?: string;\n\n // Hook for resolving a draft item before it is committed (integration fetch, async defaults, etc.)\n resolveNewItem?: (draft: PageItem) => Promise<PageItem | null | void> | PageItem | null | void;\n\n notifyError?: (message: string) => void;\n \n // Page filter for conditional rendering\n pageFilter?: PageFilterConfig;\n}\n\ninterface UsePageGroupsReturn {\n // State\n items: PageItem[];\n itemsWithPageNum: PageItemWithNumbers[];\n totalPageCount: number;\n \n // Available items (filtered - excludes already used)\n availableItemsToAdd: AvailableItem[];\n \n // CRUD operations (MVP - minimal surface)\n addItem: (item: AvailableItem) => Promise<void>;\n removeItem: (itemId: string) => void;\n updateItemFields: (itemId: string, patch: Partial<PageItem>) => void;\n reorderItems: (newOrder: PageItem[]) => void;\n \n // Add page dialog state\n addDialogOpen: boolean;\n setAddDialogOpen: (open: boolean) => void;\n openAddDialog: () => void;\n \n // Render helper (simple - just pages)\n renderItems: (\n renderPage: (\n page: StandalonePage & { pageNum: number },\n parentItem?: PageItem\n ) => React.ReactNode\n ) => React.ReactNode[];\n \n // Reorder helpers (for PageOrderDialog)\n itemsForReorder: ReorderItem[];\n handleReorder: (reorderedItems: ReorderItem[]) => void;\n \n // Default renderThumbnail (if pageComponents provided)\n defaultRenderThumbnail?: (item: ReorderItem, index: number, isDragging?: boolean) => React.ReactNode;\n}\n\nexport function usePageGroups(options: UsePageGroupsOptions): UsePageGroupsReturn {\n const {\n initialItems,\n availableItems = [],\n onItemsChange,\n onStateChange,\n pageComponents,\n payload,\n setup,\n stateKey = DEFAULT_PAGE_EDITOR_STATE_KEY,\n resolveNewItem,\n notifyError,\n pageFilter,\n } = options;\n \n const [items, setItems] = useState<PageItem[]>(initialItems);\n const [addDialogOpen, setAddDialogOpen] = useState(false);\n \n // Get TemplateDataProvider context (optional - returns null if not available)\n const templateDataContext = useContext(TemplateDataContext);\n \n // Update items and notify parent\n const updateItems = useCallback((newItems: PageItem[]) => {\n setItems(newItems);\n const state = buildPageEditorState(newItems, stateKey);\n \n // If TemplateDataProvider is available, use it as single source of truth for payload updates\n // This ensures all payload modifications (including reordering) go through the provider\n if (templateDataContext?.mergePageEditorState) {\n templateDataContext.mergePageEditorState(newItems, stateKey);\n }\n \n onStateChange?.(state);\n onItemsChange?.(newItems, state);\n }, [onItemsChange, onStateChange, stateKey, templateDataContext]);\n \n // Count instances by templateId\n const instanceCountsByTemplate = useMemo(() => {\n const counts = new Map<string, number>();\n items.forEach(item => {\n const templateId = item.templateId ?? item.id;\n counts.set(templateId, (counts.get(templateId) ?? 0) + 1);\n if (isPageGroup(item)) {\n item.pages?.forEach((page) => {\n const pageTemplateId = (page as any).templateId ?? page.id;\n counts.set(pageTemplateId, (counts.get(pageTemplateId) ?? 0) + 1);\n });\n }\n });\n return counts;\n }, [items]);\n \n // Filter available items based on repeatability and maxInstances\n const availableItemsToAdd = useMemo(() => {\n return availableItems.filter(item => {\n // Handle page items\n if ((item as AvailablePageItem).kind === 'page') {\n const pageItem = item as AvailablePageItem;\n const templateId = pageItem.templateId ?? pageItem.id;\n const count = instanceCountsByTemplate.get(templateId) ?? 0;\n const isRepeatable = pageItem.repeatable ?? false;\n const maxInstances = pageItem.maxInstances ?? null;\n\n if (!isRepeatable && count > 0) {\n return false;\n }\n\n if (maxInstances !== null && count >= maxInstances) {\n return false;\n }\n\n return true;\n }\n\n // Handle group items\n const groupItem = item as AvailableGroupItem;\n const templateId = groupItem.templateId ?? groupItem.id;\n const count = instanceCountsByTemplate.get(templateId) ?? 0;\n const isRepeatable = groupItem.repeatable ?? false;\n const maxInstances = groupItem.maxInstances ?? null;\n\n // If not repeatable and already has an instance, hide it\n if (!isRepeatable && count > 0) {\n return false;\n }\n\n // If repeatable, check maxInstances limit\n if (isRepeatable && maxInstances !== null && count >= maxInstances) {\n return false;\n }\n\n return true;\n });\n }, [availableItems, instanceCountsByTemplate]);\n \n // Calculate total page count\n const totalPageCount = useMemo(() => getTotalPageCount(items), [items]);\n \n // Add item (page or group) - creates instance from template\n const addItem = useCallback(async (item: AvailableItem) => {\n const resolveIntegrationMode = (\n integration?: IntegrationRequirement | IntegrationConfig\n ): IntegrationRequirement => {\n if (!integration) return 'none';\n if (typeof integration === 'string') return integration;\n return integration.mode ?? 'optional';\n };\n\n const createDraftFromAvailable = (available: AvailableItem): PageItem => {\n // Handle page items\n if ((available as AvailablePageItem).kind === 'page') {\n const pageItem = available as AvailablePageItem;\n const templateId = pageItem.templateId ?? pageItem.id;\n const componentKey = pageItem.componentKey ?? pageItem.id;\n return instantiatePage(templateId, componentKey, {\n label: pageItem.label,\n className: pageItem.className,\n repeatable: pageItem.repeatable,\n maxInstances: pageItem.maxInstances,\n integration: pageItem.integration,\n strictPosition: pageItem.strictPosition,\n });\n }\n\n // Handle group items\n const groupConfig = available as AvailableGroupItem;\n const templateId = groupConfig.templateId ?? groupConfig.id;\n \n // Component keys define the template makeup for this group\n const componentKeys = groupConfig.pageComponentKeys ?? [];\n\n return instantiateGroup(templateId, componentKeys, {\n label: groupConfig.label,\n repeatable: groupConfig.repeatable ?? false,\n maxInstances: groupConfig.maxInstances ?? null,\n integration: groupConfig.integration,\n });\n };\n\n const draft = createDraftFromAvailable(item);\n const debugIntegration = typeof window !== 'undefined'\n && (window as any).$uhuu?.debug;\n let integrationData: any = undefined;\n\n let resolved: PageItem | null | void = draft;\n if (resolveNewItem) {\n resolved = await resolveNewItem(draft);\n } else {\n const integrationMode = resolveIntegrationMode((draft as any).integration);\n let shouldAbort = false;\n\n if (debugIntegration) {\n console.debug('[usePageGroups] integration check', {\n id: draft.id,\n kind: (draft as any).kind,\n integration: (draft as any).integration,\n mode: integrationMode,\n });\n }\n\n if (integrationMode !== 'none' && typeof window !== 'undefined') {\n const requestIntegration = (window as any).$uhuu?.requestIntegration?.bind((window as any).$uhuu);\n if (requestIntegration) {\n if (debugIntegration) {\n console.debug('[usePageGroups] requestIntegration start', { id: draft.id, mode: integrationMode });\n }\n integrationData = await requestIntegration({ item: draft, mode: integrationMode });\n if (debugIntegration) {\n console.debug('[usePageGroups] requestIntegration done', { id: draft.id, hasData: integrationData != null });\n }\n if (integrationData == null && integrationMode === 'required') {\n shouldAbort = true;\n }\n } else if (integrationMode === 'required') {\n console.warn('[usePageGroups] Integration data required but $uhuu.requestIntegration is not available.');\n shouldAbort = true;\n }\n }\n\n if (shouldAbort) return;\n\n }\n\n if (resolved === null) return;\n const finalItem = (resolved ?? draft) as PageItem;\n \n // Store integration data using the instance ID\n // For groups, this is the group ID; for pages, it's the page ID\n if (integrationData !== undefined && templateDataContext?.setIntegrationPayload) {\n const instanceId = finalItem.id;\n if (debugIntegration) {\n console.debug('[usePageGroups] storing integration data', {\n instanceId,\n hasData: integrationData != null,\n dataKeys: integrationData ? Object.keys(integrationData) : [],\n });\n }\n templateDataContext.setIntegrationPayload(instanceId, integrationData);\n }\n \n // Insert item in correct position based on strictPosition flags\n const insertItemInPosition = (newItems: PageItem[], itemToInsert: PageItem): PageItem[] => {\n const itemPosition = (itemToInsert as any).strictPosition;\n \n // If the new item has a strictPosition flag, insert it accordingly\n if (itemPosition === 'start') {\n return [itemToInsert, ...newItems];\n } else if (itemPosition === 'end') {\n return [...newItems, itemToInsert];\n }\n \n // Otherwise, find the insertion point:\n // - After all items with strictPosition: 'start'\n // - Before all items with strictPosition: 'end'\n const startItems: PageItem[] = [];\n const middleItems: PageItem[] = [];\n const endItems: PageItem[] = [];\n \n newItems.forEach(item => {\n const position = (item as any).strictPosition;\n if (position === 'start') {\n startItems.push(item);\n } else if (position === 'end') {\n endItems.push(item);\n } else {\n middleItems.push(item);\n }\n });\n \n // Insert new item in the middle section\n return [...startItems, ...middleItems, itemToInsert, ...endItems];\n };\n \n updateItems(insertItemInPosition(items, finalItem));\n }, [items, updateItems, resolveNewItem, templateDataContext]);\n \n // Remove item or page from group\n const removeItem = useCallback((itemId: string) => {\n const showError = (message: string) => {\n if (notifyError) {\n notifyError(message);\n } else {\n alert(message);\n }\n };\n\n // First, try to find an item with this ID (standalone page or group)\n const targetItem = items.find(i => i.id === itemId);\n \n // If found as a direct item (group or standalone page), remove it entirely\n if (targetItem) {\n const totalCount = getTotalPageCount(items);\n if (totalCount <= 1) {\n showError('Cannot remove the last page. At least one page is required.');\n return;\n }\n \n // Remove integration data if it exists for this instance\n if (templateDataContext?.removeIntegrationPayload) {\n const instanceId = targetItem.id;\n const hasIntegrationData = templateDataContext.payload?.integrations?.[instanceId] !== undefined;\n if (hasIntegrationData) {\n templateDataContext.removeIntegrationPayload(instanceId);\n }\n }\n updateItems(items.filter(item => item.id !== itemId));\n return;\n }\n \n // If not found as direct item, it might be a page ID within a group\n for (const item of items) {\n if (isPageGroup(item) && item.pages.some(p => p.id === itemId)) {\n const totalCount = getTotalPageCount(items);\n if (totalCount <= 1) {\n showError('Cannot remove the last page. At least one page is required.');\n return;\n }\n \n if (item.pages.length === 1) {\n // Last page in group - remove the entire group\n // Remove integration data if it exists for this group instance\n if (templateDataContext?.removeIntegrationPayload) {\n const instanceId = item.id;\n const hasIntegrationData = templateDataContext.payload?.integrations?.[instanceId] !== undefined;\n if (hasIntegrationData) {\n templateDataContext.removeIntegrationPayload(instanceId);\n }\n }\n updateItems(items.filter(i => i.id !== item.id));\n } else {\n // Multiple pages in group - remove just this page from the group\n // Note: We don't remove integration data here because the group still exists\n // and other pages in the group may still use the integration data\n updateItems(items.map(i => {\n if (i.id === item.id && isPageGroup(i)) {\n return {\n ...i,\n pages: i.pages.filter(p => p.id !== itemId),\n };\n }\n return i;\n }));\n }\n return;\n }\n }\n }, [items, notifyError, updateItems, templateDataContext]);\n \n const updateItemFields = useCallback((itemId: string, patch: Partial<PageItem>) => {\n updateItems(items.map(item => {\n if (item.id === itemId) {\n if (isPageGroup(item)) {\n return {\n ...item,\n ...patch,\n };\n }\n return { ...item, ...patch };\n }\n return item;\n }));\n }, [items, updateItems]);\n \n // Reorder items\n const reorderItems = useCallback((newOrder: PageItem[]) => {\n updateItems(newOrder);\n }, [updateItems]);\n \n // Items with derived pageNum for rendering\n // Apply page filtering if configured\n const itemsWithPageNum = useMemo(() => {\n const itemsWithNumbers = updatePageNumbers(items) as PageItemWithNumbers[];\n \n // Apply page filter if configured (preserves original page numbers)\n if (pageFilter) {\n return filterPageItems(itemsWithNumbers as PageItem[], pageFilter) as PageItemWithNumbers[];\n }\n \n return itemsWithNumbers;\n }, [items, pageFilter]);\n \n // Render helper - automatically handles pages vs groups\n const renderItems = useCallback((\n renderPage: (\n page: StandalonePage & { pageNum: number },\n parentItem?: PageItem\n ) => React.ReactNode\n ): React.ReactNode[] => {\n const rendered: React.ReactNode[] = [];\n itemsWithPageNum.forEach(item => {\n if (isPageGroup(item)) {\n const groupPages = (item.pages ?? []) as Array<StandalonePage & { pageNum: number }>;\n groupPages.forEach(page => {\n rendered.push(renderPage(page, item));\n });\n } else {\n rendered.push(renderPage(item as StandalonePage & { pageNum: number }, item));\n }\n });\n return rendered;\n }, [itemsWithPageNum]);\n \n // Reorder helpers\n const itemsForReorder = useMemo(\n () => transformItemsForReorder(itemsWithPageNum as PageItem[]),\n [itemsWithPageNum]\n );\n \n const handleReorder = useCallback((reorderedItems: ReorderItem[]) => {\n const restored = restoreItemsFromReorder(reorderedItems, items);\n \n // Enforce strictPosition constraints: items with strictPosition: 'start' stay at start,\n // items with strictPosition: 'end' stay at end\n const enforcePositions = (itemsToOrder: PageItem[]): PageItem[] => {\n const startItems: PageItem[] = [];\n const middleItems: PageItem[] = [];\n const endItems: PageItem[] = [];\n \n itemsToOrder.forEach(item => {\n const position = (item as any).strictPosition;\n if (position === 'start') {\n startItems.push(item);\n } else if (position === 'end') {\n endItems.push(item);\n } else {\n middleItems.push(item);\n }\n });\n \n return [...startItems, ...middleItems, ...endItems];\n };\n \n updateItems(enforcePositions(restored));\n }, [items, updateItems]);\n \n const openAddDialog = useCallback(() => {\n setAddDialogOpen(true);\n }, []);\n \n // Generate defaultRenderThumbnail if pageComponents provided\n const defaultRenderThumbnail = useMemo(() => {\n if (pageComponents) {\n return createDefaultRenderThumbnail({ pageComponents, payload, setup });\n }\n return undefined;\n }, [pageComponents, payload, setup]);\n \n return {\n items,\n itemsWithPageNum,\n totalPageCount,\n availableItemsToAdd,\n addItem,\n removeItem,\n updateItemFields,\n reorderItems,\n addDialogOpen,\n setAddDialogOpen,\n openAddDialog,\n renderItems,\n itemsForReorder,\n handleReorder,\n defaultRenderThumbnail,\n };\n}\n","import { isPageGroup, PageItem, StandalonePage } from './page-group-utils';\nimport {\n buildIntegrationPath,\n resolveIntegrationBinding,\n resolveIntegrationInstanceId,\n} from './integration-utils';\n\ntype PathBuilder = (subPath?: string) => string | null;\n\nexport type IntegrationBinding = {\n instanceId: string | null;\n data?: any;\n path: PathBuilder;\n};\n\nexport type PageDataBinding = {\n payload: any;\n pageId: string;\n pagePayload?: any;\n parentGroupId?: string;\n integration: IntegrationBinding;\n paths: {\n integration: PathBuilder;\n page: PathBuilder;\n group: PathBuilder;\n document: PathBuilder;\n };\n defaults: {\n imageGalleryPath?: string | null;\n };\n};\n\ntype BuildPageDataBindingOptions = {\n payload: any;\n page: StandalonePage;\n parentGroup?: PageItem;\n pagePayload?: any;\n defaults?: {\n imageGalleryPath?: string;\n };\n};\n\nfunction buildPath(base: string | null, subPath?: string) {\n if (!base) return null;\n if (!subPath) return base;\n return `${base}.${subPath}`;\n}\n\nfunction resolveGalleryPath(\n payload: any,\n integrationData: any,\n defaults?: { imageGalleryPath?: string }\n): string | null | undefined {\n return (\n integrationData?.meta?.imageGalleryPath ??\n integrationData?.config?.imageGalleryPath ??\n integrationData?.imageGalleryPath ??\n payload?.options?.imageGalleryPath ??\n payload?.templateSetup?.options?.imageGalleryPath ??\n defaults?.imageGalleryPath\n );\n}\n\nexport function buildPageDataBinding({\n payload,\n page,\n parentGroup,\n pagePayload,\n defaults,\n}: BuildPageDataBindingOptions): PageDataBinding {\n const integrationBinding = resolveIntegrationBinding(payload, page, parentGroup);\n const groupId = parentGroup && isPageGroup(parentGroup) ? parentGroup.id : undefined;\n const pageBase = `pages.${page.id}`;\n const groupBase = groupId ? `pages.${groupId}` : null;\n\n return {\n payload,\n pageId: page.id,\n pagePayload,\n parentGroupId: groupId,\n integration: {\n instanceId: integrationBinding.instanceId,\n data: integrationBinding.integration,\n path: (subPath?: string) =>\n buildIntegrationPath(integrationBinding.instanceId, subPath),\n },\n paths: {\n integration: (subPath?: string) =>\n buildIntegrationPath(integrationBinding.instanceId, subPath),\n page: (subPath?: string) => buildPath(pageBase, subPath),\n group: (subPath?: string) => buildPath(groupBase, subPath),\n document: (subPath?: string) => subPath ?? null,\n },\n defaults: {\n imageGalleryPath: resolveGalleryPath(\n payload,\n integrationBinding.integration,\n defaults\n ),\n },\n };\n}\n\nexport function buildIntegrationDialogPath(\n page: StandalonePage,\n parentGroup?: PageItem,\n subPath?: string\n) {\n const instanceId = resolveIntegrationInstanceId(page, parentGroup);\n return buildIntegrationPath(instanceId, subPath);\n}\n","import {\n PageItem,\n PageGroup,\n StandalonePage,\n instantiateGroup,\n instantiatePage,\n PageComponent,\n IntegrationRequirement,\n IntegrationConfig,\n} from './page-group-utils';\nimport { AvailableItem } from './use-page-groups';\n\ntype SimplePageRef = string | (Partial<StandalonePage> & { id: string; componentKey?: string });\n\ntype PageTemplateDefinition = {\n label?: string;\n className?: string;\n componentKey?: string;\n component?: PageComponent;\n repeatable?: boolean;\n maxInstances?: number | null;\n integration?: IntegrationRequirement | IntegrationConfig;\n allowAsSinglePage?: boolean; // If false, page can only be added as part of a group (default: true)\n strictPosition?: 'start' | 'end'; // If set, page should always stay at the start or end of the document\n};\n\ntype SimpleGroupDefinition = {\n id: string; // Template ID\n label?: string;\n repeatable?: boolean; // Can be added multiple times\n maxInstances?: number | null; // Max instances (null = unlimited)\n pageComponentKeys?: string[]; // Template keys (not instance IDs)\n integration?: IntegrationRequirement | IntegrationConfig;\n};\n\ntype BuildPageGroupsConfigArgs = {\n initial: Array<SimplePageRef | SimpleGroupDefinition | string>;\n groups?: SimpleGroupDefinition[] | Record<string, SimpleGroupDefinition>;\n pageComponentKeys?: string[];\n pages?: Record<string, PageTemplateDefinition>;\n pageComponents?: Record<string, PageComponent>;\n};\n\ntype BuildPageGroupsConfigResult = {\n initialItems: PageItem[];\n availableItems: AvailableItem[];\n pageComponents: Record<string, PageComponent>;\n};\n\nconst asPage = (\n page: SimplePageRef, \n templateId?: string, \n isInitial: boolean = false,\n templateLookup?: Record<string, PageTemplateDefinition>\n): StandalonePage => {\n const pageId = typeof page === 'string' ? page : page.id;\n const templateConfig = templateLookup?.[pageId];\n const componentKey = typeof page === 'string'\n ? (templateConfig?.componentKey ?? pageId)\n : (page.componentKey ?? templateConfig?.componentKey ?? page.id);\n const pageTemplateId = templateId ?? pageId;\n const repeatable = (typeof page === 'string' ? undefined : (page as any).repeatable) ?? templateConfig?.repeatable ?? false;\n const maxInstances = (typeof page === 'string' ? undefined : (page as any).maxInstances) ?? templateConfig?.maxInstances ?? null;\n const label = (typeof page === 'string' ? undefined : page.label) ?? templateConfig?.label;\n const className = (typeof page === 'string' ? undefined : (page as any).className) ?? templateConfig?.className;\n const component = (typeof page === 'string' ? undefined : (page as any).component) ?? templateConfig?.component;\n const integration = (typeof page === 'string' ? undefined : (page as any).integration) ?? templateConfig?.integration;\n const strictPosition = (typeof page === 'string' ? undefined : (page as any).strictPosition) ?? templateConfig?.strictPosition;\n\n if (isInitial) {\n // For initial items with explicit IDs, use the ID directly (don't instantiate)\n return {\n kind: 'page',\n id: pageId,\n componentKey,\n templateId: pageTemplateId,\n label,\n className,\n repeatable,\n maxInstances,\n integration,\n component,\n strictPosition,\n ...(typeof page === 'string' ? {} : page),\n };\n }\n\n // For items added later, instantiate with unique ID\n return instantiatePage(pageTemplateId, componentKey, {\n label,\n className,\n repeatable,\n maxInstances,\n integration,\n component,\n strictPosition,\n ...(typeof page === 'string' ? {} : page),\n });\n};\n\nconst asGroup = (group: SimpleGroupDefinition, isInitial: boolean = false): PageGroup => {\n const componentKeys = group.pageComponentKeys ?? [];\n \n // For initial items, use the template ID directly (don't instantiate)\n // For items added later, instantiate with unique IDs\n if (isInitial) {\n const instanceId = group.id; // Use template ID as instance ID for initial items\n return {\n kind: 'group',\n id: instanceId,\n templateId: group.id,\n label: group.label,\n repeatable: group.repeatable ?? false,\n maxInstances: group.maxInstances ?? null,\n integration: group.integration,\n pages: componentKeys.map((key, idx) => ({\n id: `${instanceId}__${key}__${idx}`,\n componentKey: key,\n templateId: key,\n })),\n };\n }\n \n return instantiateGroup(group.id, componentKeys, {\n label: group.label,\n repeatable: group.repeatable ?? false,\n maxInstances: group.maxInstances ?? null,\n integration: group.integration,\n });\n};\n\nconst normalizeGroups = (groups?: SimpleGroupDefinition[] | Record<string, SimpleGroupDefinition>): SimpleGroupDefinition[] => {\n if (!groups) return [];\n if (Array.isArray(groups)) return groups;\n return Object.entries(groups).map(([id, def]) => ({ ...def, id }));\n};\n\nexport const buildPageGroupsConfig = (args: BuildPageGroupsConfigArgs): BuildPageGroupsConfigResult => {\n const {\n initial,\n groups,\n pageComponentKeys = [],\n pages = {},\n pageComponents: explicitPageComponents = {},\n } = args;\n\n const normalizedGroups = normalizeGroups(groups);\n const groupMap = new Map<string, SimpleGroupDefinition>();\n normalizedGroups.forEach((group) => groupMap.set(group.id, group));\n const inferredPageComponentKeys = pageComponentKeys.length ? pageComponentKeys : Object.keys(pages);\n const mergedPageComponents: Record<string, PageComponent> = { ...explicitPageComponents };\n Object.entries(pages).forEach(([key, def]) => {\n if (def.component) mergedPageComponents[key] = def.component;\n });\n\n const initialItems: PageItem[] = initial.map((item) => {\n if (typeof item === 'string') {\n const maybeGroup = groupMap.get(item);\n if (maybeGroup) {\n return asGroup(maybeGroup, true); // isInitial = true\n }\n return asPage(item, undefined, true, pages); // isInitial = true\n }\n\n const maybeGroup = (item as any).pageComponentKeys && Array.isArray((item as any).pageComponentKeys);\n if (maybeGroup) {\n return asGroup(item as SimpleGroupDefinition, true); // isInitial = true\n }\n\n return asPage(item as SimplePageRef, undefined, true, pages); // isInitial = true\n });\n\n const availableGroupItems: AvailableItem[] = normalizedGroups.map((group) => {\n const componentKeys = group.pageComponentKeys ?? [];\n return {\n kind: 'group',\n id: group.id, // Template ID\n templateId: group.id,\n label: group.label,\n pageComponentKeys: componentKeys,\n repeatable: group.repeatable ?? false,\n maxInstances: group.maxInstances ?? null,\n integration: group.integration,\n };\n });\n\n // For standalone pages, create template items\n // Filter out pages that are not allowed as single pages (allowAsSinglePage === false)\n const availablePageItems: AvailableItem[] = inferredPageComponentKeys\n .filter(key => {\n const templateConfig = pages?.[key];\n // Default to true if not specified\n return templateConfig?.allowAsSinglePage !== false;\n })\n .map(key => {\n const templateConfig = pages?.[key];\n return {\n kind: 'page',\n id: key, // Template ID\n templateId: key,\n componentKey: templateConfig?.componentKey ?? key,\n label: templateConfig?.label,\n className: templateConfig?.className,\n repeatable: templateConfig?.repeatable ?? false,\n maxInstances: templateConfig?.maxInstances ?? null,\n integration: templateConfig?.integration,\n strictPosition: templateConfig?.strictPosition,\n };\n });\n\n const availableItems: AvailableItem[] = [\n ...availablePageItems,\n ...availableGroupItems,\n ];\n\n return { initialItems, availableItems, pageComponents: mergedPageComponents };\n};\n","import * as React from \"react\";\nimport * as AlertDialogPrimitive from \"@radix-ui/react-alert-dialog\";\nimport { cn } from \"./cn\";\n\nconst AlertDialog = AlertDialogPrimitive.Root;\nconst AlertDialogTrigger = AlertDialogPrimitive.Trigger;\nconst AlertDialogPortal = AlertDialogPrimitive.Portal;\n\nconst AlertDialogOverlay = React.forwardRef<\n React.ElementRef<typeof AlertDialogPrimitive.Overlay>,\n React.ComponentPropsWithoutRef<typeof AlertDialogPrimitive.Overlay>\n>(({ className, ...props }, ref) => (\n <AlertDialogPrimitive.Overlay\n ref={ref}\n className={cn(\n \"fixed inset-0 z-50 bg-black/40 backdrop-blur-[1px] data-[state=open]:animate-in data-[state=closed]:animate-out data-[state=closed]:fade-out-0 data-[state=open]:fade-in-0\",\n className\n )}\n {...props}\n />\n));\nAlertDialogOverlay.displayName = AlertDialogPrimitive.Overlay.displayName;\n\nconst AlertDialogContent = React.forwardRef<\n React.ElementRef<typeof AlertDialogPrimitive.Content>,\n React.ComponentPropsWithoutRef<typeof AlertDialogPrimitive.Content>\n>(({ className, ...props }, ref) => (\n <AlertDialogPortal>\n <AlertDialogOverlay />\n <AlertDialogPrimitive.Content\n ref={ref} data-uhuu-editor\n className={cn(\n \"fixed left-[50%] top-[50%] z-50 w-full max-w-md translate-x-[-50%] translate-y-[-50%] rounded-md border border-gray-200 bg-white p-6 shadow-lg outline-none data-[state=open]:animate-in data-[state=closed]:animate-out data-[state=closed]:fade-out-0 data-[state=open]:fade-in-0\",\n className\n )}\n {...props}\n />\n </AlertDialogPortal>\n));\nAlertDialogContent.displayName = AlertDialogPrimitive.Content.displayName;\n\nconst AlertDialogHeader = ({\n className,\n ...props\n}: React.HTMLAttributes<HTMLDivElement>) => (\n <div className={cn(\"flex flex-col gap-2 text-left\", className)} {...props} />\n);\nAlertDialogHeader.displayName = \"AlertDialogHeader\";\n\nconst AlertDialogFooter = ({\n className,\n ...props\n}: React.HTMLAttributes<HTMLDivElement>) => (\n <div\n className={cn(\"mt-6 flex flex-col-reverse gap-2 sm:flex-row sm:justify-end\", className)}\n {...props}\n />\n);\nAlertDialogFooter.displayName = \"AlertDialogFooter\";\n\nconst AlertDialogTitle = React.forwardRef<\n React.ElementRef<typeof AlertDialogPrimitive.Title>,\n React.ComponentPropsWithoutRef<typeof AlertDialogPrimitive.Title>\n>(({ className, ...props }, ref) => (\n <AlertDialogPrimitive.Title\n ref={ref}\n className={cn(\"text-base font-semibold text-gray-900\", className)}\n {...props}\n />\n));\nAlertDialogTitle.displayName = AlertDialogPrimitive.Title.displayName;\n\nconst AlertDialogDescription = React.forwardRef<\n React.ElementRef<typeof AlertDialogPrimitive.Description>,\n React.ComponentPropsWithoutRef<typeof AlertDialogPrimitive.Description>\n>(({ className, ...props }, ref) => (\n <AlertDialogPrimitive.Description\n ref={ref}\n className={cn(\"text-sm text-gray-600\", className)}\n {...props}\n />\n));\nAlertDialogDescription.displayName = AlertDialogPrimitive.Description.displayName;\n\nconst AlertDialogAction = React.forwardRef<\n React.ElementRef<typeof AlertDialogPrimitive.Action>,\n React.ComponentPropsWithoutRef<typeof AlertDialogPrimitive.Action>\n>(({ className, ...props }, ref) => (\n <AlertDialogPrimitive.Action\n ref={ref}\n className={cn(\n \"inline-flex h-9 items-center justify-center rounded-md bg-gray-900 px-4 text-sm font-medium text-white transition-colors hover:bg-gray-800\",\n className\n )}\n {...props}\n />\n));\nAlertDialogAction.displayName = AlertDialogPrimitive.Action.displayName;\n\nconst AlertDialogCancel = React.forwardRef<\n React.ElementRef<typeof AlertDialogPrimitive.Cancel>,\n React.ComponentPropsWithoutRef<typeof AlertDialogPrimitive.Cancel>\n>(({ className, ...props }, ref) => (\n <AlertDialogPrimitive.Cancel\n ref={ref}\n className={cn(\n \"inline-flex h-9 items-center justify-center rounded-md border border-gray-200 bg-white px-4 text-sm font-medium text-gray-900 transition-colors hover:bg-gray-50\",\n className\n )}\n {...props}\n />\n));\nAlertDialogCancel.displayName = AlertDialogPrimitive.Cancel.displayName;\n\nexport {\n AlertDialog,\n AlertDialogTrigger,\n AlertDialogContent,\n AlertDialogHeader,\n AlertDialogFooter,\n AlertDialogTitle,\n AlertDialogDescription,\n AlertDialogAction,\n AlertDialogCancel,\n};\n","import { Printer, Check } from 'lucide-react';\nimport { PageFilterConfig } from './page-group-utils';\nimport { Button } from '../../ui/button';\nimport {\n DropdownMenu,\n DropdownMenuContent,\n DropdownMenuItem,\n DropdownMenuTrigger,\n} from '../../ui/dropdown-menu';\n\nexport interface PrintConfig {\n label: string;\n filter: PageFilterConfig | null;\n pageFormat?: { bleed?: number; [key: string]: any }; // PageFormat overrides to merge\n}\n\nexport interface PrintConfigMap {\n [key: string]: PrintConfig;\n}\n\nexport interface DevPrintControlsProps {\n modes?: PrintConfigMap;\n selectedMode?: string; // Current mode from parent\n onModeChange?: (mode: string, config: PrintConfig) => void;\n interactive: boolean;\n onInteractiveChange: (interactive: boolean) => void;\n}\n\n/**\n * Developer print controls - print mode toggle with optional filter dropdown\n */\nexport function DevPrintControls({\n modes,\n selectedMode: selectedModeProp,\n onModeChange,\n interactive,\n onInteractiveChange,\n}: DevPrintControlsProps) {\n const modeKeys = modes ? Object.keys(modes) : [];\n const currentMode = selectedModeProp || modeKeys[0] || 'all';\n\n const handleModeSelect = (mode: string) => {\n // Enter print mode with selected filter\n onInteractiveChange(false);\n \n if (onModeChange && modes && modes[mode]) {\n onModeChange(mode, modes[mode]);\n }\n };\n\n const currentModeLabel = modes && modes[currentMode] ? modes[currentMode].label : 'All Pages';\n\n // No modes defined: Simple toggle button\n if (modeKeys.length === 0) {\n return (\n <Button\n variant=\"ghost\"\n size=\"sm\"\n onClick={() => onInteractiveChange(!interactive)}\n className={`text-xs font-medium text-gray-700 hover:bg-gray-100/80 h-7 px-2.5 ${!interactive ? 'bg-gray-100/80' : ''}`}\n >\n <Printer className=\"w-3.5 h-3.5\" />\n {currentModeLabel || 'Print Mode'}\n </Button>\n );\n }\n\n // Modes defined: Dropdown to select filter\n return (\n <DropdownMenu>\n <DropdownMenuTrigger asChild>\n <Button\n variant=\"ghost\"\n size=\"sm\"\n className={`text-xs font-medium text-gray-700 hover:bg-gray-100/80 h-7 px-2.5 ${!interactive ? 'bg-gray-100/80' : ''}`}\n >\n <Printer className=\"w-3.5 h-3.5\" />\n {currentModeLabel}\n </Button>\n </DropdownMenuTrigger>\n \n <DropdownMenuContent align=\"center\" className=\"min-w-[160px]\">\n {modeKeys.map((key) => (\n <DropdownMenuItem\n key={key}\n onClick={() => handleModeSelect(key)}\n className=\"flex items-center gap-2\"\n >\n {currentMode === key ? (\n <Check className=\"w-3 h-3 text-gray-400\" />\n ) : (\n <span className=\"w-3 h-3\" />\n )}\n {modes![key].label}\n </DropdownMenuItem>\n ))}\n </DropdownMenuContent>\n </DropdownMenu>\n );\n}\n","/**\n * Check if the code is running in development mode.\n * Checks if running on localhost or local development domains.\n * \n * @returns {boolean} True if running in development mode, false otherwise\n */\nexport function isDev(): boolean {\n // Only check runtime environment, not build-time variables\n if (typeof window !== 'undefined') {\n const hostname = window.location.hostname;\n return hostname === 'localhost' || \n hostname === '127.0.0.1' ||\n hostname.endsWith('.local') ||\n window.location.port !== ''; // Any port means dev server\n }\n \n return false;\n}\n","import * as React from 'react';\nimport { useMemo, useState, useContext } from 'react';\nimport { Plus, ClipboardList, X } from 'lucide-react';\nimport { useInteractive, useShouldHideUI } from '../interactive-mode-context';\nimport SectionPageResizer, { Section, TwoPageSection } from '../resizers/section-page-resizer';\nimport { AddPageDialog } from './add-page-dialog';\nimport { PageOrderDialog } from './page-order-dialog';\nimport { PageGroup } from './page-group';\nimport { PageCanvas } from './page-canvas';\nimport { PageOptionsDropdown } from './page-options-dropdown';\nimport {\n isPageGroup,\n normalizePageItems,\n PageItem,\n StandalonePage,\n PageEditorState,\n DEFAULT_PAGE_EDITOR_STATE_KEY,\n PageComponent,\n readPageEditorState,\n PageFilterConfig,\n} from './page-group-utils';\nimport { usePageGroups, AvailableItem } from './use-page-groups';\nimport {\n TemplateDataProvider,\n TemplateDataContext,\n getPagePayload as resolvePagePayload,\n buildPayloadPageOption,\n type PayloadOptionDefinition,\n} from './template-data-provider';\nimport { resolveIntegrationForPage } from './integration-utils';\nimport { buildPageDataBinding } from './data-binding';\nimport { buildPageGroupsConfig } from './page-group-presets';\nimport { Button } from '../../ui/button';\nimport { Badge } from '../../ui/badge';\nimport {\n AlertDialog,\n AlertDialogAction,\n AlertDialogContent,\n AlertDialogDescription,\n AlertDialogFooter,\n AlertDialogHeader,\n AlertDialogTitle,\n} from '../../ui/alert-dialog';\nimport { DevPrintControls, type PrintConfigMap } from './dev-print-controls';\nimport { isDev } from '../../utility/is-dev';\n\ntype ReferenceRenderer = (pageId: string) => React.ReactNode;\n\n// Schema-based page option types\nexport type PageOptionSelectValue = {\n label: string;\n value: string;\n hex?: string; // For color-series options\n};\n\ntype PageOptionTarget = string | ((pageOrGroup: PageItem) => boolean);\n\ntype BasePageOption = {\n id: string;\n label: string;\n description?: string;\n appliesTo?: PageOptionTarget | PageOptionTarget[];\n};\n\nexport type SelectPageOption = BasePageOption & {\n type: 'select';\n options: PageOptionSelectValue[];\n getValue: (pageOrGroup: PageItem) => string | number | boolean;\n onChange?: (\n pageOrGroupId: string,\n value: string,\n context: { item?: PageItem; updateItem: (patch: Partial<PageItem>) => void }\n ) => void;\n applyPatch?: (value: string, item?: PageItem) => Partial<PageItem> | void;\n};\n\nexport type TogglePageOption = BasePageOption & {\n type: 'toggle';\n getValue: (pageOrGroup: PageItem) => boolean;\n onChange?: (\n pageOrGroupId: string,\n value: string,\n context: { item?: PageItem; updateItem: (patch: Partial<PageItem>) => void }\n ) => void;\n applyPatch?: (value: string, item?: PageItem) => Partial<PageItem> | void;\n};\n\nexport type SliderPageOption = BasePageOption & {\n type: 'slider';\n min: number;\n max: number;\n step: number;\n getValue: (pageOrGroup: PageItem) => number;\n onChange?: (\n pageOrGroupId: string,\n value: string,\n context: { item?: PageItem; updateItem: (patch: Partial<PageItem>) => void }\n ) => void;\n applyPatch?: (value: string, item?: PageItem) => Partial<PageItem> | void;\n};\n\nexport type CounterPageOption = BasePageOption & {\n type: 'counter';\n min: number;\n max: number;\n step: number;\n getValue: (pageOrGroup: PageItem) => number;\n onChange?: (\n pageOrGroupId: string,\n value: string,\n context: { item?: PageItem; updateItem: (patch: Partial<PageItem>) => void }\n ) => void;\n applyPatch?: (value: string, item?: PageItem) => Partial<PageItem> | void;\n};\n\nexport type ColorSeriesPageOption = BasePageOption & {\n type: 'color-series';\n options: PageOptionSelectValue[]; // Must include hex property\n getValue: (pageOrGroup: PageItem) => string;\n onChange?: (\n pageOrGroupId: string,\n value: string,\n context: { item?: PageItem; updateItem: (patch: Partial<PageItem>) => void }\n ) => void;\n applyPatch?: (value: string, item?: PageItem) => Partial<PageItem> | void;\n};\n\nexport type PageOption = SelectPageOption | TogglePageOption | SliderPageOption | CounterPageOption | ColorSeriesPageOption;\n\ntype PreviewMode = 'single_page' | 'two_pages';\n\ninterface PageEditorProps {\n templateConfig: Parameters<typeof buildPageGroupsConfig>[0];\n payload?: any;\n onPayloadChange?: (nextPayload: any) => void;\n pageFormat?: { width: number; height: number; preview?: PreviewMode; bleed?: number; [key: string]: any };\n pageOptions?: Array<PageOption | PayloadOptionDefinition>;\n notifyError?: (message: string) => void;\n referenceRenderer?: ReferenceRenderer;\n renderOverlay?: (args: { pageNo: number; total: number; pageId: string; parent?: PageItem }) => React.ReactNode;\n renderPage?: (args: { page: StandalonePage & { pageNum: number }; parent?: PageItem }) => React.ReactNode;\n menuItems?: React.ReactNode;\n gridColsClass?: string;\n reorderTitle?: string;\n reorderDescription?: string;\n stateKey?: string;\n onItemsChange?: (items: PageItem[], state: PageEditorState) => void;\n onStateChange?: (state: PageEditorState) => void;\n resolveNewItem?: (draft: PageItem) => Promise<PageItem | null | void> | PageItem | null | void;\n pageFilter?: PageFilterConfig; // Filter which pages to render\n printConfigs?: PrintConfigMap; // Unified print configurations (includes filter + pageFormat)\n}\n\ntype PageEditorInnerProps = Omit<PageEditorProps, 'templateConfig'> & {\n initialItems?: PageItem[];\n availableItems?: AvailableItem[];\n pageComponents?: { [pageId: string]: PageComponent };\n};\n\nfunction PageEditorInner({\n initialItems = [],\n availableItems = [],\n pageComponents = {},\n payload,\n pageFormat,\n pageOptions = [],\n notifyError,\n referenceRenderer,\n renderOverlay,\n renderPage,\n menuItems,\n gridColsClass,\n reorderTitle = 'Reorder Pages and Groups',\n reorderDescription = 'Drag and drop to reorder. Groups move as a single unit.',\n stateKey = DEFAULT_PAGE_EDITOR_STATE_KEY,\n onItemsChange,\n onStateChange,\n resolveNewItem,\n pageFilter,\n printConfigs,\n}: PageEditorInnerProps) {\n const setup = pageFormat ?? { width: 210, height: 297 };\n const { interactive, setInteractive, enableDevTools } = useInteractive();\n const shouldHideUI = useShouldHideUI();\n \n // Dev print mode state\n const [devFilter, setDevFilter] = useState<PageFilterConfig | null>(null);\n const [devPageFormat, setDevPageFormat] = useState<any>(null);\n const [devSelectedMode, setDevSelectedMode] = useState<string | undefined>(undefined);\n \n // Use devFilter if set, otherwise use pageFilter prop\n const effectiveFilter = devFilter ?? pageFilter;\n \n // Apply dev pageFormat overrides if set, otherwise use original pageFormat\n const effectivePageFormat = useMemo(() => {\n if (devPageFormat) {\n return { ...setup, ...devPageFormat };\n }\n return setup;\n }, [setup, devPageFormat]);\n \n // Get payload from context if available (preferred), otherwise use prop\n const templateDataContext = useContext(TemplateDataContext);\n const effectivePayload = templateDataContext?.payload ?? payload;\n const [orderDialogOpen, setOrderDialogOpen] = useState(false);\n const preview: PreviewMode = effectivePageFormat?.preview ?? 'single_page';\n const pageSetup = useMemo(\n () => (preview === 'two_pages' ? { ...effectivePageFormat, preview: 'single_page' } : effectivePageFormat),\n [preview, effectivePageFormat]\n );\n\n const normalizedItems = useMemo(() => normalizePageItems(initialItems), [initialItems]);\n const resolvedPageOptions = useMemo(() => {\n if (!pageOptions?.length) return [];\n\n return pageOptions\n .map((option) => {\n if ('getValue' in option) return option;\n\n if (!templateDataContext?.setPageOptionValue) {\n if (isDev() || enableDevTools) {\n console.warn(\n 'PageEditor: payload-backed pageOptions require TemplateDataProvider or payload/onPayloadChange.'\n );\n }\n return null;\n }\n\n return buildPayloadPageOption(\n option,\n templateDataContext.payload,\n templateDataContext.setPageOptionValue\n );\n })\n .filter(Boolean) as PageOption[];\n }, [pageOptions, templateDataContext]);\n\n const {\n items,\n itemsWithPageNum,\n totalPageCount,\n availableItemsToAdd,\n addItem,\n removeItem,\n updateItemFields,\n addDialogOpen,\n setAddDialogOpen,\n openAddDialog,\n itemsForReorder,\n handleReorder,\n defaultRenderThumbnail,\n } = usePageGroups({\n initialItems: normalizedItems,\n availableItems,\n pageComponents,\n payload: effectivePayload,\n setup,\n stateKey,\n onItemsChange,\n onStateChange,\n resolveNewItem,\n notifyError,\n pageFilter: effectiveFilter,\n });\n\n const handlePageOptionChange = React.useCallback(\n (pageOption: PageOption, targetItem: PageItem | undefined, value: string) => {\n if (!targetItem) return;\n\n const patch = pageOption.applyPatch?.(value, targetItem);\n if (patch) {\n updateItemFields(targetItem.id, patch);\n }\n\n pageOption.onChange?.(targetItem.id, value, {\n item: targetItem,\n updateItem: (patch) => updateItemFields(targetItem.id, patch),\n });\n },\n [updateItemFields]\n );\n\n const defaultOverlay = (info: { pageNo: number; total: number }) => (\n <div className=\"absolute bottom-[10mm] left-[15mm] right-[15mm] text-[7pt] text-gray-600 flex items-center justify-between pointer-events-none\">\n <span>Page</span>\n <span>\n {info.pageNo} / {info.total}\n </span>\n </div>\n );\n\n const buildOverlay = (pageNo: number, pageId: string, parent?: PageItem) => {\n if (renderOverlay) {\n return renderOverlay({ pageNo, total: totalPageCount, pageId, parent });\n }\n return defaultOverlay({ pageNo, total: totalPageCount });\n };\n\n const renderPageContent = (page: StandalonePage & { pageNum: number }, parent?: PageItem) => {\n if (renderPage) {\n return renderPage({ page, parent });\n }\n\n const reference = referenceRenderer ? referenceRenderer(page.id) : null;\n const componentKey = page.componentKey ?? page.id;\n const templateId = page.templateId ?? componentKey;\n const PageComponent = pageComponents[componentKey];\n const pagePayload = templateDataContext?.getPagePayload\n ? templateDataContext.getPagePayload(page)\n : resolvePagePayload(effectivePayload, { id: page.id, templateId, componentKey });\n \n // Resolve integration data using utility function\n // For group pages, prefer parent group's integration; fallback to page's own integration\n const integration = resolveIntegrationForPage(\n effectivePayload,\n page,\n parent\n );\n\n const dataBinding = buildPageDataBinding({\n payload: effectivePayload,\n page,\n parentGroup: parent,\n pagePayload,\n });\n\n return (\n <PageCanvas\n pageId={page.id}\n templateId={templateId}\n pageNo={page.pageNum}\n component={PageComponent}\n payload={effectivePayload}\n pagePayload={pagePayload}\n integration={integration}\n page={page}\n parentGroup={parent}\n componentKey={componentKey}\n setup={pageSetup}\n reference={reference}\n overlay={({ pageNo }) => buildOverlay(pageNo, page.id, parent)}\n className={page.className}\n dataBinding={dataBinding}\n />\n );\n };\n\n // Render controls for standalone pages or group pages\n const renderPageControls = (page: StandalonePage & { pageNum: number }, parentGroup?: PageItem) => {\n const isGroupPage = !!parentGroup && isPageGroup(parentGroup);\n const isFirstPageInGroup = isGroupPage && parentGroup.pages[0]?.id === page.id;\n \n // For group pages, only show controls on the first page (group-level controls)\n if (isGroupPage && !isFirstPageInGroup) {\n return (\n <div className=\"pl-0 pr-3 py-1.5 flex justify-between items-center h-10\">\n <div className=\"flex items-center gap-2\">\n <span className=\"page-number\">\n {page.pageNum}\n </span>\n {page.label && (\n <span className=\"text-xs text-gray-500\">\n {page.label}\n </span>\n )}\n <span className=\"text-xs text-gray-400\">·</span>\n </div>\n </div>\n );\n }\n\n // Group-level controls (for first page in group) or standalone page controls\n return (\n <div className=\"pl-0 py-1.5 flex justify-start gap-2 items-center\">\n <div className=\"flex items-center gap-2\">\n <span className=\"page-number\">\n {page.pageNum}\n </span>\n {page.label && (\n <span className=\"text-xs text-gray-500\">\n {page.label}\n </span>\n )}\n {isGroupPage && (\n <Badge \n variant=\"outline\" \n className=\"hidden sm:inline-flex text-xs font-normal text-gray-600 border-gray-200 bg-transparent cursor-pointer hover:bg-gray-50 transition-colors\"\n onClick={() => {\n const currentLabel = parentGroup.label || parentGroup.id;\n const entered = window.prompt('Rename group:', currentLabel);\n if (entered !== null) {\n const trimmed = entered.trim();\n updateItemFields(parentGroup.id, { label: trimmed || undefined });\n }\n }}\n title=\"Click to rename\"\n data-group-id={parentGroup.id}\n >\n {parentGroup.label || parentGroup.id}\n </Badge>\n )}\n </div>\n <div className=\"flex items-center\">\n <PageOptionsDropdown\n pageOptions={resolvedPageOptions}\n targetItem={isGroupPage ? parentGroup : page}\n onChange={handlePageOptionChange}\n onRemove={removeItem}\n showRemove={totalPageCount > 1}\n title={isGroupPage ? \"Group options\" : \"Page options\"}\n removeLabel={isGroupPage ? \"Remove Group\" : \"Remove\"}\n />\n </div>\n </div>\n );\n };\n\n type PageWithParent = (StandalonePage & { pageNum: number }) & {\n parentGroup?: PageItem;\n };\n\n const flattenedPagesForTwoPages = useMemo<PageWithParent[]>(() => {\n if (preview !== 'two_pages') return [];\n\n const flattened: PageWithParent[] = [];\n \n for (const item of itemsWithPageNum) {\n const pages = isPageGroup(item) \n ? (item.pages ?? []) as Array<StandalonePage & { pageNum: number }>\n : [item as StandalonePage & { pageNum: number }];\n\n for (const page of pages) {\n if (page?.id) {\n flattened.push({\n ...page,\n kind: 'page' as const,\n id: page.id,\n pageNum: page.pageNum ?? 1,\n parentGroup: isPageGroup(item) ? item : undefined,\n });\n }\n }\n }\n\n return flattened.sort((a, b) => (a.pageNum ?? 0) - (b.pageNum ?? 0));\n }, [preview, itemsWithPageNum]);\n\n type PagePair = {\n left?: PageWithParent;\n right?: PageWithParent;\n layout: \"spread\" | \"left\" | \"right\";\n };\n\n /**\n * Transform origin logic for two-page spreads:\n * - Even pages (2,4,6...) appear on LEFT side → scale from RIGHT edge (gutter)\n * - Odd pages (1,3,5...) appear on RIGHT side → scale from LEFT edge (gutter)\n * This ensures pages meet precisely at center when zoomed\n */\n const pagePairs = useMemo<PagePair[]>(() => {\n if (preview !== 'two_pages') return [];\n\n const pages = flattenedPagesForTwoPages;\n if (!pages.length) return [];\n \n // Page 1 is always alone on the right (cover)\n const pairs: PagePair[] = [{ left: undefined, right: pages[0], layout: \"right\" }];\n \n // Subsequent pages are paired: 2-3, 4-5, 6-7, etc.\n for (let i = 1; i < pages.length; i += 2) {\n const leftPage = pages[i];\n const rightPage = pages[i + 1];\n \n if (rightPage) {\n pairs.push({ left: leftPage, right: rightPage, layout: \"spread\" });\n } else {\n // Single page at end: even pages go left, odd pages go right\n const isEven = leftPage.pageNum % 2 === 0;\n pairs.push({\n left: isEven ? leftPage : undefined,\n right: isEven ? undefined : leftPage,\n layout: isEven ? \"left\" : \"right\",\n });\n }\n }\n \n return pairs;\n }, [preview, flattenedPagesForTwoPages]);\n\n const defaultMenu = (\n <div className=\"flex items-center gap-1\">\n <Badge variant=\"secondary\" className=\"font-normal text-xs bg-gray-100/80 text-gray-700 border-0\">\n {totalPageCount} {totalPageCount === 1 ? 'Page' : 'Pages'}\n </Badge>\n { enableDevTools && printConfigs && (\n <DevPrintControls\n modes={printConfigs}\n selectedMode={devSelectedMode}\n onModeChange={(mode, config) => {\n setDevSelectedMode(mode);\n setDevFilter(config.filter ?? null);\n setDevPageFormat(config.pageFormat ?? null);\n }}\n interactive={interactive}\n onInteractiveChange={(newInteractive) => {\n setInteractive(newInteractive);\n // Reset pageFormat overrides when going back to edit mode\n if (newInteractive) {\n setDevPageFormat(null);\n }\n }}\n /> \n )} \n {interactive && (\n <>\n <Button\n variant=\"ghost\"\n size=\"sm\"\n onClick={openAddDialog}\n title=\"Add page or group\"\n className=\"text-xs font-medium text-gray-700 hover:bg-gray-100/80 h-7 px-2.5\"\n >\n <Plus className=\"w-3.5 h-3.5\" />\n Add\n </Button>\n <Button\n variant=\"ghost\"\n size=\"sm\"\n onClick={() => setOrderDialogOpen(true)}\n title=\"Reorder pages and groups using drag and drop\"\n className=\"text-xs font-medium text-gray-700 hover:bg-gray-100/80 h-7 px-2.5\"\n >\n <ClipboardList className=\"w-3.5 h-3.5\" />\n Reorder\n </Button>\n </>\n )}\n </div>\n );\n\n return (\n <>\n {/* Back button when in print mode - always rendered, hidden in print output */}\n {enableDevTools && !interactive && (\n <Button\n onClick={() => setInteractive(true)}\n data-uhuu-editor\n size=\"sm\"\n className=\"print:hidden fixed top-4 right-4 z-50 flex items-center gap-1.5 !text-xs rounded-full\"\n title=\"Back to Edit Mode\"\n >\n <X className=\"w-4 h-4\" />\n Back to Editor\n </Button>\n )}\n \n <SectionPageResizer\n defaultZoom={80}\n minZoom={25}\n maxZoom={200}\n menuItems={menuItems ?? defaultMenu}\n onAddPage={openAddDialog}\n preview={preview}\n >\n {preview === 'two_pages' ? (\n pagePairs.map((pair, index) => (\n <TwoPageSection key={`pair-${index}`} layout={pair.layout}>\n {pair.left && (\n <Section\n key={pair.left.id}\n title={`Sheet ${pair.left.pageNum}`}\n controls={renderPageControls(pair.left, pair.left.parentGroup)}\n origin={pair.left.pageNum % 2 === 0 ? 'right' : 'left'}\n >\n {renderPageContent(pair.left, pair.left.parentGroup)}\n </Section>\n )}\n {pair.right && (\n <Section\n key={pair.right.id}\n title={`Sheet ${pair.right.pageNum}`}\n controls={renderPageControls(pair.right, pair.right.parentGroup)}\n origin={pair.right.pageNum % 2 === 0 ? 'right' : 'left'}\n >\n {renderPageContent(pair.right, pair.right.parentGroup)}\n </Section>\n )}\n </TwoPageSection>\n ))\n ) : (\n itemsWithPageNum.map((item) => {\n if (isPageGroup(item)) {\n const pagesWithNumbers = (item.pages ?? []) as Array<StandalonePage & { pageNum: number }>;\n return (\n <PageGroup\n key={item.id}\n group={item}\n pagesWithPageNum={pagesWithNumbers}\n onRemove={removeItem}\n onLabelChange={(groupId, label) => {\n updateItemFields(groupId, { label: label || undefined });\n }}\n totalItems={items.length}\n renderPage={(page) => renderPageContent(page, item)}\n pageOptions={resolvedPageOptions}\n onPageOptionChange={(pageOption, target, value) => handlePageOptionChange(pageOption, target, value)}\n />\n );\n }\n\n const page = item as StandalonePage & { pageNum: number };\n return (\n <Section\n key={page.id}\n title={`Sheet ${page.pageNum}`}\n controls={renderPageControls(page)}\n >\n {renderPageContent(page)}\n </Section>\n );\n })\n )}\n </SectionPageResizer>\n\n {interactive && !shouldHideUI && (\n <>\n <AddPageDialog\n open={addDialogOpen}\n onOpenChange={setAddDialogOpen}\n availableItems={availableItemsToAdd}\n onSelectItem={addItem}\n pageComponents={pageComponents}\n payload={effectivePayload}\n setup={setup}\n gridColsClass={gridColsClass}\n data-uhuu-editor\n />\n\n <PageOrderDialog\n open={orderDialogOpen}\n onOpenChange={setOrderDialogOpen}\n pages={itemsForReorder}\n onReorder={(newOrder) => {\n handleReorder(newOrder);\n setOrderDialogOpen(false);\n }}\n pageComponents={pageComponents}\n payload={effectivePayload}\n setup={setup}\n renderThumbnail={defaultRenderThumbnail}\n title={reorderTitle}\n description={reorderDescription}\n gridColsClass={gridColsClass}\n data-uhuu-editor\n />\n </>\n )}\n </>\n );\n}\n\nfunction PageEditorView(props: PageEditorProps) {\n const { templateConfig, ...rest } = props;\n // Check if TemplateDataProvider already exists in the tree\n const existingContext = useContext(TemplateDataContext);\n \n // If context exists, or if no payload/onPayloadChange is provided, render directly\n // Otherwise, wrap with TemplateDataProvider for automatic payload management\n if (existingContext || (!props.payload && !props.onPayloadChange)) {\n return <PageEditorInner {...rest} />;\n }\n \n // Wrap with TemplateDataProvider to enable automatic payload updates\n // Pass stateKey so it can preserve page editor state correctly\n return (\n <TemplateDataProvider \n payload={props.payload} \n onPayloadChange={props.onPayloadChange}\n stateKey={props.stateKey}\n >\n <PageEditorInner {...rest} />\n </TemplateDataProvider>\n );\n}\n\nexport function PageEditor(props: PageEditorProps) {\n const templateDataContext = useContext(TemplateDataContext);\n const effectivePayload = templateDataContext?.payload ?? props.payload;\n const resolvedConfig = React.useMemo(\n () => buildPageGroupsConfig(props.templateConfig),\n [props.templateConfig]\n );\n const [noticeState, setNoticeState] = React.useState<{ open: boolean; message: string }>({\n open: false,\n message: '',\n });\n\n const notifyError = React.useCallback((message: string) => {\n setNoticeState({ open: true, message });\n }, []);\n\n const restoredItems = React.useMemo(\n () => readPageEditorState(effectivePayload)?.items ?? resolvedConfig.initialItems,\n [effectivePayload, resolvedConfig.initialItems]\n );\n\n return (\n <>\n <PageEditorView\n {...props}\n payload={effectivePayload}\n initialItems={restoredItems}\n availableItems={resolvedConfig.availableItems}\n pageComponents={resolvedConfig.pageComponents}\n notifyError={notifyError}\n />\n\n <AlertDialog\n open={noticeState.open}\n onOpenChange={(open) => {\n if (!open) {\n setNoticeState({ open: false, message: '' });\n }\n }}\n >\n <AlertDialogContent>\n <AlertDialogHeader>\n <AlertDialogTitle>Cannot remove item</AlertDialogTitle>\n <AlertDialogDescription>\n {noticeState.message}\n </AlertDialogDescription>\n </AlertDialogHeader>\n <AlertDialogFooter>\n <AlertDialogAction onClick={() => setNoticeState({ open: false, message: '' })}>\n OK\n </AlertDialogAction>\n </AlertDialogFooter>\n </AlertDialogContent>\n </AlertDialog>\n </>\n );\n}\n\nexport default PageEditor;\n","import * as React from 'react';\nimport type { PageDataBinding } from './data-binding';\nimport { getDialogProps } from '../../editable/dialog-props';\n\n/**\n * Dialog configuration options\n */\nexport type DialogOptions = {\n type?: 'image' | 'text' | 'assistant' | 'markdown' | 'spreadsheet' | 'map';\n imagePath?: string;\n imageGalleryPath?: string;\n ratio?: number;\n rows?: number;\n value?: any;\n payload?: any;\n [key: string]: any;\n};\n\n/**\n * Dialog configuration returned by dialog builders\n */\nexport type DialogConfig = {\n path: string;\n subPath?: string | null;\n imageGalleryPath?: string;\n type?: string;\n imagePath?: string;\n ratio?: number;\n rows?: number;\n value?: any;\n payload?: any;\n [key: string]: any;\n};\n\n/**\n * Config-based resolver: map of keys to path strings or functions\n * Path strings support optional chaining (e.g., 'integration.listing ?? integration.pba_listing')\n */\nexport type IntegrationResolverConfig = {\n [key: string]: string | ((integration: any) => any);\n};\n\n/**\n * Function-based resolver: complex extraction logic\n */\nexport type IntegrationResolverFunction = (\n integration: any,\n payload?: any\n) => any;\n\n/**\n * Union type for resolver\n */\nexport type IntegrationResolver = IntegrationResolverConfig | IntegrationResolverFunction;\n\n/**\n * Gallery path resolver: string path or function\n */\nexport type GalleryPathResolver = string | ((integration: any) => string | null);\n\n/**\n * Integration adapter configuration\n */\nexport type IntegrationAdapterConfig = {\n dataBinding: PageDataBinding;\n integration: any;\n resolver: IntegrationResolver;\n galleryPath?: GalleryPathResolver;\n defaults?: Record<string, any>;\n};\n\n/**\n * Integration adapter API returned by useIntegrationAdapter\n */\nexport type IntegrationAdapter = {\n // Resolved data (e.g., { listing, property, media })\n data: any;\n \n // Dialog builder that automatically uses dataBinding\n dialog: (subPath: string, options?: DialogOptions, value?: any) => DialogConfig | null;\n \n // Dialog props helper (combines dialog + getDialogProps)\n dialogProps: (subPath: string, options?: DialogOptions, value?: any) => Record<string, any>;\n \n // Gallery path (resolved from config or integration structure)\n galleryPath: string | null;\n \n // Integration instance info\n instanceId: string | null;\n integration: any;\n};\n\n/**\n * Evaluate a path string with optional chaining support\n * Supports patterns like: 'integration.listing ?? integration.pba_listing'\n */\nfunction evaluatePathString(path: string, integration: any): any {\n if (!path || !integration) return undefined;\n \n // Handle nullish coalescing operator (??)\n if (path.includes('??')) {\n const parts = path.split('??').map(p => p.trim());\n for (const part of parts) {\n const value = getNestedValue(integration, part);\n if (value !== undefined && value !== null) {\n return value;\n }\n }\n return undefined;\n }\n \n return getNestedValue(integration, path);\n}\n\n/**\n * Get nested value from object using dot notation\n */\nfunction getNestedValue(obj: any, path: string): any {\n if (!path) return obj;\n const keys = path.split('.');\n let current = obj;\n for (const key of keys) {\n if (current == null) return undefined;\n current = current[key];\n }\n return current;\n}\n\n/**\n * Resolve integration data using config-based resolver\n */\nfunction resolveWithConfig(\n config: IntegrationResolverConfig,\n integration: any,\n payload?: any\n): any {\n const result: any = {};\n \n for (const [key, resolver] of Object.entries(config)) {\n if (typeof resolver === 'function') {\n result[key] = resolver(integration);\n } else if (typeof resolver === 'string') {\n // Remove 'integration.' prefix if present (it's implicit)\n const path = resolver.startsWith('integration.') \n ? resolver.slice('integration.'.length)\n : resolver;\n result[key] = evaluatePathString(path, integration);\n }\n }\n \n return result;\n}\n\n/**\n * Resolve integration data using function-based resolver\n */\nfunction resolveWithFunction(\n resolver: IntegrationResolverFunction,\n integration: any,\n payload?: any\n): any {\n return resolver(integration, payload);\n}\n\n/**\n * Resolve integration data using the configured resolver\n */\nfunction resolveIntegrationData(\n resolver: IntegrationResolver,\n integration: any,\n payload?: any\n): any {\n if (typeof resolver === 'function') {\n return resolveWithFunction(resolver, integration, payload);\n } else {\n return resolveWithConfig(resolver, integration, payload);\n }\n}\n\n/**\n * Resolve gallery path from various sources\n */\nfunction resolveGalleryPath(\n dataBinding: PageDataBinding,\n integration: any,\n configGalleryPath?: GalleryPathResolver\n): string | null {\n // Priority 1: dataBinding.defaults.imageGalleryPath (from integration meta/config)\n if (dataBinding?.defaults?.imageGalleryPath) {\n return dataBinding.defaults.imageGalleryPath;\n }\n \n // Priority 2: Config-provided gallery path resolver\n if (configGalleryPath) {\n if (typeof configGalleryPath === 'function') {\n const resolved = configGalleryPath(integration);\n if (resolved) return resolved;\n } else if (typeof configGalleryPath === 'string') {\n return configGalleryPath;\n }\n }\n \n // Priority 3: Try to infer from integration structure\n if (integration?.media?.images) return 'media.images';\n if (integration?.listing?.media?.images) return 'listing.media.images';\n if (integration?.pba_listing?.media?.images) return 'pba_listing.media.images';\n if (integration?.property?.media?.images) return 'property.media.images';\n \n return null;\n}\n\n/**\n * Build integration dialog path using dataBinding\n */\nfunction buildDialogPath(\n dataBinding: PageDataBinding,\n subPath: string,\n isAssistant: boolean\n): string | null {\n if (!dataBinding?.integration?.path) return null;\n \n if (isAssistant) {\n // For assistant dialogs, include subPath in the main path\n return dataBinding.integration.path(subPath);\n } else {\n // For other dialogs, get base path and subPath is handled separately\n return dataBinding.integration.path();\n }\n}\n\n/**\n * Build dialog configuration\n */\nfunction buildDialogConfig(\n dataBinding: PageDataBinding,\n subPath: string,\n options: DialogOptions = {},\n value?: any,\n galleryPath: string | null = null\n): DialogConfig | null {\n const integrationPath = dataBinding?.integration?.path?.();\n if (!integrationPath) return null;\n \n const isAssistant = options.type === 'assistant';\n const isImage = options.type === 'image' || options.imagePath;\n \n // Build the full path\n const fullPath = isAssistant\n ? dataBinding.integration.path(subPath) ?? [integrationPath, subPath].filter(Boolean).join('.')\n : [integrationPath, subPath].filter(Boolean).join('.');\n \n // For image dialogs, resolve gallery path\n if (isImage) {\n const resolvedGalleryPath = options.imageGalleryPath \n ?? (galleryPath ? `${integrationPath}.${galleryPath}` : null)\n ?? dataBinding.defaults.imageGalleryPath;\n \n return {\n path: fullPath,\n imagePath: options.imagePath || 'url',\n imageGalleryPath: resolvedGalleryPath,\n type: options.type || 'image',\n ratio: options.ratio,\n value,\n payload: options.payload ?? dataBinding.payload,\n ...options,\n };\n }\n \n // For assistant dialogs, path includes subPath\n if (isAssistant) {\n return {\n path: fullPath,\n type: 'assistant',\n rows: options.rows,\n value,\n payload: options.payload ?? dataBinding.payload,\n ...options,\n };\n }\n \n // For other dialogs\n return {\n path: integrationPath,\n subPath,\n type: options.type || 'text',\n rows: options.rows,\n value,\n payload: options.payload ?? dataBinding.payload,\n ...options,\n };\n}\n\n/**\n * Hook to create an integration adapter for easy data resolution and dialog building\n * \n * @example\n * ```tsx\n * const adapter = useIntegrationAdapter({\n * dataBinding,\n * integration,\n * resolver: {\n * listing: 'listing ?? pba_listing',\n * property: 'property',\n * media: 'media',\n * },\n * galleryPath: (integration) => {\n * if (integration?.media?.images) return 'media.images';\n * return 'listing.media.images';\n * },\n * });\n * \n * // Use resolved data\n * const { listing, property, media } = adapter.data;\n * \n * // Use dialog props\n * <div {...adapter.dialogProps('overrides.heroImage', { type: 'image', imagePath: 'url' }, heroImage)}>\n * ```\n */\nexport function useIntegrationAdapter(\n config: IntegrationAdapterConfig\n): IntegrationAdapter {\n const { dataBinding, integration, resolver, galleryPath: configGalleryPath, defaults } = config;\n \n // Resolve integration data\n const resolvedData = React.useMemo(() => {\n return resolveIntegrationData(resolver, integration, dataBinding?.payload);\n }, [resolver, integration, dataBinding?.payload]);\n \n // Resolve gallery path\n const galleryPath = React.useMemo(() => {\n return resolveGalleryPath(dataBinding, integration, configGalleryPath);\n }, [dataBinding, integration, configGalleryPath]);\n \n // Dialog builder\n const dialog = React.useCallback(\n (subPath: string, options: DialogOptions = {}, value?: any): DialogConfig | null => {\n return buildDialogConfig(\n dataBinding,\n subPath,\n options,\n value,\n galleryPath\n );\n },\n [dataBinding, galleryPath]\n );\n \n // Dialog props builder (combines dialog + getDialogProps)\n const dialogProps = React.useCallback(\n (subPath: string, options: DialogOptions = {}, value?: any): Record<string, any> => {\n const dialogConfig = dialog(subPath, options, value);\n if (!dialogConfig) return {};\n \n // Use the getDialogProps utility from editable\n // getDialogProps expects { dialog } and optional config\n const props = getDialogProps({ dialog: dialogConfig }, { page: { paginationType: 'static' } });\n \n // Ensure stopPropagation is called on click\n if (props.onClick) {\n const originalOnClick = props.onClick;\n props.onClick = (e: any) => {\n e.stopPropagation();\n originalOnClick(e);\n };\n }\n \n return props;\n },\n [dialog]\n );\n \n return React.useMemo(\n () => ({\n data: resolvedData,\n dialog,\n dialogProps,\n galleryPath,\n instanceId: dataBinding?.integration?.instanceId ?? null,\n integration,\n }),\n [resolvedData, dialog, dialogProps, galleryPath, dataBinding, integration]\n );\n}\n\n","import { useState, forwardRef, useRef, useImperativeHandle, useCallback } from 'react';\nimport { Previewer } from 'pagedjs';\nimport debounce from 'lodash/debounce';\n\nconst PagedComponent = forwardRef(({ children }, ref) => {\n const [rendering, setRendering] = useState(false);\n const containerRef = useRef(null);\n const pageFlowRef = useRef(null);\n\n if (typeof document === 'undefined') {\n return null;\n }\n\n // Expose layout method to parent via ref\n useImperativeHandle(ref, () => ({\n layout: layoutPage,\n }));\n\n // Memoize the layoutPage function with debounce\n const layoutPage = useCallback(\n debounce(() => {\n // Ensure container and flow elements are available\n if (!containerRef.current || !pageFlowRef.current) {\n console.warn(\"Container or page flow reference is missing.\");\n return;\n }\n\n setRendering(true);\n\n const { clientHeight: height, clientWidth: width } = containerRef.current;\n\n // Clear the container before rendering new content\n containerRef.current.innerHTML = '';\n\n // Set fixed width and height to avoid layout issues during rendering\n if (height) containerRef.current.style.minHeight = `${height}px`;\n if (width && window !== window.parent) containerRef.current.style.minWidth = `${width}px`;\n\n // Remove previously inserted paged.js styles\n document.querySelectorAll(\"style[data-pagedjs-inserted-styles]\").forEach((style) => style.remove());\n\n let pageFileName = \"page.css\"\n const paged = new Previewer();\n\n // Wrap in a try-catch to handle errors during preview generation\n try {\n paged.preview(pageFlowRef.current.innerHTML, [pageFileName], containerRef.current).then(() => {\n setRendering(false);\n\n // revert back container minWidth, minHeight after rendering.\n containerRef.current.style.minWidth = 'auto';\n containerRef.current.style.minHeight = 'auto';\n\n // Attach event listeners for elements with \"data-uhuu\" attribute\n document.querySelectorAll(\"[data-uhuu]\").forEach((item) => {\n const clickListener = function () {\n const value = JSON.parse(this.getAttribute(\"data-uhuu\"));\n $uhuu.editDialog(value);\n };\n // Ensure unique listener attachment\n item.removeEventListener('click', clickListener);\n item.addEventListener('click', clickListener);\n });\n\n // Apply custom classes based on page-break-after elements\n document.querySelectorAll(\".page-break-after[data-paged-css]\").forEach((el) => {\n const pagedSheet = el.closest('div.pagedjs_sheet');\n const pagedCSS = el.getAttribute('data-paged-css');\n if (pagedSheet && pagedCSS) {\n pagedCSS.split(' ').filter(Boolean).forEach((cssClass) => pagedSheet.classList.add(cssClass));\n }\n });\n });\n } catch (error) {\n console.error(\"Error during Paged.js preview rendering:\", error);\n setRendering(false);\n }\n }, 500),\n []\n );\n\n return (\n <div className={rendering ? 'rendering uhuu-page' : 'rendered uhuu-page'}>\n {/* Container for Paged.js preview */}\n <div className=\"pagedjs_preview_container\" ref={containerRef}></div>\n\n {/* Hidden flow container for the content */}\n <div style={{display:\"none\"}} ref={pageFlowRef}>\n {children}\n </div>\n </div>\n );\n});\n\nexport default PagedComponent;","// src/index.js\nimport './uhuu/styles/uhuu-editor-theme.css';\nimport PaginationDynamic from './uhuu/pagination-dynamic/pagination-dynamic';\nimport SheetDynamic from './uhuu/pagination-dynamic/sheet-dynamic';\n\n// Group Dynamic components\nexport const Dynamic = {\n Pagination: PaginationDynamic,\n Sheet: SheetDynamic\n};\n\nimport PaginationStatic from './uhuu/pagination-static/pagination-static';\nimport SheetStatic from './uhuu/pagination-static/sheet-static';\n\n// Group Static components\nexport const Static = {\n Pagination: PaginationStatic,\n Sheet: SheetStatic\n};\n\nexport { default as ImageBlock } from './uhuu/image/image-block';\nexport { default as Editable } from './uhuu/editable/editable';\n\n// EditorShell components - grouped export only\nimport { TemplateDataProvider } from './uhuu/editor-shell/document/template-data-provider';\nimport { PageEditor } from './uhuu/editor-shell/document/page-editor';\nimport { InteractiveModeProvider, useInteractive } from './uhuu/editor-shell/interactive-mode-context';\nimport { useIntegrationAdapter } from './uhuu/editor-shell/document/integration-adapter';\n\nexport const EditorShell = {\n TemplateDataProvider,\n PageEditor,\n InteractiveModeProvider,\n useInteractive,\n useIntegrationAdapter,\n};\n\n// backwards compatibility\nexport { default as PagedPreview } from './PagedPreview';\n"],"names":["isObject","value","type","isObject_1","freeGlobal","global","_freeGlobal","require$$0","freeSelf","root","_root","now","now_1","reWhitespace","trimmedEndIndex","string","index","_trimmedEndIndex","reTrimStart","baseTrim","_baseTrim","Symbol","_Symbol","objectProto","hasOwnProperty","nativeObjectToString","symToStringTag","getRawTag","isOwn","tag","unmasked","result","_getRawTag","objectToString","_objectToString","require$$1","require$$2","nullTag","undefinedTag","baseGetTag","_baseGetTag","isObjectLike","isObjectLike_1","symbolTag","isSymbol","isSymbol_1","NAN","reIsBadHex","reIsBinary","reIsOctal","freeParseInt","toNumber","other","isBinary","toNumber_1","FUNC_ERROR_TEXT","nativeMax","nativeMin","debounce","func","wait","options","lastArgs","lastThis","maxWait","timerId","lastCallTime","lastInvokeTime","leading","maxing","trailing","invokeFunc","time","args","thisArg","leadingEdge","timerExpired","remainingWait","timeSinceLastCall","timeSinceLastInvoke","timeWaiting","shouldInvoke","trailingEdge","cancel","flush","debounced","isInvoking","debounce_1","DocumentUtils$1","container","height","width","style","item","clickListener","el","pagedSheet","pagedCSS","cssClass","styles","fileName","blob","body","PageSizeUtils","format","orientation","size","mm","dpi","dimensions","paginationType","bleed","showBleed","compatibility","printCssRaw","printCssUrl","preview","ConfigContext","createContext","ConfigProvider","config","children","Pagination","className","setup","rendering","setRendering","useState","containerRef","useRef","contentRef","documentUtilsRef","DocumentUtils","pageRuleRegex","match","sizeAndBleedStyles","existingStyles","newPageRule","layoutPage","paged","Previewer","styleUrls","error","useEffect","jsxs","jsx","Sheet","Compatibility","link","CompatibilityUtils","styleLink","combinedClassName","forwardRef","pageNo","overlay","dataPageKey","ref","useContext","showBleedArea","getDialogProps","props","dialog","e","ImageBleed","BLEED","PAGE_CONTENT_WIDTH","PAGE_CONTENT_HEIGHT","src","backgroundColor","imageW","imageH","imageL","imageR","imageT","imageB","coverClass","setCoverClass","unitFormat","calculateImageHeight","imageWidth","imageHeight","formatStyleValue","_","ratio","imageLoaded","imageClass","InteractiveModeContext","useInteractive","useShouldHideUI","interactive","InteractiveModeProvider","defaultInteractive","enableDevTools","effectiveDefaultInteractive","setInteractive","cn","inputs","twMerge","clsx","buttonVariants","cva","Button","React","variant","DropdownMenu","DropdownMenuPrimitive","DropdownMenuTrigger","DropdownMenuSubTrigger","inset","DropdownMenuSubContent","DropdownMenuContent","sideOffset","DropdownMenuItem","DropdownMenuCheckboxItem","checked","DropdownMenuRadioItem","DropdownMenuLabel","DropdownMenuSeparator","handleOptionSelect","event","option","renderOverlay","overlaySvg","overlayClassName","trimmed","normalizedSvg","attrs","nextAttrs","renderOptionsButton","showOptions","MoreHorizontal","useShouldShowOptions","shouldHideUI","ImageBleedWithOverlay","dialogProps","bleedProps","Fragment","ImageSpread","side","val","calculateImageWidth","createStyle","imageLeft","rightPageOffset","leftStyle","rightStyle","ImageWithOptions","alt","imageClassName","imageStyle","placeholder","imageProps","renderImage","baseDialogProps","mergedDialogProps","merged","key","baseHandler","extraHandler","renderImageContent","imagePropsClassName","imagePropsStyle","finalSrc","finalAlt","mergedImageProps","ImageBlock","computedOverlaySvg","computedOptions","useMemo","annotation","annotationValue","autoOverlaySvg","autoOptions","dialogConfig","annotations","finalOptions","mode","needsImageWithOptions","_mode","left","right","top","bottom","pageWidth","pageHeight","baseProps","spreadComponent","Editable","DEFAULT_PAGE_EDITOR_STATE_KEY","isPageGroup","flattenPages","items","pageNum","page","updatePageNumbers","updatedPages","getTotalPageCount","transformItemsForReorder","strictPosition","firstPage","firstPageComponentKey","pageComponentKey","restoreItemsFromReorder","reorderedItems","originalItems","originalItemsMap","restored","reorderedItem","original","normalizePageItems","_ignored","rest","buildPageEditorState","normalized","readPageEditorState","payload","maybeState","normalizedItems","mergePageEditorStateIntoPayload","state","generateUID","instantiatePage","templateId","componentKey","overrides","instantiateGroup","componentKeys","instanceId","idx","resolvePageIndex","totalPages","isPageInRanges","ranges","range","start","end","getRangesForMode","coverPageCount","filterPageItems","filterConfig","filtered","filteredPages","getIntegrationData","resolveIntegrationInstanceId","parentGroup","resolveIntegrationBinding","resolveIntegrationForPage","buildIntegrationPath","fieldPath","base","parseIntegrationPath","path","integrationPrefix","afterPrefix","dotIndex","setNestedValue","obj","keys","current","i","lastKey","updateIntegrationByPath","parsed","currentIntegration","updatedIntegration","getPagePayload","target","targetId","fallbackId","candidateKeys","TemplateDataContext","getReservedKeys","stateKey","mergeExternalPayload","currentPayload","externalPayload","reservedKeys","TemplateDataProvider","onPayloadChange","setCurrentPayload","lastExternalPayloadRef","isInternalUpdateRef","lastInternalPayloadRef","lastInternalTimestampRef","isInitialMountRef","serializePayload","p","payloadWithoutReservedKeys","currentWithoutReserved","lastInternalWithoutReserved","currentSerialized","lastInternalSerialized","prev","notifyHost","next","setPayload","resolved","finalPayload","setPageOptionValue","pageOrGroupId","setIntegrationPayload","prevIntegrations","setIntegrationPayloadValue","prevIntegration","removeIntegrationPayload","removed","remainingIntegrations","updateIntegrationByDialogPath","mergePageEditorState","effectiveKey","resolvePagePayload","toDefault","def","parseValue","raw","buildPayloadPageOption","field","stored","ZoomContext","TwoPageSection","layout","scaleValue","pairRef","updatePairWidth","sections","totalNaturalWidth","sum","section","scaledWidth","resizeObserver","Section","title","controls","origin","hideUI","contentHeight","setContentHeight","contentWidth","setContentWidth","updateDimensions","element","originalTransform","naturalHeight","naturalWidth","scaledHeight","alignmentMap","contentAlignClass","transformOrigin","SectionPageResizer","defaultZoom","minZoom","maxZoom","onAddPage","menuItems","hideUIProp","zoom","setZoom","fitMode","setFitMode","autoFitInitialized","setAutoFitInitialized","lastContainerWidth","setLastContainerWidth","isInitializing","setIsInitializing","calculateFitZoom","firstSection","availableWidth","availableHeight","scaleX","scaleY","handleFitMode","newZoom","zoomIn","zoomOut","handleInitialization","currentContainerWidth","sectionWidth","handleResize","ChevronDown","UnfoldHorizontal","UnfoldVertical","Maximize","ZoomOut","clampedValue","ZoomIn","Plus","SheetPrimitive","SheetPortal","SheetOverlay","SheetContent","XIcon","SheetHeader","SheetFooter","SheetTitle","SheetDescription","createDefaultRenderThumbnail","pageComponents","thumbnailWidth","thumbnailHeight","pageWidthMm","pageHeightMm","pageAspectRatio","finalThumbnailWidth","finalThumbnailHeight","pageWidthPx","pageHeightPx","isDragging","isLocked","firstPageId","firstPagePayload","FirstPageComponent","integration","Lock","pageId","pagePayload","PageComponent","AddPageDialog","open","onOpenChange","availableItems","onSelectItem","gridColsClass","handleSelect","defaultRenderThumbnail","toReorderItem","group","pageItem","isGroup","id","label","pageCount","SortableItem","renderItem","renderDragIndicator","keyExtractor","disabled","attributes","listeners","setNodeRef","transform","transition","useSortable","CSS","DragOverlayItem","DragDropGrid","initialItems","onChange","renderToolbar","renderEmptyState","showDebugInfo","renderDragOverlay","isItemDisabled","canDropAt","setItems","activeId","setActiveId","sensors","useSensors","useSensor","PointerSensor","KeyboardSensor","sortableKeyboardCoordinates","handleDragStart","draggedItem","handleDragEnd","active","over","oldIndex","newIndex","newItems","arrayMove","activeItem","activeIndex","DndContext","closestCenter","SortableContext","rectSortingStrategy","DragOverlay","badgeVariants","Badge","DefaultPageThumbnail","GripVertical","PageOrderDialog","pages","onReorder","renderThumbnail","description","localPages","setLocalPages","hasChanges","setHasChanges","handleLocalReorder","newOrder","handleSave","handleCancel","renderPageThumbnail","ArrowUpDown","targetIndex","draggedPosition","startEndIndex","endStartIndex","position","newOpen","Select","Switch","SwitchPrimitive","Slider","SliderPrimitive","Label","LabelPrimitive","PageOptionsRenderer","pageOptions","targetItem","matchesTarget","applicableOptions","renderOption","currentValue","opt","boolValue","numValue","values","newValue","Minus","stringValue","color","isSelected","Check","PageOptionsDropdown","onRemove","showRemove","removeLabel","triggerClassName","Trash2","PageGroup","pagesWithPageNum","totalItems","renderPage","onPageOptionChange","onLabelChange","handleLabelClick","currentLabel","entered","indexInGroup","isFirstPage","PageCanvas","reference","dataBinding","pageKey","usePageGroups","onItemsChange","onStateChange","resolveNewItem","notifyError","pageFilter","addDialogOpen","setAddDialogOpen","templateDataContext","updateItems","useCallback","instanceCountsByTemplate","counts","pageTemplateId","availableItemsToAdd","count","isRepeatable","maxInstances","groupItem","totalPageCount","addItem","resolveIntegrationMode","draft","available","groupConfig","debugIntegration","integrationData","integrationMode","shouldAbort","requestIntegration","finalItem","itemToInsert","itemPosition","startItems","middleItems","endItems","removeItem","itemId","showError","message","updateItemFields","patch","reorderItems","itemsWithPageNum","itemsWithNumbers","renderItems","rendered","itemsForReorder","handleReorder","itemsToOrder","openAddDialog","buildPath","subPath","resolveGalleryPath","defaults","buildPageDataBinding","integrationBinding","groupId","pageBase","groupBase","asPage","isInitial","templateLookup","templateConfig","repeatable","component","asGroup","normalizeGroups","groups","buildPageGroupsConfig","initial","pageComponentKeys","explicitPageComponents","normalizedGroups","groupMap","inferredPageComponentKeys","mergedPageComponents","maybeGroup","availableGroupItems","AlertDialog","AlertDialogPrimitive","AlertDialogPortal","AlertDialogOverlay","AlertDialogContent","AlertDialogHeader","AlertDialogFooter","AlertDialogTitle","AlertDialogDescription","AlertDialogAction","AlertDialogCancel","DevPrintControls","modes","selectedModeProp","onModeChange","onInteractiveChange","modeKeys","currentMode","handleModeSelect","currentModeLabel","Printer","isDev","hostname","PageEditorInner","pageFormat","referenceRenderer","reorderTitle","reorderDescription","printConfigs","devFilter","setDevFilter","devPageFormat","setDevPageFormat","devSelectedMode","setDevSelectedMode","effectiveFilter","effectivePageFormat","effectivePayload","orderDialogOpen","setOrderDialogOpen","pageSetup","resolvedPageOptions","handlePageOptionChange","pageOption","defaultOverlay","info","buildOverlay","parent","renderPageContent","renderPageControls","isGroupPage","isFirstPageInGroup","flattenedPagesForTwoPages","flattened","a","b","pagePairs","pairs","leftPage","rightPage","isEven","X","newInteractive","ClipboardList","pair","pagesWithNumbers","PageEditorView","PageEditor","resolvedConfig","noticeState","setNoticeState","restoredItems","evaluatePathString","parts","part","getNestedValue","resolveWithConfig","resolver","resolveWithFunction","resolveIntegrationData","configGalleryPath","buildDialogConfig","galleryPath","integrationPath","isAssistant","isImage","fullPath","resolvedGalleryPath","useIntegrationAdapter","resolvedData","originalOnClick","PagedComponent","pageFlowRef","useImperativeHandle","pageFileName","Dynamic","PaginationDynamic","SheetDynamic","Static","PaginationStatic","SheetStatic","EditorShell"],"mappings":"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","x_google_ignoreList":[0,1,2,3,4,5,6,7,8,9,10,11,12,13]}
|