@fluid-app/portal-sdk 0.1.475 → 0.1.477

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 (80) hide show
  1. package/authoring/widget-api/sdk/src/widgets/worker.md +3313 -194
  2. package/dist/{FluidProvider-Enp1OrWr.cjs → FluidProvider-23ch3eP8.cjs} +2 -2
  3. package/dist/{FluidProvider-Enp1OrWr.cjs.map → FluidProvider-23ch3eP8.cjs.map} +1 -1
  4. package/dist/{FluidProvider-BNHU_neW.mjs → FluidProvider-DMeeVh2c.mjs} +2 -2
  5. package/dist/{FluidProvider-BNHU_neW.mjs.map → FluidProvider-DMeeVh2c.mjs.map} +1 -1
  6. package/dist/{MessagingScreen-AVfoyaxf.cjs → MessagingScreen-Ci-LJaR2.cjs} +3 -3
  7. package/dist/{MessagingScreen-BQmYbMd-.mjs → MessagingScreen-D3AD01zt.mjs} +3 -3
  8. package/dist/{MessagingScreen-4WZGUGsB.mjs → MessagingScreen-Dp4SiUQS.mjs} +2 -2
  9. package/dist/{MessagingScreen-4WZGUGsB.mjs.map → MessagingScreen-Dp4SiUQS.mjs.map} +1 -1
  10. package/dist/{MessagingScreen-DOjbhTOB.cjs → MessagingScreen-NuVpv-nc.cjs} +2 -2
  11. package/dist/{MessagingScreen-DOjbhTOB.cjs.map → MessagingScreen-NuVpv-nc.cjs.map} +1 -1
  12. package/dist/{OrdersScreen-5VmHwt9p.cjs → OrdersScreen-BHwi-PHP.cjs} +2 -2
  13. package/dist/{OrdersScreen-5VmHwt9p.cjs.map → OrdersScreen-BHwi-PHP.cjs.map} +1 -1
  14. package/dist/{OrdersScreen-CgJs_YwT.mjs → OrdersScreen-C2B9Eqgv.mjs} +3 -3
  15. package/dist/{OrdersScreen-DKH7gRMR.mjs → OrdersScreen-DrevIASH.mjs} +2 -2
  16. package/dist/{OrdersScreen-DKH7gRMR.mjs.map → OrdersScreen-DrevIASH.mjs.map} +1 -1
  17. package/dist/{OrdersScreen-Bu1Xu3rN.cjs → OrdersScreen-ppjcbl-E.cjs} +3 -3
  18. package/dist/{ProfileScreen-BpgrJkH0.mjs → ProfileScreen-BrXQWXXp.mjs} +3 -3
  19. package/dist/{ProfileScreen-BpgrJkH0.mjs.map → ProfileScreen-BrXQWXXp.mjs.map} +1 -1
  20. package/dist/{ProfileScreen-DBwYxpTt.cjs → ProfileScreen-Cyv8PyYg.cjs} +4 -4
  21. package/dist/{ProfileScreen-DLuirgGc.cjs → ProfileScreen-gWeOhTjQ.cjs} +3 -3
  22. package/dist/{ProfileScreen-DLuirgGc.cjs.map → ProfileScreen-gWeOhTjQ.cjs.map} +1 -1
  23. package/dist/{ProfileScreen-cWvrOUKa.mjs → ProfileScreen-vepAcLXw.mjs} +4 -4
  24. package/dist/{SubscriptionsScreen-0S2YmOKZ.mjs → SubscriptionsScreen-BBMYV3Ge.mjs} +4 -4
  25. package/dist/{SubscriptionsScreen-DExbk_Rt.cjs → SubscriptionsScreen-BdirZOBn.cjs} +4 -4
  26. package/dist/{SubscriptionsScreen-_CMNc90t.mjs → SubscriptionsScreen-KUxdCKB-.mjs} +4 -4
  27. package/dist/{SubscriptionsScreen-_CMNc90t.mjs.map → SubscriptionsScreen-KUxdCKB-.mjs.map} +1 -1
  28. package/dist/{SubscriptionsScreen-D4lpU-bC.cjs → SubscriptionsScreen-LXjZ4qKy.cjs} +4 -4
  29. package/dist/{SubscriptionsScreen-D4lpU-bC.cjs.map → SubscriptionsScreen-LXjZ4qKy.cjs.map} +1 -1
  30. package/dist/{build-remote-widget-plugin-manifests-BS2FjZRV.d.cts → build-remote-widget-plugin-manifests-DUfcmkSD.d.cts} +3 -3
  31. package/dist/{build-remote-widget-plugin-manifests-BS2FjZRV.d.cts.map → build-remote-widget-plugin-manifests-DUfcmkSD.d.cts.map} +1 -1
  32. package/dist/{build-remote-widget-plugin-manifests-DxlaOngq.d.mts → build-remote-widget-plugin-manifests-ejOCHU1U.d.mts} +3 -3
  33. package/dist/{build-remote-widget-plugin-manifests-DxlaOngq.d.mts.map → build-remote-widget-plugin-manifests-ejOCHU1U.d.mts.map} +1 -1
  34. package/dist/{build-widget-registry-BvaGCB_P.mjs → build-widget-registry---S4DdG-.mjs} +2 -2
  35. package/dist/{build-widget-registry-BvaGCB_P.mjs.map → build-widget-registry---S4DdG-.mjs.map} +1 -1
  36. package/dist/{build-widget-registry-BuzSME2l.d.mts → build-widget-registry-B4uXvJe_.d.mts} +2 -2
  37. package/dist/{build-widget-registry-BuzSME2l.d.mts.map → build-widget-registry-B4uXvJe_.d.mts.map} +1 -1
  38. package/dist/{build-widget-registry-Dsp9P8gq.d.cts → build-widget-registry-C_uBIhbU.d.cts} +2 -2
  39. package/dist/{build-widget-registry-Dsp9P8gq.d.cts.map → build-widget-registry-C_uBIhbU.d.cts.map} +1 -1
  40. package/dist/{build-widget-registry-B2K6eJ2o.cjs → build-widget-registry-D28CSx4b.cjs} +2 -2
  41. package/dist/{build-widget-registry-B2K6eJ2o.cjs.map → build-widget-registry-D28CSx4b.cjs.map} +1 -1
  42. package/dist/fluid-spacer-widget-Cgsgu8lP.mjs +1265 -0
  43. package/dist/fluid-spacer-widget-Cgsgu8lP.mjs.map +1 -0
  44. package/dist/fluid-spacer-widget-ajsnkeUW.cjs +1805 -0
  45. package/dist/fluid-spacer-widget-ajsnkeUW.cjs.map +1 -0
  46. package/dist/index.cjs +16 -16
  47. package/dist/index.d.cts +3 -3
  48. package/dist/index.d.mts +3 -3
  49. package/dist/index.mjs +16 -16
  50. package/dist/{portal-function-DYWFgeRx.d.cts → portal-function-DUOB0Ykd.d.cts} +52 -1
  51. package/dist/{portal-function-DYWFgeRx.d.cts.map → portal-function-DUOB0Ykd.d.cts.map} +1 -1
  52. package/dist/{portal-function-MTknwZfL.d.mts → portal-function-hOpcnB0R.d.mts} +52 -1
  53. package/dist/{portal-function-MTknwZfL.d.mts.map → portal-function-hOpcnB0R.d.mts.map} +1 -1
  54. package/dist/{use-portal-card-add-3ds-flow-BlrgGoIL.cjs → use-portal-card-add-3ds-flow-ChMcZpwT.cjs} +26 -10
  55. package/dist/use-portal-card-add-3ds-flow-ChMcZpwT.cjs.map +1 -0
  56. package/dist/{use-portal-card-add-3ds-flow-BBIXp3G5.mjs → use-portal-card-add-3ds-flow-Dxz8NvV-.mjs} +26 -10
  57. package/dist/use-portal-card-add-3ds-flow-Dxz8NvV-.mjs.map +1 -0
  58. package/dist/utils/build-remote-widget-plugin-manifests.cjs +1 -1
  59. package/dist/utils/build-remote-widget-plugin-manifests.d.cts +1 -1
  60. package/dist/utils/build-remote-widget-plugin-manifests.d.mts +1 -1
  61. package/dist/utils/build-remote-widget-plugin-manifests.mjs +1 -1
  62. package/dist/utils/build-widget-registry.cjs +1 -1
  63. package/dist/utils/build-widget-registry.d.cts +1 -1
  64. package/dist/utils/build-widget-registry.d.mts +1 -1
  65. package/dist/utils/build-widget-registry.mjs +1 -1
  66. package/dist/widgets/worker.cjs +72 -1
  67. package/dist/widgets/worker.cjs.map +1 -1
  68. package/dist/widgets/worker.d.cts +1193 -329
  69. package/dist/widgets/worker.d.cts.map +1 -1
  70. package/dist/widgets/worker.d.mts +1193 -329
  71. package/dist/widgets/worker.d.mts.map +1 -1
  72. package/dist/widgets/worker.mjs +72 -1
  73. package/dist/widgets/worker.mjs.map +1 -1
  74. package/package.json +16 -16
  75. package/dist/fluid-spacer-widget-C33ayl7j.mjs +0 -547
  76. package/dist/fluid-spacer-widget-C33ayl7j.mjs.map +0 -1
  77. package/dist/fluid-spacer-widget-DoUSdfS_.cjs +0 -1087
  78. package/dist/fluid-spacer-widget-DoUSdfS_.cjs.map +0 -1
  79. package/dist/use-portal-card-add-3ds-flow-BBIXp3G5.mjs.map +0 -1
  80. package/dist/use-portal-card-add-3ds-flow-BlrgGoIL.cjs.map +0 -1
