@q9labsai/chalk-react 4.1.15 → 4.1.17

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 (235) hide show
  1. package/README.md +35 -2
  2. package/THIRD_PARTY_NOTICES.md +29 -0
  3. package/dist/bindings/hooks.d.ts +4 -1
  4. package/dist/bindings/hooks.d.ts.map +1 -1
  5. package/dist/{chunk-4X3NFZGL.js → chunk-C7PNVYDZ.js} +9679 -10020
  6. package/dist/chunk-FFPNO2MY.js +131 -0
  7. package/dist/chunk-OLBFC6RS.js +1422 -0
  8. package/dist/chunk-S6OVGZD5.js +3164 -0
  9. package/dist/chunk-VHM3SYMY.js +184 -0
  10. package/dist/chunk-VLAZKVNN.js +182 -0
  11. package/dist/components/atomic/Avatar.d.ts +4 -0
  12. package/dist/components/atomic/Avatar.d.ts.map +1 -1
  13. package/dist/components/atomic/ClassicAvatar.d.ts +1 -1
  14. package/dist/components/atomic/ClassicAvatar.d.ts.map +1 -1
  15. package/dist/components/atomic/ClassicReactionBubble.d.ts +2 -1
  16. package/dist/components/atomic/ClassicReactionBubble.d.ts.map +1 -1
  17. package/dist/components/atomic/ReactionBubble.d.ts +5 -2
  18. package/dist/components/atomic/ReactionBubble.d.ts.map +1 -1
  19. package/dist/components/audio-output/AudioOutput.d.ts +3 -1
  20. package/dist/components/audio-output/AudioOutput.d.ts.map +1 -1
  21. package/dist/components/chalk/Chalk.d.ts +3 -1
  22. package/dist/components/chalk/Chalk.d.ts.map +1 -1
  23. package/dist/components/composite/ChatPanel.d.ts +24 -1
  24. package/dist/components/composite/ChatPanel.d.ts.map +1 -1
  25. package/dist/components/composite/ClassicChatPanel.d.ts +23 -0
  26. package/dist/components/composite/ClassicChatPanel.d.ts.map +1 -1
  27. package/dist/components/composite/ClassicMessageBubble.d.ts.map +1 -1
  28. package/dist/components/composite/ClassicSettingsDialog.d.ts +1 -35
  29. package/dist/components/composite/ClassicSettingsDialog.d.ts.map +1 -1
  30. package/dist/components/composite/MessageBubble.d.ts +7 -1
  31. package/dist/components/composite/MessageBubble.d.ts.map +1 -1
  32. package/dist/components/composite/ReactionsOverlay.d.ts +13 -0
  33. package/dist/components/composite/ReactionsOverlay.d.ts.map +1 -1
  34. package/dist/components/composite/ScreenShareView.d.ts +8 -0
  35. package/dist/components/composite/ScreenShareView.d.ts.map +1 -1
  36. package/dist/components/composite/SettingsDialog.d.ts +2 -84
  37. package/dist/components/composite/SettingsDialog.d.ts.map +1 -1
  38. package/dist/components/composite/chat-panel-model.d.ts +17 -0
  39. package/dist/components/composite/chat-panel-model.d.ts.map +1 -1
  40. package/dist/components/composite/chat-upload-file.d.ts +8 -0
  41. package/dist/components/composite/chat-upload-file.d.ts.map +1 -0
  42. package/dist/components/composite/reaction-float.d.ts +2 -0
  43. package/dist/components/composite/reaction-float.d.ts.map +1 -1
  44. package/dist/components/composite/settings-dialog-behavior.d.ts +645 -0
  45. package/dist/components/composite/settings-dialog-behavior.d.ts.map +1 -0
  46. package/dist/components/composite/use-chat-attachment-previews.d.ts +10 -0
  47. package/dist/components/composite/use-chat-attachment-previews.d.ts.map +1 -0
  48. package/dist/components/control-bar/ClassicControlBar.d.ts +2 -1
  49. package/dist/components/control-bar/ClassicControlBar.d.ts.map +1 -1
  50. package/dist/components/control-bar/ControlBar.d.ts +8 -26
  51. package/dist/components/control-bar/ControlBar.d.ts.map +1 -1
  52. package/dist/components/control-bar/control-bar-behavior.d.ts +123 -0
  53. package/dist/components/control-bar/control-bar-behavior.d.ts.map +1 -0
  54. package/dist/components/device-popover/ClassicDevicePopover.d.ts +1 -1
  55. package/dist/components/device-popover/ClassicDevicePopover.d.ts.map +1 -1
  56. package/dist/components/device-popover/DevicePopover.d.ts +1 -0
  57. package/dist/components/device-popover/DevicePopover.d.ts.map +1 -1
  58. package/dist/components/entrance/Entrance.d.ts +2 -1
  59. package/dist/components/entrance/Entrance.d.ts.map +1 -1
  60. package/dist/components/entrance/EntranceDeviceControls.d.ts.map +1 -1
  61. package/dist/components/feedback/FeedbackDialog.d.ts +12 -0
  62. package/dist/components/feedback/FeedbackDialog.d.ts.map +1 -0
  63. package/dist/components/index.d.ts +8 -0
  64. package/dist/components/index.d.ts.map +1 -1
  65. package/dist/components/index.js +31 -6
  66. package/dist/components/invite-dialog/ClassicInviteDialog.d.ts.map +1 -1
  67. package/dist/components/invite-dialog/InviteDialog.d.ts.map +1 -1
  68. package/dist/components/lazy.d.ts +2 -2
  69. package/dist/components/lazy.d.ts.map +1 -1
  70. package/dist/components/offline-actions/OfflineActions.d.ts +17 -0
  71. package/dist/components/offline-actions/OfflineActions.d.ts.map +1 -0
  72. package/dist/components/offline-actions/OfflineActionsSetting.d.ts +4 -0
  73. package/dist/components/offline-actions/OfflineActionsSetting.d.ts.map +1 -0
  74. package/dist/components/offline-actions/offline-actions-policy.d.ts +4 -0
  75. package/dist/components/offline-actions/offline-actions-policy.d.ts.map +1 -0
  76. package/dist/components/participant-tile/ParticipantTile.d.ts +7 -1
  77. package/dist/components/participant-tile/ParticipantTile.d.ts.map +1 -1
  78. package/dist/components/participant-tile/TileShell.d.ts +3 -1
  79. package/dist/components/participant-tile/TileShell.d.ts.map +1 -1
  80. package/dist/components/participants-panel/ParticipantsPanel.d.ts.map +1 -1
  81. package/dist/components/reconnecting-overlay/ClassicReconnectingOverlay.d.ts.map +1 -1
  82. package/dist/components/reconnecting-overlay/ReconnectingNotice.d.ts +6 -0
  83. package/dist/components/reconnecting-overlay/ReconnectingNotice.d.ts.map +1 -0
  84. package/dist/components/reconnecting-overlay/ReconnectingOverlay.d.ts +3 -0
  85. package/dist/components/reconnecting-overlay/ReconnectingOverlay.d.ts.map +1 -1
  86. package/dist/components/recording-history/RecordingHistoryPanel.d.ts +62 -0
  87. package/dist/components/recording-history/RecordingHistoryPanel.d.ts.map +1 -0
  88. package/dist/components/space-header/LayoutMenu.d.ts +1 -499
  89. package/dist/components/space-header/LayoutMenu.d.ts.map +1 -1
  90. package/dist/components/space-info-dialog/SpaceInfoContent.d.ts.map +1 -1
  91. package/dist/components/space-view/ClassicSpaceView.d.ts +1 -1
  92. package/dist/components/space-view/ClassicSpaceView.d.ts.map +1 -1
  93. package/dist/components/space-view/RecordingSpaceView.d.ts +26 -0
  94. package/dist/components/space-view/RecordingSpaceView.d.ts.map +1 -0
  95. package/dist/components/space-view/SpaceDrawer.d.ts +3 -2
  96. package/dist/components/space-view/SpaceDrawer.d.ts.map +1 -1
  97. package/dist/components/space-view/SpacePresentation.d.ts +27 -0
  98. package/dist/components/space-view/SpacePresentation.d.ts.map +1 -0
  99. package/dist/components/space-view/SpaceStage.d.ts.map +1 -1
  100. package/dist/components/space-view/SpaceView.d.ts +2 -0
  101. package/dist/components/space-view/SpaceView.d.ts.map +1 -1
  102. package/dist/components/stage/Stage.d.ts +22 -2
  103. package/dist/components/stage/Stage.d.ts.map +1 -1
  104. package/dist/components/stage/StageContentTile.d.ts +5 -0
  105. package/dist/components/stage/StageContentTile.d.ts.map +1 -1
  106. package/dist/components/stage/StagePager.d.ts +2 -1
  107. package/dist/components/stage/StagePager.d.ts.map +1 -1
  108. package/dist/components/stage/stage-items.d.ts +0 -1
  109. package/dist/components/stage/stage-items.d.ts.map +1 -1
  110. package/dist/components/transcript-panel/ClassicTranscriptPanel.d.ts +1 -1
  111. package/dist/components/transcript-panel/ClassicTranscriptPanel.d.ts.map +1 -1
  112. package/dist/components/transcript-panel/TranscriptPanel.d.ts +2 -25
  113. package/dist/components/transcript-panel/TranscriptPanel.d.ts.map +1 -1
  114. package/dist/components/transcript-panel/transcript-panel-behavior.d.ts +84 -0
  115. package/dist/components/transcript-panel/transcript-panel-behavior.d.ts.map +1 -0
  116. package/dist/components/whiteboard-view/RecordingWhiteboardView.d.ts +23 -0
  117. package/dist/components/whiteboard-view/RecordingWhiteboardView.d.ts.map +1 -0
  118. package/dist/components/whiteboard-view/recording-whiteboard-state.d.ts +36 -0
  119. package/dist/components/whiteboard-view/recording-whiteboard-state.d.ts.map +1 -0
  120. package/dist/headless.d.ts +9 -0
  121. package/dist/headless.d.ts.map +1 -0
  122. package/dist/headless.js +30 -0
  123. package/dist/index.d.ts +9 -1
  124. package/dist/index.d.ts.map +1 -1
  125. package/dist/index.js +32 -4
  126. package/dist/internal/useWhiteboardSceneSubscription.d.ts.map +1 -1
  127. package/dist/public-surface.contract.d.ts +2 -2
  128. package/dist/public-surface.contract.d.ts.map +1 -1
  129. package/dist/selectors/space-selectors.d.ts.map +1 -1
  130. package/dist/test-support/index.d.ts +20 -0
  131. package/dist/test-support/index.d.ts.map +1 -0
  132. package/dist/test-support/index.js +508 -0
  133. package/dist/test-support/preview-client.d.ts +5 -0
  134. package/dist/test-support/preview-client.d.ts.map +1 -1
  135. package/dist/test-support/preview-feedback.d.ts +3 -0
  136. package/dist/test-support/preview-feedback.d.ts.map +1 -0
  137. package/dist/utils/animated-icon-renderer.d.ts +6 -0
  138. package/dist/utils/animated-icon-renderer.d.ts.map +1 -0
  139. package/dist/utils/animated-icon-runtime.d.ts +19 -0
  140. package/dist/utils/animated-icon-runtime.d.ts.map +1 -0
  141. package/dist/utils/animated-icons/arrow-left-02.d.ts +11 -0
  142. package/dist/utils/animated-icons/arrow-left-02.d.ts.map +1 -0
  143. package/dist/utils/animated-icons/cancel-01.d.ts +11 -0
  144. package/dist/utils/animated-icons/cancel-01.d.ts.map +1 -0
  145. package/dist/utils/animated-icons/clock-01.d.ts +11 -0
  146. package/dist/utils/animated-icons/clock-01.d.ts.map +1 -0
  147. package/dist/utils/animated-icons/copy-01.d.ts +13 -0
  148. package/dist/utils/animated-icons/copy-01.d.ts.map +1 -0
  149. package/dist/utils/animated-icons/crown.d.ts +11 -0
  150. package/dist/utils/animated-icons/crown.d.ts.map +1 -0
  151. package/dist/utils/animated-icons/download-01.d.ts +11 -0
  152. package/dist/utils/animated-icons/download-01.d.ts.map +1 -0
  153. package/dist/utils/animated-icons/edit-02.d.ts +11 -0
  154. package/dist/utils/animated-icons/edit-02.d.ts.map +1 -0
  155. package/dist/utils/animated-icons/home-01.d.ts +11 -0
  156. package/dist/utils/animated-icons/home-01.d.ts.map +1 -0
  157. package/dist/utils/animated-icons/image-01.d.ts +13 -0
  158. package/dist/utils/animated-icons/image-01.d.ts.map +1 -0
  159. package/dist/utils/animated-icons/index.d.ts +85 -0
  160. package/dist/utils/animated-icons/index.d.ts.map +1 -0
  161. package/dist/utils/animated-icons/information-circle.d.ts +11 -0
  162. package/dist/utils/animated-icons/information-circle.d.ts.map +1 -0
  163. package/dist/utils/animated-icons/link-01.d.ts +11 -0
  164. package/dist/utils/animated-icons/link-01.d.ts.map +1 -0
  165. package/dist/utils/animated-icons/mail-01.d.ts +11 -0
  166. package/dist/utils/animated-icons/mail-01.d.ts.map +1 -0
  167. package/dist/utils/animated-icons/maximize-screen.d.ts +11 -0
  168. package/dist/utils/animated-icons/maximize-screen.d.ts.map +1 -0
  169. package/dist/utils/animated-icons/message-01.d.ts +11 -0
  170. package/dist/utils/animated-icons/message-01.d.ts.map +1 -0
  171. package/dist/utils/animated-icons/mic-01.d.ts +11 -0
  172. package/dist/utils/animated-icons/mic-01.d.ts.map +1 -0
  173. package/dist/utils/animated-icons/moon-02.d.ts +11 -0
  174. package/dist/utils/animated-icons/moon-02.d.ts.map +1 -0
  175. package/dist/utils/animated-icons/more-horizontal.d.ts +11 -0
  176. package/dist/utils/animated-icons/more-horizontal.d.ts.map +1 -0
  177. package/dist/utils/animated-icons/more-vertical.d.ts +11 -0
  178. package/dist/utils/animated-icons/more-vertical.d.ts.map +1 -0
  179. package/dist/utils/animated-icons/pause.d.ts +11 -0
  180. package/dist/utils/animated-icons/pause.d.ts.map +1 -0
  181. package/dist/utils/animated-icons/pin.d.ts +11 -0
  182. package/dist/utils/animated-icons/pin.d.ts.map +1 -0
  183. package/dist/utils/animated-icons/play.d.ts +11 -0
  184. package/dist/utils/animated-icons/play.d.ts.map +1 -0
  185. package/dist/utils/animated-icons/plus-sign.d.ts +11 -0
  186. package/dist/utils/animated-icons/plus-sign.d.ts.map +1 -0
  187. package/dist/utils/animated-icons/qr-code-01.d.ts +11 -0
  188. package/dist/utils/animated-icons/qr-code-01.d.ts.map +1 -0
  189. package/dist/utils/animated-icons/refresh.d.ts +11 -0
  190. package/dist/utils/animated-icons/refresh.d.ts.map +1 -0
  191. package/dist/utils/animated-icons/search-01.d.ts +11 -0
  192. package/dist/utils/animated-icons/search-01.d.ts.map +1 -0
  193. package/dist/utils/animated-icons/sent.d.ts +11 -0
  194. package/dist/utils/animated-icons/sent.d.ts.map +1 -0
  195. package/dist/utils/animated-icons/settings-01.d.ts +11 -0
  196. package/dist/utils/animated-icons/settings-01.d.ts.map +1 -0
  197. package/dist/utils/animated-icons/share-08.d.ts +11 -0
  198. package/dist/utils/animated-icons/share-08.d.ts.map +1 -0
  199. package/dist/utils/animated-icons/shield-02.d.ts +11 -0
  200. package/dist/utils/animated-icons/shield-02.d.ts.map +1 -0
  201. package/dist/utils/animated-icons/smile.d.ts +11 -0
  202. package/dist/utils/animated-icons/smile.d.ts.map +1 -0
  203. package/dist/utils/animated-icons/sparkles.d.ts +11 -0
  204. package/dist/utils/animated-icons/sparkles.d.ts.map +1 -0
  205. package/dist/utils/animated-icons/star.d.ts +11 -0
  206. package/dist/utils/animated-icons/star.d.ts.map +1 -0
  207. package/dist/utils/animated-icons/thumbs-up.d.ts +11 -0
  208. package/dist/utils/animated-icons/thumbs-up.d.ts.map +1 -0
  209. package/dist/utils/animated-icons/upload-01.d.ts +11 -0
  210. package/dist/utils/animated-icons/upload-01.d.ts.map +1 -0
  211. package/dist/utils/animated-icons/user-add-01.d.ts +11 -0
  212. package/dist/utils/animated-icons/user-add-01.d.ts.map +1 -0
  213. package/dist/utils/animated-icons/user-group.d.ts +11 -0
  214. package/dist/utils/animated-icons/user-group.d.ts.map +1 -0
  215. package/dist/utils/animated-icons/user-remove-01.d.ts +11 -0
  216. package/dist/utils/animated-icons/user-remove-01.d.ts.map +1 -0
  217. package/dist/utils/animated-icons/video-01.d.ts +11 -0
  218. package/dist/utils/animated-icons/video-01.d.ts.map +1 -0
  219. package/dist/utils/animated-icons/volume-high.d.ts +11 -0
  220. package/dist/utils/animated-icons/volume-high.d.ts.map +1 -0
  221. package/dist/utils/animated-icons/volume-mute-01.d.ts +11 -0
  222. package/dist/utils/animated-icons/volume-mute-01.d.ts.map +1 -0
  223. package/dist/utils/animated-icons/zoom-in-area.d.ts +11 -0
  224. package/dist/utils/animated-icons/zoom-in-area.d.ts.map +1 -0
  225. package/dist/utils/animated-icons/zoom-out-area.d.ts +11 -0
  226. package/dist/utils/animated-icons/zoom-out-area.d.ts.map +1 -0
  227. package/dist/utils/feedback.d.ts +5 -0
  228. package/dist/utils/feedback.d.ts.map +1 -0
  229. package/dist/utils/icons.d.ts +42 -42
  230. package/dist/utils/icons.d.ts.map +1 -1
  231. package/dist/utils/index.d.ts +5 -0
  232. package/dist/utils/index.d.ts.map +1 -1
  233. package/dist/utils/index.js +297 -1
  234. package/package.json +25 -8
  235. package/dist/chunk-A3L7BOCE.js +0 -210
