@dreamboard-games/sdk 0.4.0-alpha.5 → 0.4.0-alpha.7

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 (95) hide show
  1. package/REFERENCE.md +1493 -127
  2. package/dist/{HandView-x8MhbhFl.d.ts → HandView-Bi2lxzQP.d.ts} +3 -3
  3. package/dist/{ThemeProvider-DRalAWzY.d.ts → ThemeProvider-CElaL2ik.d.ts} +1 -1
  4. package/dist/authoring/index.d.ts +5 -4
  5. package/dist/authoring/index.js +4 -4
  6. package/dist/authoring/index.js.map +1 -1
  7. package/dist/browser-interaction.js +1 -1
  8. package/dist/{chunk-E3X552YM.js → chunk-2TRZSZGD.js} +1061 -425
  9. package/dist/chunk-2TRZSZGD.js.map +1 -0
  10. package/dist/{chunk-K5ZRJTZZ.js → chunk-3QIZKXJ2.js} +10 -5
  11. package/dist/chunk-3QIZKXJ2.js.map +1 -0
  12. package/dist/{chunk-KHY3RJLT.js → chunk-52DH7VQF.js} +62 -13
  13. package/dist/chunk-52DH7VQF.js.map +1 -0
  14. package/dist/chunk-5IHU5CUK.js +575 -0
  15. package/dist/chunk-5IHU5CUK.js.map +1 -0
  16. package/dist/{chunk-N6ZDIMRB.js → chunk-B2YBS3SG.js} +1 -1
  17. package/dist/chunk-B2YBS3SG.js.map +1 -0
  18. package/dist/chunk-IU6KGPY7.js +659 -0
  19. package/dist/chunk-IU6KGPY7.js.map +1 -0
  20. package/dist/{chunk-FXQPZZXC.js → chunk-KYEWGZ2Y.js} +2 -2
  21. package/dist/{chunk-FXQPZZXC.js.map → chunk-KYEWGZ2Y.js.map} +1 -1
  22. package/dist/{chunk-AQMEN3AT.js → chunk-NO537WSS.js} +2 -2
  23. package/dist/{chunk-TTISZQNI.js → chunk-Q322XCY2.js} +47 -31
  24. package/dist/chunk-Q322XCY2.js.map +1 -0
  25. package/dist/{chunk-QOFFRHZR.js → chunk-RKGJ64UN.js} +81 -41
  26. package/dist/chunk-RKGJ64UN.js.map +1 -0
  27. package/dist/{chunk-Y6Y2YABD.js → chunk-TGMXBRKY.js} +22 -6
  28. package/dist/chunk-TGMXBRKY.js.map +1 -0
  29. package/dist/{chunk-XZ667T4K.js → chunk-UC2UXAC6.js} +2 -2
  30. package/dist/chunk-VLG4YST5.js +564 -0
  31. package/dist/chunk-VLG4YST5.js.map +1 -0
  32. package/dist/{chunk-WUIVY2KE.js → chunk-WHR5UW3F.js} +1 -1
  33. package/dist/chunk-WHR5UW3F.js.map +1 -0
  34. package/dist/codegen.d.ts +13 -0
  35. package/dist/codegen.js +1 -1
  36. package/dist/{components-B7hFaEn_.d.ts → components-BTwSIjXj.d.ts} +77 -206
  37. package/dist/{stale-contract-artifact-error-BelRiIDR.d.ts → diagnostics-1BWjRo6-.d.ts} +1 -18
  38. package/dist/{hex-board-view-BFlWDb9k.d.ts → hex-board-view-aKkblDp6.d.ts} +180 -1
  39. package/dist/{index-gjxQichK.d.ts → index-CFTjJIXd.d.ts} +5 -4
  40. package/dist/{index.d-BL3bT5lt.d.ts → index.d-DMASeF6M.d.ts} +294 -27
  41. package/dist/index.js +2 -2
  42. package/dist/package-set.d.ts +2 -2
  43. package/dist/package-set.js +2 -2
  44. package/dist/{runtime-api-BJharVaj.d.ts → plugin-state-BRH3UiUp.d.ts} +19 -3
  45. package/dist/{protocol-BP193lva.d.ts → protocol-835hEGne.d.ts} +42 -1
  46. package/dist/reducer/advanced.d.ts +4 -2
  47. package/dist/reducer/advanced.js +1 -1
  48. package/dist/reducer-contract.d.ts +1 -1
  49. package/dist/reducer-contract.js +2 -2
  50. package/dist/reducer.d.ts +13 -6
  51. package/dist/reducer.js +322 -20
  52. package/dist/reducer.js.map +1 -1
  53. package/dist/reference-games/index.d.ts +223 -0
  54. package/dist/reference-games/index.js +230 -0
  55. package/dist/reference-games/index.js.map +1 -0
  56. package/dist/runtime/primitives.d.ts +32 -7
  57. package/dist/runtime/primitives.js +10 -5
  58. package/dist/runtime/runtime-api.d.ts +1 -1
  59. package/dist/runtime/workspace-contract.d.ts +7 -7
  60. package/dist/runtime/workspace-contract.js +7 -6
  61. package/dist/runtime-Dkfm1x2r.d.ts +1670 -0
  62. package/dist/runtime.d.ts +10 -9
  63. package/dist/runtime.js +53 -19
  64. package/dist/runtime.js.map +1 -1
  65. package/dist/stale-contract-artifact-error-C5AaZPJ8.d.ts +18 -0
  66. package/dist/testing-runtime.d.ts +42 -0
  67. package/dist/testing-runtime.js +153 -0
  68. package/dist/testing-runtime.js.map +1 -0
  69. package/dist/testing.d.ts +82 -205
  70. package/dist/testing.js +83 -640
  71. package/dist/testing.js.map +1 -1
  72. package/dist/types-DcADVHe9.d.ts +192 -0
  73. package/dist/{types-CYeN0wLK.d.ts → types-aI4V9CWe.d.ts} +5 -5
  74. package/dist/types.d.ts +13 -0
  75. package/dist/ui/components.d.ts +6 -3
  76. package/dist/ui/components.js +15 -3
  77. package/dist/ui/plugin-styles.css +2 -2
  78. package/dist/{ui-contract-B4NjRlvC.d.ts → ui-contract-Ue6SywvO.d.ts} +24 -10
  79. package/dist/ui.d.ts +9 -6
  80. package/dist/ui.js +16 -4
  81. package/dist/views-32rSsfeU.d.ts +1559 -0
  82. package/package.json +33 -21
  83. package/dist/chunk-E3X552YM.js.map +0 -1
  84. package/dist/chunk-K5ZRJTZZ.js.map +0 -1
  85. package/dist/chunk-KHY3RJLT.js.map +0 -1
  86. package/dist/chunk-N6ZDIMRB.js.map +0 -1
  87. package/dist/chunk-O6M6PN4E.js +0 -1225
  88. package/dist/chunk-O6M6PN4E.js.map +0 -1
  89. package/dist/chunk-QOFFRHZR.js.map +0 -1
  90. package/dist/chunk-TTISZQNI.js.map +0 -1
  91. package/dist/chunk-WUIVY2KE.js.map +0 -1
  92. package/dist/chunk-Y6Y2YABD.js.map +0 -1
  93. package/dist/views-fn2RuXOx.d.ts +0 -3168
  94. /package/dist/{chunk-AQMEN3AT.js.map → chunk-NO537WSS.js.map} +0 -0
  95. /package/dist/{chunk-XZ667T4K.js.map → chunk-UC2UXAC6.js.map} +0 -0
