@fluid-app/portal-sdk 0.1.456 → 0.1.458

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.
Files changed (76) hide show
  1. package/dist/{CardWidget-BbddboSI.cjs → CardWidget-8kubp1dh.cjs} +2 -2
  2. package/dist/{CardWidget-Bs0hqVjy.mjs → CardWidget-Dee9DpBH.mjs} +2 -2
  3. package/dist/{CardWidget-Bs0hqVjy.mjs.map → CardWidget-Dee9DpBH.mjs.map} +1 -1
  4. package/dist/{CardWidget-CGbAcMeq.cjs → CardWidget-YGsYcK7i.cjs} +2 -2
  5. package/dist/{CardWidget-CGbAcMeq.cjs.map → CardWidget-YGsYcK7i.cjs.map} +1 -1
  6. package/dist/{ContainerWidget-bbzSrNUJ.mjs → ContainerWidget-BVlY76wy.mjs} +2 -2
  7. package/dist/{ContainerWidget-bbzSrNUJ.mjs.map → ContainerWidget-BVlY76wy.mjs.map} +1 -1
  8. package/dist/{ContainerWidget-CRCAjF4G.cjs → ContainerWidget-Ba_Ti1Qh.cjs} +3 -3
  9. package/dist/{ContainerWidget-BOZYpAH1.cjs → ContainerWidget-DCDrjhgP.cjs} +2 -2
  10. package/dist/{ContainerWidget-BOZYpAH1.cjs.map → ContainerWidget-DCDrjhgP.cjs.map} +1 -1
  11. package/dist/{FluidProvider-CbA8KrhD.mjs → FluidProvider-C5JqeOGi.mjs} +3 -3
  12. package/dist/{FluidProvider-CbA8KrhD.mjs.map → FluidProvider-C5JqeOGi.mjs.map} +1 -1
  13. package/dist/{FluidProvider-JiGJqJQe.cjs → FluidProvider-LYDiXUkk.cjs} +3 -3
  14. package/dist/{FluidProvider-JiGJqJQe.cjs.map → FluidProvider-LYDiXUkk.cjs.map} +1 -1
  15. package/dist/{LayoutWidget-nea3CGc6.cjs → LayoutWidget-BKjkjoNO.cjs} +2 -2
  16. package/dist/{LayoutWidget-CS8fOr1e.cjs → LayoutWidget-CqIkNZNa.cjs} +2 -2
  17. package/dist/{LayoutWidget-CS8fOr1e.cjs.map → LayoutWidget-CqIkNZNa.cjs.map} +1 -1
  18. package/dist/{LayoutWidget-ENLd1G__.mjs → LayoutWidget-DkYKWC2P.mjs} +2 -2
  19. package/dist/{LayoutWidget-ENLd1G__.mjs.map → LayoutWidget-DkYKWC2P.mjs.map} +1 -1
  20. package/dist/{MessagingScreen-BeUhzBWr.cjs → MessagingScreen-BLZt8lMN.cjs} +2 -2
  21. package/dist/{MessagingScreen-BeUhzBWr.cjs.map → MessagingScreen-BLZt8lMN.cjs.map} +1 -1
  22. package/dist/{MessagingScreen-D6Bxoq0a.cjs → MessagingScreen-CoBvR0p4.cjs} +7 -7
  23. package/dist/{MessagingScreen-Dt6Rwk7_.mjs → MessagingScreen-CowNfnz0.mjs} +8 -8
  24. package/dist/{MessagingScreen-BtdVeSR5.mjs → MessagingScreen-kftHOAO7.mjs} +2 -2
  25. package/dist/{MessagingScreen-BtdVeSR5.mjs.map → MessagingScreen-kftHOAO7.mjs.map} +1 -1
  26. package/dist/{OrdersScreen-BirJq38x.cjs → OrdersScreen-B3Aa4ip-.cjs} +7 -7
  27. package/dist/{OrdersScreen-BSwESoF3.cjs → OrdersScreen-C-B6_Agy.cjs} +2 -2
  28. package/dist/{OrdersScreen-BSwESoF3.cjs.map → OrdersScreen-C-B6_Agy.cjs.map} +1 -1
  29. package/dist/{OrdersScreen-fZFg1l1W.mjs → OrdersScreen-DDQ8QXWo.mjs} +2 -2
  30. package/dist/{OrdersScreen-fZFg1l1W.mjs.map → OrdersScreen-DDQ8QXWo.mjs.map} +1 -1
  31. package/dist/{OrdersScreen-1kPmXJga.mjs → OrdersScreen-DPkq_mS2.mjs} +8 -8
  32. package/dist/{ProfileScreen-CirvTBwX.cjs → ProfileScreen-CK17yi8m.cjs} +8 -8
  33. package/dist/{ProfileScreen-Dj1pTzLz.mjs → ProfileScreen-DnlCxwh6.mjs} +3 -3
  34. package/dist/{ProfileScreen-Dj1pTzLz.mjs.map → ProfileScreen-DnlCxwh6.mjs.map} +1 -1
  35. package/dist/{ProfileScreen-BvxuA9P4.cjs → ProfileScreen-R4ulzpPu.cjs} +3 -3
  36. package/dist/{ProfileScreen-BvxuA9P4.cjs.map → ProfileScreen-R4ulzpPu.cjs.map} +1 -1
  37. package/dist/{ProfileScreen-Bqv7MNPH.mjs → ProfileScreen-ntvqBCpb.mjs} +9 -9
  38. package/dist/{ScreenRenderer-EGk5-w0h.cjs → ScreenRenderer-D0-ymcZV.cjs} +13 -4
  39. package/dist/ScreenRenderer-D0-ymcZV.cjs.map +1 -0
  40. package/dist/{ScreenRenderer-BQz-1cCn.mjs → ScreenRenderer-KJIcMne2.mjs} +13 -4
  41. package/dist/ScreenRenderer-KJIcMne2.mjs.map +1 -0
  42. package/dist/{ShopScreen-3ryiBWeh.cjs → ShopScreen-BtwvHTbN.cjs} +7 -7
  43. package/dist/{ShopScreen-CfvCqYJ9.mjs → ShopScreen-CGX6YHVV.mjs} +8 -8
  44. package/dist/{ShopScreen-BKWFrPHB.mjs → ShopScreen-CUoUECrG.mjs} +3 -3
  45. package/dist/{ShopScreen-BKWFrPHB.mjs.map → ShopScreen-CUoUECrG.mjs.map} +1 -1
  46. package/dist/{ShopScreen-C3vwiETG.cjs → ShopScreen-DS5-ICA-.cjs} +2 -2
  47. package/dist/{ShopScreen-C3vwiETG.cjs.map → ShopScreen-DS5-ICA-.cjs.map} +1 -1
  48. package/dist/{ShopWidget-CwiD88Sr.mjs → ShopWidget-DXVNRrFY.mjs} +2 -2
  49. package/dist/{ShopWidget-CwiD88Sr.mjs.map → ShopWidget-DXVNRrFY.mjs.map} +1 -1
  50. package/dist/{SubscriptionsScreen-DWB0E5Hu.cjs → SubscriptionsScreen-D04ldHXL.cjs} +3 -3
  51. package/dist/{SubscriptionsScreen-DWB0E5Hu.cjs.map → SubscriptionsScreen-D04ldHXL.cjs.map} +1 -1
  52. package/dist/{SubscriptionsScreen-Dv7PjXwb.mjs → SubscriptionsScreen-D0pn4_JR.mjs} +3 -3
  53. package/dist/{SubscriptionsScreen-Dv7PjXwb.mjs.map → SubscriptionsScreen-D0pn4_JR.mjs.map} +1 -1
  54. package/dist/{SubscriptionsScreen-COBaRHDG.cjs → SubscriptionsScreen-J4R7V7na.cjs} +8 -8
  55. package/dist/{SubscriptionsScreen-G64lYG5v.mjs → SubscriptionsScreen-qD8Mnh2A.mjs} +9 -9
  56. package/dist/{build-widget-registry-7slNHtKU.cjs → build-widget-registry-DMiPjMfG.cjs} +31 -7
  57. package/dist/build-widget-registry-DMiPjMfG.cjs.map +1 -0
  58. package/dist/{build-widget-registry-BZjLacQ8.mjs → build-widget-registry-Dveiky2q.mjs} +28 -10
  59. package/dist/build-widget-registry-Dveiky2q.mjs.map +1 -0
  60. package/dist/index.cjs +260 -26
  61. package/dist/index.cjs.map +1 -1
  62. package/dist/index.d.cts.map +1 -1
  63. package/dist/index.d.mts.map +1 -1
  64. package/dist/index.mjs +260 -26
  65. package/dist/index.mjs.map +1 -1
  66. package/dist/{use-portal-card-add-3ds-flow-tvSUKAvl.mjs → use-portal-card-add-3ds-flow--PAh5qUt.mjs} +2 -2
  67. package/dist/{use-portal-card-add-3ds-flow-tvSUKAvl.mjs.map → use-portal-card-add-3ds-flow--PAh5qUt.mjs.map} +1 -1
  68. package/dist/{use-portal-card-add-3ds-flow-C_Frj80d.cjs → use-portal-card-add-3ds-flow-DzFfku22.cjs} +2 -2
  69. package/dist/{use-portal-card-add-3ds-flow-C_Frj80d.cjs.map → use-portal-card-add-3ds-flow-DzFfku22.cjs.map} +1 -1
  70. package/dist/utils/build-remote-widget-plugin-manifests.cjs +5 -5
  71. package/dist/utils/build-remote-widget-plugin-manifests.mjs +6 -6
  72. package/package.json +9 -9
  73. package/dist/ScreenRenderer-BQz-1cCn.mjs.map +0 -1
  74. package/dist/ScreenRenderer-EGk5-w0h.cjs.map +0 -1
  75. package/dist/build-widget-registry-7slNHtKU.cjs.map +0 -1
  76. package/dist/build-widget-registry-BZjLacQ8.mjs.map +0 -1