@@ -1,6 +1,6 @@
1
1
  Object.defineProperty(exports, Symbol.toStringTag, { value: "Module" });
2
2
  require("../chunk-9hOWP6kD.cjs");
3
- const require_build_widget_registry = require("../build-widget-registry-B2K6eJ2o.cjs");
3
+ const require_build_widget_registry = require("../build-widget-registry-D28CSx4b.cjs");
4
4
  require("../ScreenRenderer-D6piFnUR.cjs");
5
5
  require("../use-account-CDm-HlHX.cjs");
6
6
  require("../use-optional-store-CIM4spDu.cjs");
@@ -1,2 +1,2 @@
1
- import { n as buildRemoteWidgetPluginManifests, r as getRemoteWidgetPackageCategoryId, t as RemoteWidgetPluginHostOptions } from "../build-remote-widget-plugin-manifests-BS2FjZRV.cjs";
1
+ import { n as buildRemoteWidgetPluginManifests, r as getRemoteWidgetPackageCategoryId, t as RemoteWidgetPluginHostOptions } from "../build-remote-widget-plugin-manifests-DUfcmkSD.cjs";
2
2
  export { RemoteWidgetPluginHostOptions, buildRemoteWidgetPluginManifests, getRemoteWidgetPackageCategoryId };
@@ -1,2 +1,2 @@
1
- import { n as buildRemoteWidgetPluginManifests, r as getRemoteWidgetPackageCategoryId, t as RemoteWidgetPluginHostOptions } from "../build-remote-widget-plugin-manifests-DxlaOngq.mjs";
1
+ import { n as buildRemoteWidgetPluginManifests, r as getRemoteWidgetPackageCategoryId, t as RemoteWidgetPluginHostOptions } from "../build-remote-widget-plugin-manifests-ejOCHU1U.mjs";
2
2
  export { RemoteWidgetPluginHostOptions, buildRemoteWidgetPluginManifests, getRemoteWidgetPackageCategoryId };
@@ -1,4 +1,4 @@
1
- import { i as createRemoteWidgetNetworkAccessGrant, r as projectRemoteWidgetPackages } from "../build-widget-registry-BvaGCB_P.mjs";
1
+ import { i as createRemoteWidgetNetworkAccessGrant, r as projectRemoteWidgetPackages } from "../build-widget-registry---S4DdG-.mjs";
2
2
  import "../ScreenRenderer-Chv8iZDf.mjs";
3
3
  import "../use-account-DhZ3gaOS.mjs";
4
4
  import "../use-optional-store-DpB_jK4Q.mjs";
@@ -1,6 +1,6 @@
1
1
  Object.defineProperty(exports, Symbol.toStringTag, { value: "Module" });
2
2
  require("../chunk-9hOWP6kD.cjs");
3
- const require_build_widget_registry = require("../build-widget-registry-B2K6eJ2o.cjs");
3
+ const require_build_widget_registry = require("../build-widget-registry-D28CSx4b.cjs");
4
4
  require("../ScreenRenderer-D6piFnUR.cjs");
5
5
  require("../use-account-CDm-HlHX.cjs");
6
6
  require("../use-optional-store-CIM4spDu.cjs");
@@ -1,2 +1,2 @@
1
- import { a as isBuiltInWidgetType, i as buildRemoteWidgetRegistry, n as SdkWidgetRegistry, o as projectRemoteWidgetPackages, r as WidgetRegistryWarningSink, t as RemoteDomWidgetRegistryOptions } from "../build-widget-registry-Dsp9P8gq.cjs";
1
+ import { a as isBuiltInWidgetType, i as buildRemoteWidgetRegistry, n as SdkWidgetRegistry, o as projectRemoteWidgetPackages, r as WidgetRegistryWarningSink, t as RemoteDomWidgetRegistryOptions } from "../build-widget-registry-C_uBIhbU.cjs";
2
2
  export { type RemoteDomWidgetRegistryOptions, type SdkWidgetRegistry, type WidgetRegistryWarningSink, buildRemoteWidgetRegistry, isBuiltInWidgetType, projectRemoteWidgetPackages };
@@ -1,2 +1,2 @@
1
- import { a as isBuiltInWidgetType, i as buildRemoteWidgetRegistry, n as SdkWidgetRegistry, o as projectRemoteWidgetPackages, r as WidgetRegistryWarningSink, t as RemoteDomWidgetRegistryOptions } from "../build-widget-registry-BuzSME2l.mjs";
1
+ import { a as isBuiltInWidgetType, i as buildRemoteWidgetRegistry, n as SdkWidgetRegistry, o as projectRemoteWidgetPackages, r as WidgetRegistryWarningSink, t as RemoteDomWidgetRegistryOptions } from "../build-widget-registry-B4uXvJe_.mjs";
2
2
  export { type RemoteDomWidgetRegistryOptions, type SdkWidgetRegistry, type WidgetRegistryWarningSink, buildRemoteWidgetRegistry, isBuiltInWidgetType, projectRemoteWidgetPackages };
@@ -1,4 +1,4 @@
1
- import { n as isBuiltInWidgetType, r as projectRemoteWidgetPackages, t as buildRemoteWidgetRegistry } from "../build-widget-registry-BvaGCB_P.mjs";
1
+ import { n as isBuiltInWidgetType, r as projectRemoteWidgetPackages, t as buildRemoteWidgetRegistry } from "../build-widget-registry---S4DdG-.mjs";
2
2
  import "../ScreenRenderer-Chv8iZDf.mjs";
3
3
  import "../use-account-DhZ3gaOS.mjs";
4
4
  import "../use-optional-store-DpB_jK4Q.mjs";
@@ -1,10 +1,25 @@
1
1
  Object.defineProperty(exports, Symbol.toStringTag, { value: "Module" });
2
2
  require("../chunk-9hOWP6kD.cjs");
3
- const require_fluid_spacer_widget = require("../fluid-spacer-widget-DoUSdfS_.cjs");
3
+ const require_fluid_spacer_widget = require("../fluid-spacer-widget-ajsnkeUW.cjs");
4
4
  let react = require("react");
5
5
  let _fluid_app_widget_runtime_worker = require("@fluid-app/widget-runtime/worker");
6
6
  //#region src/widgets/remote/worker/capability-use.ts
7
7
  const DECLARATIVE_CAPABILITY_USE = Symbol("fluid.declarativeCapabilityUse");