@@ -1,12 +1,14 @@
1
1
  import {
2
- HostToPluginEnvelopeSchema,
3
2
  InteractionUiProvider,
4
3
  PluginGameplayFrameProvider,
5
4
  PluginSessionProvider,
6
5
  RuntimeContext,
7
- RuntimeJsonSchema,
8
6
  usePluginSession
9
- } from "./chunk-O6M6PN4E.js";
7
+ } from "./chunk-VLG4YST5.js";
8
+ import {
9
+ HostToPluginEnvelopeSchema,
10
+ RuntimeJsonSchema
11
+ } from "./chunk-5IHU5CUK.js";
10
12
 
11
13
  // src/runtime/core/create-plugin-runtime-client.ts
12
14
  var defaultClock = {
@@ -85,7 +87,10 @@ function createPluginRuntimeClient(options) {
85
87
  }
86
88
  const parseResult = HostToPluginEnvelopeSchema.safeParse(rawMessage);
87
89
  if (!parseResult.success) {
88
- sendRuntimeError("Invalid host-to-plugin protocol envelope.", "invalid-envelope");
90
+ sendRuntimeError(
91
+ "Invalid host-to-plugin protocol envelope.",
92
+ "invalid-envelope"
93
+ );
89
94
  return;
90
95
  }
91
96
  const message = parseResult.data;
@@ -325,4 +330,4 @@ export {
325
330
  createPluginRuntimeClient,
326
331
  PluginRuntimeBoundary
327
332
  };
328
- //# sourceMappingURL=chunk-K5ZRJTZZ.js.map
333
+ //# sourceMappingURL=chunk-3QIZKXJ2.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/runtime/core/create-plugin-runtime-client.ts","../src/runtime/components/PluginRuntimeBoundary.tsx"],"sourcesContent":["import {\n HostToPluginEnvelopeSchema,\n RuntimeJsonSchema,\n type HostToPluginEnvelope,\n type PluginGameplayFrame,\n type PluginInteractionBasis,\n type PluginSessionDescriptor,\n type SubmissionResult,\n type ValidationResult,\n} from \"@dreamboard-games/plugin-runtime-contract\";\nimport type {\n PluginRuntimeClient,\n PluginRuntimeClientOptions,\n RuntimeClock,\n RuntimeIdFactory,\n} from \"./types.js\";\n\nconst defaultClock: RuntimeClock = {\n now: () => Date.now(),\n};\n\nconst defaultIdFactory: RuntimeIdFactory = {\n nextId: (prefix) => {\n const cryptoLike = (\n globalThis as typeof globalThis & {\n crypto?: { randomUUID?: () => string };\n }\n ).crypto;\n if (cryptoLike?.randomUUID) {\n try {\n return `${prefix}-${cryptoLike.randomUUID()}`;\n } catch {\n // Fall through to deterministic-enough fallback for older test DOMs.\n }\n }\n return `${prefix}-${Date.now().toString(16)}-${Math.random()\n .toString(16)\n .slice(2)}`;\n },\n};\n\nfunction createSubmissionError(\n result: Extract<SubmissionResult, { accepted: false }>,\n): Error & { errorCode?: string } {\n const error = new Error(result.message ?? \"Submission failed\") as Error & {\n errorCode?: string;\n };\n error.name = \"SubmissionError\";\n error.errorCode = result.errorCode;\n return error;\n}\n\nfunction disconnectedValidationResult(): ValidationResult {\n return {\n valid: false,\n errorCode: \"runtime-disconnected\",\n message: \"Plugin runtime disconnected\",\n };\n}\n\nexport function createPluginRuntimeClient(\n options: PluginRuntimeClientOptions,\n): PluginRuntimeClient {\n const clock = options.clock ?? defaultClock;\n const idFactory = options.idFactory ?? defaultIdFactory;\n const requestTimeoutMs = options.requestTimeoutMs ?? 10_000;\n let session: PluginSessionDescriptor | null = null;\n let frame: PluginGameplayFrame | null = null;\n let disconnected = false;\n let stopTransport: (() => void) | undefined;\n const sessionListeners = new Set<() => void>();\n const frameListeners = new Set<() => void>();\n const pendingValidations = new Map<\n string,\n (result: ValidationResult) => void\n >();\n const pendingSubmissions = new Map<\n string,\n {\n resolve: () => void;\n reject: (error: Error & { errorCode?: string }) => void;\n }\n >();\n\n const notifySession = () => {\n for (const listener of sessionListeners) {\n listener();\n }\n };\n\n const notifyFrame = () => {\n for (const listener of frameListeners) {\n listener();\n }\n };\n\n const currentBasis = (): PluginInteractionBasis => {\n if (!frame) {\n throw new Error(\"Plugin runtime has not received a gameplay frame.\");\n }\n return {\n gameVersion: frame.gameVersion,\n actionSetVersion: frame.actionSetVersion,\n perspectivePlayerId: frame.perspectivePlayerId,\n };\n };\n\n const sendRuntimeError = (message: string, code?: string) => {\n if (disconnected) {\n return;\n }\n options.transport.send({\n type: \"runtime.error\",\n message,\n ...(code ? { code } : {}),\n });\n };\n\n const handleHostMessage = (rawMessage: HostToPluginEnvelope) => {\n if (disconnected) {\n return;\n }\n const parseResult = HostToPluginEnvelopeSchema.safeParse(rawMessage);\n if (!parseResult.success) {\n sendRuntimeError(\n \"Invalid host-to-plugin protocol envelope.\",\n \"invalid-envelope\",\n );\n return;\n }\n const message = parseResult.data;\n const clientReceivedAtMs = clock.now();\n\n switch (message.payload.type) {\n case \"runtime.init\": {\n session = message.payload.session;\n notifySession();\n options.transport.send({ type: \"runtime.ready\" });\n options.transport.send({\n type: \"runtime.ack\",\n sequence: message.sequence,\n clientReceivedAtMs,\n });\n break;\n }\n case \"gameplay.frame\": {\n frame = message.payload.frame;\n notifyFrame();\n const sendRenderedAck = () => {\n if (disconnected) {\n return;\n }\n options.transport.send({\n type: \"runtime.ack\",\n sequence: message.sequence,\n clientReceivedAtMs,\n clientRenderedAtMs: clock.now(),\n });\n };\n if (typeof requestAnimationFrame === \"function\") {\n requestAnimationFrame(sendRenderedAck);\n } else {\n queueMicrotask(sendRenderedAck);\n }\n break;\n }\n case \"interaction.validation-result\": {\n const resolve = pendingValidations.get(message.payload.requestId);\n if (resolve) {\n pendingValidations.delete(message.payload.requestId);\n resolve(message.payload.result);\n }\n break;\n }\n case \"interaction.submit-result\": {\n const pending = pendingSubmissions.get(message.payload.requestId);\n if (!pending) {\n break;\n }\n pendingSubmissions.delete(message.payload.requestId);\n if (message.payload.result.accepted) {\n pending.resolve();\n } else {\n pending.reject(createSubmissionError(message.payload.result));\n }\n break;\n }\n default: {\n const _exhaustive: never = message.payload;\n return _exhaustive;\n }\n }\n };\n\n stopTransport = options.transport.start(handleHostMessage);\n\n const rejectPending = () => {\n for (const resolve of pendingValidations.values()) {\n resolve(disconnectedValidationResult());\n }\n pendingValidations.clear();\n for (const pending of pendingSubmissions.values()) {\n const error = new Error(\"Plugin runtime disconnected\") as Error & {\n errorCode?: string;\n };\n error.name = \"SubmissionError\";\n error.errorCode = \"runtime-disconnected\";\n pending.reject(error);\n }\n pendingSubmissions.clear();\n };\n\n return {\n getSession: () => session,\n subscribeSession: (listener) => {\n sessionListeners.add(listener);\n return () => {\n sessionListeners.delete(listener);\n };\n },\n getFrame: () => frame,\n subscribeFrame: (listener) => {\n frameListeners.add(listener);\n return () => {\n frameListeners.delete(listener);\n };\n },\n validateInteraction: async (interactionId, params) =>\n new Promise((resolve) => {\n if (disconnected) {\n resolve(disconnectedValidationResult());\n return;\n }\n let basis: PluginInteractionBasis;\n try {\n basis = currentBasis();\n } catch (error) {\n resolve({\n valid: false,\n errorCode: \"runtime-not-ready\",\n message:\n error instanceof Error\n ? error.message\n : \"Plugin runtime is not ready.\",\n });\n return;\n }\n const parsedParams = RuntimeJsonSchema.safeParse(params);\n if (!parsedParams.success) {\n resolve({\n valid: false,\n errorCode: \"invalid-runtime-json\",\n message: \"Interaction params must be runtime JSON.\",\n });\n return;\n }\n const requestId = idFactory.nextId(\"validate\");\n pendingValidations.set(requestId, resolve);\n options.transport.send({\n type: \"interaction.validate\",\n requestId,\n basis,\n interactionId,\n params: parsedParams.data,\n });\n setTimeout(() => {\n if (!pendingValidations.delete(requestId)) {\n return;\n }\n resolve({\n valid: false,\n errorCode: \"validation-timeout\",\n message: \"Validation request timed out\",\n });\n }, requestTimeoutMs);\n }),\n submitInteraction: async (interactionId, params) =>\n new Promise((resolve, reject) => {\n if (disconnected) {\n const error = new Error(\"Plugin runtime disconnected\") as Error & {\n errorCode?: string;\n };\n error.name = \"SubmissionError\";\n error.errorCode = \"runtime-disconnected\";\n reject(error);\n return;\n }\n const parsedParams = RuntimeJsonSchema.safeParse(params);\n if (!parsedParams.success) {\n const error = new Error(\n \"Interaction params must be runtime JSON.\",\n ) as Error & { errorCode?: string };\n error.name = \"SubmissionError\";\n error.errorCode = \"invalid-runtime-json\";\n reject(error);\n return;\n }\n let basis: PluginInteractionBasis;\n try {\n basis = currentBasis();\n } catch (error) {\n const submissionError = new Error(\n error instanceof Error\n ? error.message\n : \"Plugin runtime is not ready.\",\n ) as Error & { errorCode?: string };\n submissionError.name = \"SubmissionError\";\n submissionError.errorCode = \"runtime-not-ready\";\n reject(submissionError);\n return;\n }\n const requestId = idFactory.nextId(\"submit\");\n pendingSubmissions.set(requestId, { resolve, reject });\n options.transport.send({\n type: \"interaction.submit\",\n requestId,\n basis,\n interactionId,\n params: parsedParams.data,\n });\n setTimeout(() => {\n const pending = pendingSubmissions.get(requestId);\n if (!pending) {\n return;\n }\n pendingSubmissions.delete(requestId);\n const error = new Error(\"Submission request timed out\") as Error & {\n errorCode?: string;\n };\n error.name = \"SubmissionError\";\n error.errorCode = \"submission-timeout\";\n pending.reject(error);\n }, requestTimeoutMs);\n }),\n disconnect: () => {\n disconnected = true;\n stopTransport?.();\n stopTransport = undefined;\n sessionListeners.clear();\n frameListeners.clear();\n rejectPending();\n session = null;\n frame = null;\n },\n };\n}\n","import React, { useMemo } from \"react\";\nimport { InteractionUiProvider } from \"../context/InteractionDraftContext.js\";\nimport {\n PluginSessionProvider,\n usePluginSession,\n} from \"../context/PluginSessionContext.js\";\nimport { PluginGameplayFrameProvider } from \"../context/PluginGameplayFrameContext.js\";\nimport { RuntimeContext } from \"../context/RuntimeContext.js\";\nimport type { PluginRuntimeClient } from \"../core/types.js\";\nimport type { RuntimeAPI } from \"../types/runtime-api.js\";\n\nfunction runtimeApiFromClient(runtime: PluginRuntimeClient): RuntimeAPI {\n return {\n validateInteraction: (interactionId, params) =>\n runtime.validateInteraction(interactionId, params),\n submitInteraction: (interactionId, params) =>\n runtime.submitInteraction(interactionId, params),\n getSessionState: () => {\n const session = runtime.getSession();\n const frame = runtime.getFrame();\n return {\n status: session ? \"ready\" : \"loading\",\n sessionId: session?.sessionId ?? null,\n controllingPlayerId: frame?.perspectivePlayerId ?? null,\n };\n },\n disconnect: () => runtime.disconnect(),\n };\n}\n\nexport function PluginRuntimeBoundary({\n runtime,\n children,\n}: {\n runtime: PluginRuntimeClient;\n children: React.ReactNode;\n}) {\n const runtimeApi = useMemo(() => runtimeApiFromClient(runtime), [runtime]);\n\n return (\n <RuntimeContext.Provider value={runtimeApi}>\n <PluginSessionProvider runtime={runtime}>\n <PluginGameplayFrameProvider runtime={runtime}>\n <SessionScopedInteractionUiProvider>\n {children}\n </SessionScopedInteractionUiProvider>\n </PluginGameplayFrameProvider>\n </PluginSessionProvider>\n </RuntimeContext.Provider>\n );\n}\n\nfunction SessionScopedInteractionUiProvider({\n children,\n}: {\n children: React.ReactNode;\n}) {\n const { controllingPlayerId } = usePluginSession();\n return (\n <InteractionUiProvider key={controllingPlayerId ?? \"__no_player__\"}>\n {children}\n </InteractionUiProvider>\n );\n}\n"],"mappings":"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","names":[]}
@@ -1117,6 +1117,10 @@ function collectManifestRecordKeyIssues(manifest) {
1117
1117
  value: profile.id,
1118
1118
  path: `manifest.setupProfiles[${profileIndex}].id`
1119
1119
  },
1120
+ ...(profile.guidance?.steps ?? []).map((step, stepIndex) => ({
1121
+ value: step.id,
1122
+ path: `manifest.setupProfiles[${profileIndex}].guidance.steps[${stepIndex}].id`
1123
+ })),
1120
1124
  ...Object.entries(profile.optionValues ?? {}).flatMap(
1121
1125
  ([optionId, choiceId]) => [
1122
1126
  {
@@ -1287,6 +1291,17 @@ function validateManifestAuthoring(manifest) {
1287
1291
  label: "setup profile id"
1288
1292
  })
1289
1293
  );
1294
+ for (const [profileIndex, profile] of (manifest.setupProfiles ?? []).entries()) {
1295
+ errors.push(
1296
+ ...collectDuplicateIdIssues({
1297
+ entries: (profile.guidance?.steps ?? []).map((step, stepIndex) => ({
1298
+ id: step.id,
1299
+ path: `manifest.setupProfiles[${profileIndex}].guidance.steps[${stepIndex}].id`
1300
+ })),
1301
+ label: `setup profile '${profile.id}' guidance step id`
1302
+ })
1303
+ );
1304
+ }
1290
1305
  errors.push(...validateSlotHostsAndHomes(manifest));
1291
1306
  errors.push(...validatePlayerScopedSeedHomes(manifest));
1292
1307
  errors.push(...validateCardHomes(manifest));
@@ -2604,7 +2619,15 @@ function analyzeManifest(inputManifest) {
2604
2619
  Object.entries(profile.optionValues).filter(
2605
2620
  (entry) => typeof entry[1] === "string"
2606
2621
  )
2607
- ) : null
2622
+ ) : null,
2623
+ guidance: profile.guidance ? {
2624
+ summary: profile.guidance.summary ?? null,
2625
+ steps: (profile.guidance.steps ?? []).map((step) => ({
2626
+ id: step.id,
2627
+ label: step.label,
2628
+ description: step.description ?? null
2629
+ }))
2630
+ } : null
2608
2631
  }