@@ -0,0 +1,184 @@
1
+ // src/components/whiteboard-view/recording-whiteboard-state.ts
2
+ var RECORDING_WHITEBOARD_STATE_KEYS = ["schemaVersion", "sceneId", "revision", "appState", "elements"];
3
+ var RECORDING_WHITEBOARD_APP_STATE_KEYS = ["view_background_color"];
4
+ var WHITEBOARD_WIRE_ELEMENT_KEYS = ["id", "type", "version", "version_nonce", "index", "is_deleted", "payload"];
5
+ var MAX_VIEW_BACKGROUND_COLOR_BYTES = 64;
6
+ var EXCALIDRAW_FILE_MIME_TYPES = /* @__PURE__ */ new Set(["image/svg+xml", "image/png", "image/jpeg", "image/gif", "image/webp", "image/bmp", "image/x-icon", "image/avif", "image/jfif", "application/octet-stream"]);
7
+ function parseRecordingWhiteboardStateV1(value) {
8
+ if (!isRecordingWhiteboardStateInput(value)) throw invalidState();
9
+ if (value.schemaVersion !== "recording_whiteboard_state.v1" || !isNonEmptyString(value.sceneId) || !isNonNegativeSafeInteger(value.revision)) throw invalidState();
10
+ const appState = parseRecordingWhiteboardAppState(value.appState);
11
+ if (!Array.isArray(value.elements) || !value.elements.every(isWhiteboardWireElement)) throw invalidState();
12
+ if (!isCanonicalElementOrder(value.elements)) throw new TypeError("recording whiteboard elements are not in canonical order");
13
+ return Object.freeze({
14
+ schemaVersion: value.schemaVersion,
15
+ sceneId: value.sceneId,
16
+ revision: value.revision,
17
+ appState,
18
+ elements: Object.freeze([...value.elements])
19
+ });
20
+ }
21
+ function createRecordingWhiteboardCursor(value) {
22
+ if (typeof value !== "object" || value === null || !("schemaVersion" in value)) throw invalidState();
23
+ if (value.schemaVersion === "recording_whiteboard_state.v1") {
24
+ const state2 = parseRecordingWhiteboardStateV1(value);
25
+ return { at: () => state2 };
26
+ }
27
+ if (value.schemaVersion !== "recording_whiteboard_history.v1" || !hasExactKeys(value, ["schemaVersion", "initial", "updates"]) || !("initial" in value) || !("updates" in value) || !Array.isArray(value.updates)) throw invalidState();
28
+ const initial = parseRecordingWhiteboardStateV1(value.initial);
29
+ let previous = initial.revision;
30
+ const updates = value.updates.map((update) => {
31
+ if (typeof update !== "object" || update === null || !hasExactKeys(update, ["revision", "elements"]) || !("revision" in update) || !("elements" in update) || !isNonNegativeSafeInteger(update.revision) || update.revision <= previous || !Array.isArray(update.elements) || update.elements.length === 0 || !update.elements.every(isWhiteboardWireElement))
32
+ throw invalidState();
33
+ previous = update.revision;
34
+ return { revision: update.revision, elements: update.elements };
35
+ });
36
+ const elements = new Map(initial.elements.map((element) => [element.id, element]));
37
+ let nextUpdate = 0;
38
+ let lastRevision = initial.revision;
39
+ let state = initial;
40
+ return {
41
+ at(revision = initial.revision) {
42
+ if (!isNonNegativeSafeInteger(revision) || revision < initial.revision) throw new RangeError("recording whiteboard revision precedes its initial state");
43
+ if (revision < lastRevision) {
44
+ elements.clear();
45
+ for (const element of initial.elements) elements.set(element.id, element);
46
+ nextUpdate = 0;
47
+ state = initial;
48
+ }
49
+ lastRevision = revision;
50
+ let changed = false;
51
+ for (; nextUpdate < updates.length; nextUpdate++) {
52
+ const update = updates[nextUpdate];
53
+ if (update.revision > revision) break;
54
+ for (const element of update.elements) elements.set(element.id, element);
55
+ changed = true;
56
+ }
57
+ if (changed) {
58
+ const ordered = [...elements.values()].sort((a, b) => a.index < b.index ? -1 : a.index > b.index ? 1 : a.id < b.id ? -1 : a.id > b.id ? 1 : 0);
59
+ state = { ...initial, revision, elements: ordered };
60
+ }
61
+ if (state.revision !== revision) state = { ...state, revision };
62
+ return state;
63
+ }
64
+ };
65
+ }
66
+ function recordingWhiteboardFileIds(state) {
67
+ const ids = /* @__PURE__ */ new Set();
68
+ for (const element of state.elements) {
69
+ if (element.is_deleted) continue;
70
+ const fileId = element.payload.fileId;
71
+ if (isNonEmptyString(fileId)) ids.add(fileId);
72
+ }
73
+ return Object.freeze([...ids].sort());
74
+ }
75
+ function recordingWhiteboardFileAssetId(fileId) {
76
+ if (!isNonEmptyString(fileId)) throw new TypeError("recording whiteboard file id is invalid");
77
+ return `whiteboard_file:${fileId}`;
78
+ }
79
+ function recordingWhiteboardSceneAppState(state, defaultViewBackgroundColor) {
80
+ return Object.freeze({ viewBackgroundColor: state.appState.view_background_color ?? defaultViewBackgroundColor });
81
+ }
82
+ function recordingWhiteboardBinaryFile({ fileId, mimeType, dataURL, createdAtMs = 0 }) {
83
+ if (!isRecordingWhiteboardFileId(fileId) || !isNonNegativeSafeInteger(createdAtMs)) throw new TypeError("recording whiteboard file is invalid");
84
+ const normalizedMimeType = normalizedFileMimeType(mimeType);
85
+ if (!isRecordingWhiteboardDataURL(dataURL, normalizedMimeType)) throw new TypeError("recording whiteboard file data URL is invalid");
86
+ return Object.freeze({ id: fileId, mimeType: normalizedMimeType, dataURL, created: createdAtMs });
87
+ }
88
+ async function loadRecordingWhiteboardFiles(state, resolve) {
89
+ const pairs = await Promise.all(
90
+ recordingWhiteboardFileIds(state).map(async (fileId) => {
91
+ const source = await resolve(Object.freeze({ fileId, assetId: recordingWhiteboardFileAssetId(fileId) }));
92
+ return [fileId, recordingWhiteboardBinaryFile({ fileId, ...source })];
93
+ })
94
+ );
95
+ const files = {};
96
+ for (const [fileId, file] of pairs) files[fileId] = file;
97
+ return Object.freeze(files);
98
+ }
99
+ function isRecordingWhiteboardStateInput(value) {
100
+ if (typeof value !== "object" || value === null || Array.isArray(value)) return false;
101
+ return hasExactKeys(value, RECORDING_WHITEBOARD_STATE_KEYS);
102
+ }
103
+ function isWhiteboardWireElement(value) {
104
+ if (!isWhiteboardWireElementInput(value)) return false;
105
+ return isNonEmptyString(value.id) && isNonEmptyString(value.type) && isNonNegativeSafeInteger(value.version) && isNonNegativeSafeInteger(value.version_nonce) && isNonEmptyString(value.index) && typeof value.is_deleted === "boolean" && isWhiteboardElementPayload(value.payload);
106
+ }
107
+ function isWhiteboardWireElementInput(value) {
108
+ if (typeof value !== "object" || value === null || Array.isArray(value)) return false;
109
+ return hasExactKeys(value, WHITEBOARD_WIRE_ELEMENT_KEYS);
110
+ }
111
+ function hasExactKeys(value, keys) {
112
+ const actual = Object.keys(value);
113
+ return actual.length === keys.length && keys.every((key) => Object.hasOwn(value, key));
114
+ }
115
+ function isCanonicalElementOrder(elements) {
116
+ let previous;
117
+ for (const current of elements) {
118
+ if (previous === void 0) {
119
+ previous = current;
120
+ continue;
121
+ }
122
+ if (previous.index > current.index || previous.index === current.index && previous.id > current.id) return false;
123
+ previous = current;
124
+ }
125
+ return true;
126
+ }
127
+ function parseRecordingWhiteboardAppState(value) {
128
+ if (typeof value !== "object" || value === null || Array.isArray(value)) throw invalidState();
129
+ const keys = Object.keys(value);
130
+ if (keys.length === 0) return Object.freeze({});
131
+ if (!hasExactKeys(value, RECORDING_WHITEBOARD_APP_STATE_KEYS) || !("view_background_color" in value) || !isViewBackgroundColor(value.view_background_color)) throw invalidState();
132
+ return Object.freeze({ view_background_color: value.view_background_color });
133
+ }
134
+ function isNonEmptyString(value) {
135
+ return typeof value === "string" && value.trim().length > 0;
136
+ }
137
+ function isNonNegativeSafeInteger(value) {
138
+ return typeof value === "number" && Number.isSafeInteger(value) && value >= 0;
139
+ }
140
+ function normalizedFileMimeType(value) {
141
+ const [rawMimeType] = value.split(";", 1);
142
+ const mimeType = rawMimeType?.trim().toLowerCase();
143
+ if (!mimeType || !isRecordingWhiteboardFileMimeType(mimeType)) throw new TypeError("recording whiteboard file MIME type is unsupported");
144
+ return mimeType;
145
+ }
146
+ function isRecordingWhiteboardDataURL(value, mimeType) {
147
+ if (!value.startsWith("data:") || !value.includes(",")) return false;
148
+ const encodedMimeType = value.slice(5, value.indexOf(",")).split(";", 1)[0]?.trim().toLowerCase();
149
+ return encodedMimeType === mimeType;
150
+ }
151
+ function isRecordingWhiteboardFileId(value) {
152
+ return isNonEmptyString(value);
153
+ }
154
+ function isRecordingWhiteboardFileMimeType(value) {
155
+ return EXCALIDRAW_FILE_MIME_TYPES.has(value);
156
+ }
157
+ function isViewBackgroundColor(value) {
158
+ return typeof value === "string" && new TextEncoder().encode(value).byteLength <= MAX_VIEW_BACKGROUND_COLOR_BYTES;
159
+ }
160
+ function isWhiteboardElementPayload(value) {
161
+ if (typeof value !== "object" || value === null || Array.isArray(value)) return false;
162
+ return Object.values(value).every((item) => isWhiteboardJsonValue(item, 0));
163
+ }
164
+ function isWhiteboardJsonValue(value, depth) {
165
+ if (depth > 16) return false;
166
+ if (value === null || typeof value === "boolean" || typeof value === "string") return true;
167
+ if (typeof value === "number") return Number.isFinite(value);
168
+ if (Array.isArray(value)) return value.every((item) => isWhiteboardJsonValue(item, depth + 1));
169
+ if (typeof value !== "object") return false;
170
+ return Object.values(value).every((item) => isWhiteboardJsonValue(item, depth + 1));
171
+ }
172
+ function invalidState() {
173
+ return new TypeError("recording whiteboard state is invalid");
174
+ }
175
+
176
+ export {
177
+ parseRecordingWhiteboardStateV1,
178
+ createRecordingWhiteboardCursor,
179
+ recordingWhiteboardFileIds,
180
+ recordingWhiteboardFileAssetId,
181
+ recordingWhiteboardSceneAppState,
182
+ recordingWhiteboardBinaryFile,
183
+ loadRecordingWhiteboardFiles
184
+ };
@@ -0,0 +1,182 @@
1
+ // src/components/stage/stage-layout.ts
2
+ var WIDESCREEN = 16 / 9;
3
+ var CLAMPED_AREA_WEIGHT = 0.85;
4
+ var DEFAULT_GRID_OPTIONS = { gap: 12, minTileWidth: 160, minTileHeight: 120, maxPerPage: 25, minAspect: 3 / 4, maxAspect: 21 / 9 };
5
+ var DEFAULT_SPOTLIGHT_OPTIONS = { gap: 12, stripRatio: 0.18, minStripHeight: 88, maxStripHeight: 168, stripAspect: WIDESCREEN };
6
+ var EMPTY_GEOMETRY = { frames: [], pageCount: 0, perPage: 0 };
7
+ function bestArrangement(box, count, options) {
8
+ let best = { cols: 1, rows: count, tileWidth: 0, tileHeight: 0 };
9
+ let bestScore = 0;
10
+ for (let cols = 1; cols <= count; cols += 1) {
11
+ const rows = Math.ceil(count / cols);
12
+ const cellWidth = (box.width - options.gap * (cols - 1)) / cols;
13
+ const cellHeight = (box.height - options.gap * (rows - 1)) / rows;
14
+ if (cellWidth <= 0 || cellHeight <= 0) continue;
15
+ const cellAspect = cellWidth / cellHeight;
16
+ const clamped = cellAspect > options.maxAspect || cellAspect < options.minAspect;
17
+ const tileWidth = cellAspect > options.maxAspect ? cellHeight * options.maxAspect : cellWidth;
18
+ const tileHeight = cellAspect < options.minAspect ? cellWidth / options.minAspect : cellHeight;
19
+ const score = tileWidth * tileHeight * (clamped ? CLAMPED_AREA_WEIGHT : 1);
20
+ if (score > bestScore) {
21
+ best = { cols, rows, tileWidth, tileHeight };
22
+ bestScore = score;
23
+ }
24
+ }
25
+ return best;
26
+ }
27
+ function tilesPerPage(box, count, options) {
28
+ const upper = Math.min(count, Math.max(1, options.maxPerPage));
29
+ for (let size = upper; size > 1; size -= 1) {
30
+ const { tileWidth, tileHeight } = bestArrangement(box, size, options);
31
+ if (tileWidth >= options.minTileWidth && tileHeight >= options.minTileHeight) return size;
32
+ }
33
+ return 1;
34
+ }
35
+ function round(value) {
36
+ return Math.round(value * 100) / 100;
37
+ }
38
+ function fitGrid(box, ids, options) {
39
+ const count = ids.length;
40
+ if (count === 0) return EMPTY_GEOMETRY;
41
+ if (count === 1) {
42
+ return { frames: [{ id: ids[0], role: "grid", page: 0, x: 0, y: 0, width: box.width, height: box.height }], pageCount: 1, perPage: 1 };
43
+ }
44
+ const perPage = tilesPerPage(box, count, options);
45
+ const pageCount = Math.ceil(count / perPage);
46
+ const arrangement = bestArrangement(box, Math.min(count, perPage), options);
47
+ const { cols, tileWidth, tileHeight } = arrangement;
48
+ const pageStride = box.width + options.gap;
49
+ const frames = [];
50
+ for (let page = 0; page < pageCount; page += 1) {
51
+ const pageIds = ids.slice(page * perPage, (page + 1) * perPage);
52
+ const rows = Math.ceil(pageIds.length / cols);
53
+ const gridHeight = rows * tileHeight + (rows - 1) * options.gap;
54
+ const offsetY = Math.max(0, (box.height - gridHeight) / 2);
55
+ for (let row = 0; row < rows; row += 1) {
56
+ const rowIds = pageIds.slice(row * cols, (row + 1) * cols);
57
+ const rowWidth = rowIds.length * tileWidth + (rowIds.length - 1) * options.gap;
58
+ const offsetX = Math.max(0, (box.width - rowWidth) / 2);
59
+ rowIds.forEach((id, column) => {
60
+ frames.push({
61
+ id,
62
+ role: "grid",
63
+ page,
64
+ x: round(page * pageStride + offsetX + column * (tileWidth + options.gap)),
65
+ y: round(offsetY + row * (tileHeight + options.gap)),
66
+ width: round(tileWidth),
67
+ height: round(tileHeight)
68
+ });
69
+ });
70
+ }
71
+ }
72
+ return { frames, pageCount, perPage };
73
+ }
74
+ function fitSpotlight(box, primaryId, stripIds, options) {
75
+ if (stripIds.length === 0) {
76
+ return { frames: [{ id: primaryId, role: "primary", page: 0, x: 0, y: 0, width: box.width, height: box.height }], pageCount: 1, perPage: 0 };
77
+ }
78
+ const stripHeight = Math.min(options.maxStripHeight, Math.max(options.minStripHeight, box.height * options.stripRatio));
79
+ const tileWidth = stripHeight * options.stripAspect;
80
+ const perPage = Math.max(1, Math.floor((box.width + options.gap) / (tileWidth + options.gap)));
81
+ const pageCount = Math.ceil(stripIds.length / perPage);
82
+ const primaryHeight = Math.max(0, box.height - stripHeight - options.gap);
83
+ const pageStride = box.width + options.gap;
84
+ const stripY = primaryHeight + options.gap;
85
+ const frames = [{ id: primaryId, role: "primary", page: 0, x: 0, y: 0, width: box.width, height: round(primaryHeight) }];
86
+ for (let page = 0; page < pageCount; page += 1) {
87
+ const pageIds = stripIds.slice(page * perPage, (page + 1) * perPage);
88
+ const rowWidth = pageIds.length * tileWidth + (pageIds.length - 1) * options.gap;
89
+ const offsetX = Math.max(0, (box.width - rowWidth) / 2);
90
+ pageIds.forEach((id, column) => {
91
+ frames.push({
92
+ id,
93
+ role: "strip",
94
+ page,
95
+ x: round(page * pageStride + offsetX + column * (tileWidth + options.gap)),
96
+ y: round(stripY),
97
+ width: round(tileWidth),
98
+ height: round(stripHeight)
99
+ });
100
+ });
101
+ }
102
+ return { frames, pageCount, perPage };
103
+ }
104
+
105
+ // src/components/stage/stage-items.ts
106
+ var WHITEBOARD_ITEM_ID = "whiteboard";
107
+ var screenShareItemId = (participantId) => `screen-share:${participantId}`;
108
+ function buildStageItems(participants, whiteboardOpen) {
109
+ const items = participants.map((participant) => ({ kind: "participant", id: participant.id, participant }));
110
+ for (const participant of participants) {
111
+ if (participant.isScreenSharing && participant.screenShareTrack) {
112
+ items.push({ kind: "screen-share", id: screenShareItemId(participant.id), participant });
113
+ }
114
+ }
115
+ if (whiteboardOpen) items.push({ kind: "whiteboard", id: WHITEBOARD_ITEM_ID });
116
+ return items;
117
+ }
118
+ function stabilizeOrder(previousIds, items) {
119
+ const byId = new Map(items.map((item) => [item.id, item]));
120
+ const ordered = [];
121
+ const placed = /* @__PURE__ */ new Set();
122
+ for (const id of previousIds) {
123
+ const item = byId.get(id);
124
+ if (!item || placed.has(id)) continue;
125
+ ordered.push(item);
126
+ placed.add(id);
127
+ }
128
+ for (const item of items) {
129
+ if (placed.has(item.id)) continue;
130
+ ordered.push(item);
131
+ placed.add(item.id);
132
+ }
133
+ return ordered;
134
+ }
135
+ function newestScreenShare(items, seenAt) {
136
+ let newest;
137
+ let newestSeen = -1;
138
+ for (const item of items) {
139
+ if (item.kind !== "screen-share") continue;
140
+ const seen = seenAt.get(item.id) ?? -1;
141
+ if (seen >= newestSeen) {
142
+ newest = item;
143
+ newestSeen = seen;
144
+ }
145
+ }
146
+ return newest;
147
+ }
148
+ function participantWhere(items, predicate) {
149
+ return items.find((item) => item.kind === "participant" && predicate(item.participant));
150
+ }
151
+ function choosePrimary(items, context) {
152
+ if (items.length === 0) return null;
153
+ const pinned = context.pinnedId ? items.find((item) => item.id === context.pinnedId) : void 0;
154
+ if (pinned) return pinned;
155
+ const content = () => newestScreenShare(items, context.seenAt) ?? items.find((item) => item.kind === "whiteboard");
156
+ const speaker = () => participantWhere(items, (participant) => participant.isActiveSpeaker === true) ?? participantWhere(items, (participant) => participant.isSpeaking === true) ?? (context.lastSpeakerId ? items.find((item) => item.kind === "participant" && item.id === context.lastSpeakerId) : void 0);
157
+ const ordered = context.layout === "presentation" ? [content, speaker] : [speaker, content];
158
+ for (const pick of ordered) {
159
+ const item = pick();
160
+ if (item) return item;
161
+ }
162
+ return participantWhere(items, (participant) => !participant.isLocal) ?? participantWhere(items, () => true) ?? items[0] ?? null;
163
+ }
164
+ function gridOrder(items, pinnedId) {
165
+ if (!pinnedId) return [...items];
166
+ const pinned = items.find((item) => item.id === pinnedId);
167
+ return pinned ? [pinned, ...items.filter((item) => item.id !== pinnedId)] : [...items];
168
+ }
169
+
170
+ export {
171
+ DEFAULT_GRID_OPTIONS,
172
+ DEFAULT_SPOTLIGHT_OPTIONS,
173
+ EMPTY_GEOMETRY,
174
+ fitGrid,
175
+ fitSpotlight,
176
+ WHITEBOARD_ITEM_ID,
177
+ screenShareItemId,
178
+ buildStageItems,
179
+ stabilizeOrder,
180
+ choosePrimary,
181
+ gridOrder
182
+ };
@@ -9,6 +9,10 @@ export interface AvatarProps {
9
9
  style?: React.CSSProperties;
10
10
  gradientPreference?: ParticipantGradientPreference;
11
11
  generated?: boolean;
12
+ /** Disable autonomous avatar motion for deterministic presentation captures. */
13
+ animated?: boolean;
14
+ /** Stable identity for deterministic Chalk chrome across projection seeks. */
15
+ seed?: number | string;
12
16
  }