@@ -1 +0,0 @@
1
- {"version":3,"file":"build-widget-registry-7slNHtKU.cjs","names":["#providerCalled","#provider","Color","Color","Color","isRecord","useAccount","useStore","#customHeight","#render","#previewMode","#root","SpacerWidget","#searchValue","#render","#placeholder","#sortOptions","#sortValue","#root","HostSearchSort","useOptionalAppNavigation"],"sources":["../../../../node_modules/.pnpm/@tanstack+query-core@5.101.0/node_modules/@tanstack/query-core/build/modern/timeoutManager.js","../../../../node_modules/.pnpm/@tanstack+query-core@5.101.0/node_modules/@tanstack/query-core/build/modern/utils.js","../../../../node_modules/.pnpm/@tanstack+query-core@5.101.0/node_modules/@tanstack/query-core/build/modern/notifyManager.js","../../../../node_modules/.pnpm/@tanstack+query-persist-client-core@5.91.11/node_modules/@tanstack/query-persist-client-core/build/modern/createPersister.js","../../../platform/query-persister/src/persister.ts","../../core/src/app-definition-api-context.ts","../../../platform/theme-engine/src/types.ts","../../../platform/theme-engine/src/color-engine.ts","../../../platform/ui-primitives/src/tokens/manifest.ts","../../../platform/theme-engine/src/tailwind-overrides.ts","../../../platform/theme-engine/src/css-generator.ts","../../../platform/theme-engine/src/defaults.ts","../../../platform/theme-engine/src/serialisation.ts","../../../platform/theme-engine/src/transforms.ts","../../../platform/theme-engine/src/theme-applicator.ts","../../core/src/widget-utils/utils.ts","../../widgets/src/widgets/index.ts","../src/core/default-widget-registry.ts","../../core/src/remote-dom-widget-package.ts","../src/hooks/query-keys.ts","../src/transforms/screen-transforms.ts","../src/transforms/navigation-transforms.ts","../src/transforms/index.ts","../src/hooks/use-fluid-app.ts","../src/widgets/remote-dom-built-in-capability-host.ts","../src/widgets/screen-area-fullscreen-host.ts","../src/shell/ScreenAreaFullscreenContext.tsx","../../widgets/src/remote-dom-elements.tsx","../src/widgets/remote-dom-elements.tsx","../src/utils/build-widget-registry.ts"],"sourcesContent":["// src/timeoutManager.ts\nvar defaultTimeoutProvider = {\n // We need the wrapper function syntax below instead of direct references to\n // global setTimeout etc.\n //\n // BAD: `setTimeout: setTimeout`\n // GOOD: `setTimeout: (cb, delay) => setTimeout(cb, delay)`\n //\n // If we use direct references here, then anything that wants to spy on or\n // replace the global setTimeout (like tests) won't work since we'll already\n // have a hard reference to the original implementation at the time when this\n // file was imported.\n setTimeout: (callback, delay) => setTimeout(callback, delay),\n clearTimeout: (timeoutId) => clearTimeout(timeoutId),\n setInterval: (callback, delay) => setInterval(callback, delay),\n clearInterval: (intervalId) => clearInterval(intervalId)\n};\nvar TimeoutManager = class {\n // We cannot have TimeoutManager<T> as we must instantiate it with a concrete\n // type at app boot; and if we leave that type, then any new timer provider\n // would need to support the default provider's concrete timer ID, which is\n // infeasible across environments.\n //\n // We settle for type safety for the TimeoutProvider type, and accept that\n // this class is unsafe internally to allow for extension.\n #provider = defaultTimeoutProvider;\n #providerCalled = false;\n setTimeoutProvider(provider) {\n if (process.env.NODE_ENV !== \"production\") {\n if (this.#providerCalled && provider !== this.#provider) {\n console.error(\n `[timeoutManager]: Switching provider after calls to previous provider might result in unexpected behavior.`,\n { previous: this.#provider, provider }\n );\n }\n }\n this.#provider = provider;\n if (process.env.NODE_ENV !== \"production\") {\n this.#providerCalled = false;\n }\n }\n setTimeout(callback, delay) {\n if (process.env.NODE_ENV !== \"production\") {\n this.#providerCalled = true;\n }\n return this.#provider.setTimeout(callback, delay);\n }\n clearTimeout(timeoutId) {\n this.#provider.clearTimeout(timeoutId);\n }\n setInterval(callback, delay) {\n if (process.env.NODE_ENV !== \"production\") {\n this.#providerCalled = true;\n }\n return this.#provider.setInterval(callback, delay);\n }\n clearInterval(intervalId) {\n this.#provider.clearInterval(intervalId);\n }\n};\nvar timeoutManager = new TimeoutManager();\nfunction systemSetTimeoutZero(callback) {\n setTimeout(callback, 0);\n}\nexport {\n TimeoutManager,\n defaultTimeoutProvider,\n systemSetTimeoutZero,\n timeoutManager\n};\n//# sourceMappingURL=timeoutManager.js.map","// src/utils.ts\nimport { timeoutManager } from \"./timeoutManager.js\";\nvar isServer = typeof window === \"undefined\" || \"Deno\" in globalThis;\nfunction noop() {\n}\nfunction functionalUpdate(updater, input) {\n return typeof updater === \"function\" ? updater(input) : updater;\n}\nfunction isValidTimeout(value) {\n return typeof value === \"number\" && value >= 0 && value !== Infinity;\n}\nfunction timeUntilStale(updatedAt, staleTime) {\n return Math.max(updatedAt + (staleTime || 0) - Date.now(), 0);\n}\nfunction resolveStaleTime(staleTime, query) {\n return typeof staleTime === \"function\" ? staleTime(query) : staleTime;\n}\nfunction resolveQueryBoolean(option, query) {\n return typeof option === \"function\" ? option(query) : option;\n}\nfunction matchQuery(filters, query) {\n const {\n type = \"all\",\n exact,\n fetchStatus,\n predicate,\n queryKey,\n stale\n } = filters;\n if (queryKey) {\n if (exact) {\n if (query.queryHash !== hashQueryKeyByOptions(queryKey, query.options)) {\n return false;\n }\n } else if (!partialMatchKey(query.queryKey, queryKey)) {\n return false;\n }\n }\n if (type !== \"all\") {\n const isActive = query.isActive();\n if (type === \"active\" && !isActive) {\n return false;\n }\n if (type === \"inactive\" && isActive) {\n return false;\n }\n }\n if (typeof stale === \"boolean\" && query.isStale() !== stale) {\n return false;\n }\n if (fetchStatus && fetchStatus !== query.state.fetchStatus) {\n return false;\n }\n if (predicate && !predicate(query)) {\n return false;\n }\n return true;\n}\nfunction matchMutation(filters, mutation) {\n const { exact, status, predicate, mutationKey } = filters;\n if (mutationKey) {\n if (!mutation.options.mutationKey) {\n return false;\n }\n if (exact) {\n if (hashKey(mutation.options.mutationKey) !== hashKey(mutationKey)) {\n return false;\n }\n } else if (!partialMatchKey(mutation.options.mutationKey, mutationKey)) {\n return false;\n }\n }\n if (status && mutation.state.status !== status) {\n return false;\n }\n if (predicate && !predicate(mutation)) {\n return false;\n }\n return true;\n}\nfunction hashQueryKeyByOptions(queryKey, options) {\n const hashFn = options?.queryKeyHashFn || hashKey;\n return hashFn(queryKey);\n}\nfunction hashKey(queryKey) {\n return JSON.stringify(\n queryKey,\n (_, val) => isPlainObject(val) ? Object.keys(val).sort().reduce((result, key) => {\n result[key] = val[key];\n return result;\n }, {}) : val\n );\n}\nfunction partialMatchKey(a, b) {\n if (a === b) {\n return true;\n }\n if (typeof a !== typeof b) {\n return false;\n }\n if (a && b && typeof a === \"object\" && typeof b === \"object\") {\n return Object.keys(b).every((key) => partialMatchKey(a[key], b[key]));\n }\n return false;\n}\nvar hasOwn = Object.prototype.hasOwnProperty;\nfunction replaceEqualDeep(a, b, depth = 0) {\n if (a === b) {\n return a;\n }\n if (depth > 500) return b;\n const array = isPlainArray(a) && isPlainArray(b);\n if (!array && !(isPlainObject(a) && isPlainObject(b))) return b;\n const aItems = array ? a : Object.keys(a);\n const aSize = aItems.length;\n const bItems = array ? b : Object.keys(b);\n const bSize = bItems.length;\n const copy = array ? new Array(bSize) : {};\n let equalItems = 0;\n for (let i = 0; i < bSize; i++) {\n const key = array ? i : bItems[i];\n const aItem = a[key];\n const bItem = b[key];\n if (aItem === bItem) {\n copy[key] = aItem;\n if (array ? i < aSize : hasOwn.call(a, key)) equalItems++;\n continue;\n }\n if (aItem === null || bItem === null || typeof aItem !== \"object\" || typeof bItem !== \"object\") {\n copy[key] = bItem;\n continue;\n }\n const v = replaceEqualDeep(aItem, bItem, depth + 1);\n copy[key] = v;\n if (v === aItem) equalItems++;\n }\n return aSize === bSize && equalItems === aSize ? a : copy;\n}\nfunction shallowEqualObjects(a, b) {\n if (!b || Object.keys(a).length !== Object.keys(b).length) {\n return false;\n }\n for (const key in a) {\n if (a[key] !== b[key]) {\n return false;\n }\n }\n return true;\n}\nfunction isPlainArray(value) {\n return Array.isArray(value) && value.length === Object.keys(value).length;\n}\nfunction isPlainObject(o) {\n if (!hasObjectPrototype(o)) {\n return false;\n }\n const ctor = o.constructor;\n if (ctor === void 0) {\n return true;\n }\n const prot = ctor.prototype;\n if (!hasObjectPrototype(prot)) {\n return false;\n }\n if (!prot.hasOwnProperty(\"isPrototypeOf\")) {\n return false;\n }\n if (Object.getPrototypeOf(o) !== Object.prototype) {\n return false;\n }\n return true;\n}\nfunction hasObjectPrototype(o) {\n return Object.prototype.toString.call(o) === \"[object Object]\";\n}\nfunction sleep(timeout) {\n return new Promise((resolve) => {\n timeoutManager.setTimeout(resolve, timeout);\n });\n}\nfunction replaceData(prevData, data, options) {\n if (typeof options.structuralSharing === \"function\") {\n return options.structuralSharing(prevData, data);\n } else if (options.structuralSharing !== false) {\n if (process.env.NODE_ENV !== \"production\") {\n try {\n return replaceEqualDeep(prevData, data);\n } catch (error) {\n console.error(\n `Structural sharing requires data to be JSON serializable. To fix this, turn off structuralSharing or return JSON-serializable data from your queryFn. [${options.queryHash}]: ${error}`\n );\n throw error;\n }\n }\n return replaceEqualDeep(prevData, data);\n }\n return data;\n}\nfunction keepPreviousData(previousData) {\n return previousData;\n}\nfunction addToEnd(items, item, max = 0) {\n const newItems = [...items, item];\n return max && newItems.length > max ? newItems.slice(1) : newItems;\n}\nfunction addToStart(items, item, max = 0) {\n const newItems = [item, ...items];\n return max && newItems.length > max ? newItems.slice(0, -1) : newItems;\n}\nvar skipToken = /* @__PURE__ */ Symbol();\nfunction ensureQueryFn(options, fetchOptions) {\n if (process.env.NODE_ENV !== \"production\") {\n if (options.queryFn === skipToken) {\n console.error(\n `Attempted to invoke queryFn when set to skipToken. This is likely a configuration error. Query hash: '${options.queryHash}'`\n );\n }\n }\n if (!options.queryFn && fetchOptions?.initialPromise) {\n return () => fetchOptions.initialPromise;\n }\n if (!options.queryFn || options.queryFn === skipToken) {\n return () => Promise.reject(new Error(`Missing queryFn: '${options.queryHash}'`));\n }\n return options.queryFn;\n}\nfunction shouldThrowError(throwOnError, params) {\n if (typeof throwOnError === \"function\") {\n return throwOnError(...params);\n }\n return !!throwOnError;\n}\nfunction addConsumeAwareSignal(object, getSignal, onCancelled) {\n let consumed = false;\n let signal;\n Object.defineProperty(object, \"signal\", {\n enumerable: true,\n get: () => {\n signal ??= getSignal();\n if (consumed) {\n return signal;\n }\n consumed = true;\n if (signal.aborted) {\n onCancelled();\n } else {\n signal.addEventListener(\"abort\", onCancelled, { once: true });\n }\n return signal;\n }\n });\n return object;\n}\nexport {\n addConsumeAwareSignal,\n addToEnd,\n addToStart,\n ensureQueryFn,\n functionalUpdate,\n hashKey,\n hashQueryKeyByOptions,\n isPlainArray,\n isPlainObject,\n isServer,\n isValidTimeout,\n keepPreviousData,\n matchMutation,\n matchQuery,\n noop,\n partialMatchKey,\n replaceData,\n replaceEqualDeep,\n resolveQueryBoolean,\n resolveStaleTime,\n shallowEqualObjects,\n shouldThrowError,\n skipToken,\n sleep,\n timeUntilStale\n};\n//# sourceMappingURL=utils.js.map","// src/notifyManager.ts\nimport { systemSetTimeoutZero } from \"./timeoutManager.js\";\nvar defaultScheduler = systemSetTimeoutZero;\nfunction createNotifyManager() {\n let queue = [];\n let transactions = 0;\n let notifyFn = (callback) => {\n callback();\n };\n let batchNotifyFn = (callback) => {\n callback();\n };\n let scheduleFn = defaultScheduler;\n const schedule = (callback) => {\n if (transactions) {\n queue.push(callback);\n } else {\n scheduleFn(() => {\n notifyFn(callback);\n });\n }\n };\n const flush = () => {\n const originalQueue = queue;\n queue = [];\n if (originalQueue.length) {\n scheduleFn(() => {\n batchNotifyFn(() => {\n originalQueue.forEach((callback) => {\n notifyFn(callback);\n });\n });\n });\n }\n };\n return {\n batch: (callback) => {\n let result;\n transactions++;\n try {\n result = callback();\n } finally {\n transactions--;\n if (!transactions) {\n flush();\n }\n }\n return result;\n },\n /**\n * All calls to the wrapped function will be batched.\n */\n batchCalls: (callback) => {\n return (...args) => {\n schedule(() => {\n callback(...args);\n });\n };\n },\n schedule,\n /**\n * Use this method to set a custom notify function.\n * This can be used to for example wrap notifications with `React.act` while running tests.\n */\n setNotifyFunction: (fn) => {\n notifyFn = fn;\n },\n /**\n * Use this method to set a custom function to batch notifications together into a single tick.\n * By default React Query will use the batch function provided by ReactDOM or React Native.\n */\n setBatchNotifyFunction: (fn) => {\n batchNotifyFn = fn;\n },\n setScheduler: (fn) => {\n scheduleFn = fn;\n }\n };\n}\nvar notifyManager = createNotifyManager();\nexport {\n createNotifyManager,\n defaultScheduler,\n notifyManager\n};\n//# sourceMappingURL=notifyManager.js.map","// src/createPersister.ts\nimport {\n hashKey,\n matchQuery,\n notifyManager,\n partialMatchKey\n} from \"@tanstack/query-core\";\nvar PERSISTER_KEY_PREFIX = \"tanstack-query\";\nfunction experimental_createQueryPersister({\n storage,\n buster = \"\",\n maxAge = 1e3 * 60 * 60 * 24,\n serialize = JSON.stringify,\n deserialize = JSON.parse,\n prefix = PERSISTER_KEY_PREFIX,\n refetchOnRestore = true,\n filters\n}) {\n function isExpiredOrBusted(persistedQuery) {\n if (persistedQuery.state.dataUpdatedAt) {\n const queryAge = Date.now() - persistedQuery.state.dataUpdatedAt;\n const expired = queryAge > maxAge;\n const busted = persistedQuery.buster !== buster;\n if (expired || busted) {\n return true;\n }\n return false;\n }\n return true;\n }\n async function retrieveQuery(queryHash, afterRestoreMacroTask) {\n if (storage != null) {\n const storageKey = `${prefix}-${queryHash}`;\n try {\n const storedData = await storage.getItem(storageKey);\n if (storedData) {\n const persistedQuery = await deserialize(storedData);\n if (isExpiredOrBusted(persistedQuery)) {\n await storage.removeItem(storageKey);\n } else {\n if (afterRestoreMacroTask) {\n notifyManager.schedule(\n () => afterRestoreMacroTask(persistedQuery)\n );\n }\n return persistedQuery.state.data;\n }\n }\n } catch (err) {\n if (process.env.NODE_ENV === \"development\") {\n console.error(err);\n console.warn(\n \"Encountered an error attempting to restore query cache from persisted location.\"\n );\n }\n await storage.removeItem(storageKey);\n }\n }\n return;\n }\n async function persistQueryByKey(queryKey, queryClient) {\n if (storage != null) {\n const query = queryClient.getQueryCache().find({ queryKey });\n if (query) {\n await persistQuery(query);\n } else {\n if (process.env.NODE_ENV === \"development\") {\n console.warn(\n \"Could not find query to be persisted. QueryKey:\",\n JSON.stringify(queryKey)\n );\n }\n }\n }\n }\n async function persistQuery(query) {\n if (storage != null) {\n const storageKey = `${prefix}-${query.queryHash}`;\n storage.setItem(\n storageKey,\n await serialize({\n state: query.state,\n queryKey: query.queryKey,\n queryHash: query.queryHash,\n buster\n })\n );\n }\n }\n async function persisterFn(queryFn, ctx, query) {\n const matchesFilter = filters ? matchQuery(filters, query) : true;\n if (matchesFilter && query.state.data === void 0 && storage != null) {\n const restoredData = await retrieveQuery(\n query.queryHash,\n (persistedQuery) => {\n query.setState({\n dataUpdatedAt: persistedQuery.state.dataUpdatedAt,\n errorUpdatedAt: persistedQuery.state.errorUpdatedAt\n });\n if (refetchOnRestore === \"always\" || refetchOnRestore === true && query.isStale()) {\n query.fetch();\n }\n }\n );\n if (restoredData !== void 0) {\n return Promise.resolve(restoredData);\n }\n }\n const queryFnResult = await queryFn(ctx);\n if (matchesFilter && storage != null) {\n notifyManager.schedule(() => {\n persistQuery(query);\n });\n }\n return Promise.resolve(queryFnResult);\n }\n async function persisterGc() {\n if (storage?.entries) {\n const entries = await storage.entries();\n for (const [key, value] of entries) {\n if (key.startsWith(prefix)) {\n const persistedQuery = await deserialize(value);\n if (isExpiredOrBusted(persistedQuery)) {\n await storage.removeItem(key);\n }\n }\n }\n } else if (process.env.NODE_ENV === \"development\") {\n throw new Error(\n \"Provided storage does not implement `entries` method. Garbage collection is not possible without ability to iterate over storage items.\"\n );\n }\n }\n async function restoreQueries(queryClient, filters2 = {}) {\n const { exact, queryKey } = filters2;\n if (storage?.entries) {\n const entries = await storage.entries();\n for (const [key, value] of entries) {\n if (key.startsWith(prefix)) {\n const persistedQuery = await deserialize(value);\n if (isExpiredOrBusted(persistedQuery)) {\n await storage.removeItem(key);\n continue;\n }\n if (queryKey) {\n if (exact) {\n if (persistedQuery.queryHash !== hashKey(queryKey)) {\n continue;\n }\n } else if (!partialMatchKey(persistedQuery.queryKey, queryKey)) {\n continue;\n }\n }\n queryClient.setQueryData(\n persistedQuery.queryKey,\n persistedQuery.state.data,\n {\n updatedAt: persistedQuery.state.dataUpdatedAt\n }\n );\n }\n }\n } else if (process.env.NODE_ENV === \"development\") {\n throw new Error(\n \"Provided storage does not implement `entries` method. Restoration of all stored entries is not possible without ability to iterate over storage items.\"\n );\n }\n }\n return {\n persisterFn,\n persistQuery,\n persistQueryByKey,\n retrieveQuery,\n persisterGc,\n restoreQueries\n };\n}\nexport {\n PERSISTER_KEY_PREFIX,\n experimental_createQueryPersister\n};\n//# sourceMappingURL=createPersister.js.map","import {\n type AsyncStorage,\n experimental_createQueryPersister,\n type PersistedQuery,\n} from \"@tanstack/react-query-persist-client\";\n\nconst DB_NAME = \"fluid_tanstack_query_cache\";\nconst STORE_NAME = \"fluid_queries\";\nconst VERSION = 1;\n\nlet dbPromise: Promise<IDBDatabase> | null = null;\n\n// Exported for testing - allows resetting internal state between tests\nexport function _resetForTesting(): void {\n dbPromise = null;\n}\n\nexport async function deleteDatabase(reason: string = \"error\"): Promise<void> {\n return new Promise((resolve, reject) => {\n console.warn(`[IDB] Deleting database due to ${reason}`);\n const req = indexedDB.deleteDatabase(DB_NAME);\n req.onsuccess = () => {\n console.log(\"[IDB] Database deleted successfully\");\n dbPromise = null; // ensure next getDb() opens a fresh connection\n resolve();\n };\n req.onerror = () => {\n console.error(\"[IDB] Failed to delete database:\", req.error);\n reject(req.error ?? new Error(\"deleteDatabase failed\"));\n };\n req.onblocked = () => {\n console.warn(\"[IDB] Delete blocked: close all tabs using this database\");\n // Resolve anyway so callers (e.g. clearCompanyCache) don't hang\n // indefinitely. The delete will complete once blocking connections close.\n dbPromise = null; // best-effort: allow fresh open on next access\n resolve();\n };\n });\n}\n\nfunction openDatabase(): Promise<IDBDatabase> {\n return new Promise((resolve, reject) => {\n const req = indexedDB.open(DB_NAME, VERSION);\n\n req.onupgradeneeded = () => {\n const upgradeDb = req.result;\n if (!upgradeDb.objectStoreNames.contains(STORE_NAME)) {\n upgradeDb.createObjectStore(STORE_NAME);\n }\n };\n\n req.onsuccess = () => {\n const conn = req.result;\n conn.onversionchange = () => {\n console.trace(\"[IDB] version change – closing connection\");\n conn.close();\n // clear the cached promise so the next getDb call re-opens a connection\n dbPromise = null;\n };\n resolve(conn);\n };\n\n req.onblocked = () => {\n console.warn(\"[IDB] open blocked: another connection is holding the DB\");\n };\n\n req.onerror = () => {\n reject(\n req.error instanceof Error\n ? req.error\n : new Error(`IndexedDB open failed: ${String(req.error)}`),\n );\n };\n });\n}\n\nasync function getDbWithRecovery(): Promise<IDBDatabase> {\n try {\n return await openDatabase();\n } catch (err) {\n // First open failed - try to delete and recreate\n console.warn(\"[IDB] Initial open failed, attempting recovery:\", err);\n try {\n await deleteDatabase();\n console.log(\"[IDB] Retrying database open after deletion\");\n return await openDatabase();\n } catch (retryErr) {\n console.error(\"[IDB] Recovery failed:\", retryErr);\n throw retryErr;\n }\n }\n}\n\nfunction getDb(): Promise<IDBDatabase> {\n if (dbPromise) return dbPromise;\n\n // Create the promise and cache it immediately to prevent race conditions\n // All concurrent calls will share this same promise\n dbPromise = getDbWithRecovery().catch((err) => {\n // On failure, clear the cache so next call can retry fresh\n dbPromise = null;\n throw err;\n });\n\n return dbPromise;\n}\n\n// Exported for testing - allows direct testing of storage operations\nexport const storage: AsyncStorage<PersistedQuery> = {\n async getItem(key: string) {\n try {\n const db = await getDb();\n return new Promise<PersistedQuery | undefined>((res) => {\n try {\n const r = db\n .transaction(STORE_NAME, \"readonly\")\n .objectStore(STORE_NAME)\n .get(key);\n r.onsuccess = () => res(r.result as PersistedQuery);\n r.onerror = () => {\n console.trace(\"[IDB] getItem error:\", r.error);\n res(undefined);\n };\n } catch (txErr) {\n // Transaction creation failed (e.g., stale connection)\n console.trace(\"[IDB] getItem transaction error:\", txErr);\n res(undefined);\n }\n });\n } catch (err) {\n // getDb() failed - try to recover with a fresh connection\n console.trace(\"[IDB] getItem getDb error:\", err);\n try {\n const db = await getDb();\n // Use fresh connection directly - getDb() already handles recovery\n return new Promise<PersistedQuery | undefined>((res) => {\n try {\n const r = db\n .transaction(STORE_NAME, \"readonly\")\n .objectStore(STORE_NAME)\n .get(key);\n r.onsuccess = () => res(r.result as PersistedQuery);\n r.onerror = () => {\n console.trace(\"[IDB] getItem retry error:\", r.error);\n res(undefined);\n };\n } catch (txErr) {\n console.trace(\"[IDB] getItem retry transaction error:\", txErr);\n res(undefined);\n }\n });\n } catch (recoveryErr) {\n console.trace(\"[IDB] getItem recovery failed:\", recoveryErr);\n }\n return undefined;\n }\n },\n\n async setItem(key: string, value: PersistedQuery) {\n // JSON round-trip strips non-cloneable properties (functions, class instances)\n // before IndexedDB's structured clone algorithm runs. Without this, IDB\n // throws DataCloneError. Theme Color objects are now kept out of the cache\n // via the select pattern, but other queries may still have non-cloneable data.\n const cloneableValue = JSON.parse(JSON.stringify(value));\n try {\n const db = await getDb();\n if (!db) return;\n await new Promise<void>((resolve) => {\n try {\n const req = db\n .transaction(STORE_NAME, \"readwrite\")\n .objectStore(STORE_NAME)\n .put(cloneableValue, key);\n req.onsuccess = () => resolve();\n req.onerror = () => {\n console.trace(\"[IDB] setItem error:\", req.error);\n resolve();\n };\n } catch (txErr) {\n console.trace(\"[IDB] setItem transaction error:\", txErr);\n resolve();\n }\n });\n } catch (err) {\n // getDb() failed - try to recover with a fresh connection\n console.trace(\"[IDB] setItem getDb error:\", err);\n try {\n const db = await getDb();\n // Use fresh connection directly - getDb() already handles recovery\n await new Promise<void>((resolve) => {\n try {\n const req = db\n .transaction(STORE_NAME, \"readwrite\")\n .objectStore(STORE_NAME)\n .put(cloneableValue, key);\n req.onsuccess = () => resolve();\n req.onerror = () => {\n console.trace(\"[IDB] setItem retry error:\", req.error);\n resolve();\n };\n } catch (txErr) {\n console.trace(\"[IDB] setItem retry transaction error:\", txErr);\n resolve();\n }\n });\n } catch (recoveryErr) {\n console.trace(\"[IDB] setItem recovery failed:\", recoveryErr);\n }\n }\n },\n\n async removeItem(key: string) {\n try {\n const db = await getDb();\n if (!db) return;\n await new Promise<void>((resolve) => {\n try {\n const req = db\n .transaction(STORE_NAME, \"readwrite\")\n .objectStore(STORE_NAME)\n .delete(key);\n req.onsuccess = () => resolve();\n req.onerror = () => {\n console.trace(\"[IDB] removeItem error:\", req.error);\n resolve();\n };\n } catch (txErr) {\n console.trace(\"[IDB] removeItem transaction error:\", txErr);\n resolve();\n }\n });\n } catch (err) {\n // getDb() failed - try to recover with a fresh connection\n console.trace(\"[IDB] removeItem getDb error:\", err);\n try {\n const db = await getDb();\n // Use fresh connection directly - getDb() already handles recovery\n await new Promise<void>((resolve) => {\n try {\n const req = db\n .transaction(STORE_NAME, \"readwrite\")\n .objectStore(STORE_NAME)\n .delete(key);\n req.onsuccess = () => resolve();\n req.onerror = () => {\n console.trace(\"[IDB] removeItem retry error:\", req.error);\n resolve();\n };\n } catch (txErr) {\n console.trace(\"[IDB] removeItem retry transaction error:\", txErr);\n resolve();\n }\n });\n } catch (recoveryErr) {\n console.trace(\"[IDB] removeItem recovery failed:\", recoveryErr);\n }\n }\n },\n};\n\n// Factory function to create persister - only call this client-side\nexport function createPersister(): ReturnType<\n typeof experimental_createQueryPersister\n> {\n return experimental_createQueryPersister<PersistedQuery>({\n storage,\n serialize: (persistedQuery) => persistedQuery,\n deserialize: (cached) => cached,\n });\n}\n","import { createContext, type Provider, use } from \"react\";\nimport type { AppDefinitionApi } from \"./app-definition-api\";\n\nconst AppDefinitionApiContext = createContext<AppDefinitionApi | null>(null);\n\nexport const AppDefinitionApiProvider: Provider<AppDefinitionApi | null> =\n AppDefinitionApiContext.Provider;\n\nexport function useAppDefinitionApi(): AppDefinitionApi {\n const api = use(AppDefinitionApiContext);\n if (!api) {\n throw new Error(\n \"useAppDefinitionApi must be used within an AppDefinitionApiProvider\",\n );\n }\n return api;\n}\n","import type Color from \"colorjs.io\";\n\n// Semantic color names - matches portal-widgets tailwind.config.ts and field-types.ts\nexport const SEMANTIC_COLOR_NAMES = [\n \"background\",\n \"foreground\",\n \"primary\",\n \"secondary\",\n \"accent\",\n \"muted\",\n \"destructive\",\n] as const;\nexport type SemanticColorName = (typeof SEMANTIC_COLOR_NAMES)[number];\n\nexport const FONT_SIZE_KEYS = [\n \"extraSmall\",\n \"small\",\n \"regular\",\n \"large\",\n \"extraLarge\",\n \"giant\",\n] as const;\nexport type FontSizeKey = (typeof FONT_SIZE_KEYS)[number];\n\nexport const FONT_FAMILY_KEYS = [\"header\", \"body\"] as const;\nexport type FontFamilyKey = (typeof FONT_FAMILY_KEYS)[number];\n\nexport const RADIUS_KEYS = [\"small\", \"medium\", \"large\", \"extraLarge\"] as const;\nexport type RadiusKey = (typeof RADIUS_KEYS)[number];\n\n/** Author-time color input (what the user configures) */\nexport interface ThemeColorInput {\n base: Color;\n foreground: Color;\n}\n\n/** Complete theme definition — stored in-memory with Color objects */\nexport interface ThemeDefinition {\n id: string;\n name: string;\n /** Light mode — always fully specified */\n light: Record<SemanticColorName, ThemeColorInput>;\n /**\n * Dark mode — only user-overridden colors.\n * Missing keys are auto-derived from `light` at resolve time.\n */\n dark: Partial<Record<SemanticColorName, Partial<ThemeColorInput>>>;\n fontSizes: Record<FontSizeKey, string>;\n fontFamilies: Record<FontFamilyKey, string>;\n spacing: string;\n radii: Record<RadiusKey, string>;\n /** When true, theme colors are re-derived from brand guidelines on every load */\n syncWithBrandColors?: boolean;\n}\n\n/** Resolved semantic color */\nexport interface ResolvedSemanticColor {\n base: Color;\n foreground: Color;\n}\n\n/** Complete resolved color set for one mode */\nexport type ResolvedColorSet = Record<SemanticColorName, ResolvedSemanticColor>;\n\n/** Fully resolved theme — all colors materialised for both modes */\nexport interface ResolvedTheme {\n id: string;\n name: string;\n light: ResolvedColorSet;\n dark: ResolvedColorSet;\n fontSizes: ThemeDefinition[\"fontSizes\"];\n fontFamilies: ThemeDefinition[\"fontFamilies\"];\n spacing: string;\n radii: ThemeDefinition[\"radii\"];\n}\n\n/** Plain OKLCH triplet for JSON serialisation (no Color dependency) */\nexport interface OklchPlain {\n l: number;\n c: number;\n h: number;\n}\n\n/** Serialised color pair as stored in the backend payload */\nexport interface ThemeColorPlain {\n base: OklchPlain;\n foreground: OklchPlain;\n}\n\n/** Backend payload — plain JSON, no Color objects */\nexport interface ThemePayload {\n [key: string]: unknown;\n id: string;\n name: string;\n light: Record<SemanticColorName, ThemeColorPlain>;\n dark: Partial<\n Record<SemanticColorName, { base?: OklchPlain; foreground?: OklchPlain }>\n >;\n fontSizes: Record<FontSizeKey, string>;\n fontFamilies: Record<FontFamilyKey, string>;\n spacing: string;\n radii: Record<RadiusKey, string>;\n syncWithBrandColors?: boolean;\n}\n","import Color from \"colorjs.io\";\nimport {\n SEMANTIC_COLOR_NAMES,\n type SemanticColorName,\n type ThemeColorInput,\n type ThemeDefinition,\n type ResolvedColorSet,\n type ResolvedTheme,\n} from \"./types\";\n\nconst BARE_HEX_RE = /^[0-9a-fA-F]{6}$/;\n\n/**\n * Attempt to convert any string into a Color using colorjs.io.\n * If the string is exactly 6 hex digits it is assumed to be a bare hex value\n * (e.g. \"3b82f6\") and a \"#\" prefix is added before parsing. Six-letter\n * named colours like \"orange\" or \"maroon\" are left untouched.\n *\n * @returns the parsed Color, or a neutral gray (`oklch(0.5 0 0)`) on failure\n */\nexport function parseColor(value: string): Color {\n if (BARE_HEX_RE.test(value)) {\n value = `#${value}`;\n }\n try {\n return new Color(value);\n } catch (error) {\n console.warn(\"[theme] Failed to parse color:\", value, error);\n return new Color(\"oklch\", [0.5, 0, 0]);\n }\n}\n\n/**\n * Returns either the original foreground or a corrected lightness variant,\n * whichever provides better contrast against `color`.\n * Inversion triggers when the |APCA contrast| is below 50 — APCA is signed\n * (negative for dark-on-light, positive for light-on-dark), so comparing the\n * absolute value avoids flipping dark text that already contrasts well on a\n * medium background.\n */\nexport function getForegroundColor(foreground: Color, color: Color): Color {\n if (foreground.oklch.l == null || color.oklch.l == null) {\n return foreground;\n }\n const contrast = color.contrastAPCA(foreground);\n\n if (Math.abs(contrast) < 50) {\n return new Color(\"oklch\", [\n color.oklch.l < 0.7 ? 0.95 : 0.15,\n foreground.oklch.c || 0,\n foreground.oklch.h || 0,\n ]);\n }\n return foreground;\n}\n\n/**\n * Convenience helper: given a background color string, return a CSS color\n * string for text overlaid on it. Uses APCA contrast to pick between\n * near-black and near-white. Returns `null` when the background cannot be\n * parsed (e.g. a CSS custom property reference like `var(--color-muted)` or\n * a malformed value), so callers can fall back to their theme foreground.\n */\nexport function getContrastingTextColor(background: string): string | null {\n const normalised = BARE_HEX_RE.test(background)\n ? `#${background}`\n : background;\n let bg: Color;\n try {\n bg = new Color(normalised);\n } catch {\n return null;\n }\n const initialFg = new Color(\"oklch\", [0.15, 0, 0]);\n return getForegroundColor(initialFg, bg).toString({ format: \"oklch\" });\n}\n\n// ── Dark Mode Derivation ────────────────────────────────────────────\n//\n// Dark-mode colors are derived from their light counterparts by adjusting\n// OKLCH lightness and optionally scaling chroma. Neutral slots (background,\n// foreground, muted) use fixed lightness values while chromatic slots\n// (primary, secondary, accent, destructive) invert lightness around 0.5.\n\nconst DARK_DERIVATION_CONFIG: Record<\n SemanticColorName,\n {\n baseLightness: number | \"invert\";\n fgLightness: number | \"invert\";\n chromaScale?: number;\n }\n> = {\n background: { baseLightness: 0.15, fgLightness: 0.93 },\n foreground: { baseLightness: 0.93, fgLightness: 0.15 },\n muted: { baseLightness: 0.22, fgLightness: 0.75 },\n primary: { baseLightness: \"invert\", fgLightness: 0.95, chromaScale: 0.9 },\n secondary: { baseLightness: \"invert\", fgLightness: 0.93, chromaScale: 0.85 },\n accent: { baseLightness: \"invert\", fgLightness: 0.95, chromaScale: 0.9 },\n destructive: {\n baseLightness: \"invert\",\n fgLightness: 0.95,\n chromaScale: 0.95,\n },\n};\n\n/** Invert OKLCH lightness (1 - l), clamped to [0.35, 0.75] to avoid extremes. */\nfunction invertLightness(l: number): number {\n const inverted = 1 - l;\n return Math.max(0.35, Math.min(0.75, inverted));\n}\n\n/**\n * Derive a dark-mode ThemeColorInput from its light-mode counterpart.\n */\nexport function deriveDarkVariant(\n name: SemanticColorName,\n light: ThemeColorInput,\n): ThemeColorInput {\n const config = DARK_DERIVATION_CONFIG[name];\n const chromaScale = config.chromaScale ?? 1;\n\n const baseLightness =\n config.baseLightness === \"invert\"\n ? invertLightness(light.base.oklch.l ?? 0)\n : config.baseLightness;\n\n const fgLightness =\n config.fgLightness === \"invert\"\n ? invertLightness(light.foreground.oklch.l ?? 0)\n : config.fgLightness;\n\n return {\n base: new Color(\"oklch\", [\n baseLightness,\n (light.base.oklch.c || 0) * chromaScale,\n light.base.oklch.h || 0,\n ]),\n foreground: new Color(\"oklch\", [\n fgLightness,\n (light.foreground.oklch.c || 0) * chromaScale,\n light.foreground.oklch.h || 0,\n ]),\n };\n}\n\n// ── Dark Mode Merge ─────────────────────────────────────────────────\n\n/**\n * Merge auto-derived dark colors with any user-specified overrides.\n * For each semantic color, if the user has fully overridden both base and\n * foreground those are used; otherwise the missing channels are derived.\n */\nexport function mergeDarkOverrides(\n def: ThemeDefinition,\n): Record<SemanticColorName, ThemeColorInput> {\n const darkColors = {} as Record<SemanticColorName, ThemeColorInput>;\n\n for (const name of SEMANTIC_COLOR_NAMES) {\n const lightInput = def.light[name];\n const darkOverride = def.dark[name];\n\n if (darkOverride?.base && darkOverride?.foreground) {\n darkColors[name] = darkOverride as ThemeColorInput;\n } else if (darkOverride) {\n const base =\n darkOverride.base ?? deriveDarkVariant(name, lightInput).base;\n darkColors[name] = {\n base: base,\n foreground:\n darkOverride.foreground ??\n getForegroundColor(def.light.foreground.base, base),\n };\n } else {\n darkColors[name] = deriveDarkVariant(name, lightInput);\n }\n }\n\n return darkColors;\n}\n\n// ── Theme Resolution ────────────────────────────────────────────────\n\nfunction resolveColorSet(\n colors: Record<SemanticColorName, ThemeColorInput>,\n): ResolvedColorSet {\n const resolved = {} as ResolvedColorSet;\n\n for (const name of SEMANTIC_COLOR_NAMES) {\n const input = colors[name];\n resolved[name] = {\n base: input.base.clone(),\n foreground: input.foreground.clone(),\n };\n }\n\n return resolved;\n}\n\n/**\n * Resolve a ThemeDefinition into a complete ResolvedTheme.\n * Dark mode colors are derived from light where not overridden.\n */\nexport function resolveTheme(def: ThemeDefinition): ResolvedTheme {\n return {\n id: def.id,\n name: def.name,\n light: resolveColorSet(def.light),\n dark: resolveColorSet(mergeDarkOverrides(def)),\n fontSizes: { ...def.fontSizes },\n fontFamilies: { ...def.fontFamilies },\n spacing: def.spacing,\n radii: { ...def.radii },\n };\n}\n","/**\n * Canonical semantic token manifest.\n *\n * Every `--color-*` and `--radius-*` token defined in `styles/ui-primitives.css`\n * must be listed here. Downstream consumers (notably `@fluid-app/theme-engine`)\n * derive their per-theme override maps from this manifest, so adding a token\n * to `ui-primitives.css` without adding it here will cause that token to silently\n * miss merchant theming.\n */\n\nexport type SemanticTokenName =\n | \"background\"\n | \"foreground\"\n | \"card\"\n | \"card-foreground\"\n | \"popover\"\n | \"popover-foreground\"\n | \"primary\"\n | \"primary-foreground\"\n | \"secondary\"\n | \"secondary-foreground\"\n | \"muted\"\n | \"muted-foreground\"\n | \"accent\"\n | \"accent-foreground\"\n | \"destructive\"\n | \"destructive-foreground\"\n | \"border\"\n | \"input\"\n | \"ring\"\n | \"chart-1\"\n | \"chart-2\"\n | \"chart-3\"\n | \"chart-4\"\n | \"chart-5\"\n | \"sidebar\"\n | \"sidebar-foreground\"\n | \"sidebar-primary\"\n | \"sidebar-primary-foreground\"\n | \"sidebar-accent\"\n | \"sidebar-accent-foreground\"\n | \"sidebar-border\"\n | \"sidebar-ring\"\n | \"contrast\";\n\nexport type SemanticRadiusName = \"\" | \"sm\" | \"md\" | \"lg\" | \"xl\";\n\nexport interface SemanticTokenManifest {\n colors: readonly SemanticTokenName[];\n radii: readonly SemanticRadiusName[];\n /** Subset that theme-engine merchant config exposes for direct customization. */\n merchantCustomizable: readonly SemanticTokenName[];\n}\n\nexport const TOKEN_MANIFEST: SemanticTokenManifest = {\n colors: [\n \"background\",\n \"foreground\",\n \"card\",\n \"card-foreground\",\n \"popover\",\n \"popover-foreground\",\n \"primary\",\n \"primary-foreground\",\n \"secondary\",\n \"secondary-foreground\",\n \"muted\",\n \"muted-foreground\",\n \"accent\",\n \"accent-foreground\",\n \"destructive\",\n \"destructive-foreground\",\n \"border\",\n \"input\",\n \"ring\",\n \"chart-1\",\n \"chart-2\",\n \"chart-3\",\n \"chart-4\",\n \"chart-5\",\n \"sidebar\",\n \"sidebar-foreground\",\n \"sidebar-primary\",\n \"sidebar-primary-foreground\",\n \"sidebar-accent\",\n \"sidebar-accent-foreground\",\n \"sidebar-border\",\n \"sidebar-ring\",\n \"contrast\",\n ],\n radii: [\"\", \"sm\", \"md\", \"lg\", \"xl\"],\n merchantCustomizable: [\n \"background\",\n \"foreground\",\n \"primary\",\n \"secondary\",\n \"accent\",\n \"muted\",\n \"destructive\",\n ],\n};\n","import type { SemanticColorName } from \"./types\";\n\nconst OVERRIDES: Partial<Record<string, string>> = {\n \"--color-gray-50\": \"var(--color-muted)\",\n \"--color-gray-100\":\n \"color-mix(in oklch, var(--color-muted), var(--color-foreground) 15%)\",\n \"--color-gray-200\": \"var(--color-border)\",\n} as const;\n\n/**\n * Map Tailwind built-in color names to semantic theme colors using color-mix\n * for shade interpolation. Each shade maps to a percentage of the semantic\n * color mixed with transparent, so shades naturally adapt to both light and\n * dark modes without inversion logic.\n */\nexport function emitTailwindOverrides(): string[] {\n const TAILWIND_COLOR_MAP: Record<string, SemanticColorName> = {\n gray: \"foreground\",\n red: \"destructive\",\n blue: \"primary\",\n green: \"accent\",\n };\n\n const TAILWIND_SHADES = [\n 50, 100, 200, 300, 400, 500, 600, 700, 800, 900, 950,\n ] as const;\n\n const lines: string[] = [];\n for (const [twName, semantic] of Object.entries(TAILWIND_COLOR_MAP)) {\n for (const shade of TAILWIND_SHADES) {\n const override = OVERRIDES[`--color-${twName}-${shade}`];\n if (override) {\n lines.push(`--color-${twName}-${shade}: ${override};`);\n } else {\n const percent = Math.max(10, Math.min(Math.round(shade / 10), 100));\n lines.push(\n `--color-${twName}-${shade}: color-mix(in oklch, var(--color-${semantic}) ${percent}%, transparent);`,\n );\n }\n }\n }\n\n lines.push(\"--color-white: var(--color-background);\");\n lines.push(\"--color-black: var(--color-foreground);\");\n\n return lines;\n}\n","import {\n TOKEN_MANIFEST,\n type SemanticTokenName,\n} from \"@fluid-app/ui-primitives/tokens/manifest\";\nimport { emitTailwindOverrides } from \"./tailwind-overrides\";\nimport {\n SEMANTIC_COLOR_NAMES,\n FONT_SIZE_KEYS,\n FONT_FAMILY_KEYS,\n RADIUS_KEYS,\n type ResolvedColorSet,\n type ResolvedTheme,\n} from \"./types\";\n\nfunction colorToCSS(color: import(\"colorjs.io\").default): string {\n const result = color.toString({ format: \"oklch\" });\n if (result.includes(\"NaN\")) {\n console.warn(\n \"[theme] colorToCSS produced NaN, using neutral fallback:\",\n result,\n );\n return \"oklch(0.5 0 0)\";\n }\n return result;\n}\n\nfunction camelToKebab(str: string): string {\n return str.replace(/([a-z])([A-Z])/g, \"$1-$2\").toLowerCase();\n}\n\n/**\n * Emit --color-{name} and --color-{name}-foreground vars.\n * Uses --color- prefix to match portal-widgets/tailwind.config.ts.\n */\nfunction emitColorVars(colors: ResolvedColorSet): string[] {\n const lines: string[] = [];\n\n for (const name of SEMANTIC_COLOR_NAMES) {\n const color = colors[name];\n lines.push(`--color-${name}: ${colorToCSS(color.base)};`);\n lines.push(`--color-${name}-foreground: ${colorToCSS(color.foreground)};`);\n }\n\n return lines;\n}\n\n/**\n * Format a font family value for CSS output.\n * - If the value starts with \"var(\" (legacy), pass through as-is\n * - If the value already contains a comma (has fallback), pass through as-is\n * - Otherwise, wrap in quotes and append a generic sans-serif fallback\n */\nfunction formatFontFamily(value: string): string {\n if (value.startsWith(\"var(\")) return value;\n if (value.includes(\",\")) return value;\n return `'${value}', sans-serif`;\n}\n\n/**\n * Emit non-color CSS variables (font sizes, families, spacing, radii).\n */\nfunction emitNonColorVars(theme: ResolvedTheme): string[] {\n const lines: string[] = [];\n for (const key of FONT_SIZE_KEYS) {\n lines.push(`--font-size-${camelToKebab(key)}: ${theme.fontSizes[key]};`);\n }\n for (const key of FONT_FAMILY_KEYS) {\n lines.push(`--font-${key}: ${formatFontFamily(theme.fontFamilies[key])};`);\n }\n lines.push(`--spacing: ${theme.spacing};`);\n for (const key of RADIUS_KEYS) {\n lines.push(`--radius-${camelToKebab(key)}: ${theme.radii[key]};`);\n }\n return lines;\n}\n\nconst MERCHANT_CUSTOMIZABLE = new Set<SemanticTokenName>(\n TOKEN_MANIFEST.merchantCustomizable,\n);\n\n/**\n * Names that theme-engine emits via emitColorVars (the merchant-customizable\n * base set) and their derived `-foreground` siblings. Used to skip duplicate\n * emission of `--color-{name}` from the manifest derivation pass.\n *\n * Typed as `Set<string>` because the synthesized `${name}-foreground` strings\n * include `\"background-foreground\"` / `\"foreground-foreground\"`, which are not\n * members of `SemanticTokenName`. Membership checks against the manifest still\n * work because `Set.has(string)` accepts the wider type.\n */\nconst EMITTED_BY_COLOR_VARS: ReadonlySet<string> = new Set<string>([\n ...SEMANTIC_COLOR_NAMES,\n ...SEMANTIC_COLOR_NAMES.map((n) => `${n}-foreground`),\n]);\n\ntype NonCustomizableToken = Exclude<\n SemanticTokenName,\n | \"background\"\n | \"foreground\"\n | \"primary\"\n | \"primary-foreground\"\n | \"secondary\"\n | \"secondary-foreground\"\n | \"accent\"\n | \"accent-foreground\"\n | \"muted\"\n | \"muted-foreground\"\n | \"destructive\"\n | \"destructive-foreground\"\n>;\n\n/**\n * Resolve the alias expression for a non-merchant-customizable token.\n *\n * Returns `null` for tokens that should fall through to the canonical default\n * defined in `ui-primitives.css` (chart palette is intentionally not merchant-themed).\n *\n * The exhaustive switch is the fail-fast guarantee: TypeScript rejects this\n * file if a non-customizable token in the manifest is missing a case here.\n */\nfunction aliasFor(token: NonCustomizableToken): string | null {\n switch (token) {\n case \"card\":\n return \"var(--color-muted)\";\n case \"card-foreground\":\n return \"var(--color-muted-foreground)\";\n case \"popover\":\n return \"var(--color-background)\";\n case \"popover-foreground\":\n return \"var(--color-foreground)\";\n case \"border\":\n return \"color-mix(in oklch, var(--color-background), var(--color-foreground) 15%)\";\n case \"input\":\n return \"var(--color-border)\";\n case \"ring\":\n return \"var(--color-primary)\";\n case \"chart-1\":\n case \"chart-2\":\n case \"chart-3\":\n case \"chart-4\":\n case \"chart-5\":\n return null;\n case \"sidebar\":\n return \"var(--color-muted)\";\n case \"sidebar-foreground\":\n return \"var(--color-muted-foreground)\";\n case \"sidebar-primary\":\n return \"var(--color-primary)\";\n case \"sidebar-primary-foreground\":\n return \"var(--color-primary-foreground)\";\n case \"sidebar-accent\":\n return \"var(--color-accent)\";\n case \"sidebar-accent-foreground\":\n return \"var(--color-accent-foreground)\";\n case \"sidebar-border\":\n return \"var(--color-border)\";\n case \"sidebar-ring\":\n return \"var(--color-primary)\";\n case \"contrast\":\n return \"var(--color-foreground)\";\n }\n}\n\n/**\n * Build the alias block emitted at the top of every `[data-theme]` rule.\n *\n * For each canonical token in `TOKEN_MANIFEST.colors`:\n * - merchant-customizable tokens: `--color-{name}` is emitted by `emitColorVars`\n * from the resolved theme; this function only emits the short-name alias\n * (`--{name}: var(--color-{name})`) for compatibility with consumers that\n * reference short names.\n * - non-customizable tokens: emit both `--color-{name}: <alias>` and the\n * short-name alias, unless `aliasFor` returns null. Returning null is the\n * intentional pass-through signal: ui-primitives.css already maps `--color-{name}`\n * to `var(--{name})` via `@theme inline`, so emitting `--{name}: var(--color-{name})`\n * inside `[data-theme]` would create a circular var() reference and resolve\n * to an invalid value (chart-1..5 would render transparent under any theme).\n *\n * Two static aliases (`--color-background-foreground`, `--color-foreground-foreground`)\n * are not regular `-foreground` siblings; they are emitted explicitly because\n * they swap the bg/fg pair rather than reading from a paired field.\n */\nfunction buildAliasBlock(): string[] {\n const lines: string[] = [\n \"--color-background-foreground: var(--color-foreground);\",\n \"--color-foreground-foreground: var(--color-background);\",\n ];\n\n for (const token of TOKEN_MANIFEST.colors) {\n if (MERCHANT_CUSTOMIZABLE.has(token)) {\n // --color-{name} comes from emitColorVars; just emit the short-name alias.\n lines.push(`--${token}: var(--color-${token});`);\n continue;\n }\n\n if (EMITTED_BY_COLOR_VARS.has(token)) {\n // `${name}-foreground` sibling of the merchant-customizable set —\n // --color-{name}-foreground is emitted by emitColorVars; only the\n // short-name alias is needed here.\n lines.push(`--${token}: var(--color-${token});`);\n continue;\n }\n\n const alias = aliasFor(token as NonCustomizableToken);\n if (alias === null) {\n // Pass-through: ui-primitives.css canonical :root default applies. Emitting\n // either `--color-${token}` or `--${token}` here would create a\n // circular reference with the `@theme inline` mapping.\n continue;\n }\n\n lines.push(`--color-${token}: ${alias};`);\n lines.push(`--${token}: var(--color-${token});`);\n }\n\n return lines;\n}\n\n/**\n * Static alias variables emitted at the top of every theme rule.\n * Derived from the canonical token manifest so new canonical tokens reach\n * merchant theming automatically.\n */\nconst globalCSSOverride = [\n ...buildAliasBlock(),\n \"--radius-sm: var(--radius-small);\",\n \"--radius-md: var(--radius-medium);\",\n \"--radius-lg: var(--radius-large);\",\n \"--radius-xl: var(--radius-extra-large);\",\n \"--text-xs: var(--font-size-extra-small);\",\n \"--text-sm: var(--font-size-small);\",\n \"--text-base: var(--font-size-regular);\",\n \"--text-lg: var(--font-size-large);\",\n \"--text-xl: var(--font-size-extra-large);\",\n \"--text-2xl: var(--font-size-giant);\",\n];\n\n/**\n * Overrides for global tailwindcss for specifically dark mode.\n */\nconst globalDarkCSSOverride = [\n \"--border: color-mix(in oklch, var(--color-background), var(--color-foreground) 15%);\",\n];\n\nexport interface GenerateThemeCSSOptions {\n /** Whether or not to allow prefers-color-scheme to choose the theme mode */\n disableAutoTheme?: boolean;\n /** Whether to emit Tailwind built-in color overrides (default true) */\n mapTailwindColors?: boolean;\n}\n\n/**\n * Generate a complete CSS string for a resolved theme.\n * Outputs 2–3 blocks: light default, dark explicit via `[data-theme-mode=\"dark\"]`,\n * and (unless `disableAutoTheme`) a `prefers-color-scheme: dark` media query block.\n */\nexport function generateThemeCSS(\n theme: ResolvedTheme,\n options: GenerateThemeCSSOptions = {},\n): string {\n const sel = `[data-theme=\"${theme.id}\"]`;\n const tw = options.mapTailwindColors ?? true;\n const blocks: string[] = [];\n\n // Light mode (default)\n blocks.push(`${sel} {`);\n blocks.push(...globalCSSOverride);\n blocks.push(...emitNonColorVars(theme));\n blocks.push(...emitColorVars(theme.light));\n if (tw) blocks.push(...emitTailwindOverrides());\n blocks.push(`}`);\n\n // Dark mode: explicit via attribute\n blocks.push(`${sel}[data-theme-mode=\"dark\"] {`);\n blocks.push(...globalDarkCSSOverride);\n blocks.push(...emitColorVars(theme.dark));\n if (tw) blocks.push(...emitTailwindOverrides());\n blocks.push(`}`);\n\n // Dark mode: auto via system preference\n if (!options.disableAutoTheme) {\n blocks.push(`@media (prefers-color-scheme: dark) {`);\n blocks.push(`${sel}:not([data-theme-mode]) {`);\n blocks.push(...globalDarkCSSOverride);\n blocks.push(...emitColorVars(theme.dark).map((l) => `${l}`));\n if (tw) blocks.push(...emitTailwindOverrides().map((l) => `${l}`));\n blocks.push(`}`);\n blocks.push(`}`);\n }\n\n return blocks.join(\"\\n\");\n}\n","import Color from \"colorjs.io\";\nimport type {\n FontSizeKey,\n FontFamilyKey,\n RadiusKey,\n ThemeDefinition,\n} from \"./types\";\nimport { getForegroundColor } from \"./color-engine\";\n\n// ── Non-color defaults ──────────────────────────────────────────────\n\nexport const DEFAULT_FONT_SIZES: Record<FontSizeKey, string> = {\n extraSmall: \"0.75rem\",\n small: \"0.875rem\",\n regular: \"1rem\",\n large: \"1.125rem\",\n extraLarge: \"1.25rem\",\n giant: \"1.5rem\",\n};\n\nexport const DEFAULT_FONT_FAMILIES: Record<FontFamilyKey, string> = {\n header: \"Inter\",\n body: \"Inter\",\n};\n\nexport const DEFAULT_SPACING = \"0.25rem\";\n\nexport const DEFAULT_RADII: Record<RadiusKey, string> = {\n small: \"0.25rem\",\n medium: \"0.5rem\",\n large: \"0.75rem\",\n extraLarge: \"1rem\",\n};\n\n// ── Default colors (hex) ────────────────────────────────────────────\n\nexport const DEFAULT_COLORS = {\n background: \"#ffffff\",\n foreground: \"#1a1a1a\",\n primary: \"#3b82f6\",\n secondary: \"#6b7280\",\n accent: \"#10b981\",\n muted: \"#f3f4f6\",\n destructive: \"#ef4444\",\n mutedForeground: \"#6b7280\",\n} as const;\n\n// ── Default theme identity ──────────────────────────────────────────\n\nexport const DEFAULT_THEME_ID = \"default\";\nexport const DEFAULT_THEME_NAME = \"Default Theme\";\n\n// ── Factory ─────────────────────────────────────────────────────────\n\n/**\n * Build a fresh ThemeDefinition populated with all defaults.\n * Returns a new object each call because Color instances are mutable — do not cache the result.\n */\nexport function getDefaultThemeDefinition(): ThemeDefinition {\n const bg = new Color(DEFAULT_COLORS.background);\n const fg = new Color(DEFAULT_COLORS.foreground);\n const primary = new Color(DEFAULT_COLORS.primary);\n const secondary = new Color(DEFAULT_COLORS.secondary);\n const accent = new Color(DEFAULT_COLORS.accent);\n const muted = new Color(DEFAULT_COLORS.muted);\n const destructive = new Color(DEFAULT_COLORS.destructive);\n const mutedFg = new Color(DEFAULT_COLORS.mutedForeground);\n\n const darkBg = new Color(\"#0a0a0a\");\n const darkFg = new Color(\"#fafafa\");\n const darkMuted = new Color(\"#171717\");\n const darkMutedForeground = new Color(\"#dddddd\");\n\n return {\n id: DEFAULT_THEME_ID,\n name: DEFAULT_THEME_NAME,\n light: {\n background: { base: bg, foreground: fg },\n foreground: { base: fg, foreground: bg },\n primary: {\n base: primary,\n foreground: getForegroundColor(fg, primary),\n },\n secondary: {\n base: secondary,\n foreground: getForegroundColor(fg, secondary),\n },\n accent: {\n base: accent,\n foreground: getForegroundColor(fg, accent),\n },\n muted: { base: muted, foreground: mutedFg },\n destructive: {\n base: destructive,\n foreground: getForegroundColor(fg, destructive),\n },\n },\n dark: {\n background: { base: darkBg, foreground: darkFg },\n foreground: { base: darkFg, foreground: darkBg },\n muted: { base: darkMuted, foreground: darkMutedForeground },\n },\n fontSizes: { ...DEFAULT_FONT_SIZES },\n fontFamilies: { ...DEFAULT_FONT_FAMILIES },\n spacing: DEFAULT_SPACING,\n radii: { ...DEFAULT_RADII },\n };\n}\n","import Color from \"colorjs.io\";\nimport {\n SEMANTIC_COLOR_NAMES,\n type SemanticColorName,\n type ThemeColorInput,\n type ThemeDefinition,\n type ThemePayload,\n type OklchPlain,\n type FontSizeKey,\n type FontFamilyKey,\n type RadiusKey,\n} from \"./types\";\nimport {\n DEFAULT_FONT_SIZES,\n DEFAULT_FONT_FAMILIES,\n DEFAULT_SPACING,\n DEFAULT_RADII,\n getDefaultThemeDefinition,\n} from \"./defaults\";\n\nfunction colorToPlain(color: Color): OklchPlain {\n return {\n l: color.oklch.l ?? 0,\n c: color.oklch.c ?? 0,\n h: color.oklch.h ?? 0,\n };\n}\n\nfunction plainToColor(plain: OklchPlain): Color {\n return new Color(\"oklch\", [plain.l, plain.c, plain.h]);\n}\n\n/**\n * Serialise a ThemeDefinition (with Color objects) to a plain JSON payload\n * suitable for backend storage.\n */\nexport function serialiseTheme(def: ThemeDefinition): ThemePayload {\n const light = {} as ThemePayload[\"light\"];\n for (const name of SEMANTIC_COLOR_NAMES) {\n light[name] = {\n base: colorToPlain(def.light[name].base),\n foreground: colorToPlain(def.light[name].foreground),\n };\n }\n\n const dark: ThemePayload[\"dark\"] = {};\n for (const [name, value] of Object.entries(def.dark)) {\n if (!value) continue;\n dark[name as SemanticColorName] = {\n ...(value.base ? { base: colorToPlain(value.base) } : {}),\n ...(value.foreground\n ? { foreground: colorToPlain(value.foreground) }\n : {}),\n };\n }\n\n return {\n id: def.id,\n name: def.name,\n light,\n dark,\n fontSizes: { ...def.fontSizes },\n fontFamilies: { ...def.fontFamilies },\n spacing: def.spacing,\n radii: { ...def.radii },\n ...(def.syncWithBrandColors ? { syncWithBrandColors: true } : {}),\n };\n}\n\n/**\n * Deserialise a backend payload into a ThemeDefinition with Color objects.\n * Accepts `Record<string, unknown>` because API data is untyped at the boundary.\n * Falls back to default colors for any missing light-mode entries.\n */\nexport function deserialiseTheme(\n payload: Record<string, unknown>,\n): ThemeDefinition {\n const lightRaw = ((payload.light as Record<string, unknown> | undefined) ??\n {}) as Record<string, { base: OklchPlain; foreground: OklchPlain }>;\n const darkRaw = ((payload.dark as Record<string, unknown> | undefined) ??\n {}) as Record<string, { base?: OklchPlain; foreground?: OklchPlain }>;\n\n const defaults = getDefaultThemeDefinition();\n const light = {} as Record<SemanticColorName, ThemeColorInput>;\n for (const name of SEMANTIC_COLOR_NAMES) {\n const entry = lightRaw[name];\n if (entry) {\n light[name] = {\n base: plainToColor(entry.base),\n foreground: plainToColor(entry.foreground),\n };\n } else {\n console.warn(\n `[theme] deserialiseTheme: missing light color \"${name}\", using default`,\n );\n light[name] = defaults.light[name];\n }\n }\n\n const dark: Partial<Record<SemanticColorName, Partial<ThemeColorInput>>> = {};\n for (const [name, value] of Object.entries(darkRaw)) {\n if (!value) continue;\n dark[name as SemanticColorName] = {\n ...(value.base ? { base: plainToColor(value.base) } : {}),\n ...(value.foreground\n ? { foreground: plainToColor(value.foreground) }\n : {}),\n };\n }\n\n return {\n id: payload.id as string,\n name: payload.name as string,\n light,\n dark,\n fontSizes: (payload.fontSizes ?? DEFAULT_FONT_SIZES) as Record<\n FontSizeKey,\n string\n >,\n fontFamilies: (payload.fontFamilies ?? DEFAULT_FONT_FAMILIES) as Record<\n FontFamilyKey,\n string\n >,\n spacing: (payload.spacing as string) ?? DEFAULT_SPACING,\n radii: (payload.radii ?? DEFAULT_RADII) as Record<RadiusKey, string>,\n ...(payload.syncWithBrandColors === true\n ? { syncWithBrandColors: true }\n : {}),\n };\n}\n","/**\n * Theme Transforms\n * Convert raw API theme objects to ThemeDefinition format.\n * Handles both new structured format (OKLCH) and legacy flat format (hex strings).\n */\n\nimport type { ThemeDefinition } from \"./types\";\nimport { deserialiseTheme } from \"./serialisation\";\nimport { parseColor, getForegroundColor } from \"./color-engine\";\nimport {\n DEFAULT_COLORS,\n DEFAULT_FONT_SIZES,\n DEFAULT_FONT_FAMILIES,\n DEFAULT_SPACING,\n DEFAULT_RADII,\n} from \"./defaults\";\n\n/** Shape of a raw theme from the FluidOS API */\nexport interface RawApiTheme {\n id: number;\n config?: Record<string, unknown> | null;\n active?: boolean | null;\n name?: string | null;\n}\n\n/**\n * Check if a theme config uses the new structured format (has a `light` key\n * that is an object) vs the legacy flat format.\n */\nfunction isNewThemeFormat(config: Record<string, unknown>): boolean {\n return config.light != null && typeof config.light === \"object\";\n}\n\n/**\n * Convert a legacy flat config to a ThemeDefinition.\n * Legacy format: { base: \"#fff\", text: \"#000\", primary: \"oklch(0.6 0.2 250)\", ... }\n */\nfunction legacyConfigToDefinition(\n id: number,\n name: string,\n config: Record<string, string>,\n): ThemeDefinition {\n const bg = parseColor(\n config.base ?? config.background ?? DEFAULT_COLORS.background,\n );\n const fg = parseColor(\n config.text ?? config.foreground ?? DEFAULT_COLORS.foreground,\n );\n const primary = parseColor(config.primary ?? DEFAULT_COLORS.primary);\n const secondary = parseColor(config.secondary ?? DEFAULT_COLORS.secondary);\n const accent = parseColor(config.accent ?? DEFAULT_COLORS.accent);\n const muted = parseColor(config.muted ?? DEFAULT_COLORS.muted);\n const destructive = parseColor(\n config.destructive ?? DEFAULT_COLORS.destructive,\n );\n const mutedFg = parseColor(\n config.mutedForeground ?? DEFAULT_COLORS.mutedForeground,\n );\n\n return {\n id: String(id),\n name,\n light: {\n background: { base: bg, foreground: fg },\n foreground: { base: fg, foreground: bg },\n primary: {\n base: primary,\n foreground: getForegroundColor(fg, primary),\n },\n secondary: {\n base: secondary,\n foreground: getForegroundColor(fg, secondary),\n },\n accent: {\n base: accent,\n foreground: getForegroundColor(fg, accent),\n },\n muted: { base: muted, foreground: mutedFg },\n destructive: {\n base: destructive,\n foreground: getForegroundColor(fg, destructive),\n },\n },\n dark: {},\n fontSizes: {\n extraSmall: config.extraSmall ?? DEFAULT_FONT_SIZES.extraSmall,\n small: config.small ?? DEFAULT_FONT_SIZES.small,\n regular: config.regular ?? DEFAULT_FONT_SIZES.regular,\n large: config.large ?? DEFAULT_FONT_SIZES.large,\n extraLarge: config.extraLarge ?? DEFAULT_FONT_SIZES.extraLarge,\n giant: config.giant ?? DEFAULT_FONT_SIZES.giant,\n },\n fontFamilies: {\n header: config.headerFont ?? DEFAULT_FONT_FAMILIES.header,\n body: config.bodyFont ?? DEFAULT_FONT_FAMILIES.body,\n },\n spacing: config.globalSpacing ?? DEFAULT_SPACING,\n radii: {\n small: config.radiusSmall ?? DEFAULT_RADII.small,\n medium: config.radiusMedium ?? DEFAULT_RADII.medium,\n large: config.radiusLarge ?? DEFAULT_RADII.large,\n extraLarge: config.radiusExtraLarge ?? DEFAULT_RADII.extraLarge,\n },\n };\n}\n\n/**\n * Build a ThemeDefinition from a single API theme object.\n * Handles both new structured format and legacy flat format.\n */\nexport function buildThemeDefinition(theme: RawApiTheme): ThemeDefinition {\n const config = (theme.config ?? {}) as Record<string, unknown>;\n\n if (isNewThemeFormat(config)) {\n return deserialiseTheme({\n ...config,\n id: String(theme.id),\n name: theme.name ?? \"Untitled Theme\",\n });\n }\n\n return legacyConfigToDefinition(\n theme.id,\n theme.name ?? \"Untitled Theme\",\n config as Record<string, string>,\n );\n}\n\n/**\n * Transform raw API themes to ThemeDefinition[].\n * Catches and logs errors per theme (graceful degradation).\n */\nexport function transformThemes(themes: RawApiTheme[]): ThemeDefinition[] {\n return themes.flatMap((theme) => {\n try {\n return [buildThemeDefinition(theme)];\n } catch (error) {\n console.error(`[theme] Failed to build theme id=${theme.id}:`, error);\n return [];\n }\n });\n}\n\n/**\n * Get the active theme ID from a list of raw API themes.\n * Falls back to the first theme if none is marked active.\n */\nexport function getActiveThemeId(themes: RawApiTheme[]): string | undefined {\n const active = themes.find((t) => t.active) ?? themes[0];\n return active ? String(active.id) : undefined;\n}\n","import { generateThemeCSS } from \"./css-generator\";\nimport { FONT_FAMILY_KEYS, type ResolvedTheme } from \"./types\";\nimport type { GenerateThemeCSSOptions } from \"./css-generator\";\n\nconst STYLE_PREFIX = \"theme-style-\";\nconst FONT_LINK_PREFIX = \"theme-font-\";\n\nconst SYSTEM_FONTS = new Set([\n \"sans-serif\",\n \"serif\",\n \"monospace\",\n \"cursive\",\n \"fantasy\",\n \"system-ui\",\n \"ui-sans-serif\",\n \"ui-serif\",\n \"ui-monospace\",\n]);\n\n/** Build a Google Fonts CSS2 URL for a given font family with all weights. */\nfunction buildGoogleFontUrl(family: string): string {\n const encoded = encodeURIComponent(family).replace(/%20/g, \"+\");\n return `https://fonts.googleapis.com/css2?family=${encoded}:wght@100;200;300;400;500;600;700;800;900&display=swap`;\n}\n\n/** Check if a font family value needs to be loaded (i.e. is not a CSS var or system font). */\nfunction isLoadableFont(value: string): boolean {\n if (!value) return false;\n if (value.startsWith(\"var(\")) return false;\n return !SYSTEM_FONTS.has(value.toLowerCase());\n}\n\n/** Deterministic link element ID for a font family. */\nfunction fontLinkId(family: string): string {\n return `${FONT_LINK_PREFIX}${family.replace(/\\s+/g, \"-\").toLowerCase()}`;\n}\n\n/**\n * Inject or update `<link>` elements for Google Fonts used by the theme.\n * Removes links for fonts that are no longer referenced.\n */\nfunction loadThemeFonts(theme: ResolvedTheme): void {\n if (typeof document === \"undefined\") return;\n\n const fontsToLoad = new Set<string>();\n for (const key of FONT_FAMILY_KEYS) {\n const value = theme.fontFamilies[key];\n if (isLoadableFont(value)) {\n fontsToLoad.add(value);\n }\n }\n\n // Remove stale font links owned by this theme\n const existingLinks = document.querySelectorAll(\n `link[id^=\"${FONT_LINK_PREFIX}\"]`,\n );\n existingLinks.forEach((link) => {\n const owners = link.getAttribute(\"data-font-theme-ids\")?.split(\",\") ?? [];\n if (!owners.includes(theme.id)) return;\n const fontName = link.getAttribute(\"data-font-family\");\n if (fontName && !fontsToLoad.has(fontName)) {\n const remaining = owners.filter((id) => id !== theme.id);\n if (remaining.length === 0) {\n link.remove();\n } else {\n link.setAttribute(\"data-font-theme-ids\", remaining.join(\",\"));\n }\n }\n });\n\n // Add new font links (or register this theme as an owner of existing ones)\n for (const family of fontsToLoad) {\n const id = fontLinkId(family);\n const existing = document.getElementById(id);\n if (existing) {\n const owners =\n existing.getAttribute(\"data-font-theme-ids\")?.split(\",\") ?? [];\n if (!owners.includes(theme.id)) {\n existing.setAttribute(\n \"data-font-theme-ids\",\n [...owners, theme.id].join(\",\"),\n );\n }\n } else {\n const link = document.createElement(\"link\");\n link.id = id;\n link.rel = \"stylesheet\";\n link.href = buildGoogleFontUrl(family);\n link.setAttribute(\"data-font-family\", family);\n link.setAttribute(\"data-font-theme-ids\", theme.id);\n document.head.appendChild(link);\n }\n }\n}\n\n/** Remove all font `<link>` elements injected by the theme system. */\nfunction removeAllFontLinks(): void {\n if (typeof document === \"undefined\") return;\n document\n .querySelectorAll(`link[id^=\"${FONT_LINK_PREFIX}\"]`)\n .forEach((el) => el.remove());\n}\n\n/**\n * Inject or update a `<style>` element in `<head>` for the given theme.\n * The element ID is deterministic (`theme-style-{themeId}`) so repeated calls\n * for the same theme are idempotent — the existing element is updated in place.\n * Also loads Google Fonts referenced by the theme's font families.\n * No-op when `document` is unavailable (SSR).\n */\nexport function applyTheme(\n theme: ResolvedTheme,\n options?: GenerateThemeCSSOptions,\n): void {\n if (typeof document === \"undefined\") return;\n\n try {\n loadThemeFonts(theme);\n\n const styleId = `${STYLE_PREFIX}${theme.id}`;\n let el = document.getElementById(styleId) as HTMLStyleElement | null;\n\n if (!el) {\n el = document.createElement(\"style\");\n el.id = styleId;\n document.head.appendChild(el);\n }\n\n el.textContent = generateThemeCSS(theme, options);\n } catch (error) {\n console.error(`[theme] applyTheme failed for \"${theme.id}\":`, error);\n }\n}\n\n/** Remove an injected theme stylesheet and clean up font link ownership. No-op during SSR. */\nexport function removeTheme(themeId: string): void {\n if (typeof document === \"undefined\") return;\n document.getElementById(`${STYLE_PREFIX}${themeId}`)?.remove();\n\n // Remove this theme from font link ownership; delete links with no remaining owners\n document\n .querySelectorAll(`link[id^=\"${FONT_LINK_PREFIX}\"]`)\n .forEach((link) => {\n const owners = link.getAttribute(\"data-font-theme-ids\")?.split(\",\") ?? [];\n const remaining = owners.filter((id) => id !== themeId);\n if (remaining.length === 0) {\n link.remove();\n } else {\n link.setAttribute(\"data-font-theme-ids\", remaining.join(\",\"));\n }\n });\n}\n\n/** Remove all injected theme stylesheets and font links. No-op during SSR. */\nexport function removeAllThemes(): void {\n if (typeof document === \"undefined\") return;\n document\n .querySelectorAll(`style[id^=\"${STYLE_PREFIX}\"]`)\n .forEach((el) => el.remove());\n removeAllFontLinks();\n}\n","import type { AnyComponent } from \"../types/widget-schema\";\nimport type { WidgetSchema, TypedWidgetSchema } from \"../types\";\nimport type { ShareableItem } from \"../types/shareable-item\";\nimport type { WidgetManifest } from \"../registries/widget-manifest\";\n\nexport function createWidgetRegistry<\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n T extends Record<string, AnyComponent>,\n>(registry: T, plugins?: WidgetManifest[]): T {\n if (!plugins || plugins.length === 0) {\n return registry;\n }\n\n const pluginEntries = Object.fromEntries(\n plugins.map((p) => [p.type, p.component]),\n );\n\n return { ...registry, ...pluginEntries } as T;\n}\n\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\nexport function createScreen<T extends Record<string, AnyComponent>>(\n registry: T,\n widgets: TypedWidgetSchema<T>[],\n): TypedWidgetSchema<T>[] {\n // Validate that all widget types exist in the registry at runtime\n widgets.forEach((widget) => {\n if (!(widget.type in registry)) {\n throw new Error(\n `Widget type \"${String(widget.type)}\" not found in registry`,\n );\n }\n });\n return widgets;\n}\n\n// Helper to create WidgetSchema from shareable item\nexport function createWidgetFromShareable(item: ShareableItem): WidgetSchema {\n const isVideo = item.kind === \"video\" || !!item.videoUrl;\n\n if (isVideo && item.videoUrl) {\n return {\n type: \"VideoWidget\",\n props: {\n src: item.videoUrl,\n poster: item.imageUrl,\n caption: item.title,\n },\n };\n }\n\n return {\n type: \"ImageWidget\",\n props: {\n src: item.imageUrl,\n alt: item.title || \"Image\",\n objectFit: \"cover\",\n },\n };\n}\n","import type { WidgetPropertySchema } from \"@fluid-app/portal-core/registries\";\n\n// Widget Components\nexport { AlertWidget, alertWidgetPropertySchema } from \"./AlertWidget\";\n// ShopWidget is intentionally NOT re-exported here. It depends on\n// products-core hooks/types and including it in this barrel pulls\n// products-core source into portal-sdk's dts build, which fails under\n// `--isolatedDeclarations`. portal-builder imports it via the direct\n// file path (./ShopWidget) instead. The dynamic-import entry in\n// `widgetPropertySchemas` below is fine — it's evaluated at runtime\n// only and doesn't traverse types statically.\nexport {\n BulletListWidget,\n bulletListWidgetPropertySchema,\n} from \"./BulletListWidget\";\nexport { CalendarWidget, calendarWidgetPropertySchema } from \"./CalendarWidget\";\nexport { CardWidget, cardWidgetPropertySchema } from \"./CardWidget\";\nexport { CarouselWidget, carouselWidgetPropertySchema } from \"./CarouselWidget\";\nexport { CatchUpWidget, catchUpWidgetPropertySchema } from \"./CatchUpWidget\";\nexport { ChartWidget, chartWidgetPropertySchema } from \"./ChartWidget\";\nexport {\n ContainerWidget,\n containerWidgetPropertySchema,\n} from \"./ContainerWidget\";\nexport { EmbedWidget, embedWidgetPropertySchema } from \"./EmbedWidget\";\nexport { ImageWidget, imageWidgetPropertySchema } from \"./ImageWidget\";\nexport { LayoutWidget, layoutWidgetPropertySchema } from \"./LayoutWidget\";\nexport { LinkWidget, linkWidgetPropertySchema } from \"./LinkWidget\";\nexport { ListWidget, listWidgetPropertySchema } from \"./ListWidget\";\nexport { MySiteWidget, mySiteWidgetPropertySchema } from \"./MySiteWidget\";\nexport { NestedWidget, nestedWidgetPropertySchema } from \"./NestedWidget\";\nexport { PointsWidget, pointsWidgetPropertySchema } from \"./PointsWidget\";\nexport {\n QuickLinksWidget,\n quickLinksWidgetPropertySchema,\n} from \"./QuickLinksWidget\";\nexport {\n QuickShareWidget,\n quickShareWidgetPropertySchema,\n} from \"./QuickShareWidget\";\nexport {\n RecentActivityWidget,\n recentActivityWidgetPropertySchema,\n} from \"./RecentActivityWidget\";\nexport {\n SeparatorWidget,\n separatorWidgetPropertySchema,\n} from \"./SeparatorWidget\";\nexport { SpacerWidget, spacerWidgetPropertySchema } from \"./SpacerWidget\";\nexport { TableWidget, tableWidgetPropertySchema } from \"./TableWidget\";\nexport { TextWidget, textWidgetPropertySchema } from \"./TextWidget\";\nexport { ToDoWidget, toDoWidgetPropertySchema } from \"./ToDoWidget\";\nexport { VideoWidget, videoWidgetPropertySchema } from \"./VideoWidget\";\n\n// Re-export gapValues from core (used by widgets)\nexport { gapValues } from \"../core/fields\";\n\n// Re-export all property schemas as a collection\nexport const widgetPropertySchemas = {\n AlertWidget: (): Promise<WidgetPropertySchema> =>\n import(\"./AlertWidget\").then((m) => m.alertWidgetPropertySchema),\n BulletListWidget: (): Promise<WidgetPropertySchema> =>\n import(\"./BulletListWidget\").then((m) => m.bulletListWidgetPropertySchema),\n CalendarWidget: (): Promise<WidgetPropertySchema> =>\n import(\"./CalendarWidget\").then((m) => m.calendarWidgetPropertySchema),\n CardWidget: (): Promise<WidgetPropertySchema> =>\n import(\"./CardWidget\").then((m) => m.cardWidgetPropertySchema),\n CarouselWidget: (): Promise<WidgetPropertySchema> =>\n import(\"./CarouselWidget\").then((m) => m.carouselWidgetPropertySchema),\n CatchUpWidget: (): Promise<WidgetPropertySchema> =>\n import(\"./CatchUpWidget\").then((m) => m.catchUpWidgetPropertySchema),\n ChartWidget: (): Promise<WidgetPropertySchema> =>\n import(\"./ChartWidget\").then((m) => m.chartWidgetPropertySchema),\n ContainerWidget: (): Promise<WidgetPropertySchema> =>\n import(\"./ContainerWidget\").then((m) => m.containerWidgetPropertySchema),\n EmbedWidget: (): Promise<WidgetPropertySchema> =>\n import(\"./EmbedWidget\").then((m) => m.embedWidgetPropertySchema),\n ImageWidget: (): Promise<WidgetPropertySchema> =>\n import(\"./ImageWidget\").then((m) => m.imageWidgetPropertySchema),\n LayoutWidget: (): Promise<WidgetPropertySchema> =>\n import(\"./LayoutWidget\").then((m) => m.layoutWidgetPropertySchema),\n LinkWidget: (): Promise<WidgetPropertySchema> =>\n import(\"./LinkWidget\").then((m) => m.linkWidgetPropertySchema),\n ListWidget: (): Promise<WidgetPropertySchema> =>\n import(\"./ListWidget\").then((m) => m.listWidgetPropertySchema),\n MySiteWidget: (): Promise<WidgetPropertySchema> =>\n import(\"./MySiteWidget\").then((m) => m.mySiteWidgetPropertySchema),\n NestedWidget: (): Promise<WidgetPropertySchema> =>\n import(\"./NestedWidget\").then((m) => m.nestedWidgetPropertySchema),\n PointsWidget: (): Promise<WidgetPropertySchema> =>\n import(\"./PointsWidget\").then((m) => m.pointsWidgetPropertySchema),\n QuickLinksWidget: (): Promise<WidgetPropertySchema> =>\n import(\"./QuickLinksWidget\").then((m) => m.quickLinksWidgetPropertySchema),\n QuickShareWidget: (): Promise<WidgetPropertySchema> =>\n import(\"./QuickShareWidget\").then((m) => m.quickShareWidgetPropertySchema),\n RecentActivityWidget: (): Promise<WidgetPropertySchema> =>\n import(\"./RecentActivityWidget\").then(\n (m) => m.recentActivityWidgetPropertySchema,\n ),\n SeparatorWidget: (): Promise<WidgetPropertySchema> =>\n import(\"./SeparatorWidget\").then((m) => m.separatorWidgetPropertySchema),\n ShopWidget: (): Promise<WidgetPropertySchema> =>\n import(\"./ShopWidget\").then((m) => m.shopWidgetPropertySchema),\n SpacerWidget: (): Promise<WidgetPropertySchema> =>\n import(\"./SpacerWidget\").then((m) => m.spacerWidgetPropertySchema),\n TableWidget: (): Promise<WidgetPropertySchema> =>\n import(\"./TableWidget\").then((m) => m.tableWidgetPropertySchema),\n TextWidget: (): Promise<WidgetPropertySchema> =>\n import(\"./TextWidget\").then((m) => m.textWidgetPropertySchema),\n ToDoWidget: (): Promise<WidgetPropertySchema> =>\n import(\"./ToDoWidget\").then((m) => m.toDoWidgetPropertySchema),\n VideoWidget: (): Promise<WidgetPropertySchema> =>\n import(\"./VideoWidget\").then((m) => m.videoWidgetPropertySchema),\n};\n","/**\n * Default widget registry for SDK apps.\n * Maps widget type names to their view-only components from portal-widgets.\n */\n\nimport type { WidgetRegistry } from \"@fluid-app/portal-core/types\";\nimport { createWidgetRegistry } from \"@fluid-app/portal-core/widget-utils\";\nimport {\n AlertWidget,\n BulletListWidget,\n CalendarWidget,\n CardWidget,\n CarouselWidget,\n ChartWidget,\n ContainerWidget,\n EmbedWidget,\n ImageWidget,\n LayoutWidget,\n LinkWidget,\n ListWidget,\n MySiteWidget,\n NestedWidget,\n PointsWidget,\n QuickLinksWidget,\n QuickShareWidget,\n RecentActivityWidget,\n SeparatorWidget,\n SpacerWidget,\n TableWidget,\n TextWidget,\n ToDoWidget,\n VideoWidget,\n} from \"@fluid-app/portal-widgets/widgets\";\n// ShopWidget is imported via its direct subpath because the\n// portal-widgets barrel intentionally omits it (it depends on\n// products-core hooks/types which break portal-sdk's --isolatedDeclarations\n// dts build when traversed through the barrel).\nimport { ShopWidget } from \"@fluid-app/portal-widgets/widgets/ShopWidget\";\n\nexport const DEFAULT_SDK_WIDGET_REGISTRY: WidgetRegistry = createWidgetRegistry(\n {\n AlertWidget,\n BulletListWidget,\n CalendarWidget,\n CardWidget,\n CarouselWidget,\n ChartWidget,\n ContainerWidget,\n EmbedWidget,\n ImageWidget,\n LayoutWidget,\n LinkWidget,\n ListWidget,\n MySiteWidget,\n NestedWidget,\n PointsWidget,\n QuickLinksWidget,\n QuickShareWidget,\n RecentActivityWidget,\n SeparatorWidget,\n ShopWidget,\n SpacerWidget,\n TableWidget,\n TextWidget,\n ToDoWidget,\n VideoWidget,\n },\n);\n","export const REMOTE_DOM_WIDGET_MANIFEST_VERSION = 1 as const;\nexport const REMOTE_DOM_WIDGET_RUNTIME = \"remote-dom\" as const;\n\nexport type JsonPrimitive = string | number | boolean | null;\n\nexport type JsonValue = JsonPrimitive | readonly JsonValue[] | JsonObject;\n\nexport interface JsonObject {\n readonly [key: string]: JsonValue;\n}\n\nexport interface RemoteDomWidgetCapabilityDeclaration {\n readonly name: string;\n readonly version: string;\n}\n\nexport interface RemoteDomWidgetDefinition {\n readonly type: string;\n readonly displayName: string;\n readonly description: string;\n readonly icon: string;\n readonly category: string;\n readonly propertySchema: JsonObject;\n readonly defaultProps: JsonObject;\n readonly container: \"inline\" | \"block\" | \"card\" | \"fullscreen\";\n readonly resizable: boolean | \"horizontal\" | \"vertical\" | \"both\";\n readonly minSdkVersion: string;\n readonly capabilities: readonly RemoteDomWidgetCapabilityDeclaration[];\n}\n\n/**\n * Canonical package contract shared by the CLI, catalog APIs, and portal hosts.\n * Catalog producers resolve every artifact to its public URL before returning\n * this descriptor; consumers do not translate legacy manifest shapes.\n */\nexport interface RemoteDomWidgetPackageDescriptor {\n readonly manifestVersion: typeof REMOTE_DOM_WIDGET_MANIFEST_VERSION;\n readonly runtime: typeof REMOTE_DOM_WIDGET_RUNTIME;\n readonly packageId: string;\n readonly source: \"company\" | \"droplet\";\n readonly version: string;\n readonly workerEntryUrl: string;\n readonly cssUrls: readonly string[];\n readonly assetUrls: readonly string[];\n readonly widgets: readonly RemoteDomWidgetDefinition[];\n}\n\nconst PACKAGE_FIELDS = new Set([\n \"manifestVersion\",\n \"runtime\",\n \"packageId\",\n \"source\",\n \"version\",\n \"workerEntryUrl\",\n \"cssUrls\",\n \"assetUrls\",\n \"widgets\",\n]);\n\nconst WIDGET_FIELDS = new Set([\n \"type\",\n \"displayName\",\n \"description\",\n \"icon\",\n \"category\",\n \"propertySchema\",\n \"defaultProps\",\n \"container\",\n \"resizable\",\n \"minSdkVersion\",\n \"capabilities\",\n]);\n\nconst CAPABILITY_FIELDS = new Set([\"name\", \"version\"]);\nconst UNSAFE_JSON_KEYS = new Set([\"__proto__\", \"constructor\", \"prototype\"]);\n\nexport function validateRemoteDomWidgetPackageDescriptor(\n value: unknown,\n): asserts value is RemoteDomWidgetPackageDescriptor {\n const invalidReason = getRemoteDomWidgetPackageInvalidReason(value);\n if (invalidReason) {\n throw new TypeError(`Invalid Remote DOM widget package: ${invalidReason}`);\n }\n}\n\nexport function isRemoteDomWidgetPackageDescriptor(\n value: unknown,\n): value is RemoteDomWidgetPackageDescriptor {\n return getRemoteDomWidgetPackageInvalidReason(value) === undefined;\n}\n\nfunction getRemoteDomWidgetPackageInvalidReason(\n value: unknown,\n): string | undefined {\n if (!isRecord(value)) return \"descriptor must be an object\";\n\n const unexpectedFieldReason = getUnexpectedFieldReason(\n value,\n PACKAGE_FIELDS,\n \"descriptor\",\n );\n if (unexpectedFieldReason) return unexpectedFieldReason;\n\n if (value.manifestVersion !== REMOTE_DOM_WIDGET_MANIFEST_VERSION) {\n return `manifestVersion must be ${REMOTE_DOM_WIDGET_MANIFEST_VERSION}`;\n }\n if (value.runtime !== REMOTE_DOM_WIDGET_RUNTIME) {\n return `runtime must be ${REMOTE_DOM_WIDGET_RUNTIME}`;\n }\n\n const packageIdReason = getNonEmptyStringReason(value.packageId, \"packageId\");\n if (packageIdReason) return packageIdReason;\n\n if (value.source !== \"company\" && value.source !== \"droplet\") {\n return \"source must be company or droplet\";\n }\n\n const versionReason = getNonEmptyStringReason(value.version, \"version\");\n if (versionReason) return versionReason;\n\n const workerEntryUrlReason = getHttpUrlReason(\n value.workerEntryUrl,\n \"workerEntryUrl\",\n );\n if (workerEntryUrlReason) return workerEntryUrlReason;\n\n const cssUrlsReason = getUrlArrayReason(value.cssUrls, \"cssUrls\");\n if (cssUrlsReason) return cssUrlsReason;\n\n const assetUrlsReason = getUrlArrayReason(value.assetUrls, \"assetUrls\");\n if (assetUrlsReason) return assetUrlsReason;\n\n if (!Array.isArray(value.widgets) || value.widgets.length === 0) {\n return \"widgets must be a non-empty array\";\n }\n\n const widgetTypes = new Set<string>();\n for (let index = 0; index < value.widgets.length; index += 1) {\n const widget = value.widgets[index];\n const widgetReason = getWidgetReason(widget, `widgets[${index}]`);\n if (widgetReason) return widgetReason;\n\n const widgetType = widget.type;\n if (widgetTypes.has(widgetType)) {\n return `widgets contains duplicate type ${widgetType}`;\n }\n widgetTypes.add(widgetType);\n }\n\n return undefined;\n}\n\nfunction getWidgetReason(value: unknown, path: string): string | undefined {\n if (!isRecord(value)) return `${path} must be an object`;\n\n const unexpectedFieldReason = getUnexpectedFieldReason(\n value,\n WIDGET_FIELDS,\n path,\n );\n if (unexpectedFieldReason) return unexpectedFieldReason;\n\n for (const field of [\n \"type\",\n \"displayName\",\n \"description\",\n \"icon\",\n \"category\",\n \"minSdkVersion\",\n ] as const) {\n const reason = getNonEmptyStringReason(value[field], `${path}.${field}`);\n if (reason) return reason;\n }\n\n if (!isRecord(value.propertySchema) || !isJsonValue(value.propertySchema)) {\n return `${path}.propertySchema must be a JSON object`;\n }\n if (!isRecord(value.defaultProps) || !isJsonValue(value.defaultProps)) {\n return `${path}.defaultProps must be a JSON object`;\n }\n\n if (\n value.container !== \"inline\" &&\n value.container !== \"block\" &&\n value.container !== \"card\" &&\n value.container !== \"fullscreen\"\n ) {\n return `${path}.container is unsupported`;\n }\n\n if (\n typeof value.resizable !== \"boolean\" &&\n value.resizable !== \"horizontal\" &&\n value.resizable !== \"vertical\" &&\n value.resizable !== \"both\"\n ) {\n return `${path}.resizable is unsupported`;\n }\n\n if (!Array.isArray(value.capabilities)) {\n return `${path}.capabilities must be an array`;\n }\n\n const capabilityNames = new Set<string>();\n for (let index = 0; index < value.capabilities.length; index += 1) {\n const capability = value.capabilities[index];\n const capabilityPath = `${path}.capabilities[${index}]`;\n if (!isRecord(capability)) return `${capabilityPath} must be an object`;\n\n const unexpectedFieldReason = getUnexpectedFieldReason(\n capability,\n CAPABILITY_FIELDS,\n capabilityPath,\n );\n if (unexpectedFieldReason) return unexpectedFieldReason;\n\n const capabilityName = capability.name;\n const nameReason = getNonEmptyStringReason(\n capabilityName,\n `${capabilityPath}.name`,\n );\n if (nameReason) return nameReason;\n if (typeof capabilityName !== \"string\") {\n return `${capabilityPath}.name must be a non-empty string`;\n }\n\n const versionReason = getNonEmptyStringReason(\n capability.version,\n `${capabilityPath}.version`,\n );\n if (versionReason) return versionReason;\n\n if (capabilityNames.has(capabilityName)) {\n return `${path}.capabilities contains duplicate name ${capabilityName}`;\n }\n capabilityNames.add(capabilityName);\n }\n\n return undefined;\n}\n\nfunction getUrlArrayReason(value: unknown, path: string): string | undefined {\n if (!Array.isArray(value)) return `${path} must be an array`;\n\n for (let index = 0; index < value.length; index += 1) {\n const reason = getHttpUrlReason(value[index], `${path}[${index}]`);\n if (reason) return reason;\n }\n return undefined;\n}\n\nfunction getHttpUrlReason(value: unknown, path: string): string | undefined {\n const stringReason = getNonEmptyStringReason(value, path);\n if (stringReason) return stringReason;\n if (typeof value !== \"string\") return `${path} must be a non-empty string`;\n\n try {\n const url = new URL(value);\n if (url.protocol !== \"http:\" && url.protocol !== \"https:\") {\n return `${path} must use http or https`;\n }\n if (url.username || url.password) {\n return `${path} must not contain credentials`;\n }\n } catch {\n return `${path} must be an absolute URL`;\n }\n\n return undefined;\n}\n\nfunction getNonEmptyStringReason(\n value: unknown,\n path: string,\n): string | undefined {\n if (typeof value !== \"string\" || value.trim().length === 0) {\n return `${path} must be a non-empty string`;\n }\n if (value !== value.trim())\n return `${path} must not have surrounding whitespace`;\n if (/\\p{Cc}/u.test(value))\n return `${path} must not contain control characters`;\n return undefined;\n}\n\nexport function isJsonValue(value: unknown): value is JsonValue {\n return isJsonValueAtDepth(value, new WeakSet<object>(), 0);\n}\n\nfunction isJsonValueAtDepth(\n value: unknown,\n ancestors: WeakSet<object>,\n depth: number,\n): value is JsonValue {\n if (\n value === null ||\n typeof value === \"string\" ||\n typeof value === \"boolean\"\n ) {\n return true;\n }\n if (typeof value === \"number\") return Number.isFinite(value);\n if (typeof value !== \"object\" || depth > 50 || ancestors.has(value)) {\n return false;\n }\n\n ancestors.add(value);\n const prototype = Object.getPrototypeOf(value);\n const isJson = Array.isArray(value)\n ? value.every((item) => isJsonValueAtDepth(item, ancestors, depth + 1))\n : (prototype === Object.prototype || prototype === null) &&\n isRecord(value) &&\n Object.entries(value).every(\n ([key, item]) =>\n !UNSAFE_JSON_KEYS.has(key) &&\n isJsonValueAtDepth(item, ancestors, depth + 1),\n );\n ancestors.delete(value);\n return isJson;\n}\n\nfunction isRecord(value: unknown): value is Readonly<Record<string, unknown>> {\n return typeof value === \"object\" && value !== null && !Array.isArray(value);\n}\n\nfunction getUnexpectedFieldReason(\n value: Readonly<Record<string, unknown>>,\n allowedFields: ReadonlySet<string>,\n path: string,\n): string | undefined {\n const unexpectedField = Object.keys(value).find(\n (field) => !allowedFields.has(field),\n );\n return unexpectedField\n ? `${path} contains unsupported field ${unexpectedField}`\n : undefined;\n}\n","/**\n * Company-scoped query key factory for TanStack Query.\n *\n * In portal-tenant, each tenant is a single company, so query keys are\n * returned unscoped. The `createCompanyQueryKey` utility is preserved for\n * potential future multi-company support.\n */\n\nimport { useCallback } from \"react\";\n\n/**\n * Create a company-scoped query key by prepending [\"company\", companyId].\n *\n * @param companyId - The company ID\n * @param baseKey - The base query key segments (e.g. [\"fluid\", \"profile\"])\n * @returns A tuple like [\"company\", 42, \"fluid\", \"profile\"]\n */\nexport function createCompanyQueryKey(\n companyId: number,\n ...baseKey: readonly string[]\n): readonly [\"company\", number, ...string[]] {\n return [\"company\", companyId, ...baseKey] as const;\n}\n\n/**\n * Hook that returns a `scopeKey` function.\n *\n * In portal-tenant, each tenant is a single company, so keys are\n * returned unscoped (no company prefix).\n */\nexport function useCompanyScopedQueryKey(): {\n readonly companyId: number | undefined;\n readonly scopeKey: <T extends readonly string[]>(\n baseKey: T,\n ) => readonly (string | number)[];\n} {\n const scopeKey = useCallback(\n <T extends readonly string[]>(baseKey: T): readonly (string | number)[] => {\n return baseKey;\n },\n [],\n );\n\n return { companyId: undefined, scopeKey } as const;\n}\n","/**\n * Screen Transforms\n * Convert FluidOS API screen objects to ScreenDefinition format.\n *\n * Extracted from:\n * - apps/fluid-admin/networking/app-builder/app-screens/types.ts\n * - apps/fluid-admin/networking/reps/screens.api.ts\n */\n\nimport type { WidgetSchema } from \"@fluid-app/portal-core/types\";\nimport type { ScreenDefinition } from \"@fluid-app/portal-core/types\";\n\n/** Raw screen from the FluidOS API */\nexport interface RawApiScreen {\n id: number | string;\n definition_id?: number | string;\n name?: string | null;\n slug?: string | null;\n component_tree?: unknown;\n}\n\n/**\n * Normalize component_tree to always be an array.\n * The API stores component_tree as a hash (object), but the frontend expects an array.\n */\nexport function normalizeComponentTree(componentTree: unknown): WidgetSchema[] {\n if (!componentTree) return [];\n if (Array.isArray(componentTree)) return componentTree as WidgetSchema[];\n if (typeof componentTree === \"object\") {\n return [componentTree as WidgetSchema];\n }\n return [];\n}\n\n/**\n * Convert a raw FluidOS screen to ScreenDefinition.\n * Normalizes component_tree and converts string IDs to numbers.\n */\nexport function toScreenDefinition(screen: RawApiScreen): ScreenDefinition {\n return {\n id: Number(screen.id),\n slug: screen.slug ?? \"\",\n name: screen.name ?? \"\",\n component_tree: normalizeComponentTree(screen.component_tree),\n };\n}\n","/**\n * Navigation Transforms\n * Convert FluidOS API navigation items to NavigationItem format.\n *\n * Extracted from:\n * - apps/fluid-admin/networking/app-builder/app-navigation-items/types.ts\n * - apps/fluid-admin/networking/reps/screens.api.ts\n */\n\nimport type { NavigationItem } from \"@fluid-app/portal-core/types\";\nimport type { FluidOsApiNavigationItem } from \"@fluid-app/portal-core/fluidos-api\";\n\n/** Raw navigation item from the FluidOS API. */\nexport type RawApiNavigationItem = FluidOsApiNavigationItem;\n\n/**\n * Convert a raw FluidOS navigation item to NavigationItem.\n * Recursively transforms children and sorts by position.\n */\nexport function toNavigationItem(item: RawApiNavigationItem): NavigationItem {\n const children = (item.children ?? [])\n .map(toNavigationItem)\n .sort((a, b) => (a.position ?? 0) - (b.position ?? 0));\n\n return {\n id: Number(item.id),\n label: item.label ?? \"Untitled\",\n // Use conditional spread for optional properties (exactOptionalPropertyTypes)\n ...(item.slug != null ? { slug: String(item.slug) } : {}),\n ...(item.icon != null ? { icon: String(item.icon) } : {}),\n ...(item.screen_id != null ? { screen_id: Number(item.screen_id) } : {}),\n ...(item.parent_id != null ? { parent_id: Number(item.parent_id) } : {}),\n ...(item.source != null ? { source: item.source } : {}),\n position: item.position ?? 0,\n children,\n };\n}\n","/**\n * Data Transforms\n * Convert FluidOS API responses to RepAppData format.\n *\n * This is the main entry point for all transforms used by the SDK client\n * and hooks when fetching from the fluidos API.\n */\n\nexport {\n transformThemes,\n buildThemeDefinition,\n getActiveThemeId,\n type RawApiTheme,\n} from \"@fluid-app/portal-core/theme\";\n\nexport {\n normalizeComponentTree,\n toScreenDefinition,\n type RawApiScreen,\n} from \"./screen-transforms\";\n\nexport {\n toNavigationItem,\n type RawApiNavigationItem,\n} from \"./navigation-transforms\";\n\nimport type { AppManifestResponse } from \"@fluid-app/portal-core/app-definition-types\";\nimport type { RepAppData, RepAppManifest } from \"@fluid-app/portal-core/types\";\nimport {\n transformThemes,\n getActiveThemeId,\n type RawApiTheme,\n} from \"@fluid-app/portal-core/theme\";\nimport { toScreenDefinition, type RawApiScreen } from \"./screen-transforms\";\nimport {\n toNavigationItem,\n type RawApiNavigationItem,\n} from \"./navigation-transforms\";\n\n/**\n * Raw manifest shape consumed by the transform pipeline.\n *\n * A structural superset of `AppManifestResponse` that also accommodates\n * the legacy `RepAppData` fixtures produced by\n * `packages/cli/portal/src/vite-plugin/build-manifest.ts` in dev mode.\n * Fields that are optional here are either (a) never emitted by\n * `/api/app/manifest` or (b) emitted only by the dev-mode fixture. In both\n * cases `transformManifestToRepAppData` supplies `?? fallback` defaults.\n */\nexport interface RawManifestResponse {\n manifest: {\n definition_id?: number;\n published_version?: number;\n screens?: RawApiScreen[];\n profile?: {\n name?: string;\n definition_id?: number;\n themes?: RawApiTheme[];\n navigation?: {\n id?: number;\n name?: string;\n definition_id?: number;\n navigation_items?: RawApiNavigationItem[];\n };\n mobile_navigation?: {\n id?: number;\n name?: string;\n definition_id?: number;\n navigation_items?: RawApiNavigationItem[];\n };\n };\n };\n}\n\n/**\n * Convert an `AppManifestResponse` into the `RawManifestResponse` shape\n * expected by the transform pipeline. `AppManifestResponse` is structurally\n * assignable to `RawManifestResponse`, so this is a runtime-only guard that\n * rejects empty payloads.\n */\nexport function toRawManifest(\n response: AppManifestResponse,\n): RawManifestResponse {\n if (!response.manifest) {\n throw new Error(\"Portal BFF returned empty manifest\");\n }\n return response;\n}\n\n/**\n * Transform a raw FluidOS manifest API response into RepAppData.\n *\n * Handles:\n * - Theme transformation (legacy and new formats)\n * - Screen normalization (component_tree array wrapping)\n * - Navigation item transformation (recursive with position sorting)\n */\nexport function transformManifestToRepAppData(\n response: RawManifestResponse,\n): RepAppData {\n const manifest = response.manifest;\n const rawProfile = manifest.profile;\n\n const rawThemes: RawApiTheme[] = Array.isArray(rawProfile?.themes)\n ? rawProfile.themes\n : [];\n\n const screens = (manifest.screens ?? []).map((screen) =>\n toScreenDefinition(screen),\n );\n\n const navigationItems = (rawProfile?.navigation?.navigation_items ?? []).map(\n toNavigationItem,\n );\n\n const nav = rawProfile?.navigation;\n const mobileNav = rawProfile?.mobile_navigation;\n const mobileNavigationItems = (mobileNav?.navigation_items ?? []).map(\n toNavigationItem,\n );\n const activeThemeId = getActiveThemeId(rawThemes);\n const definitionId = manifest.definition_id ?? 0;\n\n return {\n definition_id: definitionId,\n published_version: manifest.published_version ?? 0,\n screens,\n profile: {\n name: rawProfile?.name ?? \"Default\",\n definition_id: rawProfile?.definition_id ?? definitionId,\n themes: transformThemes(rawThemes),\n // Conditional spread for exactOptionalPropertyTypes compliance\n ...(activeThemeId !== undefined ? { activeThemeId } : {}),\n navigation: {\n definition_id: nav?.definition_id ?? definitionId,\n id: nav?.id ?? 0,\n name: nav?.name ?? \"Main Navigation\",\n navigation_items: navigationItems,\n screens,\n },\n ...(mobileNav\n ? {\n mobile_navigation: {\n definition_id: mobileNav.definition_id ?? definitionId,\n id: mobileNav.id ?? 0,\n name: mobileNav.name ?? \"Mobile Navigation\",\n navigation_items: mobileNavigationItems,\n screens,\n },\n }\n : {}),\n },\n };\n}\n\n/**\n * Transform a raw manifest response, unwrapping the `{ manifest }` envelope.\n * Convenience wrapper matching the `RepAppManifest` type.\n */\nexport function transformRawManifest(\n response: RawManifestResponse,\n): RepAppManifest {\n return {\n manifest: transformManifestToRepAppData(response),\n };\n}\n","import { useQuery, type UseQueryResult } from \"@tanstack/react-query\";\nimport { createPersister } from \"@fluid-app/query-persister\";\nimport { useAppDefinitionApi } from \"@fluid-app/portal-core/app-definition-api-context\";\nimport type { AppDefinitionApi } from \"@fluid-app/portal-core/app-definition-api\";\nimport { useCompanyScopedQueryKey } from \"./query-keys\";\nimport { transformManifestToRepAppData, toRawManifest } from \"../transforms\";\nimport type { RawManifestResponse } from \"../transforms\";\nimport type { RepAppData } from \"@fluid-app/portal-core/types\";\n\n/**\n * Base query key for full app data (rendered manifest endpoint).\n * Kept for backwards compatibility — the runtime key used by the hook\n * includes a company prefix via {@link useCompanyScopedQueryKey}.\n */\nexport const APP_DATA_QUERY_KEY = [\"fluid\", \"app\"] as const;\n\n/**\n * Fetch the raw rendered manifest via the portal-tenant BFF adapter.\n * Shared by `useFluidApp` and `useFluidProfile` to avoid drift.\n */\nexport async function fetchRawManifest(\n api: AppDefinitionApi,\n): Promise<RawManifestResponse> {\n const response = await api.fetchManifest();\n return toRawManifest(response);\n}\n\ntype BundlerImportMeta = ImportMeta & {\n readonly env?: {\n readonly DEV?: boolean;\n };\n};\n\nconst isViteDevelopmentBuild =\n (import.meta as BundlerImportMeta).env?.DEV === true;\n\n/**\n * Module-level persister instance (browser only).\n * Created once when the module loads so all calls to useFluidApp share\n * the same IndexedDB connection. Applied at the query level so it works\n * regardless of which QueryClient the app provides.\n */\nconst appDataPersister =\n typeof window !== \"undefined\" && !isViteDevelopmentBuild\n ? createPersister()\n : undefined;\n\n/**\n * Hook to fetch the full portal app data from the rendered-manifest endpoint.\n *\n * Returns a `RepAppData` object containing:\n * - `screens` — all screen definitions with normalized component trees\n * - `profile.themes` — fully-transformed ThemeDefinition[] (handles legacy + new formats)\n * - `profile.activeThemeId` — the currently active theme ID\n * - `profile.navigation.navigation_items` — sorted, recursive navigation tree\n *\n * Uses IndexedDB persistence so subsequent page loads hydrate instantly\n * from cache while revalidating in the background. The raw API response\n * (plain JSON) is cached; Color objects are recreated from cache via\n * `select` on every restore — this is fast (CPU only, no network).\n *\n * @example\n * ```tsx\n * function App() {\n * const { data: appData, isLoading } = useFluidApp();\n *\n * if (isLoading) return <Spinner />;\n *\n * return (\n * <AppShell\n * appData={appData}\n * navigation={appData.profile.navigation.navigation_items}\n * />\n * );\n * }\n * ```\n */\nexport function useFluidApp(options?: {\n enabled?: boolean;\n}): UseQueryResult<RepAppData> {\n const appDefinitionApi = useAppDefinitionApi();\n const { scopeKey } = useCompanyScopedQueryKey();\n\n return useQuery<\n RawManifestResponse,\n Error,\n RepAppData,\n readonly (string | number)[]\n >({\n queryKey: scopeKey(APP_DATA_QUERY_KEY),\n queryFn: () => fetchRawManifest(appDefinitionApi),\n select: transformManifestToRepAppData,\n ...(appDataPersister && { persister: appDataPersister.persisterFn }),\n ...(options?.enabled !== undefined && { enabled: options.enabled }),\n });\n}\n","import { useMemo, useRef } from \"react\";\nimport type { RemoteDomSerializableValue } from \"@fluid-app/widget-runtime/remote-dom\";\nimport type { AccountRep } from \"@fluid-app/portal-core/account-types\";\nimport type { Store } from \"@fluid-app/portal-core/store-types\";\nimport type { NavigationItem, RepAppData } from \"@fluid-app/portal-core/types\";\nimport { useAccount } from \"../hooks/use-account\";\nimport { useFluidApp } from \"../hooks/use-fluid-app\";\nimport { useStore } from \"../hooks/use-store\";\nimport type { AppNavigationContextValue } from \"../shell/AppNavigationContext\";\n\nexport interface RemoteDomBuiltInCapabilityRequest {\n readonly capability: string;\n readonly capabilityVersion: string;\n readonly method: string;\n readonly payload?: RemoteDomSerializableValue;\n}\n\nexport type RemoteDomBuiltInCapabilityResult =\n | { readonly handled: false }\n | {\n readonly handled: true;\n readonly value: RemoteDomSerializableValue;\n };\n\ntype RemoteDomQueryResultLike<TData> = {\n readonly data: TData | undefined;\n readonly refetch: () => Promise<{ readonly data: TData | undefined }>;\n};\n\nexport interface PortalRemoteDomCapabilityState {\n readonly account: RemoteDomQueryResultLike<AccountRep>;\n readonly store: RemoteDomQueryResultLike<Store>;\n readonly fluidApp: RemoteDomQueryResultLike<RepAppData>;\n readonly appNavigation: AppNavigationContextValue | null;\n}\n\nexport type RemoteDomBuiltInCapabilityHost = (\n request: RemoteDomBuiltInCapabilityRequest,\n) => Promise<RemoteDomBuiltInCapabilityResult>;\n\nexport type PortalFunctionHostErrorCode =\n | \"INVALID_ARGUMENT\"\n | \"INVALID_RESPONSE\"\n | \"NOT_DECLARED\"\n | \"UNAVAILABLE\"\n | \"UNSUPPORTED\"\n | \"HOST_FAILURE\";\n\ntype BuiltInCapability =\n | \"account\"\n | \"store\"\n | \"fluidApp\"\n | \"fluidProfile\"\n | \"appNavigation\"\n | \"tenantClient\"\n | \"fullscreen\";\n\nconst BUILT_IN_CAPABILITY_BY_NAME: Readonly<Record<string, BuiltInCapability>> =\n {\n account: \"account\",\n store: \"store\",\n fluidApp: \"fluidApp\",\n fluidProfile: \"fluidProfile\",\n appNavigation: \"appNavigation\",\n tenantClient: \"tenantClient\",\n fullscreen: \"fullscreen\",\n };\n\nconst MAX_SUMMARY_ENTRIES = 20;\nconst MAX_NAVIGATION_TARGET_LENGTH = 2048;\nconst FALLBACK_NAVIGATION_ORIGIN = \"https://portal-sdk.remote-dom.invalid\";\nconst ABSOLUTE_URL_SCHEME_PATTERN = /^[a-z][a-z\\d+.-]*:/iu;\nconst PERCENT_ENCODED_C0_OR_DEL_PATTERN = /%(?:[01][0-9A-F]|7F)/iu;\n\nexport function isPortalRemoteDomBuiltInCapability(\n capability: string,\n): boolean {\n return Object.prototype.hasOwnProperty.call(\n BUILT_IN_CAPABILITY_BY_NAME,\n capability,\n );\n}\n\nexport function assertPortalRemoteDomBuiltInCapabilityVersion(\n capability: string,\n version: string,\n): void {\n if (!isPortalRemoteDomBuiltInCapability(capability) || version === \"1\") {\n return;\n }\n\n throwPortalFunctionHostError(\n \"UNSUPPORTED\",\n `Portal SDK capability \"${capability}\" does not support version \"${version}\"; expected version \"1\".`,\n );\n}\n\nexport function usePortalRemoteDomBuiltInCapabilityHost(\n appNavigation: AppNavigationContextValue | null,\n): RemoteDomBuiltInCapabilityHost {\n const account = useAccount();\n const store = useStore();\n const fluidApp = useFluidApp();\n const stateRef = useRef<PortalRemoteDomCapabilityState>({\n account,\n store,\n fluidApp,\n appNavigation,\n });\n stateRef.current = { account, store, fluidApp, appNavigation };\n\n return useMemo(\n () => createPortalRemoteDomBuiltInCapabilityHost(() => stateRef.current),\n [],\n );\n}\n\nexport function createPortalRemoteDomBuiltInCapabilityHost(\n readState: () => PortalRemoteDomCapabilityState,\n): RemoteDomBuiltInCapabilityHost {\n return async (request) => {\n if (!isPortalRemoteDomBuiltInCapability(request.capability)) {\n return { handled: false };\n }\n const capability = BUILT_IN_CAPABILITY_BY_NAME[request.capability];\n if (!capability) {\n throw new Error(\n `Portal SDK capability \"${request.capability}\" has no built-in host mapping.`,\n );\n }\n\n assertPortalRemoteDomBuiltInCapabilityVersion(\n request.capability,\n request.capabilityVersion,\n );\n\n const state = readState();\n switch (capability) {\n case \"account\": {\n assertGetMethod(request);\n return handled(summarizeAccount(await resolveQueryData(state.account)));\n }\n case \"store\": {\n assertGetMethod(request);\n return handled(summarizeStore(await resolveQueryData(state.store)));\n }\n case \"fluidApp\": {\n assertGetMethod(request);\n return handled(\n summarizeFluidApp(await resolveQueryData(state.fluidApp)),\n );\n }\n case \"fluidProfile\": {\n assertGetMethod(request);\n const app = await resolveQueryData(state.fluidApp);\n return handled(summarizeFluidProfile(app.profile));\n }\n case \"appNavigation\":\n return handled(dispatchNavigation(request, state.appNavigation));\n case \"tenantClient\":\n throwPortalFunctionHostError(\n \"UNSUPPORTED\",\n \"Portal tenant client methods are not available to Remote DOM widgets. Authenticated fetch is intentionally not exposed through the capability bridge.\",\n );\n case \"fullscreen\":\n throwPortalFunctionHostError(\n \"HOST_FAILURE\",\n 'The \"fullscreen\" capability must be handled through the dedicated fullscreen host boundary.',\n );\n }\n };\n}\n\nfunction handled(\n value: RemoteDomSerializableValue,\n): RemoteDomBuiltInCapabilityResult {\n return { handled: true, value };\n}\n\nfunction assertGetMethod(request: RemoteDomBuiltInCapabilityRequest): void {\n if (request.method === \"get\") return;\n throwUnsupportedMethod(request);\n}\n\nasync function resolveQueryData<TData>(\n query: RemoteDomQueryResultLike<TData>,\n): Promise<TData> {\n if (query.data !== undefined) return query.data;\n\n let result: Awaited<ReturnType<typeof query.refetch>>;\n try {\n result = await query.refetch();\n } catch {\n throwPortalFunctionHostError(\n \"UNAVAILABLE\",\n \"Portal SDK capability data is currently unavailable.\",\n );\n }\n if (result.data !== undefined) return result.data;\n\n throwPortalFunctionHostError(\n \"UNAVAILABLE\",\n \"Portal SDK capability data is currently unavailable.\",\n );\n}\n\nfunction summarizeAccount(value: AccountRep): RemoteDomSerializableValue {\n return {\n id: value.id,\n publicId: value.public_id,\n memberType: value.member_type,\n firstName: value.first_name,\n lastName: value.last_name,\n displayName: [value.first_name, value.last_name].filter(Boolean).join(\" \"),\n email: value.email,\n bio: value.bio,\n avatarUrl: value.avatar_url,\n slug: value.slug,\n socialLinks: value.social_links,\n defaultCountryIso: value.default_country_iso,\n marketCountryIso: value.market_country_iso,\n };\n}\n\nfunction summarizeStore(value: Store): RemoteDomSerializableValue {\n return {\n id: value.id,\n name: value.name,\n subdomain: value.subdomain,\n logoUrl: value.logo_url,\n iconUrl: value.icon_url,\n appStoreUrl: value.appstore_url,\n playStoreUrl: value.playstore_url,\n bundleSubscriptionsEnabled: value.bundle_subscriptions_enabled,\n rewardPointsLabelSingular: value.reward_points_label_singular,\n rewardPointsLabelPlural: value.reward_points_label_plural,\n };\n}\n\nfunction summarizeFluidApp(value: RepAppData): RemoteDomSerializableValue {\n return {\n definitionId: value.definition_id ?? null,\n publishedVersion: value.published_version ?? null,\n profile: summarizeFluidProfile(value.profile),\n screens: summarizeCollection(value.screens, summarizeScreen),\n };\n}\n\nfunction summarizeFluidProfile(\n value: RepAppData[\"profile\"],\n): RemoteDomSerializableValue {\n return {\n name: value.name,\n definitionId: value.definition_id,\n activeThemeId: value.activeThemeId ?? null,\n themes: summarizeCollection(value.themes, summarizeNamedEntity),\n navigation: summarizeNavigation(value.navigation),\n mobileNavigation: summarizeNavigation(value.mobile_navigation),\n };\n}\n\nfunction summarizeCollection(\n value: unknown,\n summarizeItem: (item: unknown) => RemoteDomSerializableValue,\n): RemoteDomSerializableValue {\n if (!Array.isArray(value)) return { count: 0, items: [] };\n return {\n count: value.length,\n items: value.slice(0, MAX_SUMMARY_ENTRIES).map(summarizeItem),\n };\n}\n\nfunction summarizeNamedEntity(value: unknown): RemoteDomSerializableValue {\n if (!isRecord(value)) return null;\n return {\n id: toNullableEntityId(value.id),\n definitionId: toNullableEntityId(value.definition_id),\n name: typeof value.name === \"string\" ? value.name : null,\n slug: typeof value.slug === \"string\" ? value.slug : null,\n };\n}\n\nfunction summarizeScreen(value: unknown): RemoteDomSerializableValue {\n if (!isRecord(value)) return null;\n return {\n id: toNullableEntityId(value.id),\n definitionId: toNullableEntityId(value.definition_id),\n name: typeof value.name === \"string\" ? value.name : null,\n slug: typeof value.slug === \"string\" ? value.slug : null,\n componentCount: Array.isArray(value.components)\n ? value.components.length\n : Array.isArray(value.component_tree)\n ? value.component_tree.length\n : 0,\n };\n}\n\nfunction summarizeNavigation(\n value: unknown,\n): RemoteDomSerializableValue | null {\n if (!isRecord(value)) return null;\n return {\n id: toNullableEntityId(value.id),\n definitionId: toNullableEntityId(value.definition_id),\n name: typeof value.name === \"string\" ? value.name : null,\n navigationItemCount: Array.isArray(value.navigation_items)\n ? value.navigation_items.length\n : 0,\n screenCount: Array.isArray(value.screens) ? value.screens.length : 0,\n };\n}\n\nfunction dispatchNavigation(\n request: RemoteDomBuiltInCapabilityRequest,\n navigation: AppNavigationContextValue | null,\n): RemoteDomSerializableValue {\n if (!navigation) {\n throwPortalFunctionHostError(\n \"UNAVAILABLE\",\n 'Portal SDK capability \"appNavigation\" is unavailable outside an AppNavigationProvider.',\n );\n }\n\n switch (request.method) {\n case \"get\":\n return {\n currentSlug: navigation.currentSlug,\n previousSlug: navigation.previousSlug,\n basePath: navigation.basePath,\n navItems: navigation.navItems.map(summarizeNavigationItem),\n };\n case \"buildHref\": {\n const slug = readNavigationTarget(request, navigation.basePath);\n return navigation.buildHref(slug);\n }\n case \"navigate\": {\n const slug = readNavigationTarget(request, navigation.basePath);\n navigation.navigate(slug);\n return null;\n }\n default:\n throwUnsupportedMethod(request);\n }\n}\n\nfunction readNavigationTarget(\n request: RemoteDomBuiltInCapabilityRequest,\n basePath: string,\n): string {\n if (typeof request.payload === \"string\") {\n return normalizeNavigationSlug(request.payload, request);\n }\n\n if (!isRecord(request.payload)) {\n throwInvalidNavigationPayload(\n request,\n \"requires an object payload with exactly one string slug or href field.\",\n );\n }\n\n const slug =\n typeof request.payload.slug === \"string\" ? request.payload.slug : undefined;\n const href =\n typeof request.payload.href === \"string\" ? request.payload.href : undefined;\n if ((slug === undefined) === (href === undefined)) {\n throwInvalidNavigationPayload(\n request,\n \"requires exactly one string slug or href field.\",\n );\n }\n\n if (slug !== undefined) return normalizeNavigationSlug(slug, request);\n if (href !== undefined) {\n return normalizeNavigationHref(href, basePath, request);\n }\n\n throwInvalidNavigationPayload(\n request,\n \"requires exactly one string slug or href field.\",\n );\n}\n\nfunction normalizeNavigationSlug(\n slug: string,\n request: RemoteDomBuiltInCapabilityRequest,\n): string {\n validateNavigationText(slug, \"slug\", request);\n if (\n slug.startsWith(\"/\") ||\n slug.startsWith(\"//\") ||\n ABSOLUTE_URL_SCHEME_PATTERN.test(slug)\n ) {\n throwInvalidNavigationPayload(\n request,\n \"slug must be a relative app route, not an absolute URL or root path.\",\n );\n }\n assertSafeNavigationSegments(slug, request);\n\n let parsed: URL;\n try {\n parsed = new URL(slug, navigationBaseUrl());\n } catch {\n throwInvalidNavigationPayload(request, \"slug is not a valid URL path.\");\n }\n if (parsed.origin !== navigationBaseUrl().origin) {\n throwInvalidNavigationPayload(request, \"slug must remain within the app.\");\n }\n\n const normalized = `${parsed.pathname.replace(/^\\/+/, \"\")}${parsed.search}${parsed.hash}`;\n if (normalized === \"\" || /^[?#]/u.test(normalized)) {\n throwInvalidNavigationPayload(request, \"slug must include an app route.\");\n }\n return normalized;\n}\n\nfunction normalizeNavigationHref(\n href: string,\n basePath: string,\n request: RemoteDomBuiltInCapabilityRequest,\n): string {\n validateNavigationText(href, \"href\", request);\n let parsed: URL;\n try {\n parsed = new URL(href, navigationBaseUrl());\n } catch {\n throwInvalidNavigationPayload(request, \"href is not a valid URL.\");\n }\n if (\n parsed.origin !== navigationBaseUrl().origin ||\n parsed.username !== \"\" ||\n parsed.password !== \"\"\n ) {\n throwInvalidNavigationPayload(\n request,\n \"href must be same-origin and must not include credentials.\",\n );\n }\n\n const normalizedBasePath = normalizeBasePath(basePath);\n const slugPath =\n normalizedBasePath === \"/\"\n ? parsed.pathname.replace(/^\\/+/, \"\")\n : readSlugFromBasePath(parsed.pathname, normalizedBasePath, request);\n return normalizeNavigationSlug(\n `${slugPath}${parsed.search}${parsed.hash}`,\n request,\n );\n}\n\nfunction validateNavigationText(\n value: string,\n field: \"slug\" | \"href\",\n request: RemoteDomBuiltInCapabilityRequest,\n): void {\n if (value.length === 0) {\n throwInvalidNavigationPayload(request, `${field} must not be empty.`);\n }\n if (value.length > MAX_NAVIGATION_TARGET_LENGTH) {\n throwInvalidNavigationPayload(\n request,\n `${field} exceeds the ${MAX_NAVIGATION_TARGET_LENGTH} character limit.`,\n );\n }\n if (\n containsControlCharacter(value) ||\n PERCENT_ENCODED_C0_OR_DEL_PATTERN.test(value) ||\n value.includes(\"\\\\\")\n ) {\n throwInvalidNavigationPayload(\n request,\n `${field} contains unsupported characters.`,\n );\n }\n}\n\nfunction assertSafeNavigationSegments(\n value: string,\n request: RemoteDomBuiltInCapabilityRequest,\n): void {\n const path = value.split(/[?#]/u, 1)[0] ?? \"\";\n for (const segment of path.split(\"/\")) {\n let decoded: string;\n try {\n decoded = decodeURIComponent(segment);\n } catch {\n throwInvalidNavigationPayload(\n request,\n \"navigation path contains malformed percent encoding.\",\n );\n }\n if (\n decoded === \".\" ||\n decoded === \"..\" ||\n decoded.includes(\"/\") ||\n decoded.includes(\"\\\\\")\n ) {\n throwInvalidNavigationPayload(\n request,\n \"navigation path contains an unsafe segment.\",\n );\n }\n }\n}\n\nfunction normalizeBasePath(basePath: string): string {\n const trimmed = basePath.trim();\n if (trimmed === \"\" || trimmed === \"/\") return \"/\";\n return `/${trimmed.replace(/^\\/+|\\/+$/gu, \"\")}`;\n}\n\nfunction readSlugFromBasePath(\n pathname: string,\n basePath: string,\n request: RemoteDomBuiltInCapabilityRequest,\n): string {\n if (pathname === basePath) {\n throwInvalidNavigationPayload(request, \"href must include an app route.\");\n }\n const prefix = `${basePath}/`;\n if (!pathname.startsWith(prefix)) {\n throwInvalidNavigationPayload(\n request,\n `href must remain within the portal base path \"${basePath}\".`,\n );\n }\n return pathname.slice(prefix.length);\n}\n\nfunction navigationBaseUrl(): URL {\n return new URL(\n typeof window === \"undefined\"\n ? FALLBACK_NAVIGATION_ORIGIN\n : window.location.origin,\n );\n}\n\nfunction containsControlCharacter(value: string): boolean {\n for (let index = 0; index < value.length; index += 1) {\n const codeUnit = value.charCodeAt(index);\n if (codeUnit <= 0x1f || codeUnit === 0x7f) return true;\n }\n return false;\n}\n\nfunction throwUnsupportedMethod(\n request: RemoteDomBuiltInCapabilityRequest,\n): never {\n throwPortalFunctionHostError(\n \"UNSUPPORTED\",\n `Portal SDK capability \"${request.capability}\" does not support method \"${request.method}\".`,\n );\n}\n\nfunction throwInvalidNavigationPayload(\n request: RemoteDomBuiltInCapabilityRequest,\n reason: string,\n): never {\n throwPortalFunctionHostError(\n \"INVALID_ARGUMENT\",\n `Portal SDK capability \"${request.capability}.${request.method}\" ${reason}`,\n );\n}\n\nexport function throwPortalFunctionHostError(\n code: PortalFunctionHostErrorCode,\n message: string,\n): never {\n throw new Error(`PORTAL_FUNCTION_ERROR:${code}:${message}`);\n}\n\nfunction isRecord(value: unknown): value is Record<string, unknown> {\n return typeof value === \"object\" && value !== null && !Array.isArray(value);\n}\n\nfunction toNullableEntityId(value: unknown): string | number | null {\n return typeof value === \"string\" || typeof value === \"number\" ? value : null;\n}\n\nfunction summarizeNavigationItem(\n value: NavigationItem,\n): RemoteDomSerializableValue {\n return {\n id: value.id ?? null,\n label: value.label,\n slug: value.slug ?? null,\n icon: value.icon ?? null,\n section: value.section ?? null,\n screenId: value.screen_id ?? null,\n position: value.position ?? null,\n parentId: value.parent_id ?? null,\n source: value.source ?? null,\n children: value.children.map(summarizeNavigationItem),\n };\n}\n","import type {\n RemoteDomFullscreenRequest,\n RemoteDomSerializableValue,\n} from \"@fluid-app/widget-runtime/remote-dom\";\nimport { throwPortalFunctionHostError } from \"./remote-dom-built-in-capability-host\";\n\nconst WIDGET_FRAME_SELECTOR = \"[data-fluid-remote-dom-widget-frame]\";\nconst SCREEN_BODY_SELECTOR = \"[data-fluid-portal-screen-body]\";\nconst SCREEN_AREA_SELECTOR = \"[data-fluid-portal-screen-area]\";\n\nexport type ScreenAreaFullscreenOwner = symbol;\nexport type ScreenAreaFullscreenObserver = (\n request: RemoteDomFullscreenRequest,\n) => void | Promise<void>;\n\nexport interface ScreenAreaFullscreenSnapshot {\n readonly owner: ScreenAreaFullscreenOwner;\n readonly displayName: string;\n}\n\nexport interface ScreenAreaFullscreenCoordinator {\n readonly getSnapshot: () => ScreenAreaFullscreenSnapshot | null;\n readonly subscribe: (listener: () => void) => () => void;\n readonly enter: (\n owner: ScreenAreaFullscreenOwner,\n displayName: string,\n host: HTMLElement,\n ) => void;\n readonly exit: (owner?: ScreenAreaFullscreenOwner) => void;\n readonly disposeOwner: (owner: ScreenAreaFullscreenOwner) => void;\n readonly destroy: () => void;\n readonly isActive: (owner: ScreenAreaFullscreenOwner) => boolean;\n readonly isAvailable: (host: HTMLElement) => boolean;\n}\n\ninterface FullscreenBoundary {\n readonly frame: HTMLElement;\n readonly body: HTMLElement;\n readonly screenArea: HTMLElement;\n}\n\ninterface InertRecord {\n readonly element: HTMLElement;\n readonly inert: boolean;\n}\n\ninterface AttributeRecord {\n readonly element: HTMLElement;\n readonly name: string;\n readonly value: string | null;\n}\n\ninterface StylePropertyRecord {\n readonly element: HTMLElement;\n readonly name: string;\n readonly value: string;\n readonly priority: string;\n}\n\ninterface ActiveSession extends ScreenAreaFullscreenSnapshot {\n readonly boundary: FullscreenBoundary;\n readonly inertRecords: readonly InertRecord[];\n readonly attributeRecords: readonly AttributeRecord[];\n readonly styleRecords: readonly StylePropertyRecord[];\n readonly previousFocus: FocusableElement | null;\n readonly scrollLeft: number;\n readonly scrollTop: number;\n readonly stopTrackingBounds: () => void;\n}\n\ntype FocusableElement = Element & {\n focus(options?: FocusOptions): void;\n};\n\n/**\n * Coordinates one host-owned fullscreen session within a portal screen.\n * \"Fullscreen\" deliberately means the screen body below ScreenHeader, never\n * the browser Fullscreen API or the whole viewport.\n */\nexport function createScreenAreaFullscreenCoordinator(): ScreenAreaFullscreenCoordinator {\n let activeSession: ActiveSession | null = null;\n let snapshot: ScreenAreaFullscreenSnapshot | null = null;\n const listeners = new Set<() => void>();\n\n const emit = (next: ScreenAreaFullscreenSnapshot | null): void => {\n snapshot = next;\n for (const listener of listeners) listener();\n };\n\n const endActiveSession = (\n focusMode: \"restore\" | \"defer-after-disposal\" | \"none\",\n ): void => {\n const session = activeSession;\n if (!session) return;\n\n activeSession = null;\n session.stopTrackingBounds();\n restoreStyleProperties(session.styleRecords);\n restoreAttributes(session.attributeRecords);\n restoreInertStates(session.inertRecords);\n session.boundary.screenArea.scrollLeft = session.scrollLeft;\n session.boundary.screenArea.scrollTop = session.scrollTop;\n emit(null);\n\n if (focusMode === \"restore\") {\n focusSessionTarget(session);\n } else if (focusMode === \"defer-after-disposal\") {\n scheduleFocusAfterOwnerDisposal(session);\n }\n };\n\n return {\n getSnapshot: () => snapshot,\n subscribe: (listener) => {\n listeners.add(listener);\n return () => listeners.delete(listener);\n },\n enter: (owner, displayName, host) => {\n const boundary = findFullscreenBoundary(host);\n if (!boundary) {\n throwPortalFunctionHostError(\n \"UNSUPPORTED\",\n \"Fullscreen is not available outside a portal screen body.\",\n );\n }\n\n if (activeSession?.owner === owner) {\n updateFrameBounds(boundary.frame, boundary.body);\n return;\n }\n\n const previousFocus =\n activeSession?.previousFocus ??\n getDeepActiveElement(host.ownerDocument);\n endActiveSession(\"none\");\n\n const inertRecords = isolateActiveBranch(boundary.frame, boundary.body);\n const attributeRecords = setSessionAttributes(boundary, displayName);\n const styleRecords = recordFrameBoundsStyles(boundary.frame);\n const scrollLeft = boundary.screenArea.scrollLeft;\n const scrollTop = boundary.screenArea.scrollTop;\n boundary.screenArea.scrollLeft = 0;\n boundary.screenArea.scrollTop = 0;\n const stopTrackingBounds = trackFrameBounds(\n boundary.frame,\n boundary.body,\n );\n\n activeSession = {\n owner,\n displayName,\n boundary,\n inertRecords,\n attributeRecords,\n styleRecords,\n previousFocus,\n scrollLeft,\n scrollTop,\n stopTrackingBounds,\n };\n emit({ owner, displayName });\n },\n exit: (owner) => {\n if (owner !== undefined && activeSession?.owner !== owner) return;\n endActiveSession(\"restore\");\n },\n disposeOwner: (owner) => {\n if (activeSession?.owner === owner) {\n endActiveSession(\"defer-after-disposal\");\n }\n },\n destroy: () => {\n endActiveSession(\"none\");\n listeners.clear();\n },\n isActive: (owner) => activeSession?.owner === owner,\n isAvailable: (host) => findFullscreenBoundary(host) !== null,\n };\n}\n\nexport async function handleScreenAreaRemoteDomFullscreenRequest(\n coordinator: ScreenAreaFullscreenCoordinator | null,\n owner: ScreenAreaFullscreenOwner,\n displayName: string,\n request: RemoteDomFullscreenRequest,\n observe?: ScreenAreaFullscreenObserver,\n): Promise<RemoteDomSerializableValue> {\n switch (request.method) {\n case \"get\": {\n await observe?.(request);\n return {\n fullscreen: coordinator?.isActive(owner) ?? false,\n available: coordinator?.isAvailable(request.host) ?? false,\n };\n }\n case \"request\": {\n if (!coordinator || !coordinator.isAvailable(request.host)) {\n throwPortalFunctionHostError(\n \"UNSUPPORTED\",\n \"Fullscreen is not available outside a portal screen body.\",\n );\n }\n await observe?.(request);\n coordinator.enter(owner, displayName, request.host);\n return null;\n }\n case \"exit\":\n await observe?.(request);\n coordinator?.exit(owner);\n return null;\n default:\n throwPortalFunctionHostError(\n \"UNSUPPORTED\",\n `Portal SDK capability \"fullscreen\" does not support method \"${request.method}\".`,\n );\n }\n}\n\nfunction focusSessionTarget(session: ActiveSession): void {\n const target =\n session.previousFocus?.isConnected === true\n ? session.previousFocus\n : findStableFocusFallback(session.boundary);\n target?.focus({ preventScroll: true });\n}\n\nfunction scheduleFocusAfterOwnerDisposal(session: ActiveSession): void {\n const document = session.boundary.frame.ownerDocument;\n const previousFocusWasInFrame = session.previousFocus\n ? isComposedDescendant(session.boundary.frame, session.previousFocus)\n : false;\n const view = document.defaultView;\n const schedule = view\n ? (callback: () => void): void => {\n view.setTimeout(callback, 0);\n }\n : (callback: () => void): void => queueMicrotask(callback);\n\n schedule(() => {\n const currentFocus = getDeepActiveElement(document);\n if (\n currentFocus?.isConnected &&\n currentFocus !== document.body &&\n !isComposedDescendant(session.boundary.frame, currentFocus)\n ) {\n return;\n }\n\n const target =\n !previousFocusWasInFrame && session.previousFocus?.isConnected\n ? session.previousFocus\n : findStableFocusFallback(session.boundary);\n target?.focus({ preventScroll: true });\n });\n}\n\nfunction findStableFocusFallback(\n boundary: FullscreenBoundary,\n): FocusableElement | null {\n const header = boundary.body.parentElement?.querySelector<HTMLElement>(\n \"[data-fluid-screen-header]\",\n );\n return header ?? boundary.screenArea;\n}\n\nfunction isComposedDescendant(ancestor: Node, element: Element): boolean {\n let current: Node | null = element;\n while (current) {\n if (current === ancestor) return true;\n const root = current.getRootNode();\n current =\n root instanceof ShadowRoot && root !== current\n ? root.host\n : current.parentNode;\n }\n return false;\n}\n\nfunction findFullscreenBoundary(host: HTMLElement): FullscreenBoundary | null {\n const frame = host.closest<HTMLElement>(WIDGET_FRAME_SELECTOR);\n const body = frame?.closest<HTMLElement>(SCREEN_BODY_SELECTOR);\n const screenArea = body?.closest<HTMLElement>(SCREEN_AREA_SELECTOR);\n return frame && body && screenArea ? { frame, body, screenArea } : null;\n}\n\nfunction isolateActiveBranch(\n frame: HTMLElement,\n body: HTMLElement,\n): readonly InertRecord[] {\n const records: InertRecord[] = [];\n let current: HTMLElement = frame;\n\n while (current !== body) {\n const parent = current.parentElement;\n if (!parent) break;\n for (const sibling of parent.children) {\n if (sibling === current || !(sibling instanceof HTMLElement)) continue;\n records.push({ element: sibling, inert: sibling.inert });\n sibling.inert = true;\n }\n current = parent;\n }\n\n return records;\n}\n\nfunction restoreInertStates(records: readonly InertRecord[]): void {\n for (const { element, inert } of records) element.inert = inert;\n}\n\nfunction setSessionAttributes(\n boundary: FullscreenBoundary,\n displayName: string,\n): readonly AttributeRecord[] {\n const changes = [\n [boundary.frame, \"data-fluid-remote-dom-widget-fullscreen\", \"\"],\n [boundary.frame, \"role\", \"region\"],\n [boundary.frame, \"aria-label\", displayName],\n [boundary.body, \"data-fluid-portal-fullscreen-active\", \"\"],\n [boundary.screenArea, \"data-fluid-portal-fullscreen-active\", \"\"],\n ] as const;\n\n return changes.map(([element, name, value]) => {\n const record = { element, name, value: element.getAttribute(name) };\n element.setAttribute(name, value);\n return record;\n });\n}\n\nfunction restoreAttributes(records: readonly AttributeRecord[]): void {\n for (const { element, name, value } of records) {\n if (value === null) element.removeAttribute(name);\n else element.setAttribute(name, value);\n }\n}\n\nconst FRAME_BOUND_STYLE_PROPERTIES = [\n \"--fluid-portal-fullscreen-top\",\n \"--fluid-portal-fullscreen-left\",\n \"--fluid-portal-fullscreen-width\",\n \"--fluid-portal-fullscreen-height\",\n] as const;\n\nfunction recordFrameBoundsStyles(\n frame: HTMLElement,\n): readonly StylePropertyRecord[] {\n return FRAME_BOUND_STYLE_PROPERTIES.map((name) => ({\n element: frame,\n name,\n value: frame.style.getPropertyValue(name),\n priority: frame.style.getPropertyPriority(name),\n }));\n}\n\nfunction restoreStyleProperties(records: readonly StylePropertyRecord[]): void {\n for (const { element, name, value, priority } of records) {\n if (value) element.style.setProperty(name, value, priority);\n else element.style.removeProperty(name);\n }\n}\n\nfunction trackFrameBounds(frame: HTMLElement, body: HTMLElement): () => void {\n const update = (): void => updateFrameBounds(frame, body);\n update();\n\n const view = body.ownerDocument.defaultView;\n view?.addEventListener(\"resize\", update);\n const observer =\n typeof ResizeObserver === \"undefined\" ? null : new ResizeObserver(update);\n observer?.observe(body);\n\n return () => {\n view?.removeEventListener(\"resize\", update);\n observer?.disconnect();\n };\n}\n\nfunction updateFrameBounds(frame: HTMLElement, body: HTMLElement): void {\n const bounds = body.getBoundingClientRect();\n frame.style.setProperty(\"--fluid-portal-fullscreen-top\", `${bounds.top}px`);\n frame.style.setProperty(\"--fluid-portal-fullscreen-left\", `${bounds.left}px`);\n frame.style.setProperty(\n \"--fluid-portal-fullscreen-width\",\n `${bounds.width}px`,\n );\n frame.style.setProperty(\n \"--fluid-portal-fullscreen-height\",\n `${bounds.height}px`,\n );\n}\n\nfunction getDeepActiveElement(document: Document): FocusableElement | null {\n let active: Element | null = document.activeElement;\n while (active?.shadowRoot?.activeElement) {\n active = active.shadowRoot.activeElement;\n }\n return active && \"focus\" in active ? (active as FocusableElement) : null;\n}\n","import {\n createContext,\n type ReactNode,\n use,\n useEffect,\n useRef,\n useSyncExternalStore,\n} from \"react\";\nimport {\n createScreenAreaFullscreenCoordinator,\n type ScreenAreaFullscreenCoordinator,\n type ScreenAreaFullscreenSnapshot,\n} from \"../widgets/screen-area-fullscreen-host\";\n\nconst ScreenAreaFullscreenContext =\n createContext<ScreenAreaFullscreenCoordinator | null>(null);\n\nconst subscribeToNothing = (): (() => void) => () => undefined;\nconst getEmptySnapshot = (): null => null;\n\nexport function ScreenAreaFullscreenProvider({\n children,\n}: {\n readonly children: ReactNode;\n}): React.JSX.Element {\n const coordinatorRef = useRef<ScreenAreaFullscreenCoordinator | null>(null);\n if (!coordinatorRef.current) {\n coordinatorRef.current = createScreenAreaFullscreenCoordinator();\n }\n\n useEffect(() => {\n const coordinator = coordinatorRef.current;\n return () => coordinator?.destroy();\n }, []);\n\n return (\n <ScreenAreaFullscreenContext.Provider value={coordinatorRef.current}>\n {children}\n </ScreenAreaFullscreenContext.Provider>\n );\n}\n\nexport function useOptionalScreenAreaFullscreenCoordinator(): ScreenAreaFullscreenCoordinator | null {\n return use(ScreenAreaFullscreenContext);\n}\n\nexport function useScreenAreaFullscreenSnapshot(): ScreenAreaFullscreenSnapshot | null {\n const coordinator = useOptionalScreenAreaFullscreenCoordinator();\n return useSyncExternalStore(\n coordinator?.subscribe ?? subscribeToNothing,\n coordinator?.getSnapshot ?? getEmptySnapshot,\n getEmptySnapshot,\n );\n}\n","import { createRoot, type Root } from \"react-dom/client\";\nimport { SpacerWidget } from \"./widgets/SpacerWidget\";\n\nexport const FLUID_SPACER_WIDGET_TAG_NAME = \"fluid-spacer-widget\";\n\n/** Registers the one portal-widgets element available to remote workers. */\nexport function registerFluidSpacerWidgetElement(): void {\n if (\n typeof customElements === \"undefined\" ||\n typeof HTMLElement === \"undefined\" ||\n customElements.get(FLUID_SPACER_WIDGET_TAG_NAME)\n ) {\n return;\n }\n customElements.define(\n FLUID_SPACER_WIDGET_TAG_NAME,\n createFluidSpacerWidgetElement(),\n );\n}\n\n/** Keeps browser globals lazy so importing the registry remains safe during SSR. */\nfunction createFluidSpacerWidgetElement(): CustomElementConstructor {\n return class FluidSpacerWidgetElement extends HTMLElement {\n #root: Root | undefined;\n #customHeight: string | undefined;\n #previewMode = false;\n\n set customHeight(value: unknown) {\n this.#customHeight = typeof value === \"string\" ? value : undefined;\n this.#render();\n }\n\n get customHeight(): string | undefined {\n return this.#customHeight;\n }\n\n set previewMode(value: unknown) {\n this.#previewMode = value === true;\n this.#render();\n }\n\n get previewMode(): boolean {\n return this.#previewMode;\n }\n\n connectedCallback(): void {\n this.#render();\n }\n\n disconnectedCallback(): void {\n this.#root?.unmount();\n this.#root = undefined;\n }\n\n #render(): void {\n if (!this.isConnected) return;\n this.#root ??= createRoot(this);\n this.#root.render(\n <SpacerWidget\n {...(this.#customHeight === undefined\n ? {}\n : { customHeight: this.#customHeight })}\n previewMode={this.#previewMode}\n />,\n );\n }\n };\n}\n","import { createRoot, type Root } from \"react-dom/client\";\nimport {\n SearchSort as HostSearchSort,\n type SortOption,\n} from \"@fluid-app/ui-components/components/SearchSort\";\nimport { registerFluidSpacerWidgetElement } from \"@fluid-app/portal-widgets/remote-dom-elements\";\n\nexport const FLUID_SEARCH_SORT_TAG_NAME = \"fluid-ui-search-sort\";\n\n/** Registers the two explicitly supported host-owned Remote DOM elements. */\nexport function registerRemoteDomHostElements(): void {\n registerFluidSpacerWidgetElement();\n if (\n typeof customElements === \"undefined\" ||\n typeof HTMLElement === \"undefined\" ||\n customElements.get(FLUID_SEARCH_SORT_TAG_NAME)\n ) {\n return;\n }\n customElements.define(\n FLUID_SEARCH_SORT_TAG_NAME,\n createFluidSearchSortElement(),\n );\n}\n\n/** Keeps browser globals lazy so descriptor projection remains safe during SSR. */\nfunction createFluidSearchSortElement(): CustomElementConstructor {\n return class FluidSearchSortElement extends HTMLElement {\n #root: Root | undefined;\n #searchValue = \"\";\n #placeholder: string | undefined;\n #sortOptions: readonly SortOption[] | undefined;\n #sortValue: string | undefined;\n\n set searchValue(value: unknown) {\n this.#searchValue = typeof value === \"string\" ? value : \"\";\n this.#render();\n }\n\n get searchValue(): string {\n return this.#searchValue;\n }\n\n set placeholder(value: unknown) {\n this.#placeholder = typeof value === \"string\" ? value : undefined;\n this.#render();\n }\n\n get placeholder(): string | undefined {\n return this.#placeholder;\n }\n\n set sortOptions(value: unknown) {\n this.#sortOptions = isSortOptions(value) ? value : undefined;\n this.#render();\n }\n\n get sortOptions(): readonly SortOption[] | undefined {\n return this.#sortOptions;\n }\n\n set sortValue(value: unknown) {\n this.#sortValue = typeof value === \"string\" ? value : undefined;\n this.#render();\n }\n\n get sortValue(): string | undefined {\n return this.#sortValue;\n }\n\n connectedCallback(): void {\n this.#render();\n }\n\n disconnectedCallback(): void {\n this.#root?.unmount();\n this.#root = undefined;\n }\n\n #render(): void {\n if (!this.isConnected) return;\n this.#root ??= createRoot(this);\n const onSearchChange = (value: string): void => {\n this.dispatchEvent(\n new CustomEvent(\"search-change\", {\n bubbles: true,\n composed: true,\n detail: value,\n }),\n );\n };\n const onSortChange = (value: string): void => {\n this.dispatchEvent(\n new CustomEvent(\"sort-change\", {\n bubbles: true,\n composed: true,\n detail: value,\n }),\n );\n };\n\n this.#root.render(\n this.#sortOptions && this.#sortValue !== undefined ? (\n <HostSearchSort\n searchValue={this.#searchValue}\n onSearchChange={onSearchChange}\n {...(this.#placeholder === undefined\n ? {}\n : { placeholder: this.#placeholder })}\n sortOptions={this.#sortOptions}\n sortValue={this.#sortValue}\n onSortChange={onSortChange}\n />\n ) : (\n <HostSearchSort\n searchValue={this.#searchValue}\n onSearchChange={onSearchChange}\n {...(this.#placeholder === undefined\n ? {}\n : { placeholder: this.#placeholder })}\n />\n ),\n );\n }\n };\n}\n\nfunction isSortOptions(value: unknown): value is readonly SortOption[] {\n return (\n Array.isArray(value) &&\n value.every(\n (option) =>\n typeof option === \"object\" &&\n option !== null &&\n \"label\" in option &&\n typeof option.label === \"string\" &&\n \"value\" in option &&\n typeof option.value === \"string\",\n )\n );\n}\n","import {\n createElement,\n useEffect,\n useMemo,\n useRef,\n useState,\n type ComponentType,\n type ReactElement,\n} from \"react\";\nimport {\n isJsonValue,\n type RemoteDomWidgetDefinition,\n type RemoteDomWidgetPackageDescriptor,\n} from \"@fluid-app/portal-core/remote-dom-widget-package\";\nimport type {\n RemoteDomFullscreenRequest,\n RemoteDomNavigationIntent,\n RemoteDomSerializableValue,\n RemoteDomWidgetHandle,\n} from \"@fluid-app/widget-runtime/remote-dom\";\nimport { DEFAULT_SDK_WIDGET_REGISTRY } from \"../core/default-widget-registry\";\nimport { useOptionalAppNavigation } from \"../shell/AppNavigationContext\";\nimport { useOptionalScreenAreaFullscreenCoordinator } from \"../shell/ScreenAreaFullscreenContext\";\nimport {\n assertPortalRemoteDomBuiltInCapabilityVersion,\n isPortalRemoteDomBuiltInCapability,\n throwPortalFunctionHostError,\n usePortalRemoteDomBuiltInCapabilityHost,\n} from \"../widgets/remote-dom-built-in-capability-host\";\nimport { registerRemoteDomHostElements } from \"../widgets/remote-dom-elements\";\nimport type { PortalFunctionImplementation } from \"../widgets/portal-function\";\nimport { handleScreenAreaRemoteDomFullscreenRequest } from \"../widgets/screen-area-fullscreen-host\";\n\n// oxlint-disable-next-line typescript/no-explicit-any -- widget components have heterogeneous props.\nexport type SdkWidgetRegistry = Record<string, ComponentType<any>>;\n\nexport interface RemoteDomWidgetRegistryOptions {\n readonly functions?: readonly PortalFunctionImplementation[];\n readonly onNavigate?: (intent: RemoteDomNavigationIntent) => void;\n readonly onFullscreen?: (\n request: RemoteDomFullscreenRequest,\n ) => RemoteDomSerializableValue | Promise<RemoteDomSerializableValue>;\n}\n\nexport type WidgetRegistryWarningSink = (message: string) => void;\n\ninterface AcceptedRemoteWidget {\n readonly remotePackage: RemoteDomWidgetPackageDescriptor;\n readonly widget: RemoteDomWidgetDefinition;\n readonly component: ComponentType<Readonly<Record<string, unknown>>>;\n}\n\ninterface RemoteWidgetPackageProjection {\n readonly registry: SdkWidgetRegistry;\n readonly acceptedWidgets: readonly AcceptedRemoteWidget[];\n}\n\n/**\n * Projects canonical package descriptors into host React wrappers. The first\n * accepted package/widget wins; built-ins can never be replaced.\n */\nexport function buildRemoteWidgetRegistry(\n baseRegistry: SdkWidgetRegistry,\n packages: readonly RemoteDomWidgetPackageDescriptor[],\n options: RemoteDomWidgetRegistryOptions = {},\n warn: WidgetRegistryWarningSink = console.warn,\n): SdkWidgetRegistry {\n return projectRemoteWidgetPackages(baseRegistry, packages, options, warn)\n .registry;\n}\n\n/** @internal Shared package-atomic projection for runtime and builder views. */\nexport function projectRemoteWidgetPackages(\n baseRegistry: SdkWidgetRegistry,\n packages: readonly RemoteDomWidgetPackageDescriptor[],\n options: RemoteDomWidgetRegistryOptions = {},\n warn: WidgetRegistryWarningSink = console.warn,\n): RemoteWidgetPackageProjection {\n const registry = { ...baseRegistry };\n const acceptedWidgets: AcceptedRemoteWidget[] = [];\n const packageVersions = new Set<string>();\n const functionImplementations = indexPortalFunctionImplementations(\n options.functions ?? [],\n );\n\n for (const remotePackage of packages) {\n const packageVersion = `${remotePackage.packageId}@${remotePackage.version}`;\n if (packageVersions.has(packageVersion)) {\n warn(\n `[portal-sdk] Ignoring duplicate widget package \"${packageVersion}\".`,\n );\n continue;\n }\n packageVersions.add(packageVersion);\n\n const collides = remotePackage.widgets.some(\n (widget) =>\n isBuiltInWidgetType(widget.type) ||\n Object.prototype.hasOwnProperty.call(registry, widget.type),\n );\n if (collides) {\n warn(\n `[portal-sdk] Ignoring widget package \"${packageVersion}\" because one of its widget types is already registered.`,\n );\n continue;\n }\n\n for (const widget of remotePackage.widgets) {\n const component = createRemoteWidgetComponent(\n remotePackage,\n widget,\n options,\n functionImplementations,\n );\n registry[widget.type] = component;\n acceptedWidgets.push({ remotePackage, widget, component });\n }\n }\n\n return { registry, acceptedWidgets };\n}\n\nfunction createRemoteWidgetComponent(\n remotePackage: RemoteDomWidgetPackageDescriptor,\n widget: RemoteDomWidgetDefinition,\n options: RemoteDomWidgetRegistryOptions,\n functionImplementations: ReadonlyMap<string, PortalFunctionImplementation>,\n): ComponentType<Readonly<Record<string, unknown>>> {\n function RemoteWidget(\n props: Readonly<Record<string, unknown>>,\n ): ReactElement {\n const hostRef = useRef<HTMLDivElement | null>(null);\n const handleRef = useRef<RemoteDomWidgetHandle | null>(null);\n const fullscreenOwner = useRef(Symbol(widget.type)).current;\n const fullscreenCoordinator = useOptionalScreenAreaFullscreenCoordinator();\n const fullscreenCoordinatorRef = useRef(fullscreenCoordinator);\n fullscreenCoordinatorRef.current = fullscreenCoordinator;\n const navigation = useOptionalAppNavigation();\n const navigationRef = useRef(navigation);\n navigationRef.current = navigation;\n const builtInCapabilityHost =\n usePortalRemoteDomBuiltInCapabilityHost(navigation);\n const builtInCapabilityHostRef = useRef(builtInCapabilityHost);\n builtInCapabilityHostRef.current = builtInCapabilityHost;\n const [error, setError] = useState<Error | null>(null);\n const serialization = useMemo(() => serializeProps(props), [props]);\n const serializablePropsRef = useRef<RemoteDomSerializableValue>(null);\n if (serialization.ok) serializablePropsRef.current = serialization.value;\n\n useEffect(() => {\n registerRemoteDomHostElements();\n const host = hostRef.current;\n if (!host || !serialization.ok) return;\n\n let handle: RemoteDomWidgetHandle | undefined;\n let active = true;\n void import(\"@fluid-app/widget-runtime/remote-dom\")\n .then(({ mountRemoteDomWidget }) => {\n // Cleanup flips active before disposal, so a pending import can never\n // create a handle after this effect has unmounted.\n if (!active) return;\n\n setError(null);\n handle = mountRemoteDomWidget({\n host,\n artifact: {\n packageId: remotePackage.packageId,\n version: remotePackage.version,\n widgetType: widget.type,\n workerEntryUrl: remotePackage.workerEntryUrl,\n cssUrls: remotePackage.cssUrls,\n assetUrls: remotePackage.assetUrls,\n capabilities: widget.capabilities,\n },\n props: serializablePropsRef.current,\n hostOrigin: window.location.origin,\n onNavigate: (intent) => {\n if (options.onNavigate) {\n options.onNavigate(intent);\n return;\n }\n navigationRef.current?.navigate(toNavigationSlug(intent.url));\n },\n onFullscreen: async (request) => {\n const declaration = widget.capabilities.find(\n ({ name }) => name === \"fullscreen\",\n );\n if (!declaration) {\n throwPortalFunctionHostError(\n \"NOT_DECLARED\",\n 'Widget requested undeclared capability \"fullscreen\".',\n );\n }\n assertPortalRemoteDomBuiltInCapabilityVersion(\n \"fullscreen\",\n declaration.version,\n );\n const onFullscreen = options.onFullscreen;\n const observe = onFullscreen\n ? async (observedRequest: RemoteDomFullscreenRequest) => {\n try {\n const result = await onFullscreen(observedRequest);\n if (!isJsonValue(result)) {\n throwPortalFunctionHostError(\n \"INVALID_RESPONSE\",\n 'Host implementation returned an invalid response for portal function \"fullscreen\".',\n );\n }\n } catch (error) {\n if (isPortalFunctionHostError(error)) throw error;\n throwPortalFunctionHostError(\n \"HOST_FAILURE\",\n 'Host implementation failed for portal function \"fullscreen\".',\n );\n }\n }\n : undefined;\n return handleScreenAreaRemoteDomFullscreenRequest(\n fullscreenCoordinatorRef.current,\n fullscreenOwner,\n widget.displayName,\n request,\n observe,\n );\n },\n callCapability: async (capability, method, payload) => {\n const declaration = widget.capabilities.find(\n ({ name }) => name === capability,\n );\n if (!declaration) {\n throwPortalFunctionHostError(\n \"NOT_DECLARED\",\n `Widget requested undeclared capability \"${capability}\".`,\n );\n }\n const request = {\n packageId: remotePackage.packageId,\n packageVersion: remotePackage.version,\n widgetType: widget.type,\n capability,\n capabilityVersion: declaration.version,\n method,\n ...(payload === undefined ? {} : { payload }),\n };\n const builtInResult =\n await builtInCapabilityHostRef.current(request);\n if (builtInResult.handled) return builtInResult.value;\n\n const implementation = functionImplementations.get(\n portalFunctionKey({\n capability,\n version: declaration.version,\n method,\n }),\n );\n if (!implementation) {\n throwPortalFunctionHostError(\n \"UNAVAILABLE\",\n `No host implementation is configured for portal function \"${capability}.${method}\" version \"${declaration.version}\".`,\n );\n }\n\n let result: unknown;\n try {\n result =\n payload === undefined\n ? await (implementation.handler as () => unknown)()\n : await (\n implementation.handler as (\n input: RemoteDomSerializableValue,\n ) => unknown\n )(payload);\n } catch {\n throwPortalFunctionHostError(\n \"HOST_FAILURE\",\n `Host implementation failed for portal function \"${capability}.${method}\".`,\n );\n }\n if (!isJsonValue(result)) {\n throwPortalFunctionHostError(\n \"INVALID_RESPONSE\",\n `Host implementation returned an invalid response for portal function \"${capability}.${method}\".`,\n );\n }\n return result;\n },\n onError: (runtimeError) => {\n if (active) setError(runtimeError);\n },\n });\n\n handleRef.current = handle;\n void handle.ready.catch((readyError: unknown) => {\n if (active) setError(toError(readyError));\n });\n })\n .catch((mountError: unknown) => {\n if (active) setError(toError(mountError));\n });\n\n return () => {\n active = false;\n fullscreenCoordinatorRef.current?.disposeOwner(fullscreenOwner);\n handleRef.current = null;\n handle?.dispose();\n };\n }, [fullscreenOwner, serialization.ok]);\n\n useEffect(() => {\n // While the runtime import is pending, the ref above retains the latest\n // props for the initial mount; subsequent updates use the live handle.\n if (!handleRef.current || !serialization.ok) return;\n try {\n handleRef.current.updateProps(serialization.value);\n setError(null);\n } catch (updateError) {\n setError(toError(updateError));\n }\n }, [serialization]);\n\n const displayedError = serialization.ok ? error : serialization.error;\n\n return createElement(\n \"div\",\n { \"data-fluid-remote-dom-widget-frame\": widget.type },\n createElement(\"div\", {\n ref: hostRef,\n \"data-fluid-remote-dom-widget\": widget.type,\n }),\n displayedError\n ? createElement(\n \"p\",\n { role: \"alert\" },\n `Unable to render ${widget.displayName}.`,\n )\n : null,\n );\n }\n\n RemoteWidget.displayName = `RemoteDomWidget(${widget.type})`;\n return RemoteWidget;\n}\n\ninterface PortalFunctionKeyParts {\n readonly capability: string;\n readonly version: string;\n readonly method: string;\n}\n\nfunction indexPortalFunctionImplementations(\n implementations: readonly PortalFunctionImplementation[],\n): ReadonlyMap<string, PortalFunctionImplementation> {\n const byKey = new Map<string, PortalFunctionImplementation>();\n\n for (const implementation of implementations) {\n const { capability, version, method } = implementation.definition;\n if (isPortalRemoteDomBuiltInCapability(capability)) {\n throw new Error(\n `Portal function \"${capability}.${method}\" cannot replace a Portal SDK built-in capability.`,\n );\n }\n\n const key = portalFunctionKey({ capability, version, method });\n if (byKey.has(key)) {\n throw new Error(\n `Duplicate host implementation for portal function \"${capability}.${method}\" version \"${version}\".`,\n );\n }\n byKey.set(key, implementation);\n }\n\n return byKey;\n}\n\nfunction portalFunctionKey({\n capability,\n version,\n method,\n}: PortalFunctionKeyParts): string {\n return JSON.stringify([capability, version, method]);\n}\n\nfunction isPortalFunctionHostError(error: unknown): error is Error {\n return (\n error instanceof Error && error.message.includes(\"PORTAL_FUNCTION_ERROR:\")\n );\n}\n\ntype SerializablePropsResult =\n | { readonly ok: true; readonly value: RemoteDomSerializableValue }\n | { readonly ok: false; readonly error: Error };\n\nfunction serializeProps(value: unknown): SerializablePropsResult {\n return isJsonValue(value)\n ? { ok: true, value }\n : {\n ok: false,\n error: new TypeError(\n \"Remote DOM widget props must contain only finite JSON values.\",\n ),\n };\n}\n\nfunction toNavigationSlug(url: string): string {\n const base =\n typeof window === \"undefined\"\n ? \"https://portal.invalid\"\n : window.location.origin;\n const parsed = new URL(url, base);\n return `${parsed.pathname.replace(/^\\/+/, \"\")}${parsed.search}${parsed.hash}`;\n}\n\nfunction toError(error: unknown): Error {\n return error instanceof Error ? error : new Error(String(error));\n}\n\nexport function isBuiltInWidgetType(widgetType: string): boolean {\n return Object.prototype.hasOwnProperty.call(\n DEFAULT_SDK_WIDGET_REGISTRY,\n widgetType,\n );\n}\n"],"x_google_ignoreList":[0,1,2,3],"mappings":"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"}