2609
2632
  ])
2610
2633
  );
@@ -7075,11 +7098,15 @@ import {
7075
7098
  type BoardSpaceIdOf,
7076
7099
  type InteractionVisualState,
7077
7100
  } from "@dreamboard-games/sdk/ui";
7078
- import { type InteractionDescriptor } from "@dreamboard-games/sdk/runtime";
7101
+ import {
7102
+ type BoardGridInteractionFilter,
7103
+ type InteractionDescriptor,
7104
+ } from "@dreamboard-games/sdk/runtime";
7079
7105
  import {
7080
7106
  createWorkspaceUIContract,
7081
7107
  type BoardHexGridProps as BoardHexGridPropsGeneric,
7082
7108
  type BoardHexViewProps as BoardHexViewPropsGeneric,
7109
+ type BoardSquareGridProps as BoardSquareGridPropsGeneric,
7083
7110
  type BoardSpaceTargetProps as BoardSpaceTargetPropsGeneric,
7084
7111
  type ClientParamSchemaMap,
7085
7112
  type DefineGameUIConfig,
@@ -7321,7 +7348,7 @@ export type RequiredInteractionInputKey<Key extends InteractionKey> =
7321
7348
  RequiredInteractionInputKeysOf<Key>;
7322
7349
 
7323
7350
  type InteractionSlotComponent<Props = object> = (
7324
- props: Props extends { children: unknown }
7351
+ props: Props extends { children?: unknown }
7325
7352
  ? Props
7326
7353
  : Props & { children?: ReactNode },
7327
7354
  ) => ReactElement | null;
@@ -7867,12 +7894,7 @@ type HandComponent<
7867
7894
  Vertex extends string,
7868
7895
  > = InteractionSlotComponent<
7869
7896
  Omit<HandSurfaceProps<Card, Space, Edge, Vertex>, "children"> & {
7870
- children:
7871
- | ReactNode
7872
- | ((
7873
- card: WorkspaceZoneCard,
7874
- state: InteractionVisualState,
7875
- ) => ReactNode);
7897
+ children: ReactNode;
7876
7898
  }
7877
7899
  >;
7878
7900
 
@@ -8052,17 +8074,31 @@ declare module "@dreamboard-games/sdk/runtime" {
8052
8074
  /** Generated hex-board topology source, keyed by hex-board id. */
8053
8075
  const hexStaticBoards = staticBoards.hex;
8054
8076
 
8077
+ /** Generated square-board topology source, keyed by square-board id. */
8078
+ const squareStaticBoards = staticBoards.square;
8079
+
8055
8080
  /** Union of authored hex-board ids in this workspace's manifest. */
8056
8081
  export type HexBoardId = keyof typeof hexStaticBoards & string;
8057
8082
 
8083
+ /** Union of authored square-board ids in this workspace's manifest. */
8084
+ export type SquareBoardId = keyof typeof squareStaticBoards & string;
8085
+
8058
8086
  /** Topology object for the named hex board, drawn from \`staticBoards.hex\`. */
8059
8087
  export type HexBoardTopology<Id extends HexBoardId> = (typeof hexStaticBoards)[Id];
8060
8088
 
8089
+ /** Topology object for the named square board, drawn from \`staticBoards.square\`. */
8090
+ export type SquareBoardTopology<Id extends SquareBoardId> = (typeof squareStaticBoards)[Id];
8091
+
8061
8092
  /** Space id type for the named hex board. */
8062
8093
  export type HexBoardSpaceId<Id extends HexBoardId> = BoardSpaceIdOf<
8063
8094
  HexBoardTopology<Id>
8064
8095
  >;
8065
8096
 
8097
+ /** Space id type for the named square board. */
8098
+ export type SquareBoardSpaceId<Id extends SquareBoardId> = BoardSpaceIdOf<
8099
+ SquareBoardTopology<Id>
8100
+ >;
8101
+
8066
8102
  export type HexBoardViewProps<
8067
8103
  Id extends HexBoardId,
8068
8104
  TSpaceView extends { id: HexBoardSpaceId<Id> },
@@ -8080,6 +8116,14 @@ export type HexBoardGridProps<
8080
8116
  board: Id;
8081
8117
  };
8082
8118
 
8119
+ export type SquareBoardGridProps<Id extends SquareBoardId> = Omit<
8120
+ BoardSquareGridPropsGeneric<SquareBoardTopology<Id>>,
8121
+ "board" | "interactions"
8122
+ > & {
8123
+ board: Id;
8124
+ interactions?: BoardGridInteractionFilter<InteractionKey>;
8125
+ };
8126
+
8083
8127
  type WorkspaceBoard = {
8084
8128
  surface<const Board extends BoardSurfaceBoardId>(
8085
8129
  board: Board,
@@ -8097,6 +8141,9 @@ type WorkspaceBoard = {
8097
8141
  const Id extends HexBoardId,
8098
8142
  const TSpaceView extends { id: HexBoardSpaceId<Id> },
8099
8143
  >(props: HexBoardGridProps<Id, TSpaceView>): ReactElement;
8144
+ SquareGrid<const Id extends SquareBoardId>(
8145
+ props: SquareBoardGridProps<Id>,
8146
+ ): ReactElement;
8100
8147
  };
8101
8148
 
8102
8149
  type WorkspaceCardProperties = CardProperties extends Record<string, unknown>
@@ -8257,7 +8304,8 @@ export const UI = createWorkspaceUIContract<
8257
8304
  typeof uiContract,
8258
8305
  ResourceId,
8259
8306
  WorkspaceZoneCard,
8260
- typeof hexStaticBoards
8307
+ typeof hexStaticBoards,
8308
+ typeof squareStaticBoards
8261
8309
  >({
8262
8310
  uiContract,
8263
8311
  clientParamSchemasByPhase: createClientParamSchemasByPhase(game) as ClientParamSchemaMap,
@@ -8267,6 +8315,7 @@ export const UI = createWorkspaceUIContract<
8267
8315
  Record<string, { label?: string; icon?: string }>
8268
8316
  >,
8269
8317
  hexStaticBoards,
8318
+ squareStaticBoards,
8270
8319
  cardIdFromZoneCard: (card) => card.id,
8271
8320
  zoneIdFromZoneCard: (card) => card.zone,
8272
8321
  });
@@ -8365,7 +8414,7 @@ function generateReducerDerivedSeed() {
8365
8414
  //
8366
8415
  // reduce({ state, derived, accept }) {
8367
8416
  // const winner = derived(winnerOf);
8368
- // return accept({ ...state, publicState: { ...state.publicState, winnerPlayerId: winner } });
8417
+ // return accept({ ...state, publicState: { ...state.publicState, currentLeaderId: winner } });
8369
8418
  // }
8370
8419
  //
8371
8420
  // Do NOT mirror derived values back into \`publicState\`. Keep the raw
@@ -8381,7 +8430,7 @@ function generateReducerDerivedSeed() {
8381
8430
  // name: "winnerOf",
8382
8431
  // compute: ({ state }) => {
8383
8432
  // // Example: return the first player at or above the VP target.
8384
- // return state.publicState.winnerPlayerId ?? null;
8433
+ // return state.publicState.currentLeaderId ?? null;
8385
8434
  // },
8386
8435
  // });
8387
8436
 
@@ -8792,4 +8841,4 @@ export {
8792
8841
  generateAuthoritativeFiles,
8793
8842
  generateDynamicGeneratedFiles
8794
8843
  };
8795
- //# sourceMappingURL=chunk-KHY3RJLT.js.map
8844
+ //# sourceMappingURL=chunk-52DH7VQF.js.map