13
17
  export declare const Avatar: React.MemoExoticComponent<(props: AvatarProps) => React.JSX.Element>;
14
18
  //# sourceMappingURL=Avatar.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"Avatar.d.ts","sourceRoot":"","sources":["../../../src/components/atomic/Avatar.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAuC,MAAM,OAAO,CAAC;AAG5D,OAAO,EAA8B,KAAK,6BAA6B,EAAE,MAAM,4BAA4B,CAAC;AAiB5G,MAAM,WAAW,WAAW;IAC1B,IAAI,EAAE,MAAM,CAAC;IACb,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,IAAI,CAAC,EAAE,IAAI,GAAG,IAAI,GAAG,IAAI,GAAG,IAAI,GAAG,IAAI,GAAG,KAAK,CAAC;IAChD,MAAM,CAAC,EAAE,QAAQ,GAAG,MAAM,GAAG,MAAM,GAAG,SAAS,CAAC;IAChD,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,KAAK,CAAC,EAAE,KAAK,CAAC,aAAa,CAAC;IAC5B,kBAAkB,CAAC,EAAE,6BAA6B,CAAC;IACnD,SAAS,CAAC,EAAE,OAAO,CAAC;CACrB;AAkBD,eAAO,MAAM,MAAM,oCAAsB,WAAW,uBAIlD,CAAC"}