8
+ /**
9
+ * Declares that a widget can make direct network requests.
10
+ * Add this marker to the widget's `uses` list. The portal host can require user
11
+ * consent before mounting a package that declares network access. This marker
12
+ * does not bypass browser CORS, Content Security Policy, or host network policy.
13
+ *
14
+ * @example
15
+ * ```ts
16
+ * const widget = defineWidget({
17
+ * name: "remote-data",
18
+ * component: RemoteData,
19
+ * uses: [networkAccess],
20
+ * });
21
+ * ```
22
+ */
8
23
  const networkAccess = {
9
24
  [DECLARATIVE_CAPABILITY_USE]: true,
10
25
  name: "networkAccess",
@@ -24,6 +39,18 @@ const portalFunctionsByWidgetName = /* @__PURE__ */ new Map();
24
39
  * @param options - Component, builder metadata, defaults, property schema, and typed capability uses.
25
40
  * @returns The normalized widget used by {@link defineWidgetPackage}.
26
41
  * @throws If `uses` contains an invalid entry or conflicting capability versions.
42
+ * @remarks Call during worker module initialization. Default props and property values must cross the worker boundary as JSON values. Every Portal function the component calls must appear in `uses`.
43
+ *
44
+ * @example
45
+ * ```tsx
46
+ * const greeting = defineWidget({
47
+ * name: "greeting",
48
+ * displayName: "Greeting",
49
+ * component: Greeting,
50
+ * defaultProps: { message: "Hello" },
51
+ * uses: [getUserAccount],
52
+ * });
53
+ * ```
27
54
  */
28
55
  function defineWidget(options) {
29
56
  const uses = options.uses ?? [];
@@ -45,6 +72,17 @@ function defineWidget(options) {
45
72
  * @param options - Package identity, SemVer version, widgets, and optional runtime stylesheets.
46
73
  * @returns A canonical source package descriptor. Build and dev replace runtime artifact URLs.
47
74
  * @throws If a company package omits `packageStableId`.
75
+ * @remarks Define one package during worker module initialization. Company packages require a stable company identifier; Droplet publication can inject its stable identifier through the CLI.
76
+ *
77
+ * @example
78
+ * ```ts
79
+ * const widgetPackage = defineWidgetPackage({
80
+ * scope: "acme",
81
+ * packageStableId: "company-public-id",
82
+ * version: "1.0.0",
83
+ * widgets: [greeting],
84
+ * });
85
+ * ```
48
86
  */
49
87
  function defineWidgetPackage(options) {
50
88
  const packageType = options.packageType ?? "company";
@@ -71,6 +109,13 @@ function defineWidgetPackage(options) {
71
109
  *
72
110
  * @param widgetPackage - A source package or generated runtime widget list.
73
111
  * @returns A controller that owns the worker connection and registered widget definitions.
112
+ * @throws If generated widgets cannot be matched to an unambiguous source `uses` declaration.
113
+ * @remarks Call once from the worker entry after all widgets and the package are defined. The returned controller owns the active Remote DOM connection.
114
+ *
115
+ * @example
116
+ * ```ts
117
+ * startWidgetPackage(widgetPackage);
118
+ * ```
74
119
  */
75
120
  function startWidgetPackage(widgetPackage) {
76
121
  return (0, _fluid_app_widget_runtime_worker.startRemoteDomWidgetWorker)({ widgets: "packageId" in widgetPackage ? Object.fromEntries(widgetPackage.widgets.map((widget) => [`${getCanonicalRuntimePackageId(widgetPackage)}.${widget.name}`, {
@@ -147,6 +192,21 @@ function getCanonicalRuntimePackageId(widgetPackage) {
147
192
  }
148
193
  //#endregion
149
194
  //#region src/widgets/remote/worker/elements/SearchSort.tsx
195
+ /**
196
+ * Renders the Portal-provided search and sort control in a Remote DOM widget.
197
+ *
198
+ * @param props - Search, sort, option, and change-handler configuration.
199
+ * @returns A worker-safe React element backed by the Portal custom element.
200
+ * @remarks Render this component only inside a started Remote DOM widget worker. The Portal host owns its visual implementation.
201
+ * @example
202
+ * ```tsx
203
+ * <SearchSort
204
+ * searchValue={query}
205
+ * placeholder="Search products"
206
+ * onSearchChange={setQuery}
207
+ * />
208
+ * ```
209
+ */
150
210
  function SearchSort({ onSearchChange, onSortChange, ...props }) {
151
211
  const elementRef = (0, react.useRef)(null);
152
212
  const searchChangeRef = (0, react.useRef)(onSearchChange);
@@ -183,6 +243,17 @@ function readRemoteEventValue(event) {
183
243
  }
184
244
  //#endregion
185
245
  //#region src/widgets/remote/worker/elements/FluidSpacerWidget.tsx
246
+ /**
247
+ * Renders a Portal spacer inside a Remote DOM widget.
248
+ *
249
+ * @param props - Spacer height and preview state.
250
+ * @returns A worker-safe React element backed by the Portal custom element.
251
+ * @remarks Render this component only inside a started Remote DOM widget worker. The Portal host determines the final layout behavior.
252
+ * @example
253
+ * ```tsx
254
+ * <FluidSpacerWidget customHeight={24} />
255
+ * ```
256
+ */
186
257
  function FluidSpacerWidget(props) {
187
258
  return (0, react.createElement)(require_fluid_spacer_widget.FLUID_SPACER_WIDGET_TAG_NAME, props);
188
259
  }
@@ -1 +1 @@
1
- {"version":3,"file":"worker.cjs","names":["getPortalFunctionMetadata","FLUID_SEARCH_SORT_EVENT_NAMES","FLUID_SEARCH_SORT_TAG_NAME","FLUID_SPACER_WIDGET_TAG_NAME"],"sources":["../../src/widgets/remote/worker/capability-use.ts","../../src/widgets/remote/worker/widget-package.ts","../../src/widgets/remote/worker/elements/SearchSort.tsx","../../src/widgets/remote/worker/elements/FluidSpacerWidget.tsx"],"sourcesContent":["const DECLARATIVE_CAPABILITY_USE: unique symbol = Symbol(\n \"fluid.declarativeCapabilityUse\",\n);\n\nexport interface DeclarativeCapabilityUse {\n readonly [DECLARATIVE_CAPABILITY_USE]: true;\n readonly name: string;\n readonly version: string;\n}\n\nexport const networkAccess: DeclarativeCapabilityUse = {\n [DECLARATIVE_CAPABILITY_USE]: true,\n name: \"networkAccess\",\n version: \"1\",\n};\n\nexport function isDeclarativeCapabilityUse(\n value: unknown,\n): value is DeclarativeCapabilityUse {\n return (\n typeof value === \"object\" &&\n value !== null &&\n DECLARATIVE_CAPABILITY_USE in value &&\n value[DECLARATIVE_CAPABILITY_USE] === true\n );\n}\n","import type { ComponentType } from \"react\";\nimport {\n startRemoteDomWidgetWorker,\n type RemoteDomCapabilityFunctionMetadata,\n type RemoteDomWidgetWorkerController,\n type RemoteDomWidgetWorkerDefinition,\n} from \"@fluid-app/widget-runtime/worker\";\nimport type {\n JsonValue,\n WidgetSourcePropertySchema,\n} from \"@fluid-app/portal-core/remote-dom-widget-package\";\nimport {\n getPortalFunctionMetadata,\n type AnyPortalFunction,\n} from \"../contract/portal-function\";\nimport {\n isDeclarativeCapabilityUse,\n type DeclarativeCapabilityUse,\n} from \"./capability-use\";\n\nconst SOURCE_WIDGET_MARKER = \"__fluidSourceWidget\";\nconst SOURCE_WIDGET_PACKAGE_MARKER = \"__fluidSourceWidgetPackage\";\n\ninterface RegisteredPortalFunctions {\n readonly capabilities: readonly WidgetSourceCapabilityDeclaration[];\n readonly functions: readonly RemoteDomCapabilityFunctionMetadata[];\n}\n\nconst portalFunctionsByWidgetName = new Map<\n string,\n RegisteredPortalFunctions[]\n>();\n\n/** JSON-serializable default props accepted by a source widget. */\nexport type WidgetSourceDefaultProps = Readonly<Record<string, JsonValue>>;\n\n/** Builder resize behavior declared by a source widget. */\nexport type WidgetSourceResizable =\n | boolean\n | \"horizontal\"\n | \"vertical\"\n | \"both\"\n | {\n readonly horizontal?: boolean;\n readonly vertical?: boolean;\n readonly minWidth?: number;\n readonly minHeight?: number;\n };\n\nexport interface WidgetSourceCapabilityDeclaration {\n /** Stable capability name enforced by the worker and host. */\n readonly name: string;\n /** Capability contract version required by the widget. */\n readonly version: string;\n}\n\n/** Authoring options accepted by {@link defineWidget}. */\nexport interface DefineWidgetOptions<\n Name extends string = string,\n Props = WidgetSourceDefaultProps,\n> {\n /** Stable URL-safe widget name used in the canonical widget type. */\n readonly name: Name;\n /** React component rendered by the Remote DOM worker. */\n readonly component: ComponentType<Props & object>;\n /** Human-readable builder palette name. */\n readonly displayName?: string;\n /** Builder palette description of the widget's purpose. */\n readonly description?: string;\n /** Icon identifier displayed in the builder palette. */\n readonly icon?: string;\n /** Builder palette category. */\n readonly category?: string;\n /** JSON-serializable property editor schema. */\n readonly propertySchema?: WidgetSourcePropertySchema;\n /** JSON-serializable props assigned to new widget instances. */\n readonly defaultProps?: Partial<Props>;\n /** Host layout treatment for the widget. */\n readonly container?: \"inline\" | \"block\" | \"card\" | \"fullscreen\";\n /** Oldest portal SDK version that can host the widget. */\n readonly minSdkVersion?: string;\n /** Typed portal functions and declarative capabilities used by the widget. */\n readonly uses?: readonly (AnyPortalFunction | DeclarativeCapabilityUse)[];\n /** Builder resize behavior and optional minimum dimensions. */\n readonly resizable?: WidgetSourceResizable;\n}\n\n/** Normalized source widget returned by {@link defineWidget}. */\nexport interface SourceWidget<\n Name extends string = string,\n Props = WidgetSourceDefaultProps,\n> extends DefineWidgetOptions<Name, Props> {\n /** Internal marker that distinguishes normalized source widgets. */\n readonly [SOURCE_WIDGET_MARKER]: true;\n /** Normalized defaults; an omitted author value becomes an empty object. */\n readonly defaultProps: Partial<Props>;\n /** Normalized typed functions and declarative capability markers. */\n readonly uses: readonly (AnyPortalFunction | DeclarativeCapabilityUse)[];\n /** Capability declarations derived from {@link uses}. */\n readonly capabilities: readonly WidgetSourceCapabilityDeclaration[];\n}\n\n/** Heterogeneous source widget type used by package arrays. */\n// oxlint-disable-next-line typescript/no-explicit-any -- a package intentionally contains widgets with heterogeneous props.\nexport type AnySourceWidget = SourceWidget<string, any>;\n\ninterface DefineWidgetPackageBase<Scope extends string = string> {\n /** Namespace used as the first segment of the package id. */\n readonly scope: Scope;\n /** SemVer package version without build metadata. @defaultValue `\"0.0.0-dev\"` */\n readonly version?: string;\n /** Widgets published in this package. */\n readonly widgets: readonly AnySourceWidget[];\n /** Absolute runtime stylesheet URLs; build tooling normally injects these. */\n readonly cssUrls?: readonly string[];\n}\n\n/** Authoring options accepted by {@link defineWidgetPackage}. */\nexport type DefineWidgetPackageOptions<\n Scope extends string = string,\n StableId extends string = string,\n> = DefineWidgetPackageBase<Scope> &\n (\n | {\n readonly packageType?: \"company\";\n readonly packageStableId: StableId;\n }\n | {\n readonly packageType: \"droplet\";\n readonly packageStableId?: StableId;\n }\n );\n\n/** Canonical source package returned by {@link defineWidgetPackage}. */\nexport interface SourceWidgetPackage<\n Scope extends string = string,\n StableId extends string = string,\n> {\n /** Internal marker that distinguishes normalized source packages. */\n readonly [SOURCE_WIDGET_PACKAGE_MARKER]: true;\n /** Widget package descriptor format version. */\n readonly manifestVersion: 1;\n /** Namespace used as the first segment of the package id. */\n readonly scope: Scope;\n /** Stable company or droplet owner identifier. */\n readonly packageStableId: StableId;\n /** Canonical `${scope}.${packageStableId}` package id. */\n readonly packageId: `${Scope}.${StableId}`;\n /** Ownership model used for validation, consent, and publication. */\n readonly packageType: \"company\" | \"droplet\";\n /** Normalized SemVer package version. */\n readonly version: string;\n /** Widgets included in the package. */\n readonly widgets: readonly AnySourceWidget[];\n /** Runtime stylesheet URLs included in the published descriptor. */\n readonly cssUrls: readonly string[];\n}\n\n/** Generated runtime widget definition accepted by {@link startWidgetPackage}. */\nexport interface RuntimeSourceWidget {\n /** Fully qualified widget type registered with the worker runtime. */\n readonly type: string;\n /** Source name retained by generated company worker entries. */\n readonly name?: string;\n /** React component rendered for this runtime widget type. */\n readonly component: ComponentType<Record<string, unknown>>;\n /** Capability declarations enforced for generated runtime widgets. */\n readonly capabilities?: readonly WidgetSourceCapabilityDeclaration[];\n}\n\n/** Generated-worker options accepted by {@link startWidgetPackage}. */\nexport interface StartWidgetPackageOptions {\n /** Generated runtime widgets to register when no source package is available. */\n readonly widgets: readonly RuntimeSourceWidget[];\n}\n\n/**\n * Defines one widget and derives its enforced capability declarations.\n *\n * @param options - Component, builder metadata, defaults, property schema, and typed capability uses.\n * @returns The normalized widget used by {@link defineWidgetPackage}.\n * @throws If `uses` contains an invalid entry or conflicting capability versions.\n */\nexport function defineWidget<\n const Name extends string,\n Props = WidgetSourceDefaultProps,\n>(options: DefineWidgetOptions<Name, Props>): SourceWidget<Name, Props> {\n const uses = options.uses ?? [];\n const normalized = normalizePortalFunctions(uses);\n const registrations = portalFunctionsByWidgetName.get(options.name) ?? [];\n registrations.push(normalized);\n portalFunctionsByWidgetName.set(options.name, registrations);\n return {\n ...options,\n [SOURCE_WIDGET_MARKER]: true,\n defaultProps: options.defaultProps ?? {},\n uses,\n capabilities: normalized.capabilities,\n };\n}\n\n/**\n * Defines a company- or droplet-owned widget package.\n *\n * @param options - Package identity, SemVer version, widgets, and optional runtime stylesheets.\n * @returns A canonical source package descriptor. Build and dev replace runtime artifact URLs.\n * @throws If a company package omits `packageStableId`.\n */\nexport function defineWidgetPackage<\n const Scope extends string,\n const StableId extends string,\n>(\n options: DefineWidgetPackageOptions<Scope, StableId>,\n): SourceWidgetPackage<Scope, StableId> {\n const packageType = options.packageType ?? \"company\";\n const packageStableId = options.packageStableId;\n if (!packageStableId && packageType !== \"droplet\") {\n throw new Error(\n \"defineWidgetPackage requires packageStableId for company packages.\",\n );\n }\n\n const stableId = (packageStableId ?? \"__fluid_cli_managed__\") as StableId;\n const hasLegacyNavigationOrigins = Object.prototype.hasOwnProperty.call(\n options,\n \"navigationOrigins\",\n );\n const legacyNavigationOrigins = (\n options as unknown as Record<string, unknown>\n ).navigationOrigins;\n return {\n [SOURCE_WIDGET_PACKAGE_MARKER]: true,\n manifestVersion: 1,\n scope: options.scope,\n packageStableId: stableId,\n packageId: `${options.scope}.${stableId}`,\n packageType,\n version: options.version ?? \"0.0.0-dev\",\n widgets: options.widgets,\n cssUrls: options.cssUrls ?? [],\n ...(hasLegacyNavigationOrigins\n ? { navigationOrigins: legacyNavigationOrigins }\n : {}),\n };\n}\n\n/**\n * Starts one Remote DOM worker containing every widget in the source package.\n *\n * @param widgetPackage - A source package or generated runtime widget list.\n * @returns A controller that owns the worker connection and registered widget definitions.\n */\nexport function startWidgetPackage(\n widgetPackage: SourceWidgetPackage | StartWidgetPackageOptions,\n): RemoteDomWidgetWorkerController {\n const widgets =\n \"packageId\" in widgetPackage\n ? Object.fromEntries(\n widgetPackage.widgets.map((widget) => [\n `${getCanonicalRuntimePackageId(widgetPackage)}.${widget.name}`,\n {\n component: widget.component,\n capabilities: widget.capabilities,\n functions: readSourcePortalFunctions(widget),\n },\n ]),\n )\n : Object.fromEntries(\n widgetPackage.widgets.map((widget) => [\n widget.type,\n {\n component: widget.component,\n capabilities: widget.capabilities ?? [],\n functions: readGeneratedPortalFunctions(widget),\n },\n ]),\n );\n return startRemoteDomWidgetWorker({\n widgets: widgets as Readonly<\n Record<string, RemoteDomWidgetWorkerDefinition>\n >,\n });\n}\n\nfunction normalizePortalFunctions(\n uses: readonly (AnyPortalFunction | DeclarativeCapabilityUse)[],\n): {\n readonly capabilities: readonly WidgetSourceCapabilityDeclaration[];\n readonly functions: readonly RemoteDomCapabilityFunctionMetadata[];\n} {\n const versionByCapability = new Map<string, string>();\n const functionsByIdentity = new Map<\n string,\n RemoteDomCapabilityFunctionMetadata\n >();\n for (const portalFunction of uses) {\n if (isDeclarativeCapabilityUse(portalFunction)) {\n const currentVersion = versionByCapability.get(portalFunction.name);\n if (currentVersion && currentVersion !== portalFunction.version) {\n throw new Error(\n `defineWidget cannot use capability \"${portalFunction.name}\" at both version \"${currentVersion}\" and version \"${portalFunction.version}\".`,\n );\n }\n versionByCapability.set(portalFunction.name, portalFunction.version);\n continue;\n }\n const metadata = getPortalFunctionMetadata(portalFunction);\n if (!metadata) {\n throw new Error(\n \"defineWidget uses must contain portal functions or declarative capability markers.\",\n );\n }\n\n const currentVersion = versionByCapability.get(metadata.capability);\n if (currentVersion && currentVersion !== metadata.version) {\n throw new Error(\n `defineWidget cannot use capability \"${metadata.capability}\" at both version \"${currentVersion}\" and version \"${metadata.version}\".`,\n );\n }\n versionByCapability.set(metadata.capability, metadata.version);\n functionsByIdentity.set(\n JSON.stringify([metadata.capability, metadata.version, metadata.method]),\n metadata,\n );\n }\n\n return {\n capabilities: [...versionByCapability].map(([name, version]) => ({\n name,\n version,\n })),\n functions: [...functionsByIdentity.values()],\n };\n}\n\nfunction readGeneratedPortalFunctions(\n widget: RuntimeSourceWidget,\n): readonly RemoteDomCapabilityFunctionMetadata[] {\n if (!widget.name) return [];\n const registrations = portalFunctionsByWidgetName.get(widget.name) ?? [];\n portalFunctionsByWidgetName.delete(widget.name);\n const capabilities = widget.capabilities ?? [];\n const matchingRegistrations = registrations.filter((registration) =>\n haveSameCapabilityDeclarations(registration.capabilities, capabilities),\n );\n const uniqueFunctions = new Map<\n string,\n readonly RemoteDomCapabilityFunctionMetadata[]\n >();\n for (const registration of matchingRegistrations) {\n uniqueFunctions.set(\n portalFunctionSetKey(registration.functions),\n registration.functions,\n );\n }\n\n if (uniqueFunctions.size > 1) {\n throw new Error(\n `Generated worker entry cannot recover an unambiguous uses declaration for widget \"${widget.name}\" (${widget.type}). Multiple widgets with that name declare the same capabilities but different portal functions; give every source widget a unique name.`,\n );\n }\n\n return uniqueFunctions.values().next().value ?? [];\n}\n\nfunction readSourcePortalFunctions(\n widget: AnySourceWidget,\n): readonly RemoteDomCapabilityFunctionMetadata[] {\n portalFunctionsByWidgetName.delete(widget.name);\n return normalizePortalFunctions(widget.uses).functions;\n}\n\nfunction haveSameCapabilityDeclarations(\n left: readonly WidgetSourceCapabilityDeclaration[],\n right: readonly WidgetSourceCapabilityDeclaration[],\n): boolean {\n if (left.length !== right.length) return false;\n const rightKeys = new Set(\n right.map(({ name, version }) => JSON.stringify([name, version])),\n );\n return left.every(({ name, version }) =>\n rightKeys.has(JSON.stringify([name, version])),\n );\n}\n\nfunction portalFunctionSetKey(\n functions: readonly RemoteDomCapabilityFunctionMetadata[],\n): string {\n return JSON.stringify(\n functions\n .map(({ capability, version, method }) => [capability, version, method])\n .sort(([leftCapability, leftVersion, leftMethod], right) =>\n `${leftCapability}\\u0000${leftVersion}\\u0000${leftMethod}`.localeCompare(\n right.join(\"\\u0000\"),\n ),\n ),\n );\n}\n\nfunction getCanonicalRuntimePackageId(\n widgetPackage: SourceWidgetPackage,\n): string {\n const owner = widgetPackage.packageType;\n const scope = widgetPackage.scope;\n const stableId = widgetPackage.packageStableId;\n const packageKey =\n scope !== \"company\" &&\n scope !== \"droplet\" &&\n !stableId.startsWith(`${scope}.`)\n ? `${scope}.${stableId}`\n : stableId;\n return `${owner}.${packageKey}`;\n}\n\nexport type { RemoteDomWidgetWorkerController };\n","import { createElement, useEffect, useRef, type ReactElement } from \"react\";\nimport {\n FLUID_SEARCH_SORT_EVENT_NAMES,\n FLUID_SEARCH_SORT_TAG_NAME,\n type FluidSearchSortElementProperties,\n type FluidSearchSortEventDetails,\n type FluidSearchSortEventName,\n} from \"../../contract/elements/search-sort\";\n\nexport interface SearchSortProps extends FluidSearchSortElementProperties {\n readonly onSearchChange: (value: string) => void;\n readonly onSortChange?: (value: string) => void;\n}\n\nexport function SearchSort({\n onSearchChange,\n onSortChange,\n ...props\n}: SearchSortProps): ReactElement {\n const elementRef = useRef<HTMLElement | null>(null);\n const searchChangeRef = useRef(onSearchChange);\n const sortChangeRef = useRef(onSortChange);\n searchChangeRef.current = onSearchChange;\n sortChangeRef.current = onSortChange;\n\n useEffect(() => {\n const element = elementRef.current;\n if (!element) return;\n const handleSearchChange = (event: Event): void => {\n const value = readRemoteEventValue(event);\n if (value !== undefined) searchChangeRef.current(value);\n };\n const handleSortChange = (event: Event): void => {\n const value = readRemoteEventValue(event);\n if (value !== undefined) sortChangeRef.current?.(value);\n };\n element.addEventListener(\n FLUID_SEARCH_SORT_EVENT_NAMES.searchChange,\n handleSearchChange,\n );\n element.addEventListener(\n FLUID_SEARCH_SORT_EVENT_NAMES.sortChange,\n handleSortChange,\n );\n return () => {\n element.removeEventListener(\n FLUID_SEARCH_SORT_EVENT_NAMES.searchChange,\n handleSearchChange,\n );\n element.removeEventListener(\n FLUID_SEARCH_SORT_EVENT_NAMES.sortChange,\n handleSortChange,\n );\n };\n }, []);\n\n return createElement(FLUID_SEARCH_SORT_TAG_NAME, {\n ...props,\n ref: elementRef,\n });\n}\n\nfunction readRemoteEventValue(\n event: Event,\n): FluidSearchSortEventDetails[FluidSearchSortEventName] | undefined {\n if (!(event instanceof CustomEvent)) return undefined;\n if (typeof event.detail === \"string\") return event.detail;\n if (\n typeof event.detail === \"object\" &&\n event.detail !== null &&\n \"detail\" in event.detail &&\n typeof event.detail.detail === \"string\"\n ) {\n return event.detail.detail;\n }\n return undefined;\n}\n","import { createElement, type ReactElement } from \"react\";\nimport {\n FLUID_SPACER_WIDGET_TAG_NAME,\n type FluidSpacerWidgetElementProperties,\n} from \"../../contract/elements/fluid-spacer-widget\";\n\nexport interface FluidSpacerWidgetProps {\n readonly customHeight?: FluidSpacerWidgetElementProperties[\"customHeight\"];\n readonly previewMode?: FluidSpacerWidgetElementProperties[\"previewMode\"];\n}\n\nexport function FluidSpacerWidget(props: FluidSpacerWidgetProps): ReactElement {\n return createElement(FLUID_SPACER_WIDGET_TAG_NAME, props);\n}\n"],"mappings":"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"}
1
+ {"version":3,"file":"worker.cjs","names":["getPortalFunctionMetadata","FLUID_SEARCH_SORT_EVENT_NAMES","FLUID_SEARCH_SORT_TAG_NAME","FLUID_SPACER_WIDGET_TAG_NAME"],"sources":["../../src/widgets/remote/worker/capability-use.ts","../../src/widgets/remote/worker/widget-package.ts","../../src/widgets/remote/worker/elements/SearchSort.tsx","../../src/widgets/remote/worker/elements/FluidSpacerWidget.tsx"],"sourcesContent":["const DECLARATIVE_CAPABILITY_USE: unique symbol = Symbol(\n \"fluid.declarativeCapabilityUse\",\n);\n\n/** A capability declaration that does not expose individual Portal functions. */\nexport interface DeclarativeCapabilityUse {\n /** Internal marker used to validate `uses` entries. */\n readonly [DECLARATIVE_CAPABILITY_USE]: true;\n /** Stable capability name. */\n readonly name: string;\n /** Required capability contract version. */\n readonly version: string;\n}\n\n/**\n * Declares that a widget can make direct network requests.\n * Add this marker to the widget's `uses` list. The portal host can require user\n * consent before mounting a package that declares network access. This marker\n * does not bypass browser CORS, Content Security Policy, or host network policy.\n *\n * @example\n * ```ts\n * const widget = defineWidget({\n * name: \"remote-data\",\n * component: RemoteData,\n * uses: [networkAccess],\n * });\n * ```\n */\nexport const networkAccess: DeclarativeCapabilityUse = {\n [DECLARATIVE_CAPABILITY_USE]: true,\n name: \"networkAccess\",\n version: \"1\",\n};\n\nexport function isDeclarativeCapabilityUse(\n value: unknown,\n): value is DeclarativeCapabilityUse {\n return (\n typeof value === \"object\" &&\n value !== null &&\n DECLARATIVE_CAPABILITY_USE in value &&\n value[DECLARATIVE_CAPABILITY_USE] === true\n );\n}\n","import type { ComponentType } from \"react\";\nimport {\n startRemoteDomWidgetWorker,\n type RemoteDomCapabilityFunctionMetadata,\n type RemoteDomWidgetWorkerController,\n type RemoteDomWidgetWorkerDefinition,\n} from \"@fluid-app/widget-runtime/worker\";\nimport type {\n JsonValue,\n WidgetSourcePropertySchema,\n} from \"@fluid-app/portal-core/remote-dom-widget-package\";\nimport {\n getPortalFunctionMetadata,\n type AnyPortalFunction,\n} from \"../contract/portal-function\";\nimport {\n isDeclarativeCapabilityUse,\n type DeclarativeCapabilityUse,\n} from \"./capability-use\";\n\nconst SOURCE_WIDGET_MARKER = \"__fluidSourceWidget\";\nconst SOURCE_WIDGET_PACKAGE_MARKER = \"__fluidSourceWidgetPackage\";\n\ninterface RegisteredPortalFunctions {\n readonly capabilities: readonly WidgetSourceCapabilityDeclaration[];\n readonly functions: readonly RemoteDomCapabilityFunctionMetadata[];\n}\n\nconst portalFunctionsByWidgetName = new Map<\n string,\n RegisteredPortalFunctions[]\n>();\n\n/** JSON-serializable default props accepted by a source widget. */\nexport type WidgetSourceDefaultProps = Readonly<Record<string, JsonValue>>;\n\n/** Builder resize behavior declared by a source widget. */\nexport type WidgetSourceResizable =\n | boolean\n | \"horizontal\"\n | \"vertical\"\n | \"both\"\n | {\n /** Allow horizontal resizing. */\n readonly horizontal?: boolean;\n /** Allow vertical resizing. */\n readonly vertical?: boolean;\n /** Minimum width in builder layout units. */\n readonly minWidth?: number;\n /** Minimum height in builder layout units. */\n readonly minHeight?: number;\n };\n\n/** Versioned host capability required by a widget. */\nexport interface WidgetSourceCapabilityDeclaration {\n /** Stable capability name enforced by the worker and host. */\n readonly name: string;\n /** Capability contract version required by the widget. */\n readonly version: string;\n}\n\n/** Authoring options accepted by {@link defineWidget}. */\nexport interface DefineWidgetOptions<\n Name extends string = string,\n Props = WidgetSourceDefaultProps,\n> {\n /** Stable URL-safe widget name used in the canonical widget type. */\n readonly name: Name;\n /** React component rendered by the Remote DOM worker. */\n readonly component: ComponentType<Props & object>;\n /** Human-readable builder palette name. */\n readonly displayName?: string;\n /** Builder palette description of the widget's purpose. */\n readonly description?: string;\n /** Icon identifier displayed in the builder palette. */\n readonly icon?: string;\n /** Builder palette category. */\n readonly category?: string;\n /** JSON-serializable property editor schema. */\n readonly propertySchema?: WidgetSourcePropertySchema;\n /** JSON-serializable props assigned to new widget instances. */\n readonly defaultProps?: Partial<Props>;\n /** Host layout treatment for the widget. */\n readonly container?: \"inline\" | \"block\" | \"card\" | \"fullscreen\";\n /** Oldest portal SDK version that can host the widget. */\n readonly minSdkVersion?: string;\n /** Typed portal functions and declarative capabilities used by the widget. */\n readonly uses?: readonly (AnyPortalFunction | DeclarativeCapabilityUse)[];\n /** Builder resize behavior and optional minimum dimensions. */\n readonly resizable?: WidgetSourceResizable;\n}\n\n/** Normalized source widget returned by {@link defineWidget}. */\nexport interface SourceWidget<\n Name extends string = string,\n Props = WidgetSourceDefaultProps,\n> extends DefineWidgetOptions<Name, Props> {\n /** Internal marker that distinguishes normalized source widgets. */\n readonly [SOURCE_WIDGET_MARKER]: true;\n /** Normalized defaults; an omitted author value becomes an empty object. */\n readonly defaultProps: Partial<Props>;\n /** Normalized typed functions and declarative capability markers. */\n readonly uses: readonly (AnyPortalFunction | DeclarativeCapabilityUse)[];\n /** Capability declarations derived from {@link uses}. */\n readonly capabilities: readonly WidgetSourceCapabilityDeclaration[];\n}\n\n/** Heterogeneous source widget type used by package arrays. */\n// oxlint-disable-next-line typescript/no-explicit-any -- a package intentionally contains widgets with heterogeneous props.\nexport type AnySourceWidget = SourceWidget<string, any>;\n\ninterface DefineWidgetPackageBase<Scope extends string = string> {\n /** Namespace used as the first segment of the package id. */\n readonly scope: Scope;\n /** SemVer package version without build metadata. @defaultValue `\"0.0.0-dev\"` */\n readonly version?: string;\n /** Widgets published in this package. */\n readonly widgets: readonly AnySourceWidget[];\n /** Absolute runtime stylesheet URLs; build tooling normally injects these. */\n readonly cssUrls?: readonly string[];\n}\n\n/** Authoring options accepted by {@link defineWidgetPackage}. */\nexport type DefineWidgetPackageOptions<\n Scope extends string = string,\n StableId extends string = string,\n> = DefineWidgetPackageBase<Scope> &\n (\n | {\n /** Company-owned package. This is the default package type. */\n readonly packageType?: \"company\";\n /** Stable company owner identifier. */\n readonly packageStableId: StableId;\n }\n | {\n /** Standalone package owned by a Droplet. */\n readonly packageType: \"droplet\";\n /** Stable Droplet identifier; the CLI can inject it during publication. */\n readonly packageStableId?: StableId;\n }\n );\n\n/** Canonical source package returned by {@link defineWidgetPackage}. */\nexport interface SourceWidgetPackage<\n Scope extends string = string,\n StableId extends string = string,\n> {\n /** Internal marker that distinguishes normalized source packages. */\n readonly [SOURCE_WIDGET_PACKAGE_MARKER]: true;\n /** Widget package descriptor format version. */\n readonly manifestVersion: 1;\n /** Namespace used as the first segment of the package id. */\n readonly scope: Scope;\n /** Stable company or droplet owner identifier. */\n readonly packageStableId: StableId;\n /** Canonical `${scope}.${packageStableId}` package id. */\n readonly packageId: `${Scope}.${StableId}`;\n /** Ownership model used for validation, consent, and publication. */\n readonly packageType: \"company\" | \"droplet\";\n /** Normalized SemVer package version. */\n readonly version: string;\n /** Widgets included in the package. */\n readonly widgets: readonly AnySourceWidget[];\n /** Runtime stylesheet URLs included in the published descriptor. */\n readonly cssUrls: readonly string[];\n}\n\n/** Generated runtime widget definition accepted by {@link startWidgetPackage}. */\nexport interface RuntimeSourceWidget {\n /** Fully qualified widget type registered with the worker runtime. */\n readonly type: string;\n /** Source name retained by generated company worker entries. */\n readonly name?: string;\n /** React component rendered for this runtime widget type. */\n readonly component: ComponentType<Record<string, unknown>>;\n /** Capability declarations enforced for generated runtime widgets. */\n readonly capabilities?: readonly WidgetSourceCapabilityDeclaration[];\n}\n\n/** Generated-worker options accepted by {@link startWidgetPackage}. */\nexport interface StartWidgetPackageOptions {\n /** Generated runtime widgets to register when no source package is available. */\n readonly widgets: readonly RuntimeSourceWidget[];\n}\n\n/**\n * Defines one widget and derives its enforced capability declarations.\n *\n * @param options - Component, builder metadata, defaults, property schema, and typed capability uses.\n * @returns The normalized widget used by {@link defineWidgetPackage}.\n * @throws If `uses` contains an invalid entry or conflicting capability versions.\n * @remarks Call during worker module initialization. Default props and property values must cross the worker boundary as JSON values. Every Portal function the component calls must appear in `uses`.\n *\n * @example\n * ```tsx\n * const greeting = defineWidget({\n * name: \"greeting\",\n * displayName: \"Greeting\",\n * component: Greeting,\n * defaultProps: { message: \"Hello\" },\n * uses: [getUserAccount],\n * });\n * ```\n */\nexport function defineWidget<\n const Name extends string,\n Props = WidgetSourceDefaultProps,\n>(options: DefineWidgetOptions<Name, Props>): SourceWidget<Name, Props> {\n const uses = options.uses ?? [];\n const normalized = normalizePortalFunctions(uses);\n const registrations = portalFunctionsByWidgetName.get(options.name) ?? [];\n registrations.push(normalized);\n portalFunctionsByWidgetName.set(options.name, registrations);\n return {\n ...options,\n [SOURCE_WIDGET_MARKER]: true,\n defaultProps: options.defaultProps ?? {},\n uses,\n capabilities: normalized.capabilities,\n };\n}\n\n/**\n * Defines a company- or droplet-owned widget package.\n *\n * @param options - Package identity, SemVer version, widgets, and optional runtime stylesheets.\n * @returns A canonical source package descriptor. Build and dev replace runtime artifact URLs.\n * @throws If a company package omits `packageStableId`.\n * @remarks Define one package during worker module initialization. Company packages require a stable company identifier; Droplet publication can inject its stable identifier through the CLI.\n *\n * @example\n * ```ts\n * const widgetPackage = defineWidgetPackage({\n * scope: \"acme\",\n * packageStableId: \"company-public-id\",\n * version: \"1.0.0\",\n * widgets: [greeting],\n * });\n * ```\n */\nexport function defineWidgetPackage<\n const Scope extends string,\n const StableId extends string,\n>(\n options: DefineWidgetPackageOptions<Scope, StableId>,\n): SourceWidgetPackage<Scope, StableId> {\n const packageType = options.packageType ?? \"company\";\n const packageStableId = options.packageStableId;\n if (!packageStableId && packageType !== \"droplet\") {\n throw new Error(\n \"defineWidgetPackage requires packageStableId for company packages.\",\n );\n }\n\n const stableId = (packageStableId ?? \"__fluid_cli_managed__\") as StableId;\n const hasLegacyNavigationOrigins = Object.prototype.hasOwnProperty.call(\n options,\n \"navigationOrigins\",\n );\n const legacyNavigationOrigins = (\n options as unknown as Record<string, unknown>\n ).navigationOrigins;\n return {\n [SOURCE_WIDGET_PACKAGE_MARKER]: true,\n manifestVersion: 1,\n scope: options.scope,\n packageStableId: stableId,\n packageId: `${options.scope}.${stableId}`,\n packageType,\n version: options.version ?? \"0.0.0-dev\",\n widgets: options.widgets,\n cssUrls: options.cssUrls ?? [],\n ...(hasLegacyNavigationOrigins\n ? { navigationOrigins: legacyNavigationOrigins }\n : {}),\n };\n}\n\n/**\n * Starts one Remote DOM worker containing every widget in the source package.\n *\n * @param widgetPackage - A source package or generated runtime widget list.\n * @returns A controller that owns the worker connection and registered widget definitions.\n * @throws If generated widgets cannot be matched to an unambiguous source `uses` declaration.\n * @remarks Call once from the worker entry after all widgets and the package are defined. The returned controller owns the active Remote DOM connection.\n *\n * @example\n * ```ts\n * startWidgetPackage(widgetPackage);\n * ```\n */\nexport function startWidgetPackage(\n widgetPackage: SourceWidgetPackage | StartWidgetPackageOptions,\n): RemoteDomWidgetWorkerController {\n const widgets =\n \"packageId\" in widgetPackage\n ? Object.fromEntries(\n widgetPackage.widgets.map((widget) => [\n `${getCanonicalRuntimePackageId(widgetPackage)}.${widget.name}`,\n {\n component: widget.component,\n capabilities: widget.capabilities,\n functions: readSourcePortalFunctions(widget),\n },\n ]),\n )\n : Object.fromEntries(\n widgetPackage.widgets.map((widget) => [\n widget.type,\n {\n component: widget.component,\n capabilities: widget.capabilities ?? [],\n functions: readGeneratedPortalFunctions(widget),\n },\n ]),\n );\n return startRemoteDomWidgetWorker({\n widgets: widgets as Readonly<\n Record<string, RemoteDomWidgetWorkerDefinition>\n >,\n });\n}\n\nfunction normalizePortalFunctions(\n uses: readonly (AnyPortalFunction | DeclarativeCapabilityUse)[],\n): {\n readonly capabilities: readonly WidgetSourceCapabilityDeclaration[];\n readonly functions: readonly RemoteDomCapabilityFunctionMetadata[];\n} {\n const versionByCapability = new Map<string, string>();\n const functionsByIdentity = new Map<\n string,\n RemoteDomCapabilityFunctionMetadata\n >();\n for (const portalFunction of uses) {\n if (isDeclarativeCapabilityUse(portalFunction)) {\n const currentVersion = versionByCapability.get(portalFunction.name);\n if (currentVersion && currentVersion !== portalFunction.version) {\n throw new Error(\n `defineWidget cannot use capability \"${portalFunction.name}\" at both version \"${currentVersion}\" and version \"${portalFunction.version}\".`,\n );\n }\n versionByCapability.set(portalFunction.name, portalFunction.version);\n continue;\n }\n const metadata = getPortalFunctionMetadata(portalFunction);\n if (!metadata) {\n throw new Error(\n \"defineWidget uses must contain portal functions or declarative capability markers.\",\n );\n }\n\n const currentVersion = versionByCapability.get(metadata.capability);\n if (currentVersion && currentVersion !== metadata.version) {\n throw new Error(\n `defineWidget cannot use capability \"${metadata.capability}\" at both version \"${currentVersion}\" and version \"${metadata.version}\".`,\n );\n }\n versionByCapability.set(metadata.capability, metadata.version);\n functionsByIdentity.set(\n JSON.stringify([metadata.capability, metadata.version, metadata.method]),\n metadata,\n );\n }\n\n return {\n capabilities: [...versionByCapability].map(([name, version]) => ({\n name,\n version,\n })),\n functions: [...functionsByIdentity.values()],\n };\n}\n\nfunction readGeneratedPortalFunctions(\n widget: RuntimeSourceWidget,\n): readonly RemoteDomCapabilityFunctionMetadata[] {\n if (!widget.name) return [];\n const registrations = portalFunctionsByWidgetName.get(widget.name) ?? [];\n portalFunctionsByWidgetName.delete(widget.name);\n const capabilities = widget.capabilities ?? [];\n const matchingRegistrations = registrations.filter((registration) =>\n haveSameCapabilityDeclarations(registration.capabilities, capabilities),\n );\n const uniqueFunctions = new Map<\n string,\n readonly RemoteDomCapabilityFunctionMetadata[]\n >();\n for (const registration of matchingRegistrations) {\n uniqueFunctions.set(\n portalFunctionSetKey(registration.functions),\n registration.functions,\n );\n }\n\n if (uniqueFunctions.size > 1) {\n throw new Error(\n `Generated worker entry cannot recover an unambiguous uses declaration for widget \"${widget.name}\" (${widget.type}). Multiple widgets with that name declare the same capabilities but different portal functions; give every source widget a unique name.`,\n );\n }\n\n return uniqueFunctions.values().next().value ?? [];\n}\n\nfunction readSourcePortalFunctions(\n widget: AnySourceWidget,\n): readonly RemoteDomCapabilityFunctionMetadata[] {\n portalFunctionsByWidgetName.delete(widget.name);\n return normalizePortalFunctions(widget.uses).functions;\n}\n\nfunction haveSameCapabilityDeclarations(\n left: readonly WidgetSourceCapabilityDeclaration[],\n right: readonly WidgetSourceCapabilityDeclaration[],\n): boolean {\n if (left.length !== right.length) return false;\n const rightKeys = new Set(\n right.map(({ name, version }) => JSON.stringify([name, version])),\n );\n return left.every(({ name, version }) =>\n rightKeys.has(JSON.stringify([name, version])),\n );\n}\n\nfunction portalFunctionSetKey(\n functions: readonly RemoteDomCapabilityFunctionMetadata[],\n): string {\n return JSON.stringify(\n functions\n .map(({ capability, version, method }) => [capability, version, method])\n .sort(([leftCapability, leftVersion, leftMethod], right) =>\n `${leftCapability}\\u0000${leftVersion}\\u0000${leftMethod}`.localeCompare(\n right.join(\"\\u0000\"),\n ),\n ),\n );\n}\n\nfunction getCanonicalRuntimePackageId(\n widgetPackage: SourceWidgetPackage,\n): string {\n const owner = widgetPackage.packageType;\n const scope = widgetPackage.scope;\n const stableId = widgetPackage.packageStableId;\n const packageKey =\n scope !== \"company\" &&\n scope !== \"droplet\" &&\n !stableId.startsWith(`${scope}.`)\n ? `${scope}.${stableId}`\n : stableId;\n return `${owner}.${packageKey}`;\n}\n\nexport type { RemoteDomWidgetWorkerController };\n","import { createElement, useEffect, useRef, type ReactElement } from \"react\";\nimport {\n FLUID_SEARCH_SORT_EVENT_NAMES,\n FLUID_SEARCH_SORT_TAG_NAME,\n type FluidSearchSortElementProperties,\n type FluidSearchSortEventDetails,\n type FluidSearchSortEventName,\n} from \"../../contract/elements/search-sort\";\n\n/** Props for the worker-safe Portal search and sort control. */\nexport interface SearchSortProps extends FluidSearchSortElementProperties {\n /** Called when the search value changes. */\n readonly onSearchChange: (value: string) => void;\n /** Called when the selected sort value changes. */\n readonly onSortChange?: (value: string) => void;\n}\n\n/**\n * Renders the Portal-provided search and sort control in a Remote DOM widget.\n *\n * @param props - Search, sort, option, and change-handler configuration.\n * @returns A worker-safe React element backed by the Portal custom element.\n * @remarks Render this component only inside a started Remote DOM widget worker. The Portal host owns its visual implementation.\n * @example\n * ```tsx\n * <SearchSort\n * searchValue={query}\n * placeholder=\"Search products\"\n * onSearchChange={setQuery}\n * />\n * ```\n */\nexport function SearchSort({\n onSearchChange,\n onSortChange,\n ...props\n}: SearchSortProps): ReactElement {\n const elementRef = useRef<HTMLElement | null>(null);\n const searchChangeRef = useRef(onSearchChange);\n const sortChangeRef = useRef(onSortChange);\n searchChangeRef.current = onSearchChange;\n sortChangeRef.current = onSortChange;\n\n useEffect(() => {\n const element = elementRef.current;\n if (!element) return;\n const handleSearchChange = (event: Event): void => {\n const value = readRemoteEventValue(event);\n if (value !== undefined) searchChangeRef.current(value);\n };\n const handleSortChange = (event: Event): void => {\n const value = readRemoteEventValue(event);\n if (value !== undefined) sortChangeRef.current?.(value);\n };\n element.addEventListener(\n FLUID_SEARCH_SORT_EVENT_NAMES.searchChange,\n handleSearchChange,\n );\n element.addEventListener(\n FLUID_SEARCH_SORT_EVENT_NAMES.sortChange,\n handleSortChange,\n );\n return () => {\n element.removeEventListener(\n FLUID_SEARCH_SORT_EVENT_NAMES.searchChange,\n handleSearchChange,\n );\n element.removeEventListener(\n FLUID_SEARCH_SORT_EVENT_NAMES.sortChange,\n handleSortChange,\n );\n };\n }, []);\n\n return createElement(FLUID_SEARCH_SORT_TAG_NAME, {\n ...props,\n ref: elementRef,\n });\n}\n\nfunction readRemoteEventValue(\n event: Event,\n): FluidSearchSortEventDetails[FluidSearchSortEventName] | undefined {\n if (!(event instanceof CustomEvent)) return undefined;\n if (typeof event.detail === \"string\") return event.detail;\n if (\n typeof event.detail === \"object\" &&\n event.detail !== null &&\n \"detail\" in event.detail &&\n typeof event.detail.detail === \"string\"\n ) {\n return event.detail.detail;\n }\n return undefined;\n}\n","import { createElement, type ReactElement } from \"react\";\nimport {\n FLUID_SPACER_WIDGET_TAG_NAME,\n type FluidSpacerWidgetElementProperties,\n} from \"../../contract/elements/fluid-spacer-widget\";\n\n/** Props for the worker-safe Portal spacer element. */\nexport interface FluidSpacerWidgetProps {\n /** Explicit spacer height accepted by the Portal element. */\n readonly customHeight?: FluidSpacerWidgetElementProperties[\"customHeight\"];\n /** Whether the spacer is rendered in builder preview mode. */\n readonly previewMode?: FluidSpacerWidgetElementProperties[\"previewMode\"];\n}\n\n/**\n * Renders a Portal spacer inside a Remote DOM widget.\n *\n * @param props - Spacer height and preview state.\n * @returns A worker-safe React element backed by the Portal custom element.\n * @remarks Render this component only inside a started Remote DOM widget worker. The Portal host determines the final layout behavior.\n * @example\n * ```tsx\n * <FluidSpacerWidget customHeight={24} />\n * ```\n */\nexport function FluidSpacerWidget(props: FluidSpacerWidgetProps): ReactElement {\n return createElement(FLUID_SPACER_WIDGET_TAG_NAME, props);\n}\n"],"mappings":"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"}