1
+ {"version":3,"file":"Avatar.d.ts","sourceRoot":"","sources":["../../../src/components/atomic/Avatar.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAuC,MAAM,OAAO,CAAC;AAG5D,OAAO,EAA8B,KAAK,6BAA6B,EAAE,MAAM,4BAA4B,CAAC;AAiB5G,MAAM,WAAW,WAAW;IAC1B,IAAI,EAAE,MAAM,CAAC;IACb,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,IAAI,CAAC,EAAE,IAAI,GAAG,IAAI,GAAG,IAAI,GAAG,IAAI,GAAG,IAAI,GAAG,KAAK,CAAC;IAChD,MAAM,CAAC,EAAE,QAAQ,GAAG,MAAM,GAAG,MAAM,GAAG,SAAS,CAAC;IAChD,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,KAAK,CAAC,EAAE,KAAK,CAAC,aAAa,CAAC;IAC5B,kBAAkB,CAAC,EAAE,6BAA6B,CAAC;IACnD,SAAS,CAAC,EAAE,OAAO,CAAC;IACpB,gFAAgF;IAChF,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,8EAA8E;IAC9E,IAAI,CAAC,EAAE,MAAM,GAAG,MAAM,CAAC;CACxB;AAkBD,eAAO,MAAM,MAAM,oCAAsB,WAAW,uBAIlD,CAAC"}
@@ -1,4 +1,4 @@
1
1
  import React from "react";
2
2
  import type { AvatarProps } from "./Avatar";
3
- export declare const ClassicAvatar: React.MemoExoticComponent<({ name, src, size, status, className, style, gradientPreference, generated }: AvatarProps) => React.JSX.Element>;
3
+ export declare const ClassicAvatar: React.MemoExoticComponent<({ name, src, size, status, className, style, gradientPreference, generated, animated }: AvatarProps) => React.JSX.Element>;
4
4
  //# sourceMappingURL=ClassicAvatar.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"ClassicAvatar.d.ts","sourceRoot":"","sources":["../../../src/components/atomic/ClassicAvatar.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAuC,MAAM,OAAO,CAAC;AAI5D,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,UAAU,CAAC;AA8B5C,eAAO,MAAM,aAAa,2GAA2G,WAAW,uBAqC9I,CAAC"}
1
+ {"version":3,"file":"ClassicAvatar.d.ts","sourceRoot":"","sources":["../../../src/components/atomic/ClassicAvatar.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAuC,MAAM,OAAO,CAAC;AAI5D,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,UAAU,CAAC;AA8B5C,eAAO,MAAM,aAAa,qHAA4H,WAAW,uBAqC/J,CAAC"}
@@ -4,8 +4,9 @@ interface ReactionBubbleProps {
4
4
  participantName?: string;
5
5
  onComplete?: () => void;
6
6
  duration?: number;
7
+ animated?: boolean;
7
8
  className?: string;
8
9
  }
9
- export declare const ClassicReactionBubble: React.MemoExoticComponent<({ emoji, participantName, onComplete, duration: baseDuration, className }: ReactionBubbleProps) => React.JSX.Element | null>;
10
+ export declare const ClassicReactionBubble: React.MemoExoticComponent<({ emoji, participantName, onComplete, duration: baseDuration, animated, className }: ReactionBubbleProps) => React.JSX.Element | null>;
10
11
  export {};
11
12
  //# sourceMappingURL=ClassicReactionBubble.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"ClassicReactionBubble.d.ts","sourceRoot":"","sources":["../../../src/components/atomic/ClassicReactionBubble.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAuC,MAAM,OAAO,CAAC;AAM5D,UAAU,mBAAmB;IAC3B,KAAK,EAAE,MAAM,CAAC;IACd,eAAe,CAAC,EAAE,MAAM,CAAC;IACzB,UAAU,CAAC,EAAE,MAAM,IAAI,CAAC;IACxB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB;AA4DD,eAAO,MAAM,qBAAqB,wGAAiG,mBAAmB,8BAkDpJ,CAAC"}
1
+ {"version":3,"file":"ClassicReactionBubble.d.ts","sourceRoot":"","sources":["../../../src/components/atomic/ClassicReactionBubble.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAuC,MAAM,OAAO,CAAC;AAM5D,UAAU,mBAAmB;IAC3B,KAAK,EAAE,MAAM,CAAC;IACd,eAAe,CAAC,EAAE,MAAM,CAAC;IACzB,UAAU,CAAC,EAAE,MAAM,IAAI,CAAC;IACxB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB;AA4DD,eAAO,MAAM,qBAAqB,kHAAkH,mBAAmB,8BAmDrK,CAAC"}
@@ -1,11 +1,14 @@
1
1
  import React from "react";
2
- interface ReactionBubbleProps {
2
+ export interface ReactionBubbleProps {
3
3
  emoji: string;
4
4
  participantName?: string;
5
5
  onComplete?: () => void;
6
6
  duration?: number;
7
+ /** Disable timers and motion for deterministic presentation frames. */
8
+ animated?: boolean;
9
+ /** Stable reaction identity for deterministic Chalk chrome across projection seeks. */
10
+ seed?: number | string;
7
11
  className?: string;
8
12
  }
9
13
  export declare const ReactionBubble: React.MemoExoticComponent<(props: ReactionBubbleProps) => React.JSX.Element>;
10
- export {};
11
14
  //# sourceMappingURL=ReactionBubble.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"ReactionBubble.d.ts","sourceRoot":"","sources":["../../../src/components/atomic/ReactionBubble.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAuC,MAAM,OAAO,CAAC;AAS5D,UAAU,mBAAmB;IAC3B,KAAK,EAAE,MAAM,CAAC;IACd,eAAe,CAAC,EAAE,MAAM,CAAC;IACzB,UAAU,CAAC,EAAE,MAAM,IAAI,CAAC;IACxB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB;AAiCD,eAAO,MAAM,cAAc,oCAAsB,mBAAmB,uBAIlE,CAAC"}
1
+ {"version":3,"file":"ReactionBubble.d.ts","sourceRoot":"","sources":["../../../src/components/atomic/ReactionBubble.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAuC,MAAM,OAAO,CAAC;AAS5D,MAAM,WAAW,mBAAmB;IAClC,KAAK,EAAE,MAAM,CAAC;IACd,eAAe,CAAC,EAAE,MAAM,CAAC;IACzB,UAAU,CAAC,EAAE,MAAM,IAAI,CAAC;IACxB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,uEAAuE;IACvE,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,uFAAuF;IACvF,IAAI,CAAC,EAAE,MAAM,GAAG,MAAM,CAAC;IACvB,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB;AAiCD,eAAO,MAAM,cAAc,oCAAsB,mBAAmB,uBAIlE,CAAC"}
@@ -21,8 +21,10 @@ export interface AudioOutputProps {
21
21
  audioOutputDeviceId?: string;
22
22
  /** Per-participant volume override (0-1). Takes precedence over volume prop. */
23
23
  getParticipantVolume?: (participantId: string) => number;
24
+ /** Label for the single prompt shown when the browser blocks playback. */
25
+ resumeAudioLabel?: string;
24
26
  }
25
- export declare function AudioOutput({ participants, volume, audioOutputDeviceId, getParticipantVolume }: AudioOutputProps): null;
27
+ export declare function AudioOutput({ participants, volume, audioOutputDeviceId, getParticipantVolume, resumeAudioLabel }: AudioOutputProps): import("react").JSX.Element | null;
26
28
  export declare namespace AudioOutput {
27
29
  var displayName: string;
28
30
  }
@@ -1 +1 @@
1
- {"version":3,"file":"AudioOutput.d.ts","sourceRoot":"","sources":["../../../src/components/audio-output/AudioOutput.tsx"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAOH,MAAM,WAAW,gBAAgB;IAC/B,EAAE,EAAE,MAAM,CAAC;IACX,UAAU,CAAC,EAAE,gBAAgB,GAAG,IAAI,CAAC;IACrC,qBAAqB,CAAC,EAAE,gBAAgB,GAAG,IAAI,CAAC;IAChD,OAAO,CAAC,EAAE,OAAO,CAAC;CACnB;AAED,MAAM,WAAW,gBAAgB;IAC/B,8EAA8E;IAC9E,YAAY,CAAC,EAAE,gBAAgB,EAAE,CAAC;IAClC,oCAAoC;IACpC,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,2FAA2F;IAC3F,mBAAmB,CAAC,EAAE,MAAM,CAAC;IAC7B,gFAAgF;IAChF,oBAAoB,CAAC,EAAE,CAAC,aAAa,EAAE,MAAM,KAAK,MAAM,CAAC;CAC1D;AAWD,wBAAgB,WAAW,CAAC,EAAE,YAAY,EAAE,MAAU,EAAE,mBAAmB,EAAE,oBAAoB,EAAE,EAAE,gBAAgB,QAsSpH;yBAtSe,WAAW"}
1
+ {"version":3,"file":"AudioOutput.d.ts","sourceRoot":"","sources":["../../../src/components/audio-output/AudioOutput.tsx"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAOH,MAAM,WAAW,gBAAgB;IAC/B,EAAE,EAAE,MAAM,CAAC;IACX,UAAU,CAAC,EAAE,gBAAgB,GAAG,IAAI,CAAC;IACrC,qBAAqB,CAAC,EAAE,gBAAgB,GAAG,IAAI,CAAC;IAChD,OAAO,CAAC,EAAE,OAAO,CAAC;CACnB;AAED,MAAM,WAAW,gBAAgB;IAC/B,8EAA8E;IAC9E,YAAY,CAAC,EAAE,gBAAgB,EAAE,CAAC;IAClC,oCAAoC;IACpC,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,2FAA2F;IAC3F,mBAAmB,CAAC,EAAE,MAAM,CAAC;IAC7B,gFAAgF;IAChF,oBAAoB,CAAC,EAAE,CAAC,aAAa,EAAE,MAAM,KAAK,MAAM,CAAC;IACzD,0EAA0E;IAC1E,gBAAgB,CAAC,EAAE,MAAM,CAAC;CAC3B;AAWD,wBAAgB,WAAW,CAAC,EAAE,YAAY,EAAE,MAAU,EAAE,mBAAmB,EAAE,oBAAoB,EAAE,gBAAiC,EAAE,EAAE,gBAAgB,sCAyUvJ;yBAzUe,WAAW"}
@@ -1,4 +1,4 @@
1
- import { type ChatUploadFile, type ClientEventMap, type GetAccess, type SpaceClient } from "@q9labsai/chalk-client";
1
+ import { type ChatUploadFile, type ClientEventMap, type FeedbackSource, type GetAccess, type SpaceClient } from "@q9labsai/chalk-client";
2
2
  import type React from "react";
3
3
  import { type ChalkTheme } from "../../theme";
4
4
  export type SpaceLayout = "focus" | "grid" | "presentation";
@@ -7,6 +7,7 @@ export type ChalkFeatures = {
7
7
  readonly participants?: boolean;
8
8
  readonly admission?: boolean;
9
9
  readonly screenShare?: boolean;
10
+ readonly recording?: boolean;
10
11
  readonly whiteboard?: boolean;
11
12
  readonly reactions?: boolean;
12
13
  readonly handRaise?: boolean;
@@ -55,6 +56,7 @@ export type ChalkProps = SpaceIntegration & SpaceEventCallbacks & {
55
56
  readonly layout?: SpaceLayout;
56
57
  readonly onLayoutChange?: (layout: SpaceLayout) => void;
57
58
  readonly onOpenDiagnostics?: () => void;
59
+ readonly feedbackSource?: FeedbackSource;
58
60
  };
59
61
  export declare function Chalk(props: ChalkProps): React.JSX.Element;
60
62
  export {};
@@ -1 +1 @@
1
- {"version":3,"file":"Chalk.d.ts","sourceRoot":"","sources":["../../../src/components/chalk/Chalk.tsx"],"names":[],"mappings":"AAEA,OAAO,EAAsD,KAAK,cAAc,EAAE,KAAK,cAAc,EAAE,KAAK,SAAS,EAAoB,KAAK,WAAW,EAAE,MAAM,wBAAwB,CAAC;AAE1L,OAAO,KAAK,KAAK,MAAM,OAAO,CAAC;AAI/B,OAAO,EAA0C,KAAK,UAAU,EAAE,MAAM,aAAa,CAAC;AAYtF,MAAM,MAAM,WAAW,GAAG,OAAO,GAAG,MAAM,GAAG,cAAc,CAAC;AAE5D,MAAM,MAAM,aAAa,GAAG;IAC1B,QAAQ,CAAC,IAAI,CAAC,EAAE,OAAO,CAAC;IACxB,QAAQ,CAAC,YAAY,CAAC,EAAE,OAAO,CAAC;IAChC,QAAQ,CAAC,SAAS,CAAC,EAAE,OAAO,CAAC;IAC7B,QAAQ,CAAC,WAAW,CAAC,EAAE,OAAO,CAAC;IAC/B,QAAQ,CAAC,UAAU,CAAC,EAAE,OAAO,CAAC;IAC9B,QAAQ,CAAC,SAAS,CAAC,EAAE,OAAO,CAAC;IAC7B,QAAQ,CAAC,SAAS,CAAC,EAAE,OAAO,CAAC;IAC7B,QAAQ,CAAC,IAAI,CAAC,EAAE,OAAO,CAAC;IACxB,QAAQ,CAAC,QAAQ,CAAC,EAAE,OAAO,CAAC;IAC5B,uGAAuG;IACvG,QAAQ,CAAC,MAAM,CAAC,EAAE,OAAO,CAAC;CAC3B,CAAC;AAEF,KAAK,gBAAgB,GAAG;IAAE,QAAQ,CAAC,MAAM,EAAE,WAAW,CAAC;IAAC,QAAQ,CAAC,KAAK,CAAC,EAAE,KAAK,CAAC;IAAC,QAAQ,CAAC,SAAS,CAAC,EAAE,KAAK,CAAA;CAAE,GAAG;IAAE,QAAQ,CAAC,MAAM,CAAC,EAAE,KAAK,CAAC;IAAC,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC;IAAC,QAAQ,CAAC,SAAS,EAAE,SAAS,CAAA;CAAE,CAAC;AAElM,KAAK,mBAAmB,GAAG;IACzB,QAAQ,CAAC,QAAQ,CAAC,EAAE,MAAM,IAAI,CAAC;IAC/B,QAAQ,CAAC,MAAM,CAAC,EAAE,MAAM,IAAI,CAAC;IAC7B,QAAQ,CAAC,cAAc,CAAC,EAAE,CAAC,KAAK,EAAE,cAAc,CAAC,cAAc,CAAC,KAAK,IAAI,CAAC;IAC1E,QAAQ,CAAC,mBAAmB,CAAC,EAAE,CAAC,KAAK,EAAE,cAAc,CAAC,mBAAmB,CAAC,KAAK,IAAI,CAAC;IACpF,QAAQ,CAAC,iBAAiB,CAAC,EAAE,CAAC,KAAK,EAAE,cAAc,CAAC,iBAAiB,CAAC,KAAK,IAAI,CAAC;IAChF,QAAQ,CAAC,oBAAoB,CAAC,EAAE,CAAC,KAAK,EAAE,cAAc,CAAC,oBAAoB,CAAC,KAAK,IAAI,CAAC;IACtF,QAAQ,CAAC,oBAAoB,CAAC,EAAE,CAAC,KAAK,EAAE,cAAc,CAAC,oBAAoB,CAAC,KAAK,IAAI,CAAC;IACtF,QAAQ,CAAC,OAAO,CAAC,EAAE,CAAC,KAAK,EAAE,cAAc,CAAC,OAAO,CAAC,KAAK,IAAI,CAAC;CAC7D,CAAC;AAEF,MAAM,MAAM,UAAU,GAAG,gBAAgB,GACvC,mBAAmB,GAAG;IACpB,QAAQ,CAAC,QAAQ,CAAC,EAAE,OAAO,CAAC;IAC5B,QAAQ,CAAC,QAAQ,CAAC,EAAE;QAAE,QAAQ,CAAC,UAAU,CAAC,EAAE,OAAO,CAAC;QAAC,QAAQ,CAAC,MAAM,CAAC,EAAE,OAAO,CAAA;KAAE,CAAC;IACjF,QAAQ,CAAC,WAAW,CAAC,EAAE,MAAM,CAAC;IAC9B,QAAQ,CAAC,QAAQ,CAAC,EAAE,aAAa,CAAC;IAClC,QAAQ,CAAC,KAAK,CAAC,EAAE,UAAU,CAAC;IAC5B,QAAQ,CAAC,aAAa,CAAC,EAAE,MAAM,OAAO,CAAC,SAAS,cAAc,EAAE,CAAC,CAAC;IAClE,QAAQ,CAAC,OAAO,CAAC,EAAE,MAAM,CAAC;IAC1B,QAAQ,CAAC,SAAS,CAAC,EAAE,MAAM,CAAC;IAC5B,QAAQ,CAAC,UAAU,CAAC,EAAE,MAAM,CAAC;IAC7B,QAAQ,CAAC,gBAAgB,CAAC,EAAE,MAAM,CAAC;IACnC,QAAQ,CAAC,mBAAmB,CAAC,EAAE,MAAM,CAAC;IACtC,QAAQ,CAAC,cAAc,CAAC,EAAE,CAAC,OAAO,EAAE,QAAQ,CAAC;QAAE,mBAAmB,EAAE,MAAM,CAAA;KAAE,CAAC,KAAK,IAAI,CAAC;IACvF,QAAQ,CAAC,MAAM,CAAC,EAAE,WAAW,CAAC;IAC9B,QAAQ,CAAC,cAAc,CAAC,EAAE,CAAC,MAAM,EAAE,WAAW,KAAK,IAAI,CAAC;IACxD,QAAQ,CAAC,iBAAiB,CAAC,EAAE,MAAM,IAAI,CAAC;CACzC,CAAC;AAEJ,wBAAgB,KAAK,CAAC,KAAK,EAAE,UAAU,GAAG,KAAK,CAAC,GAAG,CAAC,OAAO,CAqC1D"}
1
+ {"version":3,"file":"Chalk.d.ts","sourceRoot":"","sources":["../../../src/components/chalk/Chalk.tsx"],"names":[],"mappings":"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"}
@@ -1,4 +1,4 @@
1
- import type { ChatUploadFile } from "@q9labsai/chalk-client";
1
+ import type { ChatAttachment, ChatMessage, ChatReadReceipt, ChatSendInput, ChatUploadFile, SpaceSnapshot } from "@q9labsai/chalk-client";
2
2
  import React from "react";
3
3
  export type { ChatMessage } from "./chat-types";
4
4
  export interface ChatPanelProps {
@@ -12,5 +12,28 @@ export interface ChatPanelProps {
12
12
  readonly variant?: "sidebar" | "mobile";
13
13
  readonly generatedAvatars?: boolean;
14
14
  }
15
+ export interface ChatPanelSurfaceProps extends ChatPanelProps {
16
+ readonly messages: readonly ChatMessage[];
17
+ readonly pendingMessages?: SpaceSnapshot["chat"]["pendingSends"];
18
+ readonly readReceipts?: readonly ChatReadReceipt[];
19
+ readonly localReadThroughSequence?: string | null;
20
+ readonly participantNames?: Readonly<Record<string, string>>;
21
+ readonly onSendMessage?: (input: Pick<ChatSendInput, "text" | "attachments">) => Promise<void>;
22
+ readonly onUploadAttachment?: (file: ChatUploadFile) => Promise<ChatAttachment>;
23
+ readonly onResolveAttachmentUrl?: (attachmentId: string) => Promise<string>;
24
+ readonly onMarkRead?: (throughSequence: string) => void | Promise<unknown>;
25
+ readonly onLoadOlder?: () => Promise<void>;
26
+ readonly hasOlder?: boolean;
27
+ readonly loadingOlder?: boolean;
28
+ readonly localParticipantId?: string;
29
+ readonly error?: string | null;
30
+ readonly messageDisplayTime?: (message: ChatMessage) => string;
31
+ readonly autoScrollBehavior?: ScrollBehavior;
32
+ /** Use a solid message surface instead of filter-generated texture for deterministic raster output. */
33
+ readonly stableTexture?: boolean;
34
+ }
35
+ export declare const ChatPanelSurface: React.MemoExoticComponent<({ messages, pendingMessages, readReceipts, localReadThroughSequence, participantNames, onSendMessage, onUploadAttachment, pickChatFiles, onResolveAttachmentUrl, onMarkRead, onRetryMessage, onLoadOlder, hasOlder, loadingOlder, localParticipantId, onClose, disabled, placeholder, title, variant, generatedAvatars, error, messageDisplayTime, autoScrollBehavior, stableTexture, className, }: ChatPanelSurfaceProps) => React.JSX.Element>;
15
36
  export declare const ChatPanel: React.MemoExoticComponent<(props: ChatPanelProps) => React.JSX.Element>;
37
+ /** Data-driven chat presentation without a Space client or bindings provider. */
38
+ export declare const ChatPanelPresentation: React.MemoExoticComponent<(props: ChatPanelSurfaceProps) => React.JSX.Element>;
16
39
  //# sourceMappingURL=ChatPanel.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"ChatPanel.d.ts","sourceRoot":"","sources":["../../../src/components/composite/ChatPanel.tsx"],"names":[],"mappings":"AACA,OAAO,KAAK,EAA+D,cAAc,EAAiB,MAAM,wBAAwB,CAAC;AACzI,OAAO,KAAgE,MAAM,OAAO,CAAC;AAYrF,YAAY,EAAE,WAAW,EAAE,MAAM,cAAc,CAAC;AAGhD,MAAM,WAAW,cAAc;IAC7B,QAAQ,CAAC,aAAa,CAAC,EAAE,MAAM,OAAO,CAAC,SAAS,cAAc,EAAE,CAAC,CAAC;IAClE,QAAQ,CAAC,cAAc,CAAC,EAAE,CAAC,EAAE,EAAE,MAAM,KAAK,OAAO,CAAC,IAAI,CAAC,CAAC;IACxD,QAAQ,CAAC,OAAO,CAAC,EAAE,MAAM,IAAI,CAAC;IAC9B,QAAQ,CAAC,QAAQ,CAAC,EAAE,OAAO,CAAC;IAC5B,QAAQ,CAAC,WAAW,CAAC,EAAE,MAAM,CAAC;IAC9B,QAAQ,CAAC,SAAS,CAAC,EAAE,MAAM,CAAC;IAC5B,QAAQ,CAAC,KAAK,CAAC,EAAE,MAAM,CAAC;IACxB,QAAQ,CAAC,OAAO,CAAC,EAAE,SAAS,GAAG,QAAQ,CAAC;IACxC,QAAQ,CAAC,gBAAgB,CAAC,EAAE,OAAO,CAAC;CACrC;AAkXD,eAAO,MAAM,SAAS,oCAAsB,cAAc,KAAG,KAAK,CAAC,GAAG,CAAC,OAAO,CAG5E,CAAC"}
1
+ {"version":3,"file":"ChatPanel.d.ts","sourceRoot":"","sources":["../../../src/components/composite/ChatPanel.tsx"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,cAAc,EAAE,WAAW,EAAE,eAAe,EAAE,aAAa,EAAE,cAAc,EAAE,aAAa,EAAE,MAAM,wBAAwB,CAAC;AACzI,OAAO,KAAgE,MAAM,OAAO,CAAC;AAcrF,YAAY,EAAE,WAAW,EAAE,MAAM,cAAc,CAAC;AAGhD,MAAM,WAAW,cAAc;IAC7B,QAAQ,CAAC,aAAa,CAAC,EAAE,MAAM,OAAO,CAAC,SAAS,cAAc,EAAE,CAAC,CAAC;IAClE,QAAQ,CAAC,cAAc,CAAC,EAAE,CAAC,EAAE,EAAE,MAAM,KAAK,OAAO,CAAC,IAAI,CAAC,CAAC;IACxD,QAAQ,CAAC,OAAO,CAAC,EAAE,MAAM,IAAI,CAAC;IAC9B,QAAQ,CAAC,QAAQ,CAAC,EAAE,OAAO,CAAC;IAC5B,QAAQ,CAAC,WAAW,CAAC,EAAE,MAAM,CAAC;IAC9B,QAAQ,CAAC,SAAS,CAAC,EAAE,MAAM,CAAC;IAC5B,QAAQ,CAAC,KAAK,CAAC,EAAE,MAAM,CAAC;IACxB,QAAQ,CAAC,OAAO,CAAC,EAAE,SAAS,GAAG,QAAQ,CAAC;IACxC,QAAQ,CAAC,gBAAgB,CAAC,EAAE,OAAO,CAAC;CACrC;AAED,MAAM,WAAW,qBAAsB,SAAQ,cAAc;IAC3D,QAAQ,CAAC,QAAQ,EAAE,SAAS,WAAW,EAAE,CAAC;IAC1C,QAAQ,CAAC,eAAe,CAAC,EAAE,aAAa,CAAC,MAAM,CAAC,CAAC,cAAc,CAAC,CAAC;IACjE,QAAQ,CAAC,YAAY,CAAC,EAAE,SAAS,eAAe,EAAE,CAAC;IACnD,QAAQ,CAAC,wBAAwB,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IAClD,QAAQ,CAAC,gBAAgB,CAAC,EAAE,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC,CAAC;IAC7D,QAAQ,CAAC,aAAa,CAAC,EAAE,CAAC,KAAK,EAAE,IAAI,CAAC,aAAa,EAAE,MAAM,GAAG,aAAa,CAAC,KAAK,OAAO,CAAC,IAAI,CAAC,CAAC;IAC/F,QAAQ,CAAC,kBAAkB,CAAC,EAAE,CAAC,IAAI,EAAE,cAAc,KAAK,OAAO,CAAC,cAAc,CAAC,CAAC;IAChF,QAAQ,CAAC,sBAAsB,CAAC,EAAE,CAAC,YAAY,EAAE,MAAM,KAAK,OAAO,CAAC,MAAM,CAAC,CAAC;IAC5E,QAAQ,CAAC,UAAU,CAAC,EAAE,CAAC,eAAe,EAAE,MAAM,KAAK,IAAI,GAAG,OAAO,CAAC,OAAO,CAAC,CAAC;IAC3E,QAAQ,CAAC,WAAW,CAAC,EAAE,MAAM,OAAO,CAAC,IAAI,CAAC,CAAC;IAC3C,QAAQ,CAAC,QAAQ,CAAC,EAAE,OAAO,CAAC;IAC5B,QAAQ,CAAC,YAAY,CAAC,EAAE,OAAO,CAAC;IAChC,QAAQ,CAAC,kBAAkB,CAAC,EAAE,MAAM,CAAC;IACrC,QAAQ,CAAC,KAAK,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IAC/B,QAAQ,CAAC,kBAAkB,CAAC,EAAE,CAAC,OAAO,EAAE,WAAW,KAAK,MAAM,CAAC;IAC/D,QAAQ,CAAC,kBAAkB,CAAC,EAAE,cAAc,CAAC;IAC7C,uGAAuG;IACvG,QAAQ,CAAC,aAAa,CAAC,EAAE,OAAO,CAAC;CAClC;AAED,eAAO,MAAM,gBAAgB,iaA4BxB,qBAAqB,uBA+SzB,CAAC;AAoCF,eAAO,MAAM,SAAS,oCAAsB,cAAc,KAAG,KAAK,CAAC,GAAG,CAAC,OAAO,CAG5E,CAAC;AAEH,iFAAiF;AACjF,eAAO,MAAM,qBAAqB,oCAAsB,qBAAqB,KAAG,KAAK,CAAC,GAAG,CAAC,OAAO,CAG/F,CAAC"}
@@ -1,4 +1,27 @@
1
+ import type { ChatAttachment, ChatReadReceipt, ChatSendInput, ChatUploadFile, SpaceSnapshot } from "@q9labsai/chalk-client";
1
2
  import React from "react";
3
+ import type { ChatMessage } from "./chat-types";
2
4
  import type { ChatPanelProps } from "./ChatPanel";
5
+ export interface ClassicChatPanelSurfaceProps extends ChatPanelProps {
6
+ readonly messages: readonly ChatMessage[];
7
+ readonly pendingMessages?: SpaceSnapshot["chat"]["pendingSends"];
8
+ readonly readReceipts?: readonly ChatReadReceipt[];
9
+ readonly localReadThroughSequence?: string | null;
10
+ readonly participantNames?: Readonly<Record<string, string>>;
11
+ readonly onSendMessage?: (input: Pick<ChatSendInput, "text" | "attachments">) => Promise<void>;
12
+ readonly onUploadAttachment?: (file: ChatUploadFile) => Promise<ChatAttachment>;
13
+ readonly onResolveAttachmentUrl?: (attachmentId: string) => Promise<string>;
14
+ readonly onMarkRead?: (throughSequence: string) => void | Promise<unknown>;
15
+ readonly onLoadOlder?: () => Promise<void>;
16
+ readonly hasOlder?: boolean;
17
+ readonly loadingOlder?: boolean;
18
+ readonly localParticipantId?: string;
19
+ readonly error?: string | null;
20
+ readonly messageDisplayTime?: (message: ChatMessage) => string;
21
+ readonly autoScrollBehavior?: ScrollBehavior;
22
+ /** Use a solid message surface instead of filter-generated texture for deterministic raster output. */
23
+ readonly stableTexture?: boolean;
24
+ }
25
+ export declare const ClassicChatPanelSurface: React.MemoExoticComponent<({ messages, pendingMessages, readReceipts, localReadThroughSequence, participantNames, onSendMessage, onUploadAttachment, pickChatFiles, onResolveAttachmentUrl, onMarkRead, onRetryMessage, onLoadOlder, hasOlder, loadingOlder, localParticipantId, onClose, disabled, placeholder, title, variant, generatedAvatars, error, messageDisplayTime, autoScrollBehavior, stableTexture, className, }: ClassicChatPanelSurfaceProps) => React.JSX.Element>;
3
26
  export declare const ClassicChatPanel: React.MemoExoticComponent<(props: ChatPanelProps) => React.JSX.Element>;
4
27
  //# sourceMappingURL=ClassicChatPanel.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"ClassicChatPanel.d.ts","sourceRoot":"","sources":["../../../src/components/composite/ClassicChatPanel.tsx"],"names":[],"mappings":"AAEA,OAAO,KAAgE,MAAM,OAAO,CAAC;AAUrF,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,aAAa,CAAC;AAwUlD,eAAO,MAAM,gBAAgB,oCAAsB,cAAc,KAAG,KAAK,CAAC,GAAG,CAAC,OAAO,CAgCnF,CAAC"}
1
+ {"version":3,"file":"ClassicChatPanel.d.ts","sourceRoot":"","sources":["../../../src/components/composite/ClassicChatPanel.tsx"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,cAAc,EAAE,eAAe,EAAE,aAAa,EAAE,cAAc,EAAE,aAAa,EAAE,MAAM,wBAAwB,CAAC;AAC5H,OAAO,KAAgE,MAAM,OAAO,CAAC;AAWrF,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,cAAc,CAAC;AAChD,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,aAAa,CAAC;AAIlD,MAAM,WAAW,4BAA6B,SAAQ,cAAc;IAClE,QAAQ,CAAC,QAAQ,EAAE,SAAS,WAAW,EAAE,CAAC;IAC1C,QAAQ,CAAC,eAAe,CAAC,EAAE,aAAa,CAAC,MAAM,CAAC,CAAC,cAAc,CAAC,CAAC;IACjE,QAAQ,CAAC,YAAY,CAAC,EAAE,SAAS,eAAe,EAAE,CAAC;IACnD,QAAQ,CAAC,wBAAwB,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IAClD,QAAQ,CAAC,gBAAgB,CAAC,EAAE,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC,CAAC;IAC7D,QAAQ,CAAC,aAAa,CAAC,EAAE,CAAC,KAAK,EAAE,IAAI,CAAC,aAAa,EAAE,MAAM,GAAG,aAAa,CAAC,KAAK,OAAO,CAAC,IAAI,CAAC,CAAC;IAC/F,QAAQ,CAAC,kBAAkB,CAAC,EAAE,CAAC,IAAI,EAAE,cAAc,KAAK,OAAO,CAAC,cAAc,CAAC,CAAC;IAChF,QAAQ,CAAC,sBAAsB,CAAC,EAAE,CAAC,YAAY,EAAE,MAAM,KAAK,OAAO,CAAC,MAAM,CAAC,CAAC;IAC5E,QAAQ,CAAC,UAAU,CAAC,EAAE,CAAC,eAAe,EAAE,MAAM,KAAK,IAAI,GAAG,OAAO,CAAC,OAAO,CAAC,CAAC;IAC3E,QAAQ,CAAC,WAAW,CAAC,EAAE,MAAM,OAAO,CAAC,IAAI,CAAC,CAAC;IAC3C,QAAQ,CAAC,QAAQ,CAAC,EAAE,OAAO,CAAC;IAC5B,QAAQ,CAAC,YAAY,CAAC,EAAE,OAAO,CAAC;IAChC,QAAQ,CAAC,kBAAkB,CAAC,EAAE,MAAM,CAAC;IACrC,QAAQ,CAAC,KAAK,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IAC/B,QAAQ,CAAC,kBAAkB,CAAC,EAAE,CAAC,OAAO,EAAE,WAAW,KAAK,MAAM,CAAC;IAC/D,QAAQ,CAAC,kBAAkB,CAAC,EAAE,cAAc,CAAC;IAC7C,uGAAuG;IACvG,QAAQ,CAAC,aAAa,CAAC,EAAE,OAAO,CAAC;CAClC;AAED,eAAO,MAAM,uBAAuB,iaA4B/B,4BAA4B,uBAqShC,CAAC;AAEF,eAAO,MAAM,gBAAgB,oCAAsB,cAAc,KAAG,KAAK,CAAC,GAAG,CAAC,OAAO,CAgCnF,CAAC"}
@@ -1 +1 @@
1
- {"version":3,"file":"ClassicMessageBubble.d.ts","sourceRoot":"","sources":["../../../src/components/composite/ClassicMessageBubble.tsx"],"names":[],"mappings":"AACA,OAAO,KAAuC,MAAM,OAAO,CAAC;AAK5D,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,iBAAiB,CAAC;AAY1D,eAAO,MAAM,oBAAoB,gDAgMhC,CAAC"}
1
+ {"version":3,"file":"ClassicMessageBubble.d.ts","sourceRoot":"","sources":["../../../src/components/composite/ClassicMessageBubble.tsx"],"names":[],"mappings":"AACA,OAAO,KAAkB,MAAM,OAAO,CAAC;AAKvC,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,iBAAiB,CAAC;AAa1D,eAAO,MAAM,oBAAoB,gDAuLhC,CAAC"}
@@ -1,38 +1,4 @@
1
1
  import React from "react";
2
- import { type BackgroundEffect } from "./BackgroundEffectsPicker";
3
- import type { SettingsDialogValue } from "./SettingsDialog";
4
- type SectionId = "audio-video" | "audio" | "video" | "appearance" | "experience";
5
- interface SettingsDialogProps {
6
- isOpen: boolean;
7
- onClose: () => void;
8
- settings: SettingsDialogValue;
9
- onUpdateIdentity: (updates: Partial<SettingsDialogValue["identity"]>) => void;
10
- onUpdateJoin: (updates: Partial<SettingsDialogValue["join"]>) => void;
11
- onUpdateAudio: (updates: Partial<SettingsDialogValue["audio"]>) => void;
12
- onUpdateVideo: (updates: Partial<SettingsDialogValue["video"]>) => void;
13
- onUpdateAppearance: (updates: Partial<SettingsDialogValue["appearance"]>) => void;
14
- onUpdateExperience: (updates: Partial<SettingsDialogValue["experience"]>) => void;
15
- enablePictureInPicture?: boolean;
16
- isPictureInPictureSupported?: boolean;
17
- isPictureInPictureActive?: boolean;
18
- onOpenPictureInPicture?: () => Promise<void> | void;
19
- enableBackgroundEffects?: boolean;
20
- isBackgroundEffectsSupported?: boolean;
21
- isApplyingBackgroundEffect?: boolean;
22
- backgroundEffects?: readonly BackgroundEffect[];
23
- selectedBackgroundEffectId?: string;
24
- onSelectBackgroundEffect?: (effectId: string) => void;
25
- onUploadBackgroundEffect?: (file: File) => void;
26
- audioInputDevices?: readonly Pick<MediaDeviceInfo, "deviceId" | "kind" | "label">[];
27
- audioOutputDevices?: readonly Pick<MediaDeviceInfo, "deviceId" | "kind" | "label">[];
28
- videoInputDevices?: readonly Pick<MediaDeviceInfo, "deviceId" | "kind" | "label">[];
29
- audioLevel?: number;
30
- videoTrack?: MediaStreamTrack | null;
31
- reducedMotion?: boolean;
32
- participantColorSeed?: string;
33
- isDarkMode?: boolean;
34
- initialSection?: SectionId;
35
- }
2
+ import { type SettingsDialogProps } from "./settings-dialog-behavior";
36
3
  export declare const ClassicSettingsDialog: React.MemoExoticComponent<({ isOpen, onClose, settings, onUpdateIdentity, onUpdateJoin, onUpdateAudio, onUpdateVideo, onUpdateAppearance, onUpdateExperience, enablePictureInPicture, isPictureInPictureSupported, isPictureInPictureActive, onOpenPictureInPicture, enableBackgroundEffects, isBackgroundEffectsSupported, isApplyingBackgroundEffect, backgroundEffects, selectedBackgroundEffectId, onSelectBackgroundEffect, onUploadBackgroundEffect, audioInputDevices, audioOutputDevices, videoInputDevices, audioLevel, videoTrack, reducedMotion, participantColorSeed, isDarkMode, initialSection, }: SettingsDialogProps) => React.JSX.Element>;
37
- export {};
38
4
  //# sourceMappingURL=ClassicSettingsDialog.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"ClassicSettingsDialog.d.ts","sourceRoot":"","sources":["../../../src/components/composite/ClassicSettingsDialog.tsx"],"names":[],"mappings":"AACA,OAAO,KAAuC,MAAM,OAAO,CAAC;AAY5D,OAAO,EAA2B,KAAK,gBAAgB,EAAE,MAAM,2BAA2B,CAAC;AAG3F,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,kBAAkB,CAAC;AAE5D,KAAK,SAAS,GAAG,aAAa,GAAG,OAAO,GAAG,OAAO,GAAG,YAAY,GAAG,YAAY,CAAC;AAwBjF,UAAU,mBAAmB;IAC3B,MAAM,EAAE,OAAO,CAAC;IAChB,OAAO,EAAE,MAAM,IAAI,CAAC;IACpB,QAAQ,EAAE,mBAAmB,CAAC;IAC9B,gBAAgB,EAAE,CAAC,OAAO,EAAE,OAAO,CAAC,mBAAmB,CAAC,UAAU,CAAC,CAAC,KAAK,IAAI,CAAC;IAC9E,YAAY,EAAE,CAAC,OAAO,EAAE,OAAO,CAAC,mBAAmB,CAAC,MAAM,CAAC,CAAC,KAAK,IAAI,CAAC;IACtE,aAAa,EAAE,CAAC,OAAO,EAAE,OAAO,CAAC,mBAAmB,CAAC,OAAO,CAAC,CAAC,KAAK,IAAI,CAAC;IACxE,aAAa,EAAE,CAAC,OAAO,EAAE,OAAO,CAAC,mBAAmB,CAAC,OAAO,CAAC,CAAC,KAAK,IAAI,CAAC;IACxE,kBAAkB,EAAE,CAAC,OAAO,EAAE,OAAO,CAAC,mBAAmB,CAAC,YAAY,CAAC,CAAC,KAAK,IAAI,CAAC;IAClF,kBAAkB,EAAE,CAAC,OAAO,EAAE,OAAO,CAAC,mBAAmB,CAAC,YAAY,CAAC,CAAC,KAAK,IAAI,CAAC;IAClF,sBAAsB,CAAC,EAAE,OAAO,CAAC;IACjC,2BAA2B,CAAC,EAAE,OAAO,CAAC;IACtC,wBAAwB,CAAC,EAAE,OAAO,CAAC;IACnC,sBAAsB,CAAC,EAAE,MAAM,OAAO,CAAC,IAAI,CAAC,GAAG,IAAI,CAAC;IACpD,uBAAuB,CAAC,EAAE,OAAO,CAAC;IAClC,4BAA4B,CAAC,EAAE,OAAO,CAAC;IACvC,0BAA0B,CAAC,EAAE,OAAO,CAAC;IACrC,iBAAiB,CAAC,EAAE,SAAS,gBAAgB,EAAE,CAAC;IAChD,0BAA0B,CAAC,EAAE,MAAM,CAAC;IACpC,wBAAwB,CAAC,EAAE,CAAC,QAAQ,EAAE,MAAM,KAAK,IAAI,CAAC;IACtD,wBAAwB,CAAC,EAAE,CAAC,IAAI,EAAE,IAAI,KAAK,IAAI,CAAC;IAChD,iBAAiB,CAAC,EAAE,SAAS,IAAI,CAAC,eAAe,EAAE,UAAU,GAAG,MAAM,GAAG,OAAO,CAAC,EAAE,CAAC;IACpF,kBAAkB,CAAC,EAAE,SAAS,IAAI,CAAC,eAAe,EAAE,UAAU,GAAG,MAAM,GAAG,OAAO,CAAC,EAAE,CAAC;IACrF,iBAAiB,CAAC,EAAE,SAAS,IAAI,CAAC,eAAe,EAAE,UAAU,GAAG,MAAM,GAAG,OAAO,CAAC,EAAE,CAAC;IACpF,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,UAAU,CAAC,EAAE,gBAAgB,GAAG,IAAI,CAAC;IACrC,aAAa,CAAC,EAAE,OAAO,CAAC;IACxB,oBAAoB,CAAC,EAAE,MAAM,CAAC;IAC9B,UAAU,CAAC,EAAE,OAAO,CAAC;IACrB,cAAc,CAAC,EAAE,SAAS,CAAC;CAC5B;AAgED,eAAO,MAAM,qBAAqB,mlBA+B7B,mBAAmB,uBAgevB,CAAC"}
1
+ {"version":3,"file":"ClassicSettingsDialog.d.ts","sourceRoot":"","sources":["../../../src/components/composite/ClassicSettingsDialog.tsx"],"names":[],"mappings":"AACA,OAAO,KAAK,MAAM,OAAO,CAAC;AAa1B,OAAO,EAAgD,KAAK,mBAAmB,EAAE,MAAM,4BAA4B,CAAC;AA8BpH,eAAO,MAAM,qBAAqB,mlBA+B7B,mBAAmB,uBAoavB,CAAC"}